prometheus

安装

参考 常见服务安装

验证

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
[root@test-249 manifests]# kubectl get svc -n monitoring
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
alertmanager-main NodePort 10.56.182.15 <none> 9093:31714/TCP 12d
alertmanager-operated ClusterIP None <none> 9093/TCP,9094/TCP,9094/UDP 12d
blackbox-exporter ClusterIP 10.56.38.158 <none> 9115/TCP,19115/TCP 12d
grafana NodePort 10.56.185.87 <none> 3000:31996/TCP 12d
kube-state-metrics ClusterIP None <none> 8443/TCP,9443/TCP 12d
node-exporter ClusterIP None <none> 9100/TCP 12d
prometheus-adapter ClusterIP 10.56.34.10 <none> 443/TCP 12d
prometheus-k8s NodePort 10.56.67.105 <none> 9090:31788/TCP 12d
prometheus-operated ClusterIP None <none> 9090/TCP 12d
prometheus-operator ClusterIP None <none> 8443/TCP 12d
[root@test-249 manifests]# kubectl get pod -n monitoring
NAME READY STATUS RESTARTS AGE
alertmanager-main-0 2/2 Running 0 11d
alertmanager-main-1 2/2 Running 0 11d
alertmanager-main-2 2/2 Running 0 11d
blackbox-exporter-556d889b47-khgck 3/3 Running 0 12d
grafana-665447c488-245vl 1/1 Running 0 43h
kube-state-metrics-6f4dfb9ffb-rj2df 3/3 Running 0 12d
node-exporter-9tgm9 2/2 Running 0 12d
node-exporter-gvjsr 2/2 Running 0 12d
node-exporter-klprn 2/2 Running 0 12d
node-exporter-rdkvx 2/2 Running 0 12d
prometheus-adapter-767f58977c-2w9jn 1/1 Running 0 12d
prometheus-k8s-0 2/2 Running 1 11d
prometheus-k8s-1 2/2 Running 1 11d
prometheus-operator-764cb46c94-8ds59 2/2 Running 0 12d

原理

详情见 监控告警

metrics 类型

1
[root@test-249 manifests]# curl 10.56.67.105:9090/metrics
  1. Counter:只增不减的计数器 eg: http_requests_total , node_cpu
  2. Gauge:可增可减 eg: 主机的cpu、内存、磁盘使用率,当前的并发量
  3. Histogram : 近似的百分比估算数值,用于统计和分析样本的分布情况(eg :请求响应时间0.5s, 0.5~1, 1以上各自的占比)
  4. Summary:可以理解为 Histogram 的精准百分比估算数值

PromQL

瞬时向量:包含该时间序列中最新的一个样本值
区间向量:一段时间范围内的数据

Offset :查看多少分钟之前的数据 offset 30m

Labelsets
过滤出具有handler=”/login”的label的数据。
正则匹配:http_request_total{handler=~”.login.“}
剔除某个label:http_request_total{handler!~”.login.“}
匹配两个值:http_request_total{handler=~”/login|/password”}

数学运算:+ - * / % ^

查看主机内存总大小(Mi)

除法:node_memory_MemTotal_bytes / 1024 /1024

node_memory_MemTotal_bytes / 1024 /1024 < 3000

集合运算:and or

node_memory_MemTotal_bytes / 1024 /1024 <= 2772 or node_memory_MemTotal_bytes / 1024 /1024 == 3758.59765625

unless:排除

node_memory_MemTotal_bytes / 1024 /1024 >= 2772 unless node_memory_MemTotal_bytes / 1024 /1024 == 3758.59765625

* / %

+ -

==, !=, <=, < >= >

and unless or

聚合操作:

sum(node_memory_MemTotal_bytes) / 1024^2 求和

根据某个字段进行统计 sum(http_request_total) by (statuscode, handler)

min(node_memory_MemTotal_bytes) 最小值 max

avg(node_memory_MemTotal_bytes) 平均值 avg

