一个计算机技术爱好者与学习者

0%

Grafana和Prometheus问题记录

1. 前言

本文记录使用Grafana时遇到的一些问题,备忘。

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 中的 panelstemplating 部分,粘贴到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
2
irate(container_network_receive_bytes_total{image!="", instance=~"$server", name=~"$container"}[5m])
irate(container_network_transmit_bytes_total{image!="", instance=~"$server", name=~"$container"}[5m])

在explore页面使用PromQL查询,可以发现指定容器查询可以查询出两个结果,分别有 eth0 和 tunl0 两张卡。

1
2
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"}
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="tunl0", 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
2
3
4
5
6
7
8
9
10
11
spec:
endpoints:
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
metricRelabelings:
- action: keep
regex: container_last_seen|machine_memory_bytes|container_cpu_user_seconds_total|container_cpu_usage_seconds_total|container_memory_usage_bytes|container_memory_cache|container_network_.+_bytes_total|container_memory_working_set_bytes|container_cpu_cfs_.*periods_total|container_processes.*|container_threads.*
sourceLabels:
- __name__
path: /metrics/cadvisor
port: https-metrics
...

和默认配置相比,regex中添加了 container_last_seen|machine_memory_bytes|container_cpu_user_seconds_total|

4.2. 部分cAdvisor Endpoind DOWN问题

问:Docker monitoring - alicek106 revision中,缺少了一些Endpiont,通过Prometheus Targets页面查看,发现缺失的Endpoint处于 DOWN 状态,该怎样解决?

答:同样的配置,部分正常,部分DOWN,大概率是超时问题。建议interval改成30s,timeoutscrapeTimeout改成5s。

1
kubectl edit servicemonitor prometheus-kube-prometheus-kubelet -n prometheus

4.3. 部分cAdvisor Endpoint缺label问题

问:K8S集群中,使用Prometheus套装获取Kubelet cAdvisor指标。部分节点可以正常获取到指标和label,但是另外一部分节点获取指标正常,缺少label。例如指标 container_cpu_user_seconds_total 中没有label name ,该怎样解决?

答:重启有问题节点的 kubelet。

1
systemctl restart kubelet

4.4. node-exporter主机名和IP问题1

问:K8S中的Prometheus,获取集群外部的 node-exporter 指标,instance 的 value 默认配置为 IP:PORT,怎样把 instance 的 value 改成 IP

答:通过relabel_configs实现。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
- job_name: 'node-exporter'
static_configs:
- targets:
- 192.168.56.101:9100
- 192.168.50.102:9100
labels:
job: node-exporter
relabel_configs:
- action: replace
regex: (.*):.*
replacement: $1
source_labels:
- __address__
target_label: instance

具体修改方法,参考文档《主机、Docker和K8S统一配置监控告警方案A》中的【kube-prometheus监控集群外部服务】部分。

4.5. 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
2
3
4
5
6
7
8
9
10
11
12
13
14
spec:
endpoints:
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
interval: 1m
metricRelabelings: {}
relabelings:
- action: replace
regex: (.*)
replacement: $1
sourceLabels:
- __meta_kubernetes_pod_node_name
targetLabel: instance
- action: labeldrop
regex: (service|endpoint)

修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
spec:
endpoints:
- bearerTokenFile: /var/run/secrets/kubernetes.io/serviceaccount/token
interval: 1m
metricRelabelings: {}
relabelings:
- action: replace
regex: (.*):.*\|(.*)$
replacement: $1|$2
separator: '|'
sourceLabels:
- __address__
- __meta_kubernetes_endpoint_node_name
#- __meta_kubernetes_pod_node_name
targetLabel: instance
- action: labeldrop
regex: (service|endpoint)

该配置中,首先选择了两个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
2
curl http://prometheus-server:9090/api/v1/targets | jq > targets.json
cat targets.json | jq '.data.activeTargets[]|select(.labels.job=="kubelet")'

参考文档:

5. serviceMonitor没有生效问题

问:修改serviceMonitor中instance的值之后,发现没有生效,该怎么处理?

答:大概率是因为配置错误,查看prometheus日志进行修改。如果没有及时修改,还可能导致prometheus无法启动。