kinggo

V1

2022/11/28阅读:54主题:默认主题

Hertz 的 Opentelemetry 实战

Hertz 的 Opentelemetry 实战

介绍

在上一篇 文章 中主要讲述 hlogrequestid 的联合使用,用来关联日志。 Hertz 目前也提供了对于 Opentelemetry 的扩展支持 obs-opentelemetry ,方便用户在 Hertz 服务中使用 Opentelemetry。

实战部分

Hertz 的 Opentelemetry 扩展主要提供了 Metric、Tracing、日志三个功能。

Metric

Hertz 中集成 Opentelemetry 的 Metric。

它支持 HTTP Metrics 和 Runtime Metrics,更多详细信息可以查看这里

import (
 "github.com/hertz-contrib/obs-opentelemetry/provider"
 hertztracing "github.com/hertz-contrib/obs-opentelemetry/tracing"
)

func main() {
 // ...
  p := provider.NewOpenTelemetryProvider(
      provider.WithServiceName(serviceName), 
      // Support setting ExportEndpoint via environment variables: OTEL_EXPORTER_OTLP_ENDPOINT 
      provider.WithExportEndpoint("localhost:4317"),
      provider.WithInsecure(), 
    )
 defer p.Shutdown(context.Background())
 tracer, cfg := hertztracing.NewServerTracer()
 h := server.Default(tracer)
 h.Use(hertztracing.ServerMiddleware(cfg))
 // ...
}

效果如下:

Tracing

Hertz 中集成 Opentelemetry 的链路追踪。

import (
    ...
    "github.com/hertz-contrib/obs-opentelemetry/provider"
    "github.com/hertz-contrib/obs-opentelemetry/tracing"
)


func main()  {
    serviceName := "echo"
 
    p := provider.NewOpenTelemetryProvider(
        provider.WithServiceName(serviceName),
        provider.WithExportEndpoint("localhost:4317"),
        provider.WithInsecure(),
    )
    defer p.Shutdown(context.Background())

    tracer, cfg := hertztracing.NewServerTracer()
    h := server.Default(tracer)
    h.Use(hertztracing.ServerMiddleware(cfg))
    
    ...
 
    h.Spin()
}

效果如下:

Logger

Hertz 提供日志用于和链路追踪关联。

import (
    hertzlogrus "github.com/hertz-contrib/obs-opentelemetry/logging/logrus"
)

func init()  {
    hlog.SetLogger(hertzlogrus.NewLogger())
    hlog.SetLevel(hlog.LevelDebug)

}

func main() {
 //...
 h.GET("/ping"func(c context.Context, ctx *app.RequestContext) {
  req := &api.Request{Message: "my request"}
  resp, err := client.Echo(c, req)
  if err != nil {
   hlog.Errorf(err.Error())
   return
  }
  hlog.CtxDebugf(c, "message received successfully: %s", req.Message)
  ctx.JSON(consts.StatusOK, resp)
 })
 //...
}

效果如下:

{"level":"debug","msg":"message received successfully: my request","span_id":"445ef16484a171b8","time":"2022-07-04T06:27:35+08:00","trace_flags":"01","trace_id":"e9e579b32c9d6b0598f8f33d65689e06"}

完整示例代码

  • 示例代码: https://github.com/cloudwego/hertz-examples/tree/main/opentelemetry
  • 文档说明: https://www.cloudwego.io/docs/hertz/tutorials/service-governance/Opentelemetry/

总结

Hertz 提供了 Opentelemetry 扩展 obs-opentelemetry,方便用户集成 Metric、Tracing、Logger 的功能, 下一篇文章我们将使用 Gorm 的 Opentelemetry 扩展和 Hertz 的 Opentelemetry 扩展一起开发一个项目。

参考文档

  • https://github.com/cloudwego/hertz
  • https://github.com/hertz-contrib/obs-opentelemetry

分类:

后端

标签:

Golang

作者介绍

kinggo
V1