序章

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

以前のガイドでは、Graphite自体のインストールと構成の方法システムとサービスの統計をコンパイルするためのcollectdのインストールと構成の方法について説明しました。

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

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

このように、StatsDを使用すると、アプリケーションはGraphite統計を送信するための有効なレート制限を回避できます。 さまざまなプログラミング言語で記述された多くのライブラリがあり、アプリケーションで統計追跡を組み込むのは簡単です。

このガイドでは、StatsDをインストールして構成します。 前のガイドのインストール手順に従っており、Ubuntu14.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プロジェクトをそのディレクトリに複製します。 ディレクトリに移動してから、cloneコマンドを発行します。

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

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

StatsDファイルを含む新しいディレクトリに移動します。

cd statsd

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

dpkg-buildpackage

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

cd .. 

パッケージをインストールする前に、Carbonサービスを停止したいと思います。 これは、StatsDサービスがインストールされていて、まだ適切に構成されていない場合、すぐに情報の送信を開始するためです。

次のコマンドを発行して、Carbonサービスを一時的に停止します。

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

次のようになります。

 {graphitePort:2003、graphiteHost:“ localhost”、ポート:8125} 

この構成では、1つの設定のみを調整します。 レガシーネームスペースと呼ばれるものをオフにします。

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

これを行うには、次の行を追加する必要があります。

{graphitePort:2003、graphiteHost:“ localhost”、ポート:8125 、graphite:{ legacyNamespace:false } }

これにより、より賢明な命名規則を使用できるようになります。 終了したら、ファイルを保存して閉じます。

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

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

storage-schemaファイルを開きます。

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

collectdに対して定義したものとまったく同じ保持ポリシーを使用します。 唯一の違いは、名前と一致するパターンです。

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

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

終了したら、ファイルを保存して閉じます。

データ集約構成を作成する

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

エディターでファイルを開きます。

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

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

現在、集計は次のようになっています。

[最小]パターン=.min$ xFilesFactor = 0.1aggregationMethod = min

[最大]パターン=.max$ xFilesFactor = 0.1aggregationMethod = max

[合計]パターン=.count$ xFilesFactor =0aggregationMethod=合計

[default_average]パターン=。*xFilesFactor=0.5aggregationMethod=平均

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

また、末尾が .lower.upper それぞれ。 これらのメトリック名は、特定のパーセンテージの上限値を示すために使用できるため、それらの後に数字が付いている場合もあります( upper_90 例えば)。

最後に、ゲージを構成します。これは基本的に、何か(スピードメーターなど)の現在の値を測定するだけです。 常に最後に指定した値を送信するようにこれらを設定します。 この場合、平均値やその他の計算値は使用しません。

最終的に、ファイルは次のようになります。

[最小]パターン=.min$ xFilesFactor = 0.1aggregationMethod = min

[最大]パターン=.max$ xFilesFactor = 0.1aggregationMethod = max

[カウント]パターン=.count$ xFilesFactor = 0 AggregationMethod = sum

[下]パターン=.lower(_ \ d +)?$ xFilesFactor = 0.1aggregationMethod = min

[upper] pattern = .upper(_ \ d +)?$ xFilesFactor = 0.1 AggregationMethod = max

[合計]パターン=.sum$ xFilesFactor = 0aggregationMethod = sum

[ゲージ]パターン=^。 .gauges.。 xFilesFactor = 0 AggregationMethod = last

[default_average]パターン=。*xFilesFactor=0.5aggregationMethod=平均

終了したら、保存して閉じます。

サービスを開始する

すべてが構成されたので、サービス管理を行うことができます。

まず、Carbonを再起動して、設定したばかりの新しい設定を取得します。 「restart」コマンドを使用するよりも、サービスを完全に停止し、数秒待ってから開始することをお勧めします。

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

これで、Carbonに接続するStatsDサービスを開始することもできます。

sudo service statsd start

