【问题标题】:How to use Datadog agent in Azure App Service?如何在 Azure 应用服务中使用 Datadog 代理?
【发布时间】:2023-03-27 22:00:02
【问题描述】:

我在 Azure 应用服务中将 Web 应用作为 Docker 容器运行。我想将 Datadog 代理添加到每个容器中,例如,在后台读取日志文件并将它们发布到 Datadog 日志管理。这是我尝试过的:

1) 如this post 中所述,将 Datadog 代理安装为扩展。此选项似乎不适用于应用服务应用,仅适用于 VM。

2) 使用in this post 所述的多容器应用程序。但是,我们还没有找到一种简单的方法来将其与Azure DevOps release pipelines 集成。我想也许可以创建一个包装 Azure CLI 命令的自定义部署任务?

3) 按照 Datadog Dockerfiles are built 的方式将 Datadog 代理包含到我们的 Dockerfiles 中。这个过程看起来相当复杂,并为我们的 Dockerfile 添加了许多额外的依赖项。我们也不希望使用 FROM datadog/agent 从 Datadog Dockerfile 继承我们的 Dockerfile。

我认为这对于 Azure+Datadog 用户来说一定是一个非常标准的问题。任何想法什么是最干净的选择?

【问题讨论】:

    标签: azure azure-devops azure-web-app-service datadog


    【解决方案1】:

    我怀疑 Datadog 代理是否会在 App Services Web 应用上运行,因为您无法访问正在运行的主机,它是为 VM 设计的。 你试过这个https://www.datadoghq.com/blog/azure-monitoring-enhancements/ 吗?他们说他们支持 AppServices

    【讨论】:

    • 感谢您的回复!我们确实在使用 Azure Monitoring for App Services,但它们只提供预定义的指标。我们想通过 DataDog 代理增加自定义指标。但您可能是对的,目前无法将代理与应用服务一起使用。
    • 我为 Datadog 创建了一个应用服务扩展:github.com/payscale/datadog-app-service-extension
    【解决方案2】:

    我编写了一个应用服务扩展,用于使用 .NET 核心发送 Datadog APM 指标,并在此处提供了如何设置的说明:https://github.com/payscale/datadog-app-service-extension

    如果您有任何问题或者这不适用于您的情况,请告诉我。

    【讨论】:

      【解决方案3】:

      来自应用服务的日志也可以发送到 Blob 存储,并通过 Azure 函数从那里转发。与来自应用服务的跟踪和自定义指标不同,这不需要运行代理的 VM。该函数的文档和代码可在此处获得:

      https://github.com/DataDog/datadog-serverless-functions/tree/master/azure/blobs_logs_monitoring

      【讨论】:

        【解决方案4】:

        如果您想使用 DataDog 从应用服务的 Azure 功能进行日志记录,您可以使用 Serilog 和 DataDog Sink 到日志文件:

                services
                    .AddLogging(loggingBuilder =>
                        loggingBuilder.AddSerilog(
                            new LoggerConfiguration()
                                .WriteTo.DatadogLogs(
                                    apiKey: "REPLACE - DataDog API Key",
                                    host: Environment.MachineName,
                                    source: "REPLACE - Log-Source",
                                    service: GetServiceName(),
                                    configuration: new DatadogConfiguration(),
                                    logLevel: LogEventLevel.Infomation
                                )
                                .CreateLogger())
                    );
        

        Full source code and required NuGet packages 在这里:

        【讨论】:

          【解决方案5】:

          要回复您关于需要自定义指标的评论,如果代理不在同一位置,这仍然是可能的。安装名为 statsdclient 的 datadog 的 nuget 包后,您可以将其配置为将自定义指标发送到位于其他地方的代理。下面的例子:

          using StatsdClient;
          
          var dogstatsdConfig = new StatsdConfig
          {
              StatsdServerName = "127.0.0.1", // Optional if DD_AGENT_HOST environment variable set
              StatsdPort = 8125, // Optional; If not present takes the DD_DOGSTATSD_PORT environment variable value, else default is 8125
              Prefix = "myTestApp", // Optional; by default no prefix will be prepended
              ConstantTags = new string[1] { "myTag:myTestAppje" } // Optional
          };
          
          StatsdClient.DogStatsd.Configure(dogstatsdConfig);
          StatsdClient.DogStatsd.Increment("fakeVisitorCountByTwo", 2); //Custom metric itself
          

          【讨论】:

          • 感谢您的评论!我们确实使用了一个名为datadog-metrics 的类似包将自定义指标发送到Datadog API。我本来希望使用 Datadog 代理作为“sidecar”来收集来自应用服务容器的日志。但我们最终将日志推送到 Redis,然后通过 Logstash 推送到 Datadog API。
          • 如果我理解你所写的内容是正确的,那么在我看来,这并不是你真正应该想要的。如果您想直接将日志发送到 DataDog 而不是自己存储,那么将日志与其他系统集成将非常困难。例如,如果您想将日志也发送到日志分析器进行安全检查怎么办?从您自己的日志存储中发送它比首先从 DataDog 中提取您自己的日志要容易得多。
          最近更新 更多