首页 > 其他分享 >Prometheus-4:服务自动发现Service Discovery

Prometheus-4:服务自动发现Service Discovery

时间:2023-07-14 18:33:07浏览次数:36  
标签:node http monitor Service consul Prometheus com example Discovery

自动发现

Prometheus的服务发现的几种类型:
  • 基于文件的服务发现;
  • 基于DNS的服务发现;
  • 基于API的服务发现:Kubernetes、Consul、Azure......

Prometheus为什么需要自动发现?

Prometheus Server的数据抓取工作于Pull模型,因而,它必需要事先知道各Target的位置,然后才能从相应的Exporter或Instrumentation中抓取数据, 对于小型系统来说,通过static_configs就可以解决此问题,这也是最简单的配置方法; 对于中大型系统环境或具有较强动态性的云计算环境来说,静态配置显然难以适用,因此,Prometheus为此专门设计了一组服务发现机制,以便能够通过服务注册中心自动发现、检测、分类可被检测的各target,以及更新发生了变动的target。

Prometheus指标抓取的生命周期

发现 -> 配置 -> relabel -> 指标数据抓取 -> metrics relabel
  1. 在每个scrape_interval期间,Prometheus都会检查执行的作业(Job);
  2. 这些作业首先会根据Job上指定的发现配置生成target列表,此即服务发现过程;
  3. 服务发现会返回一个Target列表,其中包含一组称为元数据的标签,这些标签都以“__meta_”为前缀;
  4. 服务发现还会根据目标配置来设置其它标签,这些标签带有“__”前缀和后缀,包括“__scheme__”、 “__address__”和“__metrics_path__”,分别保存有target支持使用协议(http或https,默认为http)、target的地址及指标的URI路径(默认为/metrics);
  5. 若URI路径中存在任何参数,则它们的前缀会设置为“__param_;
  6. 配置标签会在抓取的生命周期中被重复利用以生成其他标签,例如,指标上的instance标签的默认值就来自于__address__标签的值;
  7. 抓取而来的指标在保存之前,还允许用户对指标重新打标并过滤,在job段metric_relabel_configs配置,通常用来删除不需要的指标、删除敏感或不必要的标签和添加修改标签格式等。

自动发现的几种方式演示

基于文件的自动发现

此种类型也是最简单的服务发现方式,主要是通过Prometheus Server定期从文件中加载target的信息。 文件可以是json或者yaml格式,它含有定义的target列表,以及可选的标签信息。 vi prometheus.yml
# static config nodes
  - job_name: 'nodes'
    file_sd_configs:
    - files:                                               
      - targets/nodes-*.yaml  
      refresh_interval: 2m 
    scrape_interval: 15s

然后将所有要发现的target全部放在targets/目录下即可,例如
cat targets/nodes-linux.yaml 
- targets:
  - monitor.example.com:9100
  - node.export1.com:9101
  - node.export2.com:9101
  - node.export3.com:9101
  labels:
    app: node-exporter
    os: aliyunos3

cat targets/nodes-prometheus.yaml 
- targets:
  - monitor.example.com:9090
  labels:
    app: prometheus
    job:  prometheus
  重新加载Prometheus配置即可:
curl -XPOST monitor.example.com:9090/-/reload

基于consul注册中心自动发现

consul是一款基于golang开发的开源工具,主要面向分布式,服务化的系统提供服务注册、服务发现和配置管理的服务,提供服务注册/发现、健康检查、Key/Value存储、多数据中心和分布式一致性保证等功能。

服务部署

多种部署方式,这里仅是使用consul的功能,并不考虑高可用或其他问题,采用docker-compose方式部署。 vi docker-compose.yml
version: '3.6'

volumes:
  consul_data: {}

networks:
  monitoring:
    driver: bridge

services:
  consul:
    image: consul:1.14
    volumes:
      - ./consul_configs:/consul/config
      - consul_data:/consul/data/
    networks:
      - monitoring
    ports:
      - 8500:8500
    command: ["consul","agent","-dev","-bootstrap","-config-dir","/consul/config","-data-dir","/consul/data","-ui","-log-level","INFO","-bind","127.0.0.1","-client","0.0.0.0"]

  consul-exporter:
    image: prom/consul-exporter:v0.8.0
    networks:
      - monitoring
    ports:
      - 9107:9107
    command:
      - "--consul.server=consul:8500"
    depends_on:
      - consul
这里顺便把consul-exporter也部署了 直接启动:
# docker-compose up -d 

