新規サービスの開発チームに所属しているkarabishです。
2021年11月にJJUG CCC 2021 Fallにて「勤怠管理サービスでの継続的テストの取り組み」というテーマで登壇しました。 パフォーマンステストの自動化について発表したのですが、発表時はどういうことをやったのかのみをお伝えしましたので本ブログでは具体的な方法をお伝えできればと思います。
- JJUG CCC 2021 Fallとは
- なぜパフォーマンステストの自動化を取り組みしたのか
- パフォーマンステストの自動化で利用したもの
- Ansible/JMeter/Grafana/InfluxDB/PostgreSQLの環境構築
- パフォーマンステストを自動化される前は
- まとめ
JJUG CCC 2021 Fallとは
JJUG CCCは毎年2回、春と秋に開催する日本最大のJavaコミュニティイベントです。Java関連の技術や事例に関する良質なセッションが行われ、また異なる分野で活躍するJava技術者が集まる場ともなっています。
https://fortee.jp/jjug-ccc-2021-fall
登壇資料はこちら
関連ブログとして以下も合わせてご確認ください!
tech-blog.rakus.co.jp
なぜパフォーマンステストの自動化を取り組みしたのか
そもそもなぜパフォーマンステストを自動化する取り組みしたのかですが、パフォーマンステストを自動化する前は3つの問題がありました。 この3つの問題があり気軽にできていなかったことで、パフォーマンスの改善をすることが難しかったため改善に取り組みました。
パフォーマンステストの自動化で利用したもの
こちらのツールを利用したのですが、各ツールの役割は以下の通りです。
- 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
パフォーマンステストを自動化される前は
パフォーマンステストの自動化について説明する前に5つのステップで作業を行っていました。
基本的にはこの作業を自動化しています。
1. 負荷がかかるサーバを構築する
Gitlab CIからイベントを受け取り、Ansibleにて負荷がかかるサーバを構築します。
AWSだとterraformを実行するようなイメージです。
2. 負荷をかけるサーバを構築する
Ansible/JMeter/Grafana/InfluxDB/PostgreSQLの環境構築を参照ください。
3. JMeterシナリオを実行する
JMeterシナリオはjmeter -n -t {シナリオファイル} -l {JTLファイルの出力先} -e -o {レポートの出力先}
を実行することで可能です。
JTLファイルはHTTPリクエストごとの結果でこの後InfluxDBに永続化し、レポートの出力先は統計情報でこの後にPostgreSQLに永続化します。
4. JTLファイルをインポートする
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. 統計情報をインポートする
統計情報はJSON形式で保存されているため、SQLに変換しpsql
コマンドでINSERTしています。
6. GrafanaでInfluxDB/PostgreSQLにある結果をグラフ化する
まずはGrafanaからInfluxDBとPostgreSQLに接続するためのData Sourcesを設定します。
- InfluxDBのData Sources設定はこちらを参照ください。
- PostgreSQLのData Sources設定はこちらを参照ください。
InfluxDBとPostgreSQLに接続できるようになったため、あとは表示するグラフ設定をこちらを参照に設定するのみとなります。
また、今回はGUIから各種設定をしたのですが、起動時にプロビジョニングすることもこちらにある通り可能です。
まとめ
パフォーマンステストのイベントを発火する作業をすればテストが自動化されるようになりました。
これで本来やりたかったパフォーマンス改善に取り組みができるようになるのではと思います。
エンジニア中途採用サイト
ラクスでは、エンジニア・デザイナーの中途採用を積極的に行っております!
ご興味ありましたら是非ご確認をお願いします。
https://career-recruit.rakus.co.jp/career_engineer/カジュアル面談お申込みフォーム
どの職種に応募すれば良いかわからないという方は、カジュアル面談も随時行っております。
以下フォームよりお申込みください。
rakus.hubspotpagebuilder.comイベント情報
会社の雰囲気を知りたい方は、毎週開催しているイベントにご参加ください!
rakus.connpass.com