Go で observability を高める

Go で day2 を乗り越える


Posted on 2019年 7月 15日 (月)
Tags golang, observability, prometheus, pprof, trace
golang, observability, prometheus, pprof, trace

Go で observability を高める

day2 はつらいよ

observability とは?

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

Observability - Wikipedia

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

緑色蛍光タンパク質で形質転換した大腸菌

なぜ observability?

day2 がつらい

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

なぜ day2 がつらい?

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

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

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

もちろん Go なら簡単。

observable-server

Trace, Profile, Metrics をサポートしたサンプル実装。

go-zen-chu/observable-server

Trace

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

trace の様子

Profile

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

pprof の様子

Metrics

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

Appendix: SideCar で node exporter

VM 内の proc, netstat, diskstats など取得できる。

prometheus/node_exporter

CF で実装するなら

複数ポートで起動できない orz

  • /app/ : アプリケーションのパス
  • /debug/ : pprof のパス
  • /metrics : exporter のパス

として、外部にパス付き route (https://hostname/app/) で公開する。

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

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

もっと簡単にする方法はないのだろうか? ¯\_(ツ)_/¯ < ドウナンデショウネ?

FIN

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

Share


See also