如何在 Rails 应用程序中将法拉第请求正文添加到 Datadog 跟踪中

Posted

技术标签:

【中文标题】如何在 Rails 应用程序中将法拉第请求正文添加到 Datadog 跟踪中【英文标题】:How to add Faraday request body into Datadog tracing in a Rails app 【发布时间】:2022-01-18 14:59:42 【问题描述】:

我正在尝试使用 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。

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

【问题讨论】:

这对docs.datadoghq.com/tracing/setup_overview/setup/ruby/#faraday有帮助吗? 我看到那里有一个额外的options。也许这就是缺少的东西。我没有使用 Datadog。 【参考方案1】:

因此,默认情况下,作为跨度一部分的 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,您可以将任何您想要的内容添加到跨度中,因此您可以为法拉第中间件编写扩展或猴子补丁以将主体和参数添加到跨度:

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")

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

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

【讨论】:

以上是关于如何在 Rails 应用程序中将法拉第请求正文添加到 Datadog 跟踪中的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中将json添加到http帖子的正文中

如何在Rails 3应用程序中将gem添加到我的vendor / cache目录?

如何通过 HttpClient 在 POST 请求中将 JSON 数据作为正文发送

如何在 Rails 中将当前时间添加 10 天

如何在Rails中将服务目录添加到加载路径?

Quickbooks&Rails 5,无法创建发票