OpenCensus と The OpenTracing project がくっついて OpenTelemetry になる(なった)もので、特定のベンダーにロックされず、クラウドネイティブにテレメトリ(メトリクス、トレース、ログなど)の設定、収集、エクスポートを行えるよう、仕様やAPIを定めて各言語のライブラリを提供しているすごいプロジェクト。
これを適切に使うと、アプリケーションの観測性(おぶざーばびりてぃ)を高めることができ、複数のアプリケーションが絡むようなものでも、単一のアプリケーションでも、何が起きているかがわかるようになる。何が起きているかわかれば、それに対するモニタリングも行うことができる。
現段階では、まだベータで、そもそもの仕様はもちろん、各言語での実装も変わる可能性がたかい。 とはいえ、これからの定番になりそうな気もするので、先に触っておくと雰囲気がつかめてよい気がする。
Go でやるには、このGetting Startedに従ってやるのがお手軽簡単。
Getting Started | OpenTelemetry
@v0.19.0
がついているけど特に指定しなくても今は大丈夫そう。
このとき、いくつか理解する必要のある概念がある。用語集も用意されている( Glossary | OpenTelemetry 、便利〜〜〜)けれど、いったんこのGetting Startedで出てくるのだけ自分の理解で記載。
- Exporter
- 収集したテレメトリを出力する。
- GettingStartedではstdoutに出力するExporterを使っている。
- Processor
- どのようにデータを集計するかを決める。
- GettingStartedでは、トレースに関してBatchSpanProcessor(いくつかのSpanをまとめる)、メトリックに関して Simple ExactDistribution(ValueRecorderに関して正確な値を利用する)、というものを使っている
- Simpleの中にもいくつか実装があって便利そう: opentelemetry-go/simple.go at main · open-telemetry/opentelemetry-go
- TracerProvider
- どういうSpanを生成するかなどを設定して定義する。
otel.SetTracerProvider(tp)
によってグローバルなTracerとして設定され、どこでもtracer.Start(ctx, "operation")
としてSpanを生成できる。
- Metric Controller
- 収集したメトリックをProcessorで集計し、定期的にExporterにデータをプッシュする。
- Baggage
- コンテキストに紐づくAttribute。
- Goのcontext.Contextに入るので、コンテキストを使い回せば引き継がれるので、例えばUserIDとかリクエストに関する情報をハンドラ内で入れることで、具体的な処理の部分で記録するような記述をしなくて済むようにできる。
- Propagator
- 複数のアプリケーション間、サービス間でコンテキストを引き継ぐもの。
- 主にはトレース、Baggage。
- Attribute
- メトリックやトレースにつけられるラベル。属性値。
- Meter
- メトリックを記録する箱(?)
- ValueObserver
- ちょっとよくわかっていない。非同期で値を記録できるのかな…?
- ValueRecorder
- 任意の箇所で
meter.RecordBatch
すると値を記録できる。 - 先に属性をbindしておくと、
.Record
で記録もできる。
- 任意の箇所で
- Span
- ひとつの処理をあらわすトレース内の1単位。
- これが溜まってスタックトレースみたいにトレースの親子や順序が連なるとかっこいい(そうじゃない)
サードパーティ(OpenTelemetryからみたときの)の収集、出力についてはある場合は別のリポジトリに実装が入っている。
open-telemetry/opentelemetry-go-contrib: Collection of extensions for OpenTelemetry-Go.
ここには、Detectorsという実装があって、Attributeを作ってくれる。例えばGKEで動くことが前提になっていれば、そのDetectorを使っておくことで、クラスタ名やコンテナ名を取得してくれる。べんり。
また、OpenTelemetryのRegisteryのページがから検索が出来るのでここも見るといい。
例えばGoogleと検索をすると、GoogleCloud Platformが提供する公式のOpenTelemetry Exporterが出てくる。
GoogleCloudPlatform/opentelemetry-operations-go
これはトレースをGoogle Cloud Traceに、メトリックスをGoogle Cloud Monitoringに送ってくれる。 認証の設定が必要ではあるが、プログラム上の記述はまったく同じで、あとはOpenTelemetryがよろしくやってくれる。