首页 > 其他分享 >Kubernetes 中 JVM 监控实战:Prometheus + JMX Exporter 全解析

Kubernetes 中 JVM 监控实战:Prometheus + JMX Exporter 全解析

时间:2025-01-20 13:30:40浏览次数:3  
标签:JMX Exporter name jmx Prometheus metrics prometheus JVM

背景

skywalking采集的jvm要自己在页面选择endpoint来查看,不合符开发者使用习惯

前置知识

prometheus-operator的四个CRD作用

  • Prometheus: 由 Operator 依据一个自定义资源kind: Prometheus类型中,所描述的内容而部署的 Prometheus Server 集群,可以将这个自定义资源看作是一种特别用来管理Prometheus Server的StatefulSets资源。
  • ServiceMonitor: 一个Kubernetes自定义资源(和kind: Prometheus一样是CRD),该资源描述了Prometheus Server的Target列表,Operator 会监听这个资源的变化来动态的更新Prometheus Server的Scrape targets并让prometheus server去reload配置(prometheus有对应reload的http接口/-/reload)。而该资源主要通过Selector来依据 Labels 选取对应的Service的endpoints,并让 Prometheus Server 通过 Service 进行拉取(拉)指标资料(也就是metrics信息),metrics信息要在http的url输出符合metrics格式的信息,ServiceMonitor也可以定义目标的metrics的url.
  • Alertmanager:Prometheus Operator 不只是提供 Prometheus Server 管理与部署,也包含了 AlertManager,并且一样通过一个 kind: Alertmanager 自定义资源来描述信息,再由 Operator 依据描述内容部署 Alertmanager 集群。
  • PrometheusRule:对于Prometheus而言,在原生的管理方式上,我们需要手动创建Prometheus的告警文件,并且通过在Prometheus配置中声明式的加载。而在Prometheus Operator模式中,告警规则也编程一个通过Kubernetes API 声明式创建的一个资源.告警规则创建成功后,通过在Prometheus中使用想servicemonitor那样用ruleSelector通过label匹配选择需要关联的PrometheusRule即可

什么是 JMX Exporter ?

JMX Exporter 利用 Java 的 JMX 机制来读取 JVM 运行时的一些监控数据,然后将其转换为 Prometheus 所认知的 metrics 格式,以便让 Prometheus 对其进行监控采集。

那么,JMX 又是什么呢?它的全称是:Java Management Extensions。 顾名思义,是管理 Java 的一种扩展框架,JMX Exporter 正是基于此框架来读取 JVM 的运行时状态的。

如何使用 JMX Exporter 暴露 JVM 监控指标 ?

JMX-Exporter 提供了两种用法:

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

实施

  1. 下载

地址:https://github.com/prometheus/jmx_exporter

wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.14.0/jmx_prometheus_javaagent-0.14.0.jar
  1. 配置文件

jmx-cfg.yml

startDelaySeconds: 0
lowercaseOutputName: false
lowercaseOutputLabelNames: false
whitelistObjectNames: ["org.apache.cassandra.metrics:*"]
blacklistObjectNames: ["org.apache.cassandra.metrics:type=ColumnFamily,*"]
rules:
  - pattern: 'org.apache.cassandra.metrics<type=(\w+), name=(\w+)><>Value: (\d+)'
    name: cassandra_$1_$2
    value: $3
    valueFactor: 0.001
    labels: {}
    help: "Cassandra metric $1 $2"
    type: GAUGE
    attrNameSnakeCase: false
  1. javaagent启动方式

启动参数格式: -javaagent:<jar>=<port>:<config>

-javaagent:jmx_prometheus_javaagent-0.14.0.jar=12345:jmx-cfg.yml
  1. 在rancher中启用集群级别监控prometheus-operator
  2. 给prometheus-operator的service account配置RBAC

如果监控的服务不在同一个namespace 那么会出现无权限获取的问题

jxm-rbac.yml

apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRole
metadata:
  name: prometheus
