有没有办法在AWS上找到ECS计划任务的平均运行时间?

Is there a way to find the average runtime of an ECS scheduled task on AWS?

我在 ECS 上有一个计划任务 运行,启动类型为 Fargate。有没有办法找到过去 X 时间内任务的平均运行时间?

您无疑已经知道,ECS CloudWatch metrics 仅限于集群和服务。我在想 AWS Batch 可能有 task-level 指标,并建议使用它,但似乎没有 any 指标。

所以这意味着您自己生成指标。我认为最好的方法是实现一个 triggered by an EventBridge event.

的 Lambda

碰巧,我只是这样做了(不是为了生成指标,抱歉),所以可以概述基本步骤。

第一个是你需要设置EventBridge规则。这是我使用的规则,它会在特定任务定义完成时触发 Lambda:

{
  "detail-type": ["ECS Task State Change"],
  "source": ["aws.ecs"],
  "detail": {
    "taskDefinitionArn": [{
      "prefix": "arn:aws:ecs:us-east-1:123456789012:task-definition/HelloWorld:"
    }],
    "lastStatus": ["STOPPED"]
  }
}

这会查找特定的任务定义。如果您删除 HelloWorld:,它将在 每个 任务定义上触发。

您的 Lambda 将通过以下事件调用(我已删除与此答案无关的所有内容):

{
    "version": "0",
    "id": "2e08a760-c304-9681-9509-e6c9ca88ee36",
    "detail-type": "ECS Task State Change",
    "source": "aws.ecs",
    "detail": {
        "createdAt": "2022-03-10T15:18:57.782Z",
        "pullStartedAt": "2022-03-10T15:19:10.488Z",
        "pullStoppedAt": "2022-03-10T15:19:26.541Z",
        "startedAt": "2022-03-10T15:19:26.846Z",
        "stoppingAt": "2022-03-10T15:19:36.946Z",
        "stoppedAt": "2022-03-10T15:19:50.213Z",
        "stoppedReason": "Essential container in task exited",
        "stopCode": "EssentialContainerExited",
        "taskDefinitionArn": "arn:aws:ecs:us-east-1:123456789012:task-definition/HelloWorld:1",
    }
}

所以,您有一堆 ISO-8601 时间戳,对于您要跟踪的任何指标,它们应该很容易转换为经过的时间值。您已获得任务定义 ARN,您可以从中提取任务定义名称。从那里你可以调用 PutMetricData API 调用。我还在示例中留下了 stopCode,因为您可能想要跟踪成功与 non-successful 执行。

我建议您根据经过的时间值(例如,RunTimeTotalTime)命名指标,并根据任务定义名称命名维度。