はじめに
これは KMC Advent Calendar 2020 - Adventar と はてなエンジニア Advent Calendar 2020 - Qiita 10日目の記事です。
KMC Advent Calendar 2020 9日目の担当は なな さんで 要約: 『CPUの創りかた』読んだら良かった。 - rebuild-kitashirakawa でした。 電気系の講義の単位をヒイヒイ言いながら取った記憶が甦ってきました。
はてなエンジニア Advent Calendar 2020 9日目の担当は id:koudenpa さんで 趣味のプログラムはブロックを組み立てるかのような楽しみ - koudenpaのブログ でした。 サイコロを物理的に振った結果がツイートで返ってくるのはIoTを感じますね。
先日、GitHub Actionsのプロファイラを書きました。 どういうことができるのかは GitHub Actions workflowのプロファイラを書いた - 私が歌川です を読んでもらうことにしましょう。 この記事では、プロファイラの実装に使ったライブラリについて紹介します。 Go言語で書いたので、Goのライブラリがどんどん出てきます。
実装に用いたライブラリ
github.com/google/go-github
何はともあれGitHubのAPIを叩かないと話が始まりません。 ということでGo向けのGitHub APIクライアントです。 なんとGoogle製です。
User-Agent文字列を設定する機能があり、おもてなしを感じます。 これによってUser-Agentを設定するだけの http.RoundTripper を実装して組み込むのを回避できました。
github.com/gregjones/httpcache
GitHubのAPIは、conditional requestによるHTTPレスポンスキャッシュに対応しています。 conditional requestで304レスポンスを受けた場合はAPIのレートリミットに影響しないので、できるだけ使うべき*1、と書いてあるので、使わない手はないでしょう。
github.com/gregjones/httpcache は、HTTPレスポンスキャッシュを行う http.RoundTripper を提供するライブラリです。 Transporterとして間に挟むだけでconditional requestを行ってくれます。 このおかげで、連続でプロファイラを走らせたときにキャッシュが効くので、試行錯誤を速くすることができます。
github.com/jessevdk/go-flags
CLIツールなのでコマンドライン引数を受けたいでしょう。 Go標準のflagsモジュールでも十分という考えもありますが、もうちょっと柔軟にコマンドライン引数を設定できるようにしたかったので採用しました*2。
github.com/pelletier/go-toml
設定ファイルを書けるようにしたい、現代ならTOMLか? ということで採用しました。 パースした値を、structのpublicなフィールドに対してしか格納できない、というのにちょっとハマりました。
github.com/montanaflynn/stats
プロファイルのために中央値や90%ileなどを計算する必要がありました。 自分で実装すると練習になるかもしれませんが、正確な結果を得たいのでライブラリの力を借りることにします。
github.com/montanaflynn/stats は、float64のスライスから中央値・平均値・99%ileなど、いろいろな統計値を計算できるライブラリです。 Goはなんでもforループで書くという印象でしたが、こういう統計値の計算はライブラリがあったので腕力を振るう必要がなくて助かりました。
github.com/olekukonko/tablewriter
単なるTSVよりも、human readableな表が出力できるほうがよいだろう、と思ってライブラリを探しました。 github.com/olekukonko/tablewriter は、いろいろな形式の表を出力できるライブラリです。 設定次第でMarkdownのテーブルを書き出したり、色を付けたりすることができます。
おわりに
プロファイラの開発を振り返ってみると、いろいろと便利なライブラリがすぐに見つかったので、実装はそこまで重たくなかったように思います。 Goは普段そんなに書かないけどまあ書けるかな、ぐらいの感じでしたが、週末をフルに使うぐらいの時間で一通り動くものを作ることができました。
KMC Advent Calendar 2020 11日目の担当は inonoa さんで 今年の抱負、或いは3度目のunity1weekに出るという誓約 - めものあ です。
はてなエンジニア Advent Calendar 2020 11日目の担当は id:cohalz さんで Webサービスのモニタリングについてのチェックリスト - Re:cohalz です。
*1:https://docs.github.com/en/free-pro-team@latest/rest/overview/resources-in-the-rest-api#conditional-requests
*2:具体的には、設定をTOMLから読み込む→コマンドライン引数で上書きする というのを実現したかった