WebPagetestのAPIを呼んで、結果を保存するスクリプトを書いた

WebPagetestが提供しているREST APIを定期的に呼んで、結果をMongoDBに保存したくなって、スクリプトを書いた。

webpagetest-api を使おうとしたときのメモ - kitak.blogでは、npm packageでインストールしたコマンドからAPIを呼び出したが、職場的にスクリプト言語Pythonが使われることが多いような気がするので、Pythonスクリプトで。
先の記事にも書いたが、WebPagetest - Get API Key で事前にAPIキーを発行しておく。

import os
import time
import requests
from pymongo import MongoClient

client = MongoClient('localhost:27017')
db = client.webpagetest
API_KEY = os.environ["API_KEY"]
target_url = os.environ["TARGET_URL"]
params = {
    "url": target_url,
    "k": API_KEY,
    "f": "json",
    "location": "",
    "mobile": 1,
    "mobileDevice": "Nexus5",
    "video": 1
}
r = requests.get("https://www.webpagetest.org/runtest.php", params=params)
response_json = r.json()

test_id = response_json["data"]["testId"]
result_url = response_json["data"]["jsonUrl"]
print(test_id)
print(result_url)

while True:
    time.sleep(10)
    params = {
        "f": "json",
        "test": test_id
    }
    r = requests.get("https://www.webpagetest.org/testStatus.php", params=params)
    response_json = r.json()
    status_code = int(response_json["statusCode"])
    if status_code == 200:
        r = requests.get(result_url)
        response_json = r.json()
        result = {}
        result['id'] = response_json['data']['id']
        result['summary'] = response_json['data']['summary']
        result['location'] = response_json['data']['location']
        result['from'] = response_json['data']['from']
        result['completed'] = response_json['data']['completed']
        result['average'] = response_json['data']['average']
        db.results.insert_one(result)
        break
    elif status_code >= 400:
        print("ERROR " + target_url)
        break

スクリプトでやっていることは、テストを走らせるAPIを呼び出して、テストが完了したか調べるAPIを10秒毎に呼び出し、テストが完了したら結果から関心のある項目だけ取り出して、MongoDBに格納する、それだけ。 MongoDBを使うと怖い人が来そうな気がするのだが、テスト結果の項目が色々あって、そこから取捨選択したり、構造を変更することを考えるとスキーマレスでカジュアルにバンバン突っ込めるほうが楽。

後はこれを毎日実行して、1~3ヶ月のスパンで数値の変化をみていこうと思っているのだけど、可視化をどうするかが悩ましい。TTFBとかSpeed Indexの推移をみるだけだったら、matplotlabとかでグラフ描けばいいかなぁ...

後、話がズレるのだけど、Pythonスクリプトを書いていて、dictから一部の項目だけ取り出して別のdictを作るのもっと楽に書けないかなぁ、と思った。