この記事はMackerel Advent Calendar 2022の記事です。昨日の記事は id:ryuichi1208 による 『今年作ったプラグイン集です』 でした。
Page Speed InsightsのスコアをMackerelに投稿するツール psi-mackerel
psi-mackerel
というツールを書きました。Scala製です。ネイティブで走ります。
バイナリ
x86_64用のLinux向けバイナリを用意しています。
$ wget https://github.com/windymelt/psi-mackerel/releases/download/v1.0.1/psi-mackerel_x86_64.gz $ gzip -d psi-mackerel_x86_64.gz $ mv psi-mackerel_x86_64 psi-mackerel $ chmod u+x psi-mackerel
手元にLLVMとlibcurl-develがあればビルドも可能です。
$ NATIVE_MODE=release-fast NATIVE_LTO=thin sbt nativeLink
このコマンドを実行すると./target/scala-3.2.1/psi-mackerel-out
が得られます。
Usage
URLを渡すと、GoogleのPage Speed Insightsが出しているスコアがもらえるというものです。MackerelのAPIキーとサービス名を渡すことで、自動的にMackerelにサービスメトリックとして投稿してくれます:
$ psi-mackerel --mackerel-api-key "xxx" --service "WWW" https://www.3qe.us/ / Fetching PSI score... [0 / 1] $
MackerelのAPIキーを渡さない場合はスコアだけ返してくれます:
$ psi-mackerel https://www.3qe.us/ https://b.hatena.ne.jp | Fetching PSI score... [1 / 2] All PSI scores are fetched 99.0 https://www.3qe.us/ 77.0 https://b.hatena.ne.jp/
StdoutとStderrはうまく分けてあるので、リダイレクトするとスコアとURLのテキストが得られます。
99.0 https://www.3qe.us/ 77.0 https://b.hatena.ne.jp/
便利機能として、--target-list
オプションを使うことでファイルからもターゲットURLを指定できるようにしています:
https://www.3qe.us/ https://www3.nhk.or.jp/news/ https://google.co.jp/
このような1行1URLのファイルをtarget.txt
などといった名前で保存し、以下を実行することで、リストに指定されたURLについてPSIの取得/投稿が行われます:
$ psi-mackerel --target-list target.txt
Page Speed Insightsの取得にAPIキーは不要ですが、沢山リクエストを飛ばすためにはAPIキーを取得する必要があります。APIキーは--psi-api-key
で設定できます:
$ psi-mackerel --psi-api-key "xxx" https://www.3qe.us/
その他全ての短縮オプションやAPIキーの取得方法などは psi-mackerel --help
で確認できます。
モチベーション
仕事でPage Speed Insightsのスコアを投稿したくなったのですが、既に存在する id:aereal によるツールはHerokuへのデプロイが前提となっており、GitHub Actionsで使うためにはちょっと手間かなと思っていました。勉強もかねてScala Nativeで実装してみたという感じです。グラフなどの振舞いもある程度揃えています。ライブラリの知見はある程度あったので、サクサク実装できました(だいたい1日でできた)。
Scala Nativeけっこう良いっすよ
Scala Nativeはイロモノ的な立ち位置だと思われがちなのですが、最近はツールキットが熟してきて普通に使えるアプリケーションを書けるという感じです。
ライブラリがネイティブビルドに対応している必要があるのでライブラリ制約がある程度発生するのですが、CatsやCats EffectといったTypelevelファミリーのライブラリはだいたい対応しているという感じです。HTTPアクセスするためにcurlをバックエンドにする必要があった(デフォルトで使われているバックエンドがNative非対応だったため)のが面白かったです。
ライブラリとして、非同期処理の枠組みとしてCats Effect、そしてコマンドライン引数の処理にDecline、HTTPまわりの処理にHttp4s、そしてファイルからの読み込みにfs2を使いました。Scalaの定番ライブラリという感じですね。そうそう、ScalaといってもScala3で書いているんですよ。時代の最新を行くプロダクトです。
Scalaはほどほどに流行ってほしいなと思っています。
明日の記事は id:Kureduki_Maari です。