Diary of a Perpetual Student

Perpetual Student: A person who remains at university far beyond the normal period

OpenTelemetry Metricsを手軽に投稿できるCLIツールotlcのv0.2.0をリリースしました

blog.arthur1.dev

でご紹介した、OpenTelemetry Metricsを手軽に投稿できるCLIツール「otlc」のv0.2.0をリリースしたので再度ご紹介します。

github.com

使い方

インストール

(macOS, Linux)×(x86_64, arm64)向けのバイナリをGitHubのReleaseで配布しています。

Homebrewをお使いの方は以下のコマンド1つでインストールが可能です。

$ brew install Arthur1/tap/otlc
$ otlc --version
otlc is a Command-line Tool to Export Telemetry by OTLP (OpenTelemetry Protocol).
Version:    unknown
Go version: go1.22.4
Arch:       arm64

go install派の方はこちらからどうぞ。こっちならWindowsでも動くかもしれない(未検証)。

go install github.com/Arthur1/otlc/cmd/otlc@latest

メトリックの投稿

まずは環境変数に投稿先の情報を入れます。今回はMackerelのOpenTelemetry対応機能に投稿してみましょう。これらの情報は環境変数を利用しなくても対応するオプションでセット可能です。(詳しくは--helpオプションで確認してください。)

export OTEL_EXPORTER_OTLP_ENDPOINT="otlp.mackerelio.com:4317"
export OTEL_EXPORTER_OTLP_HEADERS="Mackerel-Api-Key=***your_api_key***"

その後、以下のようなコマンドを実行すると、上記で設定した宛先にOTLPでメトリックが投稿されます。

  • メトリック名: awesome.metric
  • メトリック種類: Gauge
  • データポイント属性: hoge="poyo"・fuga="1"
  • データポイント値: 123.45
  • データポイント時刻: 現在
otlc metrics post --name awesome.metric --attrs hoge=poyo,fuga=1 123.45

ちょっとしたメトリックを継続的に投稿する時や検証の際に、SDKを使ったプログラムを書かなくてもコマンドラインでシュッと投稿できて便利です。

どうぞご利用ください。

v0.1.xとの差異

駆け出しなので結構破壊的な変更をしました。今後は仕様を安定させるつもりです。早くv1に上げたいのでフィードバックお待ちしています。

設定ファイルの廃止とOTel Exporterの標準的な環境変数の読み取りに対応

v0.1.xでは投稿先を設定する際にYAMLの設定ファイルを書くのが標準のやり方だったのですが、これを廃止しました。代わりに、同様の情報をコマンドラインオプションで指定できる他、OTLP Exporter onfigurationで定義された名前での環境変数の読み取りに対応しました。

--valueオプションの廃止

メトリックの値を指定する際に--valueオプションを利用していましたが、これをやめて単に引数としました。

--timestampオプションの追加

--timestampオプションでメトリックの時刻をUNIX秒で指定できるようになりました。

otlc metrics post --name awesome.metric --attrs hoge=poyo,fuga=1 --timestamp 1719276600 123.45

過去の時刻で投稿したため、先ほどのグラフが点から線になりました。

投稿時に異常終了するように

メトリックが投稿できない場合、これまではエラー内容がログに出力されるだけでしたが、コマンドとして異常終了するようになりました。

$ otlc metrics post --name awesome.metric --attrs hoge=poyo,fuga=1 123.45
otlc: error: failed to upload metrics: rpc error: code = PermissionDenied desc = authenticate error, please check mackerel-api-key
$ echo $?
1

実装の変化

元々はアプリケーションを計装する際に用いるOpenTelemetry SDK GoのMeterとInstrumentを使って実装していました。Instrumentでメトリックを生成したのちにMeterProviderをすぐにシャットダウンすることで即時に投稿することを期待した、という形です。

https://github.com/Arthur1/otlc/blob/27866d6f826d6aa267f1f0de1687fddfe50b89b9/metrics/post.go#L37-L87

前回のブログで

より低いレイヤーのメソッドを利用して組み立てるとより自由なコマンドラインツールに仕上げられるかもしれません。

と書いた通り、MeterやInstrumentに頼る実装を改め、メトリックデータを直接生成してエクスポートするようにしました。

https://github.com/Arthur1/otlc/blob/94f56eb8612042f799a80664a54110ee6ef5ed5a/internal/metric/generate.go#L23-L76

メトリックの時刻が指定できるようになったり、投稿失敗時に異常終了するようになったりしたのはこの置き換えによるものです。