こんにちは、Mikuです。
前回の記事でJMeterをServer-Client構成で実行するという内容を書きました。
今回はその延長でJMeterの実行中のテスト結果をInfluxDBとGrafanaを使ってグラフにしてわかりやすく見よう!というのを目的にします。
Dockerコンテナ上 でJMeterテストが動くことを前提とします。
前回の記事でもDockerコンテナでJMeterの環境を構築しテストを実施するまでを紹介しましたのでご参考まで。。
InfluxDBとGrafanaどちらも既存のDockerイメージを使用します。
InfluxDB: https://hub.docker.com/_/influxdb
Grafana: https://hub.docker.com/r/grafana/grafana
この記事ではInfluxDBは2.2.0-alpine、Grafanaは8.4.5のタグがついたDockerイメージを使用します。(作業当時の最新版)
※現在Docker Composeの最新はv2であり、docker-compose.ymlというファイル名は非推奨(compose.yml を推奨)となっていますが、作業当時のv1に合わせます。
docker-compose.ymlファイルを下記のように作成します。
InfluxDBコンテナは異なるdocker-compose.ymlで定義されたJMeterコンテナと通信する必要があるため外部ネットワークの指定をします。
https://docs.docker.jp/compose/networking.html#compose
version: "3"
services:
influxdb:
image: influxdb:2.2.0-alpine
container_name: influxdb # Grafanaからアクセスするために必要になるので指定しておくこと
hostname: influxdb
ports:
- "8086:8086"
volumes:
- ./influxdb/data:/var/lib/influxdb
- ./influxdb/etc:/etc/influxdb
networks:
- external-jmeter # このdocker-compose.yml外のJMeterコンテナと通信するための外部用ネットワーク
- internal-jmeter # このdocker-compose.yml内のGrafanaコンテナと通信するための内部用ネットワーク
restart: always
grafana:
image: grafana/grafana:8.4.5
container_name: grafana
hostname: grafana
ports:
- "3000:3000"
user: 'root'
volumes:
- ./grafana:/var/lib/grafana/
depends_on:
- influxdb
networks:
- internal-jmeter # InfluxDBと通信するための内部用ネットワーク
restart: always
networks:
external-jmeter:
external: true # extarnal(外部との通信)をtrueにし許可する
internal-jmeter:
このままdocker-compose up
でコンテナ起動をすると内部用ネットワークのinternal-jmeter
は自動で作成されますが、外部用ネットワークの external-jmeter
は作成されないため、コンテナ起動前に手で作成する必要があります。
# 外部通信用のDockerネットワーク作成
$ docker network create external-jmeter
# Dockerネットワークの一覧を確認し、external-jmeterがあれば完了
$ docker network ls
外部ネットワークが作成されていることを確認したらコンテナを起動しましょう。
コンテナ起動したらInfluxDBとGrafanaの設定を行っていきます。
InfluxDBのURLにアクセスすると下図の画面が出ます。
InfluxDBの初期画面
「Get Started」を押下すると、ユーザ名とパスワード、Organization NameとBucket Nameを設定する画面に遷移します。
Bucketとは データベースのようなものです。
用語については公式のドキュメントを参照ください。
任意の名前に設定します。
画面を進めるとトップページに遷移します。
Data -> Bucketsを選択すると初期設定で作成されたbucketが確認できます。
ここからGrafanaと通信するために必要なAPIトークンを発行します。
Data -> API Tokensを選択します。
Generate API Tokenを押下、 Read/Write API Tokenを選択すると作成画面が出ます。
Descriptionに用途を入力します。
ReadとWriteそれぞれにGrafanaで読み込みたいバケットを選択し保存します。
発行されたトークンはGrafanaとの接続時に使用するためメモしておきます。
GrafanaのURLにアクセスすると下図の画面が出ます。
ユーザ名とパスワード共に初期設定の「admin」を入力すると新しいパスワードの設定を求められます。
Grafana初期画面
パスワード設定後、下図画面に遷移します。
早速InfluxDBと接続していきます。
左メニューの歯車マークからDate sourceを押下し、InfluxDBを選択します。
以上設定を行い、Seve & testを押下すると「n bucket found」 と出ます。
これでInfluxDBとGrafanaの接続は完了です。
Grafanaのダッシュボードの作成はここでは割愛しますが、テンプレートを使用できたり、Fluxという言語でクエリを作成できます。
Fluxについては公式ドキュメントを参照ください。
https://docs.influxdata.com/flux/v0.x/stdlib/universe/
前回の記事でさらっと書いていましたが、JMeterコンテナを起動する際に-network
オプションに作成したexternal-jmeter
を指定することでJMeterコンテナとInfluxDBコンテナの通信が可能になります。
#!/bin/bash
# Run JMeter Docker image with options
NAME="jmeter"
JMETER_VERSION="5.4"
IMAGE="justb4/jmeter:${JMETER_VERSION}"
# Finally run
docker run --rm --name ${NAME} --network=external-jmeter -i -v ${PWD}:${PWD} -w ${PWD} -p20001:20001 -p20002:20002 -p20003:20003 ${IMAGE} $@
Apacheのドキュメントを参考ください。
https://jmeter.apache.org/usermanual/realtime-results.html#influxdb_v2
jmxファイル作成時にBackend Listenerを追加、設定することでJMeterメトリクスをInfluxDBに送るようになります。
必要な情報は InfluxDBのURL、Org名、bucket名、APIトークンです。
すべての設定が完了しJMeterテストを実行するとInfluxDBにメトリクスが送られ、Grafanaのダッシュボードにグラフとして表示されるようになります。
業務の情報は載せられないので完成図はないのですが…
頑張ればGrafanaの公式のページにあるような美しいダッシュボードが作成できます。
テンプレートをインポートできればいいのですが、InfluxDBのバージョン違いやらで使えなかったので私は地道にFluxを書いて頑張りました。
前後編に分けたDocker環境におけるJMeterの実行、InfluxDBとGrafanaへのデータ送信と可視化までの手順は以上になります。
長くなりましたが興味本位程度に見ていただければ嬉しいです。
(後編は書くのが億劫になっていましたが書けて満足しました)