我很难使用DataDog Agent从部署在ECS中的python应用程序收集日志。我在ECS中部署了docker化的Flask应用。该应用程序将日志吐出到标准输出。我现在需要在DataDog中监视它们。
我添加了一个新的DataDog代理容器(与Fargate兼容,因为我使用的是Fargate),该容器作为与应用程序相同的任务的一部分运行。我可以在app.datadoghq.com/containers中看到这两个容器的CPU和内存指标,因此这意味着DataDog代理正在工作。
我现在需要应用程序日志。我浏览了https://app.datadoghq.com/logs/onboarding/container中的文档,已添加
"dockerLabels": {
"com.datadoghq.ad.logs": "[{\"source\": \"python\", \"service\": \"flask\"}]"
},
到app容器,以下env.vars到DataDog容器:
"environment": [
{
"name": "DD_API_KEY",
"value": "<key>"
},
{
"name": "DD_LOGS_ENABLED",
"value": "true"
},
{
"name": "DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL",
"value": "true"
},
{
"name": "SD_BACKEND",
"value": "docker"
},
{
"name": "ECS_FARGATE",
"value": "true"
}
]
但这似乎不足。 我朝正确的方向前进吗?我想念什么?
答案 0 :(得分:3)
我在Datadog支持下进行了讨论,他们确认awslogs
日志记录驱动程序会阻止Datadog代理容器访问容器的日志。由于awslogs
是当前唯一可用于使用Fargate启动类型的任务的日志记录驱动程序,因此将日志获取到Datadog中将需要另一种方法。
由于awslogs
日志记录驱动程序将日志发送到CloudWatch,因此我使用的一种方法是创建订阅,以按配置的here将这些日志组流式传输到Datadog的Lambda函数。您可以从Lambda side使用CloudWatch日志作为触发器来执行此操作,也可以从CloudWatch Logs一侧单击Actions
> Stream to AWS Lambda
。
我之所以选择Lambda选项,是因为它很快速,容易并且不需要更改应用程序代码(因为我们仍处于评估阶段)。 Datadog支持人员告诉我,有必要修改Lambda函数,以便将日志归因于相应的服务:
在this block中,将其修改为:
structured_line = merge_dicts(log, {
"syslog.hostname": logs["logStream"],
"syslog.path": logs["logGroup"],
"syslog.appname": logs["logGroup"],
"aws": {
"awslogs": {
"logGroup": logs["logGroup"],
"logStream": logs["logStream"],
"owner": logs["owner"]
}
}
})
根据Datadog支持:
syslog.appname
需要匹配现有的APM服务,以便将日志与该服务相关联。我不得不做进一步的修改来设置syslog.*
键的值,这对于我们的应用程序来说很有意义,但是效果很好。