4 PromQL 语句
Prometheus 提供一个函数式的表达式语言 PromQL (Prometheus Query Language),可以使用户实时地查找和聚合时间序列数据,表达式计算结果可以在图表中展示,也可以在 Prometheus 表达式浏览器中以表格形式展示,或者作为数据源, 以 HTTP API 的方式提供给外部系统使用如 grafana
在 grafana 中都是通过 PromQL 语句来查询到对应的监控资源进行渲染
4.1 PromQL 常用语句
下面这些只是一些基本的 QL 语句,而且都是 Prometheus 自己定义好的、除非我们通过二次开发不然不能修改
4.1.1 node 监控常用语句
# 常用 QL 语句
# 查询 node 节点总内存大小
node_memory_MemTotal_bytes
# 查询 node 节点剩余可用内存
node_memory_MemFree_bytes
# 查询指定节点的总内存
node_memory_MemTotal_bytes{instance="172.31.7.111:9100"}
# 查询指定节点的可用内存
node_memory_MemFree_bytes{instance="172.31.7.111:9100"}
# 查询指定磁盘的每秒磁盘 io
node_disk_io_time_seconds_total{device="sda"}
#查看指定磁盘的磁盘剩余空间
node_filesystem_free_bytes{device="/dev/sda1",fstype="xfs",mountpoint="/"}
# CPU 负载
# HELP node_load1 1m load average.
# TYPE node_load1 gauge
node_load1 0.1
# HELP node_load15 15m load average.
# TYPE node_load15 gauge
node_load15 0.17
# HELP node_load5 5m load average.
# TYPE node_load5 gauge
node_load5 0.13
# cpu使用率 5 分钟内百分比:
100-(avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance) *100)
# cpu分别在1分钟,3分钟,5分钟之内的使用情况:
node_load1 / count by(job, instance)(count by(job, instance, cpu)(node_cpu_seconds_total))
node_load3 / count by(job, instance)(count by(job, instance, cpu)(node_cpu_seconds_total))
node_load5 / count by(job, instance)(count by(job, instance, cpu)(node_cpu_seconds_total))
# 内存使用率百分比
# (总内存 - 已使用内存 - 缓冲区内存 - 字段内存) = 剩余内存 / 总内存 * 100 = 可用内存
# node_memory_Buffers_bytes
# 可用内存
# node_memory_MemAvailable_bytes
((node_memory_MemTotal_bytes - node_memory_MemFree_bytes - node_memory_Buffers_bytes - node_memory_Cached_bytes) / (node_memory_MemTotal_bytes )) * 100
# 硬盘使用情况百分比
#(总大小-剩余大小)/总大小=硬盘使用率
(node_filesystem_size_bytes {mountpoint ="/"} - node_filesystem_free_bytes {mountpoint ="/"}) /
node_filesystem_size_bytes {mountpoint ="/"} * 100
# 硬盘io使用情况
# 硬盘使⽤率 是 read + written 读和写 都会占⽤IO /1024 两次后 就由 bytes => Mbs
((rate(node_disk_read_bytes_total[5m] )+ rate(node_disk_written_bytes_total[5m])) / 1024 /1024)
# 网卡流量
# irate 和 rate 都会用于计算某个指标在一定时间间隔内的变化速率。但是它们的计算方法有所不同:irate 取的是在指定时间范围内的最近两个数据点来算速率,而 rate 会取指定时间范围内所有数据点,算出一组速率,然后取平均值作为结果
irate(node_network_transmit_bytes_total{device!~"lo"}[1m]) / 1000
4.1.2 pod 和 容器监控语句
4.1.2.1 kubernetes 资源相关
# 关于 CPU 的 limit 合理性指标。查出最近5分钟,超过 20% 的 CPU 执行周期受到限制的容器。表达式:
sum(increase(container_cpu_cfs_throttled_periods_total{container!="", namespace!="", pod!=""}[5m])) by (container, pod, namespace) / sum(increase(container_cpu_cfs_periods_total{}[5m])) by (container, pod, namespace) > ( 20 / 100 )
# 相关指标说明:
container_cpu_cfs_periods_total :容器生命周期中度过的 cpu 周期总数
container_cpu_cfs_throttled_periods_total:容器生命周期中度过的受限的 cpu 周期总数
# 集群 CPU 过度使用。CPU 已经过度使用无法容忍节点故障,节点资源使用的总量超过节点的 CPU 总量,所以如果有节点故障将影响集群资源运行因为所需资源将无法被分配。
sum(namespace:kube_pod_container_resource_requests_cpu_cores:sum{})
/
sum(kube_node_status_allocatable_cpu_cores)
>
(count(kube_node_status_allocatable_cpu_cores)-1) / count(kube_node_status_allocatable_cpu_cores)
# 相关指标说明:
kube_pod_container_resource_requests_cpu_cores :资源 CPU 使用的 cores 数量
kube_node_status_allocatable_cpu_cores :节点 CPU cores 数量
# 集群内存过度使用。内存已经过度使用无法容忍节点故障,节点资源使用的总量超过节点的内存总量,所以如果有节点故障将影响集群资源运行因为所需资源将无法被分配。表达式:
sum(namespace:kube_pod_container_resource_requests_memory_bytes:sum{})
/
sum(kube_node_status_allocatable_memory_bytes)
>
(count(kube_node_status_allocatable_memory_bytes)-1)
/
count(kube_node_status_allocatable_memory_bytes)
# 相关指标说明:
kube_pod_container_resource_requests_memory_bytes :资源内存使用的量
kube_node_status_allocatable_memory_bytes :节点内存量
# 集群CPU是否超分。查看 CPU 资源分配的额度是否超过进群总额度
sum(kube_pod_container_resource_limits_cpu_cores{job="kube-state-metrics"})
/
sum(kube_node_status_allocatable_cpu_cores)
> 1.1
# 相关指标说明:
kube_pod_container_resource_limits_cpu_cores :资源分配的 CPU 资源额度
kube_node_status_allocatable_cpu_cores :节点 CPU 总量
# 集群超分内存,查看内存资源分配的额度是否超过进群总额度
sum(kube_pod_container_resource_limits_memory_bytes{job="kube-state-metrics"})
/
sum(kube_node_status_allocatable_memory_bytes{job="kube-state-metrics"})
> 1.1
# 相关指标说明:
kube_pod_container_resource_limits_memory_bytes :资源配额内存量
kube_node_status_allocatable_memory_bytes :节点内存量
# 命名空间级内存资源使用的比例,关乎资源配额。当使用 request 和 limit 限制资源时,使用值和最大值还是有一点区别,当有 request 时说明最低分配了这么多资源。需要注意当 request 等于 limit 时那么说明资源已经是100%已经分配使用当监控告警发出的时候需要区分。
sum (kube_pod_container_resource_requests_memory_bytes{job="kube-state-metrics"} ) by (namespace)/ (sum(kube_pod_container_resource_limits_memory_bytes{job="kube-state-metrics"}) by (namespace)) > 0.8
# 相关指标说明:
kube_pod_container_resource_requests_memory_bytes :内存资源使用量
kube_pod_container_resource_limits_memory_bytes :内存资源最大值
# 命名空间级 CPU 资源使用的比例,关乎资源配额。当使用 request 和 limit 限制资源时,使用值和最大值还是有一点区别,当有 request 时说明最低分配了这么多资源。需要注意当 request 等于 limit 时那么说明资源已经是100%已经分配使用当监控告警发出的时候需要区分。
sum (kube_pod_container_resource_requests_cpu_cores{job="kube-state-metrics"} ) by (namespace)/ (sum(kube_pod_container_resource_limits_cpu_cores{job="kube-state-metrics"}) by (namespace)) > 0.8
# 相关指标说明:
kube_pod_container_resource_requests_cpu_cores:CPU 使用量
kube_pod_container_resource_limits_cpu_cores:CPU 限额最大值
4.1.2.2 Kubernetes 存储相关
# PVC 容量监控
kubelet_volume_stats_available_bytes{job="kubelet", metrics_path="/metrics"}
/
kubelet_volume_stats_capacity_bytes{job="kubelet", metrics_path="/metrics"}
< 0.3
# 相关指标说明:
kubelet_volume_stats_available_bytes:剩余空间
kubelet_volume_stats_capacity_bytes:空间总量
# 磁盘空间耗尽预测:通过PVC资源使用6小时变化率预测 接下来4天的磁盘使用率
(kubelet_volume_stats_available_bytes{job="kubelet", metrics_path="/metrics"}
/
kubelet_volume_stats_capacity_bytes{job="kubelet", metrics_path="/metrics"}
) < 0.4
and
predict_linear(kubelet_volume_stats_available_bytes{job="kubelet", metrics_path="/metrics"}[6h], 4 * 24 * 3600) < 0
# 相关指标说明:
kubelet_volume_stats_available_bytes:剩余空间
kubelet_volume_stats_capacity_bytes:空间总量
# PV 使用状态监控。
kube_persistentvolume_status_phase{phase=~"Failed|Pending",job="kube-state-metrics"}
# 相关指标说明:
kube_persistentvolume_status_phase :PV 使用状态
4.1.2.3 kubernetes system 相关
# 组件版本与当前集群版本是否有差异。对比组件版本是否有差异,默认为1 。
count(count by (gitVersion) (label_replace(kubernetes_build_info{job!~"kube-dns|coredns"},"gitVersion","$1","gitVersion","(v[0-9]*.[0-9]*.[0-9]*).*")))
# 相关指标说明:
kubernetes_build_info:获取组件信息
# 客户端访问某些接口的错误率。
(sum(rate(rest_client_requests_total{code=~"5.."}[5m])) by (instance, job)
/
sum(rate(rest_client_requests_total[5m])) by (instance, job))
> 0.01
# 相关指标说明:
rest_client_requests_total:状态码
4.1.2.4 APIServer 相关
# APIServer 请求错误率。5分钟内 APIServer 请求错误率。
sum(rate(apiserver_request_total{job="apiserver",code=~"5.."}[5m])) by (resource,subresource,verb)
/
sum(rate(apiserver_request_total{job="apiserver"}[5m])) by (resource,subresource,verb) > 0.05
# 相关指标说明:
apiserver_request_total :APIServer 请求数
4.1.2.5 容器网络相关
# 容器 5 分钟内入带宽大于 5 M
sum by (namespace,job,name) (irate(container_network_receive_bytes_total{image!="",namespace!="",container!="",name!=""}[5m])) /1024/1024 > 5
# 容器 5 分钟内出带宽大于 5 M
sum by (namespace,job,name) (irate(container_network_transmit_bytes_total{image!="",namespace!="",container!="",name!=""}[5m])) /1024/1024 > 5
# 容器网络接收量速率是否超过 5M
sum(rate(container_network_receive_bytes_total{image!="",pod!="",namespace!=""}[5m])) without (interface) /1024/1024 > 5
# 容器网络传输量速率是否大于 5M
sum(rate(container_network_transmit_bytes_total{image!="",pod!="",namespace!=""}[5m])) without (interface) /1024/1024 > 3
# 容器 io 异常
sum by (name,job) (container_fs_io_time_seconds_total{image!="",name!=""}) /1024/1024
# CPU:
ocontainer_cpu_user_seconds_total # 以秒为单位,“用户”累计消耗CPU的时间
ocontainer_cpu_system_seconds_total # 以秒为单位,“系统”累计消耗CPU的时间
ocontainer_cpu_usage_seconds_total # 以秒为单位,累计消耗CPU的时间(上述总和)
# 内存:
ocontainer_memory_cache # 页面缓存内存的字节数
ocontainer_memory_swap # 容器交换使用情况,以字节为单位
ocontainer_memory_usage_bytes # 当前内存使用情况,以字节为单位,包括所有内存
ocontainer_memory_max_usage_bytes # 以字节为单位,最大内存使用量
# 磁盘:
ocontainer_fs_io_time_seconds_total # 执行I/O所花费的时间,以秒为单位
ocontainer_fs_io_time_weighted_seconds_total # 累计加权I/O时间,以秒为单位
ocontainer_fs_writes_bytes_total # 写入的累计字节数
ocontainer_fs_reads_bytes_total # 读取的累计字节数
# 网络:
ocontainer_network_receive_bytes_total # 接收的累计字节数
ocontainer_network_receive_errors_total # 接收时遇到的累计错误数
ocontainer_network_transmit_bytes_total # 传输的累计字节数
ocontainer_network_transmit_errors_total # 传输时遇到的累计错误数
Core DNS监控指标
coredns_dns_request_count_total指标
名称 | 说明 |
---|---|
server | 客户端请求解析所使用的dns服务端地址 |
zone | 客户端请求解析所匹配到服务端设置的zone |
proto | 响应传输层的协议,值:tcp或udp |
family | 网络层IP协议版本,值:1(ipv4),2(ipv6) |
coredns_dns_request_size_bytes指标
名称 | 说明 |
---|---|
server | 客户端请求解析所使用的dns服务端地址 |
zone | 客户端请求解析所匹配到服务端设置的zone |
proto | 响应传输层的协议,值:tcp或udp |
le | 通过UDP传递的EDNS0数据包大小分布情况,单位字节 |
le维度取值范围:0, 100, 200, 300, 400, 511, 1023, 2047, 4095, 8291, 16000, 32000, 48000, 64000
coredns_dns_request_duration_seconds指标
名称 | 说明 |
---|---|
server | 客户端请求解析所使用的dns服务端地址 |
zone | 客户端请求解析所匹配到服务端设置的zone |
le | 请求所消耗的时间,单位秒 |
le维度取值范围:0.00025,0.0005,…, 后一个以前值的2被数增加,最多16个,最后一个lnf为无穷大。
coredns_dns_request_type_count_total指标
名称 | 说明 |
---|---|
server | 客户端请求解析所使用的dns服务端地址 |
zone | 客户端请求解析所匹配到服务端设置的zone |
type | DNS解析类型 |
DNS记录类型:
解析记录 | 说明 |
---|---|
AAAA | IPv6地址 |
A | IPv4地址 |
CNAME | 一个域名 |
DNSKEY | 在DNSSEC内使用的关键记录 |
DS | 委托签发者,用于鉴定DNSSEC已授权区域的签名密钥 |
MX | 电邮交互记录,引导域名到该域名的邮件传输代理列表 |
NSEC | DNSSEC的一部分,用来验证一个未存在的服务器,使用与NXT记录的格式 |
NS | 名称服务器记录,指定DNS区域使用已有的权威域名服务器 |
PTR | 指针记录,最常用来运行反向DNS查找 |
RRSIG | DNSSEC 安全记录集证书 |
SOA | 权威记录的起始,指定有关DNS区域的权威性信息 |
SRV | 服务定位器,被新式协议使用而避免产生特定协议的记录,例如:MX 记录 |
TXT | 文本记录 |
IXFR | 增量区域转移,请求只有与先前流水式编号不同的特定区域的区域转移 |
AXFR | 全域转移,由主域名服务器转移整个区域文件至二级域名服务器 |
ANY | 所有缓存的记录或者全部已知的记录类型 |
coredns_dns_response_size_bytes指标
名称 | 说明 |
---|---|
server | 客户端请求解析所使用的dns服务端地址 |
zone | 客户端请求解析所匹配到服务端设置的zone |
proto | 响应传输层的协议,值:tcp或udp |
le | 响应返回客户端的数据大小,单位:字节 |
le维度取值范围:0, 100, 200, 300, 400, 511, 1023, 2047, 4095, 8291, 16000, 32000, 48000, 64000
coredns_panic_count_total指标
进程出现中断的次数
coredns_dns_response_rcode_count_total 指标
名称 | 说明 |
---|---|
server | 客户端请求解析所使用的dns服务端地址 |
zone | 客户端请求解析所匹配到服务端设置的zone |
rcode | 相应状态码 |
常见状态码:
DNS响应状态码 | 说明 |
---|---|
NOERROR | 查询请求成功完成 |
FORMERR | 查询请求格式错误 |
SERVFAIL | 服务端处理失败 |
NXDOMAIN | 请求查询的域名不存在 |
NOTIMP | 功能未实现 |
REFUSED | 服务端拒绝回复该查询 |
4.1.3 etcd 常用监控指标
# etcd集群没有leader
etcd_server_has_leader == 0
# Etcd 大量的领导者变更
increase(etcd_server_leader_changes_seen_total[10m]) > 2
# etcd 服务器在过去一小时收到了超过 5 个失败的提案
increase(etcd_server_proposals_failed_total[1h]) > 5
# Etcd WAL fsync 持续时间增加,第 99 个百分位超过 0.5s ,表示磁盘问题
histogram_quantile(0.99, rate(etcd_disk_wal_fsync_duration_seconds_bucket[1m])) > 0.5
# etcd 提交持续时间增加,第 99 个百分位超过 0.25s
histogram_quantile(0.99, rate(etcd_disk_backend_commit_duration_seconds_bucket[1m])) > 0.25
4.1.4 Prometheus 自身监控语句
# Prometheus 服务停掉
absent(up{job="prometheus"})
# job 丢失
up == 0
# Prometheus 失去的 job
count by (job) (up) == 0
# Prometheus 配置重载错误
prometheus_config_last_reload_successful != 1
# Prometheus 在过去 15 分钟内重启了两次以上,服务可能崩溃
changes(process_start_time_seconds{job=~"prometheus|pushgateway|alertmanager"}[15m]) > 2
# Prometheus 无法连接alertmanager
prometheus_notifications_alertmanagers_discovered < 1
# Prometheus 在服务发现中没有目标
prometheus_sd_discovered_targets == 0
# Prometheus 抓取监控指标过慢
prometheus_target_interval_length_seconds{quantile="0.9"} > 60
# Prometheus 目标抓取重复
increase(prometheus_target_scrapes_sample_duplicate_timestamp_total[5m]) > 0
# Prometheus TSDB 检查点创建失败
increase(prometheus_tsdb_checkpoint_creations_failed_total[1m]) > 0
# Prometheus TSDB 检查点删除失败
increase(prometheus_tsdb_checkpoint_deletions_failed_total[1m]) > 0
# Prometheus TSDB 压缩失败
increase(prometheus_tsdb_compactions_failed_total[1m]) > 0