1

我很难使用 DataDog 代理从部署在 ECS 中的 python 应用程序收集日志。我在 ECS 中部署了一个 dockerized 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\"}]"
  },

到应用程序容器和以下 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"
    }
  ]

但这似乎还不够。我是否朝着正确的方向前进?我错过了什么?

4

1 回答 1

3

我与 Datadog 支持人员讨论了这个问题,他们确认awslogs日志记录驱动程序阻止 Datadog 代理容器访问容器的日志。由于awslogs目前是唯一可用于使用 Fargate 启动类型的任务的日志记录驱动程序,因此将日志记录到 Datadog 将需要另一种方法。

由于awslogs日志记录驱动程序将日志发送到 CloudWatch,我使用的一种方法是创建订阅以将这些日志组流式传输到 Datadog 的 Lambda 函数,如此处配置。您可以使用 CloudWatch 日志作为触发器从Lambda 端Actions执行此操作,或者通过单击>从 CloudWatch Logs 端执行此操作Stream to AWS Lambda

我选择了 Lambda 选项,因为它既快速又简单,并且不需要对我们的应用程序进行任何代码更改(因为我们仍处于评估阶段)。Datadog 支持建议我必须修改 Lambda 函数才能将日志归因于相应的服务:

此块中,将其修改为:

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 支持:

  1. syslog.appname需要匹配现有的 APM 服务,以便将日志与服务相关联。
  2. 目前,该解决方案并未得到完全支持,他们正在努力对此进行更彻底的记录。

我必须进行进一步的修改,以syslog.*对我们的应用程序有意义的方式设置键的值,但它工作得很好。

于 2018-07-20T22:20:42.297 回答