Spring-Boot-Actuator集成Prometheus,Grafana

目录

  • Spring-Boot-Actuator集成Prometheus,Grafana
    • Spring-Boot-Actuator
    • Prometheus
      • 简介
      • 安装
    • Grafana
      • 简介
      • 安装
    • 示例代码

Spring-Boot-Actuator集成Prometheus,Grafana

Spring-Boot-Actuator

SpringBoot自带监控功能Actuator,可以帮助实现对程序内部运行情况监控,比如监控状况、Bean加载情况、环境变量、日志信息、线程信息、健康检查、审计、统计和HTTP追踪等

Actuator同时还可以与外部应用监控系统整合,比如Prometheus。可以选择使用HTTP端点或JMX来管理和监视应用程序。

Actuator使用Micrometer来整合上面提到的外部应用监控系统。这使得只要通过非常小的配置就可以集成任何应用监控系统。

Spring-Boot-Actuator官方文档

Prometheus

简介

Prometheus 是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,由工作在 SoundCloud 的 google 前员工在 2012 年创建,作为社区开源项目进行开发,并于 2015 年正式发布。2016 年,Prometheus 正式加入 Cloud Native Computing Foundation,成为受欢迎度仅次于 Kubernetes 的项目。

作为新一代的监控框架,Prometheus 具有以下特点:

  • 强大的多维度数据模型:

    1. 时间序列数据通过 metric 名和键值对来区分。
    2. 所有的 metrics 都可以设置任意的多维标签。
    3. 数据模型更随意,不需要刻意设置为以点分隔的字符串。
    4. 可以对数据模型进行聚合,切割和切片操作。
    5. 支持双精度浮点类型,标签可以设为全 unicode。
  • 灵活而强大的查询语句(PromQL):在同一个查询语句,可以对多个 metrics 进行乘法、加法、连接、取分数位等操作。

  • 易于管理: Prometheus server 是一个单独的二进制文件,可直接在本地工作,不依赖于分布式存储。

  • 高效:平均每个采样点仅占 3.5 bytes,且一个 Prometheus server 可以处理数百万的 metrics。

  • 使用 pull 模式采集时间序列数据,这样不仅有利于本机测试而且可以避免有问题的服务器推送坏的 metrics。

  • 可以采用 push gateway 的方式把时间序列数据推送至 Prometheus server 端。

  • 可以通过服务发现或者静态配置去获取监控的 targets。

  • 有多种可视化图形界面。

  • 易于伸缩。

需要指出的是,由于数据采集可能会有丢失,所以 Prometheus 不适用对采集数据要 100% 准确的情形。但如果用于记录时间序列数据,Prometheus 具有很大的查询优势,此外,Prometheus 适用于微服务的体系架构。

参考文章

安装

prometheus下载地址

# linux环境下的安装
# 1. 到官网里下载prometheus-2.19.2.linux-amd64.tar.gz
# 2. 解压  tar xvfz prometheus-2.19.2.linux-amd64.tar.gz
# 3. 重命名 mv prometheus-2.19.2.linux-amd64.tar.gz prometheus
# 4. 测试查看版本   ./prometheus --version 
# 5. 运行 ./prometheus --config.file=prometheus.yml

Spring-Boot-Actuator集成Prometheus,Grafana_第1张图片

Grafana

简介

Grafana是一个跨平台的开源的度量分析和可视化工具,可以通过将采集的数据查询然后可视化的展示,并及时通知。它主要有以下六大特点:

1、展示方式:快速灵活的客户端图表,面板插件有许多不同方式的可视化指标和日志,官方库中具有丰富的仪表盘插件,比如热图、折线图、图表等多种展示方式;

2、数据源:Graphite,InfluxDB,OpenTSDB,Prometheus,Elasticsearch,CloudWatch和KairosDB等;

3、通知提醒:以可视方式定义最重要指标的警报规则,Grafana将不断计算并发送通知,在数据达到阈值时通过Slack、PagerDuty等获得通知;

4、混合展示:在同一图表中混合使用不同的数据源,可以基于每个查询指定数据源,甚至自定义数据源;

5、注释:使用来自不同数据源的丰富事件注释图表,将鼠标悬停在事件上会显示完整的事件元数据和标记;

6、过滤器:Ad-hoc过滤器允许动态创建新的键/值过滤器,这些过滤器会自动应用于使用该数据源的所有查询。

