Open2

OpenTelemetry 全般

nomadblackynomadblacky

https://www.checklyhq.com/docs/traces-open-telemetry/importing-traces/http-vs-grpc-protocols/

OTLP gRPC vs. HTTP/Protobuf

gRPC の利点・欠点

  • コード依存が大きくなる可能性がある
  • トランスポート層に HTTP/2 を用いるためネットワークインフラ上で完全に対応されない可能性がある
  • 大きいペイロードの送信やスループットを求められる場合は HTTP/Protobuf より効率が良い

基本的には言語デフォルトのプロトコルを用いるのが良い

nomadblackynomadblacky

メトリクスの種類を決めるには

https://uptrace.dev/opentelemetry/metrics.html#choosing-instruments

  • ヒストグラム、ヒートマップ、またはパーセンタイルが必要な場合は、ヒストグラムを使用します。
  • デルタ値を記録して何かをカウントしたい場合は、次のようにします。
    • 値が単調な場合は、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)
}