基础环境:
k8s集群,集群中已经安装prometheus。
第一步:下载监控使用的agent github连接:jmx_exporter
wget https://repo1.maven.org/maven2/io/prometheus/jmx/jmx_prometheus_javaagent/0.16.1/jmx_prometheus_javaagent-0.16.1.jar
第二步:编辑prometheus-jmx-config.yaml文件
vim jmx-config.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: prometheus-jmx-config
namespace: default
data:
prometheus-jmx-config.yaml: |
lowercaseOutputLabelNames: true
lowercaseOutputName: true
whitelistObjectNames: ["java.lang:type=OperatingSystem"]
blacklistObjectNames: []
rules:
- pattern: 'java.lang<type=OperatingSystem><>(committed_virtual_memory|free_physical_memory|free_swap_space|total_physical_memory|total_swap_space)_size:'
name: os_$1_bytes
labels: {}
type: GAUGE
attrNameSnakeCase: true
- pattern: 'java.lang<type=OperatingSystem><>((?!process_cpu_time)\w+):'
name: os_$1
labels: {}
type: GAUGE
attrNameSnakeCase: true
第三步:在启动的java程序中配置agent,通常配置在JAVA_OPTS中,因为java在启动时会读取JAVA_OPTS中的配置。
在环境变量中添加如下内容
JAVA_OPTS="-javaagent:/data/jmx_exporter/jmx_prometheus_javaagent-0.16.1.jar=12345:/jmx/jmx-config.yaml"
启动方式: java ${JAVA_OPTS} -jar app.jar
官方给出的例子是:
java -javaagent:./jmx_prometheus_javaagent-0.16.1.jar=8080:config.yaml -jar yourJar.jar
因为我们是在pod中可选的方法有很多:
第一种方法:
直接在制作dockerImage时将jmx_prometheus_javaagent-0.16.1.jar和jmx-config.yaml 打包进去,在启动java项目时直接引用即可。
第二种方法(本文主要介绍):
使用configmap挂载jmx-config.yaml配置文件,将jmx_prometheus_javaagent-0.16.1.jar放在存储中挂载到容器内使用。
第四步:在prometheus配置文件中增加监控job
vim prometheus-configmap.yaml
......
- job_name: jvm
scrape_interval: 5s
kubernetes_sd_configs:
- role: endpoints
relabel_configs:
- source_labels: [__meta_kubernetes_service_annotation_prometheus_io_jvm]
action: keep
regex: true
- source_labels: [__address__, __meta_kubernetes_service_annotation_prometheus_io_port]
action: replace
target_label: __address__
regex: ([^:]+)(?::\d+)?;(\d+)
replacement: $1:$2
- source_labels: [__meta_kubernetes_service_name]
action: replace
regex: (.+)
target_label: application
replacement: $1
- action: labelmap
regex: __meta_kubernetes_service_label_(.+)
第五步:修改services 标签:
1.直接修改yaml文件: kubectl edit svc 你的service名字
例:kubectl edit svc app
apiVersion: v1
kind: Service
metadata:
annotations: #这是新增的annotate
prometheus.io/jvm: "true" #这是新增的lable
prometheus.io/port: "12345" #这是新增的lable
labels:
app: app
name: app
name: app
namespace: default
spec:
clusterIP: 10.247.4.104
externalTrafficPolicy: Cluster
ports:
- name: cce-service-0
nodePort: 30000
port: 30000
protocol: TCP
targetPort: 30000
selector:
app: app
sessionAffinity: None
type: NodePort
status:
loadBalancer: {}
2.直接命令行修改:
kubectl annotate svc 你的service名字 prometheus.io/jvm='true' prometheus.io/port='12345' --overwrite
例:
kubectl annotate svc app prometheus.io/jvm='true' prometheus.io/port='12345' --overwrite
第六步:检查prometheus 监控Targets (指标)是否存在job名为jvm的Targets
第七步:grafana添加模板
模板ID:8563