ウェブサイト検索

Ubuntu 14.04でGraphiteのためにStatsDを構成して任意の統計を収集する方法


紹介

Graphiteは、さまざまな種類のデータを柔軟かつ強力な方法で視覚化することを可能にするグラフ作成ライブラリです。他の統計収集アプリケーションから送信されたデータをグラフ化します。

前のガイドでは、Graphite自体のインストールと設定方法、さらにシステムやサービスの統計を収集するためのcollectdのインストールと設定方法について説明しました。

このガイドでは、StatsDのインストールと設定方法について説明します。StatsDは、任意の統計を収集するために使用できる軽量の統計収集デーモンです。

StatsD は、Graphite の設定された書き込み間隔と同期して Stats をフラッシュします。これを行うために、フラッシュ間隔の間のすべてのデータを集約し、Graphite に送信するための各統計の単一ポイントを作成します。

このように、StatsDはアプリケーションがGraphiteの統計を送信するための実質的なレート制限を回避できるようにします。さまざまなプログラミング言語で書かれた多くのライブラリがあり、アプリケーションに統計トラッキングを組み込むのが簡単です。

このガイドでは、StatsDをインストールして構成します。前のガイドのインストール手順に従っていること、そしてUbuntu 14.04サーバーでGraphiteとcollectdの両方が構成済みであると仮定します。

StatsDをインストールする

StatsDプログラムはUbuntuのデフォルトリポジトリにはありません。ただし、GitHubで入手可能で、Ubuntuパッケージにコンパイルするために必要な設定ファイルが含まれています。

部品を取得する

実際のプログラムをインストールする前に、リポジトリからいくつかのパッケージを取得する必要があります。リポジトリをクローンするためにgitが必要です。また、StatsDはノードアプリケーションなのでnode.jsも必要です。

私たちは、Ubuntuパッケージを作成するために必要なパッケージもいくつか必要です。それらを今すぐ取得しましょう:

sudo apt-get install git nodejs devscripts debhelper

私たちはホームディレクトリにパッケージを作成します。より具体的には、このプロセスを完了するために、ホームディレクトリに「build」と呼ばれるディレクトリを作成します。

今すぐディレクトリを作成してください:

mkdir ~/build

では、StatsDプロジェクトをそのディレクトリにクローンします。ディレクトリに移動してから、クローンコマンドを発行してください。

cd ~/build
git clone https://github.com/etsy/statsd.git

パッケージをビルドしてインストールする

StatsDファイルが含まれている新しいディレクトリに移動します:

cd statsd

今、次のコマンドを発行することでStatsDパッケージを作成できます。

dpkg-buildpackage

~/build ディレクトリに .deb ファイルが作成されます。それでは、そのディレクトリに戻りましょう。

cd .. 

パッケージをインストールする前に、私たちはCarbonサービスを停止したいと考えています。その理由は、StatsDサービスがインストールされるとすぐに情報を送信し始めるためで、まだ適切に設定されていないからです。

このコマンドを実行して一時的にカーボンサービスを停止してください:

sudo service carbon-cache stop

次に、パッケージをシステムにインストールできます:

sudo dpkg -i statsd*.deb

以前に言ったように、Statsdプロセスは自動的に開始されます。しばらくの間それを停止し、Carbonサービスを再起動しましょう。これにより、他のサービスのためにCarbonをアクティブなままにしながら、StatsDを構成することができます:

sudo service statsd stop
sudo service carbon-cache start

StatsDサービスは現在私たちのサーバーにインストールされました! しかし、すべてのコンポーネントが正しく連携するように設定する必要があります。

StatsDを設定する

最初に私たちがすべきことは、StatsDの設定ファイルを修正することです。

テキストエディターでファイルを開いてください:

sudo nano /etc/statsd/localConfig.js

このように見えるべきです:

 { グラファイトポート: 2003 , グラファイトホスト: “localhost” , ポート: 8125 } 

この構成では、1つの設定だけを調整したいです。レガシー名前空間と呼ばれるものをオフにしたいと考えています。

StatsDはこれを使用してデータを異なる方法で整理します。しかし、最近のバージョンでは、より直感的な構造に標準化されています。私たちは新しいフォーマットを使用したいです。

これを行うには、以下の行を追加する必要があります:

 { graphitePort: 2003 , graphiteHost: “localhost” , port: 8125 , graphite: { legacyNamespace: false } }  

これにより、より合理的な命名規則を使用できるようになります。作業が終わったら、ファイルを保存して閉じてください。

StatsDのストレージスキーマを作成する

次に、いくつかのストレージスキーマをさらに定義する必要があります。

ストレージスキーマファイルを開いてください:

sudo nano /etc/carbon/storage-schemas.conf

