Prometheus 监控 Java 应用 JMX Exporter

操作场景

Prometheus 社区开发了 JMX Exporter 用于导出 JVM 的监控指标,以便使用 Prometheus 来采集监控数据。当您的 Java 业务容器化至 Kubernetes 后,可通过本文了解如何使用 Prometheus 与 JMX Exporter 来监控 Java 应用。

JMX Exporter 简介

Java Management Extensions,JMX 是管理 Java 的一种扩展框架,JMX Exporter 基于此框架读取 JVM 的运行时状态。JMX Exporter 利用 Java 的 JMX 机制来读取 JVM 运行时的监控数据,然后将其转换为 Prometheus 可辨识的 metrics 格式,以便让 Prometheus 对其进行监控采集。

JMX Exporter 提供启动独立进程JVM 进程内启动(in-process)两种方式暴露 JVM 监控指标:

1. 启动独立进程 JVM 启动时指定参数,暴露 JMX 的 RMI 接口。JMX Exporter 调用 RMI 获取 JVM 运行时状态数据,转换为 Prometheus metrics 格式,并暴露端口让 Prometheus 采集。

2. JVM 进程内启动(in-process) JVM 启动时指定参数,通过 javaagent 的形式运行 JMX Exporter 的 jar 包,进程内读取 JVM 运行时状态数据,转换为 Prometheus metrics 格式,并暴露端口让 Prometheus 采集。

说明:

官方不建议使用启动独立进程方式,该方式配置复杂且需单独的进程,进程本身的监控又引发了新的问题。本文以 JVM 进程内启动(in-process)方式为例,在 Kubernetes 环境下使用 JMX Exporter 暴露 JVM 监控指标。

 

这里使用第二种用法,启动 JVM 时需要指定 JMX Exporter 的 jar 包文件和配置文件。 jar 包是二进制文件,不好通过 configmap 挂载,配置文件我们几乎不需要修改, 所以建议是直接将 JMX Exporter 的 jar 包和配置文件都打包到业务容器镜像中。

其中,第二种方式我们可以选择将 JMX Exporter 的 jar 文件放在业务应用镜像中, 也可以选择在部署的时候挂载进去。这里分别对两种方式做一个介绍:

 

 

方式一:将 JMX Exporter JAR 文件构建至业务镜像中 

prometheus-jmx-config.yaml 内容如下:

prometheus-jmx-config.yaml...
ssl: false
lowercaseOutputName: false
lowercaseOutputLabelNames: false
rules:
- pattern: ".*"

然后准备 jar 包文件,可以在 jmx_exporter 的 Github 页面找到最新的 jar 包下载地址并参考如下 Dockerfile:

FROM openjdk:11.0.15-jre
WORKDIR /app/
COPY target/my-app.jar ./
COPY prometheus-jmx-config.yaml ./
RUN set -ex; \curl -L -O https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.17.2/jmx_prometheus_javaagent-0.17.2.jar;
ENV JAVA_TOOL_OPTIONS=-javaagent:/app/jmx_prometheus_javaagent-0.17.2.jar=8088:/app/prometheus-jmx-config.yaml
EXPOSE 8081 8999 8080 8888
ENTRYPOINT java $JAVA_OPTS -jar my-app.jar

注意:

  • 启动参数格式:-javaagent:=:
  • 这里使用了 8088 端口暴露 JVM 的监控指标,如果和 Java 应用冲突,可自行更改

下面是自己编写的Dockerfile 

[root@jenkins dockerfile]# cat Dockerfile
FROM openjdk:8-jdk-alpine 
LABEL maintainer lucasENV TZ=Asia/Shanghai
ENV JAVA_OPTS="-Xmx512m -Xms512m"
ENV JAVA_TOOL_OPTIONS="-javaagent:/jmx_prometheus_javaagent-1.0.1.jar=8888:/jmx-config.yaml"COPY demo.jar  / 
COPY jmx_prometheus_javaagent-1.0.1.jar /
COPY jmx-config.yaml /
WORKDIR /EXPOSE 8000 8888ENTRYPOINT ["/bin/sh"]
CMD ["-c","java $JAVA_OPTS -jar /demo.jar"]

 

 

 

方式二: 通过 init container 容器挂载

我们需要先将 JMX exporter 做成 Docker 镜像, 以下 Dockerfile 仅供参考:

FROM alpine/curl:3.14
WORKDIR /app/
# 将前面创建的 config 文件拷贝至镜像
COPY prometheus-jmx-config.yaml ./
# 在线下载 jmx prometheus javaagent jar
RUN set -ex; \curl -L -O https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.17.2/jmx_prometheus_javaagent-0.17.2.jar;