rules:
- apiGroups: [""]
  resources:
  - nodes
  - services
  - endpoints
  - pods
  verbs: ["get", "list", "watch"]
- apiGroups: [""]
  resources:
  - configmaps
  verbs: ["get"]
- nonResourceURLs: ["/metrics"]
  verbs: ["get"]
---
apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: prometheus
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: prometheus
subjects:
- kind: ServiceAccount
  name: prometheus-k8s
  namespace: monitoring
  1. 如果你想直接利用集群的Prometheus,那么你得把ServiceMonitor建在cattle-prometheus下,并且设置namespaceSelector属性

jmx-servicemonitor.yml

apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  name: jmx-servicemonitor
  namespace: cattle-prometheus # rancher集群级别监控的namespace
spec:
  endpoints:
  - port: jmx-metrics
    path: /metrics
    interval: 5s
  namespaceSelector:
    matchNames:
    - dev-demo # 采集指定namespace
  selector:
    matchLabels:
      jmx: "true" # service中需要配置相同label才会被采集

如果希望ServiceMonitor可以关联任意命名空间下的标签,则通过以下方式定义:

spec:
  namespaceSelector:
    any: true

如果不使用prometheus-operator

- job_name: dev-demo
  scrape_interval: 5s
  kubernetes_sd_configs:
  - role: endpoints
    namespaces:
      names:
      - default
      - dev-demo
  relabel_configs:
  - action: keep
    source_labels:
    - __meta_kubernetes_service_label_app
    regex: tomcat
  - action: keep
    source_labels:
    - __meta_kubernetes_endpoint_port_name
    regex: jmx-metrics
  1. 配置service

demo-service.yml
添加和servicemonitor相匹配的label,暴露metrics端口

apiVersion: v1
kind: Service
metadata:
  name: dev-demo
  namespace: dev-demo
  labels:
    jmx: "true" # 和servicemonitor的matchLabels一致
spec:
  ports:
  - name: jmx-metrics # 与jmx启动时端口一致
    port: 12345
    protocol: TCP
    targetPort: 12345
  - name: app-port
    port: 8888
    protocol: TCP
    targetPort: 8888
  selector:
    app: dev-demo
  type: NodePort

或者通过注解配置

apiVersion: v1
kind: Service
metadata:
  name: dev-demo
  namespace: dev-demo
  annotations:
        prometheus.io/scrape: "true"
        prometheus.io/jvm-scrape: "true"
        prometheus.io/jvm-port: "12345"
        prometheus.io/jvm-path: "/metrics"
spec:
  ports:
  - port: 12345
  selector:
    app: dev-demo

可以在prometheus查看指标是否采集成功
image.png

总的来说就是创建自己的监控数据需要ServiceMonitor,通过ServiceMonitor去对应的label里找对应svc下的metrics的port。并且不同的namespace下的监控需要设置好rbac权限

  1. 给Grafana添加JVM Dashboard
    地址:https://grafana.com/grafana/dashboards/8878

你需要给Grafana添加JVM Dashboard,在这之前你需要设置Grafana的admin密码,进入项目找到Grafana,进入其Shell:


执行:

grafana-cli admin reset-admin-password <新密码>

然后随便进入一个Deployment/StatefulSets,进入Grafana:

用admin账号和你刚才设置的密码登录进去,进入管理页面导入Dashboard:

到 https://grafana.com/orgs/chanjarster/dashboards找到 JVM dashboard (for Prometheus Operator),看到它的编号是8878。把这个编号填到导入页面:

直接导入的面板有些地方无法正常显示,需要进行修正和定制

已修正定制微服务面板、集群节点面板
微服务.json.zip
集群节点.json.zip

image.png

image.png

image.png

标签:JMX,Exporter,name,jmx,Prometheus,metrics,prometheus,JVM
From: https://blog.csdn.net/biyanjiangdu04942/article/details/145244212

