使用 Prometheus + Grafana 监控 k8s 上的 Spring Boot 应用

简介: 本文主要介绍如何使用 Prometheus 和 Grafana 可视化监控运行在 k8s 上的 Spring Boot 应用,监控指标包括 CPU、内存、线程信息、日志信息、HTTP 请求、JVM 等。

背景

本文主要介绍如何使用 Prometheus 和 Grafana 可视化监控运行在 k8s 上的 Spring Boot 应用,监控指标包括 CPU、内存、线程信息、日志信息、HTTP 请求、JVM 等。


技术方案


技术方案如下图所示:image.png


首先我们需要在 Spring Boot 应用中使用 Spring Boot Actuator 监控应用、暴露指标,并使用 Micrometer Prometheus 将 Actuator 监控指标转换为 Prometheus 格式。

Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,类似于 SLF4J ,只不过它关注的不是Logging(日志),而是application metrics(应用指标)。 简而言之,它就是应用监控界的SLF4J。


然后在 k8s 集群中,我们需要通过 Service 对外提供 Spring Boot 应用的指标接口。

Prometheus 是一个开源系统监控和警报工具包,可以采集监控指标,并存储为时间序列数据,Prometheus 还提供了灵活的查询语言 PromQL 来查询数据。Prometheus 通过拉模型采集指标,所以我们需要在 Prometheus 集群中配置服务发现(ServiceMonitor)来定期从应用中抓取指标。


Grafana 是一个开源的可视化分析平台,可以用它创建监控仪表盘、配置告警等。

整体个配置流程如下:

image.png


部署应用

应用配置

pom.xml 中添加如下配置:


<!-- 开启 Spring Boot Actuator --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- 将 Actuator 指标转换为 Prometheus 格式 --><dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId><version>${micrometer.version}</version></dependency>



然后修改 application.yaml 中添加 Spring Boot Actuator 相关配置:


spring:  application:    name: spring-boot-demo
management:  endpoints:    web:      exposure:        include: "*"    health:      show-details: always
  metrics:    export:      prometheus:        enable: true    tags:      application: spring-boot-demo



至此,应用配置就完成了,可以通过 /actuator/prometheus 接口查看配置是否正确:


$ curl'http://localhost:8080/actuator/prometheus'-i-X GET


返回结果如下所示:


HTTP/1.1 200 OK
Content-Type: text/plain;version=0.0.4;charset=utf-8
Content-Length: 2375# HELP jvm_buffer_memory_used_bytes An estimate of the memory that the Java virtual machine is using for this buffer pool# TYPE jvm_buffer_memory_used_bytes gaugejvm_buffer_memory_used_bytes{id="direct",} 489719.0
jvm_buffer_memory_used_bytes{id="mapped",} 0.0
# HELP jvm_memory_committed_bytes The amount of memory in bytes that is committed for the Java virtual machine to use# TYPE jvm_memory_committed_bytes gaugejvm_memory_committed_bytes{area="heap",id="PS Survivor Space",} 5.1380224E7
jvm_memory_committed_bytes{area="heap",id="PS Old Gen",} 4.86539264E8
jvm_memory_committed_bytes{area="heap",id="PS Eden Space",} 2.11812352E8
jvm_memory_committed_bytes{area="nonheap",id="Metaspace",} 1.62439168E8
jvm_memory_committed_bytes{area="nonheap",id="Code Cache",} 5.4329344E7
jvm_memory_committed_bytes{area="nonheap",id="Compressed Class Space",} 2.4551424E7
# HELP jvm_buffer_total_capacity_bytes An estimate of the total capacity of the buffers in this pool# TYPE jvm_buffer_total_capacity_bytes gaugejvm_buffer_total_capacity_bytes{id="direct",} 489718.0
jvm_buffer_total_capacity_bytes{id="mapped",} 0.0
# HELP jvm_memory_max_bytes The maximum amount of memory in bytes that can be used for memory management# TYPE jvm_memory_max_bytes gaugejvm_memory_max_bytes{area="heap",id="PS Survivor Space",} 5.1380224E7
jvm_memory_max_bytes{area="heap",id="PS Old Gen",} 7.16177408E8
jvm_memory_max_bytes{area="heap",id="PS Eden Space",} 2.31735296E8
jvm_memory_max_bytes{area="nonheap",id="Metaspace",} -1.0
jvm_memory_max_bytes{area="nonheap",id="Code Cache",} 2.5165824E8
jvm_memory_max_bytes{area="nonheap",id="Compressed Class Space",} 1.073741824E9
# HELP jvm_buffer_count_buffers An estimate of the number of buffers in the pool# TYPE jvm_buffer_count_buffers gaugejvm_buffer_count_buffers{id="direct",} 17.0
jvm_buffer_count_buffers{id="mapped",} 0.0
# HELP jvm_memory_used_bytes The amount of used memory# TYPE jvm_memory_used_bytes gaugejvm_memory_used_bytes{area="heap",id="PS Survivor Space",} 5.1139432E7
jvm_memory_used_bytes{area="heap",id="PS Old Gen",} 9.7572216E7
jvm_memory_used_bytes{area="heap",id="PS Eden Space",} 1.47234248E8
jvm_memory_used_bytes{area="nonheap",id="Metaspace",} 1.46403048E8
jvm_memory_used_bytes{area="nonheap",id="Code Cache",} 5.3970112E7
jvm_memory_used_bytes{area="nonheap",id="Compressed Class Space",} 2.1374208E7


