一、Metrics監控教程
Metrics是一種輕量級的度量框架,用於測量代碼中的各種指標。它可以度量JVM的Heap和非Heap內存使用情況、線程池參數、GC次數和持續時間、方法調用、請求當前線程等。通過將Metrics集成到應用程序中,我們可以度量應用程序的狀態及其性能,並以便於理解和可視化的方式展示給用戶。
Metrics提供了幾種度量類型,如計數器,直方圖,計時器和高斯分布度量等等。每個度量類型都有其自己的用途和實現。例如,計數器被用於度量數量,直方圖被用於測量分布,計時器被用於測量持續時間。Metrics能夠將數據發送到不同的目的地,如JMX,日誌記錄,Graphite和其他系統。
下面是一個使用Metrics的簡單示例:
“`
import com.codahale.metrics.Counter;
import com.codahale.metrics.ConsoleReporter;
import com.codahale.metrics.MetricRegistry;
import java.util.concurrent.TimeUnit;
public class TestMetrics {
static final MetricRegistry metrics = new MetricRegistry();
private static final Counter successJobCounter = metrics.counter(“success.jobs.count”);
public static void main(String[] args) throws Exception{
ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
reporter.start(1, TimeUnit.SECONDS);
while(true){
Thread.sleep(1000);
successJobCounter.inc();
}
}
}
“`
在上面的示例中,我們首先導入了Metrics的必要類。然後創建一個MetricRegistry實例和一個計數器實例successJobCounter。我們使用ConsoleReporter實例來定期將度量數據輸出到控制台。最後在死循環中,我們逐個增加計數器successJobCounter的值。
二、Metrics監控JVM指標
Metrics提供了許多度量JVM指標的實現,例如內存使用情況、GC狀態、線程池參數等。下面是一個例子,同時度量了對內存的使用情況和GC耗時:
“`
import com.codahale.metrics.ConsoleReporter;
import com.codahale.metrics.Gauge;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.jvm.BufferPoolMetricSet;
import com.codahale.metrics.jvm.GarbageCollectorMetricSet;
import com.codahale.metrics.jvm.MemoryUsageGaugeSet;
import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class TestJVMMetrics {
static final MetricRegistry metrics = new MetricRegistry();
public static void main(String[] args) throws Exception{
ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
reporter.start(1, TimeUnit.SECONDS);
metrics.registerAll(new MemoryUsageGaugeSet());
metrics.registerAll(new GarbageCollectorMetricSet());
metrics.registerAll(new BufferPoolMetricSet());
while(true){
Thread.sleep(1000);
}
}
}
“`
在上面的示例中,我們導入了必要的類以測量JVM指標。程序通過構造ConsoleReporter實例並將MetricRegistry註冊到其中來執行報告邏輯。我們使用registerAll()方法將幾個度量對象註冊到MetricRegistry中。最後,在無限循環中,程序每秒鐘休眠1秒。
三、Metrics監控 缺陷
Metrics監控在使用時可能存在一些問題,下面我們將說明幾個常見的問題:
1. 內存泄漏
Metrics度量周期性地生成新對象,並定期將這些對象傳遞給JMX Reporter以進行報告。這些對象在進行度量時會消耗一定內存。如果我們不小心地在每個周期結束時未釋放對象,則可能會導致內存泄漏。
2. 延遲和負載問題
在非常繁忙的系統中,Metrics可能會增加一些延遲和負載。這是因為度量模板可能需要較長時間來完成,以及避免在高負載時進行阻止的線程安全問題。我們需要了解系統的負載級別,以便理解Metrics如何影響它。
3. 精度問題
Metrics提供了許多度量類型,包括計數器、直方圖、計時器和高斯分布度量等。每個度量類型都有自己的用途和實現。但是,在某些情況下,我們需要注意精度問題。例如,當計數器向多個線程發出調用並同時增加值時,可能發生增加次數不精確的情況。
四、Metrics監控JVM指標 Splunk
可以將Metrics度量數據發送到不同的目的地,例如JMX、Graphite和Splunk等。Splunk是一種收集、索引和可視化數據的流行工具,可以將Metrics數據實時傳輸到Splunk平台以進行分析。
下面是一個將Metrics數據發送到Splunk的例子:
“`
import com.codahale.metrics.ConsoleReporter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.jvm.MemoryUsageGaugeSet;
import com.codahale.metrics.jvm.ThreadStatesGaugeSet;
import org.slf4j.LoggerFactory;
import org.slf4j.Logger;
import org.slf4j.MDC;
import com.splunk.*;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
public class TestSplunkMetrics {
static final MetricRegistry metrics = new MetricRegistry();
private static final Logger logger = LoggerFactory.getLogger(TestSplunkMetrics.class);
public static void main(String[] args) throws Exception{
Properties props = new Properties();
props.load(TestSplunkMetrics.class.getResourceAsStream(“/splunk.properties”));
SplunkDestination destination = SplunkDestination.create(props);
ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.filter(new SplunkFilter())
.build();
reporter.start(1, TimeUnit.SECONDS);
metrics.registerAll(new MemoryUsageGaugeSet());
metrics.registerAll(new ThreadStatesGaugeSet());
while(true){
MDC.put(“app.name”, “TestSplunkMetrics”);
try{
Thread.sleep(1000);
}catch(Exception e){ }
logger.info(“testing”);
MDC.remove(“app.name”);
}
}
}
“`
在上面的示例中,我們採用了Splunk的Java SDK,並且創建了一個SplunkDestination實例。console reporter仍然被用來周期性地列印Metrics監控值。在註冊MemoryUsageGaugeSet、ThreadStatesGaugeSet和logger實例之後,在死循環中的日誌記錄器會寫一條記錄,將接收的消息傳輸到Splunk伺服器。
五、Metrics監控介面流量
Metrics提供了一些庫用於度量和處理HTTP的度量數據。下面是一個使用Metrics監控REST Api流量的例子:
“`
import com.codahale.metrics.Counter;
import com.codahale.metrics.ConsoleReporter;
import com.codahale.metrics.Meter;
import com.codahale.metrics.MetricRegistry;
import com.codahale.metrics.Timer;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletContextHandler;
import org.eclipse.jetty.servlet.ServletHolder;
import java.util.concurrent.TimeUnit;
public class TestMetricsHTTP {
static final MetricRegistry metrics = new MetricRegistry();
private static final Counter successCounter = metrics.counter(“success.hits.count”);
private static final Counter failureCounter = metrics.counter(“failure.hits.count”);
private static final Meter requestsMeter = metrics.meter(“requests.count”);
private static final Timer responseTimer = metrics.timer(“response.time”);
public static void main(String[] args) throws Exception{
ConsoleReporter reporter = ConsoleReporter.forRegistry(metrics)
.convertRatesTo(TimeUnit.SECONDS)
.convertDurationsTo(TimeUnit.MILLISECONDS)
.build();
reporter.start(1, TimeUnit.SECONDS);
ServletContextHandler context = new ServletContextHandler(ServletContextHandler.SESSIONS);
context.setContextPath(“/”);
Server jettyServer = new Server(8080);
jettyServer.setHandler(context);
ServletHolder jerseyServlet = context.addServlet(org.glassfish.jersey.servlet.ServletContainer.class, “/*”);
jerseyServlet.setInitOrder(0);
jerseyServlet.setInitParameter(“jersey.config.server.provider.packages”, “com.test”);
try {
jettyServer.start();
jettyServer.join();
} catch (Exception e) {
e.printStackTrace();
} finally {
jettyServer.destroy();
}
}
}
“`
在上面的示例中,我們從MetricsRegistry中實例化了Counter、Meter和Timer。Counter被用於計算成功或失敗的請求數,Meter被用於計算每秒鐘的請求次數,Timer被用於測量請求的響應時間。
在Jetty HTTP伺服器中,Metrics數據就可以收集了。Jetty將HTTP請求按照REST參數路由到相應的REST端點,並在相應的REST端點中實現Metrics數據。例如,以下是一個簡單的REST端點:
“`
import com.codahale.metrics.annotation.Metered;
import com.codahale.metrics.annotation.Timed;
import javax.ws.rs.*;
@Path(“/”)
public class MetricRESTApi {
@GET
@Path(“/test”)
@Metered
@Timed
public void test() {
TestMetricsHTTP.requestsMeter.mark();
TestMetricsHTTP.responseTimer.time();
TestMetricsHTTP.successCounter.inc();
}
}
“`
在上面的示例中,我們使用了Metrics注釋。Metered和Timed注釋都被用來標記方法以收集Metrics監控信息。
六、Metric監控
Metric監控用於度量應用程序和操作系統的度量信息,例如CPU使用率、內存使用率、磁碟空間使用率等。Metric監控使用許多API和框架來幫助我們收集和處理監控信息,並將其可視化成有用的圖表和報告。
下面是一個使用Micrometer庫將Metrics數據發送到Graphite的例子:
“`
import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import io.micrometer.core.instrument.Timer;
import io.micrometer.graphite.GraphiteConfig;
import io.micrometer.graphite.GraphiteMeterRegistry;
import java.time.Duration;
import java.util.concurrent.TimeUnit;
public class TestMicrometerMetrics {
static final MeterRegistry registry = new GraphiteMeterRegistry(
GraphiteConfig.builder()
.host(“localhost”)
.port(2003)
.prefix(“test”)
.build(),
Clock.SYSTEM
);
private final Counter successCounter = registry.counter(“success.hits.count”);
private final Counter failureCounter = registry.counter(“failure.hits.count”);
private final Timer responseTimer = Timer.builder(“response.time”)
.publishPercentileHistogram()
.sla(Duration.ofMillis(500), Duration.ofMillis(700))
.register(registry);
public static void main(String[] args) throws Exception{
while(true){
Thread.sleep(1000);
TestMicrometerMetrics testMicrometerMetrics = new TestMicrometerMetrics();
testMicrometerMetrics.handleRequest();
}
}
public void handleRequest(){
try {
Timer.Sample sample = Timer.start(registry);
// 處理請求
sample.stop(responseTimer);
successCounter.increment();
} catch (RuntimeException e) {
failureCounter.increment();
}
}
}
“`
在上面的示例中,我們使用Micrometer庫將Metrics數據發送到Graphite。我們將Counter添加到MeterRegistry中,以便度量計數器類型的metric。我們還創建了一個Timer對象用於測量請求響應時間,並添加到MeterRegistry中。
七、Prometheus監控 Metrics值選取
Prometheus是一種開源監控系統,可用於收集和處理度量數據。Prometheus使用拉模型,而不是被動接收推模型。該系統可以處理大量的監控數據,並對未來由新的監控數據生成簡單、可視化的數據。
下面是一個採用Prometheus監控API中的Meter樣本選取的Metrics值的例子:
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/183909.html