​Micrometer 快速入門

2020-10-14 Jerry的技術與思維

Micrometer為最流行的監控系統提供了一個簡單的儀表客戶端外觀,允許儀表化JVM應用,而無需關心是哪個供應商提供的指標。它的作用和SLF4J類似,只不過它關注的不是Logging(日誌),而是application metrics(應用指標)。簡而言之,它就是應用監控界的SLF4J。

Micrometer提供了與供應商無關的接口,包括 timers(計時器)gauges(量規)counters(計數器)distribution summaries(分布式摘要)long task timers(長任務定時器)。它具有維度數據模型,當與維度監視系統結合使用時,可以高效地訪問特定的命名度量,並能夠跨維度深入研究。

支持的監控系統:AppOptics , Azure Monitor , Netflix Atlas , CloudWatch , Datadog , Dynatrace , Elastic , Ganglia , Graphite , Humio , Influx/Telegraf , JMX , KairosDB , New Relic , Prometheus , SignalFx , Google Stackdriver , StatsD , Wavefront

​1. 安裝

Micrometer記錄的應用程式指標用於觀察、告警和對環境當前/最近的操作狀態做出反應。

為了使用Micrometer,首先要添加你所選擇的監視系統的依賴。以Prometheus為例:

<dependency>

<groupId>io.micrometer</groupId>

<artifactId>micrometer-registry-prometheus</artifactId>

<version>${micrometer.version}</version>

</dependency>

​2. 概念

​2.1. Registry

Meter是收集關於你的應用的一系列指標的接口。Meter是由MeterRegistry創建的。每個支持的監控系統都必須實現MeterRegistry。

Micrometer中包含一個SimpleMeterRegistry,它在內存中維護每個meter的最新值,並且不將數據導出到任何地方。如果你還沒有一個首選的監測系統,你可以先用SimpleMeterRegistry:

MeterRegistry registry = new SimpleMeterRegistry();

注意:如果你用Spring的話,SimpleMeterRegistry是自動注入的

Micrometer還提供一個CompositeMeterRegistry用於將多個registries結合在一起使用,允許同時向多個監視系統發布指標。

CompositeMeterRegistry composite = new CompositeMeterRegistry();

Counter compositeCounter = composite.counter("counter");

compositeCounter.increment();

SimpleMeterRegistry simple = new SimpleMeterRegistry();

composite.add(simple);

compositeCounter.increment();

​2.2. Meters

Micrometer提供一系列原生的Meter,包括Timer , Counter , Gauge , DistributionSummary , LongTaskTimer , FunctionCounter , FunctionTimer , TimeGauge。不同的meter類型導致有不同的時間序列指標值。例如,單個指標值用Gauge表示,計時事件的次數和總時間用Timer表示。

每一項指標都有一個唯一標識的名字和維度。「維度」和「標籤」是一個意思,Micrometer中有一個Tag接口,僅僅因為它更簡短。一般來說,應該儘可能地使用名稱作為軸心。

(PS:指標的名字很好理解,維度怎麼理解呢?如果把name想像成橫坐標的話,那麼dimension就是縱坐標。Tag是一個key/value對,代表指標的一個維度值)

​2.3. Naming meters(指標命名)

Micrometer使用了一種命名約定,用.分隔小寫單詞字符。不同的監控系統有不同的命名約定。每個Micrometer的實現都要負責將Micrometer這種以.分隔的小寫字符命名轉換成對應監控系統推薦的命名。你可以提供一個自己的NamingConvention來覆蓋默認的命名轉換:

registry.config().namingConvention(myCustomNamingConvention);

有了命名約定以後,下面這個timer在不同的監控系統中看起來就是這樣的:

registry.timer("http.server.requests");

在Prometheus中,它是http_server_requests_duration_seconds

在Atlas中,它對應的是httpServerRequests

在InfluxDB中,對應的是http_server_requests

(PS:每項指標都有一個名字,不同的監控系統的命名規則(風格)都不太一樣,因此可能同一個指標在不同的監控系統中有不同的名字。簡單地來說,比如內存使用率這個指標可能在Prometheus中用MemoryUsage表示,在InfluxDB中用mem_usage表示,因此每個監控系統都要提供一個命名轉換器,當看到mem.usage的時候InfluxDB應該知道說的是內存使用率,對應的指標名稱是mem_usage。這就好比,中文「你好」翻譯成英文是「hello」,翻譯成日文是「こんにちは」 )

