Loading...
墨滴

一灰

2021/04/21  阅读:182  主题:橙心

SpringBoot整合Promethues实现应用监控

【中间件】SpringBoot 整合 Prometheus 实现应用监控

1. prometheus 安装

教程文档: https://www.prometheus.wang/quickstart/install-prometheus-server.html

1.1 什么是 Prometheus

普罗米修斯:Prometheus 是一个开放性的监控解决方案,用户可以非常方便的安装和使用 Prometheus 并且能够非常方便的对其进行扩展

下面将实现一个 SpringBoot 应用接入 Prometheus 的全过程

1.2 安装

Linux 安装

  • 官网指定下载包: https://prometheus.io/download/

下载本地安装启动

wget https://github.com/prometheus/prometheus/releases/download/v2.26.0/prometheus-2.26.0.linux-amd64.tar.gz

tar -zxvf prometheus-2.26.0.linux-amd64.tar.gz
cd prometheus-2.26.0.linux-amd64

# 启动命令
./prometheus

启动完毕之后,本地访问 http://127.0.0.1:9090/graph 可以看到默认提供的界面

2. SpringBoot 应用接入

我们演示的 SpringBoot 为 2.0+,因此直接选择io.micrometer 的依赖包来实现;更低版本的不能使用这种姿势,可以直接使用官方提供的 client 来实现;这里不进行扩展

2.1 依赖配置

借助 SpringBoot 的 actuator 来提供扩展端点(所以本文采用的是 Prometheus 的拉工作模式)

SpringBoot 版本为 2.2.1.RELEASE

核心依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

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

yaml 配置文件,需要指定 Prometheus 相关的参数,一个 demo 如下

spring:
  application:
    name: prometheus-example
management:
  endpoints:
    web:
      exposure:
        include: "*"
  metrics:
    tags:
      application: ${spring.application.name}

注意

  • management.endpoints.web.exposure.include 这里指定所有的 web 接口都会上报
  • metrics.tags.application 这个应用所有上报的 metrics 都会带上application这个标签

上面配置完毕之后,会提供一个 /actuator/prometheus的端点,供 prometheus 来拉取 Metrics 信息

2.2 应用启动

对于 SpringBoot 而言,此时就不需要额外做什么,就可以实现应用的基本信息上报了

一个简单的 demo 如下

@RestController
@SpringBootApplication
public class Application {
    private Random random = new Random();

    // 一个用于演示的http接口
    @GetMapping(path = "hello")
    public String hello(String name) {
        int sleep = random.nextInt(200);
        try {
            Thread.sleep(sleep);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return "hello sleep: " + sleep + " for " + name;
    }

    public static void main(String[] args) {
        SpringApplication.run(Application.class);
    }

    // 注意,这个是注册的核心代码块
    @Bean
    MeterRegistryCustomizer<MeterRegistry> configurer(@Value("${spring.application.name}") String applicationName) {
        return (registry) -> registry.config().commonTags("application", applicationName);
    }
}

到此,springboot 应用的监控就算是完成了;接下来配置一下 prometheus 的服务端

3. prometheus 配置与实测

在前面下载的包下面,有一个配置文件 prometheus.yml,新增一个 Job

  - job_name: 'prometheus-example'
   # 抓取频率
    scrape_interval: 5s
    # 抓取的端点
    metrics_path: '/actuator/prometheus'
    static_configs:
     # 目标机器,数组,也就是说支持集群拉取
      - targets: ['127.0.0.1:8080']

修改配置之后,需要重启一下,当服务启动之后,可以在控制台上我们的应用信息

接下来访问 Graph,选择 metric: http_server_requests_seconds_count 可以看到一条抓起 metric 的记录

前面我们定义了一个 Controller,接下来简单访问几次,然后再看一下,会发现多一条记录

这些数据由框架层直接集成,实现 REST 接口的相关信息上报,借助这个 metric,我们可以实现 qps 的统计

3.1 qps 统计

sum(rate(http_server_requests_seconds_count{application="prometheus-example"}[10s]))
  • rate: 用于统计增长趋势,要求上报的 Metric 为 Counter 类型(只增不减)
  • irate: 与 rate 相似,区别在于 rate 统计的是一段时间内的平均增长速率,无法反应这个时间窗口内的突发情况(即瞬时高峰),irate 通过区间向量中最后两个样本数据来计算增长速率,但是当选用的区间范围较大时,可能造成不小的偏差
  • sum: 求和,适用于统计场景

更多内置函数,可以参考: PromQL 内置函数

3.2 耗时统计

除了 qps,另外一个经常关注的指标就是 rt 了,如上面接口的平均 rt,通过两个 Metric 的组合来实现

sum(rate(http_server_requests_seconds_sum{application="prometheus-example"}[10s])) / sum(rate(http_server_requests_seconds_count{application="prometheus-example"}[10s]))

将 sum 聚合去掉之后,则可以看到各接口的访问情况

4. Grafana 大盘配置

面板监控,还是 Grafana 的比较强大,特别是 grafana 本身提供了很多模板可以直接导入

安装可以参考: 210318-linux grafana 大盘接入 mysql

4.1 大盘配置

grafana 启动之后,配置数据源 Promethues

接下来配置 SpringBoot 的应用配置面板,可以直接使用现成的模板,比如 12856

导入完毕之后,大盘展示如下

可以看一下请求耗时的统计 promql

4.2 大盘模板哪里找

如何找直接可用的大盘呢?

  • 官网的大盘上查找即可
  • 如 https://grafana.com/grafana/dashboards?dataSource=prometheus&search=spring
  • 选择一个,点进去之后,右边的Copy ID toClipboard 对应的数字就是我们需要的

5. 小结

上面整个流程走下来会发现 SpringBoot 项目接入 Prometheus 成本很低,基本上没有太多的编码工作,就可以配置给功能集全的监控大盘,简直不要太嗨

高度封装的便捷性再这里体现得非常突出了,但是搞完之后,再回想一下,我 get 到了什么?

好像什么都没 get 到,如果我的服务只提供 grpc/dubbo 接口,现在假设让我们接入监控,好像还是抓瞎,这该怎么玩

下一篇博文将带来更多的Promethues的知识点以及如何实现一般的信息收集上报

II. 其他

0. 项目

1. 一灰灰 Blog

尽信书则不如,以上内容,纯属一家之言,因个人能力有限,难免有疏漏和错误之处,如发现 bug 或者有更好的建议,欢迎批评指正,不吝感激

下面一灰灰的个人博客,记录所有学习和工作中的博文,欢迎大家前去逛逛

一灰灰blog
一灰灰blog

一灰

2021/04/21  阅读:182  主题:橙心

作者介绍

一灰