Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >一文搞懂基于 Prometheus Stack 监控 Java 容器

一文搞懂基于 Prometheus Stack 监控 Java 容器

作者头像
Luga Lee
发布于 2023-03-10 06:46:53
发布于 2023-03-10 06:46:53
2.2K10
代码可运行
举报
文章被收录于专栏:架构驿站架构驿站
运行总次数:0
代码可运行

Hello folks,我是 Luga,今天我们来分享一下如何基于 Prometheus Stack 可视化监控运行在 Kubernetes Cluster 上的 Spring Boot 微服务容器实例。这里,主要针对每一个 Java 容器实例的指标进行监控,具体涉及:CPU、内存、线程信息、日志信息、HTTP 请求以及 JVM 等。

01

背景概述‍‍‍‍‍

随着云原生技术体系的崛起以及周边生态理念的日渐成熟,越来越多的公司开始将自身原有的基于传统模型的业务开始迁移至云原生,然而,随着迁移的不断进行,而原有的观测模式也逐渐发生变化,从而使得原有的技术体系在新的生态环境中开始出现水土不服。

在传统的监控模型体系中,由于所构建的微服务大多数都是运行在传统的虚拟机平台,使得数据的获取相对来说比较容易,无论这些微服务是基于传统的 Zabbix 组件还是新兴的 Prometheus 平台。然而,基于云化改造后的微服务实例,它们以成千上万个 Pod 模型运行在 Kubernetes Cluster 中提供服务,并且分布在不同的 Namespace 中,除此之外,这些 Pod 可能因各种不同的原因频繁重启或重建,导致其对应的 IP 地址发生变化,使得容器中实例的数据采集以及监控成为一个头痛的难题。

02

技术方案

基于不同的业务场景需求,我们的技术方案参考模型,如下图所示:

基于上述模型图,我们可以看到,假设 Spring Boot 微服务组件以 Pod 形式运行,我们需要借助相关插件将其内部所关联的指标信息进行暴露并予以 Prometheus 组件采集、加工分析,然后将其展现或对接至第三方系统进行维护。‍‍‍‍‍‍‍‍‍‍‍‍‍‍

在本方案的实现过程中,我们需要重点关注以下 2 部分核心内容,具体如下所示:

1、集成 Actuator 与 Micrometer 插件‍‍‍‍

通常情况下,若我们基于 Prometheus 进行应用级别的数据采集及观测,那么,需要在 Spring Boot 应用中使用 Spring Boot Actuator 插件监控应用、暴露指标,并使用 Micrometer Prometheus 将 Actuator 监控指标转换为 Prometheus 格式。

同时,Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,类似于 SLF4J ,只不过它关注的不是 Logging(日志),而是 Application Metrics(应用指标)。

2、配置 Prometheus 自动发现

作为一个开源系统监控和告警工具链组件, 基于其特性,Prometheus 能够采集相关监控指标,并存储为时间序列数据,同时,Prometheus 还提供了灵活的查询语言 PromQL 来查询数据。

Prometheus 通过拉模型采集指标,因此,我们需要在 Prometheus 集群中配置服务发现(Service Monitor)来定期从应用中抓取指标。

03

实现思路及策略

在上面的章节中,我们已大概的规划出整体的技术实现方案:Pod 中取数据——>存放 Prometheus——>数据展现等。从上面的流程来看,整个数据的提取、加工以及到展现并非我们想象的那么难以搞定。‍‍‍‍‍‍‍‍‍‍‍‍‍‍

这里,笔者主要分享常用的 2 种方案供大家参考,具体如下。

1、基于 Service 实现‍‍

言简意赅,即在 Kubernetes Cluster 中,我们需要通过 Service 对外提供 Spring Boot 应用的指标接口。

基于业务需要,我们的 Spring Boot 微服务组件以 Pod 形式运行在 Kubernetes Cluster 中,因此,需要为 Pod 添加 Service 以便对外提供 HTTP 服务,这样 Prometheus 才可以抓取监控指标。

具体模型如下所示:

如下为一个简单的添加 Service 的 Yaml 文件示例,具体可参考:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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: 9999
      protocol: TCP
      targetPort: 9999
  selector:
    app: spring-boot-demo
  type: NodePort

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

在实际的业务场景中,我们基于 Kubernetes 的 Service 实现了监控 Pod 中 Java应用的相关信息,可能是最常见的一种方案。但其实这并不适用于所有的环境,毕竟,基于不同的架构设计,在实际环境中并不是所有的 Pod(微服务)都会有自己对应的 Service,所以那些没有使用到 Service 的 Pod 就无法通过 Service 这种机制来实现微服务应用层面的监控。

2、基于 Pod Controller 实现

