RAKUS Developers Blog | ラクス エンジニアブログ

株式会社ラクスのITエンジニアによる技術ブログです。

【JJUG CCC 2021 Fall 発表レポート】JMeter・Grafana・Influxdbを活用したパフォーマンステストの自動化

f:id:tech-rakus:20220114135746p:plain

新規サービスの開発チームに所属しているkarabishです。

2021年11月にJJUG CCC 2021 Fallにて「勤怠管理サービスでの継続的テストの取り組み」というテーマで登壇しました。 パフォーマンステストの自動化について発表したのですが、発表時はどういうことをやったのかのみをお伝えしましたので本ブログでは具体的な方法をお伝えできればと思います。

JJUG CCC 2021 Fallとは

JJUG CCCは毎年2回、春と秋に開催する日本最大のJavaコミュニティイベントです。Java関連の技術や事例に関する良質なセッションが行われ、また異なる分野で活躍するJava技術者が集まる場ともなっています。

https://fortee.jp/jjug-ccc-2021-fall

登壇資料はこちら

関連ブログとして以下も合わせてご確認ください!
tech-blog.rakus.co.jp

なぜパフォーマンステストの自動化を取り組みしたのか

f:id:karabish:20220113134722j:plain

そもそもなぜパフォーマンステストを自動化する取り組みしたのかですが、パフォーマンステストを自動化する前は3つの問題がありました。 この3つの問題があり気軽にできていなかったことで、パフォーマンスの改善をすることが難しかったため改善に取り組みました。

パフォーマンステストの自動化で利用したもの

f:id:karabish:20220113135037j:plain

こちらのツールを利用したのですが、各ツールの役割は以下の通りです。

  • Gitlab CI
    • パフォーマンステストのイベントを発火する
  • Ansible
    • JMeterにパフォーマンステストを実行してもらう
    • JMeterの実行結果をInfluxDB/PostgreSQLにデータを永続化してもらう
  • JMeter
    • パフォーマンステストを実行する
  • Grafana
    • パフォーマンステスト結果をグラフ化する
  • InfluxDB
    • パフォーマンステスト結果のHTTPリクエストごとの結果を永続化する
  • PostgreSQL
    • パフォーマンステスト結果の統計情報を永続化する

Ansible/JMeter/Grafana/InfluxDB/PostgreSQLの環境構築

Ansible

Gitlab CI上でAnsibleがインストールされたDockerを利用しています。

JMeter

JMeterの構築はJDKのインストールと、公式サイトからバイナリファイルを解凍すれば利用可能になります。
チューニングする箇所はJMeterが利用するメモリやGCくらいを環境に合わせる必要がありそうです。

Grafana/InfluxDB/PostgreSQL

Grafana/InfluxDB/PostgreSQLはpodman上に構築しています。利用しているCentOSがdockerをサポートしていなかったためpodmanを利用しています。 CentOSへのpodmanのインストールはyumでインストール可能です。

podmanは以下のようにマニフェストを記載し、podman play kube {マニフェスト}を実行すればpodを構築してくれます。

apiVersion: v1
kind: Pod
metadata:
  labels:
    app: dashboard
  name: dashboard