# docker-compose ps
NAME                                    IMAGE                         COMMAND                  SERVICE             CREATED             STATUS              PORTS
consul-and-exporter-consul-1            consul:1.14                   "docker-entrypoint.s…"   consul              24 hours ago        Up 24 hours         8300-8302/tcp, 8301-8302/udp, 8600/tcp, 8600/udp, 0.0.0.0:8500->8500/tcp, :::8500->8500/tcp
consul-and-exporter-consul-exporter-1   prom/consul-exporter:v0.8.0   "/bin/consul_exporte…"   consul-exporter     24 hours ago        Up 24 hours         0.0.0.0:9107->9107/tcp, :::9107->9107/tcp
可以通过ip:8500直接访问consul,这里示例并没有设置token,正常生产环境需要token来进行身份验证:

编辑Prometheus.yml

需要注意,使用consul自动发现时,需要在job中通过标签来匹配对应的target,例如: vi prometheus.yml
  # consul_service_discovery
  - job_name: 'nodes'
    consul_sd_configs:
    - server: "monitor.example.com:8500"
      tags:
      - "nodes"    # 匹配在consul注册的服务中带有nodes标签的service
      refresh_interval: 2m
    scrape_interval: 15s

  - job_name: 'grafana'
    consul_sd_configs:
    - server: "monitor.example.com:8500"
      tags:
      - "grafana"    # 匹配在consul注册的服务中带有grafana标签的service
      refresh_interval: 2m
    scrape_interval: 15s
重新加载:
curl -XPOST monitor.example.com:9090/-/reload

服务注册到consul

服务注册到consul有两种方式,一种是使用consul客户端命令进行操作,另一种是通过api操作。
api方式注册演示
准备json文件 vi grafana.json
{
  "ID": "grafana",
  "Name": "grafana",
  "Tags": ["grafana", "v9"],    # 包含的标签
  "Address": "monitor.example.com",
  "Port": 3000,
  "Meta": {
    "grafana_version": "9"    # 元数据,可自定义
  },
  "EnableTagOverride": false,
  "Check": {    # 检查健康状态的方法
    "http": "http://monitor.example.com:3000/metrics",
    "interval": "5s",
    "Timeout": "5s"
  },
  "Weights": {
    "Passing": 1,
    "Warning": 1
  }
}
健康检查方法也可以是执行脚本,例如:
  "Check": {
    "DeregisterCriticalServiceAfter": "90m",
    "Args": ["/usr/local/bin/check_redis.py"],
    "Interval": "10s",
    "Timeout": "5s"
  },
注册服务:
curl -XPUT --data @grafana.json http://monitor.example.com:8500/v1/agent/service/register
查看状态:

通过consul自动发现的target会有很多__meta_consul开头的标签,我们可以通过relabel来重新利用这些标签,这个下篇笔记总结。 常用的 api 指令:
# 查看当前所有注册的service
curl http://monitor.example.com:8500/v1/agent/services

# 查看tomcat service的健康状态
curl http://monitor.example.com:8500/v1/agent/health/service/name/tomcat

# 注册服务,需提前准备好json文件
curl -XPUT --data @grafana.json http://monitor.example.com:8500/v1/agent/service/register

# 注销服务
curl -XPUT http://monitor.example.com:8500/v1/agent/service/deregister/grafana
官网文档:https://developer.hashicorp.com/consul/api-docs/agent/service
consul命令方式注册演示
准备nodes.json文件,同一类型的target可以写到一个json文件中,便于编辑注册
{
  "services": [
    {
      "id": "node.export1.com",
      "name": "node.export1.com",
      "address": "node.export1.com",
      "port": 9101,
      "tags": ["nodes"],
      "checks": [{
        "http": "http://node.export1.com:9101/metrics",
        "interval": "5s"
      }]
    },
    {
      "id": "node.export2.com",
      "name": "node.export2.com",
      "address": "node.export2.com",
      "port": 9101,
      "tags": ["nodes"],
      "checks": [{
        "http": "http://node.export2.com:9101/metrics",
        "interval": "5s"
      }]
    },
    {
      "id": "node.export3.com",
      "name": "node.export3.com",
      "address": "node.export3.com",
      "port": 9101,
      "tags": ["nodes"],
      "checks": [{
        "http": "http://node.export3.com:9101/metrics",
        "interval": "5s"
      }]
    },
    {
      "id": "monitor.example.com",
      "name": "monitor.example.com",
      "address": "monitor.example.com",
      "port": 9100,
      "tags": ["nodes"],
      "checks": [{
        "http": "http://monitor.example.com:9100/metrics",
        "interval": "5s"
      }]
    }
  ]
}
将node.json文件放置到consul服务启动的"-data-dir"目录下,此示例为容器内/consul/data
/consul/config # pwd
/consul/config
/consul/config # ls
nodes.json
执行config重新加载
# consul reload
Configuration reload triggered
查看consul及Prometheus状态

