SAKURUG TECHBLOG

JMeter実行中のテスト結果をInfluxDBとGrafanaを使い可視化する

timestampauthor-name
Miku

こんにちは、Mikuです。

前回の記事でJMeterをServer-Client構成で実行するという内容を書きました。
今回はその延長でJMeterの実行中のテスト結果をInfluxDBとGrafanaを使ってグラフにしてわかりやすく見よう!というのを目的にします。

環境

  • RedHat 7.3
  • Docker v19.03.13
  • Docker-Compose v1.27.4
  • justb4/docker-jmeter v5.4
  • JMeter v5.4.3
  • InfluxDB v2.2.0
  • Grafana v8.4.5

前提

Dockerコンテナ上 でJMeterテストが動くことを前提とします。
前回の記事でもDockerコンテナでJMeterの環境を構築しテストを実施するまでを紹介しましたのでご参考まで。。

InfluxDB と Grafana を Docker を使用し構築

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イメージを使用します。(作業当時の最新版)

dokcer-compose.ymlファイルの作成と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とGrafanaの設定を行っていきます。

InfluxDBの初期設定

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の初期設定

GrafanaのURLにアクセスすると下図の画面が出ます。
ユーザ名とパスワード共に初期設定の「admin」を入力すると新しいパスワードの設定を求められます。
Grafana初期画面

パスワード設定後、下図画面に遷移します。
早速InfluxDBと接続していきます。
左メニューの歯車マークからDate sourceを押下し、InfluxDBを選択します。

  • Name: InfluxDB(任意)
  • Query Language: Flux
  • URL: http://{InfluxDBのcontainer_name}:{Port} 今回の例では http://influxdb:8086 となります。InfluxDB のGUIにアクセスするURLではないので注意。
  • Access: Server(default)

  • Organization:InfluxDBの初期設定で設定したOrganization Name
  • Token:先程発行したAPIトークン
  • Default Bucket:先程作成したbucket


以上設定を行い、Seve & testを押下すると「n bucket found」 と出ます。
これでInfluxDBとGrafanaの接続は完了です。
Grafanaのダッシュボードの作成はここでは割愛しますが、テンプレートを使用できたり、Fluxという言語でクエリを作成できます。
Fluxについては公式ドキュメントを参照ください。
https://docs.influxdata.com/flux/v0.x/stdlib/universe/

JMeterメトリクスをInfluxDBに送るための準備

コンテナ起動オプションに外部用ネットワークを指定

前回の記事でさらっと書いていましたが、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} $@


JMeterシナリオにBackend Listener追加

Apacheのドキュメントを参考ください。
https://jmeter.apache.org/usermanual/realtime-results.html#influxdb_v2
jmxファイル作成時にBackend Listenerを追加、設定することでJMeterメトリクスをInfluxDBに送るようになります。
必要な情報は InfluxDBのURL、Org名、bucket名、APIトークンです。

JMeterを実行するとInfluxDBとGrafanaにデータが送信される

すべての設定が完了しJMeterテストを実行するとInfluxDBにメトリクスが送られ、Grafanaのダッシュボードにグラフとして表示されるようになります。

業務の情報は載せられないので完成図はないのですが…
頑張ればGrafanaの公式のページにあるような美しいダッシュボードが作成できます。
https://grafana.com/
テンプレートをインポートできればいいのですが、InfluxDBのバージョン違いやらで使えなかったので私は地道にFluxを書いて頑張りました。

前後編に分けたDocker環境におけるJMeterの実行、InfluxDBとGrafanaへのデータ送信と可視化までの手順は以上になります。
長くなりましたが興味本位程度に見ていただければ嬉しいです。
(後編は書くのが億劫になっていましたが書けて満足しました)

記事をシェアする

ABOUT ME

author-image
Miku
2018入社。JenkinsやDockerを触ったり、いろんな作業の自動化を進めたりしています。

© SAKURUG co.,ltd.