Prometheus实践 - 集成exporter/项目埋点

       目前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埋点为例,大致介绍下这两种数据采集的使用方法,以及一些注意点:

  1. 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负载情况曲线:

            112424_45Uc_3293263.png

        注意点:node_exporter作为由第三方开发完成的exporter,在采集linux系统数据方面使用起来比较便利,但也存在代码开发不完善,与业务不匹配,指标采集数据冗余的缺点,这个可以通过对开源的exporter进行二次开发,对应的exporter配置修改相关配置,或者利用PromQL语句去剔除无用数据等方法去完善。

     2. Spring-boot埋点 - 自定义数据指标Metric

        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启动主程序类加注解配置:

            135533_nkEX_3293263.png

        (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");
    }
}
  •  增加拦截器,定义注册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,增加新的抓取目标,比如:

                                140216_0nQq_3293263.png

        在完成上述修改后,启动boot程序和prometheus程序,可以看到在访问boot程序接口时,统计到的访问接口请求数目的变化:

            140348_8kRn_3293263.png

        注意点:利用拦截器自定义Metric采集数据,一般是应用级别的监控采用的方法,同时可以在程序内增加方法级别的Metric定义埋点,去采集特定指标的指标数据。

        另,对于boot程序,想要prometheus正常监控,需要再配置文件中加入一定配置允许程序暴露数据指标Metric和去除重复的Metric,如下:

//允许暴露metric给prometheus
management:
  security:
    enabled: false

//去掉spring自带的重复metric
spring:
    metrics:
     servo:
       enabled: false

        以上即为prometheus获取监控数据常用方法,后续若遇到新的知识点,也将持续更新。感谢阅读。

转载于:https://my.oschina.net/u/3293263/blog/1631000

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值