地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【OpenTelemetry】CLIでトレースが送れるotel-cliが便利そうだったので触ってみる

この記事は「OpenTelemetry Advent Calendar 2023」の11日目の記事です!空いていた&ネタがあったので入れてみました!

本文

github.com

OpenTelemetry のコマンドラインツールで、シェルスクリプトから OpenTelemetry トレースを送信することができるツールです。APMツールの実装とかの人向けかなと思ったのですがopentelemetry-collectorの設定の確認や環境構築後にサクッとCLIからトレースを送って疎通や動作確認を行うことができたりと色々と使えそうです。

インストール

GitHubからwgetで入れてみます。他にもgo install、docker、brewにも対応しています。

$ wget https://github.com/equinix-labs/otel-cli/releases/download/v0.4.1/otel-cli_0.4.1_darwin_amd64.tar.gz
$ tar -xvf otel-cli_0.4.1_darwin_amd64.tar.gz
$ ./otel-cli help
A command-line interface for generating OpenTelemetry data on the command line.

Usage:
  otel-cli [command]

Available Commands:
  span        create an OpenTelemetry span and send it
  exec        execute the command provided
  status      send at least one canary and dump status
  server      run an embedded OTLP server
  completion  Generate completion script
  help        Help about any command

Flags:
  -h, --help   help for otel-cli

Use "otel-cli [command] --help" for more information about a command.

実行してみる

OTEL_EXPORTER_OTLP_ENDPOINTを設定した状態でexecを実行してみると指定したサービス名がトレースができていることを確認できます。

# configure otel-cli to talk the the local server spawned above
export OTEL_EXPORTER_OTLP_ENDPOINT=localhost:4317

# run a program inside a span
otel-cli exec --service my-service --name "curl google" curl https://google.com

TRACEPARENTを設定した状態でspanやexecを実行数と一つのトレースとして送るようになっています。スパン(span)や実行(exec)コマンドによって自動的に使用され、トレースの継続性を保持します。ちなみに--tp-ignore-envのオプションでは、この環境変数が存在しても無視し、新しいトレースコンテキストを生成するために使われます。以下は実行のサンプルです。startとendにspanの時間を設定するようにしています。(macだとrfc-3339オプションがなかったのでgnu dateを使ってるのでgdateにしているだけです)

$ export TRACEPARENT=00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01
$ start=$(gdate --rfc-3339=ns); end=$(gdate +%s.%N); ./otel-cli span --name my-script2 --service test1 --start $start --end $end
$ ./otel-cli exec --service test1 --name "curl google" curl https://google.com

実装自体はこの辺でパースしてる処理をW3Cしか見つけられなかったので今のところB3とかは対応してないっぽいです。

github.com

spanへのattributesも以下のように設定できます。

$ otel-cli span --attrs item1=value1,\"item2=value2,value3\",item3=value4
$ otel-cli span --attrs 'item1=value1,"item2=value2,value3",item3=value4'

何に使えそうか

pokgak.xyz

使用例を見ているとCLIから呼べるのでCI/CDパイプラインに組み込んでその実行時間を見るという使い方をしているブログを見つけました。キャッシュのリストア、ライブラリのインストール、デプロイ時間とかを後から確認できる仕組みは確かに便利そうです。GitHub Actionsはyamlと簡単なスクリプトですがJenkinsでオレオレデプロイスクリプトで処理時間がとんでもないことになっている時にこれを仕込んでおけばどこで時間がかかったかがわかって便利そうだなと思いました。

あとはクライアントライブラリの実装が行われていない言語でもトレースIDさえ分かれば使えるのでそういった用途があるかもしれないなと思いました。opentelemetry-shellを使ったスクリプトを呼び出すことで擬似的にできるかなと思っていたのですがotel-cliを使うことでも実現することはできそうです。(httpが喋れる必要はあるので今時の言語で実装されないってことはまあないと思いますが)

終わりに

トレースを送りたい頑張ってだけの時にCLIcurlから頑張ってデバッグしてたのですがそれが不要な世界になりそうで便利です。また必要な機能は一通りありそうでデバッグやCI/CDのトレースには投入して使ってみるのはアリだと感じました。

参考

febc-yamamoto.hatenablog.jp

dev.to