如何在Prometheus relabel配置中拼接EC2实例标签生成实例名?
实现Prometheus EC2实例名的多标签拼接重标记
没问题,这个需求在Prometheus的relabel配置里完全可以实现,核心是利用source_labels数组指定多个源标签,再通过replacement参数来拼接它们的内容。
基础实现:拼接Name标签和私有IP
你原来的配置只使用了单个源标签,现在只需要修改source_labels为包含__meta_ec2_tag_Name和__meta_ec2_private_ip的数组,然后在replacement里用占位符对应每个源标签的值,用冒号连接起来即可:
relabel_configs: - source_labels: ['__meta_ec2_tag_Name', '__meta_ec2_private_ip'] target_label: 'instance' replacement: '${1}:${2}'
这里的${1}会替换成第一个源标签(__meta_ec2_tag_Name)的值,${2}对应第二个源标签(__meta_ec2_private_ip)的值,最终就会生成你想要的portal-service:10.0.19.98格式的实例名。
扩展:添加更多标签
如果后续需要拼接更多标签(比如EC2实例ID),只需要扩展source_labels数组,并在replacement里增加对应的占位符即可:
relabel_configs: - source_labels: ['__meta_ec2_tag_Name', '__meta_ec2_private_ip', '__meta_ec2_instance_id'] target_label: 'instance' replacement: '${1}:${2}:${3}'
健壮性优化:处理无Name标签的实例
如果你的EC2实例存在没有设置Name标签的情况,直接拼接会得到类似:10.0.19.98的不美观结果。可以先给这类实例设置一个默认名称,再进行拼接:
relabel_configs: # 第一步:给无Name标签的实例设置默认名称 - source_labels: ['__meta_ec2_tag_Name'] target_label: 'temp_instance_name' replacement: 'unnamed-ec2-instance' # 第二步:拼接默认名称和私有IP - source_labels: ['temp_instance_name', '__meta_ec2_private_ip'] target_label: 'instance' replacement: '${1}:${2}'
这样即使实例没有Name标签,也会生成unnamed-ec2-instance:10.0.19.98这样的有效实例名。
内容的提问来源于stack exchange,提问作者Vova Rozhkov
相关产品推荐
相关产品推荐

