golang, observability, prometheus, pprof, trace
Go で observability を高める
この記事はもともと reveal.js のスライドとして公開していた内容を、記事として書き起こしたものです
day2 はつらいよ
observability とは?
可観測性(内部の挙動をいじらずに観測できるか)。
具体的には「緑色蛍光タンパク質」。生物内部で薬がどのように効いているかわかる。

なぜ observability?
day2 がつらい
day2 : トラブルシュート、メンテナンス、リソース管理、バージョンアップなどいわゆる保守運用作業。
なぜ day2 がつらい?
トラブルはいつ起こるかわからない。
CPU, MEM, Disk などのリソースから、プログラムのバグ、突然のリクエスト増加、特定条件下で発生する問題…
すべての App が observable だったら、day2 は楽になる 🌞
もちろん Go なら簡単。
observable-server
Trace, Profile, Metrics をサポートしたサンプル実装。
Trace
どの routine でどのように関数が実行されているかを時系列に確認。

Profile
どの関数がどれくらい cpu 時間を消費しているのか。またメモリのヒープ取得オプションもあり。

Metrics
アプリケーションごとに見るべき変数は異なる。そのため、カスタムメトリクスを観測できるようにしておくのは重要。
Appendix: SideCar で node exporter
VM 内の proc, netstat, diskstats など取得できる。
CF で実装するなら
複数ポートで起動できない orz
/app/: アプリケーションのパス/debug/: pprof のパス/metrics: exporter のパス
として、外部にパス付き route (https://hostname/app/) で公開する。
まあ、簡単といえば簡単なのだけれど 🤔
これを全部の Go のプロダクトに反映させたいなぁ。
もっと簡単にする方法はないのだろうか? ¯\_(ツ)_/¯ < ドウナンデショウネ?
FIN
observability はセキュリティとパフォーマンスに気をつけて