使用 Prometheus 监控极狐GitLab

  • Tier: 基础版, 专业版, 旗舰版
  • Offering: 私有化部署

Prometheus 是一个强大的时间序列监控服务,为监控极狐GitLab和其他软件产品提供了一个灵活的平台。

极狐GitLab 提供了开箱即用的 Prometheus 监控,提供对极狐GitLab 服务的高质量时间序列监控的访问。

Prometheus 和本文中列出的各种导出器捆绑在 Linux 软件包中。检查每个导出器的文档以了解它们被添加的时间表。对于自行编译的安装,您必须自行安装它们。在后续版本中,会捕获更多的极狐GitLab指标。

Prometheus 服务默认开启。

Prometheus 及其导出器不进行用户身份验证,任何可以访问它们的人都可以使用。

Prometheus 的工作原理#

Prometheus 通过定期连接到数据源并通过各种导出器收集其性能指标来工作。要查看和处理监控数据,您可以直接连接到 Prometheus或使用类似 Grafana 的仪表板工具。

配置 Prometheus#

对于自行编译的安装,您必须自行安装和配置。

Prometheus 及其导出器默认开启。Prometheus 以 gitlab-prometheus 用户身份运行,并监听 http://localhost:9090。默认情况下,仅能从极狐GitLab 服务器本身访问 Prometheus。除非单独禁用,否则每个导出器都会自动设置为 Prometheus 的监控目标。

要禁用 Prometheus 及其所有导出器,以及将来添加的任何导出器:

  1. 编辑 /etc/gitlab/gitlab.rb

  2. 添加或查找并取消注释以下行,确保它们设置为 false

    ruby
    prometheus_monitoring['enable'] = false sidekiq['metrics_enabled'] = false # 已默认设置为 `false`,但您可以明确禁用它以确保 puma['exporter_enabled'] = false
  3. 保存文件并重新配置极狐GitLab以使更改生效。

更改 Prometheus 监听的端口和地址#

虽然可以更改 Prometheus 监听的端口,但不推荐这样做,因为这可能会影响或与极狐GitLab服务器上运行的其他服务发生冲突。自行承担风险。

要从极狐GitLab服务器外部访问 Prometheus,请更改 Prometheus 监听的地址/端口:

  1. 编辑 /etc/gitlab/gitlab.rb

  2. 添加或查找并取消注释以下行:

    ruby
    prometheus['listen_address'] = 'localhost:9090'

    localhost:9090 替换为您希望 Prometheus 监听的地址或端口。如果您希望允许除 localhost 之外的主机访问 Prometheus,请省略主机,或使用 0.0.0.0 以允许公共访问:

    ruby
    prometheus['listen_address'] = ':9090' # 或 prometheus['listen_address'] = '0.0.0.0:9090'
  3. 保存文件并重新配置极狐GitLab以使更改生效。

添加自定义抓取配置#

您可以通过编辑 /etc/gitlab/gitlab.rb 中的 prometheus['scrape_configs'] 来为 Linux 软件包捆绑的 Prometheus 配置额外的抓取目标,使用 Prometheus 抓取目标配置语法。

以下是抓取 http://1.1.1.1:8060/probe?param_a=test&param_b=additional_test 的示例配置:

ruby
1prometheus['scrape_configs'] = [ 2 { 3 'job_name': 'custom-scrape', 4 'metrics_path': '/probe', 5 'params' => { 6 'param_a' => ['test'], 7 'param_b' => ['additional_test'], 8 }, 9 'static_configs' => [ 10 'targets' => ['1.1.1.1:8060'], 11 ], 12 }, 13]

使用 Linux 软件包的独立 Prometheus#

您可以使用 Linux 软件包配置一个运行 Prometheus 的独立监控节点。可以将外部 Grafana 配置到此监控节点以显示仪表板。

建议为具有多个节点的极狐GitLab 部署使用独立监控节点。

以下步骤是使用 Linux 软件包配置运行 Prometheus 的监控节点所需的最低要求:

  1. SSH 进入监控节点。

  2. 使用极狐GitLab 下载页面的 步骤 1 和 2 安装 您想要的 Linux 软件包,但不要执行其余步骤。

  3. 确保收集 Consul 服务器节点的 IP 地址或 DNS 记录,以便进行下一步。

  4. 编辑 /etc/gitlab/gitlab.rb 并添加以下内容:

    ruby
    1roles ['monitoring_role'] 2 3external_url 'http://gitlab.example.com' 4 5# Prometheus 6prometheus['listen_address'] = '0.0.0.0:9090' 7prometheus['monitor_kubernetes'] = false 8 9# 启用 Prometheus 的服务发现 10consul['enable'] = true 11consul['monitoring_service_discovery'] = true 12consul['configuration'] = { 13 retry_join: %w(10.0.0.1 10.0.0.2 10.0.0.3), # 地址可以是 IP 或 FQDN 14} 15 16# Nginx - 用于 Grafana 访问 17nginx['enable'] = true
  5. 运行 sudo gitlab-ctl reconfigure 以编译配置。

