Lambdaカクテル

京都在住Webエンジニアの日記です

Invite link for Scalaわいわいランド

Page Speed InsightsのスコアをMackerelに投稿するツールを作った(バイナリあります)

この記事はMackerel Advent Calendar 2022の記事です。昨日の記事は id:ryuichi1208 による 『今年作ったプラグイン集です』 でした。

ryuichi1208.hateblo.jp

Page Speed InsightsのスコアをMackerelに投稿するツール psi-mackerel

psi-mackerelというツールを書きました。Scala製です。ネイティブで走ります。

github.com

バイナリ

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はイロモノ的な立ち位置だと思われがちなのですが、最近はツールキットが熟してきて普通に使えるアプリケーションを書けるという感じです。

scala-native.org

ライブラリがネイティブビルドに対応している必要があるのでライブラリ制約がある程度発生するのですが、CatsやCats EffectといったTypelevelファミリーのライブラリはだいたい対応しているという感じです。HTTPアクセスするためにcurlをバックエンドにする必要があった(デフォルトで使われているバックエンドがNative非対応だったため)のが面白かったです。

ライブラリとして、非同期処理の枠組みとしてCats Effect、そしてコマンドライン引数の処理にDecline、HTTPまわりの処理にHttp4s、そしてファイルからの読み込みにfs2を使いました。Scalaの定番ライブラリという感じですね。そうそう、ScalaといってもScala3で書いているんですよ。時代の最新を行くプロダクトです。

typelevel.org

ben.kirw.in

http4s.org

fs2.io

Scalaはほどほどに流行ってほしいなと思っています。

明日の記事は id:Kureduki_Maari です。

★記事をRTしてもらえると喜びます
Webアプリケーション開発関連の記事を投稿しています.読者になってみませんか?