Skip to main content

2 posts tagged with "datadog"

View All Tags

· 2 min read
Shunsuke Suzuki

小ネタです。

dd-time を使って CircleCI の run を使ったコマンドの実行時間をどう計測したらいいのかちょっと考えました。

以前、コマンドの実行時間を DataDog に送るツール dd-time を作りました。

これは基本的に以下のように引数として -- 以降に実行するコマンドを指定します。

$ dd-time -m dd_time.execution_time -t command:docker-build -- docker build .

実行するスクリプトを標準入力で渡したい場合はこうします。

$ curl https://example.com/install.sh | dd-time -m dd_time.execution_time -- sh

もちろんシェルスクリプトである必要はなくて例えば Python だったらこうなります。

$ curl https://example.com/setup.py | dd-time -m dd_time.execution_time -- python

CircleCI の run では shell オプションで shell を指定できます。

https://circleci.com/docs/2.0/configuration-reference/#run

なので command 全体の時間を計測したい場合は、 shell を次のようにします。

- run:
name: test dd-time
shell: /usr/local/bin/dd-time -m dd_time.test -- sh -eo pipefail
command: |
echo start
sleep 5
echo end

こうすると shell 以外を弄ることなく実行時間を計測して DataDog に送ることが出来ます。

この shell のカスタマイズは dd-time に限らず使えるかも知れないですね。

  • ログをどっかに送ったりとか
  • コマンドが失敗したらエラーを握りつぶしつつどっかに通知したりとか
  • etc

以上、小ネタでした。

· 4 min read
Shunsuke Suzuki

コマンドの実行時間を Datadog に送る dd-time というツールを作りました。

このツールは circle-dd-bench にインスパイアされていますが、 CircleCI 以外でも需要あると思ったり、他にも幾つか改善したい部分があったので自作することにしました。

circle-dd-bench については circle-dd-bench の作者が書いたブログ https://blog.yuyat.jp/post/circle-dd-bench/ も参考にしてください。

dd-time は Go 製なので GitHub Releases からバイナリをダウンロードしてインストールすれば使えます。

使い方はシンプルで実行時間を計測したいコマンドの前に dd-time -- をつけるだけです。 例えば Docker image のビルドの時間を計測したい場合次のような感じになります。

$ dd-time -t command:docker-build -- docker build .

Datadog の API key を環境変数 DATADOG_API_KEY として設定する必要があります。 こうすると Datadog の Post timeseries points API を使い、command_execution_time というメトリックス名(変更可能)でコマンドの実行時間が送られます。

メトリックスの名前や host, tags はそれぞれ --metric-name (-m), --host, --tag (-t) で指定できます。 --tag は複数回指定可能で、 key:value というフォーマットで指定します。

CircleCI で実行した場合、 CircleCI のビルドイン環境変数が tag として勝手に設定されますが、 CircleCI 以外でも使えます。

dd-time を作る上で意識したことは、透過的にする(元のコードにほとんど影響を与えずに使えるようにする)ということです。 具体的には以下のような点です。

  • 標準入力をそのままコマンドに渡す
  • コマンドの標準出力・標準エラー出力をそのまま出力する
  • コマンドの exit code をそのまま dd-time の exit code とする
  • Datadog への送信に失敗しても dd-time の exit code は 0 とする (option で non zero にもできるようにするのもありだが、現状はそうしてない)
  • Datadog への送信に失敗した場合のエラーメッセージをファイルに吐き出せる(コマンドの出力と混ざらないようにできる)
    • デフォルトは標準エラー出力だが、 --output (-o)--apend (-a) オプションで変更できる
    • --append を指定すると追記モードで出力できる
  • 適切にシグナルハンドリングする(本当に適切と言えるかは分かりませんが)

以上、簡単ですが dd-time の紹介でした。