目前prometheus采集数据通常有两种方式,一种是采用第三方已经开发完成的各种集成exporter,去获取相关的指标(Metric)数据;一种是采用项目埋点的方式去自定义指标,而后经过prometheus去采集。大体状况以下:node
好比用node_exporter监控采集服务器CPU、内存、磁盘、I/O等信息,做为机器数据的通用采集,用mysqld_exporter监控数据库访问量、压力性能等指标,用memcached_exporter监控收集数据缓存系统的数据指标,用JMX_exporter采集Java虚拟机的数据信息等。mysql
在PHP项目/Java项目/Ngnix项目等中加入prometheus的自定义Metric指标的注册,采集等埋点工做,而后经过prometheus指定对应的拉取规则去采集。通常的对于Java程序中经常使用到的埋点方法有两种,一为结合切面(Aspect)/拦截器(Interceptor)技术实现对通用接口的数据采集,一为在特定业务接口中写入自定义Metric的注册-采集代码,单独为该业务统计采集指标数据。linux
下面就以linux系统环境(CentOS)中,node_exporter和Spring-boot埋点为例,大体介绍下这两种数据采集的使用方法,以及一些注意点:git
//从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
$ 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
//启动命令: $ 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)则说明服务未正常启动。github
scrape_configs: - job_name: 'prometheus' static_configs: - targets: ['localhost:9090'] - job_name: 'linux' static_configs: - targets: ['localhost:9100']
在完成上述操做后,重启prometheus服务,能够看到一些采集到的数据曲线,以下:spring
当前主机CPU负载状况曲线:sql
注意点:node_exporter做为由第三方开发完成的exporter,在采集linux系统数据方面使用起来比较便利,但也存在代码开发不完善,与业务不匹配,指标采集数据冗余的缺点,这个能够经过对开源的exporter进行二次开发,对应的exporter配置修改相关配置,或者利用PromQL语句去剔除无用数据等方法去完善。数据库
2. Spring-boot埋点 - 自定义数据指标Metricvim
prometheus提供的官方或第三方exporters,能够知足大部分prometheus用户对于基础业务的监控需求,其它状况下,咱们还须要在应用中扩展Prometheus支持。即须要在监控对象程序中埋点抓取对应的监控指标数据,而目前常见的拦截器埋点方法以下所示:缓存
(1)在pom.xml中加入依赖配置
<!-- Exposition spring_boot --> <dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient_spring_boot</artifactId> <version>0.1.0</version> </dependency> <!-- Hotspot JVM metrics --> <dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient_hotspot</artifactId> <version>0.1.0</version> </dependency> <!-- Exposition servlet --> <dependency> <groupId>io.prometheus</groupId> <artifactId>simpleclient_servlet</artifactId> <version>0.1.0</version> </dependency>
(2)在boot启动主程序类加注解配置:
(3)新增MonitoringConfig类用于prometheus服务接口的注册:
@Configuration class MonitoringConfig { @Bean SpringBootMetricsCollector springBootMetricsCollector(Collection<PublicMetrics> publicMetrics) { SpringBootMetricsCollector springBootMetricsCollector = new SpringBootMetricsCollector(publicMetrics); springBootMetricsCollector.register(); return springBootMetricsCollector; } @Bean ServletRegistrationBean servletRegistrationBean() { DefaultExports.initialize(); return new ServletRegistrationBean(new MetricsServlet(), "/prometheus"); } }
新增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()); } }
在完成上述修改后,启动boot程序和prometheus程序,能够看到在访问boot程序接口时,统计到的访问接口请求数目的变化:
注意点:利用拦截器自定义Metric采集数据,通常是应用级别的监控采用的方法,同时能够在程序内增长方法级别的Metric定义埋点,去采集特定指标的指标数据。
另,对于boot程序,想要prometheus正常监控,须要再配置文件中加入必定配置容许程序暴露数据指标Metric和去除重复的Metric,以下:
//容许暴露metric给prometheus management: security: enabled: false //去掉spring自带的重复metric spring: metrics: servo: enabled: false
以上即为prometheus获取监控数据经常使用方法,后续若遇到新的知识点,也将持续更新。感谢阅读。