基于LGTM栈(Mimir+Grafana)收集GitHub Actions指标的最优方案咨询
收集GitHub Actions指标对接Mimir+Grafana的最优方案
针对你的场景,结合LGTM技术栈(Mimir+Grafana),推荐以下几种高效且可持续的方案,替代过时的第三方Action和冗余Webhook:
1. GitHub API定时拉取方案(首推)
自己实现定时采集逻辑,完全可控,不会依赖第三方工具的维护状态:
- 核心思路:用一个自定义的GitHub Action定时触发,调用GitHub REST API批量拉取工作流运行数据,转换为Prometheus兼容格式后推送到Mimir。
- 具体步骤:
- 创建一个专用的采集工作流(比如
.github/workflows/metrics-collector.yml),设置定时触发(如每5分钟),也可结合工作流结束事件补充采集:name: GitHub Actions Metrics Collector on: schedule: - cron: '*/5 * * * *' workflow_run: workflows: ["*"] types: [completed] jobs: collect-metrics: runs-on: ubuntu-latest steps: - name: Fetch workflow runs env: GH_TOKEN: ${{ secrets.GH_PAT }} run: | gh api repos/${{ github.repository }}/actions/runs --per-page 100 --state completed > runs.json - name: Parse and push metrics to Mimir env: MIMIR_URL: ${{ secrets.MIMIR_REMOTE_WRITE_URL }} MIMIR_TOKEN: ${{ secrets.MIMIR_AUTH_TOKEN }} run: | # 用jq解析JSON,提取指标(需提前安装jq) jq -r ' .workflow_runs[] | let duration = (.completed_at | fromdate) - (.started_at | fromdate) in "{\"timeseries\": [{\"labels\": [{\"name\": \"workflow\", \"value\": \"\(.name)\"}, {\"name\": \"status\", \"value\": \"\(.status)\"}, {\"name\": \"conclusion\", \"value\": \"\(.conclusion)\"}], \"samples\": [{\"value\": \(duration), \"timestamp\": \(.completed_at | fromdate)}]}]}" ' runs.json | while read -r metric; do curl -X POST "$MIMIR_URL" \ -H "Authorization: Bearer $MIMIR_TOKEN" \ -H "Content-Type: application/json" \ -d "$metric" done - 配置必要的Secrets:
GH_PAT(带repo权限的个人访问令牌)、MIMIR_REMOTE_WRITE_URL、MIMIR_AUTH_TOKEN。 - 可根据需求调整采集范围(比如只拉取最近24小时的数据)、指标维度(添加分支、触发者等标签)。
- 创建一个专用的采集工作流(比如
- 优势:自主可控,无第三方依赖;批量拉取减少请求冗余;灵活调整采集频率和指标维度。
2. 优化版全局Webhook方案
如果需要实时指标,可优化Webhook的冗余问题:
- 核心思路:在仓库/组织级别配置一个全局Webhook,监听
workflow_run事件,通过轻量中间服务解析事件并推送到Mimir。 - 具体步骤:
- 在GitHub仓库/组织的Webhook设置中,添加一个新Webhook,选择
workflow_run事件,指定中间服务的接收地址。 - 搭建中间服务(比如用Go/Python编写),接收Webhook请求,验证签名后提取工作流运行数据,转换为Prometheus指标格式,调用Mimir的远程写API推送。
- 中间服务可实现去重、聚合逻辑(比如合并同一工作流的重复事件),避免冗余推送。
- 在GitHub仓库/组织的Webhook设置中,添加一个新Webhook,选择
- 优势:实时性强,适合即时告警场景;全局Webhook减少单工作流配置冗余。
3. 工作流内置指标导出
在现有工作流中直接添加指标导出步骤,无需额外采集任务:
- 核心思路:在每个工作流的结尾(无论成功失败),添加步骤计算当前运行时长、状态等指标,直接推送到Mimir。
- 示例步骤:
- name: Export workflow metrics if: always() run: | # 计算运行时长 STARTED_TS=$(date -d "${{ github.event.workflow_run.started_at }}" +%s) COMPLETED_TS=$(date +%s) DURATION=$((COMPLETED_TS - STARTED_TS)) # 生成Mimir兼容的指标数据 METRIC_DATA=$(cat << EOF { "timeseries": [ { "labels": [ {"name": "workflow", "value": "${{ github.workflow }}"}, {"name": "job", "value": "${{ github.job }}"}, {"name": "status", "value": "${{ job.status }}"}, {"name": "repo", "value": "${{ github.repository }}"} ], "samples": [ {"value": $DURATION, "timestamp": $COMPLETED_TS} ] } ] } EOF ) # 推送到Mimir curl -X POST ${{ secrets.MIMIR_REMOTE_WRITE_URL }} \ -H "Authorization: Bearer ${{ secrets.MIMIR_AUTH_TOKEN }}" \ -H "Content-Type: application/json" \ -d "$METRIC_DATA" - 优势:指标与工作流运行强绑定,数据精准;无需额外定时任务或中间服务。
Grafana仪表盘配置
完成指标采集后,在Grafana中配置Mimir数据源,即可创建针对性的仪表盘:
- 运行时长趋势面板:基于运行时长指标,展示不同工作流的平均/中位数时长变化。
- 状态统计面板:用状态标签的计数,按成功/失败/取消状态分组展示。
- 错误率面板:通过
失败次数/总运行次数的计算逻辑展示错误率。 - 最近失败工作流列表:结合GitHub API数据或日志,展示最近失败的工作流详情。
内容的提问来源于stack exchange,提问作者warhir
相关产品推荐
相关产品推荐