2.3.1. Tag naming

假設,我們想要統計HTTP請求數和資料庫調用次數,那麼可以這樣寫:

registry.counter("database.calls", "db", "users"); // 資料庫調用次數2 registry.counter("http.requests", "uri", "/api/users"); // HTTP請求數

2.3.2. Common tags

Common tags可以被定義在registry級別,並且會被添加到每個監控系統的報告中

預定義的Tags有host , instance , region , stack等

registry.config().commonTags("stack", "prod", "region", "us-east-1");

registry.config().commonTags(Arrays.asList(Tag.of("stack", "prod"), Tag.of("region", "us-east-1"))); // 二者等價

2.3.4. Tag values

Tag values must be non-null

​2.4. Meter filters

每個registry都可以配置指標過濾器,它有3個方法:

  • Deny (or accept) meters from being registered
  • Transform meter IDs
  • Configure distribution statistics for some meter types.

實現MeterFilter就可以加到registry中

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

過濾器按順序應用,所有的過濾器形成一個過濾器鏈(chain)

2.4.1. Deny/accept meters

接受或拒絕指標

new MeterFilter() {

@Override

public MeterFilterReply accept(Meter.Id id) { if(id.getName().contains("test")) {

return MeterFilterReply.DENY;

}

return MeterFilterReply.NEUTRAL;

}

}

MeterFilter還提供了許多方便的靜態方法用於接受或拒絕指標

2.4.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;

}

}

​2.5. Counters(計數器)

Counter接口允許以固定的數值遞增,該數值必須為正數。

​2.6. Gauges

gauge是獲取當前值的句柄。典型的例子是,獲取集合、map、或運行中的線程數等。

MeterRegistry接口包含了用於構建gauges的方法,用於觀察數字值、函數、集合和map

​2.7. Timers(計時器)

Timer用於測量短時間延遲和此類事件的頻率。所有Timer實現至少將總時間和事件次數報告為單獨的時間序列。

例如,可以考慮用一個圖表來顯示一個典型的web伺服器的請求延遲情況。伺服器可以快速響應許多請求,因此定時器每秒將更新很多次。

​2.8. Long task timers

長任務計時器用於跟蹤所有正在運行的長時間運行任務的總持續時間和此類任務的數量。

Timer記錄的是次數,Long Task Timer記錄的是任務時長和任務數

​2.9. Distribution summaries(分布匯總)

distribution summary用於跟蹤分布式的事件。它在結構上類似於計時器,但是記錄的值不代表時間單位。例如,記錄http伺服器上的請求的響應大小。

DistributionSummary summary = registry.summary("response.size");

​2.10. 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)

.publishPercentileHistogram()

.sla(Duration.ofMillis(100))

.minimumExpectedValue(Duration.ofMillis(1))

.maximumExpectedValue(Duration.ofSeconds(10))

​3. Micrometer Prometheus

Prometheus是一個內存中的維度時間序列資料庫,具有簡單的內置UI、定製查詢語言和數學操作。Prometheus的設計是基於pull模型進行操作,根據服務發現定期從應用程式實例中抓取指標。

​3.1. 安裝

1 <dependency>

<groupId>io.micrometer</groupId>

<artifactId>micrometer-registry-prometheus</artifactId>

<version>${micrometer.version}</version>

</dependency>

​3.2. 配置

Prometheus希望通過抓取或輪詢單個應用程式實例來獲得指標。除了創建Prometheus registry之外,還需要向Prometheus的scraper公開一個HTTP端點。在Spring環境中,一個Prometheus actuator endpoint是在Spring Boot Actuator存在的情況下自動配置的。

​4. Spring Boot 2.0

Spring Boot Actuator提供依賴管理並自動配置Micrometer

實現meterBinder即可

package com.ata.channelManager.meter;

import io.micrometer.core.instrument.Gauge;

import io.micrometer.core.instrument.MeterRegistry;

import io.micrometer.core.instrument.binder.MeterBinder;

import org.springframework.scheduling.annotation.Scheduled;

import org.springframework.stereotype.Component;

import java.util.concurrent.atomic.AtomicInteger;

/**

* 指標計時器 @micrometer

*

* @author jerry

*/

@Component