私たちはcollectdのために定義したのと全く同じ保持ポリシーを使用します。唯一の違いは名前と一致パターンです。

StatsDは、すべてのデータをstatsプレフィックス付きでGraphiteに送信するので、そのパターンに一致させることができます。このデフォルトのストレージ仕様の上に置くことを忘れないでください:

[statsd]
pattern = ^stats.*
retentions = 10s:1d,1m:7d,10m:1y

作業が完了したら、ファイルを保存して閉じてください。

データ集約設定を作成する

いくつかの集約仕様を設定しましょう。StatsDは非常に特定の方法でデータを送信するため、正しいパターンに一致させることでデータを正しく集約していることを簡単に確認できます。

エディターでファイルを開いてください:

sudo nano /etc/carbon/storage-aggregation.conf

私たちは値を正確に変換するために、柔軟な方法で集約を設定する必要があります。データを最適に集約する方法について、StatsDプロジェクトからいくつかの手がかりを得るつもりです。

今、集計はこのように見えます:

 [最小] パターン=.min$ xFilesFactor=0.1 集約方法=最小

[最大] パターン=.max$ xFilesFactor=0.1 集約方法=最大

[合計] パターン=.count$ xFilesFactor=0 集約方法=合計

[default_average] パターン=.* xFilesFactor=0.5 集約方法=平均 </pre>

私たちは、.sumまたは.countで終わるメトリックを一致させ、その値を追加して集計したいと考えています。すでにそのうちの1つは(sumセクションで)定義されていますが、少しラベルが間違っているので、その部分を調整します。

私たちはまた、.lowerおよび.upperで終わるメトリックの最小値と最大値を取得したいと考えています。これらのメトリック名の後には数字があるかもしれません。これは、特定のパーセンテージの上限値を示すために使用される可能性があるからです(例えば、upper_90)。

最後に、私たちはゲージを設定したいと思います。ゲージは基本的に何かの現在値(スピードメーターのような)を測定しています。私たちはこれを、常に最後に与えた値を送信するように設定したいと考えています。この場合、平均値やその他の計算された値を使用することは望んでいません。

結局、そのファイルはこのような感じになるべきです:

 [最小] パターン=.min$ xFilesFactor=0.1 集約方法=最小

[max] パターン=.max$ xFilesFactor=0.1 集約方法=max

[カウント] パターン=.count$xFilesFactor=0 集計方法=合計

[小文字] pattern=.lower(_\d+)?$ xFilesFactor=0.1 aggregationMethod=min

[大文字] パターン=.upper(_\d+)?$ xFilesFactor=0.1 集約方法=最大

[合計] パターン=.sum$ xFilesFactor=0 集計方法=合計

[ゲージ] パターン=^..ゲージ.. xFilesFactor=0 集約方法=最後

[default_average] パターン=.* xFilesFactor=0.5 集約方法=平均 </pre>

終了したら保存して閉じてください。

サービスを開始する

設定がすべて完了したので、サービス管理を行うことができます。

最初に、設定した新しい設定を反映させるためにCarbonを再起動する必要があります。「再起動」コマンドを使用するよりも、サービスを完全に停止し、数秒待ってから再起動する方が良いです。

sudo service carbon-cache stop      ## wait a few seconds here
sudo service carbon-cache start

さて、Carbonに接続するStatsDサービスを起動することもできます:

sudo service statsd start

カーボン自体と同様に、StatsDも自分自身の統計を報告します。つまり、ブラウザでグラファイトページを再度訪れると、すぐに新しい情報を見ることができます。すでにページを開いている場合は、ページを更新してください:

 http://ドメイン名またはIP 

ご覧のとおり、私たちはStatsD自体に関連するさまざまな情報をかなり多く持っています:

StatsDデータをどのように送信するか、そしてそれとどのようにやり取りできるかについて少し学びましょう。

StatsDデータメトリクスの概念

StatsDサービスはTCP接続を使用してGraphiteサービスに接続します。これにより、情報の信頼性のある転送が可能になります。

しかし、StatsD自体はUDPパケットをリッスンします。デフォルトでは10秒の間に送信されたすべてのパケットを収集します。その後、受信したパケットを集約し、各メトリックの単一の値をCarbonにフラッシュします。

10秒のフラッシュ間隔は、私たちのストレージスキーマにおいて、ストレージの最短間隔として設定したものであることを理解することが重要です。これら二つの設定値が一致することが不可欠です。なぜなら、それがStatsDがCarbonの制限、すなわち各間隔に対して一つの値しか受け付けないという制限を回避することを可能にするからです。

これらのプログラムの違いのため、データをGraphiteに直接送信するのとは少し異なる方法でStatsDにデータを送信します。思い出していただければ、メトリック名、値、およびタイムスタンプを指定してGraphiteにデータを送信します。

 echo "metric_name metric_value date +%s | nc -q0 127.0.0.1 2003 