下一步是告诉所有其他节点监控节点的位置:

  1. 编辑 /etc/gitlab/gitlab.rb,并添加、查找并取消注释以下行:

    ruby
    # 可以是 FQDN 或 IP gitlab_rails['prometheus_address'] = '10.0.0.1:9090'

    其中 10.0.0.1:9090 是 Prometheus 节点的 IP 地址和端口。

  2. 保存文件并重新配置极狐GitLab以使更改生效。

在启用 consul['monitoring_service_discovery'] = true 的服务发现后,确保 /etc/gitlab/gitlab.rb 中未设置 prometheus['scrape_configs']。在 /etc/gitlab/gitlab.rb 中同时设置 consul['monitoring_service_discovery'] = trueprometheus['scrape_configs'] 会导致错误。

使用外部 Prometheus 服务器#

Prometheus 和大多数导出器不支持身份验证。我们不建议在本地网络之外公开它们。

允许极狐GitLab 由外部 Prometheus 服务器监控需要进行一些配置更改。

要使用外部 Prometheus 服务器:

  1. 编辑 /etc/gitlab/gitlab.rb

  2. 禁用捆绑的 Prometheus:

    ruby
    prometheus['enable'] = false
  3. 将每个捆绑服务的导出器设置为监听网络地址,例如:

    ruby
    1node_exporter['listen_address'] = '0.0.0.0:9100' 2gitlab_workhorse['prometheus_listen_addr'] = "0.0.0.0:9229" 3 4# Rails 节点 5gitlab_exporter['listen_address'] = '0.0.0.0' 6gitlab_exporter['listen_port'] = '9168' 7registry['debug_addr'] = '0.0.0.0:5001' 8 9# Sidekiq 节点 10sidekiq['listen_address'] = '0.0.0.0' 11 12# Redis 节点 13redis_exporter['listen_address'] = '0.0.0.0:9121' 14 15# PostgreSQL 节点 16postgres_exporter['listen_address'] = '0.0.0.0:9187' 17 18# Gitaly 节点 19gitaly['configuration'] = { 20 # ... 21 prometheus_listen_addr: '0.0.0.0:9236', 22} 23 24# Pgbouncer 节点 25pgbouncer_exporter['listen_address'] = '0.0.0.0:9188'
  4. 安装并设置一个专用的 Prometheus 实例(如有必要),使用 官方安装说明

  5. 所有极狐GitLab Rails(Puma, Sidekiq)服务器上,设置 Prometheus 服务器的 IP 地址和监听端口。例如:

    ruby
    gitlab_rails['prometheus_address'] = '192.168.0.1:9090'
  6. 要抓取 NGINX 指标,您还必须配置 NGINX 以允许 Prometheus 服务器 IP。例如:

    ruby
    1nginx['status']['options'] = { 2 "server_tokens" => "off", 3 "access_log" => "off", 4 "allow" => "192.168.0.1", 5 "deny" => "all", 6}

    如果您有多个 Prometheus 服务器,也可以指定多个 IP 地址:

    ruby
    1nginx['status']['options'] = { 2 "server_tokens" => "off", 3 "access_log" => "off", 4 "allow" => ["192.168.0.1", "192.168.0.2"], 5 "deny" => "all", 6}
  7. 要允许 Prometheus 服务器从极狐GitLab指标端点获取数据,请将 Prometheus 服务器 IP 地址添加到监控 IP 允许列表

    ruby
    gitlab_rails['monitoring_whitelist'] = ['127.0.0.0/8', '192.168.0.1']
  8. 由于我们将每个捆绑服务的导出器设置为监听网络地址,请更新实例上的防火墙,以仅允许来自您的 Prometheus IP 的流量进入启用的导出器。可以在此处找到导出器服务及其各自端口的完整参考列表。

  9. 重新配置极狐GitLab以应用更改。

  10. 编辑 Prometheus 服务器的配置文件。

  11. 将每个节点的导出器添加到 Prometheus 服务器的抓取目标配置中。 例如,使用 static_configs 的示例片段:

    yaml
    1scrape_configs: 2 - job_name: nginx 3 static_configs: 4 - targets: 5 - 1.1.1.1:8060 6 - job_name: redis 7 static_configs: 8 - targets: 9 - 1.1.1.1:9121 10 - job_name: postgres 11 static_configs: 12 - targets: 13 - 1.1.1.1:9187 14 - job_name: node 15 static_configs: 16 - targets: 17 - 1.1.1.1:9100 18 - job_name: gitlab-workhorse 19 static_configs: 20 - targets: 21 - 1.1.1.1:9229 22 - job_name: gitlab-rails 23 metrics_path: "/-/metrics" 24 scheme: https 25 static_configs: 26 - targets: 27 - 1.1.1.1 28 - job_name: gitlab-sidekiq 29 static_configs: 30 - targets: 31 - 1.1.1.1:8082 32 - job_name: gitlab_exporter_database 33 metrics_path: "/database" 34 static_configs: 35 - targets: 36 - 1.1.1.1:9168 37 - job_name: gitlab_exporter_sidekiq 38 metrics_path: "/sidekiq" 39 static_configs: 40 - targets: 41 - 1.1.1.1:9168 42 - job_name: gitaly 43 static_configs: 44 - targets: 45 - 1.1.1.1:9236 46 - job_name: registry 47 static_configs: 48 - targets: 49 - 1.1.1.1:5001
    片段中的 `gitlab-rails` 作业假设极狐GitLab 可通过 HTTPS 访问。如果您的部署不使用 HTTPS,则作业配置已调整为使用 `http` 方案和端口 80。
  12. 重新加载 Prometheus 服务器。

