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

ECS Fargate Java容器Micrometer指标无法在CloudWatch按容器区分

解决ECS Fargate容器Micrometer指标CloudWatch合并问题

要让每个Fargate容器的指标在CloudWatch中独立区分,核心是给所有指标添加唯一容器维度,比如ECS任务ID或容器ID,AWS Fargate会自动为容器注入相关环境变量,直接利用这些变量即可实现隔离。

步骤1:获取Fargate容器的唯一标识

Fargate容器默认会注入以下环境变量(无需额外配置):

  • ECS_TASK_ID:当前任务的唯一ID(每个容器对应一个任务,可作为唯一标识)
  • ECS_CONTAINER_ID:容器的唯一ID

我们可以通过Spring的Environment对象获取这些变量。

步骤2:修改Metrics配置,添加全局维度

修改你的MetricsConfiguration类,注入Environment,并给CloudWatchMeterRegistry添加全局通用标签(即CloudWatch维度):

import io.micrometer.cloudwatch2.CloudWatchConfig;
import io.micrometer.cloudwatch2.CloudWatchMeterRegistry;
import io.micrometer.core.instrument.Clock;
import io.micrometer.core.instrument.MeterRegistry;
import org.jetbrains.annotations.NotNull;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.env.Environment;
import software.amazon.awssdk.services.cloudwatch.CloudWatchAsyncClient;

import java.time.Duration;
import java.util.Map;

@Configuration
public class MetricsConfiguration {

    private final String metricsNamespace = "test";
    private final Environment environment;

    // 注入Environment
    public MetricsConfiguration(Environment environment) {
        this.environment = environment;
    }

    @Bean
    public CloudWatchAsyncClient cloudWatchAsyncClient() {
        return CloudWatchAsyncClient
                .builder()
                .build();
    }

    @Bean
    public MeterRegistry getMeterRegistry() {
        CloudWatchConfig cloudWatchConfig = setupCloudWatchConfig();
        CloudWatchMeterRegistry registry = new CloudWatchMeterRegistry(
                cloudWatchConfig,
                Clock.SYSTEM,
                cloudWatchAsyncClient());

        // 添加全局维度:用ECS任务ID作为唯一标识,也可以换成ECS_CONTAINER_ID
        String taskId = environment.getProperty("ECS_TASK_ID");
        if (taskId != null) {
            registry.commonTags("ecs_task_id", taskId);
        }

        // 可选:添加容器ID维度
        String containerId = environment.getProperty("ECS_CONTAINER_ID");
        if (containerId != null) {
            registry.commonTags("ecs_container_id", containerId);
        }

        return registry;
    }

    private CloudWatchConfig setupCloudWatchConfig() {
        return new CloudWatchConfig() {

            private final Map<String, String> configuration = Map.of(
                    "cloudwatch.namespace", metricsNamespace,
                    "cloudwatch.step", Duration.ofSeconds(30).toString()
            );

            @Override
            public String get(@NotNull String key) {
                return configuration.get(key);
            }
        };
    }
}

为什么之前的cloudwatch.container_label配置无效?

cloudwatch.container_label配置是用来从Docker容器的标签中提取维度,但Fargate管理的容器标签默认不会包含container_name这类可唯一区分的标识,且该配置依赖容器运行时的标签暴露,可靠性不如直接使用ECS注入的环境变量。

验证结果

部署修改后的应用后,登录CloudWatch控制台:

  1. 进入你的test命名空间
  2. 查看jdbc.connections.active指标,会看到每个容器的指标都带有ecs_task_id(或ecs_container_id)维度,不同容器的指标会作为独立条目展示。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 16:03:16