【prometheus】-04 轻松搞定Prometheus Eureka服务发现
腾讯云 2023-03-24 14:20:52

Prometheus服务发现机制之Eureka

概述

Eureka服务发现协议允许使用Eureka Rest API检索出Prometheus需要监控的targets,Prometheus会定时周期性的从Eureka调用Eureka Rest API,并将每个应用实例创建出一个target。

Eureka服务发现协议支持对如下元标签进行relabeling

__meta_eureka_app_name: the name of the app__meta_eureka_app_instance_id: the ID of the app instance__meta_eureka_app_instance_hostname: the hostname of the instance__meta_eureka_app_instance_homepage_url: the homepage url of the app instance__meta_eureka_app_instance_statuspage_url: the status page url of the app instance__meta_eureka_app_instance_healthcheck_url: the health check url of the app instance__meta_eureka_app_instance_ip_addr: the IP address of the app instance__meta_eureka_app_instance_vip_address: the VIP address of the app instance__meta_eureka_app_instance_secure_vip_address: the secure VIP address of the app instance__meta_eureka_app_instance_status: the status of the app instance__meta_eureka_app_instance_port: the port of the app instance__meta_eureka_app_instance_port_enabled: the port enabled of the app instance__meta_eureka_app_instance_secure_port: the secure port address of the app instance__meta_eureka_app_instance_secure_port_enabled: the secure port of the app instance__meta_eureka_app_instance_country_id: the country ID of the app instance__meta_eureka_app_instance_metadata_: app instance metadata__meta_eureka_app_instance_datacenterinfo_name: the datacenter name of the app instance__meta_eureka_app_instance_datacenterinfo_: the datacenter metadata

eureka_sd_configs配置可选项如下:


(资料图)

# The URL to connect to the Eureka server.server: # Sets the `Authorization` header on every request with the# configured username and password.# password and password_file are mutually exclusive.basic_auth:  [ username:  ]  [ password:  ]  [ password_file:  ]# Optional `Authorization` header configuration.authorization:  # Sets the authentication type.  [ type:  | default: Bearer ]  # Sets the credentials. It is mutually exclusive with  # `credentials_file`.  [ credentials:  ]  # Sets the credentials to the credentials read from the configured file.  # It is mutually exclusive with `credentials`.  [ credentials_file:  ]# Optional OAuth 2.0 configuration.# Cannot be used at the same time as basic_auth or authorization.oauth2:  [  ]# Configures the scrape request"s TLS settings.tls_config:  [  ]# Optional proxy URL.[ proxy_url:  ]# Configure whether HTTP requests follow HTTP 3xx redirects.[ follow_redirects:  | default = true ]# Refresh interval to re-read the app instance list.[ refresh_interval:  | default = 30s ]

协议分析

通过前面分析的Prometheus服务发现原理以及基于文件方式服务发现协议实现的分析,Eureka服务发现大致原理如下图:

通过解析配置中eureka_sd_configs协议的job生成Config,然后NewDiscovery方法创建出对应的Discoverer,最后调用Discoverer.Run()方法启动服务发现targets。

1、基于文件服务发现配置解析

假如我们定义如下job:

- job_name: "eureka"  eureka_sd_configs:    - server: http://localhost:8761/eureka    

会被解析成eureka.SDConfig如下:

eureka.SDConfig定义如下:

