Prometheus云原生监控:运维与开发实战
上QQ阅读APP看书,第一时间看更新

3.2.3 通过MeterBinder接口采集和注册指标

通过io.micrometer.core.instrument.binder.MeterBinder接口实现bind方法,并将要采集的指标注册到MeterRegistry。

在这个案例中,我们通过注解的形式创建了一个Spring Boot中的Component组件DemoMetrics,这个组件内置了一个计数器,用于对有计数需求的业务场景进行工具封装。该组件内部代码的示例如下所示。


package com.example.demo.metrics;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.Gauge;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.binder.MeterBinder;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;

@Component
public class DemoMetrics implements MeterBinder {

  public Counter counter;
  public Map<String,Double> map;

  // Map对象,用于对该组件进行扩展
  // demoMetrics.map.put("x", counter1)
  // demoMetrics.map.put("y", counter2)
  // demoMetrics.map.put("z", counter3)
  // DemoMetrics根据Map的Key的名称x\y\z取出业务端埋点值
  DemoMetrics() {
      map = new HashMap<>();
  }

  @Override
  public void bindTo(MeterRegistry meterRegistry) {
    // 定义并注册一个名称为prometheus.demo.counter的计数器,标签是name:counter1  
    this.counter = Counter.builder("prometheus.demo.counter").tags(new String[]{"name",
      "counter1"}).description("demo counter").register(meterRegistry);
       // 从业务端传递的Map中取出与Key对应的值放入注册的Gauge仪表盘中,标签是name:gauge1 
       // Gauge.builder("prometheus.demo.gauge",map,x->x.get("x")).tags("name",
       // "gauge1").description("This is Gauge").register(meterRegistry);
    }
}

Counter是一个只增不减的计数器,可以用来记录请求或者错误的总量,比如http_requests_total等。

Gauge属于可增可减的仪表盘,更多用来反映应用当前的状态,比如主机当前空闲的内存node_memory_MemFree或者其他属性。

以上指标在上述代码中都进行了定义以及设置了标签。标签组合可以更好地标识应用及应用中的监控项,特别是在集群当中。本节后文中的效果展示部分会展示这些指标的数据。