micrometer號稱監控界的SLF4J,以極低的開銷爲基於JVM的程序收集監控指標。
1、註冊表Registry:
Meter是用來收集應用的測量指標的接口。micrometer通過MeterRegistry創建和保存Meter,每個監控系統都會有MeterRegistry的實現。
SimpleMeterRegistry:
SimpleMeterRegistry持有內存中每一個指標的最新值,但是不用於對外提供。在未確定
定義方式:
MeterRegistry registry = new SimpleMeterRegistry();
混合註冊:
Micrometer 提供了一個CompositeMeterRegistry可添加多個註冊表的程序,支持將metrics標準同時發佈到多個監視系統。
CompositeMeterRegistry composite = new CompositeMeterRegistry();
Counter compositeCounter = composite.counter("counter");
compositeCounter.increment(); (1)
SimpleMeterRegistry simple = new SimpleMeterRegistry();
composite.add(simple); (2)
compositeCounter.increment(); (3)
備註:
1)CompositeMeterRegistry composite中添加的所有註冊表,都具備composite的指標,例如simple中有Counter compositeCounter;
2)當Counter compositeCounter增加的時候,CompositeMeterRegistry composite中添加的所有註冊表中的compositeCounter都會相應地增加。
全局註冊:
Micrometer提供了一個靜態全局註冊表Metrics.globalRegistry和一組靜態構建器,用於基於此註冊表生成計量表。globalRegistry是一個組合註冊表。
class MyComponent {
Counter featureCounter = Metrics.counter("feature", "region", "test"); (1)
void feature() {
featureCounter.increment();
}
void feature2(String type) {
Metrics.counter("feature.2", "type", type).increment(); (2)
}
}
class MyApplication {
void start() {
// wire your monitoring system to global static state
Metrics.addRegistry(new SimpleMeterRegistry()); (3)
}
}
全局註冊表中添加的指標會自動添加到所有註冊表中。
2、指標
micrometer的指標由指標名稱和鍵值對組成。指標需要註冊到註冊表中,通過註冊表來進行發佈。micrometer的指標分爲4類:Counter、Gauge、Timer、Summary。
一般來說,指標的使用分成4個環節:創建、註冊、使用、發佈。
1、Counter
counter是計數器,特徵是隻增不減。counter通常用來表示業務的請求次數之類的只增不減的指標。通常會使用counter的increment()方法或者increment(int n)方法,分別增加1和n。示例:
MeterRegistry registry = new PrometheusMeterRegistry(PrometheusConfig.DEFAULT);
Counter counter = registry.counter("counter", "tag_key", "tag_value");
Flux.interval(Duration.ofMillis(10))
.doOnEach(d -> {
if (rand.nextDouble() + 0.1 > 0) {
counter.increment();
}
})
.blockLast();
2、Gauge
Gauge是儀表值。顧名思義,Gauge用來記錄可以瞬息萬變的一個數值,例如CPU利用率、內存利用率等。示例:
//example 1:
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<>());
//example 2:
AtomicInteger n = registry.gauge("numberGauge", new AtomicInteger(0));
n.set(1);
n.set(2);
//example 3:
Gauge gauge = Gauge
.builder("gauge", myObj, myObj::gaugeValue)
.description("a description of what this gauge does") // optional
.tags("region", "test") // optional
.register(registry);
3、Timer
Timer是計時器,用來測量短時間的代碼塊的執行時間的分佈。Timer記錄代碼塊的執行時間後,可以對執行時間進行統計,分析記錄執行的最大時間、總時間、平均時間、執行完成的總任務等。
Timer的方法:
void record(long amount, TimeUnit unit);
void record(Duration duration);
double totalTime(TimeUnit unit);
Timer的使用示例:
Timer timer = Timer
.builder("my.timer")
.description("a description of what this timer does") // optional
.tags("region", "test") // optional
.register(registry);
4、Summary
Summary是摘要,用於跟蹤事件的分佈。micrometer的Summary可以通過prometheus的Summary來理解:prometheus指標。
代碼示例:
//example 1:
DistributionSummary summary = registry.summary("response.size");
//example 2:
DistributionSummary summary = DistributionSummary
.builder("response.size")
.description("a description of what this summary does") // optional
.baseUnit("bytes") // optional (1)
.tags("region", "test") // optional
.scale(100) // optional (2)
.register(registry);