在ECS中将Python日志收集到DataDog

时间:2018-07-20 12:57:38

标签: logging flask amazon-ecs datadog aws-fargate

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

但这似乎不足。 我朝正确的方向前进吗?我想念什么?

1 个答案:

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

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

我不得不做进一步的修改来设置syslog.*键的值,这对于我们的应用程序来说很有意义,但是效果很好。