これにはいくつかの利点があります。例えば、受信しているデータのタイムスタンプを設定できるため、遡ってデータを追加することができます。StatsDに送信されるデータについては、タイムスタンプの使用を省き、その代わりにデータのタイプで置き換えます。

構文はこのようになります:

 echo "メトリック名:メトリック値|タイプ仕様 " | nc -u -w0 127.0.0.1 8125 

これにより、StatsD がリッスンしているポートに UDP パケットが送信されます。

グラファイトに直接統計を送信する場合と同様に、これは統計が通常送信される方法ではないことを覚えておいてください。ncメソッドはデモンストレーションの目的のためのものです。

素晴らしいStatsDクライアントライブラリがたくさんあり、作成しているアプリから意味のあるプログラミングロジックを使って統計を簡単に送信できます。すぐにこれを示します。

メトリック名と値は非常にわかりやすいです。では、可能なメトリックタイプとそれがStatsDにとって何を意味するのかを見ていきましょう:

  • c: これは「カウント」を示します。基本的には、フラッシュインターバル内でStatsDが受け取るメトリックのすべての値を合計し、その合計値を送信します。これは、Carbonが使用する「合計」集約方法に似ているため、この種のメトリックの長いインターバルを保存する際にCarbonにその集約方法を使用するよう指示しました。
  • g: これはゲージを示します。ゲージは、スピードメーターや燃料ゲージのように、何かの現在の値を示します。これらの状況では、最も最近の値だけが重要です。StatsD は異なる値を受け取るまで、同じ値を Carbon に送信し続けます。Carbon は、「last」メソッドを使用してこのデータを集約し、情報の意味を維持します。
  • s: このマークは、渡された値が数学的な集合であることを意味します。数学の集合にはユニークな値が含まれています。したがって、このタイプの値をStatsDに送り込むと、それが受け取ったユニークな値の回数をカウントします。これは、ユニークなID属性があると仮定して、ユニークユーザーの数を計算するようなタスクに役立つかもしれません。
  • ms: これは、値が時間のスパンであることを示します。StatsDはタイミング値を取得し、実際にデータに基づいてかなり多くの異なる情報を生成します。平均、パーセンタイル、標準偏差、合計などの情報をCarbonに渡します。これらの各情報は、Carbonによって適切に集約される必要があるため、いくつかの集約メソッドを追加しました。

ご覧のように、StatsDは私たちのメトリクスを理解しやすくするために多くのことを行います。これは、ほとんどのアプリケーションにとって意味のある形で統計について話し、データが何を表しているかを伝えれば、データを正しい形式に変換するための多くの重い作業を行います。

異なるデータタイプの探求

ゲージ

試しにStatsDにデータを送ってみましょう。一番簡単なのはゲージです。これにより、メトリックの現在の状態が設定されるため、受信した最後の値のみが渡されます:

echo "sample.gauge:14|g" | nc -u -w0 127.0.0.1 8125

さて、10秒後(StatsDのフラッシュレート)にGraphiteインターフェースを更新すると、新しい統計が表示されるはずです(それはstats > gauges > sample階層の下にあります)。

今回は、ラインが途切れていないことに注目してください。グラフを更新すれば、すべての間隔に値が表示されます。以前は、Graphiteは特定のメトリクスの値を一定の期間受け取らないため、データにギャップがありました。ゲージを使用すると、StatsDはフラッシュするたびに最後に利用可能な値を送信します。それは、その値がいつ変わるべきかをあなたが知らせると仮定しています。

変化を見るために、ゲージにもういくつかの値を送ってみましょう:

echo "sample.gauge:10|g" | nc -u -w0 127.0.0.1 8125

今、StatsD がその値を送信するまで少なくとも 10 秒待ってから、次を送信してください:

echo "sample.gauge:18|g" | nc -u -w0 127.0.0.1 8125

これに似たグラフが見えるでしょう(8分間のタイムフレームを見ています):

ご覧の通り、これはGraphiteがすでに機能している方法と非常に似ています。つまり、10秒ごとの間隔で1つの値だけを記録します。違いは、StatsDが各間隔の最後に知られている値を使用することです。

カウント

カウントメトリックを設定することで、これを少し対比させましょう。

StatsDは、10秒のフラッシュインターバル中に受信したすべてのデータを収集し、それらを合計してその時間枠の単一の値を送信します。これにより、ほとんどのメトリクスのために記録したいデータにより近いものが再現されます。

例えば、私たちはカウントメトリックをStatsDに何度も連続して送信することができます:

echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125
echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125
echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125
echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125
echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125

