Prometheus简介
Prometheus是一套开源的系统监控和报警框架,灵感源自Google的Borgmon监控系统。2012年,SoundCloud的Google前员工创造了Prometheus,并作为社区开源项目进行开发。2015年,该项目正式发布。2016年,Prometheus加入云原生计算基金会(Cloud Native Computing Foundation),成为受欢迎度仅次于Kubernetes的项目。
Prometheus具有以下特性:
多维的数据模型(基于时间序列的Key、Value键值对)
灵活的查询和聚合语言PromQL
提供本地存储和分布式存储
通过基于HTTP的Pull模型采集时间序列数据
可利用Pushgateway(Prometheus的可选中间件)实现Push模式
可通过动态服务发现或静态配置发现目标机器
支持多种图表和数据大盘
ARMS Prometheus监控和开源Prometheus监控对比的优势
整体而言,与开源Prometheus监控相比,ARMS Prometheus监控的优势体现为:
更轻量、更稳定、更准确
数据量无上限
完全兼容开源生态
节省成本
更轻量更稳定更准确
与开源Prometheus监控相比,ARMS Prometheus监控的整体结构更加轻量化。您无需自行搭建Prometheus监控系统,仅需安装ARMS Prometheus监控探针PromAgent即可开始监控业务。
在系统稳定性方面,开源Prometheus监控一般会占用16GB~128GB的内存,而ARMS Prometheus监控仅占用200MB~1GB的内存和1核CPU。相比开源Prometheus监控,ARMS Prometheus监控更加稳定。
在抓取和写入数据的准确性方面,开源Prometheus监控仅抓取1次数据,并且瞬时写入存储组件时存在丢弃逻辑。而ARMS Prometheus监控抓取数据会重试多次,持续并发写入存储组件,不存在丢弃逻辑。
数据量无上限
开源Prometheus监控的数据采集能力上限为百万条Metrics级别,而ARMS Prometheus监控的数据采集能力可以按照K8s副本数水平扩展,从而均衡分解采集任务。
开源Prometheus监控的数据存储能力上限受本地磁盘大小的限制,而ARMS Prometheus监控使用中心云存储服务,理论上存储能力无上限。
完全兼容开源生态
ARMS Prometheus监控完全兼容Prometheus监控开源生态链路中的客户端和查询语言部分,兼容并优化开源生态链路中的采集规则和使用价值部分。
ARMS Prometheus监控兼容并提供三种主流采集规则的实现,包括标准开源prometheus.yaml 采集规则配置文件、适合自定义K8s内监控的采集规则ServiceMonitor、以及默认采集规则Annotation。与开源Prometheus监控相比,ARMS Prometheus监控无需重启,即可使用prometheus.yaml 配置文件动态更新采集规则。在Deployment 文件里也无需编写多行代码,仅需增加以下3个Annotation注解即可。
prometheus.io /scrape: "true"
prometheus.io /port: "9090"
prometheus.io /path : "/metrics"
ARMS Prometheus监控兼容可视化Grafana。通过配置Prometheus HTTP API URL即可在Grafana中完成数据源的多租户隔离,以及Grafana大盘的多租户隔离。ARMS Prometheus监控还兼容Grafana的Explore数据调试模块。
ARMS Prometheus监控兼容开源Prometheus监控的HTTP API模块,完整支持query、query_range和labelValues 3个标准数据查询接口,并通过在数据URL中添加/userId/clusterId/regionId/ 这组ID达到多租户隔离的效果。
ARMS Prometheus监控虽然使用ARMS已有的告警系统,但完全兼容开源Prometheus监控的告警规则PromQL。
节省成本
ARMS Prometheus监控支持默认K8s监控。在您安装默认K8s监控后,ARMS Prometheus监控会自动为您创建默认的Exporter、采集规则、Grafana大盘以及ARMS告警。您的时间成本可由原来使用开源Prometheus监控K8s的3天左右降低至10分钟左右。
ARMS Prometheus监控支持开源组件监控。您仅需输入阿里云账号的AccessKeyId和AccessKeySecret,以及RDS和Redis组件的账号和密码,ARMS Prometheus监控即可为您默认生成这些组件的Exporter,并为您创建默认的组件大盘。您的时间成本可由原来使用开源Prometheus监控开源组件的7天左右降低至3分钟左右。
ARMS Prometheus监控支持一键安装、一键卸载,以及通过健康检查功能调试Prometheus监控。您的时间成本可由原来使用开源Prometheus监控的1天左右降低至3分钟左右。
专家版
Prometheus监控试用版到期后,如需继续使用,您需要开通专家版。
注意
每条上报指标最大不能超过2 KB。
每条指标最多存储15天,超过15天的指标数据会被清理。
自定义指标收费标准根据每天上报的指标数量范围,按照阶梯式递减方式进行累加计算,如下表所示。
日上报指标数范围(百万条)
单价(元/百万条)
日付费范围(元)
0~50
0.8
0~40
50~150
0.65
40~105
150~300
0.55
105~187.5
300~600
0.45
187.5~322.5
600~1200
0.35
322.5~530.5
1200以上
0.25
530.5以上
您可以在Prometheus控制台的Prometheus监控任务列表页面,单击右上角的资源消耗统计 查看Prometheus监控昨日的总消费情况。
通过ARMS Prometheus监控JVM
通过在应用中埋点来暴露JVM数据,使用ARMS Prometheus监控采集JVM数据,借助ARMS Prometheus Grafana大盘来展示JVM数据,并创建报警,即可实现利用ARMS Prometheus监控JVM的目的。本文档以安装在阿里云容器服务K8s集群上的应用为例,介绍如何通过ARMS Prometheus监控JVM。
前提条件
您已完成以下操作:
下载Demo工程
快速创建Kubernetes集群
使用私有镜像仓库创建应用
操作流程
本教程的操作流程如图所示。
步骤一:通过埋点暴露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
@EnablePrometheusEndpoint
@EnableSpringBootMetricsCollector
public class PrometheusDemoApplication {
public static void main (String[] args) {
SpringApplication.run(PrometheusDemoApplication.class , args ) ;
}
}
步骤二:将应用部署至阿里云容器服务K8s集群
您需要将该应用部署至容器服务K8s集群,以便ARMS Prometheus监控采集JVM数据。
具体步骤如下:
逐行运行Demo工程中的buildDockerImage.sh 中的以下命令。
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 .
sudo docker tag promethues-demo:v0 registry.cn-hangzhou.aliyuncs.com/fuling/promethues-demo:v0
sudo docker push registry.cn-hangzhou.aliyuncs.com/fuling/promethues-demo:v0
此步骤构建了名为promethues-demo的Docker镜像,并将镜像推送至阿里云容器镜像服务ACR。
登录容器服务Kubernetes版控制台。
在左侧导航栏选择,在集群列表 页面上的目标集群右侧操作 列单击控制台 。
在左侧导航栏选择,在页面右上角单击创建 ,并在使用文本创建 页签的文本框中填写以下内容。
说明 以下配置文件中的prometheus.io/port 和prometheus.io/path 的值分别为步骤一中暴露的ARMS 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
此步骤将步骤1中创建的名称为promethues-demo的Docker镜像部署至容器服务K8s集群中。
在左侧导航栏选择,在页面右上角单击创建 ,并在使用文本创建 区域填写以下内容。
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
步骤三:配置ARMS Prometheus监控以采集JVM数据
您需要在ARMS控制台配置ARMS Prometheus监控以采集JVM数据。
具体步骤如下:
登录ARMS控制台。
在左侧导航栏中单击Prometheus监控 。
在Prometheus监控 页面顶部选择容器服务K8s集群所在的地域,并在目标集群右侧的操作 列单击安装 。
ARMS Prometheus Agent安装完毕后,请继续执行下一步操作。
在目标集群右侧的操作 列单击设置 。
在配置详情 页签上单击添加ServiceMonitor ,在新增ServiceMonitor 对话框中填写以下内容。
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: tomcat-demo
namespace: default
spec:
endpoints:
- interval: 30s
port: tomcat-monitor
path: /prometheus-metrics
namespaceSelector:
any: true
selector:
matchLabels:
app: tomcat
步骤四:通过Grafana大盘展示JVM数据
您需要在ARMS控制台导入Grafana大盘模板并指定Prometheus数据源所在的容器服务K8s集群。
具体步骤如下:
打开ARMS Prometheus Grafana大盘概览页。
在左侧导航栏中选择,并在Grafana.com Dashboard 文本框输入10877 ,然后单击Load 。
在Import 页面输入以下信息,然后单击Import 。
在Name 文本框中输入自定义的大盘名称。
在Folder 列表中选择您的阿里云容器服务K8s集群。
在Select a Prometheus data source 下拉框中选择您的阿里云容器服务K8s集群。
配置完毕后的ARMS Prometheus Grafana JVM大盘如图所示。
步骤五:创建Prometheus监控报警
报警创建提供两个入口,您可根据需要自行选择其中一个入口进入创建报警环节:
在ARMS Prometheus Grafana大盘的New DashBoard 页面,单击左侧的 图标,跳转至ARMS Prometheus 报警规则和历史 页面,在右上角单击。
在控制台左侧导航栏中选择,进入报警规则和历史 页面,在右上角单击。
在创建报警 对话框中输入所有必填信息,完成后单击保存 。
在创建报警对话框中配置如下参数:
填写报警名称,例如:网络接收压力报警。
选择要创建报警的Prometheus监控对应的集群 。
选择类型 为grafana 。
选择要监控的具体大盘 和图表 。
设置报警规则。
选中同时满足下述规则 。
编辑报警规则,例如:N=5时网络接收数据字节(MB)的平均值大于等于3时则报警。
说明 一个Grafana图表中可能有A、B、C等多条曲线数据,您可根据您的需求设置监控其中的一条线。
在PromQL 输入框中编辑或重新输入PromQL语句。
注意 PromQL语句中包含的$
符号会导致报错,您需要删除包含$
符号的语句中=
左右两边的参数及=
。例如:将sum (rate (container_network_receive_bytes_total{instance=~"^$HostIp.*"}[1m]))
修改为sum (rate (container_network_receive_bytes_total[1m]))
。
选中通知方式,例如:选中短信。
设置通知对象。在全部联系组 中单击联系人分组的名称,该联系人分组出现在已选联系组 中,即设置成功。
通过ARMS Prometheus监控Mysql
使用 ARMS Prometheus 监控抓取 MySQL 数据,并借助 ARMS Prometheus Grafana 大盘来展示 MySQL 数据,即可实现通过 ARMS Prometheus 监控 MySQL 的目的。
前提条件
快速创建Kubernetes托管版集群
使用私有镜像仓库创建应用
背景信息
本教程的操作流程如图所示。
步骤一:通过外部应用抓取 MySQL 数据
将 Prometheus 官方提供的 mysqld-exporter 镜像部署至容器服务 K8s 集群,以便抓取 MySQL 数据。
登录容器服务Kubernetes版控制台。
在左侧导航栏选择,在集群列表 页面上的目标集群右侧操作 列单击控制台 。
在左侧导航栏选择,在页面右上角单击创建 ,并在使用文本创建 页签上填写以下内容。
说明 请将 <yourMySQLUsername> 、<yourMySQLPassword> 、<IP> 、<port> 替换为 MySQL 的对应值。
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
name: mysqld-exporter
spec:
replicas: 1
template:
metadata:
labels:
app: mysqld-exporter
spec:
containers:
- name: mysqld-exporter
imagePullPolicy: Always
env:
- name: DATA_SOURCE_NAME
value: "<yourMySQLUsername>:<yourMySQLPassword>@(<IP>:<port>)/"
image: prom/mysqld-exporter
ports:
- containerPort: 9104
name: mysqld-exporter
此步骤将 mysqld-exporter 应用部署至容器服务 K8s 集群中。
在左侧导航栏选择,在页面右上角单击创建 ,并在使用文本创建 页签上填写以下内容。
apiVersion: v1
kind: Service
metadata:
labels:
app: mysqld-exporter
name: mysqld-exporter
spec:
ports:
- name: mysqld-exporter
port: 9104
protocol: TCP
targetPort: 9104
type: NodePort
selector:
app: mysqld-exporter
步骤二:配置 ARMS Prometheus 监控以接收 MySQL 数据
接下来需要在 ARMS 控制台配置 ARMS Prometheus 监控以接收外部应用所抓取的 MySQL 数据。
登录ARMS控制台。
在左侧导航栏中单击 Prometheus监控 。
在 Prometheus监控 页面顶部选择容器服务 K8s 集群所在的地域,并在目标集群右侧的操作 列单击安装 。
ARMS Prometheus Agent 安装完毕后,在目标集群右侧的操作 列单击设置 。
在配置详情 页签上单击添加ServiceMonitor ,在新增ServiceMonitor 对话框中填写以下内容。
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
labels:
app: mysqld-exporter
release: p
name: mysqld-exporter
namespace: default
spec:
endpoints:
- interval: 30s
port: mysqld-exporter
path: /metrics
namespaceSelector:
any: true
selector:
matchLabels:
app: mysqld-exporter
步骤三:通过 Grafana 大盘展示 MySQL 数据
最后需要在 ARMS 控制台导入 Grafana 大盘模板并指定 Prometheus 数据源所在的容器服务 K8s 集群。
打开 ARMS Prometheus Grafana 大盘概览页。
在左侧导航栏中选择 ,并在 Grafana.com Dashboard 文本框输入 7362 ,然后单击 Load 。
在 Import 页面输入以下信息,然后单击 Import 。
在 Name 文本框中输入自定义的大盘名称。
在 Folder 下拉框中选择您的阿里云容器服务 K8s 集群。
在 prometheus 下拉框中选择您的阿里云容器服务 K8s 集群。
配置完毕后的 ARMS Prometheus Grafana MySQL 大盘如图所示。
步骤四:创建 Prometheus 监控报警
报警创建提供两个入口,您可根据需要自行选择其中一个入口进入创建报警环节:
在ARMS Prometheus Grafana大盘的New DashBoard 页面,单击左侧的 图标,跳转至ARMS Prometheus 报警规则和历史 页面,在右上角单击。
在控制台左侧导航栏中选择,进入报警规则和历史 页面,在右上角单击。
在创建报警 对话框中输入所有必填信息,完成后单击保存 。
在创建报警对话框中配置如下参数:
填写报警名称,例如:网络接收压力报警。
选择要创建报警的Prometheus监控对应的集群 。
选择类型 为grafana 。
选择要监控的具体大盘 和图表 。
设置报警规则。
选中同时满足下述规则 。
编辑报警规则,例如:N=5时网络接收数据字节(MB)的平均值大于等于3时则报警。
说明 一个Grafana图表中可能有A、B、C等多条曲线数据,您可根据您的需求设置监控其中的一条线。
在PromQL 输入框中编辑或重新输入PromQL语句。
注意 PromQL语句中包含的$
符号会导致报错,您需要删除包含$
符号的语句中=
左右两边的参数及=
。例如:将sum (rate (container_network_receive_bytes_total{instance=~"^$HostIp.*"}[1m]))
修改为sum (rate (container_network_receive_bytes_total[1m]))
。
选中通知方式,例如:选中短信。
设置通知对象。在全部联系组 中单击联系人分组的名称,该联系人分组出现在已选联系组 中,即设置成功。
通过ARMS Prometheus自定义Grafana大盘
ARMS Prometheus监控可以通过ARMS Prometheus Grafana大盘来展示监控数据,并且支持自定义创建Grafana大盘和从Grafana官网导入大盘两种方式。本文主要介绍自定义Grafana大盘来展示监控数据的方式。
步骤一:将应用部署至阿里云容器服务K8s集群
首先需要将应用部署至容器服务K8s集群,以便ARMS Prometheus监控抓取JVM数据。
逐行运行buildDockerImage.sh 中的以下命令。
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 .
sudo docker tag promethues-demo:v0 registry.cn-hangzhou.aliyuncs.com/fuling/promethues-demo:v0
sudo docker push registry.cn-hangzhou.aliyuncs.com/fuling/promethues-demo:v0
此步骤构建了名为promethues-demo的Docker镜像,并将镜像推送至阿里云Docker Registry。
登录容器服务Kubernetes版控制台。
在左侧导航栏选择,在集群列表 页面上的目标集群右侧操作 列单击控制台 。
在左侧导航栏选择,在页面右上角单击创建 ,并在使用文本创建 页签上填写以下示例内容。
说明 以下配置文件中的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
此步骤将promethues-demo这个Docker镜像部署至容器服务K8s集群中。
在左侧导航栏选择,在页面右上角单击创建 ,并在使用文本创建 页签上填写以下内容。
apiVersion: v1
kind: Service
metadata:
labels:
name: 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
步骤二:为应用安装ARMS Prometheus Agent
登录ARMS控制台。
在左侧导航栏中单击Prometheus监控 。
在Prometheus监控 页面顶部选择容器服务K8s集群所在的地域,并在目标集群右侧的操作 列单击安装 。
说明 如果安装失败,请多次尝试安装直至成功。如果多次尝试后依然失败,请联系我们的钉钉账号23148410
进行解决。
步骤三:为应用配置Prometheus监控采集规则
ARMS Prometheus Agent安装完成后,会默认监控CPU信息、内存信息、网络信息等。如果您需要监控默认数据外的其他数据,例如订单信息,那么需要为应用配置Prometheus监控采集规则。
在目标集群右侧的操作 列单击设置 。
为应用配置Prometheus监控采集规则分为以下两种情况。
如果您需要监控部署在K8s集群内的应用的业务数据,例如订单信息,可以在服务发现 页签上单击添加ServiceMonitor ,并在新增ServiceMonitor 对话框中参考以下示例内容进行填写。
apiVersion: monitoring.coreos.com/v1
kind: ServiceMonitor
metadata:
name: tomcat-demo
namespace: default
spec:
endpoints:
- interval: 30s
port: tomcat-monitor
path: /prometheus-metrics
namespaceSelector:
any: true
selector:
matchLabels:
app: tomcat
如果您需要监控部署在K8s集群之外的业务数据,如Redis连接数时,可以在配置详情 页签上单击编辑prometheus.yaml 配置原生的prometheus.yaml文件,并在编辑prometheus.yaml 对话框中参考以下示例内容进行填写。
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'prometheus'
static_configs:
- targets: ['localhost:9090']
步骤四:自定义创建Grafana大盘
打开ARMS Prometheus Grafana大盘概览页。
在左侧导航栏中选择,并在New Panel 区域框中单击Add Query 。
在Query 右侧的下拉列表中选择集群。在A 折叠面板的Metrics 下拉列表中选择监控指标,例如:go_gc_duration_seconds 。
单击页面左侧的图表图标,选择大盘的可视化类型,如图形、表格、热点图等,并根据您的需求配置其他参数。
单击页面左侧的设置图标,填写图表名称。
单击页面左侧的铃铛图标,在Alert 区域单击Create Alert 配置告警。后续告警配置页面会跳转至ARMS Prometheus监控告警配置页面,详情请参见创建Prometheus监控报警。
单击右上角的保存图标,在Save As… 对话框中输入大盘名称,并选择集群,然后单击Save 保存大盘和图表。您可根据需要自行创建多个大盘和图表。
步骤五:进行数据调试监控复杂指标
如果需要监控涉及复杂运算的指标,您需要在ARMS Prometheus监控中进行数据调试,从而得到相应的PromQL语句。
在Prometheus监控 页面,单击目标集群右侧的操作 列的设置 。
单击数据调试 ,跳转至ARMS Prometheus Grafana的Explore 页面,您可以在Metrics 输入框中输入PromQL语句进行调试。
调试成功后,您可以参考上述步骤继续添加大盘或图表,详情请参见步骤四:自定义创建Grafana大盘。
执行结果
配置完毕后的ARMS Prometheus Grafana大盘如图所示。
更多关于阿里云Prometheus的问题请咨询云技术在线。