1. 前言
本文记录使用Grafana和Prometheus时遇到的一些问题,备忘。
2. Grafana Dashboard相关问题
2.1. 常用的Dashboard
问:Grafana常用的Dashboard有哪些?
答:
- node exporter:1860
- cAdvisor:3125
- dcgm exporter:12239
更多的Dashboard,可以到网站Grafana Dashboards上查找。
2.2. 数据源和Dashboard
问:一个prometheus数据源中,会包含不同类型exporter采集的metrics数据,grafana中的一个dashboard怎样知道哪些数据是自己应该展示的?
答:和exporter无关,grafana只关心metrics,grafana根据指标名称和标签过滤自己需要的数据。
2.3. 复制Dashboard后,怎样更换数据源?
问:Dashboard的设置中,选择Save As保存到另外一个文件夹,但是数据源并不会发生变化。如果想要替换数据源,应该怎样配置?
答:编辑JSON Model,查找uid
对应的value,全部替换成新的数据源uid。
数据源uid获取方法:打开配置,数据源配置,点击数据源进入编辑页面,此时浏览器地址栏 /edit/
后面的就是数据源的uid。
2.4. 怎样拷贝Dashboard配置?
问:如果已经有了一个Dashboard B,想要拷贝另一个Dashboard A的配置,该怎样操作?
答:拷贝Dashboard A 的 JSON Model 中的 panels
和 templating
部分,粘贴到Dashboard B的JSON Model,保存即可。
2.5. Node Exporter Full 显示问题
问:Node Exporter Full 中,当选择的时间范围小于24小时的时候,CPU Basic和Network Traffic Basic的内容为空,该怎么解决?
答:修改Grafana数据源抓取时间间隔为30s或者1m。
Grafana中默认的数据源抓取数据时间间隔是15s,而Prometheus中抓取数据时间间隔可能是1m,这时就会出现问题。
参考文档:No data available when interval is less than 24 hours
2.6. Docker monitoring 显示问题
问:Docker monitoring - alicek106 revision中,一个容器的 Network Rx 和 Network Tx 对应两条线,是怎么回事?
答:正常现象,说明该容器存在多个网卡。
查看query语句
1 | irate(container_network_receive_bytes_total{image!="", instance=~"$server", name=~"$container"}[5m]) |
在explore页面使用PromQL查询,可以发现指定容器查询可以查询出两个结果,分别有 eth0 和 tunl0 两张卡。
1 | container_network_receive_bytes_total{id="/system.slice/docker-cff8168986d12d8399fde55d3e65a056af56bcf6e67187d926a9d974b4a2c1c2.scope", image="gcr.dockerproxy.com/cadvisor/cadvisor:v0.47.1", instance="192.168.56.101:9101", interface="eth0", job="cadvisor", name="cadvisor"} |
比较好的处理方式:修改Options中的Legend,修改为 {{name}}-{{interface}}
,这样图表就清晰了。
3. Grafana Variables相关问题
3.1. label_values函数
问:Grafana的Dashboard中,可以创建Variables用来筛选数据,其中Query经常使用 label_values
,这个函数是Grafana自带的,还是PromQL自带的?
答:Grafana自带的,PromQL中用不了。
label_values(node_uname_info, job)
详解:
label_values()
函数用于从指定指标中提取指定标签的唯一值列表。node_uname_info
是一个指标名称,代表了包含有关节点操作系统和内核的信息的指标。job
是要提取的标签名称,这里表示作业或服务的标识。
label_values的一个典型应用:在cAdvisor的3125
的dashboard中增加一个根据容器名称的二级筛选。
3125
的dashboard,默认有一个变量为server,能够根据主机筛选出主机上的所有容器。但是容器时不方便观察,最好能够根据容器名称再进行一层筛选。
1、新增一个变量
Settings,Variables,New
2、配置变量
- Name:container
- Type:Query
- Data source:prometheus
- Refresh:On dashboard load
- Query:
label_values(container_cpu_usage_seconds_total{instance="$server"},name)
3、调整PromQL配置
1 | rate(container_cpu_user_seconds_total{image!="", instance=~"$server", name=~"$container"}[5m]) * 100 |
3.2. Regex的作用是什么?
问:配置Variables时,Query Options中有一个Regex,它的作用是什么?
答:使用Query中的表达式筛选出的数据,可能不符合预期,这时可以使用Regex对这些数据进一步过滤。
3.3. 怎样允许多选?
问:在dashboard页面,想要选中多个主机,该怎样配置?
答:修改Variables配置,启用 Selection options 中的 Multi-value
3.4. 怎样显示所有选项?
问:在dashboard页面,通过变量筛选一个主机后,想要返回查看全部的主机,但是并没有这个选项,该怎样配置?
答:修改Variables配置,启用 Selection options 中的 Include All option, Custom all value 设置一个值。
Custom all value 一般设置为 blank = auto
,能够根据用户的选择动态地显示或隐藏”全部”选项。
Custom all value 也会经常设置 .+
,以便dashboard中的PromQL能否匹配到所有的主机。
3.5. 怎样创建文本Panel?
问:怎样创建文本Panel,以便给Dashboard添加一些说明?
答:创建Panel,然后点击右上角,选择Visualizations类型为Text
(默认为Time series
)。
4. Prometheus相关问题
4.1. Dashboard变量和Panel缺失数据问题
问:Docker monitoring - alicek106 revision中,变量和Panel都缺失数据,该怎么解决?
答:通过kubernetes-cadvisor获取到的指标,是经过过滤的,可能导致数据缺失。
确认方法:访问Prometheus Web,查询变量和Panel中用到的指标。
如果确认是指标缺失,那么就需要修改ServiceMonitor的定义,开放获取更多指标。
1 | kubectl edit servicemonitor prometheus-kube-prometheus-kubelet -n prometheus |
参考无法显示数据的Panel的表达式,修改 metricRelabelings.regex 部分,例如针对3125 Dashboard,需要如下修改:
1 | spec: |
和默认配置相比,regex中添加了 container_last_seen|machine_memory_bytes|container_cpu_user_seconds_total|
4.2. 缺失文件句柄指标问题
prometheus套装中的node-exporter,默认情况下是缺少文件句柄指标的,需要自行开启,开启方法同【Dashboard变量和Panel缺失数据问题】。
1 | kubectl edit servicemonitor node-exporter -n -n prometheus |
在regex中新增 node_filefd_(maximum|allocated)
,过几分钟,在prometheus web页面就可以查询到文件句柄指标了。
grafana dashboard中,新增panel,表达式为:
1 | node_filefd_allocated{instance="$node"} |
4.3. 部分cAdvisor Endpoind DOWN问题
问:Docker monitoring - alicek106 revision中,缺少了一些Endpiont,通过Prometheus Targets页面查看,发现缺失的Endpoint处于 DOWN 状态,该怎样解决?
答:同样的配置,部分正常,部分DOWN,大概率是超时问题。建议interval
改成30s,timeout
或scrapeTimeout
改成5s。
1 | kubectl edit servicemonitor prometheus-kube-prometheus-kubelet -n prometheus |
4.4. 部分cAdvisor Endpoint缺label问题
问:K8S集群中,使用Prometheus套装获取Kubelet cAdvisor指标。部分节点可以正常获取到指标和label,但是另外一部分节点获取指标正常,缺少label。例如指标 container_cpu_user_seconds_total
中没有label name
,该怎样解决?
答:重启有问题节点的 kubelet。
1 | systemctl restart kubelet |
4.5. node-exporter主机名和IP问题1
问:K8S中的Prometheus,获取集群外部的 node-exporter 指标,instance 的 value 默认配置为 IP:PORT
,怎样把 instance 的 value 改成 IP
?
答:通过relabel_configs实现。
1 | - job_name: 'node-exporter' |
具体修改方法,参考文档《主机、Docker和K8S统一配置监控告警方案A》中的【kube-prometheus监控集群外部服务】部分。
4.6. node-exporter主机名和IP问题2
问:K8S中的Prometheus, node-exporter servicemonitor 把 instance 的 value 配置为 主机名
,怎样把 instance 的 value 改成 IP|主机名
?
答:instance的value,是通过relabelings实现的赋值,需要修改配置。
1 | kubectl edit servicemonitor node-exporter -n prometheus |
原配置为:
1 | spec: |
修改为:
1 | spec: |
该配置中,首先选择了两个source label(IP和主机名)作为数据来源,然后用|
分隔使两个label value的字符串合并成一个字符串,接着使用正则匹配这个字符串,匹配到的$1
和$2
,拼接为$1|$2
作为最终的label value。
该方法同样适用于cadvisor,__meta_kubernetes_endpoint_node_name
需要对应修改为 __meta_kubernetes_endpoint_address_target_name
。
其他的exporter也是同理修改,主机名对应的指标名称可能不同。
主机名对应的指标名称,可以通过prometheus targets页面查看before relabeling获取到,也可以通过接口获取到。
1 | curl http://prometheus-server:9090/api/v1/targets | jq > targets.json |
参考文档:
5. serviceMonitor没有生效问题
问:修改serviceMonitor中instance的值之后,发现没有生效,该怎么处理?
答:大概率是因为配置错误,查看prometheus日志进行修改。如果没有及时修改,还可能导致prometheus无法启动。