さて、これらがすべて同じインターバルで送信されたと仮定すると(いくつかの値はインターバルの境界のいずれか側に落ちている可能性があります)、インターフェースを更新するときにカウントの値が1つ表示されるはずです。 インターフェースを調整して、過去5分から15分のみを表示するようにしてください。

実際には、2つのメトリックが作成されています。countメトリックは、フラッシュインターバル内の発生回数を示し、rateメトリックはその数を10で割って、1秒あたりの発生回数を算出します。この2つは次のようになります:

ご覧のように、ゲージメトリクスとは異なり、カウントメトリクスはフラッシュの間に値を保持しません。これがメトリクスの意味です。ユーザーがボタンを押す回数をカウントしている場合、たとえ彼が10秒間に2回押したからといって、次の10秒間もその数が2であるとは限りません。

セット

今、セットを試してみましょう。

セットはメトリックに渡されたユニークな値の数を記録することを覚えておいてください。つまり、5つのレコードを送信することができますが、そのうちの4つが同じ値を持っている場合、記録される数は2になります。なぜなら、それがユニークな値の数だからです。

echo "sample.set:50|s" | nc -u -w0 127.0.0.1 8125
echo "sample.set:50|s" | nc -u -w0 127.0.0.1 8125
echo "sample.set:50|s" | nc -u -w0 127.0.0.1 8125
echo "sample.set:50|s" | nc -u -w0 127.0.0.1 8125
echo "sample.set:11|s" | nc -u -w0 127.0.0.1 8125

次の写真でわかるように、私の値は元々フラッシュ間隔をまたいでいたため、1つの数値しか記録されませんでした。もう一度シーケンスを取得するために再試行する必要がありました:

ご覧のように、実際に渡される値は集合において無意味です。私たちが気にするのは、渡されたユニークな値の数だけです。

タイマー

タイマーは、おそらく最も興味深い指標です。

StatsDはタイマーのデータを計算するために最も多くの作業を行います。様々なメトリクスをCarbonに送信します。

echo "sample.timer:512|ms" | nc -u -w0 127.0.0.1 8125

数分の間に複数の値を送信すれば、平均実行時間、カウントメトリック、上限値と下限値など、多くの異なる情報を見ることができます。

これはこのように見えるかもしれません:

これは、作成しているプログラムがどのように実行されているかに関する情報を提供するための優れた指標です。あなたが行っている変更がアプリケーションを遅くしているかどうかを知らせることができます。

StatsDメトリクスのフィード

パケットの構造が理解できたので、プログラム内でデータを送信するために使用できるStatsDライブラリの1つを簡単に見てみましょう。UDPパケットを送信できる言語であれば、StatsDメトリックを作成できますが、ライブラリを使用すると特に簡単になります。

GraphiteはDjangoを使用しているので、その環境に留まり、Pythonライブラリをチェックしてみましょう。

最初に、Pythonパッケージマネージャーであるpipをインストールします:

sudo apt-get install python-pip

では、最新バージョンの python-statsd パッケージをインストールするように指示するために、次のように入力できます:

sudo pip install python-statsd

これは非常にシンプルなStatsDクライアントです。

ライブラリを読み込むためにPythonインタラクティブセッションを開始します:

python

さて、ライブラリをインポートするには、次のように入力します:

import statsd

ここから、使い方は非常に簡単です。私たちはさまざまなメトリックを表すオブジェクトを作成し、それを自由に調整することができます。

例えば、ゲージオブジェクトを作成し、次のように入力して15に設定することができます:

gauge = statsd.Gauge('Python_metric')
gauge.send('some_value', 15)

その後、gauge.sendを使用して、StatsDに送信したい値を任意に送ることができます。このライブラリは他のメトリックタイプでも同様の機能を持っています。それらについてはプロジェクトのページを見て学ぶことができます。

あなたはアプリケーションにトラッキングを組み込む方法についてかなり良いアイデアを持っているはずです。任意のメトリクスをStatsDに送信してトラッキングと分析を行う能力は、トラッキング統計を非常に簡単にするため、データを収集しない理由はほとんどありません。

結論

この時点で、グラファイトがインストールされ、設定されているはずです。このチュートリアルと前のチュートリアルを通じて、システムパフォーマンスのメトリクスを収集するためにcollectdを設定し、独自の開発プロジェクトに関する任意のデータを収集するためにStatsDを設定しました。

これらのツールを活用する方法を学ぶことで、環境のすべての部分に関して情報に基づいた意思決定を行うのに役立つ複雑で信頼性の高い統計追跡を作成し始めることができます。データに基づいた意思決定を行う利点は非常に大きいので、早めにメトリック収集をインフラに統合することを始めましょう。

ジャスティン・エリングウッドによる

関連記事: