micrometer重點

    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);

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章