安装

# 1. 建议国内镜像下载  https://www.newbe.pro/Mirrors/Mirrors-Grafana/
# 2. 选择7.0.5下载,下载完上传至Linux服务器,或者直接在linux服务器里执行
wget https://mirrors.huaweicloud.com/grafana/7.0.5/grafana-7.0.5-1.x86_64.rpm
# 3. sudo yum install grafana-7.0.5-1.x86_64.rpm
# 4. service grafana-server start web

示例代码

  • 新建maven项目

  • pom.xml

    <parent>
      <groupId>org.springframework.bootgroupId>
      <artifactId>spring-boot-starter-parentartifactId>
      <version>2.2.2.RELEASEversion>
      <relativePath/> 
    parent>
    
    <properties>
      <spring.boot.version>2.2.2.RELEASEspring.boot.version>
      <micrometer.version>1.5.2micrometer.version>
    properties>
    
    <dependencies>
      <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-webartifactId>
        <version>${spring.boot.version}version>
      dependency>
      <dependency>
        <groupId>org.springframework.bootgroupId>
        <artifactId>spring-boot-starter-actuatorartifactId>
        <version>${spring.boot.version}version>
      dependency>
      <dependency>
        <groupId>io.micrometergroupId>
        <artifactId>micrometer-registry-prometheusartifactId>
        <version>${micrometer.version}version>
      dependency>
    dependencies>
    
  • application.yaml

    server.port: 8088
    management.endpoints.web.exposure.include: '*'
    
  • ActuatorConfig.java

    @Configuration
    public class ActuatorConfig {
    
      @Bean
      MeterRegistryCustomizer<MeterRegistry> registryCustomizer(){
        return registry -> registry.config().commonTags("application","test");
      }
    
    }
    
  • ActuatorController.java

    @RestController
    public class ActuatorController {
    
      @GetMapping("/user/info/{id}")
      public ResponseEntity<Map<String, Object>> queryUserInfoById(@PathVariable("id") long id)
          throws InterruptedException {
        Map<String, Object> map = new HashMap<>();
        map.put("id", id);
        map.put("username", "shawn");
        map.put("realname", "shawn");
        map.put("age", 25);
        TimeUnit.SECONDS.sleep(2);
        return ResponseEntity.ok(map);
      }
    
      @GetMapping("/user/list")
      public ResponseEntity<List<Map<String, Object>>> listUser()
          throws InterruptedException {
        List<Map<String, Object>> list = new ArrayList<>();
        for (int i = 1; i <= 5; i++) {
          Map<String, Object> map = new HashMap<>();
          map.put("id", i);
          map.put("username", "shawn_" + i);
          map.put("realname", "shawn_" + i);
          map.put("age", 25 + i);
          list.add(map);
        }
        TimeUnit.SECONDS.sleep(2);
        return ResponseEntity.ok(list);
      }
    
    }
    
  • ActuatorApplication.java

    @SpringBootApplication
    public class ActuatorApplication {
    
      public static void main(String[] args) {
        SpringApplication.run(ActuatorApplication.class, args);
      }
    }
    
  • Test

curl -i http://localhost:8088/actuator/prometheus
curl -i http://localhost:8088/actuator/metrics
curl -i http://localhost:8088/actuator/metrics/http.server.requests
curl -i http://localhost:8088/user/info/1
curl -i http://localhost:8088/user/list
  • 集成Prometheus和Grafana

    • 进入Prometheus安装目录,修改Prometheus.yaml文件,添加如下配置

        - job_name: 'spring-actuator'
          metrics_path: '/actuator/prometheus'
          scrape_interval: 5s
          static_configs:
          - targets: ['193.168.1.104:8088']
      
    • 启动Prometheus。

      ./prometheus --config.file=prometheus.yml
      
    • 测试访问Prometheus

Spring-Boot-Actuator集成Prometheus,Grafana_第2张图片

  • 启动Grafana

    service grafana-server start web
    
  • 测试访问Grafana ,默认端口3000

  • 添加datasource: 选择设置图标中的Data Source,添加Prometheus的数据源,URL就填上面你给Prometheus Server设置的ip+端口号。并且需要导入Prometheus 2.0 Stats这个面板

  • 添加dashboard。

你可能感兴趣的:(spring-boot)