prometheus是目前很火的监控系统,其本质上来说是一个时间序列数据库(TSDB),采用golang开发,支持多维度(标签),采用拉取模式,以丰富的export,完善的生态成为目前社区内的监控标配。
这篇文章不说别的,只说java客户端如何埋点。
推荐大家看官方文档:https://github.com/prometheus/client_java
compile 'io.prometheus:simpleclient:0.5.0'
compile 'io.prometheus:simpleclient_hotspot:0.5.0'
compile 'io.prometheus:simpleclient_servlet:0.5.0'
compile 'io.prometheus:simpleclient_pushgateway:0.5.0'
compile 'io.prometheus:simpleclient_spring_web:0.5.0'
compile group: 'io.prometheus', name: 'simpleclient_spring_boot', version: '0.5.0'
如果是spring mvc项目:
<servlet>
<servlet-name>MetricsServlet</servlet-name>
<servlet-class>io.prometheus.client.exporter.MetricsServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MetricsServlet</servlet-name>
<url-pattern>/prometheus</url-pattern>
</servlet-mapping>
如果是springboot项目:
在application.java入口类中加入注解@EnablePrometheusEndpoint
@SpringBootApplication
@EnablePrometheusEndpoint
public class SpringbootdemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootdemoApplication.class, args);
}
}
注意,如果有shiro或者openidFilter等拦截,需要将/prometheus加入到开放列表中
在服务器启动类中增加如下代码,则打开了JVM监控参数
DefaultExports.initialize();
prometheus支持四种数据结构的监控:
//Count的用法
public final static Counter httpRequestsTotal = Counter.build()
.name("http_requests_total")
.help("Total number of http requests by response status code")
.labelNames("标签1", "标签2")
.register();
public void doCount(){
//增加
httpRequestsTotal.labels("标签1", "标签2").inc();
//业务代码....
}
//仪表盘的用法
public final static Gauge gauge = Gauge.build()
.name("thread_num")
.help("线程池激活数")
.labelNames("标签1", "标签2")
.register();
public void doGauge(){
//增加
gauge.labels("标签1", "标签2").inc();
//减少
gauge.labels("标签1", "标签2").dec();
}
//直方图的用法
public final static Histogram httpRequestDurationMs = Histogram.build()
.name("http_request_duration_milliseconds")
.help("Http request latency histogram")
.exponentialBuckets(25, 2, 7)
.labelNames("标签1", "标签2")
.register();
public void doHistogram(){
//第一种写法,使用计时器计算延迟
//声明timer
Histogram.Timer timer = httpRequestDurationMs.labels("标签1", "标签2").startTimer();
//业务代码....
//计时结束
timer.observeDuration();
//第二种写法:直接记录值
//业务代码....
httpRequestDurationMs.labels("标签1", "标签2").observe(10);
}
//总计的用法
public final static Summary summary = Summary.build()
.name("http_request_duration_milliseconds")
.help("Http request latency histogram")
.labelNames("标签1", "标签2")
.register();
public void doSummary(){
//第一种写法,使用计时器计算延迟
//声明timer
Summary.Timer timer = summary.labels("标签1", "标签2").startTimer();
//计时结束
timer.observeDuration();
//第二种写法:直接记录值
summary.labels("标签1", "标签2").observe(10);
}
访问http://yourapplication/prometheus,有如下类似数据返回即为埋点成功