えいのうにっき

a-knowの日記です

Mackerel の APM 機能を使ってみた

自分は Mackerel アンバサダーなのですが、ここn年、それに見合う活動ができていませんでした。......本当にすみません🙏🙏

ということで(?)、今回、Mackerel の APM 機能を「何も知らない」ところから「使い始める」ところまでやってみたので、ブログとして記録に残します。「従来までのホスト監視などと勝手が違いそう......」ということで腰が重い人も多いんじゃないかと思うですが(僕も含む)、実際にやってみたら比較的簡単にできたのと、なにより "ワクワク" できたので、同じような方にはぜひこの記事を見ながらやってみることをオススメします!

まずは Mackerel の画面を見てみる

ふむふむ

なるほどなるほど。トレースとやらを送信しさえすればこの画面で見れちゃいそう。

ドキュメントを読む

複数のページが用意されてるのですが、どれも丁寧なもので感動しました。

直接送信のための計装をやってみる

今回のチャレンジの題材となるアプリケーションは Pixela で、こいつは Go 製のWebアプリケーションなので、トレース - GoにOpenTelemetryを導入する - Mackerel ヘルプ をみながらやっていく。

やったこと

  1. go get
  2. initTracerProvider 関数を実装(とりま main 関数の実装があるファイル内に)
    • 必要に応じて service_name に任意の値を設定しておくとよさそう(今回は pixela にした)
  3. ミドルウェアの挿入
    • もともと heartbeat エンドポイント(ただ OK 文字列を返すだけのエンドポイント)を持っていたので、手始めにそいつに。(FWとしては chi を使用していた)
...

ctx := context.Background()
shutdown, err := initTracerProvider(ctx)
if err != nil {
  panic(err)
}
defer shutdown(ctx)

otelHeartbeatHandler := otelhttp.NewHandler(http.HandlerFunc(handlers.HeartbeatHandler), "heartbeat")
r.Method("GET", "/heartbeat", otelHeartbeatHandler)

...

4.デプロイして /heartbeat を叩く

5.オッ!!

6.というか、chi を使ってるから、個別でやらずとも↓のようなかんじでいいのか?

r.Use(otelhttp.NewMiddleware("pixela"))

7.オオオッ!!

Mackerel で APM、できちゃいました!

できました!

計装のためのコードはいくらかは必要だったとはいえ、ドキュメントの通りにやったらできたので簡単!グラフが描画されるときのワクワク感を再びこうやって味わうことができるとは...!やっぱり「かんたん」「ワクワク」は Mackerel のコアバリューだよなー、ということを改めて実感できました!

あまりにも簡単にできたので、次は独自のスパンの追加とかにも挑戦してみたいと思います!(つづく?)