1 prometheus

prometheus普罗米修斯,收集监控数据并进行保存和简单的展示与查询的平台。采集是直接通过http接口和特定形式的返回值,而存储使用的是内置的TSDB(时序数据库),展示与查询提供了一个简单的页面,也可以通过grafana配合。

1.1 安装与配置介绍

官网提供了两种安装方式,通过docker或者直接下载二进制包

docker run \
    -p 9090:9090 \
    -v /tmp/prometheus.yml:/etc/prometheus/prometheus.yml \
    prom/prometheus

这里我们使用二进制包进行demo,下载后目录中有个prometheus.exe是启动文件,双击就可以启动,而prometheus.yaml是配置文件。

image

打开这个yaml文件,内容如下:

global:
  scrape_interval:     15s 
  evaluation_interval: 15s
alerting:
  alertmanagers:
  - static_configs:
    - targets:

rule_files:

scrape_configs:
  - job_name: 'prometheus'
    static_configs:
    - targets: ['localhost:9090']

配置主要有4部分:

可以通过http://localhost:9090/metrics可以看到符合prom规则的采集样例。 image
一般一行参数包含,指标名称 {指标标签} 指标值,中间的指标标签可没有。

1.2 SpringBoot2.x整合

创建SpringBoot项目,把web和actuator勾选上。添加prometheus依赖。

<dependency>
    <groupId>io.micrometer</groupId>
    <artifactId>micrometer-registry-prometheus</artifactId>
    <version>1.1.3</version>
</dependency>

注入bean:

@Bean
MeterRegistryCustomizer<MeterRegistry> configurer(@Value("${spring.application.name}") StringapplicationName) {
    return (registry) -> registry.config().commonTags("application", applicationName);
}

添加配置:

spring.application.name=springboot_prometheus
management.endpoints.web.exposure.include=*
management.metrics.tags.application=${spring.application.name}

第三行配置也可以不要。完成后启动应用,访问/actuator/prometheus image

此时我们只需要在prometheus.ymal中添加对这个项目的采集就可以了,在scrape_configs中追加一项job,添加后重新运行prom:

scrape_configs:
  #之前的保持不变追加下面这项job
  - job_name: 'springboot'
    metrics_path: /actuator/prometheus
    static_configs:
    - targets: ['localhost:8080']

此时我们可以在prom查询页面localhost:9090搜索当前spring应用的监控参数,可以通过参数名+标签,也可以单独用参数名或标签进行过滤查询: image

1.3 自定义监控

上面的监控是默认监控的一些系统基础参数,像gc、heap内存等,下面展示自定义参数。

例如添加filter来监控每个url入口的总请求次数:

@Component
public class PromFilter extends OncePerRequestFilter {
    @Autowired
    MeterRegistry registry;

    @Override
    protected void doFilterInternal(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, FilterChain filterChain) throws ServletException, IOException {
        Counter totalRequest = registry.counter("total_request","method", httpServletRequest.getMethod(),"path",httpServletRequest.getRequestURI());
        totalRequest.increment();

        doFilter(httpServletRequest,httpServletResponse,filterChain);
    }
}

demo工程放到了当前目录下/prom-test下了,可以自己参考。prom除了counter计数还有更灵活的gauge、timer。

2 grafana

 docker run -d --name=grafana -p 3000:3000 grafana/grafana

配置数据源为prometheus,然后配置为当前电脑ip:9090.就可以了。后面打dashboard随便加。