配置 Service


因为应用是部署在 k8s 上的,由多个 Pod 组成,所以还需要为 Pod 添加 Service,对外提供 HTTP 服务,这样 Prometheus 才可以抓取监控指标。

在 k8s 中添加类似下面的 Service:

apiVersion: v1
kind: Service
metadata:
  labels:
    app: spring-boot-demo-exporter
  name: spring-boot-demo-exporter
  namespace: default
spec:
  ports:
- name: spring-boot-demo-exporter
      port: 8080      protocol: TCP
      targetPort: 8080  selector:
    app: spring-boot-demo
  type: NodePort

需要注意 spec.selector 需要与 Pod 的标签对应。例如使用 Deployment 部署应用,则需要与 Deployment 的 spec.template.metadata.labels 对应,这样 Service 才能知道对应的 Pod。


配置服务发现

如果使用的是自己部署的 Prometheus 服务,则可以在 prometheus.yml 中添加上 Service 对应的任务,例如:

scrape_configs:
# ...-  job_name: 'spring-boot-demo'# Prometheus 任务名称,自定义     metrics_path: '/actuator/prometheus'# 指标获取路径     scrape_interval: 5s # 抓取指标的间隔时间     static_configs:
- targets: ['spring-boot-demo-exporter:8080'] # 指标访问入口,即 k8s 集群的 Service


如果使用的是云厂商提供的 Prometheus 服务,则需要安装云厂商的规则添加服务发现。如 阿里云 Prometheus 监控 的 ServiceMonitor 配置如下:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: spring-boot-exporter
  namespace: default
spec:
  endpoints:
- interval: 30s
# Prometheus Exporter 对应的 Path 的值    path: /actuator/prometheus
# service.yaml 中 Prometheus Exporter 对应的 Port 的 Name 字段的值    port: spring-boot-exporter
  namespaceSelector:
    any: true  selector:
    matchLabels:
# service.yaml 的 Label 字段的值以定位目标 service.yaml      app: spring-boot-demo-exporter



配置大盘

Grafana 提供了丰富的大盘模板,可以在其官网搜索合适的大盘导入到自己的 Grafana 监控中。

image.png



我使用的是这两个大盘:



最终效果预览如下:


image.png

Spring Boot 监控

image.png

JVM 监控




总结


至此,基于 Prometheus + Grafana 的 Spring Boot 应用监控系统就创建完成了。接下来还可以使用 Grafana 实现告警,这类就不赘述了。


