指標(biāo):GitHub PR/Issue 同步服務(wù)的本地 Docker 運(yùn)行方法與同步機(jī)制解析)
批處理流處理大數(shù)據(jù)【免費(fèi)下載鏈接】beamApache Beam is a unified programming model for Batch and Streaming data processing.項(xiàng)目地址https://gitcode.com/gh_mirrors/beam15/beam點(diǎn)擊查看免費(fèi)下載本文基于 Apache Beam 倉(cāng)庫(kù)中 .test-infra/metrics/sync/github/README.md 展開(kāi)完整覆蓋該文檔給出的兩條本地運(yùn)行命令構(gòu)建鏡像后運(yùn)行同步腳本、運(yùn)行 pylint 檢查并結(jié)合 sync.py、Dockerfile、queries.py 等源碼深入講解這個(gè) GitHub 數(shù)據(jù)采集服務(wù)的工作原理它如何通過(guò) GraphQL 增量拉取apache/beam倉(cāng)庫(kù)的 PR 與 Issue 元數(shù)據(jù)、如何寫(xiě)入 PostgreSQL、以及如何實(shí)現(xiàn)冪等的 upsert 同步循環(huán)。讀完本文你可以復(fù)現(xiàn) Beam 社區(qū)指標(biāo)棧中 GitHub 同步組件的本地部署流程并理解其增量同步與數(shù)據(jù)建模細(xì)節(jié)。一、同步服務(wù)在 Beam 指標(biāo)棧中的定位Beam 的社區(qū)指標(biāo)體系位于.test-infra/metrics/目錄其 README 說(shuō)明該棧包含兩類(lèi)指標(biāo)社區(qū)指標(biāo)Community metrics由 Python 腳本從 Jenkins 和 GitHub 兩個(gè)數(shù)據(jù)源采集寫(xiě)入 Postgres 分析型數(shù)據(jù)庫(kù)測(cè)試結(jié)果指標(biāo)Test ResultsIO 性能測(cè)試、負(fù)載測(cè)試、Nexmark 測(cè)試等產(chǎn)出的時(shí)序數(shù)據(jù)存儲(chǔ)在 InfluxDB 中。兩類(lèi)指標(biāo)最終都通過(guò) Grafana 面板呈現(xiàn)且整個(gè)??梢酝ㄟ^(guò) docker-compose.yml 在本地以 Docker 容器方式部署生產(chǎn)環(huán)境則運(yùn)行在 GCP 的 Kubernetes 上。本文關(guān)注的 GitHub 同步組件正是“社區(qū)指標(biāo)”中負(fù)責(zé) GitHub 數(shù)據(jù)源采集的部分由 sync.py 文件頭注釋概括為T(mén)his module queries GitHub to collect Beam-related metrics and put them in PostgreSQL.該組件的目錄結(jié)構(gòu)如下均位于 .test-infra/metrics/sync/github/文件作用sync.py主同步腳本建表、增量拉取 GitHub 數(shù)據(jù)、upsert 入庫(kù)queries.py兩條 GraphQL 查詢(xún)模板MAIN_PR_QUERY拉取 PRMAIN_ISSUES_QUERY拉取 Issueghutilities.pyGitHub 時(shí)間格式轉(zhuǎn)換、mention 提取等工具函數(shù)sync_test.py針對(duì)findMentions等工具函數(shù)的單元測(cè)試Dockerfile構(gòu)建syncgithub鏡像requirements.txtPython 依賴(lài)aiohttp、backoff、psycopg2-binary、PyGithub二、構(gòu)建容器鏡像README 的第一步是“Build container”。構(gòu)建依據(jù)是本目錄下的 Dockerfile其關(guān)鍵內(nèi)容為FROM python:3.8-slim WORKDIR /usr/src/app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt pylint yapf nose COPY . . CMD python ./sync.py從源碼結(jié)構(gòu)看鏡像基于python:3.8-slim一次性裝入了運(yùn)行時(shí)依賴(lài)requirements.txt與靜態(tài)檢查工具pylint、yapf、nose——后者正是 README 中“Runnin linter”一節(jié)得以直接在容器內(nèi)執(zhí)行pylint的前提。默認(rèn)的CMD是啟動(dòng)同步腳本本身。在.test-infra/metrics/sync/github目錄下執(zhí)行構(gòu)建即可得到本地鏡像與 README 中后續(xù)命令使用的鏡像名syncgithub保持一致docker build -t syncgithub .生產(chǎn)/本地編排中該鏡像同樣由 compose 定義docker-compose.yml 中的syncgithub服務(wù)第 76-91 行指定了build.context: ./sync/github并在環(huán)境中注入了DB_HOSTbeampostgresql、DB_PORT5432、DB_DBNAMEbeam_metrics、DB_DBUSERNAMEadmin等變量與 compose 中postgresql服務(wù)創(chuàng)建的數(shù)據(jù)庫(kù)實(shí)例對(duì)應(yīng)。三、本地運(yùn)行同步腳本README 給出的運(yùn)行命令是docker run -it --rm --name sync -v $PWD:/usr/src/myapp \ -w /usr/src/myapp \ -e DB_PORT5432 \ -e DB_DBNAMEbeam_metrics \ -e DB_DBUSERNAMEadmin \ -e DB_DBPWDaaa \ -e GH_ACCESSTOKENgithubaccesstoken \ syncgithub python sync.py命令語(yǔ)義逐項(xiàng)說(shuō)明-v $PWD:/usr/src/myapp -w /usr/src/myapp把當(dāng)前目錄即sync/github源碼目錄掛載為容器工作目錄使python sync.py直接執(zhí)行掛載后的腳本便于本地調(diào)試改動(dòng)--name sync --rm命名容器并在退出后自動(dòng)清理-e DB_PORT5432 -e DB_DBNAMEbeam_metrics -e DB_DBUSERNAMEadmin -e DB_DBPWDaaaPostgreSQL 連接參數(shù)。其中數(shù)據(jù)庫(kù)名beam_metrics、用戶(hù)名admin、端口5432與 docker-compose.yml 中postgresql服務(wù)的環(huán)境變量POSTGRES_DBbeam_metrics、POSTGRES_USERadmin、端口映射5432:5432完全一致說(shuō)明 README 命令預(yù)設(shè)你已在本機(jī) 5432 端口擁有一個(gè)按此約定初始化過(guò)的 Postgres可通過(guò) compose 的docker-compose up postgresql快速搭建。3.1 環(huán)境變量與 README 命令的對(duì)照對(duì)照 sync.py 第 43-49 行腳本啟動(dòng)時(shí)讀取的環(huán)境變量為DB_HOST os.environ[DB_HOST] DB_PORT os.environ[DB_PORT] DB_NAME os.environ[DB_DBNAME] DB_USER_NAME os.environ[DB_DBUSERNAME] DB_PASSWORD os.environ[DB_DBPWD] GH_ACCESS_TOKEN os.environ[GH_ACCESS_TOKEN]由此有兩點(diǎn)實(shí)操注意事項(xiàng)DB_HOST是必需變量而 README 的命令未顯式傳入。在 compose 棧內(nèi)它被設(shè)為beampostgresql即 Postgres 容器名若在宿主機(jī)上單獨(dú)docker run需要指向宿主機(jī)的可達(dá)地址。腳本中特意保留了一個(gè)注釋掉的調(diào)試工具findDockerNetworkIP()第 34-38 行它通過(guò)ip route show取 Docker 宿主機(jī)的網(wǎng)關(guān) IP供本地調(diào)試時(shí)作為DB_HOST使用。令牌變量名的差異腳本讀取的是GH_ACCESS_TOKEN第 49 行而 README 命令中寫(xiě)的是GH_ACCESSTOKEN。按當(dāng)前 sync.py 源碼實(shí)際生效的變量名應(yīng)為GH_ACCESS_TOKEN若嚴(yán)格按 README 命令傳GH_ACCESSTOKEN腳本會(huì)在讀取環(huán)境變量時(shí)拋KeyError。運(yùn)行前請(qǐng)以源碼中的變量名為準(zhǔn)確認(rèn)。另外initDBConnection()第 94-106 行實(shí)現(xiàn)了連接重試邏輯連不上數(shù)據(jù)庫(kù)時(shí)打印提示并每 60 秒重試一次因此若 Postgres 稍后啟動(dòng)同步容器會(huì)持續(xù)等待而不會(huì)直接退出。四、運(yùn)行 LinterREADME 的第二條命令是運(yùn)行 pylint 靜態(tài)檢查docker run -it --rm --name sync -v $PWD:/usr/src/myapp \ -w /usr/src/myapp syncgithub pylint sync.py該命令不需要數(shù)據(jù)庫(kù)與 GitHub 令牌只依賴(lài)鏡像中預(yù)裝的pylint見(jiàn) Dockerfile 第 25 行掛載源碼后對(duì)sync.py做靜態(tài)檢查適合作為本地修改同步腳本后的快速代碼風(fēng)格驗(yàn)證手段。鏡像中還裝有yapf與nose前者可用于代碼格式化檢查后者可用于執(zhí)行本目錄下的單元測(cè)試 sync_test.py該測(cè)試基于unittestddt驗(yàn)證ghutilities.findMentions對(duì)mention的提取行為例如輸入sample text with several mentions first, second third應(yīng)得到[first, second, third]。五、啟動(dòng)后的同步機(jī)制從建表到增量拉取python sync.py并不是一次性任務(wù)而是一個(gè)常駐循環(huán)。sync.py 的__main__段第 500-527 行流程為打印 Started. 并調(diào)用initDbTablesIfNeeded()初始化數(shù)據(jù)庫(kù)表進(jìn)入無(wú)限循環(huán)先調(diào)用probeGitHubIsUp()做連通性探測(cè)第 490-496 行通過(guò) TCP 連接github.com:443判斷 GitHub 是否可用不可用則跳過(guò)本輪可用時(shí)執(zhí)行fetchNewData()完成一次同步打印 Sleeping for 5 minutes. 并休眠 300 秒等待下一輪。也就是說(shuō)容器以每 5 分鐘一輪的增量同步方式持續(xù)運(yùn)行。5.1 自動(dòng)建表三張核心表initDbTablesIfNeeded()第 116-145 行會(huì)依次檢查并按需創(chuàng)建三張表gh_pull_requests第 53-68 行create table gh_pull_requests ( pr_id integer NOT NULL PRIMARY KEY, author varchar NOT NULL, created_ts timestamp NOT NULL, first_non_author_activity_ts timestamp NULL, first_non_author_activity_author varchar NULL, closed_ts timestamp NULL, updated_ts timestamp NOT NULL, is_merged boolean NOT NULL, requested_reviewers varchar[] NOT NULL, beam_reviewers varchar[] NOT NULL, mentioned varchar[] NOT NULL, reviewed_by varchar[] NOT NULL )其中first_non_author_activity_ts/author記錄 PR 作者以外的第一位參與者評(píng)論、Review 或合并動(dòng)作出現(xiàn)的時(shí)間與身份是衡量“首次響應(yīng)時(shí)長(zhǎng)”的基礎(chǔ)字段beam_reviewers則是 Beam 社區(qū)口徑的評(píng)審人列表提取規(guī)則見(jiàn)下文 5.4 節(jié)。gh_issues第 72-83 行issue_id、author、created_ts、updated_ts、closed_ts、title、assignees varchar[]、labels varchar[]。gh_sync_metadata第 86-91 行name varchar PRIMARY KEYtimestamp用于持久化“上次同步到哪一刻”的增量水位。表是否已存在通過(guò)查詢(xún)information_schema.tables判斷tableExists第 109-113 行因此建表邏輯對(duì)重復(fù)啟動(dòng)是冪等的。5.2 增量水位fetchNewData的主流程fetchNewData()第 413-487 行分別以kind pr和kind issue兩輪執(zhí)行同樣的邏輯取水位從gh_sync_metadata表按name LIKE gh_{kind}_sync查詢(xún)上次同步時(shí)間戳fetchLastSyncTimestamp第 164-175 行。若從未同步過(guò)PR 走fetchLastSyncTimestampFallback第 149-161 行兼容歷史元數(shù)據(jù)行g(shù)h_syncIssue 直接使用回退值1980-01-01即首次運(yùn)行會(huì)回溯全量數(shù)據(jù)拉取以當(dāng)前水位為參數(shù)調(diào)用fetchGHData(currTS, query)第 204-208 行它把 ghutilities.datetimeToGHTimeStr 轉(zhuǎn)換出的 GitHub 時(shí)間字符串格式%Y-%m-%dT%H:%M:%SZ替換進(jìn)查詢(xún)模板中的TemstampSubstitueLocation占位符再 POST 到 GitHub GraphQL 端點(diǎn)api.github.com/graphql攜帶Bearer {GH_ACCESS_TOKEN}寫(xiě)入遍歷返回的data.search.edges逐條調(diào)用extractRowValuesFromPr/extractRowValuesFromIssue提取行值然后upsertIntoPRsTable/upsertIntoIssuesTable第 354-410 行以O(shè)N CONFLICT (pr_id) DO UPDATE/ON CONFLICT (issue_id) DO UPDATE的方式整行覆蓋寫(xiě)入保證重復(fù)同步不產(chǎn)生重復(fù)行推進(jìn)水位每處理完一個(gè)節(jié)點(diǎn)用currTS max(currTS, node.updatedAt)推進(jìn)本輪水位第 479-481 行整輪結(jié)束后updateLastSyncTimestamp第 178-193 行以INSERT ... ON CONFLICT (name) DO UPDATE寫(xiě)回元數(shù)據(jù)表。如果 GitHub 返回體含errors字段常見(jiàn)于限流、令牌失效腳本會(huì)打印錯(cuò)誤并提前返回等待 5 分鐘后的下一輪重試——這構(gòu)成了腳本層面的容錯(cuò)閉環(huán)。5.3 GraphQL 查詢(xún)模板queries.py 定義了兩條搜索型查詢(xún)MAIN_PR_QUERY第 18-116 行search(query: type:pr repo:apache/beam updated:TemstampSubstitueLocation sort:updated-asc, type: ISSUE, first: 100)即按更新時(shí)間升序拉取晚于水位時(shí)間戳的apache/beamPR每頁(yè) 100 條節(jié)點(diǎn)內(nèi)聯(lián)展開(kāi)comments、reviewRequests、assignees、reviews、merged/mergedAt/mergedBy等字段MAIN_ISSUES_QUERY第 123-174 行結(jié)構(gòu)類(lèi)似但限定type:issue并展開(kāi)assignees與labels(first: 10)。由于fetchNewData的循環(huán)條件是“本次查詢(xún)是否還有結(jié)果”resultsPresent配合updated:ts的時(shí)間過(guò)濾一輪同步會(huì)持續(xù)翻頁(yè)直至該水位之后的更新全部取完。5.4 數(shù)據(jù)提取Beam 特色的評(píng)審人口徑extractBeamReviewerssync.py 第 272-306 行是 PR 建模中最有社區(qū)特色的部分它合并四類(lèi)信號(hào)GitHub 的assignees與reviewRequests實(shí)際執(zhí)行過(guò) Review 的用戶(hù)PR 描述與評(píng)論中形如user ... PTAL/look的請(qǐng)求正則r(\w).*?(?:PTAL|ptal|look)貢獻(xiàn)者常用的Rr1 r2/R r1寫(xiě)法正則r(?:^|\W)[Rr]\s*:.)且支持-user從列表中移除評(píng)審人。最終結(jié)果會(huì)排除 PR 作者本人并去重。類(lèi)似的“社區(qū)語(yǔ)言”解析還有extractMentions第 222-238 行聚合 PR 描述、評(píng)論、Review 中所有 提及findMentions由 ghutilities.py 提供并過(guò)濾掉username占位符以及extractFirstNAActivity第 241-269 行在他人評(píng)論、他人 Review、合并動(dòng)作三者中取時(shí)間最早者。這些字段正是上層 Grafana 面板計(jì)算響應(yīng)時(shí)長(zhǎng)、評(píng)審協(xié)作等社區(qū)指標(biāo)的數(shù)據(jù)基礎(chǔ)。六、與 docker-compose 全棧的關(guān)系如果不想單獨(dú)運(yùn)行同步容器可以直接使用 docker-compose.yml 拉起整個(gè)指標(biāo)棧Postgres InfluxDB Grafana syncgithub syncjenkins。其中syncgithub服務(wù)注入的環(huán)境變量包括DB_HOSTbeampostgresql、DB_DBNAMEbeam_metrics等與 postgres/init.sql初始化時(shí)創(chuàng)建tablefunc擴(kuò)展共同構(gòu)成同步腳本的運(yùn)行環(huán)境按 metrics 目錄 README 的說(shuō)明本地啟動(dòng)后可通過(guò)localhost:5432訪(fǎng)問(wèn) Postgres、localhost:3000訪(fǎng)問(wèn) Grafana。需要注意的是compose 中syncgithub服務(wù)額外聲明了GH_APP_ID、GH_APP_INSTALLATION_ID、GH_PEM_KEY、GH_NUMBER_OF_WORKFLOW_RUNS_TO_FETCH等變量而當(dāng)前 sync.py 源碼實(shí)際讀取的是GH_ACCESS_TOKEN從源碼結(jié)構(gòu)看compose 配置與腳本之間應(yīng)處于演進(jìn)過(guò)渡狀態(tài)本地部署前建議以sync.py讀取的變量名DB_*GH_ACCESS_TOKEN為準(zhǔn)進(jìn)行核對(duì)。七、小結(jié)與適用前提適用前提本地已安裝 Docker目標(biāo) PostgreSQL 已按beam_metrics庫(kù)、admin用戶(hù)初始化持有具備 GitHub GraphQL API 訪(fǎng)問(wèn)權(quán)限的 Access Token。運(yùn)行形態(tài)同步腳本是常駐進(jìn)程每 5 分鐘一輪增量同步GitHub 不可達(dá)或返回錯(cuò)誤時(shí)自動(dòng)降級(jí)等待下一輪不會(huì)崩潰退出。冪等設(shè)計(jì)三張表按需創(chuàng)建PR/Issue 行按主鍵 upsert水位按名稱(chēng) upsert重復(fù)啟動(dòng)安全。驗(yàn)證手段修改 sync.py 后可用 README 的 pylint 命令做靜態(tài)檢查sync_test.py 覆蓋了 mention 提取等核心解析邏輯可用于回歸驗(yàn)證。這條 GitHub 同步鏈路是 Beam 社區(qū)指標(biāo)的數(shù)據(jù)入口之一與同目錄的 Jenkins 同步組件.test-infra/metrics/sync/jenkins/配合共同支撐著社區(qū)活躍度與代碼協(xié)作效率的量化觀測(cè)。贊分享批處理流處理大數(shù)據(jù)【免費(fèi)下載鏈接】beamApache Beam is a unified programming model for Batch and Streaming data processing.項(xiàng)目地址https://gitcode.com/gh_mirrors/beam15/beam點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Apache Beam 社區(qū)指標(biāo)同步基于 GitHub GraphQL API 的 PR/Issue 數(shù)據(jù)采集與 PostgreSQL 落地實(shí)踐Apache Beam 社區(qū)指標(biāo)同步基于 GitHub GraphQL API 的 PR/Issue 數(shù)據(jù)采集與 PostgreSQL 落地實(shí)踐 本文以 Ap大數(shù)據(jù)批處理流處理數(shù)據(jù)工程Apache Beam 社區(qū)指標(biāo)之 GitHub 數(shù)據(jù)同步sync.py 的本地運(yùn)行與調(diào)試實(shí)戰(zhàn)指南Apache Beam 社區(qū)指標(biāo)之 GitHub 數(shù)據(jù)同步sync.py 的本地運(yùn)行與調(diào)試實(shí)戰(zhàn)指南 Apache Beam 通過(guò)一套基于 Docker 的社區(qū)Apache Beam 社區(qū)指標(biāo)棧Jenkins 構(gòu)建指標(biāo)同步工具syncjenkins本地運(yùn)行與原理實(shí)戰(zhàn)指南Apache Beam 社區(qū)指標(biāo)棧Jenkins 構(gòu)建指標(biāo)同步工具syncjenkins本地運(yùn)行與原理實(shí)戰(zhàn)指南 Apache Beam 項(xiàng)目維護(hù)著一套面向大數(shù)據(jù)批處理流處理數(shù)據(jù)工程上一篇RxSwift中文文檔MVVM架構(gòu)指南構(gòu)建可維護(hù)的iOS應(yīng)用的終極教程下一篇標(biāo)題探索未來(lái)游戲之路SharpNav 開(kāi)源導(dǎo)航庫(kù)創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考