Micrometer快速入门

Micrometer快速入门背景 监控要可视化 仪表化 这样才能有最直观的感受 监控软件系统多种多样 类型繁多 如 AppOptics AzureMonitor NetflixAtlas CloudWatch Datadog Dynatrace Elastic Ganglia Graphite Humio Influx Telegraf JMX KairosDB NewRelic Prometheus SignalFx GoogleStackd S

背景

简介

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> 
 <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提供了很多静态方法:

new MeterFilter() { 
    @Override public MeterFilterReply accept(Meter.Id id) { 
    if(id.getName().contains("JZJY")) { 
    return MeterFilterReply.DENY; } return MeterFilterReply.NEUTRAL; } } 
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。

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 = ) 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 支持收集数据来观察它们的百分比。

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作用

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

  1. Micrometer都默认可以监控哪些指标
  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(); } 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/215141.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月18日 下午2:36
下一篇 2026年3月18日 下午2:36


相关推荐

  • windows8.1 KB2919355更新步骤

    windows8.1 KB2919355更新步骤2014 年 5 月 5 日 微软再次更新了 windows8 1update kb2919355 更新包 之前更新失败的朋友建议按下述方法 前提是 kb2919422 已安装 进行安装 网址为 http dl pconline com cn download 355849 htm 方法 步骤第一步 在 控制面板 系统和安全 windows 更新 下 检查更新并按照提示安装 kb2919355 第二步 按照 kb2

    2026年3月19日
    3
  • 【NOIP2011】聪明的质检员

    【NOIP2011】聪明的质检员2.聪明的质监员(qc.cpp/c/pas)小T是一名质量监督员,最近负责检验一批矿产的质量。这批矿产共有n个矿石,从1到n逐一编号,每个矿石都有自己的重量wi以及价值vi。检验矿产的流程是:1、给定m个区间[Li,Ri];2、选出一个参数W;3、对于一个区间[Li,Ri],计算矿石在这个区间上的检验值Yi:这批矿产的检验结果Y为各个区间

    2025年12月3日
    5
  • 通配符掩码的计算

    通配符掩码的计算关于通配符掩码的计算我不太清楚通配符掩码具体是怎么定义的,但是在大多数初学者的印象中通配符掩码就是子网掩码取反,在网上搜索了一下也没有什么具体解释,下面是摘自百度百科的解释:路由器使用的通配符掩码(或反掩码)与源或目标地址一起来分辨匹配的地址范围,它跟子网掩码刚好相反。它不像子网掩码告诉路由器IP地址的哪一位属于网络号一样,通配…

    2022年7月24日
    27
  • 第三方教程

    第三方教程

    2026年3月13日
    2
  • RapidXml 简介

    RapidXml 简介2019独角兽企业重金招聘Python工程师标准>>>…

    2022年7月17日
    18
  • 【C++】逆向与反汇编实战–PEiD分析复现

    【C++】逆向与反汇编实战–PEiD分析复现文章目录准备文件判断分析函数定位文件判定函数分析 OEP 检查错误和编译器判断真文件分析函数特征码分析 PEID 解析流程开发环境伪造准备 PEiD PEIdentifier 是一款著名的查壳工具 其功能强大 几乎可以侦测出所有的壳 其数量已超过 470 种 PE 文档的加壳类型和签名 整个过程需要测试文件成品 https www lanzous com b07r7qu0d 首先使用 PEiD 检测之前做的一个异常捕捉测试程序 源码在下面 编译器为 VC 6 0 编译方法为 Win32Release in

    2026年3月17日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号