Carbon自体と同様に、StatsDも独自の統計を報告します。 これは、ブラウザでGraphiteページに再度アクセスすると、すぐに新しい情報を確認できることを意味します。 すでに実行している場合は、ページを更新します。

http:// domain_name_or_ip

ご覧のとおり、利用可能な情報はかなり多く、そのすべてがStatsD自体に関連しています。

StatsDデータをフィードする方法と、それを操作する方法について少し学びましょう。

StatsDデータメトリクスの構造

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

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

10秒のフラッシュ間隔は、ストレージの最短間隔としてストレージスキーマで構成したものとまったく同じであることを理解することが重要です。 これらの2つの構成値が一致することが重要です。これにより、StatsDは、間隔ごとに1つの値のみを受け入れるというCarbonの制限を回避できます。

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

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

これには、受信するデータのタイムスタンプを設定できるなど、いくつかの利点があります。これにより、データをさかのぼって追加できます。 StatsDに送信されるデータについては、タイムスタンプの使用をやめ、代わりにデータtypeに置き換えます。

構文は次のようになります。

エコー「 metric_namemetric_value |  type_specification ” |  nc -u -w0 127.0.0.1 8125

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

統計をGraphiteに直接送信する場合と同様に、これは統計が通常送信される方法ではないことに注意してください。 The nc メソッドは、デモンストレーションのみを目的としています。

プログラミングロジックが理にかなっているものを使用して、作成しているアプリから統計を簡単に送信できる優れたStatsDクライアントライブラリが多数あります。 これについては、すぐに説明します。

メトリックの名前と値はかなり自明です。 可能なメトリックタイプとは何か、およびそれらがStatsDにとって何を意味するかを見てみましょう。

  • c :これは「カウント」を示します。 基本的に、StatsDがフラッシュ間隔内のメトリックに対して受信するすべての値を合計し、合計値を送信します。 これは、Carbonが使用する「合計」集計方法に似ています。そのため、この種のメトリックのより長い間隔を格納する場合は、その集計方法を使用するようにCarbonに指示しました。
  • g :ゲージを示します。 ゲージは、スピードメーターや燃料計と同様に、何かの現在の値を示します。 このような状況では、最新の値のみに関心があります。 StatsDは、別の値を受け取るまで、Carbonに同じ値を送信し続けます。 Carbonは、情報の意味を維持するために「最後の」方法を使用してこのデータを集約します。
  • 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分の時間枠を見ています)。

ご覧のとおり、これは、10秒間隔ごとに1つの値しか記録しないという点で、Graphiteがすでに機能している方法と非常によく似ています。 違いは、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つのメトリックが作成されます。 The 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つの数値のみが記録されたことがわかります。 シーケンスをもう一度取得するために、もう一度試行する必要がありました。

ご覧のとおり、セット内で渡す実際のvalueは重要ではありません。 渡された一意の値の数だけが気になります。

タイマー

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

StatsDは、タイマーのデータを計算する際に最も多くの作業を行います。 これは、Carbonに多くの異なるメトリックを送信します。

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

数分間に複数の値を送信すると、平均実行時間、カウントメトリック、上限値と下限値など、さまざまな情報を確認できます。

次のようになります。

これは、作成しているプログラムがどのように実行されているかに関する情報を提供するための優れたメトリックです。 行っている変更によってアプリケーションの速度が低下しているかどうかがわかります。

フィード統計Dメトリクス

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

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

まず、インストールします pip、Pythonパッケージマネージャー:

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に送信する機能により、統計の追跡が非常に簡単になるため、データを収集しない理由はほとんどありません。

結論

この時点で、Graphiteがインストールおよび構成されているはずです。 このチュートリアルと最後のチュートリアルを実行することで、システムパフォーマンスに関するメトリックを収集するようにcollectdを構成し、独自の開発プロジェクトに関する任意のデータを収集するようにStatsDを構成しました。

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

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