标准差:stddev 标准差异:stdvar

count(http_request_total) 计数

count_values("count", node_memory_MemTotal_bytes) 对value进行统计计数

topk(5, sum(http_request_total) by (statuscode, handler)) 取前N条时序
bottomk(3, sum(http_request_total) by (statuscode, handler)) 取后N条时序

取当前数据的中位数
quantile(0.5, http_request_total)

内置函数:
一个指标的增长率
increase(http_request_total{endpoint=”http”,handler=”/datasources/proxy/:id/*”,instance=”10.244.58.200:3000”,job=”grafana”,method=”get”,namespace=”monitoring”,pod=”grafana-86b55cb79f-fn4ss”,service=”grafana”,statuscode=”200”}[1h]) / 3600

rate(http_request_total{endpoint=”http”,handler=”/datasources/proxy/:id/*”,instance=”10.244.58.200:3000”,job=”grafana”,method=”get”,namespace=”monitoring”,pod=”grafana-86b55cb79f-fn4ss”,service=”grafana”,statuscode=”200”}[1h])
长尾效应。
irate: 瞬时增长率,取最后两个数据进行计算
不适合做需要分期长期趋势或者在告警规则中使用。
rate

预测统计:
predict_linear(node_filesystem_files_free{mountpoint=”/“}[1d], 4*3600) < 0
根据一天的数据,预测4个小时之后,磁盘分区的空间会不会小于0

absent():如果样本数据不为空则返回no data,如果为空则返回1。判断数据是否在正常采集。

去除小数点:
Ceil():四舍五入,向上取最接近的整数,2.79  3
Floor:向下取, 2.79  2

Delta():差值
free内存差异 delta(node_memory_MemFree_bytes[2h])

排序:
Sort:正序
Sort_desc:倒叙

Label_join:将数据中的一个或多个label的值赋值给一个新label
label_join(node_filesystem_files_free, “new_label”, “,”, “instance”, “mountpoint”)

label_replace:根据数据中的某个label值,进行正则匹配,然后赋值给新label并添加到数据中
label_replace(node_filesystem_files_free, “host”,”$2”, “instance”, “(.)-(.)”)  

解决监控问题:

CPUThrottlingHigh 反应的是最近 5 分钟超过 25%CPU 执行周期受到限制的 container,一般是 limit 设置的低引起的。
通过两个指标进行监控的:

  1. container_cpu_cfs_periods_total:container生命周期中度过的cpu周期总数
  2. container_cpu_cfs_throttled_periods_total:container生命周期中度过的受限的cpu周期总数
    计算表达式:
    sum by(container, pod, namespace) (increase(container_cpu_cfs_throttled_periods_total{container!=""}[5m])) / sum by(container, pod, namespace) (increase(container_cpu_cfs_periods_total[5m])) > (25 / 100)

解决 schedule 和 controller 监控问题

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
apiVersion: v1
items:
- apiVersion: v1
kind: Service
metadata:
creationTimestamp: "2020-04-25T14:42:04Z"
labels:
k8s-app: kube-controller-manager
name: kube-controller-manage-monitor
namespace: kube-system
resourceVersion: "10081547"
selfLink: /api/v1/namespaces/kube-system/services/kube-controller-manage-monitor
uid: d82d9170-9335-49b8-9aae-48630eb6efd4
spec:
clusterIP: 10.96.23.157
ports:
- name: http-metrics
port: 10252
protocol: TCP
targetPort: 10252
sessionAffinity: None
type: ClusterIP
status:
loadBalancer: {}
- apiVersion: v1
kind: Endpoints
metadata:
creationTimestamp: "2020-04-25T14:41:16Z"
labels:
k8s-app: kube-controller-manager
name: kube-controller-manage-monitor
namespace: kube-system
resourceVersion: "10081388"
selfLink: /api/v1/namespaces/kube-system/endpoints/kube-controller-manage-monitor
uid: c7d0214b-58a2-4d05-8cfe-673e914e06b4
subsets:
- addresses:
- ip: 192.168.1.19
ports:
- name: http-metrics
port: 10252
protocol: TCP
kind: List
metadata:
resourceVersion: ""
selfLink: ""

pushgateway

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
instance_name=`hostname -f | cut -d'.' -f1` #本机机器名 变量⽤于之后的 标签
if [ $instance_name == "localhost" ];then # 要求机器名 不能是localhost 不然标签就没有区分了
echo "Must FQDN hostname"
exit 1
fi

# For waitting connections

label="count_netstat_wait_connections" # 定⼀个新的 key
count_netstat_wait_connections=`netstat -an | grep -i wait | wc -l` #定义⼀个新的数值 netstat中 wait 的数量

echo "$label : $count_netstat_wait_connections"
echo "$label $count_netstat_wait_connections" | curl --data-binary @- http://prometheus.server.com:9091/metrics/job/pushgateway/instance/$instance_name #最后 把 key value 推送给 pushgatway

exporter

exporter 的要求

  1. HTTP 服务器,可以响应从外发过来的 HTTP GET 请求
  2. 后台运行,并可定期抓取 本地的监控数据
  3. prometheus_server 的内容 是需要符合 prometheus 规定的 metrics 类型
  4. key-value -> prometheus(TS) values( float int ) 值是 浮点数或整数

优先选择 开源的 export ,其次使用 pushgateway ,最后使用自己的 export

AlertManager

eg 修改 alerts 的 configmap

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63

[root@test4 ~]# kubectl describe cm -n monitoring prometheus-server
Name: prometheus-server
Namespace: monitoring
Labels: app=prometheus
chart=prometheus-8.11.4
component=server
heritage=Tiller
release=prometheus
Annotations: <none>

Data
====
alerts:
----
groups:
- name: host_status_alert
rules:
- alert: 主机宕机
annotations:
description: 主机{{ $labels.instance }}宕机超过1分钟告警!
summary: 主机{{ $labels.instance }}宕机
expr: up{job="node-exporter"} == 0
for: 1m
labels:
severity: critical
- alert: CPU使用过高
annotations:
description: 主机{{ $labels.instance }}当前CPU使用率是{{ $value }}%,CPU使用率大于60%告警!
summary: 主机{{ $labels.instance }}CPU使用率过高
expr: 100-(avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by(instance)* 100)
> 60
for: 5m
labels:
severity: warning
- alert: 内存使用过高
annotations:
description: 主机{{ $labels.instance }}当前内存使用率是{{ $value }}%,内存使用率大于80%告警!
summary: 主机{{ $labels.instance }}内存使用率过高
expr: ((node_memory_MemTotal_bytes- node_memory_MemFree_bytes - node_memory_Buffers_bytes
- node_memory_Cached_bytes) / (node_memory_MemTotal_bytes )) * 100 > 80
for: 5m
labels:
severity: warning
- alert: 磁盘空间剩余不足
annotations:
description: 主机{{ $labels.instance }}的磁盘{{ $labels.mountpoint }}当前使用率是{{ $value
}},磁盘使用率大于80%告警!
summary: 主机{{ $labels.instance }}的磁盘{{ $labels.mountpoint }}可以空间不足
expr: (1-(node_filesystem_free_bytes{fstype=~"ext4|xfs|ceph",mountpoint!~"/var.*"}
/ node_filesystem_size_bytes{fstype=~"ext4|xfs|ceph",mountpoint!~"/var.*"}))
* 100 > 80
for: 5m
labels:
severity: warning
- alert: TCP连接数过多
annotations:
description: 主机{{ $labels.instance }}当前TCP_ESTABLISHED={{ $value }},TCP连接数大于1000告警!
summary: 主机{{ $labels.instance }}TCP连接数过多
expr: node_netstat_Tcp_CurrEstab > 1000
for: 5m
labels:
severity: page