我很难收集使用DataDog代理部署在ECS中的python应用程序的日志。我在ECS中部署了一个对接的Flask应用程序。该应用程序将日志发送到stdout。我现在需要在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\"}]"
},
添加到应用程序容器,并将以下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"
}
]
但这似乎还不够。我走的方向对吗?我错过了什么?
发布于 2018-07-21 06:20:42
我与Datadog support讨论了这个问题,他们确认awslogs
日志记录驱动程序阻止Datadog代理容器访问容器的日志。由于awslogs
目前是使用Fargate启动类型的任务可用的唯一日志记录驱动程序,因此将日志记录到Datadog中将需要另一种方法。
由于awslogs
日志记录驱动程序将日志发送到CloudWatch,因此我使用的一种方法是创建一个订阅,按照配置的here将这些日志组流式传输到Datadog函数。您可以使用CloudWatch日志作为触发器从Lambda side执行此操作,也可以从CloudWatch日志端单击Actions
> Stream to AWS Lambda
执行此操作。
我选择Lambda选项是因为它快速简单,并且不需要对我们的应用程序进行代码更改(因为我们仍处于评估阶段)。Datadog support建议我有必要修改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
需要匹配现有的应用程序维护管理服务,以便将日志与service.我不得不做进一步的修改,以一种对我们的应用程序有意义的方式来设置syslog.*
键的值,但它工作得很好。
https://stackoverflow.com/questions/51443070
复制相似问题