8.3 prometheus 配置文件详解

本文按照官方文档的相关内容整理整理的配置语法以及实现功能

1.prometheus 配置文件主体

# 此片段指定的是prometheus的全局配置, 比如采集间隔,抓取超时时间等.
global:
  # 抓取间隔
  [ scrape_interval: <duration> | default = 1m ]

  # 抓取超时时间
  [ scrape_timeout: <duration> | default = 10s ]

  # 评估规则间隔
  [ evaluation_interval: <duration> | default = 1m ]

  # 外部一些标签设置
  external_labels:
    [ <labelname>: <labelvalue> ... ]

  # File to which PromQL queries are logged.
  # Reloading the configuration will reopen the file.
  [ query_log_file: <string> ]

# 此片段指定报警规则文件, prometheus根据这些规则信息,会推送报警信息到alertmanager中。
rule_files:
  [ - <filepath_glob> ... ]

# 此片段指定抓取配置,prometheus的数据采集通过此片段配置。
scrape_configs:
  [ - <scrape_config> ... ]

# 此片段指定报警配置, 这里主要是指定prometheus将报警规则推送到指定的alertmanager实例地址。
alerting:
  alert_relabel_configs:
    [ - <relabel_config> ... ]
  alertmanagers:
    [ - <alertmanager_config> ... ]

# 指定后端的存储的写入api地址。
remote_write:
  [ - <remote_write> ... ]

# 指定后端的存储的读取api地址。
remote_read:
  [ - <remote_read> ... ]

2.scrape_configs配置详解

一个scrape_config 片段指定一组目标和参数, 目标就是实例,指定采集的端点, 参数描述如何采集这些实例, 配置文件格式如下

因为部署在kubernetes环境中所以我只在意基于kubernetes_sd_configs的服务发现和static_configs静态文件的发现

2.1 relabel_configs

relable_configss是功能强大的工具,就是Relabel可以在Prometheus采集数据之前,通过Target实例的Metadata信息,动态重新写入Label的值。除此之外,我们还能根据Target实例的Metadata信息选择是否采集或者忽略该Target实例。

relabel_configs

配置格式如下:

其中action主要包括:

replace:默认,通过regex匹配source_label的值,使用replacement来引用表达式匹配的分组 keep:删除regex与连接不匹配的目标 source_labels drop:删除regex与连接匹配的目标 source_labels labeldrop:删除regex匹配的标签 labelkeep:删除regex不匹配的标签 hashmod:设置target_label为modulus连接的哈希值source_labels labelmap:匹配regex所有标签名称。然后复制匹配标签的值进行分组,replacement分组引用(${1},${2},…)替代

prometheus中的数值都是key:value格式, 其中replace、keep、drop都是对value的操作, labelmap、labeldrop、labelkeep都是对key的操作

2.1.1 replace用法

replace是action的默认值, 通过regex匹配source_label的值,使用replacement来引用表达式匹配的分组

上面的列子中address的值为$1:$2, 其中 $1 是正则表达式([^:]+)(?::\d+)?address中获取, $2是正则表达式(\d+)从(\d+)中获取, 最后的address的数值为192.168.1.1:9100

2.1.2 keep用法

上面的例子只要匹配__meta_kubernetes_service_annotation_prometheus_io_probe=true数据就保留, 反正source_labels中的值没有匹配regex中的值就丢弃

2.1.3 drop用法

drop 的使用和keep刚好相反, 还是使用keep的例子:

上面的例子只要meta_kubernetes_service_annotation_prometheus_io_probe这个标签的值为true就丢弃, 反之如果meta_kubernetes_service_annotation_prometheus_io_probe!=true的数据就保留

2.1.4 labelmap用法

labelmap的用法和上面说到replace、keep、drop不同, labelmap匹配的是标签名称, 而replace、keep、drop匹配的是value

上面例子中只要匹配到正则表达式__meta_kubernetes_service_label_(.+)的标签, 就将标签重写为(.+)中的内容, 效果如下:

2.1.5 hashmod用法

待续

2.1.6 labeldrop用法

使用labeldrop则可以对Target标签进行过滤,删除符合过滤条件的标签,例如:

该配置会使用regex匹配当前target中的所有标签, 删除符合规则的标签, 反之保留不符合规则的

2.1.7 labelkeep用法

使用labelkeep则可以对Target标签进行过滤,仅保留符合过滤条件的标签,例如:

该配置会使用regex匹配当前target中的所有标签, 保留符合规则的标签, 反之不符合的移除

2.2 metric_relabel_configs

上面我们说到relabel_config是获取metrics之前对标签的重写, 对应的metric_relabel_configs是对获取metrics之后对标签的操作, metric_relabel_configs能够确定我们保存哪些指标,删除哪些指标,以及这些指标将是什么样子。

metric_relabel_configs的配置和relabel_config的配置基本相同, 如果需要配置相关参数请参考2.scrape_configs

2.2 static_configs

主要用途为指定exporter获取metrics数据的目标, 可以指定prometheus、 mysql、 nginx等目标

此规则主要是用于抓取prometheus自己数据的配置, targets列表中的为prometheus 获取metrics的地址和端口, 因为没有指定metrics_path所以使用默认的/metrics中获取数据,

简单理解就是, prometheus访问 http://localhost:9090/metrics 获取监控数据

还可以配置指定exporter中的目的地址, 如获取node_exporter的数据

简单理解为分别访问 http://10.40.58.153:9100/metrics http://10.40.58.154:9100/metrics http://10.40.61.116:9100/metrics 获取metrics数据

2.3 kubernetes_sd_configs

kubernetes的服务发现可以刮取以下几种数据

  • node

  • service

  • pod

  • endpoints

  • ingress

通过指定kubernetes_sd_config的模式为endpoints,Prometheus会自动从Kubernetes中发现到所有的endpoints节点并作为当前Job监控的Target实例。如下所示,

配置实例一

该配置是使用kubernetes的发现机制发现kube-apiservers

上面的刮取配置定义了如下信息:

  • job名称为kubernetes-apiservers(job-name: kubernetes-apiservers)

  • 获取kubernetes中endpoints的相关信息(role: endpoints)

  • 使用https的方式获取信息(scheme: https)

  • target的需要满足default名称空间下service名字为kubernetes,并且端口为https

    • __meta_kubernetes_namespace=~default

    • __meta_kubernetes_service_name=~kubernetes

    • __meta_kubernetes_endpoint_port_name=~=https

配置实例二

该配置是自动发现kubernetes中的endpoints

可以看到relable_configs中的规则很多, 具体的内容如下

  • job名称为kubernetes-service-endpoints(job-name: kubernetes-service-endpoints)

  • 获取kubernetes中endpoints的相关信息(role: endpoints)

  • 使用http的方式获取信息(没有配置使用默认配置http)

  • relabel配置部分:

    • annotations中必须存在prometheus.io/scrape: "true"配置才会被promethues发现

    • __scheme__的值为__meta_kubernetes_service_annotation_prometheus_io_scheme的value, 需要满足正则表达式(https?)

    • __metrics_path__的值为__meta_kubernetes_service_annotation_prometheus_io_path的value, 满足正则表达式(.+)

    • __address__的value替换为IP:port的方式

    • kubernetes_namespace的value replace为__meta_kubernetes_namespace的value

    • kubernetes_name的value replace为__meta_kubernetes_service_name的value

    • kubernetes_node的value replace为__meta_kubernetes_pod_node_name的value

获取的metrics的信息如下:

最后更新于

这有帮助吗?