こんにちは、テクマトリックスの米田です。
Jenkinsを利用していると、チームのジョブの実行状況やJenkinsのメトリクスを可視化したい、というニーズが出てきます。
今回は、PrometheusでJenkinsのメトリクスを収集し、Grafanaで可視化する環境をDockerで構築してみたので、本記事でまとめます。

はじめに

Jenkinsを利用することで、ビルドやテストを自動化でき、開発者はコードの品質を保ちながら迅速なリリースを実現できます。しかしチームでJenkinsを利用していると、CI環境の管理者はチームのジョブの実行状況が気になります。また、Jenkinsが多くのジョブを同時に処理する場面では、パフォーマンスや安定性に影響を与えることがあります。このような時にJenkinsのメトリクスを可視化できると便利です。ジョブの実行状況や成功率といったメトリクスをリアルタイムで把握できれば、問題を早期に発見して迅速に対応できるようになり、より快適な開発環境を維持できます。

Prometheusとは

Prometheusは、システムの監視に利用されるオープンソースのツールです。メトリクスを時系列のデータとして収集・保存します。公式サイトには以下のように記載があります。

Open source metrics and monitoring for your systems and services
Monitor your applications, systems, and services with the leading open source monitoring solution. Instrument, collect, store, and query your metrics for alerting, dashboarding, and other use cases.

https://prometheus.io/

システムとサービス向けのオープンソースメトリクスと監視
業界をリードするオープンソースの監視ソリューションでアプリケーション、システム、サービスを監視します。アラート、ダッシュボード、その他のユースケース向けにメトリクスを計測、収集、保存、クエリを実行できます。

Google 翻訳を基に一部修正

Grafanaとは

Grafanaは、時系列のデータをダッシュボードにより可視化するオープンソースのツールです。Prometheusをはじめとする様々なデータソースから情報を取得して、グラフやチャート、数値により構成されるダッシュボードを作成できます。公式サイトには以下のように記載があります。

Visualize your data, optimize your performance
Easily collect, correlate, and visualize data with beautiful dashboards using Grafana — the open source data visualization and monitoring solution that drives informed decisions, enhances system performance, and streamlines troubleshooting.

https://grafana.com/oss/grafana/

データを可視化し、パフォーマンスを最適化
Grafana を使えば、美しいダッシュボードでデータを簡単に収集、相関分析、可視化できます。Grafana は、情報に基づいた意思決定を促進し、システムパフォーマンスを向上させ、トラブルシューティングを効率化するオープンソースのデータ可視化・監視ソリューションです。

Google 翻訳を基に一部修正

構築した環境の概要

今回はDockerコンテナを用いてJenkins, Prometheus, Grafanaを構築しました。以下のような構成です。JenkinsのメトリクスをPrometheusが取得し、Grafanaのダッシュボードで表示します。

構築する環境の全体像
  • ホストOS:Windows11 pro
  • Jenkins:バージョン2.528.1
  • Prometheus:バージョン3.7.2
  • Grafana:バージョン12.2.1

構築手順

1. 必要なファイルの作成

環境構築のために必要なdocker-compose.ymlを作成しました。以下に一例を示します。

services:
  jenkins:
    image: jenkins/jenkins:2.528.1-lts-jdk21
    container_name: jenkins
    user: jenkins
    ports:
      - "8090:8080"
      - "50000:50000"
    volumes:
      - jenkins_home:/var/jenkins_home
    restart: on-failure
    environment:
      TZ: Asia/Tokyo
    networks:
      - monitoring

  prometheus:
    image: prom/prometheus
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus.yml:/etc/prometheus/prometheus.yml
      - prometheus_data:/prometheus
    networks:
      - monitoring

  grafana:
    image: grafana/grafana
    ports:
      - "3000:3000"
    volumes:
      - grafana_data:/var/lib/grafana

    networks:
      - monitoring

volumes:
  jenkins_home:
  prometheus_data:
  grafana_data:

networks:
  monitoring:

Prometheusの利用には、Prometheusの設定を定義するprometheus.ymlも用意します。prometheus.ymlではPrometheusがメトリクスを取得する間隔や取得先のエンドポイントを指定します。

global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'jenkins'
    metrics_path: '/prometheus'
    static_configs:
      - targets: ['jenkins:8080']

作成したdocker-compose.ymlとprometheus.ymlは同じディレクトリに配置します。

2. Docker Composeの起動

docker-compose.ymlとprometheus.ymlを配置したディレクトリでDocker Composeを起動し、環境を立ち上げます。

docker compose up -d

3. Jenkinsの設定

http://localhost:8090 からJenkinsにアクセスします。
Jenkinsの初期セットアップ(ロック解除、プラグインのインストール、管理者ユーザーの登録)を完了させます。
次に、[Jenkinsの管理] > [Plugins] > [Installed plugins] で、Prometheusとの連携に必要なPrometheus metricsプラグインを選択し、インストールします。