相关文章

  • Java类加载机制与JVM运行时数据区各逻辑内存区域与JDK的版本相关差异浅谈
    Java类加载机制与JVM运行时数据区各逻辑内存区域与JDK的版本相关差异浅谈 【摘要】JVM(JavaVirtualMachine)作为Java研发人员工作的每天都会接触到的虚拟机,其运行机制与底层原理想必大家都略知一二,今天我将从初学者的角度出发,结合甲骨文官方的技术文档,对部分Java虚拟机的相关......
  • Java锁 死锁及排查 JVM 工具 jconsole 工具 排查死锁
    目录概述死锁案例(面试)如何排查死锁使用JVM工具排查死锁使用jconsole工具排查死锁细节概述死锁是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力于涉那它们都将无法推进下去,如果系统资源充足,进程的资源请求都能够得到满......
  • node_exporter 集成Prometheus+Grafana
    一、配置Prometheus采集nano/root/apisix-docker/example/prometheus_conf/prometheus.yml========================末尾添加一段===================-job_name:"nodeexporter"scrape_interval:5smetrics_path:"metrics"static_configs:......
  • JVM 八股文面试题
    目录1.前言2.JVM简介3.JVM内存划分3.1 为什么要进行内存划分3.2 内存划分的核心区域3.2.1核心区域一:程序计数器3.2.2核心区域二:元数据区3.2.3核心区域三:栈3.2.4核心区域四:堆4.JVM类加载机制4.1类加载的步骤 4.1.1步骤一:加载4.1.2步骤......
  • Java虚拟机(JVM)深入解析
    Java虚拟机(JVM)是Java程序运行的核心环境,它负责将Java字节码转换为机器码并执行。本文将深入解析JVM的运行时数据区、类加载机制以及执行引擎,帮助读者更好地理解JVM的工作原理。一、运行时数据区(RuntimeDataArea)运行时数据区是JVM在执行Java程序时分配的内存区域,主要包括以......
  • JVM虚拟机监控及性能调优实战
    大家好,欢迎来到程序视点!我是小二哥。今天我们再来聊聊jvisualvm目录jvisualvm介绍代码语言:txt复制1.jvisualvm是JDK自带的可以远程监控内存,跟踪垃圾回收,执行时内存,CPU/线程分析,生成堆快照等的工具。2.jvisualvm是从JDK1.6开始被继承到JDK中的。jvisualvm使用jvisualvm......
  • node_exporter一键部署脚本
    一.node_exporter一键部署脚本1.脚本内容展示[root@node-exporter41~]#catinstall-node-exporter.sh#!/bin/bash#blog:https://www.cnblogs.com/yinzhengjieVERSION=1.8.2SOFTWARE=node_exporter-${VERSION}.linux-amd64.tar.gzURL=https://github.com/prometheus/......
  • blackbox_exporter 如何检测端口
    blackbox_exporter可以通过TCP探测模块来检测目标主机的端口是否开放。以下是配置和使用的详细步骤。1.配置blackbox_exporter1)编辑配置文件打开blackbox_exporter的配置文件blackbox.yml,添加或修改TCP探测模块。示例配置:modules:tcp_connect:pr......
  • 常用JVM参数(基于JDK1.8)
    JVM常用参数解析在Java应用程序中,JVM(JavaVirtualMachine)是运行代码的核心组件。为了优化应用性能,JVM提供了一些可调的参数,帮助开发者和运维人员根据实际需求调整内存分配、垃圾回收行为、日志记录等。本文将详细介绍常用的JVM配置参数,帮助你更好地理解和优化Java应用。......
  • JVM内存模型:Java的秘密引擎
    Java虚拟机(JVM)内存模型是Java程序性能优化和代码调优的核心。理解JVM内存模型对于编写高效、稳定的Java程序至关重要。1.1JVM内存模型概述JVM内存模型定义了Java程序中变量的存储位置以及变量在不同线程间可见性、访问权限等规则。它包括以下几个主要部分:方法区(MethodAr......