为什么要有服务发现?
Prometheus Server的数据抓取工作于Pull模型,因而,它必需要事先知道各Target的位置,然后才能从相应的Exporter或Instrumentation中抓取数据
- 对于小型的系统环境来说,通过static_configs指定各Target便能解决问题,这也是最简单的配置方法;
-
- 每个Targets用一个网络端点(ip:port)进行标识;
对于中大型的系统环境或具有较强动态性的云计算环境来说,静态配置显然难以适用;
因此,Prometheus为此专门设计了一组服务发现机制,以便于能够基于服务注册中心(服务总线)自动发现、检测、分类可被监控的各Target,以及更新发生了变动的Target;
不用场景中, 服务注册中心的指标也会有不同.
-
共有云或私有云 LassS 云自身保存有平台上的所有资源信息, 其API Server 便可作为Prometheus 的服务发现媒介.
-
Prometheus 也可以集成到多种不同的开源服务发现工具上, 以动态发现需要监控的目标. 例如: Consul, Eureka, Zookeeper, Serverset等
-
Prometheus 也可以很好的集成 Kubernetes 平台上, 通过其 API Server 动态发现各类被监控的 Pod , Service, Endpoint, Ingress 和 Node对象.
-
Prometheus 还支持基于DNS 或者文件的动态发现机制.
基于文件的服务发现
基于文件的服务发现是仅仅略优于静态配置的服务发现方式, 他不仅依赖于任何平台和第三方服务, 因而也是最为简单和通用的实现方式.
Prometheus Server 定义从文件中加载各个 Target 信息,
Prometheus 配置文件
[root@ops prometheus]# cat prometheus.yml 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
Target 配置文件
[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
基于Consul的服务发现
Prometheus的Consul服务发现机制将通过Consul的Catalog API来发现target;
官网地址: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#consul_sd_config
meta标签
__meta_consul_address
: # 目标地址__meta_consul_dc
: # 目标的数据中心名称__meta_consul_health
: # 服务的健康状态__meta_consul_metadata_<key>
: # 目标的每个节点元数据键值__meta_consul_node
: # 为目标定义的节点名称__meta_consul_service_address
: # 目标的服务地址__meta_consul_service_id
: # 目标的服务ID__meta_consul_service_metadata_<key>
:# 目标的每个服务元数据键值__meta_consul_service_port
: # 目标的服务端口__meta_consul_service
: # 目标所属的服务名称__meta_consul_tagged_address_<key>
: # 每个节点标记目标的地址键值__meta_consul_tags
: # 由标签分隔符连接的目标标签列表
consul部署
xx
prometheus配置文件
# All nodes - job_name: 'nodes' consul_sd_configs: - server: "192.168.168.105:8500" tags: - "nodes" refresh_interval: 1m
consul配置文件
[root@ops prometheus]# cat /etc/consul/nodes.json { "services": [ { "id": "node_exporter-node01", "name": "node01", "address": "192.168.168.105", "port": 9100, "tags": ["nodes"], "checks": [{ "http": "http://192.168.168.105:9100/metrics", "interval": "5s" }] }, { "id": "node_exporter-node02", "name": "node02", "address": "192.168.168.102", "port": 9100, "tags": ["nodes"], "checks": [{ "http": "http://192.168.168.102:9100/metrics", "interval": "5s" }] }, { "id": "node_exporter-node06", "name": "node06", "address": "192.168.168.106", "port": 9100, "tags": ["nodes"], "checks": [{ "http": "http://192.168.168.106:9100/metrics", "interval": "5s" }] }, { "id": "node_exporter-node07", "name": "node07", "address": "192.168.168.107", "port": 9100, "tags": ["nodes"], "checks": [{ "http": "http://192.168.168.107:9100/metrics", "interval": "5s" }] }, { "id": "node_exporter-mysql07", "name": "node055", "address": "192.168.168.105", "port": 9104, "tags": ["nodes"], "checks": [{ "http": "http://192.168.168.105:9104/metrics", "interval": "5s" }] }, { "id": "node_exporter-process", "name": "node066", "address": "192.168.168.105", "port": 9256, "tags": ["nodes"], "checks": [{ "http": "http://192.168.168.105:9256/metrics", "interval": "5s" }] } ] }