使用 Prometheus 监控 GitLab
- Tier: Free, Premium, Ultimate
- Offering: GitLab Self-Managed
Prometheus 是一个强大的时间序列监控服务,为监控 GitLab 和其他软件产品提供了灵活的平台。
GitLab 提供了开箱即用的 Prometheus 监控功能,可以访问 GitLab 服务的高质量时间序列监控数据。
Prometheus 和本页中列出的各种导出器都捆绑在 Linux 软件包中。请查看每个导出器的文档以了解它们被添加的时间线。对于自行编译的安装,您必须自己安装它们。在后续版本中,将捕获更多的 GitLab 指标。
Prometheus 服务默认启用。
Prometheus 及其导出器不验证用户身份,任何能够访问它们的人都可以使用。
Prometheus 的工作原理
Prometheus 通过定期连接到数据源并通过各种导出器收集其性能指标来工作。要查看和处理监控数据,您可以直接连接到 Prometheus 或使用像 Grafana 这样的仪表板工具。
配置 Prometheus
对于自行编译的安装,您必须自己安装和配置它。
Prometheus 及其导出器默认启用。
Prometheus 以 gitlab-prometheus 用户身份运行,并监听
http://localhost:9090。默认情况下,Prometheus 只能从 GitLab 服务器本身访问。
每个导出器都会自动设置为 Prometheus 的监控目标,除非单独禁用。
要禁用 Prometheus 及其所有导出器,以及将来添加的任何导出器:
-
编辑
/etc/gitlab/gitlab.rb -
添加或找到并取消注释以下行,确保它们设置为
false:prometheus_monitoring['enable'] = false sidekiq['metrics_enabled'] = false # 默认已设置为 `false`,但您可以明确禁用以确保 puma['exporter_enabled'] = false -
保存文件并重新配置 GitLab 以使更改生效。
更改 Prometheus 监听的端口和地址
您可以更改 Prometheus 监听的端口,但您不应该这样做。 此更改可能会影响或与 GitLab 服务器上运行的其他服务冲突。 请自行承担风险。
要从 GitLab 服务器外部访问 Prometheus, 请更改 Prometheus 监听的地址/端口:
-
编辑
/etc/gitlab/gitlab.rb -
添加或找到并取消注释以下行:
prometheus['listen_address'] = 'localhost:9090'将
localhost:9090替换为您希望 Prometheus 监听的地址或端口。如果您希望允许除localhost之外的主机访问 Prometheus,请省略主机,或使用0.0.0.0允许公共访问:prometheus['listen_address'] = ':9090' # 或 prometheus['listen_address'] = '0.0.0.0:9090' -
保存文件并重新配置 GitLab 以使更改生效
添加自定义抓取配置
您可以通过在 /etc/gitlab/gitlab.rb 中编辑 prometheus['scrape_configs'] 来为 Linux 软件包捆绑的 Prometheus 配置额外的抓取目标,使用 Prometheus 抓取目标配置 语法。
以下是抓取 http://1.1.1.1:8060/probe?param_a=test¶m_b=additional_test 的示例配置:
prometheus['scrape_configs'] = [
{
'job_name': 'custom-scrape',
'metrics_path': '/probe',
'params' => {
'param_a' => ['test'],
'param_b' => ['additional_test'],
},
'static_configs' => [
'targets' => ['1.1.1.1:8060'],
],
},
]使用 Linux 软件包的独立 Prometheus
您可以使用 Linux 软件包配置运行 Prometheus 的独立监控节点。可以将外部 Grafana 配置到此监控节点以显示仪表板。
对于具有多个节点的 GitLab 部署,建议使用独立监控节点。
以下是使用 Linux 软件包配置运行 Prometheus 的监控节点的最低必要步骤:
-
通过 SSH 进入监控节点。
-
使用 GitLab 下载页面上的步骤 1 和 2安装您想要的 Linux 软件包,但不要执行其余步骤。
-
确保收集 Consul 服务器节点的 IP 地址或 DNS 记录,以备下一步使用。
-
编辑
/etc/gitlab/gitlab.rb并添加内容:roles ['monitoring_role'] external_url 'http://gitlab.example.com' # Prometheus prometheus['listen_address'] = '0.0.0.0:9090' prometheus['monitor_kubernetes'] = false # 为 Prometheus 启用服务发现 consul['enable'] = true consul['monitoring_service_discovery'] = true consul['configuration'] = { retry_join: %w(10.0.0.1 10.0.0.2 10.0.0.3), # 地址可以是 IP 或 FQDN } # Nginx - 用于 Grafana 访问 nginx['enable'] = true -
运行
sudo gitlab-ctl reconfigure以编译配置。
下一步是告诉所有其他节点监控节点的位置:
-
编辑
/etc/gitlab/gitlab.rb,并添加或找到并取消注释以下行:# 可以是 FQDN 或 IP gitlab_rails['prometheus_address'] = '10.0.0.1:9090'其中
10.0.0.1:9090是 Prometheus 节点的 IP 地址和端口。 -
保存文件并重新配置 GitLab 以使更改生效。
在使用 consul['monitoring_service_discovery'] = true 启用通过服务发现的监控后,请确保 /etc/gitlab/gitlab.rb 中未设置 prometheus['scrape_configs']。在 /etc/gitlab/gitlab.rb 中同时设置 consul['monitoring_service_discovery'] = true 和 prometheus['scrape_configs'] 会导致错误。
使用外部 Prometheus 服务器
Prometheus 和大多数导出器不支持身份验证。我们不建议将它们暴露在本地网络之外。
需要进行一些配置更改,以允许 GitLab 被外部 Prometheus 服务器监控。
要使用外部 Prometheus 服务器:
-
编辑
/etc/gitlab/gitlab.rb。 -
禁用捆绑的 Prometheus:
prometheus['enable'] = false -
设置每个捆绑服务的导出器以监听网络地址,例如:
node_exporter['listen_address'] = '0.0.0.0:9100' gitlab_workhorse['prometheus_listen_addr'] = "0.0.0.0:9229" # Rails 节点 gitlab_exporter['listen_address'] = '0.0.0.0' gitlab_exporter['listen_port'] = '9168' registry['debug_addr'] = '0.0.0.0:5001' # Sidekiq 节点 sidekiq['listen_address'] = '0.0.0.0' # Redis 节点 redis_exporter['listen_address'] = '0.0.0.0:9121' # PostgreSQL 节点 postgres_exporter['listen_address'] = '0.0.0.0:9187' # Gitaly 节点 gitaly['configuration'] = { # ... prometheus_listen_addr: '0.0.0.0:9236', } # Pgbouncer 节点 pgbouncer_exporter['listen_address'] = '0.0.0.0:9188' -
如有必要,使用官方安装说明安装并设置专用的 Prometheus 实例。
-
在所有 GitLab Rails(Puma、Sidekiq)服务器上,设置 Prometheus 服务器 IP 地址和监听端口。例如:
gitlab_rails['prometheus_address'] = '192.168.0.1:9090' -
要抓取 NGINX 指标,您还必须配置 NGINX 以允许 Prometheus 服务器 IP。例如:
nginx['status']['options'] = { "server_tokens" => "off", "access_log" => "off", "allow" => "192.168.0.1", "deny" => "all", }如果您有多个 Prometheus 服务器,也可以指定多个 IP 地址:
nginx['status']['options'] = { "server_tokens" => "off", "access_log" => "off", "allow" => ["192.168.0.1", "192.168.0.2"], "deny" => "all", } -
要允许 Prometheus 服务器从 GitLab 指标 端点获取数据,请将 Prometheus 服务器 IP 地址添加到监控 IP 允许列表:
gitlab_rails['monitoring_whitelist'] = ['127.0.0.0/8', '192.168.0.1'] -
由于我们将每个捆绑服务的导出器设置为监听网络地址,请更新实例上的防火墙,仅允许来自您的 Prometheus IP 的已启用导出器的流量。导出器服务及其各自端口的完整参考列表可以在此处找到。
-
重新配置 GitLab 以应用更改。
-
编辑 Prometheus 服务器的配置文件。
-
将每个节点的导出器添加到 Prometheus 服务器的抓取目标配置中。 例如,使用
static_configs的示例片段:scrape_configs: - job_name: nginx static_configs: - targets: - 1.1.1.1:8060 - job_name: redis static_configs: - targets: - 1.1.1.1:9121 - job_name: postgres static_configs: - targets: - 1.1.1.1:9187 - job_name: node static_configs: - targets: - 1.1.1.1:9100 - job_name: gitlab-workhorse static_configs: - targets: - 1.1.1.1:9229 - job_name: gitlab-rails metrics_path: "/-/metrics" scheme: https static_configs: - targets: - 1.1.1.1 - job_name: gitlab-sidekiq static_configs: - targets: - 1.1.1.1:8082 - job_name: gitlab_exporter_database metrics_path: "/database" static_configs: - targets: - 1.1.1.1:9168 - job_name: gitlab_exporter_sidekiq metrics_path: "/sidekiq" static_configs: - targets: - 1.1.1.1:9168 - job_name: gitaly static_configs: - targets: - 1.1.1.1:9236 - job_name: registry static_configs: - targets: - 1.1.1.1:5001片段中的
gitlab-rails作业假设 GitLab 可以通过 HTTPS 访问。如果您的部署不使用 HTTPS,则作业配置将调整为使用http方案和端口 80。 -
重新加载 Prometheus 服务器。
配置存储保留大小
Prometheus 有几个自定义标志来配置本地存储:
storage.tsdb.retention.time:何时删除旧数据。默认为15d。如果此标志设置为默认值以外的任何值,则覆盖storage.tsdb.retention。storage.tsdb.retention.size:(实验性)要保留的存储块的最大字节数。首先删除最旧的数据。默认为0(禁用)。此标志是实验性的,可能会在将来的版本中更改。支持的单位:B、KB、MB、GB、TB、PB、EB。例如,512MB。
要配置存储保留大小:
-
编辑
/etc/gitlab/gitlab.rb:prometheus['flags'] = { 'storage.tsdb.path' => "/var/opt/gitlab/prometheus/data", 'storage.tsdb.retention.time' => "7d", 'storage.tsdb.retention.size' => "2GB", 'config.file' => "/var/opt/gitlab/prometheus/prometheus.yml" } -
重新配置 GitLab:
sudo gitlab-ctl reconfigure
查看性能指标
您可以访问 http://localhost:9090 查看 Prometheus 默认提供的仪表板。
如果您的 GitLab 实例已启用 SSL,由于 HSTS,您可能无法在与 GitLab 相同的浏览器上访问 Prometheus(如果使用相同的 FQDN)。存在一个 GitLab 测试项目来提供访问,但在此期间有一些解决方法:使用单独的 FQDN、使用服务器 IP、使用单独的浏览器访问 Prometheus、重置 HSTS 或让 NGINX 代理它。
Prometheus 收集的性能数据可以直接在 Prometheus 控制台中查看,或通过兼容的仪表板工具查看。Prometheus 接口提供了灵活的查询语言来处理收集的数据,您可以在其中可视化输出。对于功能更全面的仪表板,可以使用 Grafana,它官方支持 Prometheus。
Prometheus 查询示例
以下是一些可以使用的 Prometheus 查询示例。
这些只是示例,可能不适用于所有设置。可能需要进一步调整。
- % CPU 利用率:
1 - avg without (mode,cpu) (rate(node_cpu_seconds_total{mode="idle"}[5m])) - % 可用内存:
((node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) or ((node_memory_MemFree_bytes + node_memory_Buffers_bytes + node_memory_Cached_bytes) / node_memory_MemTotal_bytes)) * 100 - 数据传输量:
rate(node_network_transmit_bytes_total{device!="lo"}[5m]) - 数据接收量:
rate(node_network_receive_bytes_total{device!="lo"}[5m]) - 磁盘读取 IOPS:
sum by (instance) (rate(node_disk_reads_completed_total[1m])) - 磁盘写入 IOPS:
sum by (instance) (rate(node_disk_writes_completed_total[1m])) - 通过 GitLab 事务计数得出的 RPS:
sum(irate(gitlab_transaction_duration_seconds_count{controller!~'HealthController|MetricsController'}[1m])) by (controller, action)
将 Prometheus 作为 Grafana 数据源
Grafana 允许您将 Prometheus 性能指标导入为数据源,并将指标呈现为图形和仪表板,这有助于可视化。
要为单服务器 GitLab 设置添加 Prometheus 仪表板:
- 在 Grafana 中创建新数据源。
- 对于类型,选择
Prometheus。 - 为您的数据源命名(例如 GitLab)。
- 在Prometheus 服务器 URL中,添加您的 Prometheus 监听地址。
- 将HTTP 方法设置为
GET。 - 保存并测试您的配置以验证其是否正常工作。
GitLab 指标
GitLab 监控其自己的内部服务指标,并在 /-/metrics 端点上提供它们。与其他导出器不同,此端点需要身份验证,因为它与用户流量使用相同的 URL 和端口。
阅读有关 GitLab 指标 的更多信息。
捆绑软件指标
Linux 软件包中捆绑的许多 GitLab 依赖项已预先配置为导出 Prometheus 指标。
Node 导出器
节点导出器允许您测量各种机器资源,例如内存、磁盘和 CPU 利用率。
Web 导出器
Web 导出器是一个专用的指标服务器,允许将最终用户和 Prometheus 流量拆分为两个独立的应用程序,以提高性能和可用性。
Redis 导出器
Redis 导出器允许您测量各种 Redis 指标。
PostgreSQL 导出器
PostgreSQL 导出器允许您测量各种 PostgreSQL 指标。
PgBouncer 导出器
PgBouncer 导出器允许您测量各种 PgBouncer 指标。
Registry 导出器
Registry 导出器允许您测量各种 Registry 指标。
GitLab 导出器
GitLab 导出器允许您测量从 Redis 和数据库中提取的各种 GitLab 指标。
故障排除
/var/opt/gitlab/prometheus 消耗过多磁盘空间
如果您不使用 Prometheus 监控:
- 禁用 Prometheus。
- 删除
/var/opt/gitlab/prometheus下的数据。
如果您正在使用 Prometheus 监控:
-
停止 Prometheus(在运行时删除数据可能会导致数据损坏):
gitlab-ctl stop prometheus -
删除
/var/opt/gitlab/prometheus/data下的数据。 -
再次启动服务:
gitlab-ctl start prometheus -
验证服务是否已启动并运行:
gitlab-ctl status prometheus -
可选。配置存储保留大小。
监控节点未接收数据
如果监控节点未接收任何数据,请检查导出器是否正在捕获数据:
curl "http[s]://localhost:<EXPORTER LISTENING PORT>/metrics"或
curl "http[s]://localhost:<EXPORTER LISTENING PORT>/-/metrics"