如何在 Rails 应用程序中将法拉第请求主体添加到 Datadog 跟踪中
How to add Faraday request body into Datadog tracing in a Rails app
我正在尝试使用 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。
关于如何将请求 params/body 记录到 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)
默认情况下,请求的正文不会设置在 span 的 http 部分,只有 URL、HTTP 方法、主机和端口。
然而,使用 manual instrumentation 你可以添加任何你想要的东西到 span,所以你可以写一个扩展或者 monkey-patch 到 Faraday 中间件来添加主体和参数到 span:
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 员工,但不在工程团队,只是想保持透明!
我正在尝试使用 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。
关于如何将请求 params/body 记录到 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)
默认情况下,请求的正文不会设置在 span 的 http 部分,只有 URL、HTTP 方法、主机和端口。
然而,使用 manual instrumentation 你可以添加任何你想要的东西到 span,所以你可以写一个扩展或者 monkey-patch 到 Faraday 中间件来添加主体和参数到 span:
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 员工,但不在工程团队,只是想保持透明!