场景
为保障java服务正常运行,对服务的jvm进行监控,通过使用actuator组件监控jvm情况,使用prometheus对数据进行采集,并在Grafana展现。
基于k8s场景
prometheus数据收集
- 配置service的lable,便于prometheus使用lable进行数据采集,本案例使用prometheus=jvm为标签
bash
kubectl edit service lizz-test-server -n lizz
#输出修改
...
apiVersion: v1
kind: Service
metadata:
creationTimestamp: "2022-05-05T08:16:46Z"
labels:
prometheus: jvm # 增加采集识别标签
app: lizz-test-server
name: lizz-test-server
namespace: lizz
...
bash
# 查看k8s中service
kubectl describe service lizz-test-server -n lizz
#输出
name: lizz-test-server
Namespace: lizz
Labels: prometheus=jvm
app=lizz-test-server
Selector: app=lizz-test-server
...
- 重启service或pod,新增标签生效,pod中会带上server中的lable
bash
# 删除pod方式重启,k8s启动pod
kubectl delete pod lizz-test-server-xxx
# k8s滚动重启service
kubectl rollout restart deployment/lizz-test-server
- 修改prometheus配置文件,增加采集数据任务
bash
# 查看monitoring空间下的configMap,可以看到prometheus的configMap
# cm 和 ConfigMap一个意思
kubectl get cm -n monitoring
#修改配置,加入jvm数据采集
kubectl edit cm prometheus-server-conf -n monitoring
- 在配置文件中的scrape_configs下增加抓取任务如下:
bash
global:
scrape_interval: 30s
evaluation_interval: 30s
...
scrape_configs:
- job_name: 'jvm-monitor' #任务名称
metrics_path: /actuator/prometheus # 数据抓取地址
scheme: http # 请求协议
kubernetes_sd_configs: # 服务发现配置
- role: endpoints # 在Kubernetes Endpoints中查找服务
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_prometheus] # 匹配标签
regex: 'jvm' # 保留标签值为jvm的服务
action: keep
- source_labels: [__meta_kubernetes_namespace]
action: replace # 替换标签,用于和模板中的内容一致
target_label: spring_namespace #可以根据模板中的内容进行调整
- source_labels: [__meta_kubernetes_service_name]
action: replace # 替换标签,用于和模板中的内容一致
target_label: spring_name #可以根据模板中的内容进行调整
- source_labels: [__meta_kubernetes_pod_name]
action: replace # 替换标签,用于和模板中的内容一致
target_label: instance #可以根据模板中的内容进行调整
...
- 当抓取地址不一致时,可以将metrics_path进行替换,配置如下:
bash
...
relabel_configs:
- source_labels: [__meta_kubernetes_service_label_prometheus]
regex: 'jvm'
action: keep
- source_labels: [__meta_kubernetes_service_name]
regex: 'lizz-test1-server' #当service.name=lizz-test1-server是
action: replace # 替换方法
target_label: __metrics_path__ # 替换标签metrics.path
replacement: /lizz-test1-server/actuator/prometheus # 替换后的路径
...
- 刷prometheus缓存,在服务配置中查看配置是否生效。

- 在graph中搜索jvm就可以看到是否已经采集成功。

Grafana创建面板
- 下载jvm面板模板


- dashboards中使用import导入

- 填写面板信息和数据源后导入完成

- 完成后显示jvm监控面板信息,其中筛选项如果没有正确显示,可以进行修改如下

修改筛选项内容和取值


- Name:这个选项的id,取值时使用
- Lable:显示明细
- Date source:数据来源
- query Type:数据类型
- lable:取值标签
- metric:匹配条件,为空时显示所有内容
- jvm_memory_used_bytes{spring_namespace="namespace",spring_name="service"}
- jvm_memory_used_bytes指标对应的就是prometheus中采集的数据指标
- jvm_memory_used_bytes指标中,spring_namespace等于name为"namespace"选择中的值,spring_name等于name为"service"框中的值。