くりにっき

フルスタックキュアエンジニアです

datadog_thread_tracerを作った

ISUCON合わせで作ったやつ第n弾

github.com

モチベーション

ISUCONの素振りでパフォーマンスチューニングのために重い処理を

threads = []

threads << Thread.start do
  # 並列で実行したい処理1
end

threads << Thread.start do
  # 並列で実行したい処理2
end

threads.each(&:join)

みたいにスレッドで並列処理すると、

のようにスレッド内で実行した処理がddtraceでトレースできなくて困ったのでなんとかしたかったのが一番の理由です

実装までの経緯

公式ドキュメントを探してもどうやればスレッド内の呼び出しをトレースできるか見つからなかったのですが、 下記Issueをヒントにして実装しました。

github.com

このIssueだとddtrace v0系だけどv1系でシンタックスが大きく変わってるのでdatadog_thread_tracerはv1系前提で実装してます。

datadog_thread_tracerを使った時

下記のように書くことで

require "datadog_thread_tracer"

DatadogThreadTracer.trace do |t|
  t.trace do
    # 並列で実行したい処理1
  end

  t.trace do
    # 並列で実行したい処理2
  end
end

このようにトレースがDatadogで見れるようになります

頑張りポイント

rbsを書いた

最近のbundlerだと bundle gem した時に sig/ ディレクトリができていてrbsのスケルトンが生成されてるので真面目に書いてみました。

https://github.com/sue445/datadog_thread_tracer/tree/main/sig