基础环境:
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
注意:如果正在使用新版的kube-prometheus那么他的资源对象都是由CRDs定义和控制的,建议自己定义个ServiceMonitor暴露给prometheus-Operator实现自动发现和监控功能。
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