Prometheus监控JVM

1.部署说明

JMX Exporter 的两种用法
JMX-Exporter 提供了两种用法:
1.启动独立进程.JVM启动时指定参数,暴露JMX的RMI接口,JMX-Exporter调用RMI获取JVM运行时状态数据,转换为Prometheus metrics格式,并暴露端口让Prometheus采集.
2.JVM进程内启动.JVM启动时指定参数,通过javaagent的形式运行JMX-Exporter的jar包,进程内读取JVM运行时状态数据,转换为Prometheus metrics格式,并暴露端口让Prometheus采集。
官方不推荐使用第一种方式,一方面配置复杂,另一方面因为它需要一个单独的进程.
本次介绍的是第二种方法

添加jmx_exporter.yaml配置文件

---
lowercaseOutputLabelNames: true
lowercaseOutputName: true
# whitelistObjectNames: ["java.lang:type=OperatingSystem"]
ssl: false

# rules:
#   - pattern: 'java.lang<type=OperatingSystem><>((?!process_cpu_time)\w+):'
#     name: os_$1
#     type: GAUGE
#     attrNameSnakeCase: true

下载jmx_exporter的jar包

地址: https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/

选择时间比较近的

wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.17.2/jmx_prometheus_javaagent-0.17.2.jar

修改Jar打包镜像的配置

.
.
.
JMX_OPS = " -javaagent:/data2/${PROJECT_NAME}/jmx/jmx_prometheus_javaagent-0.17.0.jar=8784:/data2/${PROJECT_NAME}/jmx/jmx_exporter.yml"
.
.
.
# Dockerfile文件也要修改
FROM openjdk:17.0.2-jdk
ENV TZ=Asia/Shanghai
RUN useradd -g 33 -u 33 vray && mkdir -p /data2/${PROJECT_NAME}/jmx && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo "Asia/Shanghai" > /etc/timezone
ADD ${JAR_NAME}  /data2/${PROJECT_NAME}/
# 添加jmx_exporter的jar和配置
ADD jmx_prometheus_javaagent-0.17.0.jar  /data2/${PROJECT_NAME}/jmx/
ADD jmx_exporter.yml  /data2/${PROJECT_NAME}/jmx/
RUN chown -R 33.33 /data2
WORKDIR /data2/${PROJECT_NAME}
USER vray
# 端口暴露
EXPOSE ${JAVA_PORT} 8784
# 添加JMX_OPS
ENTRYPOINT java ${JMX_OPS} ${JAR_OPS} -jar /data2/${PROJECT_NAME}/${JAR_NAME}

修改deployment文件

kind: Deployment
apiVersion: apps/v1
metadata:
  .
  .
  .
spec:
  .
  .
  .
  template:
    metadata:
      annotations:
        # promethues通过这个标签动态获取到pod的信息
        prometheus.io/scrape: jvm
        # prometheus.io/port: 'JAVAPORT'
        prometheus.io/port: '8784'
    spec:
      containers:
        - .
          env:
            .
          ports:
            - containerPort: JAVAPORT
              protocol: TCP
              name: apiport
            - containerPort: 8784
              protocol: TCP
              # jvm监控端口
              name: jmxport

service也要修改

apiVersion: v1
kind: Service
metadata:
  annotations:
    prometheus.io/scrape: "true"
  labels:
    app: PROJECT_NAME
  name: PROJECT_NAME
  namespace: ENV
spec:
  ports:
  - name: PROJECT_NAME
    port: JAVA_PORT
    protocol: TCP
    targetPort: JAVA_PORT
  - name: jmxport
    port: 8784
    protocol: TCP
    targetPort: 8784
  selector:
    app: PROJECT_NAME
  sessionAffinity: ClientIP
  sessionAffinityConfig:
    clientIP:
      timeoutSeconds: 3600
  type: ClusterIP

修改Prometheus的配置文件添加JVM的监控项