此种实现主要基于 JMX Exporter 暴露 JVM 监控指标然后进行数据的采集及监控展示。

与 Service 不同的是,作为一种 Sidecar Docker 容器, JMX Exporter 用于将Prometheus JMX Exporter 注入到我们所构建的 Kubernetes Cluster 中的 Java 应用程序中,然后将相关数据进行暴露。

具体模型如下所示:

针对 JMX Exporter,需要将其相关参数定义或添加至 Deployment 或 StatefulSet 的 initContainers 中,如下为一个简单的添加 Service 的 Yaml 文件示例,具体可参考:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
spec:
  initContainers:
  - name: prometheus-jmx-exporter
    image: spdigital/prometheus-jmx-exporter-kubernetes:0.3.1
    env:
    - name: SHARED_VOLUME_PATH
      value: /shared-volume
    volumeMounts:
    - mountPath: /shared-volume
      name: shared-volume
...

通常,定义的 init 容器和我们所部署的的 Spring Boot 组件容器将共享一个卷,具体如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
volumes:
- name: shared-volume
  emptyDir: {}

同时,在 Spring Boot 组件容器中,将 JAVA_OPTS 设置为引用 prometheus-jmx-exporter 容器放置到共享卷中的文件,具体如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
- name: JAVA_OPTS
  value: -javaagent:/shared-volume/jmx_prometheus_javaagent.jar=19000:/shared-volume/configs/springboot-config.yaml

当然,除了上述最为常见的实现策略外,市面上也有其他可参考的成熟案例可供参考,例如 sfKubeAgent 等,作为一个 Sidecar 容器,监控应用程序 Pod 的 JVM 相关指标信息等。‍

04

部署实施

针对上述 2 种不同的技术实现而言,前置的部署相对来说,基本上都相差无几,具体差异主要体现在技术细节层面。接下来,我们简要地描述一下整个监控流程的相关部署操作。

这里,我主要以基于 Service 实现方式进行部署实施,具体如下:‍‍‍

1、业务应用配置

在 POM.XML 文件中引入相关插件,具体如下所示:‍‍‍‍‍‍‍‍‍‍‍

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
...
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-actuator</artifactId>
    </dependency>
 
    <!--桥接Prometheus-->
    <dependency>
      <groupId>io.micrometer</groupId>
      <artifactId>micrometer-registry-prometheus</artifactId>
      <version>1.6.0</version>
    </dependency>
 
    <!--micrometer核心包, 按需引入, 使用Meter注解或手动埋点时需要-->
    <dependency>
      <groupId>io.micrometer</groupId>
      <artifactId>micrometer-core</artifactId>
      <version>1.6.0</version>
    </dependency>
    <!--micrometer获取JVM相关信息, 并展示在Grafana上-->
    <dependency>
      <groupId>io.github.mweirauch</groupId>
      <artifactId>micrometer-jvm-extras</artifactId>
      <version>0.2.0</version>
    </dependency>
...

通常情况下,由于 Spring Boot Actuator 因为安全原因默认只开启了 Health 和 Info 接口,故此,我们需要调整下 application.yml 文件,将 Prometheus 组件相关接口开放,具体配置可参考如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# metircs
management:
  endpoints:
    web:
      exposure:
        include: prometheus, health
  metrics:
    export:
      simple:
        enabled: false
    tags:
      application: ${spring.application.name}

至此,应用配置已更新完成,我们可以通过 /actuator/prometheus 接口查看配置是否生效,具体如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[leonli@Leon ~ ] % curl 'http://localhost:8080/actuator/prometheus' -i -X GET

2、Prometheus 自动发现配置

在实际生产环境中,每个服务都有对应的 Service,而此 Service 下面通常会挂载有较多 Pod,此时,我们需要通过 Prometheus 的自动发现来将所有实例 Metrics 信息进行采集。毕竟,Kubernetes Cluster 中的 Prometheus 可以基于 Kubernetes Cluster 自身的机制完成此项操作。

此时,我们需要在所部署的微服务的 Yaml 文件中定义 annotations,主要用于自动发现,具体如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 ...
  annotations:
    prometheus.io/port: "7070" #端口配自己服务的端口
    prometheus.io/spring: "true"
    prometheus.io/path: "actuator/prometheus"
...

备注:

上述参数主要配置在 Service 的 metadata 中,具体可参考上述文件配置。

