写点什么

OpenTelemetry Go Metric SDK (Alpha) v0.32.0 发布

  • 2022 年 9 月 21 日
    广东
  • 本文字数:1785 字

    阅读完需:约 6 分钟

昨天(2022/9/21) opentelemetry-go metric v0.32.0 发布,这个版本改动颇大,基本按照 trace 的风格重构了整个 Provider,其 SDK 易用性大大增强,个人感觉以后的版本接口会以此为基础,慢慢固化下来。

v0.32.0 Provider 变化

v0.31.0 版本:


c := controller.New(    processor.NewFactory(        simple.NewWithHistogramDistribution(            histogram.WithExplicitBoundaries([]float64{0.05, 0.1, 0.25, 0.5, 1, 2}),        ),        aggregation.CumulativeTemporalitySelector(),        processor.WithMemory(true),    ),    controller.WithExporter(ep),    controller.WithCollectPeriod(15*time.Second),)
global.SetMeterProvider(c)
复制代码


这个版本依赖 sdk/metric/controller/basicsdk/metric/processor/basicsdk/metric/selector/simple 等包,且与 trace provider 风格差异太大,使用门槛高。


v0.32.0 版本:


provider := metric.NewMeterProvider(    metric.WithReader(        metric.NewPeriodicReader(ep, metric.WithInterval(15*time.Second)),    ),    metric.WithReader(ep3),)global.SetMeterProvider(provider)
复制代码


可以看到该版本不仅风格与 trace 相似,而且可以同时注入多个 exporter。

代码示例

opentelemetry-go 默认 metric exporter 有四种,它们分别为 otlpmetric/(http|gRPC)、stdoutmetric、prometheus。


下面我们以一段 go server 例子演示 otel provider 与多种 metric exporter 结合的使用教程。


import (  "github.com/gin-gonic/gin"  "github.com/prometheus/client_golang/prometheus"  "github.com/prometheus/client_golang/prometheus/promhttp"
"go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp" promexporter "go.opentelemetry.io/otel/exporters/prometheus" "go.opentelemetry.io/otel/exporters/stdout/stdoutmetric" "go.opentelemetry.io/otel/metric/global" "go.opentelemetry.io/otel/metric/instrument" "go.opentelemetry.io/otel/sdk/metric")
func initMeter() *metric.MeterProvider { // init otlpmetrichttp exporter ep, _ := otlpmetrichttp.New( context.Background(), otlpmetrichttp.WithEndpoint("mimir:8080"), otlpmetrichttp.WithURLPath("/otlp/v1/metrics"), otlpmetrichttp.WithInsecure(), otlpmetrichttp.WithHeaders(map[string]string{ "X-Scope-OrgID": "demo", }), )
// init stdoutmetric exporter ep2, _ := stdoutmetric.New()
// init prometheus exporter ep3 := promexporter.New() prometheus.Register(ep3.Collector)
provider := metric.NewMeterProvider( metric.WithReader( metric.NewPeriodicReader(ep, metric.WithInterval(15*time.Second)), ), metric.WithReader( metric.NewPeriodicReader(ep2, metric.WithInterval(15*time.Second)), ), metric.WithReader(ep3), ) global.SetMeterProvider(provider)
return provider}
func timeDuration() func(ctx *gin.Context) { ....}
func main() { provider := initMeter() defer provider.Shutdown(context.Background())
r := gin.New() r.Use(timeDuration())
.... // gin router
// register prometheus handler promHandler := promhttp.HandlerFor( prometheus.DefaultGatherer, promhttp.HandlerOpts{ EnableOpenMetrics: true, }, ) r.GET("/metrics", func(ctx *gin.Context) { promHandler.ServeHTTP(ctx.Writer, ctx.Request) })
r.Run(":8080")}
复制代码


运行代码,在 console 中可以看到如下输出:



再执行 curl http://localhost:8080/metrics 也能看到类似 prometheus exporter 输出结果:


总结

伴随 opentelemetry-go Metric SDK (Alpha) v0.32.0 发布,其 metrics SDK 代码初于稳定,其支持多种 exporter,方便多种后端的集成。


但目前 Go SDK 还不支持 exemplar 的注入,不过社区已有相应 issue 跟进,相信很快,就能使用 opentelemetry-go SDK 完全替换掉 prometheus SDk 了。



更多文章,请关注我们公众号 【Grafana 爱好者】

用户头像

学习是从了解到使用再到输出的过程。 2018.04.27 加入

GrafanaFans 是由南京多位 Grafana 爱好者一起发起的 Grafana 开源产品学习小组,致力于 LGTM(Loki、Grafana、Tempo、Mimir)技术栈在国内的普及和应用,欢迎关注开源项目 https://github.com/grafanafans/club。

评论

发布
暂无评论
OpenTelemetry Go Metric SDK (Alpha) v0.32.0 发布_OpenTelemetry_Grafana 爱好者_InfoQ写作社区