Micrometer快速入门

Micrometer是一款统一的监控指标库,简化了与多种监控软件的集成,如AppOptics、Prometheus等。它允许在Spring Boot 2.x中轻松切换监控系统,并提供了如Timer、Counter、Gauge等不同类型的Meter进行指标收集。通过MeterRegistry,可以配置MeterFilter进行指标筛选和转换,以适应不同监控系统的命名规则。此外,Micrometer默认监控JVM、CPU等系统指标,并支持自定义监控指标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景

监控要可视化,仪表化,这样才能有最直观的感受。
监控软件系统多种多样,类型繁多,如:AppOptics , Azure Monitor , Netflix Atlas , CloudWatch , Datadog , Dynatrace ,Elastic , Ganglia , Graphite , Humio , Influx/Telegraf , JMX , KairosDB , New Relic , Prometheus , SignalFx , Google Stackdriver , StatsD , Wavefront ,Nightingale等。
要选择或者更替可视化的监控软件,就显得尤为麻烦。而Micrometer就是一个集成了上述这些监控软件的第三方,同时它还有一些自己的扩展。不必去适配各种监控软件,只需要使用和配置好Micrometer,间接地使用上述软件。

简介

Micrometer是一款监控指标的度量类库,Micrometer 会负责完成与不同监控系统的适配工作。这就使得切换监控系统变得很容易。Micrometer 还支持推送数据到多个不同的监控系统。因其功能强大,spring在Springboot2.x中正式将其纳入范围。

springboot集成Micrometer
1)加入springboot集成micrometer依赖:

<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-actuator</artifactId>
	<version>2.1.4.RELEASE</version>
</dependency>

2)加入对应使用的监控系统依赖,实现数据上报到对应监控系统:
格式:io.micrometer/micrometer-registry-{system}
示例:加入夜莺依赖

 <dependency>
 	<groupId>com.github.lynxcat</groupId>
    <artifactId>micrometer-registry-nightingale</artifactId>
    <version>1.6.5</version>
</dependency>

Micrometer使用(相关组件功能介绍)

  • Registry

简述:监控系统单适配、多适配
Meter是收集关于你的应用的一系列指标的接口。
Meter是由MeterRegistry创建的。每个支持的监控系统都必须实现MeterRegistry。
Micrometer中包含一个SimpleMeterRegistry,它在内存中维护每个meter的最新值,并且不将数据导出到任何地方。
如果你还没有一个首选的监测系统,你可以先用SimpleMeterRegistry:
MeterRegistry registry = new SimpleMeterRegistry();
注意:如果你用Spring的话,SimpleMeterRegistry是自动注入的
还提供一个CompositeMeterRegistry用于将多个registries结合在一起使用,允许同时向多个监视系统发布指标。

CompositeMeterRegistry composite = new CompositeMeterRegistry();
Counter compositeCounter = composite.counter("counter");
compositeCounter.increment();
SimpleMeterRegistry simple = new SimpleMeterRegistry();
composite.add(simple);
compositeCounter.increment();
  • Meters

简述:监控不同业务指标实现Meter即可
Meter是收集关于你的应用的一系列指标的接口。
Meter是由MeterRegistry创建的。每个支持的监控系统都必须实现MeterRegistry。 Micrometer提供一系列原生的Meter,包括Timer , Counter , Gauge , DistributionSummary , LongTaskTimer , FunctionCounter , FunctionTimer , TimeGauge。不同的meter类型导致有不同的时间序列指标值。例如,单个指标值用Gauge表示,计时事件的次数和总时间用Timer表示。

  • Naming meters(指标命名)

简述:适配监控系统需定义各自不同规则的命名转换器
Micrometer使用了一种命名约定,用.分隔小写单词字符。不同的监控系统有不同的命名约定。
每个Micrometer的实现都要负责将Micrometer这种以.分隔的小写字符命名转换成对应监控系统推荐的命名。
因此每个监控系统都要提供一个命名转换器,NamingConvention来覆盖默认的命名转换
registry.config().namingConvention(myCustomNamingConvention);
示例:定义http请求次数timer

