stackimpact というサービスはご存知でしょうか。
このサービスは何かと言うと、Goアプリケーションのメトリクスを可視化するためのサービスです。競合はNewRelicあたりでしょうかね(最近NewRelicでもGoが正式にサポートされましたが)。
とりあえず使ってみましょう。
エージェントのキーを取得する
stackimpactにサインアップすると、エージェントのアプリケーションキーが発行されます。Configurationのページで後から参照もできるのでメモしておく必要は無し。
stackimpactのエージェントがGitHubに公開されています。これを go get
とかで取得してきます。
以下のコードを対象のアプリケーションに仕込むだけです。
import (
"github.com/stackimpact/stackimpact-go"
)
func main() {
agent := stackimpact.NewAgent()
agent.Configure("your_stackimpact_key", "MyGoApp")
}
実際に利用するには、環境変数等でエージェントのキーを設定できるようにして、キーが設定されていればエージェントを実行するみたいな感じの実装にするとよいでしょう。
動かしてみる
stackimpactが仕込まれたGoアプリケーションを実際に動かしてみます。アプリケーションの起動から1分くらいでstackimpactの方にグラフが表示されるようになります。
Healthの項目では、CPU/Memory/Garbase collection/Runtimeといったグラフが見ることができます。
重要なのはHealthよりもHot spotsの項目で、例えばメモリであればどこの処理で大きめのアロケートが走ったかとかがわかったりします。
この例ではstackimpactのreporterで大きめのアロケートが走った模様w
その他、チャネルのwait timeやsystem wait, lock waitが確認できますね。
また、HTTP Handlersでリクエスト時間上位のもののコールスタックを確認することができます。
あんまりスタックを深掘りしちゃうとウチの情報が見えてしまうのでここまでにしておきますが、ステップ毎の所要時間がわかるので便利。
プラン
stackimpactは無料で利用することが出来ますが、エージェントに制限があってフリープランだと最大5エージェントまでとなってます。
有料プランについてはPro subscription plansのページを参照されたい。エージェント数やデータの保持期間で変わってくるようです。
エージェントという概念が重要で、ホスト単位ではないことを留意しておく必要があります。例えば、同一ホストに2つのstackimpactが仕込まれたGoのプロセスが稼働していれば、それは2エージェント消費ということになります。もちろん、Dockerコンテナで複数コンテナ起動しようが同じ。
まとめ
あまり知られてないサービスだけど、5エージェントまで無料だしサクッとボトルネック探したりするのに役立ちそうな感じ。