收集 Python 日志到 ECS 中的 DataDog

Collecting Python logs to DataDog in ECS

我很难使用 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"
    }
  ]

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

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

由于 awslogs 日志记录驱动程序将日志发送到 CloudWatch,我使用的一种方法是创建订阅以将这些日志组流式传输到 Datadog 的 Lambda 函数,如配置的那样 here. You can do that from the 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 支持:

  1. syslog.appname 需要匹配现有的 APM 服务才能将日志关联到该服务。
  2. 此解决方案目前未得到完全支持,他们正在努力更全面地记录这一点。

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