prometheus target获取

【prometheus target获取】努力尽今夕,少年犹可夸。这篇文章主要讲述prometheus target获取相关的知识,希望能为你提供帮助。
在生产环境中,不管企业规模多么小或者稳定,对于Prometheus来说,配置动态服务发现的模式,要比静态配置要方便很多。
一、Prometheus服务发现机制为Prometheus添加节点由两种方式,


第一种静态配置   static_config(适用于变动性很小的IT系统中)
在prometheus.yml中,在static_config中的targets添加被纳入监控范围内的节点信息,并且默认会在每个节点后添加一个\'/metrics\'采集端点,也就是暴露出去的,能被Prometheus抓取到的部分。


- job_name: "nodes"
# metrics_path defaults to \'/metrics\'
# scheme defaults to \'http\'.
static_configs:
- targets:
- 10.99.31.206:9100
- 10.99.31.201:9100
- 10.99.31.202:9100


话题延伸:每一个节点都会有默认的\'up\'时间序列,因此可以在Prometheus_server中查看up信息,可以看到当前在监控端所有节点的情况。目的是标识节点targets是否正常,
windows_exporter 端口 9182


第二种服务发现,agenda 不依赖于任何平台和 第三方服务(适用于容器环境,增加/删除targets)
基于文件的服务发现;
基于DNS的服务发现;
基于API的服务发现:kubernetes、consul、azure


而且还具备重新达标的功能
target重新打标;metrics重新打标。


2.1基于文件的服务发现若要实现文件服务发现,就需要额外建立一个文件,prom执行时会读取文件,从而从文件中抓取target。
文件可使用json、yaml格式,含有定义的target列表,以及可选的标签信息;
示例:
- targets:
  - localhost:9090
  labels:
    app:prometheus
    job:prometheus


- targets:
  - localhost:9100
  labels:
    app:node_exporter
    job:node


这些文件通常也是由另一个系统生成,例如Puppet、ansible、saltstack等配置管理系统,也能有脚本基于CMDB定期查询生成。
可以配合ansible使用,设置Prometheus周期性从ansible获取所有能被监控到的target,来生成对应的json文件。



需要先在Prometheus.yml中,配置支持文件查找
举例说明,当前我的环境是:
2.1.1Prometheus 进程位置:
[root@wind-k8s-prom prometheus]# pwd
/usr/local/prometheus
[root@wind-k8s-prom prometheus]# ls
configs   console_libraries   consoles   data   LICENSE   NOTICE   prometheus   prometheus.yml   promtool   rules
[root@wind-k8s-prom prometheus]#  
2.1.2存放文件位置:
[root@wind-k8s-prom prometheus]# cd configs/files-sd/targets/    存放文件的目录
[root@wind-k8s-prom targets]# ls
nodes-linux.yaml   prometheus-servers.yaml  具体文件信息
[root@wind-k8s-prom targets]# cat nodes-linux.yaml    文件内添加的被监控主机详情
- targets:
  - 10.99.31.201:9100
  - 10.99.31.202:9100
  - 10.99.31.203:9100
  - 10.100.6.20:9182
  - 10.99.1.123:9182
  labels:
    app: node-exporter
    job: node


[root@wind-k8s-prom targets]# cat prometheus-servers.yaml  
- targets:
  - 10.99.31.206:9090    Prometheus-server本机
  labels:
    app: prometheus      名称
    job:   prometheus      工作名称


[root@wind-k8s-prom targets]# cd ..
[root@wind-k8s-prom files-sd]# pwd
/usr/local/prometheus/configs/files-sd
[root@wind-k8s-prom files-sd]# ls
prometheus.yml   targets
[root@wind-k8s-prom files-sd]#   vim prometheus.yml  
prometheus target获取

文章图片

执行命令,为了方便,最好将此路径写入到prometheus服务中。这里为了测试用。
[root@wind-k8s-prom prometheus]# ./prometheus --config.file=/usr/local/prometheus/configs/files-sd/prometheus.yml                         
prometheus target获取