registry.timer("http.server.requests");
  1. Tag naming
registry.counter("database.calls", "db", "users");       // 数据库调用次数
registry.counter("http.requests", "uri", "/api/users");  // HTTP请求数
  1. Common tags
    Common tags可以被定义在registry级别,并且会被添加到每个监控系统的报告中
    预定义的Tags有host , instance , region , stack等
registry.config().commonTags("stack", "prod", "region", "us-east-1");
  1. Tag values
    必须非空
  • Meter filters

简述:registry可配置过滤器及过滤器链
每个registry都可以配置指标过滤器,实现MeterFilter就可以加到registry中
过滤器按顺序应用,所有的过滤器形成一个过滤器链(chain)

registry.config()
    .meterFilter(MeterFilter.ignoreTags("too.much.information"))
.meterFilter(MeterFilter.denyNameStartsWith("jvm"));

MeterFilter静态方法

MeterFilter提供了很多静态方法:

1.Deny/accept meters
接受或拒绝指标
示例:返回包含集中交易的指标

new MeterFilter() {
    @Override
    public MeterFilterReply accept(Meter.Id id) {
       if(id.getName().contains("JZJY")) {
          return MeterFilterReply.DENY;
       }
       return MeterFilterReply.NEUTRAL;
    }
}

2.Transforming metrics
过滤器转换器:

new MeterFilter() {
    @Override
    public Meter.Id map(Meter.Id id) {
       if(id.getName().startsWith("test")) {
          return id.withName("extra." + id.getName()).withTag("extra.tag", "value");
       }
       return id;
    }
}
  • Counters(计数器)

简述:自定义系统功能业务的统计计数器

MeterRegistry registry = new SimpleMeterRegistry();

//  写法一
Counter counter = registry.counter("counter");

//  写法二
Counter counter = Counter
    .builder("counter")
    .baseUnit("beans") // optional
    .description("a description of what this counter does") // optional
    .tags("region", "test") // optional
.register(registry);
  • Gauges

简述 :是获取当前度量记录值的句柄,Gauge通常用于变动的测量值Gauge的典型使用场景是用于测量集合或映射的大小或运行状态中的线程数。Gauge一般用于监测有自然上界的事件或者任务,而Counter一般使用于无自然上界的事件或者任务的监测,像Http请求总量计数应该使用Counter而非Gauge。

gauge是获取当前值的句柄。典型的例子是,获取集合、map、或运行中的线程数等。
MeterRegistry接口包含了用于构建gauges的方法,用于观察数字值、函数、集合和map。

List<String> list = registry.gauge("listGauge", Collections.emptyList(), new ArrayList<>(), List::size); //监视非数值对象
List<String> list2 = registry.gaugeCollectionSize("listSize2", Tags.empty(), new ArrayList<>()); //监视集合大小
Map<String, Integer> map = registry.gaugeMapSize("mapGauge", Tags.empty(), new HashMap<>());

//手动加减Gauge
AtomicInteger n = registry.gauge("numberGauge", new AtomicInteger(0));
n.set(1);
n.set(2);
  • Timers(计时器)

简述:Timer用于测量短时间延迟和此类事件的频率。
所有Timer实现至少将总时间和事件次数报告为单独的时间序列。

例如,可以考虑用一个图表来显示一个典型的web服务器的请求延迟情况。服务器可以快速响应许多请求,因此定时器每秒将更新很多次。

// 方式一
public interface Timer extends Meter {
    ...
    void record(long amount, TimeUnit unit);
    void record(Duration duration);
    double totalTime(TimeUnit unit);
}

// 方式二
Timer timer = Timer
    .builder("my.timer")
    .description("a description of what this timer does") // optional
    .tags("region", "test") // optional
    .register(registry); 
  • Long task timers

简述:长任务计时器用于跟踪所有正在运行的长时间运行任务的总持续时间和此类任务的数量。 Timer记录的是次数,Long Task Timer记录的是任务时长和任务数

