【python3】JMeterの実行結果をgoogleスプレッドシートに出力してみる【gspread】


こんにちは。
SSチームの讃岐です。
時折、負荷試験の案件に携わることがあるのですが、JMeterの実行結果を毎回記録するのが怠かったので、
実行結果をgoogleスプレッドシートに出力するスクリプトを作ってみました。
Let's自動化!!

事前準備

下記3点を事前に準備する必要があります。
・Google Drive API/Google Sheets APIの有効化
・秘密鍵(JSONデータ)のダウンロード
・スプレッドシートの共有設定

諸々は下記からどうぞ!
https://console.developers.google.com/

あと、必要なパッケージ類は事前にインストールしておいてくださいね。
*CentOS7であれば、下記コマンドでOKです!

yum install python3 python-devel jq
pip3 install gspread
pip3 install oauth2client

スクリプト1(python)

コマンドライン引数に指定したcsvをスプレッドシートに出力するpythonスクリプトです。
pythonには「gspread」っていうスプレッドシート操作用の便利なライブラリがあるので、ありがたく利用させて頂きます。

#!/usr/bin/python3

import gspread
import json
import csv
import sys
import itertools

# シークレットキーを絶対パスで指定
SECRETJSON = "/usr/local/jmeter/bin/sacred-drive.json"
# スプレッドシートキーを定義
SPREADSHEET_KEY = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'

############################################################################
## 関数

# 数字と文字コンバーター
def num2alpha(num):
    if num<=26:
        return chr(64+num)
    elif num%26==0:
        return num2alpha(num//26-1)+chr(90)
    else:
        return num2alpha(num//26)+chr(64+num%26)

#############################################################################
## 認証

# お約束
from oauth2client.service_account import ServiceAccountCredentials
scope = ['https://spreadsheets.google.com/feeds','https://www.googleapis.com/auth/drive']

# ダウンロードしたjsonファイルを定義
credentials = ServiceAccountCredentials.from_json_keyfile_name(SECRETJSON, scope)

# Google APIにログイン
gc = gspread.authorize(credentials)

# スプレッドシートのシート1を開く
worksheet = gc.open_by_key(SPREADSHEET_KEY).sheet1


##############################################################################
## 処理

# コマンドライン引数を取得
args = sys.argv
csvfile = args[1]

# CSVファイルの内容を配列に代入
with open(csvfile) as fp:
    results_list_ex = list(csv.reader(fp))

# 2次元配列を1次元配列に変換
results_list = list(itertools.chain.from_iterable(results_list_ex))

# カウント変数初期化
COUNT_NUM = 1
# 空白行探索
while str(len(worksheet.cell(COUNT_NUM, 1).value)) != "0":
        COUNT_NUM += 1

# 編集する範囲を指定
cell_list = worksheet.range('A'+str(COUNT_NUM)+':'+num2alpha(len(results_list))+str(COUNT_NUM))

# cell_listにresults_listの配列を代入
for i,cell in enumerate(cell_list):
    cell.value = results_list[i]

# 結果の保存
worksheet.update_cells(cell_list)

下記2点は適宜環境に併せる必要があります。
・「SECRETJSON」にGoogle APIの秘密鍵ファイルを指定してください。
・「SPREADSHEET_KEY」に結果を出力するシートのキーを指定してください。

このpythonスクリプトを後述のシェルスクリプトで利用します。

スクリプト2(シェルスクリプト)

#!/bin/sh

DATE=$(date +"%Y%m%d")
OPTIME=$(date +"%Y%m%d-%H%M%S")
#結果の出力先ディレクトリを指定
LOGDIR=/var/www/html/${DATE}
#JMXファイルを指定
FILE_JMX=/usr/local/jmeter/bin/templates/build-web-test-plan.jmx

# 日付ディレクトリの作成
mkdir -p ${LOGDIR}

# jmeterの実行
/usr/local/jmeter/bin/jmeter -Dsun.net.inetaddr.ttl=0 -n -t ${FILE_JMX} -j ${LOGDIR}/${OPTIME}.log -l ${LOGDIR}/${OPTIME}.jtl -e -o ${LOGDIR}/${OPTIME}_th${JMETER_THREAD}${2}/ -r

# CSVファイルの作成
cat ${LOGDIR}/${OPTIME}_th${JMETER_THREAD}${2}/statistics.json | jq  -r ". [] | [.transaction,.sampleCount,.errorCount,.errorPct,.meanResTime,.minResTime,.maxResTime,.pct1ResTime,.pct2ResTime,.pct3ResTime,.throughput,.receivedKBytesPerSec,.sentKBytesPerSec] | @csv" | grep "Total" > ${LOGDIR}/${OPTIME}_th${JMETER_THREAD}${2}/statistics.csv

# スプレッドシートに結果を出力
/usr/local/bin/main.py ${LOGDIR}/${OPTIME}_th/statistics.csv

jsonで出力された結果をcsvに整形して、pythonスクリプトに渡してあげる感じですね。
スクリプトの処理内容としては、
①JMeterを実行
②json形式の結果をcsvに変換
③csvを読み込んで、スプレッドシートにアペンド
みたいな感じです。

使用例

実際に使ってみましょう!

[root@test-server2-1 bin]# ./start-controller_cui.sh
Creating summariser 
<summary>
Created the tree successfully using /usr/local/jmeter/bin/templates/build-web-test-plan.jmx
Configuring remote engine: 192.168.33.11
Starting remote engines
Starting the test @ Thu Jun 25 04:59:38 JST 2020 (1593028778488)
Remote engines have been started
Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445
summary =      2 in 00:00:02 =    1.2/s Avg:   215 Min:   139 Max:   291 Err:     0 (0.00%)
Tidying up remote @ Thu Jun 25 04:59:41 JST 2020 (1593028781684)
... end of run
[root@test-server2-1 bin]# ls /var/www/html/20200625/20200625-033715_th/statistics.csv
/var/www/html/20200625/20200625-033715_th/statistics.csv

うん、正常に実行されましたね!CSVファイルも作成されているみたいです。
肝心のスプレッドシートを確認してみましょう。

できたー。
もう一回実行してみましょう!

ちゃんと次の行に出力されていますね。OKです!

終わりに

如何でしたでしょうか?
pythonの豊富なライブラリを使用すれば、かなり手軽に簡単に実装することが出来ますね。

あと、将来的には以下のような項目も同時に出力できるように機能改修していきたいです。

1. 実行した時間(YYYY/MM/DD hh:mm:ss)
2. JMeterの実行パラメータ
・コントローラーの台数
・スレーブの台数
・スレッド数
・ループ回数
・ランプUPタイム
3. JMeterが出力したHTMLファイルへのリンク

このあたりも実現できたら別に記事を作成させて頂きますね。
ではではー。


この記事をかいた人

About the author

讃岐佳介

  CERTIFICATE:
    - TOEIC 835
    - LPIC304
    - AWS Solution Architect Associate
    - GCP Professional Cloud Architect