根据上面 Dockerfile 构建镜像:docker build -t my-jmx-exporter .

在 Java 应用部署 Yaml 中加入如下 init container:

apiVersion: apps/v1
kind: Deployment
metadata:name: my-demo-applabels:app: my-demo-app
spec:selector:matchLabels:app: my-demo-apptemplate:metadata:labels:app: my-demo-appspec:imagePullSecrets:- name: registry-pullinitContainers:- name: jmx-sidecarimage: my-jmx-exportercommand: ["cp", "-r", "/app/jmx_prometheus_javaagent-0.17.2.jar", "/target/jmx_prometheus_javaagent-0.17.2.jar"]  ➊volumeMounts:- name: sidecarmountPath: /targetcontainers:- image: my-demo-app-imagename: my-demo-appresources:requests:memory: "1000Mi"cpu: "500m"limits:memory: "1000Mi"cpu: "500m"ports:- containerPort: 18083env:- name: JAVA_TOOL_OPTIONSvalue: "-javaagent:/app/jmx_prometheus_javaagent-0.17.2.jar=8088:/app/prometheus-jmx-config.yaml" ➋volumeMounts:- name: host-timemountPath: /etc/localtimereadOnly: true- name: sidecarmountPath: /sidecarvolumes:- name: host-timehostPath:path: /etc/localtime- name: sidecar  #共享 agent 文件夹emptyDir: {}restartPolicy: Always

经过如上的改造之后,示例应用 my-demo-app 具备了暴露 JVM 指标的能力。 运行服务之后,我们可以通过 http://lcoalhost:8088 访问服务暴露出来的 prometheus 格式的指标。 

 

 

操作步骤

使用 JMX Exporter 暴露 JVM 监控指标

打包镜像

使用 JVM 进程内启动(in-process)方式,启动 JVM 需指定 JMX Exporter 的 jar 包文件和配置文件。jar 包为二进制文件,不便通过 configmap 挂载,建议直接将 JMX Exporter 的 jar 包和配置文件都打包到业务容器镜像中。步骤如下:

(1) 准备一个制作镜像的目录,放入 JMX Exporter 配置文件 prometheus-jmx-config.yaml

ssl: false
lowercaseOutputName: false
lowercaseOutputLabelNames: false 注意:更多配置项请参考 Prometheus 官方文档。

(2) 准备 jar 包文件,可前往 jmx_exporter 的 Github 页面获取最新的 jar 包下载地址。执行以下命令,下载到当前目录。 https://github.com/prometheus/jmx_exportericon-default.png?t=N7T8https://github.com/prometheus/jmx_exporter

(3) 准备 Dockerfile 文件,本文以 Tomcat 为例。  

FROM tomcat:jdk8-openjdk-slim
ADD prometheus-jmx-config.yaml /prometheus-jmx-config.yaml
ADD jmx_prometheus_javaagent-0.13.0.jar /jmx_prometheus_javaagent-0.13.0.jar

(4) 执行以下命令,编译镜像。

docker build . -t ccr.ccs.tencentyun.com/imroc/tomcat:jdk8

至此已完成镜像打包,您还可利用 docker 多阶段构建,省略手动下载 jar 包的步骤。Dockerfile 示例如下:

FROM ubuntu:16.04 as jar
WORKDIR /
RUN apt-get update -y
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y wget
RUN wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.13.0/jmx_prometheus_javaagent-0.13.0.jar
FROM tomcat:jdk8-openjdk-slim
ADD prometheus-jmx-config.yaml /prometheus-jmx-config.yaml
COPY --from=jar /jmx_prometheus_javaagent-0.13.0.jar /jmx_prometheus_javaagent-0.13.0.jar
部署 Java 应用

部署应用至 Kubernetes 时,需修改 JVM 启动参数以便启动时加载 JMX Exporter。JVM 启动时会读取 JAVA_OPTS 环境变量,作为额外的启动参数,部署时可为应用增加该环境变量。示例如下:

apiVersion: apps/v1
kind: Deployment
metadata:name: tomcat
spec:replicas: 1selector:matchLabels:app: tomcattemplate:metadata:labels:app: tomcatspec:containers:- name: tomcatimage: ccr.ccs.tencentyun.com/imroc/tomcat:jdk8env:- name: JAVA_OPTSvalue: "-javaagent:/jmx_prometheus_javaagent-0.13.0.jar=8088:/prometheus-jmx-config.yaml"---apiVersion: v1
kind: Service
metadata:name: tomcatlabels:app: tomcat
spec:type: ClusterIPports:- port: 8080protocol: TCPname: http- port: 8088protocol: TCPname: jmx-metricsselector:app: tomcat
  • 启动参数格式: -javaagent:<jar>=<port>:<config>
  • 该示例使用8088端口暴露 JVM 的监控指标,您可按需自行更改。

 为 JAVA 服务组件添加环境变量 :

