NaCl松江本社の原です。最近はRailsへのOpenTelemetryの導入について調べていました。その過程で、OpenTelemetryの公式Ruby gemに機能を追加してみたのでその紹介をします。
OpenTelemetryは稼働中のアプリケーションのさまざまなデータを計測・収集するための規格です。この分野(オブザーバビリティ)ではNewRelicやDatadogといった商用サービスが有名ですが、それらが1つのサービスで計測から収集・可視化・分析までをサポートするのに対し、OpenTelemetryでは複数のOSSを組み合わせて構築します。OpenTelemetryは転送部分のプロトコルを規定するほか、収集・転送部分についてはオフィシャルのライブラリを提供しています。
Rubyの場合、opentelemetry-から始まる名前のたくさんのgemが公式で提供されています。ソースコードはgithubのopentelemetry-rubyとopentelemetry-ruby-contribというリポジトリでまとめて管理されています。前者は主に基本機能を、後者はさまざまな環境に対応する機能を含んでいます。
opentelemetry-ruby-contribに、opentelemetry-resource-detector-osというgemを追加しました。
これにより、OpenTelemetryでの計装時にアプリが動いているOSの情報を簡単に送信できるようになりました。
configure時にOS.detectを呼び、resourceにセットします。
require 'opentelemetry/sdk'
require 'opentelemetry/resource/detector'
OpenTelemetry::SDK.configure do |c|
c.resource = OpenTelemetry::Resource::Detector::OS.detect
end
例えばLinuxでは
"os.type" => "linux",
"os.name" => "Ubuntu",
"os.version" => "26.04",
"os.description" => "Ubuntu 26.04 LTS",
"os.build_id" => "7.0.0-1008-aws"
Windowsでは
"os.type"=>"windows",
"os.name"=>"Windows",
"os.version"=>"10.0.26200.8037",
"os.description"=>"Microsoft Windows [Version 10.0.26200.8037]",
"os.build_id"=>"26200"
Macでは
"os.type" => "darwin",
"os.name" => "macOS",
"os.version" => "15.7.7",
"os.description" => "macOS 15.7.7 (24G720)"
"os.build_id" => "24G720",
というような値が取れ、計測値と一緒に送られるようになります。
キー名は私が考えたものではなく、OpenTelemetryのSemantic Conventionsに準拠しています。OpenTelemetryではよく使われそうなデータについてはこういうキー名にしようという決まりがあり、プログラミング言語によらず同じ名前でデータを取得できるようになっています。
os.*についてはGo言語などではすでに自動取得が実装されていたのですが、これでRubyでも同じことができるようになりました。
OSSの開発プロセスはプロジェクトによって全然違いますが、基本的には、パッチを作り込むまえに大まかな方向性について確認をとったほうが良いでしょう。作りこんでしまってから「それは要らないよ」とか「もうあるよ」と言われたらもったいないからです(実際今回も、Zero-code instrumentationを実装するプロトタイプを作ってみたところチケットを更新していなかっただけで別のプロジェクトが動いていたというパターンがありました)。
ということで、最初はgemの雛形を作っただけのPull Requestを送り、反応を待ってみました。
するとコミッタの方からコメントをいただけたので、大まかな方向性は合っていることがわかりました。その後はコメントに対応しつつ、少しずつ実装を加えていきました。
もう一つ必要だったのはCLA(Contributor License Agreement)への署名です。大きめのOSSだとたまに必要になるやつですね。OpenTelemetryではEasyCLAというWebベースのシステムを採用していて、ブラウザでボタンを押すだけの簡単な作業でした。ただ、「組織」と「個人」の区別があったり、組織の一員として登録するにはまず組織の登録が必要だったりするので、業務での作業をコミットする場合は会社とよく相談してください。