Prometheus による GitLab の監視

Prometheusは強力な時系列モニタリングサービスで、GitLabやその他のソフトウェア製品をモニタリングするための柔軟なプラットフォームを提供します。

GitLabはPrometheusを使ってすぐに監視を行うことができ、GitLabサービスの高品質な時系列監視を利用することができます。

Prometheusとこのページにある様々なExporterはLinuxパッケージにバンドルされています。追加されたタイムラインについては、各エクスポーターのドキュメントを確認してください。自分でコンパイルしたインストールについては、自分でインストールする必要があります。その後のリリースで、GitLabのメトリクスが追加されます。

Prometheusのサービスはデフォルトでオンになっています。

PrometheusとそのExporterはユーザーを認証しないので、アクセスできる人なら誰でも利用できます。

プロメテウスの仕組み

Prometheusは定期的にデータソースに接続し、様々なエクスポートツールを通じてパフォーマンスメトリクスを収集します。モニタリングデータを表示して作業するには、Prometheusに直接接続するか、Grafanaのようなダッシュボードツールを使用します。

Prometheusの設定

自己コンパイルインストールの場合は、自分でインストールして設定する必要があります。

Prometheus とその Exporter はデフォルトでオンになっています。Prometheusはgitlab-prometheus ユーザーとして実行され、http://localhost:9090 をリッスンします。デフォルトでは、GitLabサーバーからのみPrometheusにアクセスできます。各エクスポーターは、個別に無効にしない限り、自動的にPrometheusの監視対象として設定されます。

PrometheusとそのすべてのExporter、そして今後追加されるExporterを無効にするには、次のようにしてください:

  1. 編集/etc/gitlab/gitlab.rb
  2. 以下の行を追加または見つけてコメントアウトし、false に設定されていることを確認してください:

    prometheus_monitoring['enable'] = false
    
  3. ファイルを保存し、変更を有効にするためにGitLab を再設定します。

Prometheusがリッスンするポートとアドレスの変更

caution
可能ではありますが、Prometheusがリッスンするポートを変更することはお勧めしません。自己責任で行ってください。

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'
    # or
    prometheus['listen_address'] = '0.0.0.0:9090'
    
  3. ファイルを保存し、変更を有効にするためにGitLabを再設定してください。

カスタムスクレイプ設定の追加

Prometheus scrape target configurationsyntax を使用して/etc/gitlab/gitlab.rbprometheus['scrape_configs'] を編集することで、Linux パッケージバンドルされた 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を実行するスタンドアロンのMonitoringノードを設定できます。

以下の手順は、Linuxパッケージを使用してPrometheusとGrafanaを実行するMonitoringノードを設定するために必要な最小限の手順です:

  1. Monitoringノードに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
       
    # Grafana
    grafana['enable'] = true
    grafana['admin_password'] = 'toomanysecrets'
    grafana['disable_login_form'] = false
       
    # Enable service discovery for 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), # The addresses can be IPs or FQDNs
    }
       
    # Nginx - For Grafana access
    nginx['enable'] = true
    
  5. sudo gitlab-ctl reconfigure を実行して設定をコンパイルします。

次のステップは、他のすべてのノードに監視ノードの場所を伝えることです:

  1. /etc/gitlab/gitlab.rb を編集し、以下の行を追加するか、見つけてコメントアウトします:

    gitlab_rails['prometheus_address'] = '10.0.0.1:9090'
    

    10.0.0.1:9090 は Prometheus ノードの IP アドレスとポートです。

  2. ファイルを保存し、変更を有効にするためにGitLab を再設定します。

consul['monitoring_service_discovery'] = true で Service Discovery を使用したモニタリングを有効にした後、prometheus['scrape_configs']/etc/gitlab/gitlab.rb に設定されていないことを確認してください。/etc/gitlab/gitlab.rbconsul['monitoring_service_discovery'] = trueprometheus['scrape_configs'] の両方を設定するとエラーになります。

外部 Prometheus サーバーの使用

caution
PrometheusやほとんどのExporterは認証に対応していません。ローカルネットワーク外に公開することはお勧めしません。

GitLabを外部のPrometheusサーバーで監視できるようにするには、いくつかの設定変更が必要です。GitLabを複数ノードでデプロイする場合は、外部サーバの利用を推奨します。

外部のPrometheusサーバーを使うには:

  1. /etc/gitlab/gitlab.rbを編集します。
  2. バンドルされている Prometheus を無効にします:

    prometheus['enable'] = false
    
  3. 各バンドルサービスのExporterをネットワークアドレスでリッスンするように設定します:

    node_exporter['listen_address'] = '0.0.0.0:9100'
    gitlab_workhorse['prometheus_listen_addr'] = "0.0.0.0:9229"
       
    # Rails nodes
    gitlab_exporter['listen_address'] = '0.0.0.0'
    gitlab_exporter['listen_port'] = '9168'
    registry['debug_addr'] = '0.0.0.0:5001'
       
    # Sidekiq nodes
    sidekiq['listen_address'] = '0.0.0.0'
       
    # Redis nodes
    redis_exporter['listen_address'] = '0.0.0.0:9121'
       
    # PostgreSQL nodes
    postgres_exporter['listen_address'] = '0.0.0.0:9187'
       
    # Gitaly nodes
    gitaly['configuration'] = {
       # ...
       prometheus_listen_addr: '0.0.0.0:9236',
    }
       
    # Pgbouncer nodes
    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メトリクスをスクレイピングするには、PrometheusサーバーIPを許可するようにNGINXを設定する必要があります。例えば

    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メトリクスエンドポイントからのフェッチを許可するには、監視IP allowlistにPrometheusサーバーのIPアドレスを追加します:

    gitlab_rails['monitoring_whitelist'] = ['127.0.0.0/8', '192.168.0.1']
    
  8. 各バンドルサービスのExporterをネットワークアドレスでリッスンするように設定しているので、インスタンスのファイアウォールを更新して、有効になっているExporterのPrometheus IPからのトラフィックだけを許可するようにします。Exporterサービスとそれぞれのポートの完全なリファレンスリストはここにあります。
  9. GitLabを再設定して変更を適用します。
  10. Prometheus サーバーの設定ファイルを編集します。
  11. 各ノードのExporterを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
    
    caution
    スニペット内のgitlab-rails ジョブは、GitLab が HTTPS で到達可能であることを前提としています。デプロイが HTTPS を使用していない場合、ジョブの設定はhttp スキームとポート 80 を使用するように変更されます。
  12. Prometheus サーバーをリロードします。