type SDConfig struct {    // eureka-server地址 Server           string                  `yaml:"server,omitempty"`    // http请求client配置,如:认证信息 HTTPClientConfig config.HTTPClientConfig `yaml:",inline"`    // 周期刷新间隔,默认30s RefreshInterval  model.Duration          `yaml:"refresh_interval,omitempty"`}

2、Discovery创建

func NewDiscovery(conf *SDConfig, logger log.Logger) (*Discovery, error) { rt, err := config.NewRoundTripperFromConfig(conf.HTTPClientConfig, "eureka_sd", config.WithHTTP2Disabled()) if err != nil {  return nil, err } d := &Discovery{  client: &http.Client{Transport: rt},  server: conf.Server, } d.Discovery = refresh.NewDiscovery(  logger,  "eureka",  time.Duration(conf.RefreshInterval),  d.refresh, ) return d, nil}

3、Discovery创建完成,最后会调用Discovery.Run()启动服务发现:

和上一节分析的服务发现之File机制类似,执行Run方法时会执行tgs, err := d.refresh(ctx),然后创建定时周期触发器,不停执行tgs, err := d.refresh(ctx),将返回的targets结果信息通过channel传递出去。

4、上面Run方法核心是调用d.refresh(ctx)逻辑获取targets,基于Eureka发现协议主要实现逻辑就在这里:

func (d *Discovery) refresh(ctx context.Context) ([]*targetgroup.Group, error) { // 通过Eureka REST API接口从eureka拉取元数据:http://ip:port/eureka/apps apps, err := fetchApps(ctx, d.server, d.client) if err != nil {  return nil, err } tg := &targetgroup.Group{  Source: "eureka", } for _, app := range apps.Applications {//遍历app        // targetsForApp()方法将app下每个instance部分转成target  targets := targetsForApp(&app)        //假如到  tg.Targets = append(tg.Targets, targets...) } return []*targetgroup.Group{tg}, nil}

refresh方法主要有两个流程:

1、fetchApps():从eureka-server/eureka/apps接口拉取注册服务信息;

2、targetsForApp():遍历appinstance,将每个instance解析出一个target,并添加一堆元标签数据。

如下就是从eureka-server的/eureka/apps接口拉取的注册服务信息:

    1    UP_1_            SERVICE-PROVIDER-01                    localhost:service-provider-01:8001            192.168.3.121            SERVICE-PROVIDER-01            192.168.3.121            UP            UNKNOWN            8001            443            1                            MyOwn                                        30                90                1629385562130                1629385682050                0                1629385562132                                        8001                true                8080                        http://192.168.3.121:8001/            http://192.168.3.121:8001/actuator/info            http://192.168.3.121:8001/actuator/health            service-provider-01            service-provider-01            false            1629385562132            1629385562039            ADDED            

5、instance信息解析target

func targetsForApp(app *Application) []model.LabelSet { targets := make([]model.LabelSet, 0, len(app.Instances)) // Gather info about the app"s "instances". Each instance is considered a task. for _, t := range app.Instances {  var targetAddress string        // __address__取值方式:instance.hostname和port,没有port则默认port=80  if t.Port != nil {   targetAddress = net.JoinHostPort(t.HostName, strconv.Itoa(t.Port.Port))  } else {   targetAddress = net.JoinHostPort(t.HostName, "80")  }  target := model.LabelSet{   model.AddressLabel:  lv(targetAddress),   model.InstanceLabel: lv(t.InstanceID),   appNameLabel:                     lv(app.Name),   appInstanceHostNameLabel:         lv(t.HostName),   appInstanceHomePageURLLabel:      lv(t.HomePageURL),   appInstanceStatusPageURLLabel:    lv(t.StatusPageURL),   appInstanceHealthCheckURLLabel:   lv(t.HealthCheckURL),   appInstanceIPAddrLabel:           lv(t.IPAddr),   appInstanceVipAddressLabel:       lv(t.VipAddress),   appInstanceSecureVipAddressLabel: lv(t.SecureVipAddress),   appInstanceStatusLabel:           lv(t.Status),   appInstanceCountryIDLabel:        lv(strconv.Itoa(t.CountryID)),   appInstanceIDLabel:               lv(t.InstanceID),  }  if t.Port != nil {   target[appInstancePortLabel] = lv(strconv.Itoa(t.Port.Port))   target[appInstancePortEnabledLabel] = lv(strconv.FormatBool(t.Port.Enabled))  }  if t.SecurePort != nil {   target[appInstanceSecurePortLabel] = lv(strconv.Itoa(t.SecurePort.Port))   target[appInstanceSecurePortEnabledLabel] = lv(strconv.FormatBool(t.SecurePort.Enabled))  }  if t.DataCenterInfo != nil {   target[appInstanceDataCenterInfoNameLabel] = lv(t.DataCenterInfo.Name)   if t.DataCenterInfo.Metadata != nil {    for _, m := range t.DataCenterInfo.Metadata.Items {     ln := strutil.SanitizeLabelName(m.XMLName.Local)     target[model.LabelName(appInstanceDataCenterInfoMetadataPrefix+ln)] = lv(m.Content)    }   }  }  if t.Metadata != nil {   for _, m := range t.Metadata.Items {                // prometheus label只支持[^a-zA-Z0-9_]字符,其它非法字符都会被替换成下划线_    ln := strutil.SanitizeLabelName(m.XMLName.Local)    target[model.LabelName(appInstanceMetadataPrefix+ln)] = lv(m.Content)   }  }  targets = append(targets, target) } return targets}

解析比较简单,就不再分析,解析后的标签数据如下图:

标签中有两个特别说明下:

1、__address__:这个取值instance.hostname和port(默认80),所以要注意注册到eureka上的hostname准确性,不然可能无法抓取;

2、metadata-map数据会被转成__meta_eureka_app_instance_metadata_格式标签,prometheus进行relabeling一般操作metadata-map,可以自定义metric_path、抓取端口等;

3、prometheuslabel只支持[a-zA-Z0-9_],其它非法字符都会被转换成下划线,具体参加:strutil.SanitizeLabelName(m.XMLName.Local);但是eureka的metadata-map标签含有下划线时,注册到eureka-server上变成双下划线,如下配置:

eureka:  instance:    metadata-map:      scrape_enable: true      scrape.port: 8080

通过/eureka/apps获取如下:

总结

基于Eureka方式的服务原理如下图:

大概说明:Discoverer启动后定时周期触发从eureka server/eureka/apps接口拉取注册服务元数据,然后通过targetsForApp遍历app下的instance,将每个instance解析成target,并将其它元数据信息转换成target原标签可以用于target抓取前relabeling操作。

【prometheus】-04 轻松搞定Prometheus Eureka服务发现

2023-03-24 14:20:52

2021年农历六月份好日子一览表,哪几天是黄道吉日?

2023-03-24 13:51:30

宣传单设计用什么软件_宣传单彩页设计用什么软件好

2023-03-24 12:39:12

每日看点!鹤峰县人民法院积极探索“行政案件圆桌式化解机制”改革

2023-03-24 11:19:44

有时候,你不得不佩服美国政客的水平,他们都是“大预言家”。 今日热文

2023-03-24 10:16:59

市场定位的概述

2023-03-24 09:19:58

中证科技:连续3日融资净买入累计34.97万元(03-23)

2023-03-24 08:00:40

是鬼迷了心窍也好是哪首歌

2023-03-24 06:27:10

曹丕故意刁难曹植,被他轻易化解

2023-03-24 04:50:17

滚动:【崩坏3同人文】 第四章-西琳

2023-03-24 00:07:13

微信没有好友帮解封怎么办_2019微信解封没有好友辅助怎么办-天天快资讯

2023-03-23 21:56:18

环球热资讯!阿特兹12项隐藏功能是什么

2023-03-23 19:56:46

【快播报】德俊数码专营店90%的人庆幸看了,内幕揭秘对比评测

2023-03-23 18:13:21

12.995亿元!上海大华“摇号”摘得昌平朱辛庄0028地块|焦点信息

2023-03-23 17:14:22

美术教育是什么专业_全球动态

2023-03-23 16:52:52

【热闻】子宫右侧附件囊肿是什么意思_右侧附件囊肿严重吗怎么治疗

2023-03-23 15:58:04

港股异动 | 久泰邦达能源(02798)再涨超8% 绩后累涨逾30% 全年净利同比增长146.53% 每日热议

2023-03-23 14:59:37

美债危机在爆雷边缘,世界银行向中国施压,IMF喊话中国减免债务-环球观点

2023-03-23 13:07:15

每日速读!实探中国牙刷之都: “订单多到忙不过来”

2023-03-23 11:48:37

汤沟酒制作的步骤(请问汤沟酒如何)

2023-03-23 10:26:21

淘宝直通车怎么开-全球今亮点

2023-03-23 09:30:07

环球实时:王曦雨晋级WTA1000迈阿密站次轮

2023-03-23 09:17:50

环球信息:外商投资商业企业有哪些

2023-03-23 07:14:32

《披荆斩棘的哥哥》:高瀚宇模仿言承旭,赵文卓绣花展现反差萌-全球实时

2023-03-23 02:47:10

【聚看点】宽带拨号上网什么意思_宽带拨号上网如何理解

2023-03-22 23:06:44

天天新消息丨北京郊区旅游景点

2023-03-22 20:45:27

大豪科技:控股股东拟5000万元-1亿元增持公司股份

2023-03-22 20:26:15

天天视讯!前国际足联、英超裁判:米特洛维奇应被禁赛至少10场

2023-03-22 18:25:56

全球动态:为什么东北地区人口10年减少1101万?

2023-03-22 17:06:06

合思·易快报入选中国信通院《高质量数字化转型产品及服务全景图》

2023-03-22 16:55:30

义乌楼市,购买力再起-快讯

2023-03-22 15:49:09

全球观天下!更大力度吸引和利用外资

2023-03-22 13:58:36

开心宝贝100元充值礼包_开心宝贝10

2023-03-22 11:53:30

预制菜,“看着美”也要“吃得香” 天天观焦点

2023-03-22 09:57:18

后八轮一车多少方砂卵石_后八轮一车多少方 天天聚看点

2023-03-22 08:00:17

《新闻联播》美女主播宝晓峰,45岁仍未婚单身,情系家乡内蒙古 全球观焦点

2023-03-22 04:16:10

胡锡进:传石家庄“放开”了 但很多人反而不敢出门了-环球聚焦

2023-03-21 23:43:48

焦点快看:东方大学城控股附属拟1亿元出售河北廊坊开发区物业

2023-03-21 20:48:50

金洞管理区召开2023年一季度意识形态形势分析研判联席会议

2023-03-21 18:21:36

鼠标总是一卡一卡的是什么原因(鼠标一卡一卡怎么解决)-天天头条

2023-03-21 16:08:35

纯电驱动2023 “全力以赴电动化”宝马大有可为-环球快报

2023-03-21 14:11:57

多少学校心理辅导室只在领导检查时打开?

2023-03-21 12:08:51

环球焦点!建行晋城泽州支行积极开展 3﹒15宣传活动

2023-03-21 10:07:53

蒲江县气象台发布大雾黄色预警信号【III级/较重】【2023-03-21】

2023-03-21 08:19:32

天津国企改革板块3月20日跌1.46%,七一二领跌,主力资金净流出3519.17万元

2023-03-21 04:34:13

兴通股份: 兴通海运股份有限公司关于首次公开发行限售股上市流通公告 全球独家

2023-03-20 23:53:37

昊华能源(601101):第七届第二次董事会会议决议,审议关于变更京西有证房产转让方式暨关联交易的议案等议案_播报

2023-03-20 20:48:57

暗黑破坏神4乱码报错进不去解决方法攻略 世界视讯

2023-03-20 17:58:03

起底安倍纪录片《妖怪之孙》上映,制片人:希望观众认识到日本惨状

2023-03-20 16:00:35

[ES三周年]如何计算数据库的TPS和QPS

2023-03-20 14:07:48

外资持续看好鸿合科技,连续5日获深股通增持

2023-03-20 12:04:32

瑞银首席执行官警告员工:在交易完成前 瑞信仍是“我们的竞争对手”-每日看点

2023-03-20 10:12:05

李亚鹏海哈金喜被曝婚变!女方恐成前妻替身,小女儿名字暗藏深意

2023-03-20 08:09:58

赫尔库拉的复仇怎么交_赫尔库拉的复仇|环球热推荐

2023-03-20 03:12:05

手指游戏中班视频_手指游戏-当前信息

2023-03-19 22:12:20

别催 你的外卖小哥可能正在救火-环球时讯

2023-03-19 18:39:18

【出警笔记】别怕 我们帮你找家人 环球快播

2023-03-19 15:06:43

hop_hop

2023-03-19 12:00:14

吴莎照片 个人简介_吴莎身高个人简介 每日看点

2023-03-19 07:59:10

最新消息:位图图像是由什么来描述图像的_请简述位图图像的特点

2023-03-19 03:00:40

我们什么时候才能等到VR版“黑悟空”? 世界聚焦

2023-03-18 22:05:55

近朱者赤近墨者黑所蕴含的道理与蓬生麻中不扶而直相似_近朱者赤近墨者黑所蕴含的道理_今热点

2023-03-18 18:38:15

当前动态:倪海厦天纪视频全集+电子书合集,网盘2023免费下载

2023-03-18 15:12:19

名人介绍模板_名人介绍 天天播资讯

2023-03-18 12:04:42

保险证书查询网_保险证书查询

2023-03-18 08:57:38

旺能环境(002034):3月17日北向资金增持18.95万股 天天关注

2023-03-18 04:22:37

徐建青:XBB会再度暴击中国吗?数据提示:峰值不会太高

2023-03-18 00:02:00

天天观热点:德伯维尔家的苔丝/名著名译汉英双语文库

2023-03-17 20:51:37

毁三观!“三光书记”举办“情妇群芳宴”,22名情妇个个赛西施 天天即时

2023-03-17 18:03:02

外交部:亚太地区不是地缘博弈的竞技场 热推荐

2023-03-17 16:12:12

全球观热点:哪吒汽车儿童模式控制方法专利公布

2023-03-17 14:04:40

盐湖环评遇阻,阿根廷当局建议“大幅降低开采量”,西藏珠峰早盘大跌

2023-03-17 11:23:09

世界新资讯:kickasstorrents_kickass torrents

2023-03-17 09:40:00

香港故宫文化博物馆开馆至今逾89万人次到访

2023-03-17 07:19:47

LOL:RNG强势横扫滔博,乌兹直播解说,谈到Betty他居然这么说!

2023-03-17 02:55:38

新诺威: 2022年度独立董事述职报告(耿立校)

2023-03-16 22:15:05

热门看点:中公高科:2022年度净利润同比增长1.76% 拟10股派1.15元

2023-03-16 19:52:52

济宁市总工会举办业务能力提升培训班|环球关注

2023-03-16 17:23:10

国防部:日方应切实汲取历史教训在军事安全领域谨言慎行 当前热议

2023-03-16 15:39:24

库尔勒市:香梨技术培训助力增产增收

2023-03-16 13:16:35

2023南通市海门区招聘教师报名时间+入口

2023-03-16 11:02:08

孤峰油布伞 千年雨中花_全球新要闻

2023-03-16 09:59:54

err1是什么意思中文翻译_err1是什么意思_世界热讯

2023-03-16 05:59:35

新乡市新型冠状病毒肺炎疫情:3月16日新乡市疫情最新消息今天数据统计情况通报

2023-03-16 01:03:25

ps怎么裁剪图片一部分_ps怎么裁剪不规则图形

2023-03-15 21:04:49

东华大学是双一流大学吗是一流学科建设高校吗算是名校吗

2023-03-15 19:00:43

同学们上了一堂生动的“消费安全课”

2023-03-15 16:52:35

基金315:交银施罗德基金收到39起投诉 投诉内容与无故扣款、获取用户私人信息等有关

2023-03-15 14:47:23

快消息!路边停的共享汽车怎么用_共享汽车怎么用

2023-03-15 12:03:01

经典古文朗读_经典古文-全球热推荐

2023-03-15 10:00:34

当前视讯!03月15日06时河北石家庄昨日累计报告阳性感染者确诊1728例 怎么判断自己是否属于轻型感染者

2023-03-15 07:59:07

犬字开头的成语_哪些成语是犬字开头

2023-03-15 04:02:58

2023扬州学考成绩在哪查询_最新

2023-03-14 22:53:59

手机丢了怎么登录微信不知道密码_手机丢了怎么登陆微信-每日速讯

2023-03-14 19:58:27

格力地产4亿元公司债券将付年息 票面利率7.00% 天天热资讯

2023-03-14 17:06:50

巴以关系的回顾和前瞻_世界视点

2023-03-14 15:04:30

天天信息:赛力斯3月14日盘中涨幅达5%

2023-03-14 13:17:48

今日热闻!天津医科大学肿瘤医院工会职工小家打造“幸福家园”

2023-03-14 11:08:01

渤海证券:预计今年品牌服饰板块将迎来较为良好的业绩表现|世界报资讯

2023-03-14 08:57:01

广汽回应气囊伤人祺gs5气囊怎么拆_广汽回应气囊伤人|天天热点

2023-03-14 05:02:35