ISUCON合わせで作ったやつ第n弾
モチベーション
ISUCONの素振りでパフォーマンスチューニングのために重い処理を
threads = [] threads << Thread.start do # 並列で実行したい処理1 end threads << Thread.start do # 並列で実行したい処理2 end threads.each(&:join)
みたいにスレッドで並列処理すると、
のようにスレッド内で実行した処理がddtraceでトレースできなくて困ったのでなんとかしたかったのが一番の理由です
実装までの経緯
公式ドキュメントを探してもどうやればスレッド内の呼び出しをトレースできるか見つからなかったのですが、 下記Issueをヒントにして実装しました。
この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