基本介绍
异步类型的监控指标只有在metrics reader
开始使用该监控指标时才会执行指标计算逻辑。异步类型的监控指标需要设置一个回调函数,该回调函数用于生成指标数值,并在metrics reader
读取指标时才会触发回调函数。例如,机器CPU、内存、磁盘使用量的指标,如果没有目标端拉取或者使用该指标时,提前计算指标值毫无意义且浪费计算资源,适合作为异步指标来管理。
gmetric
提供的异步类型指标包含:ObservableCounter, ObservableUpDownCounter, OvservableGauge
。异步指标类型均是使用Observable
开头命名,三种异步指标的操作都差不多,均是在不同的业务场景下有不同的使用差异。
我们用一个简单的示例来演示异步指标的基本使用。
package main
import (
"context"
"go.opentelemetry.io/otel/exporters/prometheus"
"github.com/gogf/gf/contrib/metric/otelmetric/v2"
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/os/gmetric"
)
var (
meter = gmetric.GetGlobalProvider().Meter(gmetric.MeterOption{
Instrument: "github.com/gogf/gf/example/metric/basic",
InstrumentVersion: "v1.0",
})
observableCounter = meter.MustObservableCounter(
"goframe.metric.demo.observable_counter",
gmetric.MetricOption{
Help: "This is a simple demo for ObservableCounter usage",
Unit: "%",
},
)
observableUpDownCounter = meter.MustObservableUpDownCounter(
"goframe.metric.demo.observable_updown_counter",
gmetric.MetricOption{
Help: "This is a simple demo for ObservableUpDownCounter usage",
Unit: "%",
},
)
observableGauge = meter.MustObservableGauge(
"goframe.metric.demo.observable_gauge",
gmetric.MetricOption{
Help: "This is a simple demo for ObservableGauge usage",
Unit: "%",
},
)
)
func main() {
var ctx = gctx.New()
// Callback for observable metrics.
meter.MustRegisterCallback(func(ctx context.Context, obs gmetric.Observer) error {
obs.Observe(observableCounter, 10)
obs.Observe(observableUpDownCounter, 20)
obs.Observe(observableGauge, 30)
return nil
}, observableCounter, observableUpDownCounter, observableGauge)
// Prometheus exporter to export metrics as Prometheus format.
exporter, err := prometheus.New(
prometheus.WithoutCounterSuffixes(),
prometheus.WithoutUnits(),
)
if err != nil {
g.Log().Fatal(ctx, err)
}
// OpenTelemetry provider.
provider := otelmetric.MustProvider(otelmetric.WithReader(exporter))
provider.SetAsGlobal()
defer provider.Shutdown(ctx)
// HTTP Server for metrics exporting.
otelmetric.StartPrometheusMetricsServer(8000, "/metrics")
}
Meter Callback
异步指标需要定义Callback
函数来管理指标数值变化,只有在请求或使用该指标时才会执行该Callback
函数。Callback
函数中使用Observe
函数来更新指标的数值,针对不同异步指标类型的Observe
会产生不同的结果。
- 针对
ObservableCounter/ObservableUpDownCounter
指标类型,使用Observe
函数后将会在原有指标数值上进行增减。 - 针对
ObservableGauge
指标类型,使用Observe
函数后,该指标的值更会更新为Observe
给定的数值。
Metric Callback
除了通过Meter CallBack
来实现异步指标的数值更新,也可以在创建指标时通过MetricOption
指定Callback
函数。例如:
observableCounter = meter.MustObservableCounter(
"goframe.metric.demo.observable_counter",
gmetric.MetricOption{
Help: "This is a simple demo for ObservableCounter usage",
Unit: "%",
Callback: func(ctx context.Context, obs gmetric.MetricObserver) error {
obs.Observe(10)
return nil
},
},
)
Primetheus Exporter
通过以下路由将指标通过Prometheus
协议暴露:
otelmetric.StartPrometheusMetricsServer(8000, "/metrics")
执行后,访问 http://127.0.0.1:8000/metrics 查看暴露的指标:
我们这里只关注本次示例中的指标,其他自动暴露的指标在后续章节介绍。