You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Prometheus Relabel配置实现EC2实例按环境递增计数重命名?

解决方案

要实现将复杂命名的EC2实例重命名为project_name-environment-counter格式,需要分两步:先从实例的元数据标签中提取环境(dev/prod)和项目名称,再生成实例编号。由于Prometheus的relabel阶段无法跨目标计数,这里提供两种可行方案:

方案1:抓取阶段生成唯一编号(非连续)

该方案通过hashmod动作生成基于环境的唯一编号,配置简单,无需额外规则,适合对编号连续性要求不高的场景。

在prometheus.yaml的scrape_configs中添加以下relabel_configs:

scrape_configs:
  - job_name: 'ec2'
    ec2_sd_configs:
      - region: <你的AWS区域>
        # 按需配置AWS凭证或IAM角色
    relabel_configs:
      # 1. 从LaunchTemplate名称中提取环境标签(dev/prod)
      - source_labels: [aws_launch_template_name]
        regex: '.*-(dev|prod)-.*'
        target_label: environment
        replacement: '$1'
        action: replace
      
      # 2. 提取项目名称并转换为下划线格式(project-name → project_name)
      - source_labels: [aws_launch_template_name]
        regex: 'ProjectName/(project-name)-.*'
        target_label: project
        replacement: '$1'
        action: replace
      
      # 3. 基于环境和实例ID生成唯一编号(modulus值可根据实例数量调整)
      - source_labels: [environment, instance]
        modulus: 1000
        target_label: instance_counter
        action: hashmod
      
      # 4. 拼接成最终的instance标签格式:project_name-environment-counter
      - source_labels: [project, environment, instance_counter]
        target_label: instance
        replacement: '$1_$2-$3'
        action: replace

配置说明:

  • aws_launch_template_name是EC2服务发现自动生成的标签,若你的实例标签来自aws_autoscaling_group_name,只需替换source_labels对应值即可。
  • modulus设置为实例最大可能数量的上限,确保编号不重复。

方案2:通过记录规则生成连续编号

若需要按环境生成连续的实例编号(如dev-1、dev-2),需借助Prometheus的记录规则(recording rules)实现,因为relabel阶段无法跨目标统计实例数量。

步骤1:保留原始标签

先在relabel_configs中提取环境和项目标签,保留原始instance标签:

scrape_configs:
  - job_name: 'ec2'
    ec2_sd_configs:
      - region: <你的AWS区域>
    relabel_configs:
      - source_labels: [aws_launch_template_name]
        regex: '.*-(dev|prod)-.*'
        target_label: environment
        replacement: '$1'
        action: replace
      
      - source_labels: [aws_launch_template_name]
        regex: 'ProjectName/(project-name)-.*'
        target_label: project
        replacement: '$1'
        action: replace

步骤2:添加记录规则

在Prometheus的规则配置文件(如rules.yaml)中添加以下规则,生成带连续编号的指标:

groups:
  - name: ec2_instance_numbering
    rules:
      - record: ec2_instance:up_numbered
        expr: |
          up{job="ec2"}
          * on(project, environment) group_left(instance_number)
          (
            # 按环境分组,对实例排序后分配连续编号
            sort by(instance) up{job="ec2"}
            | index by(project, environment)()
          )

使用方式:

查询时可通过以下表达式拼接成目标格式:

label_replace(ec2_instance:up_numbered, "instance", "$1_$2-$3", "", "(.*);(.*);(.*)")

其中$1对应project标签,$2对应environment标签,$3对应生成的instance_number编号。

注意事项

  • 确保Prometheus的EC2服务发现已正确配置,能获取到aws_launch_template_name或aws_autoscaling_group_name标签。
  • 若实例命名规则有变化,需同步调整regex表达式以匹配新的命名格式。

内容的提问来源于stack exchange,提问作者nico

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 03:14:57