public class CounterMeter implements MeterBinder {

private AtomicInteger tokenCounter = new AtomicInteger();

private AtomicInteger smsCounter = new AtomicInteger();

private AtomicInteger bookCounter = new AtomicInteger();

private AtomicInteger httpErrorCounter = new AtomicInteger();

public CounterMeter() {

}

public int generateToken() {

return tokenCounter.incrementAndGet();

}

public int sms() {

return smsCounter.incrementAndGet();

}

public int book() {

return bookCounter.incrementAndGet();

}

public int errorHttp() {

return httpErrorCounter.incrementAndGet();

}

@Override

public void bindTo(MeterRegistry registry) {

Gauge.builder("chg5g.req.generateToken", () -> tokenCounter.get()).description("從網頁請求token的錯誤次數").tag("source", "web").register(registry);

Gauge.builder("chg5g.req.sms", () -> smsCounter.get()).description("從網頁請求簡訊驗證碼的錯誤次數").tag("source", "web").register(registry);

Gauge.builder("chg5g.req.book", () -> bookCounter.get()).description("從網頁請求下單的錯誤次數").tag("source", "web").register(registry);

Gauge.builder("chg5g.out.http.yidong", () -> httpErrorCounter.get()).description("http請求移動錯誤總次數").tag("out", "http").register(registry);

}

@Scheduled(cron = "0 * * * * ?")

private void reset() {

tokenCounter.set(0);

smsCounter.set(0);

bookCounter.set(0);

httpErrorCounter.set(0);

}

}

