有没有办法在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 执行。
我建议您根据经过的时间值(例如,RunTime
、TotalTime
)命名指标,并根据任务定义名称命名维度。
我在 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 执行。
我建议您根据经过的时间值(例如,RunTime
、TotalTime
)命名指标,并根据任务定义名称命名维度。