前言
使用io.prometheus.simpleclient系列0.9.0包完成对java应用的监控,但由于该版本simpleclient_spring_boot使用的spring-boot1.5.4,并引用了其中的org.springframework.boot.actuate.endpoint包,该包在2.X版本中被大改,所以在springboot2.X应用中不适用。
引入
<!-- prometheus -->
<!-- Hotspot JVM metrics-->
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_hotspot</artifactId>
<version>0.9.0</version>
</dependency>
<!-- Exposition servlet -->
<dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_servlet</artifactId>
<version>0.9.0</version>
</dependency>
代码示例
启动该client中包含默认的jvm监控,并注册Servlet即可成功接入,“/metrics”是默认路由,可改为其他并在promecheus.yml中添加相应配置即可。
@Configuration
public class MonitoringConfig {
/**
* 注册新的servlet
*
* @return servletBean
*/
@Bean
ServletRegistrationBean<MetricsServlet> servletRegistrationBean() {
//打开prometheus JVM所有监控参数
DefaultExports.initialize();
//自定义的export
new UserExports().register(CollectorRegistry.defaultRegistry);
MetricsServlet metricsServlet = new MetricsServlet();
return new ServletRegistrationBean<>(metricsServlet, "/metrics");
}
}
initialize()方法源码,即在一个final的对象内添加exports,这样即可让MetricsServlet读取。
/**
* Register the default Hotspot collectors with the default
* registry. It is safe to call this method multiple times, as
* this will only register the collectors once.
*/
public static synchronized void initialize() {
if (!initialized) {
register(CollectorRegistry.defaultRegistry);
initialized = true;
}
}
/**
* Register the default Hotspot collectors with the given registry.
*/
public static void register(CollectorRegistry registry) {
new StandardExports().register(registry);
new MemoryPoolsExports().register(registry);
new MemoryAllocationExports().register(registry);
new BufferPoolsExports().register(registry);
new GarbageCollectorExports().register(registry);
new ThreadExports().register(registry);
new ClassLoadingExports().register(registry);
new VersionInfoExports().register(registry);
}
由此可以写自定义的exports,并注册即可添加自定义监控指标
public class UserExports extends Collector {
private void addUserMetrics(List<MetricFamilySamples> sampleFamilies) {
sampleFamilies.add(new CounterMetricFamily(
"user_register_count",
"The count of user that are register",
UserMonitor.registerNum()));
}
@Override
public List<MetricFamilySamples> collect() {
List<MetricFamilySamples> mfs = new ArrayList<>();
addUserMetrics(mfs);
return mfs;
}
}