文章图片

#通过配置file 获取target,这里以xx项目进行举例
- job_name: \'find_node_exporter\'
  file_sd_configs: #这一项是开启,基于文件发现的。
  - files:   #指定要加载的文件列表;
    - file_config/host.json? #指定从哪个文件中加载监控对象;
    refresh——interval:2m #指定每隔2分钟从该文件抓取一次;


基于文件的服务发现,最终还是需要手动在文件里添加node_exporter主机。 ,而且不能添加一个网段




第三种,DNS的SRV发现。针对一组DNS域名进行定期查询。
查询时使用的DNS服务器由 /etc/resolv.conf文件指定;该发现机制依赖于A、AAAA、SRV资源记录,


2.2基于consul发现机制consul基于golang开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的功能,提供服务发现/注册、健康检查和保持一致性等功能
https://www.consul.io/downloads/
consul运行机制是:系统中有consul服务,内网中大量的可被监控的对象都会在consul上注册称为了services;而Prometheus作为客户端连接到consul中,去分析每个可被监控的目标。Prometheus-server从consul查询到这些被监控的目标后,在本地将其转换成可被监控的target。
2.2.1安装consul服务
Downloads | Consul by HashiCorp 下载最新的consul
https://www.consul.io/downloads
prometheus target获取

文章图片



#yum install -y yum-utilsyum-config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
yum -y install consul


启动开发者模式
mkdir -pv /consul/data/
consul agent -dev -ui -data-dir=/consul/data -config-dir=/etc/consul.d/ -client=0.0.0.0
命令解析:
agent 这里以客户端来运行;
-dev 以开发模式运行;当然了,还有-server模式;
-ui 使用自带的web界面;
-data-dir 数据文件存放到那里;
-config-dir 主配置文件放在哪儿;监听端口8500
-client 哪些网段能够连接进来; 
这时已经启动了consul.
prometheus target获取

文章图片

这时候是没有节点的,还需要在Prometheus.yml文件中添加consul插件。
1.配置consul可寻找文件

[root@wind-k8s-prom consul-configs]# pwd
/usr/local/prometheus/configs/consul-sd/consul-configs
[root@wind-k8s-prom consul-configs]# ls
nodes.json
{
"service": {
"id": "node_exporter-node01",
"name": "node01",
"address": "10.99.31.206",
"port": 9100,
"tags": ["node"],
"checks": [{#健康状态检测
"http": "http://10.99.31.206:9100/metrics",
"interval": "5s"
}]
}
}

[root@wind-k8s-prom consul-configs]# cat nodes.json
{
"services": [
{
"id": "node_exporter-master01",
"name": "master01",
"address": "10.99.31.201",
"port": 9100,
"tags": ["k8s"],
"checks": [{
"http": "http://10.99.31.201:9100/metrics",
"interval": "5s"
}]
},
{
"id": "node_exporter-node01",
"name": "node01",
"address": "10.99.31.202",
"port": 9100,
"tags": ["k8s"],
"checks": [{
"http": "http://10.99.31.202:9100/metrics",
"interval": "5s"
}]
},
{
"id": "node_exporter-node02",
"name": "node02",
"address": "10.99.31.203",
"port": 9100,
"tags": ["k8s"],
"checks": [{
"http": "http://10.99.31.203:9100/metrics",
"interval": "5s"
}]
}
{
"id": "node_exporter-prometheus",
"name": "prometheus",
"address": "10.99.31.206",
"port": 9100,
"tags": ["prometheus"],
"checks": [{
"http": "http://10.99.31.206:9100/metrics",
"interval": "5s"
}]
}
]
}





通过目录方式来发现服务的好处时
我们可以定义,哪些服务可以被抓取到,在文件中可以自定义service,当定义多个服务的时候,服务之间需要使用逗号隔开,并且使用services参数。


过滤所有Node 节点中包含service 字段的信息。
根据服务来进行发现相应的节点。


endpoint资源发现
ingress资源发现













    推荐阅读