kubectl -n monitoring edit cm/prometheus-config
# 添加下面配置
      #Pod metrics #scrape=jvm
      - job_name: 'jmx-exporter'
        kubernetes_sd_configs:
        - role: pod
        relabel_configs:
        - action: keep
          regex: jvm
          source_labels:
          - __meta_kubernetes_pod_annotation_prometheus_io_scrape
        - action: replace
          regex: (.+)
          source_labels:
          - __meta_kubernetes_pod_annotation_prometheus_io_path
          target_label: __metrics_path__
        - action: replace
          regex: ([^:]+)(?::\d+)?;(\d+)
          replacement: $1:$2
          source_labels:
          - __address__
          - __meta_kubernetes_pod_annotation_prometheus_io_port
          target_label: __address__
          # 匹配你在pod中定义的标签名,比如app: PROJECTNAME-DENV app: bims-meta-yfdev,tke的会默认加上pod-template-hash='XXXXXXXXXXXXX'
        - action: labelmap
          regex: __meta_kubernetes_pod_label_(.+)
        - action: replace
          source_labels:
          - __meta_kubernetes_namespace
          target_label: namespace
        - action: replace
          source_labels:
          - __meta_kubernetes_pod_name
          target_label: pod

添加后重启Prometheus的pod

可以查看到Prometheus多了一个监控项

找到对应的Grafana的Dashboard

地址: https://grafana.com/grafana/dashboards/?plcmt=footer

搜索jmx,导入模板后可以看到(这里使用的是11131这个模板)

注意这里的job和container要对应

实践1:

从上图的中可以看到很多是没有数据的,因为他的数据表达式是:kube_pod_container_resource_limits_cpu_cores{job='kube-state-metrics', container='tomcat', pod="$pod"}

这里我的模板是将所有的container赋值为tomcat
可以看到我这里的container是不一样的,这时候我就修改为container="${container}",但是还是没有数据,因为这个$container是需要在模板中定义的
可以看到这个变量需要在这里定义,我们也可以自己添加。

比如我们要自己添加container这个值,可以看到这里是没有container的标签的,跟target中的Labels是一样的

这个是从config中配置的

现在我们添加container的一个标签,因为这个标签是从kubernetes_sd_configs,中pod的所有信息中获取的,可以查看 https://blog.csdn.net/qq_33816243/article/details/126863790

添加后可以看到up后面已经有container这个标签

可以看到up函数也可以查到这个标签,然后就可以在那个模板添加label_values(up{job="jmx-expoter"},container),然后就可以在模板中选择,这时候就可以用kube_pod_container_resource_limits_cpu_cores{job='kube-state-metrics', container="$container", pod="$pod"}

实践2:
关于函数label_join(jvm_info{pod="$pod"}, "jdk", ", ", "vendor", "runtime", "version")

先查询:

注意这里要选择Last这个计算函数,关于Grafana计算函数的使用可以参考 https://blog.csdn.net/m0_56079407/article/details/127780050

最终的图

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Prometheus是一个开源的监控系统,它可以用于监控各种不同的应用和服务。对于监控JVMPrometheus提供了一些特定的工具和指标,以便收集和展示与JVM相关的监控数据。 要监控JVM,你可以使用Prometheus的Java客户端库,该库提供了一些内置的指标和方法来收集JVM的性能数据。你需要在你的应用程序中引入该库,并使用它来注册和暴露指标。 以下是一些常见的步骤来监控JVM: 1. 引入Prometheus Java客户端库:在你的项目中添加Prometheus Java客户端库的依赖。 2. 注册指标:使用Prometheus Java客户端库的API,在你的应用程序中注册需要监控的指标。这些指标可以是内置的,也可以是自定义的。 3. 暴露指标:将注册的指标通过HTTP接口暴露给Prometheus服务器。你可以使用Prometheus提供的HTTP服务器或者将指标暴露为一个HTTP接口。 4. 配置Prometheus服务器:在Prometheus服务器的配置文件中添加你的应用程序的地址和端口信息,以便Prometheus可以定期拉取指标数据。 5. 查询和展示数据:使用Prometheus提供的查询语言(PromQL)来查询和展示JVM监控数据。你可以使用Prometheus自带的Web界面或者其他可视化工具来展示数据。 通过以上步骤,你就可以使用Prometheus监控JVM的性能数据了。你可以收集和展示一些常见的指标,如内存使用情况、垃圾回收情况、线程数等,以便及时发现和解决潜在的性能问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值