Prometheus metricsプラグインのインストール画面

プラグインのインストール後、[Jenkinsの管理] > [System] でPrometheusの設定をします。今回はデフォルト値を使用します。

Prometheus metricsプラグインをインストール後の設定欄

4. Prometheusの設定

http://localhost:9090 からPrometheusにアクセスします。
[Status] > [Target health] を確認します。Jenkinsへのエンドポイントが表示され、「State」がUPになっていればJenkinsとの接続が成功しています。UNKNOWNの場合は、時間を空けてブラウザを再読み込みするとUPになります。

JenkinsとPrometheusの接続設定

5. Grafanaの設定

● GrafanaとPrometheusの接続
http://localhost:3000 からGrafanaにアクセスします。ユーザー名/パスワードは、admin/adminでログインできます。
左メニューの[Connections] > [Data sources] > [Add data source] から「Prometheus」を選択します。

収集するデータソースとしてPrometheusを設定

今回はNameに「prometheus – jenkins」を入力し、Connection欄のURLにhttp://prometheus:9090 を設定します。
画面下部の「Save & test」を押下し、「Successfully queried the Prometheus API.」と表示され、Prometheusとの接続が成功することを確認します。

PrometheusとGrafanaの接続設定

● Grafanaのダッシュボード画面の設定
左メニューの[Dashbords] > [Create dashbord] をクリックします。

Grafanaのダッシュボード画面の設定

今回はGrafanaで提供されている、Jenkinsのメトリクスを表示するためのダッシュボードを利用するため、右下の「Import dashboard」を選択し、遷移先の画面真ん中の枠に記載されているリンクをクリックします。

Grafanaのダッシュボード画面の設定

リンク先では、Grafanaで提供されているダッシュボードの一覧が表示されます。検索バーで「Jenkins」を検索します。今回はダウンロード回数が最も多い「Jenkins: Performance and Health Overview」を選択し、右下に表示されるIDをコピーします。

Grafanaで提供されているJenkins向けのダッシュボード「Jenkins: Performance and Health Overview」を選択

GrafanaのImport dashboard画面真ん中の枠にコピーしたダッシュボードのIDをペーストし、「Load」をクリックします。
Load後、ダッシュボードの名前を適宜変更します。特に最下部のPrometheusの項目は、「GrafanaとPrometheusの接続設定」で設定した「prometheus – jenkins」に変更します。最後に「Import」をクリックし、ダッシュボードの設定を終了します。

利用するダッシュボードを設定

Jenkinsのメトリクスが確認できるダッシュボード画面に遷移します。

Jenkins用に設定し、表示されたダッシュボード画面

実際に利用してみる

構築した環境を利用して、Grafanaのダッシュボードにどのような変化が起きるか確認していきます。

1. ジョブを成功・失敗させてみる

Jenkinsにジョブを追加して、成功・失敗するように実行しました。その結果、Grafanaのダッシュボードでは、成功したジョブと失敗したジョブがそれぞれ0から1に増え、JenkinsのメトリクスがGrafanaのダッシュボードに反映されていることが確認できました。

ジョブが成功・失敗することによりダッシュボードの表示が変化する様子

2. 30秒間待機するジョブを実行

2‐1. 1回実行

30秒間待機するジョブを作成し、1回実行しました。ジョブ実行中のGrafanaのダッシュボード画面は以下のように変化しました。設定している2つのエグゼキューターのうち1つが消費されていることが分かります。

ジョブが実行されることによりエグゼキューターが消費されている様子

2-2. 連続で実行

30秒間待機するジョブがキューに蓄積されて待機されるよう、20回連続で実行しました。Grafanaのダッシュボードでは、設定している2つのエグゼキューターが全て消費されていることや、キューに溜まっているジョブの数、キューにジョブが溜まっている時間に変化があることが分かります。

ジョブを連続で実行し、キューに蓄積されることでダッシュボードが変化している様子

まとめ

今回は、PrometheusとGrafanaを使ってJenkinsのメトリクスを可視化する環境をDockerで構築しました。いずれもOSSなので、無料で構築できます。Jenkinsのメトリクスを可視化することで、CI環境が期待通り運用されているか、Jenkinsのパフォーマンスに問題がないかを迅速に把握でき、次に取るべきアクションの判断に活かすことができます。
また、今回は紹介していませんが、Grafanaのダッシュボードにパネルを追加して新たなメトリクスを確認したり、Jenkinsのメトリクスを数式のように活用して所望のメトリクスを確認することもできます。ぜひご参考ください。

参考リンク
Monitoring Jenkins with Grafana and Prometheus (Medium ブログ記事)
How to Monitor Jenkins With Grafana and Prometheus (CloudBees Youtube動画)

By yoneta