ストレージ保持サイズの設定

Prometheusにはローカルストレージを設定するためのいくつかのカスタムフラグがあります:

  • storage.tsdb.retention.time古いデータをいつ削除するか。デフォルトは15d 。このフラグがデフォルト以外に設定されている場合は、storage.tsdb.retention を上書きします。
  • storage.tsdb.retention.size: (experimental) 保持するストレージブロックの最大バイト数。最も古いデータから順に削除されます。デフォルトは0 (無効) です。このフラグは実験的なもので、将来のリリースで変更される可能性があります。サポートされる単位:B KB,MB,GB,TB,PB,EB.例えば、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
    

パフォーマンス・メトリクスの表示

Prometheusがデフォルトで提供しているダッシュボードのhttp://localhost:9090

GitLabインスタンスでSSLが有効になっている場合、GitLabと同じブラウザで同じFQDNを使うとHSTSのためにPrometheusにアクセスできないことがあります。GitLab経由でのアクセスを提供するテストプロジェクトが存在しますが、暫定的な回避策としては、別のFQDNを使用する、サーバーIPを使用する、Prometheus用に別のブラウザを使用する、HSTSをリセットする、NGINXにプロキシさせる、などがあります。

Prometheusによって収集されたパフォーマンスデータは、Prometheusコンソールで直接、または互換性のあるダッシュボードツールを介して表示することができます。Prometheusインターフェースは、収集したデータを扱うための柔軟なクエリ言語を提供し、出力を視覚化することができます。より高機能なダッシュボードにはGrafanaを使用でき、Prometheusを公式にサポートしています。

Prometheusクエリのサンプル:

  • 利用可能なメモリ: ((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
  • % CPU 使用率 1 - avg without (mode,cpu) (rate(node_cpu_seconds_total{mode="idle"}[5m]))
  • 送信データ rate(node_network_transmit_bytes_total{device!="lo"}[5m])
  • 受信データ rate(node_network_receive_bytes_total{device!="lo"}[5m])

GrafanaデータソースとしてのPrometheus

Grafanaでは、Prometheusのパフォーマンスメトリクスをデータソースとしてインポートし、メトリクスをグラフやダッシュボードとしてレンダリングすることができ、可視化に役立ちます。

単一サーバーのGitLabセットアップにPrometheusダッシュボードを追加するには:

  1. Grafanaで新しいデータソースを作成します。
  2. データソースに名前を付けます(GitLabなど)。
  3. type ドロップダウンリストでPrometheus を選択します。
  4. PrometheusのリスナーアドレスをURLとして追加し、アクセスをBrowser に設定します。
  5. HTTP メソッドをGET に設定します。
  6. 設定を保存してテストし、動作することを確認します。

GitLab メトリクス

GitLabは独自の内部サービス・メトリクスを監視し、/-/metrics エンドポイントで利用できるようにしています。他のExporterとは異なり、このエンドポイントはユーザーのトラフィックと同じURLとポートで利用できるため、認証が必要です。

GitLabメトリクスについてもっと読む.

バンドルされているソフトウェアメトリクス

LinuxパッケージにバンドルされているGitLabの依存関係の多くは、Prometheusメトリクスをエクスポートするように事前に設定されています。

ノードエクスポーター

ノード・エクスポーターを使用すると、メモリ、ディスク、CPUの使用率など、さまざまなマシン・リソースを測定できます。

ノード・エクスポーターの詳細をお読みください。

ウェブエクスポーター

ウェブエクスポーターは専用のメトリクスサーバーで、エンドユーザーとPrometheusのトラフィックを2つのアプリケーションに分割し、パフォーマンスと可用性を向上させます。

Web Exporterの詳細はこちらをご覧ください。

Redisエキスポーター

Redisエクスポートを使用すると、Redisのさまざまなメトリクスを測定できます。

Redisエクスポーターの詳細はこちらをご覧ください。

PostgreSQL exporter

PostgreSQLエクスポートを使用すると、PostgreSQLの様々なメトリクスを測定することができます。

PostgreSQLエクスポートの詳細はこちらをご覧ください。

PgBouncer exporter

PgBouncer Exporterは様々なPgBouncerのメトリクスを測定することができます。

PgBouncerエキスポーターの詳細はこちらをご覧ください。

レジストリ・エクスポーター

レジストリ・エクスポーターを使用すると、さまざまなレジストリ・メトリクスを測定できます。

レジストリ・エクスポーターの詳細については、こちらをご覧ください。

GitLab エクスポーター

GitLab Exporterでは、Redisやデータベースから取得した様々なGitLabメトリクスを測定することができます。

GitLab Exporterについてもっと読む.

トラブルシューティング

/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"