Railsでddtraceを使う際に、Datadogのログに残すリクエストをフィルタリングしたい

こんにちは!kossyです!




さて、今回はDatadog の Ruby 用トレースクライアントであるddtrace gemで、Datadogのトレース対象とするリクエストをフィルタリングする方法について、ブログに残してみたいと思います。




環境
Rails 6.1.4
Ruby 2.7.6
ddtrace 1.4.1




実装方法

結論、以下のコードをconfig/initializers/datadog.rbに記載すればOKです。

Datadog::Pipeline.before_flush(
  Datadog::Pipeline::SpanFilter.new { |span| span.resource =~ /フィルタリングしたいControllerクラス/ },
)

例えばサーバーヘルスチェック用のAPIをトレース対象から除外したい場合は、

Datadog::Pipeline.before_flush(
  Datadog::Pipeline::SpanFilter.new { |span| span.resource =~ /HealthcheckController/ },
)

のように記載すればOKです。


複数のAPIをフィルタリングしたい場合

複数のクラスをトレース対象から除外したい場合は、「|」で繋いで記載すればOKです。

Datadog::Pipeline.before_flush(
  Datadog::Pipeline::SpanFilter.new { |span| span.resource =~ /HealthcheckController|PingController/ },
)

意図通り動くか、正規表現部分のチェックをしてみましょう。

# マッチした場合は0が返る
"HealthcheckController" =~ /PingController|HealthcheckController/
=> 0

# マッチしない場合はnilが返る
"HealthcheckController" =~ /PingController/
=> nil

"HealthcheckController" =~ /HealthcheckController/
=> 0

大いに参考にさせていただいたサイト

docs.datadoghq.com
s3.amazonaws.com