如何通过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
相关产品推荐
相关产品推荐

