OpenTelemetry实现go应用的可观测性 - 指标、日志

 提示:转载请注明原文链接

 本文永久链接:https://360us.net/article/89.html

可观测性主要包括三个方面:追踪(traces)、指标(metrics)和日志(logs)。

OpenTelemetry 的指标功能还是测试状态,没有实现日志的功能,日志可以用其他流行的日志库记录,然后收集到类似ELK的日志系统里面。

追踪数据存储后端是用jaeger,指标数据存储后端是用prometheus

前面几个文章实现的是追踪,本文主要讲一下指标。

指标数据直接用prometheus的go客户端生成也是一样的,不一定需要用OpenTelemetry提供的库。

OpenTelemetry的方式是先创建exporterprovider,之后就可以生成指标了,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)

    // ....
}

上面创建了三个类型的指标:CounterGaugeHistogramopt是指标的标签,RegisterCallback函数的作用是每次获取指标的时候都会用注册的函数来生成指标数据。

其他两个指标类型CounterHistogram类型没有注册回调,每次访问获取指标数据都是固定不会变化的值。

指标创建好之后,再暴露一个接口给外部系统获取指标数据:

http.Handle("/metrics", promhttp.Handler())

err := http.ListenAndServe(":2223", nil)

http访问http://127.0.0.1:2223/metrics就能获取到上面创建的指标数据了。

aaa

从上图可以看到默认的promhttp.Handler()除了我们自己创建的指标数据之外,还包括一些go_开头的指标内容,这些数据应用的内存分配情况,系统线程情况,gc情况等。

最后要展示在prometheus上还需要配置抓取规则:

scrape_configs:
  - job_name: 测试
    metrics_path: /metrics
    static_configs:
      - targets:
          - 127.0.0.1:2223

等一会就会有数据了,下面是prometheus默认ui和grafana explore页面效果:

aaa

aaa

网站代码:https://github.com/ilaziness/gopkg/tree/main/opentelemetry/prometheus

 评论
暂无评论