配置存储保留大小#

Prometheus 有多个自定义标志来配置本地存储:

  • storage.tsdb.retention.time:何时删除旧数据。默认为 15d。如果此标志设置为默认值以外的值,则覆盖 storage.tsdb.retention
  • storage.tsdb.retention.size:(实验性)要保留的存储块的最大字节数。最旧的数据首先被删除。默认为 0(禁用)。此标志为实验性,可能会在将来的版本中更改。支持的单位:B, KB, MB, GB, TB, PB, EB。例如,512MB

要配置存储保留大小:

  1. 编辑 /etc/gitlab/gitlab.rb

    ruby
    1prometheus['flags'] = { 2 'storage.tsdb.path' => "/var/opt/gitlab/prometheus/data", 3 'storage.tsdb.retention.time' => "7d", 4 'storage.tsdb.retention.size' => "2GB", 5 'config.file' => "/var/opt/gitlab/prometheus/prometheus.yml" 6}
  2. 重新配置极狐GitLab:

    shell
    sudo gitlab-ctl reconfigure

查看性能指标#

您可以访问 http://localhost:9090 查看 Prometheus 默认提供的仪表板。

如果您的极狐GitLab 实例启用了 SSL,您可能无法在使用相同 FQDN 的同一浏览器上访问 Prometheus,这是由于 HSTS 的原因。

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 仪表板:

  1. 在 Grafana 中创建一个新的数据源。
  2. 对于类型,选择 Prometheus
  3. 为您的数据源命名(例如 GitLab)。
  4. Prometheus 服务器 URL中,添加您的 Prometheus 监听地址。
  5. HTTP 方法设置为 GET
  6. 保存并测试您的配置以验证其是否正常工作。

极狐GitLab 指标#

极狐GitLab 监控其自身的内部服务指标,并将其提供在 /-/metrics 端点。与其他导出器不同,此端点需要身份验证,因为它与用户流量在同一个 URL 和端口上。

阅读更多关于极狐GitLab指标的信息。

捆绑软件指标#

许多捆绑在 Linux 软件包中的极狐GitLab 依赖项已预配置为导出 Prometheus 指标。

节点导出器#

节点导出器允许您测量各种机器资源,如内存、磁盘和 CPU 利用率。

阅读更多关于节点导出器的信息

Web 导出器#

Web 导出器是一个专用的指标服务器,允许将最终用户和 Prometheus 流量拆分为两个独立的应用程序以提高性能和可用性。

阅读更多关于 Web 导出器的信息

Redis 导出器#

Redis 导出器允许您测量各种 Redis 指标。

阅读更多关于 Redis 导出器的信息

PostgreSQL 导出器#

PostgreSQL 导出器允许您测量各种 PostgreSQL 指标。

阅读更多关于 PostgreSQL 导出器的信息

PgBouncer 导出器#

PgBouncer 导出器允许您测量各种 PgBouncer 指标。

阅读更多关于 PgBouncer 导出器的信息

注册表导出器#

注册表导出器允许您测量各种注册表指标。

阅读更多关于注册表导出器的信息

极狐GitLab 导出器#

极狐GitLab 导出器允许您测量从 Redis 和数据库中提取的各种极狐GitLab 指标。

阅读更多关于极狐GitLab 导出器的信息

故障排除#

/var/opt/gitlab/prometheus 消耗太多磁盘空间#

如果您使用 Prometheus 监控:

  1. 禁用 Prometheus
  2. 删除 /var/opt/gitlab/prometheus 下的数据。

如果您使用 Prometheus 监控:

  1. 停止 Prometheus(在运行时删除数据可能会导致数据损坏):

    shell
    gitlab-ctl stop prometheus
  2. 删除 /var/opt/gitlab/prometheus/data 下的数据。

  3. 重新启动服务:

    shell
    gitlab-ctl start prometheus
  4. 验证服务是否已启动并运行:

    shell
    gitlab-ctl status prometheus
  5. 可选。配置存储保留大小

监控节点未接收数据#

如果监控节点未接收到任何数据,请检查导出器是否正在捕获数据:

shell
curl "http[s]://localhost:<EXPORTER LISTENING PORT>/metrics"

shell
curl "http[s]://localhost:<EXPORTER LISTENING PORT>/-/metrics"