Prometheus jmx_exporter

一、简介

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

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

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

 

二、K8s中监控java进程

采用 javaagent 的形式运行 JMX-Exporter 的 jar 包,进程内读取 JVM 运行时状态数据,转换为 Prometheus metrics 格式,并暴露端口让 Prometheus 采集。

制作java镜像,导入jmx_exporter

Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
FROM openjdk:8u121-alpine
LABEL maintainer="tunan"
ENV JAVA_VERSION 8u121
ENV JAVA_OPTS=""
RUN set -x \
    && addgroup -g 1010 -S admin \
    && adduser -S -D  -u 1010 -s /sbin/nologin -G admin -g admin admin \
    && mkdir -p /app && mkdir -p /data/logs/server-admin \
    && chown -R admin.admin /app && chown -R admin.admin /data/logs/server-admin \
    && ln -sf /dev/stdout /data/logs/server-admin/all_pb-server-admin.log \
    && ln -sf /dev/stderr /data/logs/server-admin/err_pb-server-admin.log \
    && rm -rf /var/lib/apt/lists/*
WORKDIR /app
USER admin
COPY pb-server-admin-1.0-SNAPSHOT.jar /app
COPY jmx_prometheus_javaagent-0.14.0.jar /app
EXPOSE 8084
ENTRYPOINT java ${JAVA_OPTS} -jar pb-server-admin-1.0-SNAPSHOT.jar

  

jmx_exporter的配置文件

prometheus-jmx-config.yaml

1
2
3
4
---
ssl: false
lowercaseOutputName: false
lowercaseOutputLabelNames: false

  

创建

1
2
3
4
5
6
7
8
9
# 创建一个namespace
# kubectl create ns kube-test
# kubectl create cm jmx-config --from-file=prometheus-jmx-config.yaml -n kube-test
configmap/jmx-config created
# kubectl get cm -n kube-test
NAME         DATA   AGE
jmx-config   1      8s

  

启动一个监控项目

jmx-exporter.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
apiVersion: v1
kind: Service
metadata:
  name: jmx-exporter
  namespace: kube-test
  labels:
    k8s-app: jmx-exporter
spec:
  selector:
    k8s-app: jmx-exporter
  ports:
  - name: application
    port: 8084
    protocol: TCP
  - name: jmx-metrics
    port: 9084
    protocol: TCP
  type: ClusterIP
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: jmx-exporter
  namespace: kube-test
  labels:
    k8s-app: jmx-exporter
spec:
  replicas: 1
  selector:
    matchLabels:
      k8s-app: jmx-exporter
  template:
    metadata:
      labels:
        k8s-app: jmx-exporter
    spec:
      containers:
      - name: admin
        image: pb-server-admin:1.0.2
        imagePullPolicy: IfNotPresent
        env:
        - name: JAVA_OPTS
          value: "-javaagent:/app/jmx_prometheus_javaagent-0.14.0.jar=9084:/config/prometheus-jmx-config.yaml"
        volumeMounts:
        - name: jmx-config
          mountPath: /config
          readOnly: true
        - name: tz-config
          mountPath: /etc/localtime
          readOnly: true
      nodeSelector:
        monitor: "true"
      volumes:
        - name: tz-config
          hostPath:
            path: /usr/share/zoneinfo/Asia/Shanghai
        - name: jmx-config
          configMap:
            name: jmx-config
  • 通过9084这个端口来采集metrics

 

使用prometheus-operator,通过创建 ServiceMonitor 的 CRD 对象来配置 Prometheus

jmx-exporterMonitor.yaml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
  labels:
    k8s-app: jmx-exporter
  name: jmx-exporter
  namespace: monitoring
spec:
  endpoints:
  - interval: 30s
    port: jmx-metrics
    scheme: http
    tlsConfig:
      insecureSkipVerify: false
  jobLabel: k8s-app
  namespaceSelector:
    matchNames:
    - kube-test
  selector:
    matchLabels:
      k8s-app: jmx-exporter

  

修改默认的clusterRole,使用Prometheus能采集其他namespace下的pod中的数据

vim prometheus-clusterRole.yaml

1
2
3
4
5
6
7
8
9
10
11
12
...
resources:
  - nodes/metrics
  - namespaces
  - services
  - endpoints
  - pods
  verbs:
  - get
  - list
  - watch
...

  

1
# kubectl replace -f  prometheus-clusterRole.yaml

  

创建

1
2
3
# kubectl create -f jmx-exporter.yaml
service/jmx-exporter created
deployment.apps/jmx-exporter created

  

查看Prometheus

 

posted @   Bigberg  阅读(4808)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2017-11-24 Rsync+inotify自动同步数据
点击右上角即可分享
微信分享提示