然后,我们在 Prometheus 配置文件中添加 Spring Boot 项目 Metrics 相关信息,具体可参考如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
   ...
      - job_name: 'spring metrics'
 
        kubernetes_sd_configs:
        - role: endpoints
 
        relabel_configs:
        - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_spring]
          action: keep
          regex: true
        - source_labels: [__meta_kubernetes_service_annotation_prometheus_io_path]
          action: replace
          target_label: __metrics_path__
          regex: (.+)
        - source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
          action: replace
          target_label: __address__
          regex: ([^:]+)(?::\d+)?;(\d+)
          replacement: $1:$2
        - action: labelmap
          regex: __meta_kubernetes_service_label_(.+)
        - source_labels: [__meta_kubernetes_namespace]
          action: replace
          target_label: spring_namespace
        - source_labels: [__meta_kubernetes_service_name]
          action: replace
          target_label: spring_name
...

完成如上的配置后,重新进行配置文件加载操作,此时,我们在 Prometheus 控制台可以看到新加进来的 Target 信息。此时,整个监控部署实施完成。

Adiós !

··································

Hello folks,我是 Luga,一个 10 年+ 技术老司机,从 IT 屌丝折腾到码畜,最后到“酱油“架构师。如果你喜欢技术,不喜欢呻吟,那么恭喜你,来对地方了,关注我,共同学习、进步、超越~

