目前prometheus采集数据一般有两种方式,一种是采用第三方已经开发完成的各类集成exporter,去获取相关的指标(Metric)数据;一种是采用项目埋点的方式去自定义指标,然后通过prometheus去采集。大致情况如下:
- 第三方exporter
比如用node_exporter监控采集服务器CPU、内存、磁盘、I/O等信息,作为机器数据的通用采集,用mysqld_exporter监控数据库访问量、压力性能等指标,用memcached_exporter监控收集数据缓存系统的数据指标,用JMX_exporter采集Java虚拟机的数据信息等。
- 自定义Metric指标
在PHP项目/Java项目/Ngnix项目等中加入prometheus的自定义Metric指标的注册,采集等埋点工作,然后通过prometheus指定对应的拉取规则去采集。一般的对于Java程序中常用到的埋点方法有两种,一为结合切面(Aspect)/拦截器(Interceptor)技术实现对通用接口的数据采集,一为在特定业务接口中写入自定义Metric的注册-采集代码,单独为该业务统计采集指标数据。
下面就以linux系统环境(CentOS)中,node_exporter和Spring-boot埋点为例,大致介绍下这两种数据采集的使用方法,以及一些注意点:
- node_exporter监控linux系统
- 命令行安装node_exporter
//从github获取安装包
$ wget https://github.com/prometheus/node_exporter/releases/download/v0.14.0/node_exporter-0.14.0.linux-amd64.tar.gz
//解压
$ tar -zxvf node_exporter-0.14.0.linux-amd64.tar.gz
//移动到指定目录
$ mv node_exporter-0.14.0.linux-amd64 /usr/local/prometheus/node_exporter
- 创建Systemd服务
$ vim /etc/systemd/system/node_exporter.service
[Unit]
Description=node_exporter
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/prometheus/node_exporter/node_exporter
Restart=on-failure
[Install]
WantedBy=multi-user.target
- 启动/验证 node_exporter
//启动命令:
$ systemctl start node_exporter
//查询服务状态命令:
$ systemctl status node_exporter
● node_exporter.service - node_exporter
Loaded: loaded (/etc/systemd/system/node_exporter.service; disabled; vendor preset: enabled)
Active: active (running) since Mon 2017-05-22 12:13:43 CST; 6s ago
Main PID: 11776 (node_exporter)
Tasks: 4
Memory: 1.5M
CPU: 24ms
CGroup: /system.slice/node_exporter.service
└─11776 /usr/local/prometheus/node_exporter/node_exporter
若状态Active为active(running)则证明启动正常,若状态为inactive (dead)则说明服务未正常启动。
- 修改prometheus主程序配置文件,默认配置文件为prometheus.yml,需在scrape_configs中新增抓取对象‘linux’及对应的ip地址端口。
scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'linux' static_configs: - targets: ['localhost:9100']
在完成上述操作后,重启prometheus服务,可以看到一些采集到的数据曲线,如下:
当前主机CPU负载情况曲线:
注意点:node_exporter作为由第三方开发完成的exporter,在采集linux系统数据方面使用起来比较便利,但也存在代码开发不完善,与业务不匹配,指标采集数据冗余的缺点,这个可以通过对开源的exporter进行二次开发,对应的exporter配置修改相关配置,或者利用PromQL语句去剔除无用数据等方法去完善。
2. Spring-boot埋点 - 自定义数据指标Metric
prometheus提供的官方或第三方exporters,可以满足大部分prometheus用户对于基础业务的监控需求,其它情况下,我们还需要在应用中扩展Prometheus支持。即需要在监控对象程序中埋点抓取对应的监控指标数据,而目前常见的拦截器埋点方法如下所示:
- 增加配置项:
(1)在pom.xml中加入依赖配置
io.prometheus
simpleclient_spring_boot
0.1.0
io.prometheus
simpleclient_hotspot
0.1.0
io.prometheus
simpleclient_servlet
0.1.0
(2)在boot启动主程序类加注解配置:
(3)新增MonitoringConfig类用于prometheus服务接口的注册:
@Configuration
class MonitoringConfig {
@Bean
SpringBootMetricsCollector springBootMetricsCollector(Collection publicMetrics) {
SpringBootMetricsCollector springBootMetricsCollector = new
SpringBootMetricsCollector(publicMetrics);
springBootMetricsCollector.register();
return springBootMetricsCollector;
}
@Bean
ServletRegistrationBean servletRegistrationBean() {
DefaultExports.initialize();
return new ServletRegistrationBean(new MetricsServlet(), "/prometheus");
}
}
- 增加拦截器,定义注册Metric,采集数据
新增RequestCounterInterceptor类用于计数:
public class RequestCounterInterceptor extends HandlerInterceptorAdapter {
// @formatter:off
// Note (1)
private static final Counter requestTotal = Counter.build()
.name("cgt_requests_total")
.labelNames("method", "handler", "status")
.help("Http Request Total").register();
// @formatter:on
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception e)
throws Exception {
// Update counters
String handlerLabel = handler.toString();
// get short form of handler method name
if (handler instanceof HandlerMethod) {
Method method = ((HandlerMethod) handler).getMethod();
handlerLabel = method.getDeclaringClass().getSimpleName() + "." + method.getName();
}
// Note (2)
requestTotal.labels(request.getMethod(), handlerLabel,
Integer.toString(response.getStatus())).inc();
}
}
- 拦截器注册
@Configuration
public class MyWebConfig extends WebMvcConfigurerAdapter {
/**
* 注册 拦截器
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new RequestCounterInterceptor());
}
}
- 修改prometheus主程序配置文件prometheus.yml,增加新的抓取目标,比如:
在完成上述修改后,启动boot程序和prometheus程序,可以看到在访问boot程序接口时,统计到的访问接口请求数目的变化:
注意点:利用拦截器自定义Metric采集数据,一般是应用级别的监控采用的方法,同时可以在程序内增加方法级别的Metric定义埋点,去采集特定指标的指标数据。
另,对于boot程序,想要prometheus正常监控,需要再配置文件中加入一定配置允许程序暴露数据指标Metric和去除重复的Metric,如下:
//允许暴露metric给prometheus
management:
security:
enabled: false
//去掉spring自带的重复metric
spring:
metrics:
servo:
enabled: false
以上即为prometheus获取监控数据常用方法,后续若遇到新的知识点,也将持续更新。感谢阅读。