JAVA_OPTS = -javaagent:/tmp/agent/jmx_prometheus_javaagent-0.16.1.jar=5556:/tmp/agent/prometheus-jmx-config.yaml

 [root@jenkins dockerfile]# curl 192.168.254.110:12345/metrics

 

 

添加 Prometheus 监控配置

配置 Prometheus,使监控数据可被采集。示例如下:

- job_name: tomcatscrape_interval: 5skubernetes_sd_configs:- role: endpointsnamespaces:names:- defaultrelabel_configs:- action: keepsource_labels:- __meta_kubernetes_service_label_appregex: tomcat- action: keepsource_labels:- __meta_kubernetes_endpoint_port_nameregex: jmx-metrics

若已安装 prometheus-operator,则可通过创建 ServiceMonitor 的 CRD 对象配置 Prometheus。示例如下:

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:name: tomcatnamespace: defaultlabels:app: tomcat
spec:endpoints:- port: jmx-metricsinterval: 5snamespaceSelector:matchNames:- defaultselector:matchLabels:app: tomcat

 

 

添加 Grafana 监控面板

采集数据后可进行数据展示。若熟悉 Prometheus 和 Grafana,则可自行根据指标设计所需面板。您也可直接使用社区提供面板,例如 JVM dashboard。可直接导入使用,面板效果图如下:

 

 

参考资料

JMX Exporter 项目地址

JVM 监控面板

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/47639.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何在 Puppeteer 中运行无头浏览器?

什么是无头浏览器&#xff1f; 我们都知道&#xff0c;用户界面&#xff08;UI&#xff09;是任何软件中最重要的部分。因此&#xff0c;“无头浏览器”的“无头”部分意味着它们确实缺少一个关键元素&#xff0c;即图形用户界面&#xff08;GUI&#xff09;。 这意味着浏览器…

webrtc QOS方法十三(视频渲染平滑)

一、背景介绍 视频渲染时间的确定需要考虑三方面的因素&#xff1a;网络抖动、网络延时、音视频同步 网络抖动&#xff1a;视频帧在网络上传输&#xff0c;会受到网络抖动的影响&#xff0c;不能收到立刻播放&#xff0c;需要进行适当的平滑 网络延时&#xff1a;一些报文在…

docker 安装并测试(Ubuntu下)

1. 确认安装环境&#xff08;操作系统版本和 CPU 架构&#xff09; 2. 如果有旧版本的 docker 需要进行卸载 使用 docker 命令检查是否已经安装了 docker 如果 docker 已经安装&#xff0c;使用以下命令卸载&#xff1a; apt-get purge docker-ce docker-ce-cli containerd…

力扣3202:找出有效子序列的最大长度||