您的每一个点赞、在看及分享,我都认真当成了喜欢 ~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-02-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 架构驿站 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
感谢分享
感谢分享
回复回复1举报
推荐阅读
编辑精选文章
换一批
用prometheus监控java应用
2. http://192.168.1.208:6060 可以看到metrics的信息。
山行AI
2019/09/05
9.6K1
用prometheus监控java应用
Prometheus监控学习笔记之解读prometheus监控kubernetes的配置文件
Prometheus 是一个开源和社区驱动的监控&报警&时序数据库的项目。来源于谷歌BorgMon项目。现在最常见的Kubernetes容器管理系统中,通常会搭配Prometheus进行监控。主要监控:
Jetpropelledsnake21
2019/03/08
2.4K0
Prometheus监控学习笔记之解读prometheus监控kubernetes的配置文件
《Prometheus监控实战》第12章 监控Kubernetes
第12章 监控Kubernetes 我们会把Tornado、Prometheus部署到Kubernetes集群中(https://github.com/turnbullpress/tornado-api) ---- 12.1 Kubernetes集群 Kubernetes集群名为tornado.quicknuke.com,使用kops构建了该集群(https://github.com/kubernetes/kops),可以在Github上找到集群配置。它有3个主节点和6个工作节点,所有节点都在三个可用区之间
yeedomliu
2019/12/19
2.2K0
《Prometheus监控实战》第12章 监控Kubernetes
Kubernetes集群监控-详解Prometheus高效监控
Prometheus 最初是 SoundCloud 构建的开源系统监控和报警工具,是一个独立的开源项目,于 2016 年加入了 CNCF 基金会,作为继 Kubernetes 之后的第二个托管项目。Prometheus 相比于其他传统监控工具主要有以下几个特点:
王先森sec
2023/11/11
2K0
Kubernetes集群监控-详解Prometheus高效监控
5.Prometheus监控入门之企业监控实战采集展示
描述: 本章主要讲解和实践Prometheus在企业中的应用场景的复现,采用了docker-compose的资源清单进行快速构建prometheus_server、prometheus_pushgateway、prometheus_alertmanager、grafana等环境。
全栈工程师修炼指南
2022/09/29
9310
5.Prometheus监控入门之企业监控实战采集展示
kubernetes安装Prometheus监控集群状态
Prometheus(普罗米修斯)是一个最初在SoundCloud上构建的监控系统,自2012年成为社区开源项目,拥有非常活跃的开发人员和用户社区,为强调开源及独立维护,Prometheus于2016年加入CNCF,成为继kubernetes之后的第二个托管项目。 官方网站
王先森sec
2023/04/24
1.1K0
kubernetes安装Prometheus监控集群状态
prometheus简介
prometheus是一个最初在SoundCloud上构建的开源系统监控和警报工具包 。 从2012年开始,许多公司和组织开始使用Prometheus,该项目拥有非常活跃的开发人员和用户社区。 目前它是一个独立的开源项目,并且不依赖与任何公司。 为了强调这一点,并澄清项目的治理结构,Prometheus在2016年加入Cloud Native Computing Foundation,作为kubernetes之后的第二个托管项目。
菲宇
2019/06/12
2.5K0
prometheus简介
使用prometheus监控多k8s集群
调研发现prometheus配合node_exporter、kube-state-metrics可以很方便地采集单个集群的监控指标。因此最初的构想是在每套k8s集群里部署prometheus,由它采集该集群的监控指标,再运用prometheus的联邦模式将多个prometheus中的监控数据聚合采集到一个中心prometheus里来,参考模型为Hierarchical federation。
jeremyxu
2019/03/13
10K8
使用prometheus监控多k8s集群
Prometheus神器之监控K8s集群
Prometheus是SoundCloud开源的一款开源软件。它的实现参考了Google内部的监控实现,与源自Google的Kubernetes结合起来非常合适。另外相比influxdb的方案,性能更加突出,而且还内置了报警功能。它针对大规模的集群环境设计了拉取式的数据采集方式,你只需要在你的应用里面实现一个metrics接口,然后把这个接口告诉Prometheus就可以完成数据采集了。
程序员同行者
2019/05/15
1.8K0
使用Prometheus监控Flink
这篇文章介绍了如何利用Apache Flink的内置指标系统以及如何使用Prometheus来高效地监控流式应用程序。
小小科
2020/08/05
2.5K0
【监控利器Prometheus】——Prometheus+Grafana监控SpringBoot项目JVM信息
(4)启动springboot项目,访问 http://localhost:6001/actuator/prometheus 可以看到一些统计指标
DannyHoo
2021/12/23
1.3K0
【监控利器Prometheus】——Prometheus+Grafana监控SpringBoot项目JVM信息
Kubernetes 集群监控 kube-prometheus 自动发现
前面我们一起配置了如何在 kube-prometheus 下面新增一个监控项 Kubernetes 集群监控 ETCD 组件。如果我们在 Kubernetes 集群中有了很多的 Service 和 Pod,那么我们都得一个一个的去建立一个对应的 ServiceMonitor 对象来进行监控吗?这样岂不是又变得很繁琐起来了?
高楼Zee
2021/03/16
7K0
Kubernetes 集群监控 kube-prometheus 自动发现
Prometheus监控神器-Kubernetes篇(一)
本篇使用StorageClass来持久化数据,搭建Statefulset的Prometheus联邦集群,对于数据持久化,方案众多,如Thanos、M3DB、InfluxDB、VictorMetric等,根据自己的需求进行选择,后面会详细讲解针对数据持久化的具体细节。
Kubernetes技术栈
2020/09/09
2K0
kubernetes(k8s) Prometheus+grafana监控告警安装部署
主机数据的采集是集群监控的基础;外部模块收集各个主机采集到的数据分析就能对整个集群完成监控和告警等功能。一般主机数据采集和对外提供数据使用cAdvisor 和node-exporter等工具。
sunsky
2020/08/20
4.7K0
kubernetes(k8s) Prometheus+grafana监控告警安装部署
OpenTelemetry实践指南:历史、架构与基本概念
这些内容的前提是最好有一些 OpenTelemetry 的背景知识,看起来就不会那么枯燥,为此这篇文章就来做一个入门科普,方便一些对 OpenTelemetry 不是那么熟的朋友快速掌握一些 OpenTelemetry 的基本概念。
crossoverJie
2024/07/07
3880
TKE上搭建prometheus
我们就可以通过http://任意节点IP:31160访问 prometheus 的 webui 服务了。
聂伟星
2020/06/10
1.6K2
Spring Boot Actuator详解与深入应用(三):Prometheus+Grafana应用监控
本文系《Spring Boot Actuator详解与深入应用》中的第三篇。在前两篇文章,我们主要讲了Spring Boot Actuator 1.x与 2.x 的应用与定制端点。相比于Actuator 1.x,基于Spring Boot 2.0的Actuator 2.x 在使用和定制方面有很大变化,对于Actuator的扩展也更加灵活。建议读者重点关注一下Actuator 2.x,关于Spring Boot 2.x流行的趋势是显而易见的。
aoho求索
2018/12/19
2.5K0
Spring Boot Actuator详解与深入应用(三):Prometheus+Grafana应用监控
自建 Prometheus 采集腾讯云容器服务监控数据最佳实践
用 Prometheus 采集腾讯云容器服务的监控数据时如何配置采集规则?主要需要注意的是 kubelet 与 cadvisor 的监控指标采集,本文分享为 Prometheus 配置 scrape_config 来采集腾讯云容器服务集群的监控数据的方法。
imroc
2022/08/01
3.1K3
自建 Prometheus 采集腾讯云容器服务监控数据最佳实践
050.集群管理-Prometheus+Grafana监控方案
Prometheus是由SoundCloud公司开发的开源监控系统,是继Kubernetes之后CNCF第2个毕业的项目,在容器和微服务领域得到了广泛应用。Prometheus的主要特点如下:
木二
2020/03/27
1.7K0
Prometheus 如何做到“活学活用”,大牛总结的避坑指南
监控系统的历史悠久,是一个很成熟的方向,而 Prometheus 作为新生代的开源监控系统,慢慢成为了云原生体系的事实标准,也证明了其设计很受欢迎。
民工哥
2020/09/15
9130
Prometheus 如何做到“活学活用”,大牛总结的避坑指南
推荐阅读
相关推荐
用prometheus监控java应用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验