翻訳しながらOpenTelemetryを触ってみる~Instrumentation編~
はじめに
前回はOpenTelemetryの概要について読んでいきました。今回は実際にコードを書いてどのように使うのかを理解していきたいと思います。
今回使用する言語についてですが自分がよくサーバーサイドの言語として採用Goとでやっていきたいと思います!時間ある時にNext.jsやNest.jsでの扱い方も調査していきたいと思います。
チュートリアルをドキュメントを参考にして進めていきます。
Go
GoではTracingは安定バージョンであるもののメトリックスがアルファでロギングは実装されていないみたいです。
Getting Started
ドキュメントに沿ってコードを書いていきます。フィボナッチ関数の実装みたいです。フィボナッチのコード自体は難しくないので触れません。
その次に実際に計測ができるように関数を作っていきます。ただ書き写すとわかるのですが結構一定のパターンな気がします。
otel.Tracer(パッケージ名).Start(ctx, "関数名")
で関数が終わる時は deferまたは任意のタイミングで
span.End()
と追加していくだけです。write関数に関しては即時関数を定義してspanを定義して行っています。これは慣れないと最初は難しい気もします。contextを受け取る関数なのであれば呼び出し時にcontextを渡すと良いのですがそうでない場合はこのような即時関数を定義する必要がありそうです。
Write関数はもう一つStartをしている時の返り値としてcontextも受け取っています。そのcontextを即時関数の引数として渡しています。これによってWriteと即時関数でStartが呼び出されているFibonacci関数は親子関係になるみたいです。
ドキュメントにも書いてありますが今回のアプリケーションのTraceの親子関係を表すと以下のようになります。
Run
├── Poll
└── Write
└── Fibonacci
コード自体は一旦これで良いみたいなのですが概要で読んだ通りTracer, Spanの生成はSDKが行うのでその設定をする必要があります。
具体的なセットアップとしては出力先とリソースの設定でアプリケーションの実行時にtracerProviderを使うことによって完了するみたいです。この例ではSetTracerProviderという関数でグローバルにトレーサーをセットしていますがそのインスタンスをDIしていくことによっても引き継ぎができるみたいです。どちらの手段を取るかは場合によって使い分ける必要があります。
それでセットアップ自体は終わりで実行をしてみました。traces.txtというファイルは出力されたものの正直いちいちこれを参照するのはめんどくさいです。ドキュメントで読んだcollectorにデータを送信したりPrometheus, Grafanaを介したりで可視化しないといけないです。ドキュメントの後半で言及されているみたいなので後で確認してみます。
ボーナスとして紹介されていますがエラーが出た時のログも出力できるみたいです。
Librariesの章はあまり関係がないので飛ばします。
Manualに関してはGetting Startedで学習したこととほとんど被っているので飛ばします。ただ読んでいてGetting Startedより詳しく書かれていたりしているので目は通しておくべきだと思います。
Processing and Exporting Datqa
実際に出たデータを処理したり公開したりしてみます。
サンプリング → システムによって生成されるトレースの量を制限する工程
サンプラーはトレースの最初にどのように制限するかを決めて別サービスに広めていく形式が良い
サンプラーの設定は複数があるが初めての時や開発段階ではAlwaysSampleが良い
リソース周りに関してはGetting Startedで書いたのですがこちらもいくるか設定があるみたいです。
例ではsdk/traceパッケージをsdktraceという名前でインポートしています。
下にはOTLP Exporter・Jaeger Exporter・Prometheus Exporterと3つの公開形式が用意されています。OTLPがコンセプトの途中でも出てきましたがあまりわからないです。Collectorの説明とかで出てきそうです。とりあえずPrometheus Exporterを試してみます。
これ少し試してみたり検索したりしたのですが今までの説明からしてInstrumentationとPrometheusを連動させようとした場合一度Prometheus Collectorを介す必要がある気がします。そもそもCollectorの役割がテレメントリーデータの入出力なので役割を考えても間違っていない気がします。メトリックスに関しては介さずにいけそうなサンプルが見つかりましたがトレースに関しては見当たらなかったです。(そもそもOpenTelemetryはトレースを吐き出すのに対してPrometheusはメトリックスを受け取るのでOpenTelemetryからPrometheusに対してトレースを送りたいというのは意味不明なのでは?)
自分でもわからないのでとりあえず一通り触ってCollectorについても理解したらPrometheus及びGrafanaとの連携を考えたいと思います。
まとめ
GoでOpenTelemetryを扱ってみました。テレメトリーデータの取得まではできたもののその可視化やCollector周りの知識が足りませんでした。
次回はCollectorについて深掘りしてデータを可視化できるようにしていきたいと思います!
この記事が気に入ったらサポートをしてみませんか?