集成 Prometheus 与 Grafana 构建 Spring Boot 监控体系

集成 Prometheus 与 Grafana 构建 Spring Boot 监控体系:让你的程序不再裸奔

各位程序猿/媛们,大家好!今天咱们来聊聊一个非常重要,但又常常被忽视的话题:Spring Boot 应用的监控。你的程序是不是像一个没穿衣服的孩子,赤裸裸地暴露在互联网的枪林弹雨中?出了问题,你只能靠玄学调试,疯狂打 System.out.println

别慌!今天我们就来给它穿上盔甲,打造一套坚固的监控体系,让你的程序不再裸奔!这套盔甲的名字就叫 Prometheus + Grafana

为什么要监控?

想象一下,你开着一辆跑车,风驰电掣。突然,仪表盘上的机油灯亮了!如果你没有仪表盘,你可能要等到发动机彻底报废,才能意识到问题。监控就像是程序的仪表盘,它可以让你实时了解程序的健康状况,及时发现并解决问题。

具体来说,监控可以帮助你:

  • 及时发现问题: 在问题影响用户之前,迅速定位并解决。
  • 提高系统可用性: 通过监控,提前发现潜在的风险,避免系统崩溃。
  • 优化系统性能: 分析监控数据,找出性能瓶颈,进行优化。
  • 更好地理解用户行为: 了解用户的使用习惯,优化产品体验。

Prometheus 和 Grafana 是什么?

  • Prometheus: 一个开源的系统监控和警报工具包。它像一个勤劳的“数据采集员”,定期从你的程序中抓取各种指标数据,并存储起来。
  • Grafana: 一个开源的数据可视化平台。它可以将 Prometheus 采集到的数据,以各种图表的形式展示出来,让你一目了然地了解程序的运行状态。它就像一个漂亮的“仪表盘”,让你实时掌控全局。

准备工作

在开始之前,你需要准备以下环境:

安装过程比较简单,此处不做赘述,请自行查阅相关文档。

第一步:让 Spring Boot 应用暴露 Metrics 指标

我们需要让 Spring Boot 应用暴露一些 Metrics 指标,以便 Prometheus 可以抓取。我们可以使用 Spring Boot Actuator 来实现这个目标。

  1. 添加依赖:

    在你的 pom.xml 文件中添加以下依赖:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-registry-prometheus</artifactId>
        <scope>runtime</scope>
    </dependency>
    • spring-boot-starter-actuator:提供了 Spring Boot Actuator 的基本功能,例如健康检查、Metrics 指标等。
    • micrometer-registry-prometheus:将 Metrics 指标暴露给 Prometheus。
  2. 配置 Actuator:

    在你的 application.propertiesapplication.yml 文件中添加以下配置:

    management:
      endpoints:
        web:
          exposure:
            include: prometheus,health,info
      metrics:
        export:
          prometheus:
            enabled: true
    • management.endpoints.web.exposure.include:指定要暴露的 Actuator 端点,这里我们暴露了 prometheushealthinfo 三个端点。
    • management.metrics.export.prometheus.enabled:启用 Prometheus 指标导出。
  3. 启动应用:

    启动你的 Spring Boot 应用。

  4. 验证 Metrics 端点:

    在浏览器中访问 http://localhost:8080/actuator/prometheus (假设你的应用运行在 8080 端口),你应该能看到一堆 Prometheus 指标数据。如果看到了,恭喜你,第一步成功了!

第二步:配置 Prometheus 抓取 Metrics 指标

我们需要配置 Prometheus,让它定期抓取 Spring Boot 应用暴露的 Metrics 指标。

  1. 修改 Prometheus 配置文件:

    找到 Prometheus 的配置文件 prometheus.yml (一般在 Prometheus 安装目录下),添加以下配置:

    scrape_configs:
      - job_name: 'spring-boot-app'
        metrics_path: '/actuator/prometheus'
        scrape_interval: 5s
        static_configs:
          - targets: ['localhost:8080']
    • job_name:任务名称,可以自定义。
    • metrics_path:Metrics 指标的路径,这里我们配置为 /actuator/prometheus
    • scrape_interval:抓取数据的间隔,这里我们配置为 5 秒。
    • static_configs:静态配置,指定要抓取的目标地址,这里我们配置为 localhost:8080
  2. 重启 Prometheus:

    保存配置文件后,重启 Prometheus。

  3. 验证 Prometheus 是否抓取到数据:

    在浏览器中访问 Prometheus 的 Web 界面 http://localhost:9090 (假设你的 Prometheus 运行在 9090 端口),在 Expression 输入框中输入 up,然后点击 Execute。如果能看到 spring-boot-app 的指标,并且值为 1,说明 Prometheus 已经成功抓取到数据了!