至此,Prometheus基于consul的自动发现基本演示完毕。

写到最后

后续准备单独将kubernetes的监控体系起一篇博客,这里暂且先不做介绍,欢迎各位持续关注。

标签:node,http,monitor,Service,consul,Prometheus,com,example,Discovery
From: https://www.cnblogs.com/v-fan/p/17554735.html

相关文章

  • msmpeng.exe 是 Windows Defender 的后台服务进程,也称为 Windows Defender Antimalwar
    msmpeng.exe是MicrosoftWindowsDefender的主要组件之一。WindowsDefender是Windows操作系统内置的杀毒软件和安全防护工具,用于检测和清除计算机上的潜在恶意软件、病毒和其他安全威胁。具体来说,msmpeng.exe是WindowsDefender的后台服务进程,也称为WindowsDefender......
  • Linux下chkconfig命令详解(service)
    Linux下chkconfig命令详解(service)一、释义chkconfig命令主要用来更新(启动或停止)和查询系统服务的运行级信息。谨记chkconfig不是立即自动禁止或激活一个服务,它只是简单的改变了符号连接。二、使用语法chkconfig[--add][--del][--list][系统服务]或chkconfig[--level......
  • mvn打包时怎么把依赖库中的META_INF/services文件也打包进去?
    参考:https://blog.csdn.net/RL_LEEE/article/details/128134800META-INF/services/org.geotools.data.DataStoreFactorySpi好像有打包进来啊。。难道是:Maven按照POM依赖声明的先后顺序,只加载了第一个services文件中的内容,后面的两条都被忽略掉了,导致运行报错?......
  • Prometheus 基础语法
    prometheus语法参考:https://blog.csdn.net/Happy_Sunshine_Boy/article/details/105651016CPU1.计算CPU的使用时间空闲CPU使用时间=node_cpu_seconds_total{mode=“idle”}CPU总共使用时间=node_cpu_seconds_total)2.取一分钟之内的使用增量空闲CPU一分钟内的增量:in......
  • 【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Win
    问题描述PHP的WebJob,通过artisan来配置路径启动PHP任务,相关启动脚本如下:artisan_path="d:\\home\\site\\wwwroot";cd${artisan_path}echo"\n"pwdphpartisanschedule:run但是,在运行的时候遇见报错:[07/06/202301:57:31>0f21a2:INFO]/d/home/site/wwwroo......
  • k8s集群node NotReady处理流程-->kubelet状态error,并伴有报错:kubelet.service has mor
    k8s集群nodeNotReady处理流程-->kubelet状态error//20230712集群有节点NotReadykubelet状态error,并伴有报错:kubelet.servicehasmorethanoneExecStart=setting,whichisonlyallowedforType=oneshotservices.Refusing在此记录一下解决流程解决流程问题定位:使......
  • service 无法注入bean问题
    Noqualifyingbeanoftype'com.unqd.api.weituo.service.IamCustomerService'available:expectedatleast1beanwhichqualifiesasautowirecandidate.Dependencyannotations:{@org.springframework.beans.factory.annotation.Autowired(required=true......
  • 解决docker报错Job for docker.service failed because start of the service was att
    转载自:https://blog.csdn.net/Along_168163/article/details/124118833=================== docker安装之后重新安装报错如下:Jobfordocker.servicefailedbecausestartoftheservicewasattemptedtoooften.See"systemctlstatusdocker.service"and"journa......
  • Springboot远程调用Prometheus Api获取指标数据
    0、写在前面1>使用RestTemplate作为远程调用工具调用prometheus原生api获取数据2>prometheus原生api文档地址如下:https://prometheus.io/docs/prometheus/latest/querying/api/3>通过访问prometheus原生api,查看原生api返回的数据格式,定义对应的实体类格式4>下面所列功能代......
  • CDH /var/lib/cloudera-service-monitor和/var/lib/cloudera-host-monitor占用空间过
    1、/var/lib/cloudera-service-monitor和/var/lib/cloudera-host-monitor这两个是clouderamanagermentservice服务的默认存储路径,最好改掉,换到大的分区下; 2、空间清理/var/lib/cloudera-service-monitor和/var/lib/cloudera-host-monitor占用空间过大时:先停止clouderaman......