Go で observability を高める

day2 はつらいよ

observability とは?

可観測性(内部の挙動をいじらずに観測できるか)

Observability - Wikipedia

observability とは?

具体的には「緑色蛍光タンパク質」
生物内部で薬がどのように効いているかわかる。

なぜ observability?

day2 がつらい

day2 : トラブルシュート、メンテナンス、リソース管理、バージョンアップなどいわゆる保守運用作業

なぜ day2 がつらい?

トラブルはいつ起こるかわからない

CPU, MEM, Disk などのリソースから、プログラムのバグ、突然のリクエスト増加、特定条件下で発生する問題...

すべての App が observable だったら、day2 は楽になる 🌞

もちろん Go なら簡単

observable-server


Trace, Profile, Metrics をサポートしたサンプル実装
https://github.com/go-zen-chu/observable-server

Trace


どの routine でどのように関数が実行されているかを時系列に確認

Profile


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

Metrics


アプリケーションごとに見るべき変数は異なる。そのため、カスタムメトリクスを観測できるようにしておくのは重要

Appendix: SideCar で node exporter


VM 内の proc, netstat, diskstats など取得できる
https://github.com/prometheus/node_exporter

CF で実装するなら


複数ポートで起動できない orz
/app/ : アプリケーションのパス
/debug/ : pprof のパス
/metrics : exporter のパス
として、外部にパス付き route (https://hostname/app/) で公開する

まあ、簡単といえば簡単なのだけれど 🤔


これを全部の Go のプロダクトに反映させたいなぁ

もっと簡単にする方法はないのだろうか?


¯\_(ツ)_/¯ < ドウナンデショウネ?

FIN


observability はセキュリティとパフォーマンスに気をつけて