相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1549 3
|
11月前
|
SQL Java 数据库连接
Spring Data JPA 技术深度解析与应用指南
本文档全面介绍 Spring Data JPA 的核心概念、技术原理和实际应用。作为 Spring 生态系统中数据访问层的关键组件,Spring Data JPA 极大简化了 Java 持久层开发。本文将深入探讨其架构设计、核心接口、查询派生机制、事务管理以及与 Spring 框架的集成方式,并通过实际示例展示如何高效地使用这一技术。本文档约1500字,适合有一定 Spring 和 JPA 基础的开发者阅读。
974 0
|
10月前
|
消息中间件 缓存 Java
Spring框架优化:提高Java应用的性能与适应性
以上方法均旨在综合考虑Java Spring 应该程序设计原则, 数据库交互, 编码实践和系统架构布局等多角度因素, 旨在达到高效稳定运转目标同时也易于未来扩展.
865 8
|
12月前
|
Java 应用服务中间件 开发者
Spring Boot 技术详解与应用实践
本文档旨在全面介绍 Spring Boot 这一广泛应用于现代企业级应用开发的框架。内容将涵盖 Spring Boot 的核心概念、核心特性、项目自动生成与结构解析、基础功能实现(如 RESTful API、数据访问)、配置管理以及最终的构建与部署。通过本文档,读者将能够理解 Spring Boot 如何简化 Spring 应用的初始搭建和开发过程,并掌握其基本使用方法。
818 2
|
人工智能 监控 安全
如何快速上手【Spring AOP】?核心应用实战(上篇)
哈喽大家好吖~欢迎来到Spring AOP系列教程的上篇 - 应用篇。在本篇,我们将专注于Spring AOP的实际应用,通过具体的代码示例和场景分析,帮助大家掌握AOP的使用方法和技巧。而在后续的下篇中,我们将深入探讨Spring AOP的实现原理和底层机制。 AOP(Aspect-Oriented Programming,面向切面编程)是Spring框架中的核心特性之一,它能够帮助我们解决横切关注点(如日志记录、性能统计、安全控制、事务管理等)的问题,提高代码的模块化程度和复用性。
|
安全 算法 Java
在Spring Boot中应用Jasypt以加密配置信息。
通过以上步骤,可以在Spring Boot应用中有效地利用Jasypt对配置信息进行加密,这样即使配置文件被泄露,其中的敏感信息也不会直接暴露给攻击者。这是一种在不牺牲操作复杂度的情况下提升应用安全性的简便方法。
1655 10
|
安全 Java Nacos
0代码改动实现Spring应用数据库帐密自动轮转
Nacos作为国内被广泛使用的配置中心,已经成为应用侧的基础设施产品,近年来安全问题被更多关注,这是中国国内软件行业逐渐迈向成熟的标志,也是必经之路,Nacos提供配置加密存储-运行时轮转的核心安全能力,将在应用安全领域承担更多职责。
|
Prometheus 运维 监控
智能运维实战:Prometheus与Grafana的监控与告警体系
【10月更文挑战第26天】Prometheus与Grafana是智能运维中的强大组合,前者是开源的系统监控和警报工具,后者是数据可视化平台。Prometheus具备时间序列数据库、多维数据模型、PromQL查询语言等特性,而Grafana支持多数据源、丰富的可视化选项和告警功能。两者结合可实现实时监控、灵活告警和高度定制化的仪表板,广泛应用于服务器、应用和数据库的监控。
1797 4
|
Prometheus 监控 Cloud Native
Prometheus+Grafana(docker安装)
本文档详细介绍了如何使用Docker容器快速部署Prometheus监控系统和Grafana数据可视化平台。该方案适用于需要快速搭建监控环境的开发测试场景,具备部署简单、资源占用低、易于维护等特点。
|
存储 数据采集 Prometheus
Grafana Prometheus Altermanager 监控系统
Grafana、Prometheus 和 Alertmanager 是一套强大的开源监控系统组合。Prometheus 负责数据采集与存储,Alertmanager 处理告警通知,Grafana 提供可视化界面。本文简要介绍了这套系统的安装配置流程,包括各组件的下载、安装、服务配置及开机自启设置,并提供了访问地址和重启命令。适用于希望快速搭建高效监控平台的用户。
1283 20

推荐镜像

更多