通过在应用中埋点来暴露JVM数据,使用阿里云Prometheus监控采集JVM数据,借助Prometheus Grafana大盘来展示JVM数据,并创建报警,即可实现利用Prometheus监控JVM的目的。本文档以安装在阿里云容器服务K8s集群上的应用为例,介绍如何通过Prometheus监控JVM。
操作流程
本教程的操作流程如图所示。
步骤一:通过埋点暴露JVM数据
您需要在应用中使用JVM Exporter暴露JVM数据。
具体步骤如下:
在pom.xml 文件中添加Maven依赖。 <dependency>
<groupId>io.prometheus</groupId>
<artifactId>simpleclient_hotspot</artifactId>
<version>0.6.0</version>
</dependency>
在可以执行初始化的位置添加初始化JVM Exporter的方法。
例如Demo工程的/src/main/java/com/monitise/prometheus_demo/DemoController.java 文件。
@PostConstruct
public void initJvmExporter() {
io.prometheus.client.hotspot.DefaultExports.initialize();
}
在/src/main/resources/application.properties 文件中配置用于Prometheus监控的端口(Port)和路径(Path)。 management.port: 8081
endpoints.prometheus.path: prometheus-metrics
在/src/main/java/com/monitise/prometheus_demo/PrometheusDemoApplication.java 文件中打开HTTP端口。 @SpringBootApplication
// sets up the prometheus endpoint /prometheus-metrics
@EnablePrometheusEndpoint
// exports the data at /metrics at a prometheus endpoint
@EnableSpringBootMetricsCollector
public class PrometheusDemoApplication {
public static void main(String[] args) {
SpringApplication.run(PrometheusDemoApplication.class, args);
}
}
步骤二:将应用部署至阿里云容器服务K8s集群
您需要将该应用部署至容器服务K8s集群,以便阿里云Prometheus监控采集JVM数据。
具体步骤如下:
逐行运行Demo工程中的buildDockerImage.sh 中的以下命令,构建名为promethues-demo的Docker镜像,并将镜像推送至阿里云容器镜像服务ACR。 mvn clean install -DskipTests
docker build -t <本地临时Docker镜像名称>:<本地临时Docker镜像版本号> . --no-cache
sudo docker tag <本地临时Docker镜像名称>:<本地临时Docker镜像版本号> <Registry域名>/<命名空间>/<镜像名称>:<镜像版本号>
sudo docker push <Registry域名>/<命名空间>/<镜像名称>:<镜像版本号>
例如:
mvn clean install -DskipTests
docker build -t promethues-demo:v0 . --no-cache
sudo docker tag promethues-demo:v0 registry.cn-hangzhou.aliyuncs.com/testnamespace/promethues-demo:v0
sudo docker push registry.cn-hangzhou.aliyuncs.com/testnamespace/promethues-demo:v0
登录容器服务Kubernetes版控制台 。
在左侧导航栏选择集群 ,在集群列表 页面上的目标集群右侧操作 列单击应用管理 。
在工作负载 页面单击无状态 页签,在无状态 页签中,单击使用模板创建 。
在使用模板创建 页签中,选择示例模板 为自定义 ,并在文本框中填写以下内容,然后单击创建 ,将步骤1 中创建的Docker镜像promethues-demo部署至容器服务K8s集群中。
说明 以下配置文件中的
prometheus.io/port 和
prometheus.io/path 的值分别为
步骤一 中暴露的阿里云Prometheus监控端口和路径。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: prometheus-demo
spec:
replicas: 2
template:
metadata:
annotations:
prometheus.io/scrape: 'true'
prometheus.io/path: '/prometheus-metrics'
prometheus.io/port: '8081'
labels:
app: tomcat
spec:
containers:
- name: tomcat
imagePullPolicy: Always
image: registry.cn-hangzhou.aliyuncs.com/fuling/promethues-demo:v0
ports:
- containerPort: 8080
name: tomcat-normal
- containerPort: 8081
name: tomcat-monitor
在左侧导航栏选择服务 ,在页面右上角单击使用YAML创建资源 。
在工作负载 对应页签中填写以下内容,然后单击创建 。 apiVersion: v1
kind: Service
metadata:
labels:
app: tomcat
name: tomcat
namespace: default
spec:
ports:
- name: tomcat-normal
port: 8080
protocol: TCP
targetPort: 8080
- name: tomcat-monitor
port: 8081
protocol: TCP
targetPort: 8081
type: NodePort
selector:
app: tomcat
步骤三:配置阿里云Prometheus监控以采集JVM数据
具体步骤如下:
登录容器服务Kubernetes版控制台 。
为目标容器服务K8s集群开启阿里云Prometheus监控。具体操作,请参见开始使用Prometheus监控 。
登录ARMS控制台 。
在左侧导航栏单击Prometheus监控 。
在Prometheus监控 页面左上角选择容器服务K8s集群所在的地域,并在目标集群右侧的操作 列单击设置 。
在设置 页面单击服务发现 页签,在服务发现 页签上单击添加ServiceMonitor ,在添加ServiceMonitor 对话框中填写以下内容,然后单击确定 。 apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
# 填写一个唯一名称
name: tomcat-demo
# 填写目标命名空间
namespace: default
spec:
endpoints:
- interval: 30s
# 填写service.yaml中Prometheus Exporter对应的Port的Name字段的值
port: tomcat-monitor
# 填写Prometheus Exporter对应的Path的值
path: /metrics
namespaceSelector:
any: true
# Demo的命名空间
selector:
matchLabels:
# 填写service.yaml的Label字段的值以定位目标service.yaml
app: tomcat
步骤四:通过Grafana大盘展示JVM数据
您需要在Prometheus控制台导入Grafana大盘模板并指定Prometheus数据源所在的容器服务K8s集群。
打开Prometheus Grafana大盘概览页 。
在左侧导航栏中选择,并在Grafana.com Dashboard 文本框输入10877 ,然后单击Load 。
在Import 页面输入以下信息,然后单击Import 。
在Name 文本框中输入自定义的大盘名称。
在Folder 列表中选择您的阿里云容器服务K8s集群。
在Select a Prometheus data source 下拉框中选择您的阿里云容器服务K8s集群。
配置完毕后的Prometheus Grafana JVM大盘如图所示。
步骤五:创建Prometheus监控报警
登录ARMS控制台 。
在左侧导航栏单击Prometheus监控 。
在顶部菜单栏选择目标地域,然后单击目标K8s集群名称。
在左侧导航栏中选择报警配置Beta ,然后在右上角单击创建报警 。
在创建报警 对话框中输入以下信息,完成后单击确认 。
填写规则名称 ,例如:网络接收压力报警。
输入报警规则表达式,表达式需要使用PromQL语句。例如:(sum(rate(kube_state_metrics_list_total{job="kube-state-metrics",result="error"}[5m]))
/ sum(rate(kube_state_metrics_list_total{job="kube-state-metrics"}[5m]))) > 0.01
。
注意 PromQL语句中包含的$
符号会导致报错,您需要删除包含$符号的语句中=
左右两边的参数及=
。例如:将sum (rate (container_network_receive_bytes_total{instance=~"^$HostIp.*"}[1m]))
修改为sum (rate (container_network_receive_bytes_total[1m]))
。
在标签 区域单击创建标签 可以设置报警标签,设置的标签可用作分派规则的选项。
在注释 区域可以编辑告警信息发送模板。单击创建注释 ,设置键 为message ,设置值 为 {{变量名}}告警信息 。设置完成后的格式为:message:{{变量名 }}告警信息,例如:message:{{$labels.pod_name}}重启。
您可以自定义变量名 ,也可以选择已有的标签作为变量名 。已有的标签包括:
报警规则表达式指标中携带的标签。
通过报警规则创建的标签,请参见创建报警 。
ARMS系统自带的默认标签,默认标签说明如下。
标签
说明
alertname
告警名称,格式为:告警名称_集群名称。
_aliyun_arms_alert_level
告警等级。
_aliyun_arms_alert_type
告警类型。
_aliyun_arms_alert_rule_id
告警规则对应的ID。
_aliyun_arms_region_id
地域ID。
_aliyun_arms_userid
用户ID。
_aliyun_arms_involvedObject_type
关联对象子类型,如ManagedKubernetes,ServerlessKubernetes。
_aliyun_arms_involvedObject_kind
关联对象分类,如app,cluster。
_aliyun_arms_involvedObject_id
关联对象ID。
_aliyun_arms_involvedObject_name
关联对象名称。
相关操作
Prometheus Grafana JVM大盘配置完毕后,您可以查看Prometheus监控指标和进一步自定义大盘,请参见以下文档:
在文档使用中是否遇到以下问题
更多建议
匿名提交