class Solution { public:int maximumLength(vector<int>& nums, int k) {int res0;for(int m0;m<k;m){//假设子序列两数%k之后的结果为m 相当于枚举vector<int> v(k,0);for(auto num:nums){v[num%k]v[(m-num%kk)%k]1; //知道m之后可以知道需要的子序列当前…

maven内网依赖包编译报错问题的一种解决方法

背景 外网开发时可以连接互联网&#xff0c;所以编译没有什么问题&#xff0c;但是将数据库、代码、maven仓库全部拷贝到内网&#xff0c;搭建内网环境之后&#xff0c;编译失败。 此依赖包的依赖层级图 maven镜像库配置使用拷贝到内网的本地库&#xff0c;配置如下&#xff…

【Linux】Linux环境设置环境变量操作步骤

Linux环境设置环境变量操作步骤 在一些开发过程中本地调试经常需要依赖环境变量的参数&#xff0c;但是怎么设置对小白来说有点困难&#xff0c;今天就介绍下具体的操作步骤&#xff0c;跟着实战去学习&#xff0c;更好的检验自己的技术水平&#xff0c;做技术还是那句话&…

【iOS】——内存对齐

内存对齐是什么 内存对齐指的是数据在内存中的布局方式&#xff0c;它确保每个数据类型的起始地址能够满足该类型对齐的要求。这是因为现代处理器在访问内存时&#xff0c;如果数据的起始地址能够对齐到一定的边界&#xff0c;那么访问速度会更快。这种对齐通常是基于数据类型…

BUUCTF逆向wp [MRCTF2020]Transform

第一步 查壳。该题为64位。 第二步 进入主函数&#xff0c;跟进dword_40F040,它应该与关键字符串有关 分析一下&#xff1a; 初始化和输入 sub_402230(argc, argv, envp); 这行可能是一个初始化函数&#xff0c;用于设置程序环境或处理命令行参数。具体功能不明&#xff0c…

高性能、安全、低碳绿色的趋势下,锐捷网络发布三擎云办公解决方案 3.0

桌面虚拟化作为云时代的主流和热门技术&#xff0c;已经取得了广泛应用。随着生成式 AI 爆炸式发展&#xff0c;CSDN 看到&#xff0c;人工智能正在引发计算、开发、交互三大范式的全面升级&#xff0c;技术开发或将迎来一次全新的科技变革周期&#xff0c;因此 VDI 云桌面随之…

C#语法基础详解(万字总结)

文章目录 **参考书籍&#xff1a;C#7.0 核心技术指南**类型类字段解构器对象初始化器属性表达式属性(只读属性才可以)自动属性属性初始化器 索引器静态构造器nameof运算符 继承类型转换和引用转换as运算符is运算符is与模式变量 虚函数成员抽象类和抽象成员new和重写base关键字构…

Android C++系列:Linux线程(四)线程同步

多个线程同时访问共享数据时可能会冲突,这跟我们前面信号文章所说的可重入性是同样的问题。比如两个线程都要把某个全局变量增加1,这个操作在某平台需要三条指令完成: 从内存读变量值到寄存器;寄存器的值加1;将寄存器的值写回内存假设两个线程在多处理器平台上同时执行这三…

JavaSE学习复习题总结

一.什么是继承与多态&#xff1f; 1.继承 2.多态多态是面向对象编程的另一个核心特性&#xff0c;它允许我们以统一的接口处理不同的对象。在Java中&#xff0c;多态通常通过方法的重写&#xff08;Override&#xff09;和重载&#xff08;Overload&#xff09;以及接口&#…

【linux】Shell脚本中While循环的详细用法教程

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

排序系列 之 选择排序

&#xff01;&#xff01;&#xff01;排序仅针对于数组哦本次排序是按照升序来的哦 介绍 快速排序英文名为SelectSort从数组中找到最小的放到前边 基本思路 1、默认待排序数组中第一个作为最小值2、找待排序数组&#xff08;注意不是整个数组哦&#xff09;中真正的最小值3…

AMEYA360:思瑞浦推出汽车级理想二极管ORing控制器TPS65R01Q

聚焦高性能模拟芯片和嵌入式处理器的半导体供应商思瑞浦3PEAK(股票代码&#xff1a;688536)发布汽车级理想二极管ORing控制器TPS65R01Q。 TPS65R01Q拥有20mV正向调节功能&#xff0c;降低系统损耗。快速反向关断(Typ&#xff1a;0.39μs)&#xff0c;在电池反向和各种汽车电气瞬…

汇编教程2

本教程主要教大家如何安装32位Linux虚拟机&#xff0c;为后续实验拆炸弹做准备 下载系统映像文件 以Ubuntu14.04.6系统为例 官方网站&#xff1a;下载地址 点击下载图中32位系统 如果官网进不去可以使用镜像网站 清华镜像网站&#xff1a;下载地址 进入之后找到下图中链接…

redis server response timeout(3000ms) occurred after 3 retry attempts异常分析

读取redis数据报超时错误&#xff1a; Redis server response timeout (3000 ms) occured after 3 retry attempts2024-07-18 17:07:57.124 ERROR [e8f07b0a671c08311dff589827897232] [http-nio-9528-exec-6] c.z.i.u.m.c.e.BaspUserExceptionHandler.exceptionHandler:83 - R…

PyTorch 深度学习实践-基于SoftMax的多分类

视频指路 参考博客笔记 参考笔记二 文章目录 上课内容代码实现作业实现 上课内容 softmax能输出一个分布&#xff1a;每一个输出值>0&#xff0c;且和1 说明&#xff1a; 1、softmax的输入不需要再做非线性变换&#xff0c;也就是说softmax之前不再需要激活函数(relu)。so…

基于X86+FPGA+AI的远程医疗系统,支持12/13代 Intel Core处理器

工控主板&#xff1a;支持12/13代 Intel Core处理器&#xff0c;适用于远程医疗系统 顺应数字化、网络化、智能化发展趋势&#xff0c;国内医疗产业改革正在积极推进&#xff0c;远程医疗、智慧医疗等新模式新业态创新发展和应用&#xff0c;市场空间不断扩大&#xff0c;而基…

Web前端Promise

Promise介绍与使用 Promise是什么&#xff1f; 1.抽象表达&#xff1a; Promise是一门新的技术&#xff08;ES6规范&#xff09;Promise是JS中进行异步编程的新解决方案备注&#xff1a;旧方案是单纯使用回调函数 2.具体表达&#xff1a; 从语法上来说&#xff1a;Promise…