// 方式一
@Timed(value = "aws.scrape", longTask = true)
@Scheduled(fixedDelay = 360000)
void scrapeResources() {
    // find instances, volumes, auto-scaling groups, etc...
}

// 方式二
LongTaskTimer scrapeTimer = registry.more().longTaskTimer("scrape");
void scrapeResources() {
    scrapeTimer.record(() => {
        // find instances, volumes, auto-scaling groups, etc...
    });
}
  • Distribution summaries(分布汇总)

简述:distribution summary用于跟踪分布式的事件。它在结构上类似于计时器,但是记录的值不代表时间单位。
例如,记录http服务器上的请求的响应大小。

DistributionSummary summary = registry.summary("response.size");
  • Histograms and percentiles(直方图和百分比)

简述:Timers 和 distribution summaries 支持收集数据来观察它们的百分比。

查看百分比有两种主要方法:
Percentile histograms(百分比直方图): Micrometer将值累积到底层直方图,并将一组预先确定的buckets发送到监控系统。监控系统的查询语言负责从这个直方图中计算百分比。目前,只有Prometheus , Atlas , Wavefront支持基于直方图的百分位数近似值,并且通过histogram_quantile , :percentile , hs()依次表示。

Client-side percentiles(客户端百分比):Micrometer为每个meter ID(一组name和tag)计算百分位数近似值,并将百分位数值发送到监控系统。

下面是用直方图构建Timer的一个例子:

Timer.builder("my.timer")
   .publishPercentiles(0.5, 0.95) // median and 95th percentile
   .publishPercentileHistogram()
   .sla(Duration.ofMillis(100))
   .minimumExpectedValue(Duration.ofMillis(1))
   .maximumExpectedValue(Duration.ofSeconds(10))

Micrometer作用

对性能指标的收集,可以有效地对生产系统的各方面行为进行监控,帮助运维人员掌握系统运行状态和查找问题原因。

性能指标监控通常由两个部分组成:
第一个部分是性能指标数据的收集,需要在应用程序代码中添加相应的代码来完成;
另一个部分是后台监控系统,负责对数据进行聚合计算和提供 API 接口。在应用中使用计数器、计量仪和计时器来记录关键的性能指标。在专用的监控系统中对性能指标进行汇总,并生成相应的图表来进行可视化分析。

  1. Micrometer都默认可以监控哪些指标

打开 ip:端口/actuator/metrics,可以看到一些监控指标
 JVM指标,报告利用率:
 各种内存和缓冲池
 与垃圾收集有关的统计
 线程利用率
 加载/卸载的类数
 CPU指标
 文件描述符指标
 Kafka消费者指标
 Log4j2指标:记录每个级别记录到Log4j2的事件数
 Logback指标:记录每个级别记录到Logback的事件数
 正常运行时间指标:报告正常运行时间表和表示应用程序绝对启动时间的固定计量表
 Tomcat指标
 Spring Integration指标

  1. 当然除了上述默认监控指标,还支持自定义监控指标DemoMetrics:

1.定义DemoMetrics

public class DemoMetrics implements MeterBinder {
    private AtomicLong systemMemoryUsed = new AtomicLong(0);
    //这里实现了MeterBinder接口的bindTo方法,将要采集的指标注册到MeterRegistry
    @Override
    public void bindTo(MeterRegistry meterRegistry) {
    //这里的MeterRegistry 是全局的
Gauge.builder("system.memory.used",systemMemoryUsed, AtomicLong::get)
//              .tag("groupName", this.groupName)
                .description("系统已用内存(byte)")
                .register(registry);
}
    //定时器,定时改变内存数值
    @Scheduled(fixedRate = 1000)
    public void recordMemory(){
         //获取内存信息,省略
        //更改内存
        systemMemoryUsed.set(physicalUse);
     }

2.注册

@Bean
public DemoMetrics demoMetrics(){
    return new DemoMetrics();
}

3.验证:
打开 ip:端口/actuator/metrics,看新的metric是否存在即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值