Skip to content

Instantly share code, notes, and snippets.

@wreulicke
Last active May 21, 2025 15:01
Show Gist options
  • Select an option

  • Save wreulicke/0a15f20807cee1c5f348ec41dca1ae60 to your computer and use it in GitHub Desktop.

Select an option

Save wreulicke/0a15f20807cee1c5f348ec41dca1ae60 to your computer and use it in GitHub Desktop.
github.com/prometheus/client_golang に登録された metricsを opentelemetry sdk経由でmetricsのexportをするサンプル
func initMeterProvider() (func(context.Context) error, error) {
res := resource.Default()
metricExporter, err := otlpmetrichttp.New(context.TODO())
// metricExporter, err := otlpmetricgrpc.New(context.TODO())
if err != nil {
return nil, fmt.Errorf("failed to create metrics exporter: %w", err)
}
// グローバルのprometheusのregistryを使う。
// client_golangのinitでNewGoCollectorで登録しているが
// 取得するメトリクスをカスタマイズしたいので、Unregisterする
prometheus.Unregister(collectors.NewGoCollector())
prometheus.MustRegister(
collectors.NewBuildInfoCollector(),
// デフォルトで登録されている
// collectors.NewProcessCollector(collectors.ProcessCollectorOpts{}),
// デフォルトで登録されているものから変更する
collectors.NewGoCollector(
collectors.WithGoCollectorRuntimeMetrics(
// 一応ね
collectors.GoRuntimeMetricsRule{Matcher: regexp.MustCompile(`^/cgo/.+`)},
// 必要なところだけに絞った方が良さそうだが、デフォルトでは使わんか?
// collectors.GoRuntimeMetricsRule{Matcher: regexp.MustCompile(`^/cpu/.+`)},
// 必要なところだけに絞った方が良さそう
collectors.MetricsGC,
// 必要なところだけに絞った方が良さそう
collectors.MetricsMemory,
// /sched/goroutines:goroutines は デフォルトで登録されているgoCollectorのbaseCollectorにも同じメトリクスがあるので、重複しているため
// ちょっと面倒くさいけど個別で書いてる
collectors.GoRuntimeMetricsRule{Matcher: regexp.MustCompile(`^/sched(/gomaxprocs:threads|/latencies:seconds|/pauses/.+)`)},
// 一応ね
collectors.GoRuntimeMetricsRule{Matcher: regexp.MustCompile(`^/sync/.+`)},
),
),
)
// prometheusのbridgeを使って、prometheusのregistryに登録されているメトリクスを登録する。
// デフォルトではグローバルのregistryを使う
promproducer := prombridge.NewMetricProducer()
meterProvider := metric.NewMeterProvider(
metric.WithReader(
metric.NewPeriodicReader(
metricExporter,
// デバッグ用。デフォルトは60s
// metric.WithInterval(1*time.Second),
metric.WithProducer(promproducer),
),
),
metric.WithResource(res),
)
otel.SetMeterProvider(meterProvider)
return meterProvider.Shutdown, nil
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment