搶先一步
VMware 提供培訓和認證,以加速你的進度。
了解更多歡迎來到另一期的你可能不需要另一個函式庫 (You May Not Need Another Library For That, YMNNALFT)!自 2016 年以來,我花了很多時間在 我的 Spring Tips 影片中闡明(或者試圖闡明!)Spring 生態系統中一些更巨大的機會。 然而,今天,我以不同的精神來到這裡,希望專注於那些小而有時隱藏的瑰寶,它們可以做很棒的事情,並且可以讓你免於額外的第三方依賴及其隱含的複雜性。
現在凌晨 3 點。你知道你的生產 KPI 指標在哪裡嗎?你無法改進你無法衡量的東西,而指標是其中的重要組成部分。沒有指標,我們將徹底、毫無希望地迷失,被困在一個螺旋式死亡行軍專案中,看不到任何改善的跡象或希望!戰慄吧,你們這些可憐又悲慘的開發者!沒有指標,我們就是瞎子,這根本不好笑,所以,這裡放一張我女兒可愛的小天竺鼠 Kai 的照片
指標讓我們能夠描述關於我們系統的特定事實 - 它讓我們能夠量化重要數據,這很好,因為有各種各樣的東西可以計數和量化
學習捕捉哪些指標以及哪些指標無關緊要,這是一門真正的藝術。甚至是整個職業!「增長駭客」嗎?並非所有指標都是平等的。增長駭客關心指標。產品經理會關心指標。業務部門會關心指標。你的平台可以關心指標。你應該關心指標。為什麼不呢?所有數據都在那裡供你獲取,但你需要一個強大的框架來幫助你。編寫程式碼來檢測你的程式碼並捕捉指標只是成功的一半。一旦捕獲,你就會想要(需要!)儲存和分析這些指標。為此,你將使用時間序列資料庫 - 像是 VMWare 的 Wavefront、Prometheus、Netflix Atlas、DataDog、Instana 等等,然後視覺化和分析這些數據。你需要一個強大的框架,支持在各種上下文中捕捉各種指標(計時器、計數器、直方圖、平均值等),然後將這些指標發送到各種時間序列資料庫 (TSDB)。
進入 Micrometer。 Micrometer 允許你使用與供應商無關的介面來檢測你的程式碼,並在最後一步決定你想使用哪個監控系統。使用 Micrometer 檢測你的核心函式庫程式碼,允許將函式庫包含在將指標傳送到不同後端的應用程式中。 Spring Boot 提供了 Actuator 模組來支持捕獲和觀察應用程式的不同方面。它具有諸如應用程式的健康狀況、執行緒轉儲和無數其他內容的端點。它有一個端點 /actuator/metrics
,它依賴於 Micrometer,讓你一目了然地看到你的 Spring Boot 應用程式捕獲的指標,無論你是否也將這些指標發布到 TSDB。
請記住,Spring 依賴於 Micrometer,但 Micrometer 不依賴於 Spring。許多函式庫使用 Micrometer SPI 檢測自身。你所需要做的就是新增與 TSDB 的整合。以下是一些使用 Micrometer 發出指標的第三方函式庫:Javalin、HikariCP、RabbitMQ Java 客戶端、Redisson、Brave 分散式追蹤客戶端、Netflix Spinnaker、基於 Netty 的非阻塞 Armeria 框架、Alibaba Nacos 客戶端、Apache Geode、Microsoft Azure Spring Boot 整合、Resilience4J、reactive Playtika Feign 客戶端、Openrewrite、Apache Camel、Couchbase Java DCP 客戶端,以及數百個其他的。 哦,我是否有提到 Spring 生態系統中的無數模組也支持它? 是的,Micrometer 確實無處不在!
我們正在使用 Spring,當然,所以只需將 Spring Boot Actuator 模組添加到構建中會更容易。如果你想支援特定的 TSBD,你必須引入該特定整合的特定模組。一些 Micrometer 整合也完整地配備了完整的 Spring Boot 整合,因此你可以根據需要使用它們來代替直接的 Micrometer 整合。 VMware Wavefront 就是這樣一種 TSDB,它附帶了與 Spring Boot 的廣泛而豐富的整合,因此我將在這裡引入該超集合整合。
讓我們看看一個簡單的服務。
你需要以下依賴項。
Spring Initializr 上的 Actuator - org.springframework.boot
: spring-boot-starter-actuator
Spring Initializr 上的 Wavefront - com.wavefront
: wavefront-spring-boot-starter
在這個例子中,我為我當天咖啡消耗量的統計資料建立兩個計數器指標。我向資料添加了一個額外的維度:咖啡是否含有咖啡因。
這是程式碼
package bootiful.metrics;
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
@SpringBootApplication
public class BootifulApplication {
public static void main(String[] args) {
System.setProperty("spring.profiles.active", "metrics");
SpringApplication.run(BootifulApplication.class, args);
}
@Bean
ApplicationListener<ApplicationReadyEvent> ready(MeterRegistry registry) {
return event -> {
// https://127.0.0.1:8080/actuator/metrics/coffees
String metricsKey = "coffees";
Counter decaffeinated = registry.counter(metricsKey, "caffeine", "false");
Counter caffeinated = registry.counter(metricsKey, "caffeine", "true");
for (int i = 0; i < (int) (Math.random() * 10); i++)
caffeinated.increment();
for (int i = 0; i < (int) (Math.random() * 10); i++)
decaffeinated.increment();
System.out.println("caffeinated: " + caffeinated.count());
System.out.println("decaffeinated: " + decaffeinated.count());
// https://127.0.0.1:8080/actuator/metrics/message-print
Timer timer = registry.timer("message-print");
for (int i = 0; i < 10; i++)
timer.record(Duration.ofMillis((long) (Math.random() * (10 * 1000))));
System.out.println("message-print: " + timer.totalTime(TimeUnit.SECONDS));
};
}
}
這是我放入 application.properties
的內容
spring.main.web-application-type=reactive
management.endpoints.web.exposure.include=*
management.endpoint.metrics.enabled=true
在本系列的大多數條目中,我都會提到所討論函式庫的可能替代方案。 我不想在這裡這樣做,因為我還沒有真正找到任何接近 Micrometer 的東西,如果我說有,那就太虛偽了。 Micrometer 是一個更好的解決方案。 你會發現的大多數其他指標框架,要么無法與 Micrometer 一樣多的解決方案整合,要么更糟糕的是,不支持維度指標。 維度指標是指具有各種屬性(維度)的指標資料。 這些屬性可能包括與持續時間相關的屬性(開始和停止時間)、ID、附加到客戶端上下文的元資料、請求的區域、有關客戶端的資訊、有關正在調用的端點的資訊、主機、狀態碼等。這種程度的細節允許進行深入分析和查詢。 維度指標意味著更容易捕獲指標,並且更容易在以後以不可預見的方式深入研究指標。 雙贏!
你喜歡這種一目了然的方式嗎? 你學到任何東西了嗎? 與往常一樣,我很想收到你的來信,所以 請在 Twitter 上發聲 (@starbuxman) ! 我會帶著另一期 YMNNALFT 回來,所以請務必不要錯過。