公司动态

Prometheus 监控 GitLab CI 全栈实战:从 Runner 队列到流水线状态的 DevOps 可观测性

📅 2026/8/26 18:28:31
Prometheus 监控 GitLab CI 全栈实战:从 Runner 队列到流水线状态的 DevOps 可观测性
Prometheus 监控 GitLab CI 全栈实战从 Runner 队列到流水线状态的 DevOps 可观测性GitLab CI 是支撑现代软件交付的核心工具一旦它的Runner 执行器耗尽、作业排队过长、Runner 离线、流水线失败率飙升代码从提交到上线的流水线就会阻塞直接影响发布效率。Prometheus 通过GitLab Runner 原生指标端点以及社区的gitlab-ci-pipelines-exporter能将 CI 运行时的 Runner 健康、作业吞吐、失败率以及流水线状态全部转化为标准化时序数据让 DevOps 团队像监控应用一样监控 CI 平台。本文将带你从启用 Runner 指标端点、配置抓取到解读关键指标、构建 Grafana 大屏与告警规则全面掌握 GitLab CI 的可观测性。1. 方案选型GitLab Runner 原生指标 vs 第三方导出器方案适用场景特点GitLab Runner 内置/metricsRunner 自身的资源使用、作业执行状态、任务队列深度从 Runner 13.7 版本开始内置无需额外部署涵盖作业计数、内存、CPU、并发等gitlab-ci-pipelines-exporter(社区)GitLab Server 上的流水线状态、 Job 历史、审批状态等通过 GitLab API 轮询流水线 ID 或项目将持续时间、状态、覆盖率等指标暴露为 Prometheus 格式GitLab Server 自身/metricsGitLab 实例全局状态Sidekiq、数据库、HTTP 请求等监控 GitLab 服务器健康而非 CI 流水的具体业务指标推荐组合GitLab Runner 原生端点负责执行层监控gitlab-ci-pipelines-exporter负责流水线业务层监控二者互补构成完整的 CI 可观测性。本文重点覆盖 Runner 监控并在进阶部分详述流水线导出器的使用。2. 启用 GitLab Runner 的 Prometheus 端点从 GitLab Runner 13.7 开始Prometheus 指标默认监听在9252端口可通过--metrics-address调整。需要在 Runner 启动时配置监听地址。2.1 配置 Runner 监听地址在config.toml中添加或通过命令行参数[[runners]] # ... 其他配置 ... [runners.metrics] address 0.0.0.0:9252若使用 Helm 部署的 GitLab Runner可在values.yaml中设置metrics:enabled:trueport:9252重启 Runner 后访问http://runner-host:9252/metrics验证应看到gitlab_runner_jobs_total、gitlab_runner_concurrent等指标。2.2 验证和权限Runner 的/metrics端点无需认证建议通过防火墙或 Kubernetes NetworkPolicy 限制访问来源为 Prometheus 服务器。3. 配置 Prometheus 抓取scrape_configs:-job_name:gitlab-runnerscrape_interval:30sstatic_configs:-targets:-runner1:9252-runner2:9252labels:environment:productioncomponent:ci-runner如果 Runner 数量很多可使用 Kubernetes 的 Pod Annotations 或file_sd动态发现。4. 核心监控指标与 PromQLRunner 暴露的指标以gitlab_runner_为前缀同时包含 Go 运行时指标go_*和进程指标process_*。4.1 作业与并发指标含义gitlab_runner_jobs_total(Counter)执行的作业总数按staterunning, success, failed, canceled分标签gitlab_runner_concurrent当前并发执行的作业数gitlab_runner_concurrent_limitRunner 配置的最大并发数gitlab_runner_request_concurrency当前请求并发数等待获取新作业gitlab_runner_limit并发限制设置PromQL 示例作业失败速率rate(gitlab_runner_jobs_total{statefailed}[5m])并发饱和度gitlab_runner_concurrent / gitlab_runner_concurrent_limit作业成功率sum(rate(gitlab_runner_jobs_total{statesuccess}[5m])) / sum(rate(gitlab_runner_jobs_total[5m]))4.2 资源与错误指标含义gitlab_runner_errors_total遇到的错误总数按levelwarning, error分类gitlab_runner_memory_used_bytesRunner 进程当前内存使用gitlab_runner_cpu_seconds_totalRunner 进程 CPU 时间告警rate(gitlab_runner_errors_total{levelerror}[5m]) 04.3 作业队列与 API指标含义gitlab_runner_request_queue_size作业请求队列长度等待 Runner 处理的作业gitlab_runner_request_latency_seconds(Histogram)Runner 请求 GitLab API 的延迟gitlab_runner_api_request_duration_seconds(Histogram)API 调用延迟gitlab_runner_api_requests_totalAPI 请求总数PromQL 示例API 延迟 P95histogram_quantile(0.95, rate(gitlab_runner_api_request_duration_seconds_bucket[5m]))请求队列积压gitlab_runner_request_queue_size 04.4 版本与信息指标含义gitlab_runner_version_infoRunner 版本信息标签包括version,revision5. Grafana 仪表盘推荐GitLab Runner DashboardDashboard ID13971社区设计展示作业吞吐、失败率、并发、API 延迟、内存/CPU。GitLab Runner by PrometheusID14788更现代包含版本信息、错误趋势。自建 CI 运营面板创建作业成功率趋势图、队列深度指示器、Runner 健康表。导入后选择数据源变量instance对应 Runner 实例。6. 告警规则实战groups:-name:gitlab_runner_alertsrules:-alert:GitLabRunnerDownexpr:up{jobgitlab-runner} 0for:1mlabels:severity:criticalannotations:summary:GitLab Runner {{ $labels.instance }} 不可达-alert:GitLabRunnerHighFailureRateexpr:rate(gitlab_runner_jobs_total{statefailed}[10m]) / rate(gitlab_runner_jobs_total[10m])0.1for:5mlabels:severity:criticalannotations:summary:Runner {{ $labels.instance }} 作业失败率超过 10%-alert:GitLabRunnerSaturationexpr:gitlab_runner_concurrent / gitlab_runner_concurrent_limit0.9for:10mlabels:severity:warningannotations:summary:Runner {{ $labels.instance }} 并发使用率超过 90%-alert:GitLabRunnerAPIHighLatencyexpr:histogram_quantile(0.99,rate(gitlab_runner_api_request_duration_seconds_bucket[5m]))5for:5mlabels:severity:warningannotations:summary:Runner API 调用 P99 延迟超过 5 秒可能 GitLab 服务器过载-alert:GitLabRunnerErrorsexpr:rate(gitlab_runner_errors_total{levelerror}[5m])0labels:severity:criticalannotations:summary:Runner {{ $labels.instance }} 出现错误日志7. 进阶监控 GitLab 流水线状态Pipeline ExporterRunner 指标只反映执行侧而流水线是成功还是失败、持续时间、覆盖率等信息需要通过 GitLab API 抓取。推荐使用mvisonneau/gitlab-ci-pipelines-exporter。7.1 部署 Pipelines Exporterdockerrun-d\--namegitlab-pipelines-exporter\-p9400:9400\-eGCPE_GITLAB_TOKENglpat-xxx\-eGCPE_GITLAB_URLhttps://gitlab.example.com\mvisonneau/gitlab-ci-pipelines-exporter:latest可以通过配置文件指定要监控的项目和流水线 ID或启用自动发现。7.2 配置 Prometheus 抓取-job_name:gitlab-pipelinesscrape_interval:60sstatic_configs:-targets:[pipeline-exporter:9400]labels:source:gitlab-ci7.3 常用流水线指标指标含义gitlab_ci_pipeline_duration_seconds流水线总耗时gitlab_ci_pipeline_status状态0success, 1failed, 2running, 3pending 等gitlab_ci_pipeline_id最新流水线 IDgitlab_ci_pipeline_coverage测试覆盖率如果项目配置了PromQL 示例流水线失败gitlab_ci_pipeline_status{projectmy-app} 1最近 1 小时平均流水线耗时avg_over_time(gitlab_ci_pipeline_duration_seconds{projectmy-app}[1h])8. 安全与多实例管理Runner 指标端点使用防火墙限制 9252 端口仅 Prometheus 可访问。GitLab Token用于 pipelines exporter 的 API Token 应仅具有read_api权限并定期轮换。多 Runner 环境利用file_sd或 Kubernetes Service Discovery 自动添加新 Runner。高基数控制Runner 指标中的job标签可能产生高基数建议通过metric_relabel_configs丢弃不需要的标签。9. 总结通过 GitLab Runner 的原生 Prometheus 端点与 gitlab-ci-pipelines-exporter 的组合你不再需要登录 Runner 节点查看日志或手动刷新流水线页面。Runner 的并发压力、作业失败率、API 延迟以及流水线的最终状态都已实时汇聚于 Grafana 看板并通过 Alertmanager 及时告警。将 GitLab CI 纳入全栈可观测性体系意味着从代码提交到生产交付的每一步都透明、可控为 DevOps 实践提供坚实的数据基石。部署它让 CI 流水线也成为可观测的“第一公民”。