相關焦點

  • Spring boot2集成micrometer實現應用監控
    第一步:增加依賴<dependency>    <groupId>io.micrometer</groupId>    <artifactId>micrometer-registry-prometheus</artifactId>    <version>1.0.4</version></dependency>具體版本請查詢最新版本
  • Vue-cli(標準前端化工程)快速入門
    在學習Vue-cli之前,我們已經學習了前端體系、前後端分離的演變、Vue入門、Vue的基本語法、Vue組件、Vue路由、Axios等內容。如果你還沒學習,可以閱讀我之前的文章《快速了解前端體系》《前後端分離的演變史,了解一下》、《Vue快速入門》等進行快速學習。接下來我們就來學習標準前端化工程Vue-cli。
  • 外籍教授說,python編程入門很難嗎?看完它就能快速入門
    原因很簡單,學python編程重要的不是基礎,還是學習方法,掌握這個學習方法,快速學會為什麼能快速入門python呢?結合常見任務、簡潔的步驟,幫助你快速學習python。如果​你需要文中的教程,可以:
  • React實戰002:快速入門實例「Hello React」
    ​ 入口文件index.html是React​ App組件也就是說我們在啟動React項目看到的內容都來自組件​創建第一個Hell React頁面接下來我們先來個簡單的入門實例先體驗下總結:以上內容是小編給大家分享的【React實戰002:一個簡單的快速入門實例
  • Git實戰002:Git快速入門使用詳解
    上篇通過【 】已經安裝配置好了Git,現在我們利用Gitlab來快速的實現項目git版本控制功能。​創建版本庫版本庫(repository)也叫倉庫​創建項目接下來我們就可以在倉庫中來創建項目了​總結:提交之前需將修改的文件先添加至暫存區,首次推送遠程倉庫需先關聯倉庫地址。
  • MyBatis-Plus快速入門(二)
    如果你還沒閱讀上一篇文章《MyBatis-Plus快速入門(一)》,建議先去閱讀一下。本文是接著上一篇文章的內容來進行講述的。樂觀鎖什麼是樂觀鎖?什麼又是悲觀鎖?@Configurationpublic class MPConfig {​    //樂觀鎖插件 本質是一個攔截器    @Bean    public OptimisticLockerInterceptor optimisticLockerInterceptor() {      
  • 顏控的品質之選 索尼(SONY)APS-C畫幅微單數位相機 入門級​僅售...
    顏控的品質之選 索尼(SONY)APS-C畫幅微單數位相機 入門級​僅售5799.00元 2019年10月25日 10:31作者:志輝編輯:志輝
  • 如何快速入門大數據行業 零基礎能學大數據嗎
    如何快速入門大數據行業?零基礎能學大數據嗎?大多數程式設計師都需要長時間加班、熬夜和超負荷的工作,因此程式設計師到了一定年齡後在體力上會輸於一般年輕人,也因此想繼續在IT行業內打拼的程式設計師便只能追求成為更高技術水平的架構師或轉至管理層這兩個方面。
  • 江蘇戴爾T140​入門級伺服器含稅6900元
    戴爾T140易於使用、安全且實用的入門級伺服器,適用於成長型企業。T140使您能夠以經濟實惠的方式處理常見的業務工作負載,非常適合文件和列印以及銷售點應用程式。本文屬於原創文章,如若轉載,請註明來源:江蘇戴爾T140​入門級伺服器含稅6900元http://server.zol.com.cn/758/7583650.html
  • 如何快速找到文件,Mac新手必備入門小技巧②
    上次,研究所的小夥伴已經分享了10個新手入門Mac的小技巧,還沒學習的小夥伴可以往前翻一下,這次我們繼續分享10個小技巧,希望對大家有用!四、快速找到文件夾中的特定文件比方說,將Mac連接移動硬碟,並拷入一個文件,這時候就可以看到硬碟在Mac上的讀寫速度了。​
  • MyBatis-Plus快速入門(一)
    ActiveRecord 模式:支持 ActiveRecord 形式調用,實體類只需繼承 Model 類即可進行強大的 CRUD 操作支持自定義全局通用操作:支持全局通用方法注入(Write once, use anywhere)內置代碼生成器:採用代碼或者 Maven 插件可快速生成
  • Python快速入門的方法
    現在如果有人問:要把哪門語言作為入門的首選語言?不少人都會回答:Python!因為Python簡單,所以學起來快,有編程經驗的程式設計師一周就能上手Python。但是!Python對有基本的程序概念的人來說很簡單,但對於新手來說真不一定算簡單。畢竟,寫起來簡單不代表概念簡單。
  • java如何快速入門?
    java如何快速入門正確掌握Java的基本知識由於Java為開發人員提供了如此多的特性和選項java如何快速入門真正弄懂你敲出的代碼是做什麼的只要你理解了代碼背後的思想java如何快速入門避免創建無用的對象使用Java創建對象時,會耗盡系統的內存和處理器速度
  • Vue快速入門
    --頁面視圖渲染-->   <<router-view></router-view>​</div><script src=&34;></script><script src=&34;></script><script>     //1、定義路由組件  
  • 0基礎新手電工如何快速入門?電工快速入門方法
    電工證現在是電工行業的入門證書,想要從事電工行業都需要有電工證,電工是安全性要求非常高的工作,所以持證上崗是對安全的重視。目前去培訓班學習,培訓和考證時間的各地不同,一般在三個月左右。課程不同,培訓內容不同,最終的培訓時間也不一樣,請根據培訓班的具體安排來選擇適合你的培訓課程。
  • Python爬蟲入門,快速抓取大規模數據(完結篇)
    Python基本環境的搭建,爬蟲的基本原理以及爬蟲的原型Python爬蟲入門,快速抓取大規模數據如何使用BeautifulSoup對網頁內容進行提取Python爬蟲入門,快速抓取大規模數據(第二部分)爬蟲運行時數據的存儲數據,以SQLite和MySQL作為示例Python爬蟲入門,快速抓取大規模數據(第三部分)使用selenium webdriver
  • Python爬蟲Xpath語法快速入門教程
    我們可直接根據div標籤的class值進行定位(這是我們平時使用xpath語法比較多的地方)​>例:我想獲取熱榜有哪些信息,參考下圖可見其全部在ul標籤下,每一個信息對於一個li標籤​​例:定位百度熱榜找它的父節點也就是a標籤的href屬性​
  • 為何人工智慧首選Python 如何才能快速入門
    如何才能快速入門?現如今,人工智慧的諸多領域,都有涉及Python語言,它可以堪稱火爆全球。據不完全統計,Python使用人數超過千萬,30%IT新人入門都學Python技術。讓很多人轉行想加入Python程式語言的學習行列,下面一同來看看吧。
  • 面向初學者的DOCKER快速入門指南
    linux/centos/docker-ce.repo為了速度可以替換文件中的urldnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo​dnf
  • Javaweb-Filter-1-快速入門
    Filter快速入門開始學習Filter這個知識點,單詞是過濾器和攔截器的作用。Filter是Javaweb中的過濾器,可以攔截所有訪問web資源的請求或響應操作。Filter這個知識點很重要,在javaweb開發中,這個是我們需要重點掌握的一個知識點。