可观测性主要包括三个方面:追踪(traces)、指标(metrics)和日志(logs)。
OpenTelemetry 的指标功能还是测试状态,没有实现日志的功能,日志可以用其他流行的日志库记录,然后收集到类似ELK的日志系统里面。
追踪数据存储后端是用jaeger
,指标数据存储后端是用prometheus
。
前面几个文章实现的是追踪,本文主要讲一下指标。
指标数据直接用prometheus
的go客户端生成也是一样的,不一定需要用OpenTelemetry
提供的库。
OpenTelemetry
的方式是先创建exporter
和provider
,之后就可以生成指标了,main.go
:
import (
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/promhttp"
"go.opentelemetry.io/otel/attribute"
prometheusExp "go.opentelemetry.io/otel/exporters/prometheus"
api "go.opentelemetry.io/otel/metric"
"go.opentelemetry.io/otel/sdk/metric"
)
// ......
func main() {
// ......
// 创建exporter和provider
exporter, err := prometheusExp.New()
if err != nil {
log.Fatal(err)
}
provider = metric.NewMeterProvider(metric.WithReader(exporter))
meter = provider.Meter("prometheus/example")
//......
opt := api.WithAttributes(
attribute.Key("A").String("B"),
attribute.Key("C").String("D"),
)
// Counter 类型
counter, err := meter.Float64Counter("foo", api.WithDescription("a simple counter"))
if err != nil {
log.Fatal(err)
}
counter.Add(ctx, 5, opt)
// Gauge 类型
gauge, err := meter.Float64ObservableGauge("bar", api.WithDescription("a fun little gauge"))
if err != nil {
log.Fatal(err)
}
_, err = meter.RegisterCallback(func(_ context.Context, o api.Observer) error {
n := -10. + rng.Float64()*(90.) // [-10, 100)
o.ObserveFloat64(gauge, n, opt)
return nil
}, gauge)
if err != nil {
log.Fatal(err)
}
// This is the equivalent of prometheus.NewHistogramVec
// Histogram 类型
histogram, err := meter.Float64Histogram("baz", api.WithDescription("a very nice histogram"))
if err != nil {
log.Fatal(err)
}
histogram.Record(ctx, 23, opt)
histogram.Record(ctx, 7, opt)
histogram.Record(ctx, 101, opt)
histogram.Record(ctx, 105, opt)
// ....
}
上面创建了三个类型的指标:Counter
、Gauge
和Histogram
,opt
是指标的标签,RegisterCallback
函数的作用是每次获取指标的时候都会用注册的函数来生成指标数据。
其他两个指标类型Counter
和Histogram
类型没有注册回调,每次访问获取指标数据都是固定不会变化的值。
指标创建好之后,再暴露一个接口给外部系统获取指标数据:
http.Handle("/metrics", promhttp.Handler())
err := http.ListenAndServe(":2223", nil)
http访问http://127.0.0.1:2223/metrics
就能获取到上面创建的指标数据了。
从上图可以看到默认的promhttp.Handler()
除了我们自己创建的指标数据之外,还包括一些go_
开头的指标内容,这些数据应用的内存分配情况,系统线程情况,gc情况等。
最后要展示在prometheus
上还需要配置抓取规则:
scrape_configs:
- job_name: 测试
metrics_path: /metrics
static_configs:
- targets:
- 127.0.0.1:2223
等一会就会有数据了,下面是prometheus
默认ui和grafana
explore
页面效果:
网站代码:https://github.com/ilaziness/gopkg/tree/main/opentelemetry/prometheus
本文链接:https://360us.net/article/89.html