この記事は「OpenTelemetry Advent Calendar 2023」の11日目の記事です!空いていた&ネタがあったので入れてみました!
本文
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とかは対応してないっぽいです。
spanへのattributesも以下のように設定できます。
$ otel-cli span --attrs item1=value1,\"item2=value2,value3\",item3=value4 $ otel-cli span --attrs 'item1=value1,"item2=value2,value3",item3=value4'
何に使えそうか
使用例を見ているとCLIから呼べるのでCI/CDパイプラインに組み込んでその実行時間を見るという使い方をしているブログを見つけました。キャッシュのリストア、ライブラリのインストール、デプロイ時間とかを後から確認できる仕組みは確かに便利そうです。GitHub Actionsはyamlと簡単なスクリプトですがJenkinsでオレオレデプロイスクリプトで処理時間がとんでもないことになっている時にこれを仕込んでおけばどこで時間がかかったかがわかって便利そうだなと思いました。
あとはクライアントライブラリの実装が行われていない言語でもトレースIDさえ分かれば使えるのでそういった用途があるかもしれないなと思いました。opentelemetry-shellを使ったスクリプトを呼び出すことで擬似的にできるかなと思っていたのですがotel-cliを使うことでも実現することはできそうです。(httpが喋れる必要はあるので今時の言語で実装されないってことはまあないと思いますが)
終わりに
トレースを送りたい頑張ってだけの時にCLIでcurlから頑張ってデバッグしてたのですがそれが不要な世界になりそうで便利です。また必要な機能は一通りありそうでデバッグやCI/CDのトレースには投入して使ってみるのはアリだと感じました。