服务发现
为什么要有服务发现
Prometheus Server 的数据抓取工作在于Pull模型, 因而它必需要事先知道各 Target 的位置, 然后才能从相应的 Exporter 或 Instrumentation 中抓取数据.
对于小型的系统环境, 通过 static_configs 指定各 Target 便能解决问题, 这也是最简单的配置方法,
每个 Targets 用一个网络端点 (ip:port) 进行标识.
对于中大型的系统环境或具有较强动态性的云计算环境来说, 静态配置难以适用, 因此 Prometheus 为此专门设计了一组服务发现机制, 一边于能够基于服务注册中心(服务总线) 自动发现, 检测, 分类可被监控的各 Target, 以及更新变动的 Target.
指标抓去的声明周期
在每个 sample interval 期间, Prometheus 都会检查执行的作业(Job);
这些作业首先会根据Job上指定的发现配置生成 target 列表, 此即服务发现过程;
-
服务发现会返回一个 Target 列表, 其中包含一组称为元数据的标签, 这些标签都以
__meta_
为前缀. -
服务发现还会根据目标配置来设置其它标签, 这些标签带有
__
前缀和后缀, 包括:__scheme__
,__address__
, 和__metrics_path__
, 分别保存有 target 支持使用协议(http或https), target 的地址及指标的URL路径(默认为/metrics) -
若 URL 路径中存在任何参数, 则他们的前缀会设置为
__param__
-
这些目标列表和标签会返回给 Prometheus, 其中的一些标签也可以在配置中覆盖.
配置标签会在抓去的生命周期中被重复利用以生成其他标签, 例如, 指标上的 instance 标签的默认值就来自于__address__
标签的值.
对于发现的各项目标, Prometheus 提供了可以重新标记(relabel)目标的机会.
它定义在job 配置段的 relabel_config 配置中, 常用于实现如下功能.
- 将来自服务发现的元数据标签中的信息附加到指标的标签上.
- 过滤目标. 这之后, 便是数据抓取, 以及指标返回的过程.
- 抓取而来的指标保存之前, 还允许用户对指标重新打标并过滤.
它定义在job 配置段的 metric_relabel_configs 配置中, 常用于实现如下功能.
- 删除不必要的指标,
- 从指标中删除敏感或不需要的标签.
- 添加, 编辑或者修改指标的标签值,或者标签格式.
不用场景中, 服务注册中心的指标也会有不同.
-
共有云或私有云 LassS 云自身保存有平台上的所有资源信息, 其API Server 便可作为Prometheus 的服务发现媒介.
-
Prometheus 也可以集成到多种不同的开源服务发现工具上, 以动态发现需要监控的目标. 例如: Consul, Eureka, Zookeeper, Serverset等
-
Prometheus 也可以很好的集成 Kubernetes 平台上, 通过其 API Server 动态发现各类被监控的 Pod , Service, Endpoint, Ingress 和 Node对象.
-
Prometheus 还支持基于DNS 或者文件的动态发现机制.
配置
原生基于配置文件
scrape_configs: ... - job_name: "nodes" honor_timestamps: true scrape_interval: 15s scrape_timeout: 10s metrics_path: /metrics scheme: http static_configs: - targets: - 192.168.168.106:9100 - 192.168.168.105:9100
基于文件
[root@ops ~]# cd /opt/prometheus [root@ops prometheus]# mkdir targets [root@ops prometheus]# cd targets/ [root@ops targets]# cat prometheus-server.yml - targets: - 127.0.0.1:9090 labels: app: prometheus-server [root@ops targets]# cat nodes-linux.yml - targets: - 192.168.168.106:9100 - 192.168.168.105:9100 labels: app: node_exporter # 主配置文件 scrape_configs: - job_name: "prometheus" honor_timestamps: true scrape_interval: 15s scrape_timeout: 10s metrics_path: /metrics scheme: http file_sd_configs: - files: - targets/prometheus-*.yml refresh_interval: 1m - job_name: "nodes" honor_timestamps: true scrape_interval: 15s scrape_timeout: 10s metrics_path: /metrics scheme: http file_sd_configs: - files: - targets/nodes-*.yml refresh_interval: 1m