背景
简介
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");
- Tag naming
registry.counter("database.calls", "db", "users"); // 数据库调用次数 registry.counter("http.requests", "uri", "/api/users"); // HTTP请求数
- Common tags
Common tags可以被定义在registry级别,并且会被添加到每个监控系统的报告中
预定义的Tags有host , instance , region , stack等
registry.config().commonTags("stack", "prod", "region", "us-east-1"); - Tag values
必须非空
- Meter filters
简述:registry可配置过滤器及过滤器链
每个registry都可以配置指标过滤器,实现MeterFilter就可以加到registry中
过滤器按顺序应用,所有的过滤器形成一个过滤器链(chain)
registry.config() .meterFilter(MeterFilter.ignoreTags("too.much.information")) .meterFilter(MeterFilter.denyNameStartsWith("jvm"));

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作用
对性能指标的收集,可以有效地对生产系统的各方面行为进行监控,帮助运维人员掌握系统运行状态和查找问题原因。
- Micrometer都默认可以监控哪些指标
- 当然除了上述默认监控指标,还支持自定义监控指标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
