prometheus集成eureka服务发现

背景

项目中部署prometheus的时候,最开始如果需要额外添加一台机器,需要手动更新prometheus的配置文件,再重新启动,如果是正式生产环境存在大量的机器的情况,这种方式有很大的运维成本。于是想如果能让prometheus自动发现要添加的应用实例,则可以免去手动添加的繁琐操作。组内项目有使用eureka做服务发现,它也有对应的API开放,就想如果能够集成eureka会方便很多。开始想的是自己写个脚本(如python)从eureka获取注册的实例,然后写到配置里,使用prometheus的文件服务发现,然后做reload实现。
好在后续调研发现,在新版本的prometheus已经支持了集成eureka,只需要添加配置就可以实现想要的功能。

说明

使用的prometheus版本是2.22.0。项目中使用prometheus + micrometer进行基础的JVM、http、数据库、线程池以及业务的可用度、耗时监控,这块后面单独再写文章详细介绍,下面会简单介绍。只要知道在完成后,会通过在actuator/prometheus暴露各项指标,然后由prometheus拉取,实现数据的采集。

springboot actuator集成prometheus

  1. 依赖
    <dependency>
        <groupId>io.prometheus</groupId>
        <artifactId>simpleclient_common</artifactId>
        <version>RELEASE</version>
    </dependency>
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-core</artifactId>
        <version>1.5.1</version>
    </dependency>
    <dependency>
        <groupId>io.micrometer</groupId>
        <artifactId>micrometer-registry-prometheus</artifactId>
        <version>1.5.1</version>
    </dependency>
  1. 配置
    添加application.yml
management:
  endpoints:
    enabled-by-default: true
    web:
      exposure:
        include: ['pause','prometheus']
  endpoint:
    pause:
      enabled: true
    prometheus:
      enabled: true
  server:
    port: 8293 
    servlet:
      context-path: /api   # 给actuator也设置context-path  这个配置在springboot 2.4 0 之后,改为base-path, 相应eureka配置也要修改

这里基于安全考虑对actuator添加了额外的端口,和服务端口不一样。因此,在本地eureka的配置中添加一个metadataMap.prometheus.port项。这个会保存到eureka的metadata,然后被prometheus eureka sd解析到。如下:

eureka:
  instance:
    prefer-ip-address: true
    lease-renewal-interval-in-seconds: 10
    metadataMap.prometheus.port: 8293

加几个自定义标签,比如这里设置application为业务名,以及添加一个idc表示业务部署机房。

@Slf4j
@Configuration
public class PrometheusConfiguration {
    private final Tags commonTags = Tags.of("application", "myapp", "idc", System.getProperty("idc"));

    @Autowired
    private MeterRegistry meterRegistry;

    @Bean
    public MeterRegistryCustomizer<MeterRegistry> configurer() {
        //key value
        //log4j 的用不到,排除掉
        return (registry) -> registry.config().commonTags(commonTags).meterFilter(MeterFilter.denyNameStartsWith("log4j")).pauseDetector();
    }
}
  1. 结果示例
    项目集成完成后启动,访问yourapp:port/actuator/prometheus得到prometheus的待采集数据
# HELP jvm_memory_used_bytes The amount of used memory
# TYPE jvm_memory_used_bytes gauge
jvm_memory_used_bytes{application="myapp",area="nonheap",id="Code Cache",idc="staging",} 1.20810432E8
jvm_memory_used_bytes{application="myapp",area="nonheap",id="Metaspace",idc="staging",} 1.5934492E8
jvm_memory_used_bytes{application="myapp",area="heap",id="G1 Old Gen",idc="staging",} 2.54245616E8
jvm_memory_used_bytes{application="myapp",area="heap",id="G1 Eden Space",idc="staging",} 2.0447232E8
jvm_memory_used_bytes{application="myapp",area="nonheap",id="Compressed Class Space",idc="staging",} 1.8597632E7
jvm_memory_used_bytes{application="myapp",area="heap",id="G1 Survivor Space",idc="staging",} 8388608.0

配置

然后我们添加prometheus的配置,让其自动发现我们注册到eureka的服务实例。

scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: 'prometheus'

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
    - targets: ['localhost:9090']


#原先静态配置的targets,需要重启和改配置文件
#  - job_name: 'myapp' 
#    metrics_path: '/actuator/prometheus'
#    scrape_interval: 5s
#    static_configs:
#    - targets: ['myapp1:8157', 'myapp2:8157']

  - job_name: 'eureka_sd'
    eureka_sd_configs:
      - server: 'http://my_eureka.server:port/eureka'   #注意这里地址后面是eureka
    basic_auth:
      username: 'myuser'
      password: 'mypass'   # 应用对/actuator添加了spring security http basic验证
    relabel_configs:
    - source_labels: [__address__, __meta_eureka_app_instance_metadata_prometheus_port]
      action: replace
      regex: ([^:]+)(?::\d+)?;(\d+)
      replacement: $1:$2
      target_label: __address__
    metrics_path: '/actuator/prometheus' #采集地址

之后重启prometheus服务或者reload配置,然后在prometheus的管理界面访问/service-discovery,就可以看到通过eureka服务发现添加的实例。配置中relablel_configs的部分,可以通过对原始标签对应内容的匹配过滤,生成新的标签内容。比如根据eureka注册的实例名称和端口,生成新的目标标签。

总结

以上就是本期的所有内容。目前对于prometheus的应用比较初级,其实还有许多要解决的问题,首先是数据的持久化,本来考虑支持openTSDB,公司也有内部资源支持,但是openTSDB查询对于模糊查询支持不太好,且公司的资源维护也在起步阶段,试用后发现有些问题,再者没有很好的兼容grafana。因此,还是使用在单机的prometheus本地tsdb存储;其次,对于报警方面目前还没有深入调研,我们知道监控和报警一般是相辅相成的;最后就是prometheus服务本身的HA这块,也需要再做了解。

参考资料

  1. prometheus存储
  2. prometheus集成eureka配置示例
  3. prometheus服务发现#eureka
  4. actuator+prometheus+grafana集成1
  5. actuator+prometheus+grafana集成2
  6. SpringBoot Prometheus Metric
  7. Eureka Prometheus PR
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,793评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,567评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,342评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,825评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,814评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,680评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,033评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,687评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,175评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,668评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,775评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,419评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,020评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,978评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,206评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,092评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,510评论 2 343

推荐阅读更多精彩内容