第三步:配置 Grafana 可视化 Metrics 指标

我们需要配置 Grafana,将 Prometheus 采集到的数据,以图表的形式展示出来。

  1. 启动 Grafana:

    启动你的 Grafana。

  2. 添加 Prometheus 数据源:

    • 在 Grafana Web 界面,点击左侧导航栏的 "Configuration" -> "Data sources"。
    • 点击 "Add data source"。
    • 选择 "Prometheus"。
    • 在 "HTTP" 部分,输入 Prometheus 的 URL (例如 http://localhost:9090)。
    • 点击 "Save & test"。
  3. 创建 Dashboard:

    • 点击左侧导航栏的 "+" -> "Dashboard"。
    • 点击 "Add new panel"。
    • 在 "Query" 部分,选择 Prometheus 数据源。
    • 在 "Metric browser" 中,选择要展示的 Metrics 指标,例如 jvm_memory_used_bytes_max (JVM 最大内存使用量)。
    • 配置图表的标题、坐标轴等。
    • 点击 "Apply"。

    你可以添加多个 Panel,展示不同的 Metrics 指标,例如 CPU 使用率、内存使用率、线程数、HTTP 请求数等等。

  4. 保存 Dashboard:

    点击右上角的 "Save" 按钮,保存你的 Dashboard。

常用的 Metrics 指标

以下是一些常用的 Metrics 指标,可以帮助你监控 Spring Boot 应用的健康状况:

指标名称 描述
jvm_memory_used_bytes JVM 当前内存使用量
jvm_memory_max_bytes JVM 最大内存使用量
jvm_gc_live_data_size_bytes JVM 堆内存中存活对象的大小
jvm_gc_pause_seconds_sum JVM GC 暂停时间总和
jvm_threads_live JVM 活跃线程数
process_cpu_usage 进程 CPU 使用率
process_uptime_seconds 进程运行时间
http_server_requests_seconds_count HTTP 请求总数
http_server_requests_seconds_sum HTTP 请求处理时间总和
http_server_requests_seconds_max HTTP 请求最大处理时间
logback_events_total Logback 日志事件总数
system_cpu_usage 系统 CPU 使用率
system_memory_total_bytes 系统总内存
system_memory_free_bytes 系统空闲内存

一些更高级的用法

  • 自定义 Metrics 指标: 你可以使用 Micrometer API,自定义一些业务相关的 Metrics 指标,例如订单数量、用户活跃度等等。
  • Alerting: 你可以配置 Prometheus 的 Alerting 功能,当 Metrics 指标超过预设的阈值时,自动发送警报,例如邮件、短信等等。
  • Service Discovery: 你可以使用 Prometheus 的 Service Discovery 功能,自动发现新的 Spring Boot 应用,并将其添加到监控目标中。
  • 使用 Grafana 模板: Grafana 社区提供了很多现成的 Dashboard 模板,你可以直接导入使用,省去自己配置的麻烦。

代码示例:自定义 Metrics 指标

import io.micrometer.core.instrument.Counter;
import io.micrometer.core.instrument.MeterRegistry;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;

@Service
public class MyService {

    private Counter orderCounter;

    private final MeterRegistry meterRegistry;

    public MyService(MeterRegistry meterRegistry) {
        this.meterRegistry = meterRegistry;
    }

    @PostConstruct
    public void init() {
        orderCounter = Counter.builder("my_app.order.total")
                .description("Total number of orders")
                .register(meterRegistry);
    }

    public void placeOrder() {
        // 处理订单逻辑
        orderCounter.increment();
    }
}

在这个例子中,我们定义了一个名为 my_app.order.total 的 Counter 指标,用于统计订单总数。每次调用 placeOrder() 方法时,orderCounter 都会自增 1。

总结

通过集成 Prometheus 和 Grafana,我们可以构建一套强大的 Spring Boot 监控体系,让你的程序不再裸奔。监控可以帮助你及时发现问题、提高系统可用性、优化系统性能、更好地理解用户行为。希望这篇文章能够帮助你更好地监控你的 Spring Boot 应用,让你的程序更加健康、稳定!

记住,监控不是一次性的工作,而是一个持续的过程。你需要不断地调整和优化你的监控策略,才能更好地保障你的应用程序的健康运行。

祝大家编程愉快,Bug 越来越少!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注