ruby-on-rails - 如何将法拉第请求主体添加到 Rails 应用程序中的 Datadog 跟踪中

标签 ruby-on-rails trace datadog faraday apm

我正在尝试使用 Datadog 在 Rails 应用程序中配置法拉第追踪。

我已经设置了 Faraday -> Datadog 连接:

require 'faraday'
require 'ddtrace'

Datadog.configure do |c|
  c.use :faraday
end

Faraday.post("http://httpstat.us/200", {foo: 1, bar: 2}.to_json)
Faraday.get("http://httpstat.us/201?foo=1&bar=2")

它运行良好,请求被记录到 Datadog。

但是这些日志不包含任何请求参数,但是是 GET 或 POST。

GET request log POST request log

关于如何将请求参数/正文记录到 Datadog 的任何建议?

最佳答案

因此,默认情况下,就 HTTP 请求而言,从 Faraday 发送到 Datadog 的唯一内容是:

      span.set_tag(Datadog::Ext::HTTP::URL, env[:url].path)
      span.set_tag(Datadog::Ext::HTTP::METHOD, env[:method].to_s.upcase)
      span.set_tag(Datadog::Ext::NET::TARGET_HOST, env[:url].host)
      span.set_tag(Datadog::Ext::NET::TARGET_PORT, env[:url].port)

来源:https://github.com/DataDog/dd-trace-rb/blob/e391d2eb64d3c6151a4bdd2710c6a8c7c1d57457/lib/ddtrace/contrib/faraday/middleware.rb#L54

默认情况下,请求的主体不会设置在 span 的 http 部分,只有 URL、HTTP 方法、主机和端口。

但是,对于 manual instrumentation您可以将任何您想要的内容添加到跨度中,因此您可以向 Faraday 中间件编写扩展或猴子补丁,以将正文和参数添加到跨度中:

span.set_tag("http.body", env[:body])
span.set_tag("http.params", env[:params])

猴子补丁示例:

require 'faraday'
require 'ddtrace'
require 'ddtrace/contrib/faraday/middleware'

module FaradayExtension
  private
  def annotate!(span, env, options)
    # monkey patch to add body to span
    span.set_tag("http.body", env[:body]) unless env[:body].to_s.strip.empty?
    span.set_tag("http.query", env[:url].query) if env[:url].query
    super
  end
end

Datadog::Contrib::Faraday::Middleware.prepend(FaradayExtension)

Datadog.configure do |c|
  c.use :faraday
end

Faraday.post("http://httpstat.us/200", {foo: 1, bar: 2}.to_json)
Faraday.get("http://httpstat.us/201?foo=1&bar=2")

这在我的测试中对我有用:

Post Get

注意:我是 Datadog 员工,但不在工程团队,只是想保持透明!

关于ruby-on-rails - 如何将法拉第请求主体添加到 Rails 应用程序中的 Datadog 跟踪中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70363446/

相关文章:

Haskell - 程序的结果

azure - 如何在Azure应用服务中使用Datadog代理?

python - Datadog 计数指标因多个容器而下降

ruby-on-rails - 如何在 OSX 上安装 Ruby on Rails 3?

ruby-on-rails - 在回形针中找不到图像(没有路由匹配 [Get])

android - 如何在 Android 上使用 startMethodTracing API?

synchronization - COMPAS 中的不同步轨迹

ruby-on-rails - 如何将多个模型类放在一个模块中以在 Rails 中使用

ruby-on-rails - 删除带有mongoid的嵌入式文档

datadog - datadog is_match 上是否还存在