基本介绍

异步类型 的监控指标只有在 metrics reader 开始使用该监控指标时才会执行指标计算逻辑。异步类型的监控指标需要设置一个回调函数,该回调函数用于生成指标数值,并在 metrics reader 读取指标时才会触发回调函数。例如,机器CPU、内存、磁盘使用量的指标,如果没有目标端拉取或者使用该指标时,提前计算指标值毫无意义且浪费计算资源,适合作为异步指标来管理。

gmetric 提供的异步类型指标包含: ObservableCounter, ObservableUpDownCounter, OvservableGauge。异步指标类型均是使用 Observable 开头命名,三种异步指标的操作都差不多,均是在不同的业务场景下有不同的使用差异。

我们用一个简单的示例来演示异步指标的基本使用。

  1. package main
  2. import (
  3. "context"
  4. "go.opentelemetry.io/otel/exporters/prometheus"
  5. "github.com/gogf/gf/contrib/metric/otelmetric/v2"
  6. "github.com/gogf/gf/v2/frame/g"
  7. "github.com/gogf/gf/v2/os/gctx"
  8. "github.com/gogf/gf/v2/os/gmetric"
  9. )
  10. var (
  11. meter = gmetric.GetGlobalProvider().Meter(gmetric.MeterOption{
  12. Instrument: "github.com/gogf/gf/example/metric/basic",
  13. InstrumentVersion: "v1.0",
  14. })
  15. observableCounter = meter.MustObservableCounter(
  16. "goframe.metric.demo.observable_counter",
  17. gmetric.MetricOption{
  18. Help: "This is a simple demo for ObservableCounter usage",
  19. Unit: "%",
  20. },
  21. )
  22. observableUpDownCounter = meter.MustObservableUpDownCounter(
  23. "goframe.metric.demo.observable_updown_counter",
  24. gmetric.MetricOption{
  25. Help: "This is a simple demo for ObservableUpDownCounter usage",
  26. Unit: "%",
  27. },
  28. )
  29. observableGauge = meter.MustObservableGauge(
  30. "goframe.metric.demo.observable_gauge",
  31. gmetric.MetricOption{
  32. Help: "This is a simple demo for ObservableGauge usage",
  33. Unit: "%",
  34. },
  35. )
  36. )
  37. func main() {
  38. var ctx = gctx.New()
  39. // Callback for observable metrics.
  40. meter.MustRegisterCallback(func(ctx context.Context, obs gmetric.Observer) error {
  41. obs.Observe(observableCounter, 10)
  42. obs.Observe(observableUpDownCounter, 20)
  43. obs.Observe(observableGauge, 30)
  44. return nil
  45. }, observableCounter, observableUpDownCounter, observableGauge)
  46. // Prometheus exporter to export metrics as Prometheus format.
  47. exporter, err := prometheus.New(
  48. prometheus.WithoutCounterSuffixes(),
  49. prometheus.WithoutUnits(),
  50. )
  51. if err != nil {
  52. g.Log().Fatal(ctx, err)
  53. }
  54. // OpenTelemetry provider.
  55. provider := otelmetric.MustProvider(otelmetric.WithReader(exporter))
  56. provider.SetAsGlobal()
  57. defer provider.Shutdown(ctx)
  58. // HTTP Server for metrics exporting.
  59. otelmetric.StartPrometheusMetricsServer(8000, "/metrics")
  60. }

Meter Callback

异步指标需要定义 Callback 函数来管理指标数值变化,只有在请求或使用该指标时才会执行该 Callback 函数。 Callback 函数中使用 Observe 函数来更新指标的数值,针对不同异步指标类型的 Observe 会产生不同的结果。

  • 针对 ObservableCounter/ObservableUpDownCounter 指标类型,使用 Observe 函数后将会在原有指标数值上进行增减。
  • 针对 ObservableGauge 指标类型,使用 Observe 函数后,该指标的值更会更新为 Observe 给定的数值。

Metric Callback

除了通过 Meter CallBack 来实现异步指标的数值更新,也可以在创建指标时通过 MetricOption 指定 Callback 函数。例如:

  1. observableCounter = meter.MustObservableCounter(
  2. "goframe.metric.demo.observable_counter",
  3. gmetric.MetricOption{
  4. Help: "This is a simple demo for ObservableCounter usage",
  5. Unit: "%",
  6. Callback: func(ctx context.Context, obs gmetric.MetricObserver) error {
  7. obs.Observe(10)
  8. return nil
  9. },
  10. },
  11. )

Primetheus Exporter

通过以下路由将指标通过 Prometheus 协议暴露:

  1. otelmetric.StartPrometheusMetricsServer(8000, "/metrics")

执行后,访问 http://127.0.0.1:8000/metrics 查看暴露的指标:

监控告警-异步指标 - 图1

我们这里只关注本次示例中的指标,其他自动暴露的指标在后续章节介绍。