一探究竟新一代可观测标准OpenTelemetry
什么是可观测
相信大家日常经常使用kibana、grafana、jaeger等平台观察系统状态和定位问题,这些就是可观测体系的一部分。可观测主要包括:
- 日志,实现有
ELK(es/logstash/kibana)等 - 指标,实现有
grafana+promthues等 - 追踪,基于
opentracing协议的实现有jaeger、skywalking等
我们排查问题过程,一般都会把三者日志、指标、追踪结合来看,比如通过接口异常增量指标发现问题—>链路追踪定位异常服务—>排查异常服务日志,所以关于可观测我们经常可以看见这个经典的图片:
什么是OpenTelemetry
关于可观测除了上述的各种实现外,还有另一套实现OpenCensus,于是诞生统一标准OpenTelemetry且兼容OpenTracing,OpenCensus。不过关于go语言OpenTelemetry的统一sdk实现还不完善,比如目前还不支持日志,具体可以查看https://github.com/open-telemetry/opentelemetry-go。
接下来,我们基于Go来看看,原sdk(也就是未使用OpenTelemetry)接入指标和追踪的方式和基于OpenTelemetry新体系的指标和追踪接入方式区别。
可观测之指标
基于原生promethuessdk的指标采集演示
Go版本 这里用的1.14
主要依赖的包:
"github.com/prometheus/client_golang/prometheus" |
就依赖了两个包,使用比较简单:
- 单独创建一个server使用
github.com/prometheus/client_golang/prometheus/promhttp暴露指标 - 使用
github.com/prometheus/client_golang/prometheus创建自定义指标,比如NewCounterVec创建计数器、HistogramVec创建直方图等等。 WithLabelValues给自定义指标打标签
代码示例如下:
docker示例:https://github.com/TIGERB/easy-tips/tree/master/docker/grafana-promethues/go-demo/main.go.promethues
package main |
访问接口curl 127.0.0.1:6060/v1/demo后,查看指标输出 curl 127.0.0.1:2112/metrics,如下:
# HELP demo_api_request_counter 接口请求次数自定义指标 |
基于OpenTelemetrysdk的promethues指标采集演示
Go版本 这里用的1.19 版本太低报错
主要依赖的包:
"github.com/prometheus/client_golang/prometheus/promhttp" |
相对于原生prome只使用两个包,引入的包多几个:
- 相同点:仍然单独创建一个server使用
github.com/prometheus/client_golang/prometheus/promhttp暴露指标 - 不同点:使用
go.opentelemetry.io/otel/exporters/prometheus初始化一个指标对象meter - 不同点:使用
meter.Int64Counter初始化计数器、直方图等 - 不同点:
metric.WithAttributes打标签
代码示例如下:
docker示例:https://github.com/TIGERB/easy-tips/tree/master/docker/grafana-promethues/go-demo/main.go
package main |
访问接口curl 127.0.0.1:6060/v1/demo后,查看指标输出 curl 127.0.0.1:2112/metrics,如下:
# HELP demo_api_request_counter_total QPS |
可观测之追踪
基于OpenTracingsdk的jaeger追踪演示
Go版本 这里用的1.18
主要依赖的包:
"github.com/grpc-ecosystem/go-grpc-middleware/tracing/opentracing" |
使用方式:
- 使用
jaeger.NewTracer创建一个tracer对象tracer,并指定jaeger服务地址(这里采用的是非agent方式演示) - 使用
tracer创建一个spantracer.StartSpan,并在你想追踪的代码段后面span.Finish() - 这里上游使用
grpc服务做测试,使用opentracing中间件SDKgo-grpc-middleware/tracing/opentracing
docker示例:https://github.com/TIGERB/easy-tips/tree/master/docker/go-jaeger
package main |
使用docker-compose up -d启动演示服务,模拟请求curl 127.0.0.1:6060/v1/demo,查看jaeger后台http://localhost:16686/,示例如下:
基于OpenTelemetrysdk的jaeger追踪演示
Go版本 这里用的1.19 版本太低报错
主要依赖的包:
"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" |
使用方式:
- 使用
"go.opentelemetry.io/otel/exporters/jaeger"初始化追踪tracer,同样指定jaeger服务地址(这里采用的是非agent方式演示) - http服务进行链路追踪,使用包
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp.NewHandler创建http handler - grpc服务进行链路追踪,使用grpc otel追踪sdk go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc
docker示例:https://github.com/TIGERB/easy-tips/tree/master/docker/go-otel
package main |
使用docker-compose up -d启动演示服务,模拟请求curl 127.0.0.1:6060/v1/demo,查看jaeger后台http://localhost:16686/,示例如下:
总结
| 可观测 | 接入方式 | Go版本 | export方式 | 自定义标签 |
|---|---|---|---|---|
| 指标 | 原生promethues方式接入 | 支持范围广,本文用的1.14 | promhttp包 |
github.com/prometheus/client_golang/prometheus包,WithLabelValues |
| 指标 | 基于opentelemtry的promethues方式接入 | 版本太低报错,本文用的1.19 | promhttp包 |
go.opentelemetry.io/otel/exporters/prometheus包,WithAttributes |
| 可观测 | 接入方式 | Go版本 | 主要依赖包 | grpc中间件 |
|---|---|---|---|---|
| 追踪 | 原生jaeger方式接入 | 本文用的1.18 | github.com/uber/jaeger-client-go包,github.com/opentracing/opentracing-go |
github.com/grpc-ecosystem/go-grpc-middleware/tracing/opentracing包,UnaryClientInterceptor、WithTracer |
| 追踪 | 基于opentelemtry的jaeger方式接入 | 版本太低报错,本文用的1.19 | go.opentelemetry.io/otel/exporters/jaeger包,go.opentelemetry.io/otel包 |
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc包,UnaryClientInterceptor、StreamClientInterceptor |
