Metrics埋點監控
在應用程式中,通常會記錄日志以便事後分析,在很多情況下是産生了問題之後,再去檢視日志,是一種事後的靜态分析。在很多時候,我們可能需要了解整個系統在目前,或者某一時刻運作的情況,比如一個系統背景服務,我們可能需要了解一些實時監控的資料例如
1、每秒鐘的請求數是多少(TPS)?
2、平均每個請求處理的時間?
3、請求處理的最長耗時?
4.請求處理的響應的直方圖?
5、請求處理正确響應率?
6、等待處理的請求隊列長度?
7、檢視整個系統的的CPU使用率、記憶體占用、jvm運作情況;以及系統運作出錯率等等一系列的實時資料采集時,最簡單的方法就是在系統的入口、出口和關鍵位置設定埋點,然後将采集到的資訊發送到實時監控平台或者存入到緩存和DB中做進一步的分析和展示。
Metrics提供5種基本的度量類型:
Meters
是一種隻能自增的計數器,通常用來度量一系列事件發生的機率。它提供了平均速率,以及指數平滑平均速率,以及采樣後的1分鐘,5分鐘,15分鐘的樣例。
Gauges
Gauge是一個最簡單的計量,一般用來統計瞬時狀态的資料資訊
RatioGauge
作用:度量事件成功率的計算。 例:度量緩存命中率、接口調用率等等。
Counters
Counter是Gauge的一個特例,維護一個計數器,可以通過inc()和dec()方法對計數器做修改。使用步驟與Gauge基本類似,在MetricRegistry中提供了靜态方法可以直接執行個體化一個Counter。可以用來度量生産者和消費者之間的關系
Histograms
主要使用來統計資料的分布情況, 最大值、最小值、平均值、中位數,百分比(75%、90%、95%、98%、99%和99.9%)。
例如,需要統計某個頁面的請求、接口方法請求的響應時間
Timers
作用:統計請求的速率和處理時間
例如:某接口的總在一定時間内的請求總數,平均處理時間
HealthChecks
作用:健康檢查,用于對系統應用、子子產品、關聯子產品的運作是否正常做檢測
實作過程:
類A:繼承 HealthCheck ,并重寫check()方法 ,在check()中調用類B中的被檢測方法
類B:定義一個方法,傳回結果是boolean類型。(類B也可以是其它系統中的一個類)
在日志中列印
public static void main(String[] args) throws InterruptedException {
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);
Slf4jReporter report = Slf4jReporter.forRegistry(registry) //
.prefixedWith("region_") //
.withLoggingLevel(Slf4jReporter.LoggingLevel.INFO) //
.outputTo(LoggerFactory.getLogger(MetricsTest.class)) //
.scheduleOn(scheduler) //
.shutdownExecutorOnStop(scheduler != null) //
.build();
report.start(5, TimeUnit.SECONDS);
Random r = new Random();
while (true) {
processHandle(r.nextDouble());
Thread.sleep(100);
}
}