Help us learn about your current experience with the documentation. Take the survey.

使用 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 及其所有导出器,以及将来添加的任何导出器:

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

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

    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. 添加或找到并取消注释以下行:

    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'
  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 的示例配置:

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 的监控节点的最低必要步骤:

  1. 通过 SSH 进入监控节点。

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

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

  4. 编辑 /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
  5. 运行 sudo gitlab-ctl reconfigure 以编译配置。

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

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

    # 可以是 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:

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

    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'
  4. 如有必要,使用官方安装说明安装并设置专用的 Prometheus 实例。

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

    gitlab_rails['prometheus_address'] = '192.168.0.1:9090'
  6. 要抓取 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",
    }
  7. 要允许 Prometheus 服务器从 GitLab 指标 端点获取数据,请将 Prometheus 服务器 IP 地址添加到监控 IP 允许列表

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

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

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

  11. 将每个节点的导出器添加到 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。

  12. 重新加载 Prometheus 服务器。

配置存储保留大小

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

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

要配置存储保留大小:

  1. 编辑 /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"
    }
  2. 重新配置 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])
  • 磁盘读取 IOPSsum by (instance) (rate(node_disk_reads_completed_total[1m]))
  • 磁盘写入 IOPSsum by (instance) (rate(node_disk_writes_completed_total[1m]))
  • 通过 GitLab 事务计数得出的 RPSsum(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 指标。

Node 导出器

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

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

Web 导出器

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

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

Redis 导出器

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

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

PostgreSQL 导出器

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

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

PgBouncer 导出器

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

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

Registry 导出器

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

阅读有关 Registry 导出器的更多信息

GitLab 导出器

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

阅读有关 GitLab 导出器的更多信息

故障排除

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

如果您使用 Prometheus 监控:

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

如果您正在使用 Prometheus 监控:

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

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

  3. 再次启动服务:

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

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

监控节点未接收数据

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

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

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