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を作るのもっと楽に書けないかなぁ、と思った。