spec:
  containers:
  - name: grafana
    image: grafana/grafana
    ports:
    - containerPort: 3000
      hostPort: 3000
      protocol: TCP
  - name: influxdb
    image: influxdb
    env:
    - name: DOCKER_INFLUXDB_INIT_MODE
      value: setup
    - name: DOCKER_INFLUXDB_INIT_USERNAME
      value: root
    - name: DOCKER_INFLUXDB_INIT_PASSWORD
      value: password
    - name: DOCKER_INFLUXDB_INIT_ORG
      value: org
    - name: DOCKER_INFLUXDB_INIT_BUCKET
      value: performancetest
    - name: DOCKER_INFLUXDB_INIT_ADMIN_TOKEN
      value: admintoken
    ports:
    - containerPort: 8086
      hostPort: 8086
      protocol: TCP
    volumeMounts:
    - name: pv-influxdb
      mountPath: /var/lib/influxdb2
    - name: pv-influxdb-config
      mountPath: /etc/influxdb2
  - name: postgres
    image: postgres
    env:
    - name: POSTGRES_USER
      value: postgres
    - name: POSTGRES_PASSWORD
      value: postgres
    - name: POSTGRES_DB
      value: performancetest
    ports:
    - containerPort: 5432
      hostPort: 5432
      protocol: TCP
    volumeMounts:
    - name: pv-postgres
      mountPath: /var/lib/postgresql/data
  volumes:
  - name: pv-postgres
    hostPath:
      path: /usr/local/dashboard/data/postgres
      type: Directory
  - name: pv-influxdb
    hostPath:
      path: /usr/local/dashboard/data/influxdb/data
      type: Directory
  - name: pv-influxdb-config
    hostPath:
      path: /usr/local/dashboard/data/influxdb/config
      type: Directory

パフォーマンステストを自動化される前は

f:id:karabish:20220113162745j:plain

パフォーマンステストの自動化について説明する前に5つのステップで作業を行っていました。
基本的にはこの作業を自動化しています。

1. 負荷がかかるサーバを構築する

f:id:karabish:20220113163110j:plain

Gitlab CIからイベントを受け取り、Ansibleにて負荷がかかるサーバを構築します。
AWSだとterraformを実行するようなイメージです。

2. 負荷をかけるサーバを構築する

f:id:karabish:20220113164333j:plain

Ansible/JMeter/Grafana/InfluxDB/PostgreSQLの環境構築を参照ください。

3. JMeterシナリオを実行する

f:id:karabish:20220113164733j:plain

JMeterシナリオはjmeter -n -t {シナリオファイル} -l {JTLファイルの出力先} -e -o {レポートの出力先}を実行することで可能です。
JTLファイルはHTTPリクエストごとの結果でこの後InfluxDBに永続化し、レポートの出力先は統計情報でこの後にPostgreSQLに永続化します。

4. JTLファイルをインポートする

f:id:karabish:20220113165813j:plain

JTLファイルをInfluxDBに永続化はinflux write --org {DOCKER_INFLUXDB_INIT_ORG} --token {DOCKER_INFLUXDB_INIT_ADMIN_TOKEN} --host http://{エンドポイント}:8086 --bucket {DOCKER_INFLUXDB_INIT_BUCKET} --file {CSVファイル}を実行することで可能です。

5. 統計情報をインポートする

f:id:karabish:20220113170855j:plain

統計情報はJSON形式で保存されているため、SQLに変換しpsqlコマンドでINSERTしています。

6. GrafanaでInfluxDB/PostgreSQLにある結果をグラフ化する

f:id:karabish:20220113172258j:plain

まずはGrafanaからInfluxDBとPostgreSQLに接続するためのData Sourcesを設定します。

InfluxDBとPostgreSQLに接続できるようになったため、あとは表示するグラフ設定をこちらを参照に設定するのみとなります。
また、今回はGUIから各種設定をしたのですが、起動時にプロビジョニングすることもこちらにある通り可能です。

まとめ

パフォーマンステストのイベントを発火する作業をすればテストが自動化されるようになりました。
これで本来やりたかったパフォーマンス改善に取り組みができるようになるのではと思います。


  • エンジニア中途採用サイト
    ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
    ご興味ありましたら是非ご確認をお願いします。
    20210916153018
    https://career-recruit.rakus.co.jp/career_engineer/

  • カジュアル面談お申込みフォーム
    どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
    以下フォームよりお申込みください。
    rakus.hubspotpagebuilder.com

  • イベント情報
    会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
    rakus.connpass.com

Copyright © RAKUS Co., Ltd. All rights reserved.