Open2
OpenTelemetry 全般
OTLP gRPC vs. HTTP/Protobuf
gRPC の利点・欠点
- コード依存が大きくなる可能性がある
- トランスポート層に HTTP/2 を用いるためネットワークインフラ上で完全に対応されない可能性がある
- 大きいペイロードの送信やスループットを求められる場合は HTTP/Protobuf より効率が良い
基本的には言語デフォルトのプロトコルを用いるのが良い
メトリクスの種類を決めるには
- ヒストグラム、ヒートマップ、またはパーセンタイルが必要な場合は、ヒストグラムを使用します。
- デルタ値を記録して何かをカウントしたい場合は、次のようにします。
- 値が単調な場合は、Counter を使用します。
- それ以外の場合は、UpDownCounter を使用します。
- 絶対値を記録して何かを測定したい場合:
- 値が加算可能/合計可能な場合:
- 値が単調な場合は、CounterObserver を使用します。
- それ以外の場合は、UpDownCounterObserver を使用します。
- 値が加算/合計可能でない場合は、GaugeObserver を使用します。
- 値が加算可能/合計可能な場合:
例
メールの数
送信された電子メールの数を測定するには、カウンター計測器を作成し、電子メールが送信されるたびにそれを増分します。
import "go.opentelemetry.io/otel/metric"
emailCounter, _ := meter.Int64Counter(
"some.prefix.emails",
metric.WithDescription("Number of sent emails"),
)
emailCounter.Add(ctx, 1)
Later, you can add more attributes to gather detailed statistics, for example:
kind = welcome
および kind = replace_password
を使用して、さまざまな電子メールを測定します。
返送された電子メールを測定するには、state = send
および state = bounced
を使用します。
操作の遅延
操作のレイテンシーを測定するには、ヒストグラム計測器を作成し、操作と同期して更新します。
import "go.opentelemetry.io/otel/metric"
opHistogram, _ := meter.Int64Histogram(
"some.prefix.duration",
metric.WithDescription("Duration of some operation"),
)
t1 := time.Now()
op(ctx)
dur := time.Since(t1)
opHistogram.Record(ctx, dur.Microseconds())
キャッシュヒット率
キャッシュ ヒット率を測定するには、CounterObserver を作成し、キャッシュ統計を観察します。
import "go.opentelemetry.io/otel/metric"
counter, _ := meter.Int64ObservableCounter("some.prefix.cache")
// Arbitrary key/value labels.
hits := []attribute.KeyValue{attribute.String("type", "hits")}
misses := []attribute.KeyValue{attribute.String("type", "misses")}
errors := []attribute.KeyValue{attribute.String("type", "errors")}
if _, err := meter.RegisterCallback(
func(ctx context.Context, o metric.Observer) error {
stats := cache.Stats()
o.ObserveInt64(counter, stats.Hits, metric.WithAttributes(hits...))
o.ObserveInt64(counter, stats.Misses, metric.WithAttributes(misses...))
o.ObserveInt64(counter, stats.Errors, metric.WithAttributes(errors...))
return nil
},
counter,
); err != nil {
panic(err)
}
エラー率
エラー率を直接測定するには、GaugeObserver を作成し、計算方法を気にせずに値を観察できます。
import "go.opentelemetry.io/otel/metric"
errorRate, _ := meter.Float64ObservableGauge("some.prefix.error_rate")
if _, err := meter.RegisterCallback(
func(ctx context.Context, o metric.Observer) error {
o.ObserveFloat64(errorRate, rand.Float64())
return nil
},
errorRate,
); err != nil {
panic(err)
}