CollectD vs StatsD

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/28f77b58-0b93-6b13-0740-db7968edbe00.png)

#はじめに
DBMS、仮想マシン、サービス、クラウドなど、さまざまなソフトウェアやシステムがメトリックとログを生成します。そのメトリックの例としては、CPU、スワップ、ネットワーク使用量などがあると思います。時系列データを監視する最良の方法の1つは、オープンソースアプリのGraphiteを使用することです。Graphiteは、リアルタイムでメトリックを分析、視覚化、保存できる包括的なツールです。

Graphiteの試用に興味がある場合は、[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=CollectD%20vs%20StatsD)の[14日間の無料トライアル](https://www.hostedgraphite.com/accounts/signup-metricfire/?signup=japan&utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=CollectD%20vs%20StatsD)に行くことでHosted Graphiteサービスを無料で使用できます。Graphteを自分で設定する手間が省けるので、こちらで確認することをお勧めします。

Hosted Graphiteにデータをパイプするために、データを収集するデーモンが必要です。そのデーモンは通常、[collectD](https://collectd.org/)または[StatsD](https://github.com/statsd/statsd)です。各デーモンには、わずかに異なる機能と使用例がありますので、この記事では、各デーモンが適用される状況について説明します。

まず、collectdとStatsDがGraphiteとどのように相互作用するかを見てみましょう。Graphiteは、時系列を保存し、Webアプリで視覚化する複雑な製品です。以下のGraphiteのアーキテクチャをご覧ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/c2764b75-7171-7068-404d-912c75c9db91.png)

アプリ（サービス、デーモンなど）はいくつかのメトリックを生成し、それらをコレクターに送信します。コレクターの役割は、collectdまたはStatsDによって実行されます。 Graphiteの一般的な動作の詳細については、Graphiteのアーキテクチャとコンセプト、およびGraphiteのインストールとセットアップに関する記事をご覧ください。この記事では、主にコレクターに焦点を当てます。

コレクターはこれらのメトリックを集約し、指定された期間に追加のメタをCarbonに送信します。 Carbonは3つのデーモンにすぎず、最も単純な構成では、データを保存するためにCarbon-Cacheだけを使用できます。他の2つは、カーボンリレー（シャーディングに使用できます）とカーボンアグリゲーター（一部のデータを集約できます）です。 CollectorをスキップしてCarbonに直接データを送信することもできますが、同じ名前とタイムスタンプを持つ2つのメトリックを取得した場合、Graphiteは最後のメトリックのみを保存してしまいます。アプリ（またはサービス）の新しいインスタンスを作成することは、スケーリングの非常に一般的な方法であるため、これは大きな問題です。

したがって、データがCarbonに到達する前にデータを集約して、この重複するタイムスタンプの問題が発生しないようにするコレクターが必要です。 そのコレクターにはStatsDとcollectdの2つのオプションがあります。以下のそれぞれを見てみましょう。

#StatsDとは何か？
StatsDは、コレクターの1つで、正確なデータ集約を取得するために使用されます。 Node.jsに書かれています。あなたがする必要があるのは：

- すべてのdebパッケージをダウンロード
- 構成デーモン（/etc/statsd/localConfig.js）
- 集約構成を記述します（/etc/carbon/storage-aggregation.conf）
- ストレージ構成（/etc/carbon/storage-schemas.conf）を記述します。

その後、StatsDは10秒ごと（デフォルト）にデータをGraphiteに送信します。これを実行するために、デーモンは、一定期間に収集したすべてのデータを組み合わせ、各メトリックに対して個別のポイントを作成し、それをGraphiteに渡します。値がデフォルトの10秒以外の間隔で書き込まれるようにGraphiteとStatsDを構成する場合は、GraphiteとStatsDが同期していることを確認してください。つまり、StatsDは、Graphiteがメトリックを保存するのと同じ頻度でメトリックを書き込むように構成する必要があります。

StatsDは、さまざまなプログラミング言語で記述された多くのライブラリを提供します。これにより、あらゆるアプリケーションのデータ追跡を非常に簡単に設定できます。たとえば、「pip」からの「python-statsd」は、StatsDコレクターにデータを送信するクライアントを作成するのに役立ちます。 UDPまたはTCP要求を送信できる任意の言語で独自のクライアントを作成することもできます。 StatsDは、単一のインスタンスを持つマスターマシンで設定できます。

簡単に見えませんか？ [Hosted StatsD](https://www.hostedgraphite.com/docs/integrationguide/ig_hosted_statsd.html?_gl=1*sgyjhl*_gcl_aw*R0NMLjE1ODk4OTA3NTMuRUFJYUlRb2JDaE1JNDh1c3lQU182UUlWUWxSZ0NoMGRPd0lZRUFBWUFTQUFFZ0wzSFBEX0J3RQ..&_ga=2.77531413.1442907523.1595812598-2038175526.1567400116)をお試しください。非常に簡単にStatsDの使用を開始できます。

#いつcollectdを使用するのか？
StatsDは、自分でアプリを開発している場合、またはアプリケーションがすでにStatsDをサポートしている場合に適しています。 しかし、CPU、ネットワーク、またはメモリの使用状況に関するメトリックを送信する場合はどうでしょうか。 また、PostgreSQLまたはNGinxのメトリックをどのように追跡しますか？

これらの場合にcollectdが必要です。 さまざまなプラグインからすぐに使用できるメトリックを実装します。 必要なプラグイン（CPU、ロード、プロセス、df、ディスク、ネットワーク、メモリ、rrdtool、apache、Nginx、MySQL、PostgreSQL、bind、java、Memcachedなど）を定義して、それらを構成するだけです（/ etc / collectd / collectd）。 .conf）。

次に、このすべての情報を直接Graphiteに送信する最後のプラグインを構成します。 Collectdは、監視されている、または監視されているアプリケーションを含むすべてのマシンにインストールする必要があります。

#適切なソリューションを選択する方法
Collectdは、プラグインアーキテクチャを備えたデータ収集ソフトウェアです。一般的なプラグインには、CPU、メモリ、ディスク使用量、プロセス、ネットワークトラフィック、Apacheメトリックなどがあります。現時点で、StatsDからメトリックを収集するCollectDのプラグインStatsDがあります。 CollectDは、Aggregationプラグインでも簡単な集計を行うことができますがメトリックを収集する必要がある各マシンにインストールする必要があります。次に、データを別のプラグインでGraphiteに送信できます。 Collectdは、メトリックを収集するための特別なロジックを実装する必要がないインフラストラクチャおよびアプリケーションの監視に使用できます。

StatsDは、アプリケーションの監視により多く使用されます。設定された間隔に基づいてカスタムメトリックを送信できます。一般的なメトリックには、ゲージ、カウント、セット、および間隔が含まれます。ゲージはこれらの最後の測定値を間隔内に取得して報告し、10秒間の集計データをカウントします（構成可能）。セットは、遭遇した値の一意の数を返します。間隔は時間ベースの計算です（レートと同様）。ここでは、中央に配置されたStatsD（異なるソースからの入力を受け入れる）と、中央のStatsD Collectorにメトリックを送信する各マシンの複数のクライアントが必要です。

###Hosted Graphiteエージェント

Hosted Graphiteを使用する場合、開発者はアプリのユーザー専用にエージェントを作成し、StatsDとcollectdの両方をバイパスできるようにします。このエージェントは、非常に単純なインストールでメトリックをアプリにプッシュできるようになります。

利点：

- DNSルックアップを実行したり、インターネット経由で接続したりする必要がないため、アプリケーションからのメトリックデータの送信が高速になります。
- エージェントがストアアンドフォワードし、接続できないときにディスク上でバッファリングするため、配信の信頼性が向上します。
- Hosted Graphite UIはエージェントが応答を停止したことを通知できるため、「メトリックが欠落している」問題のデバッグが容易になります。
- より安全：エージェントはHTTPSを使用し、Hosted GraphiteはTLSでラップされたカーボンプロトコルを提供しますが、プレーンテキストのプロトコルよりも使用するのに労力がかかります。エージェントに直接送信すると、これを迂回して私たちが処理します。
- HGの認証用のAPIキーを指標の前に付ける必要はありません。エージェント構成のAPIキーを使用して処理されます。
- カーボンプロトコル用の新しいファイアウォールルールを指定し、ルールを最新の状態に保つ必要はありません。プロキシ経由でも、ネットワークからHTTPSを取得できる場合は、それが機能します。

デフォルトでは、CPU使用率、負荷平均、プロセス、メモリ、ディスク、ネットワークの使用状況をエクスポートします。独自のメトリックを簡単に設定できます。

#Prometheusについて
Prometheusは、オープンソースのシステム監視および警告ツールキットです。 時系列データベース、データエクスポーター、Pushgateway、Alertmanager、API、およびWeb UIで構成されています。 [MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=CollectD%20vs%20StatsD)には、14日間の無料トライアル付きのHosted Prometheusサービスもあります。

Prometheusの主な機能は次のとおりです。

- メトリック名とキー/値のペアで識別される時系列データを含む多次元データモデル
- この次元を活用するための柔軟なクエリ言語であるPromQL
- HTTP上のプルモデルによる時系列コレクション
- 中間ゲートウェイ経由でサポートされるプッシュ時系列
- サービス検出または静的構成によって検出されたターゲット
- グラフ化とダッシュボードのサポートの複数のモード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/27685f73-d2be-b693-5874-4ed45e003c5d.png)

Prometheusを使用する場合、StatsDとcollectdの使用方法は異なります。 PrometheusはStatsDや単一プロセスアプリケーションのcollectdのようなコレクターを必要としませんが、必要に応じてデータをStatsD / collectdからエクスポートしてPrometheusに送信できます。マルチプロセスアプリケーションは別の話です。

Flaskアプリをモニタリングするために、パイプラインでGraphiteの代わりにPrometheusを使用するとします。マルチプロセスアプリケーションは異なります。つまり、Prometheusの基本構成ではアプリを効果的に監視できません。重要なマルチプロセスアプリケーションからメトリックをフェッチしようとすると、予期しない結果が生じます。Prometheusは、監視しているアプリケーションがメトリックの絶対値に対して全責任を負うことを期待しています。ただし、Flaskアプリはプロセスを多くのインスタンスに分割しており、Flaskアプリ自体はそれらすべてのインスタンスのデータを合計して1つのクリーンなメトリックをPrometheusに送信できません。

これをさらに説明するために、バランスローダーによって管理されているFlaskアプリケーションの3つのインスタンスがある場合、システム全体に送信されたリクエストの数を実際に知ることはできません。したがって、彼らは自分の値をPrometheusに送信できません。 Prometheusは、3つの場所で1つのジョブが発生するのではなく、3つの別々のジョブを表示します。

提案されたソリューションは、データを集約し、絶対値をメトリックストレージに送信するミドルウェアを使用することです。 StatsDはこの仕事に最適です。ただし、[1つだけではありません](https://www.metricfire.com/blog/how-to-monitor-python-applications-with-prometheus)。さまざまなワーカー/インスタンスのデータを一意のラベルで保存し、クエリで集計することもできます。お使いの言語のPrometheusクライアントでマルチプロセスモードを使用できます。また、Pythonを使用している場合は、Prometheus Djangoクライアントを使用できます。

興味深いことに、MetricFireでは、Prometheusを使用して独自のWebアプリを監視しています。私たちはこれを私たちの経験に基づいてどのように行うことができるかについての[興味深いチュートリアル](https://qiita.com/MetricFire/items/57b95f6de1f608ef7c44)を公開しました。

StatsDを使用してデータをFlaskアプリからPrometheusにパイプする場合、朗報はStatsDのエクスポーターが既にあるため、最小限の労力で簡単にメトリックをプルできることです。

StatsDプラグインでPrometheusを試すには、[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=CollectD%20vs%20StatsD)の[無料トライアル](https://www.hostedgraphite.com/accounts/signup-metricfire/?signup=japan&utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=CollectD%20vs%20StatsD)にアクセスして、Prometheusの使用を今すぐ開始してください。アプリで直接試して、インストールとセットアップをスキップしながら、Flaskアプリインスタンスをすべて1つのメトリックに集約し、Prometheusでそれを監視できるかどうかを確認できます。

#メトリックサービスを使用する準備ができました
GraphiteとStatsDは大量のデータを生成する可能性があり、保存が困難になります。 これを処理するには、インストール中に多くのパッケージが必要になる場合があります。 リソース管理を処理するために、別のサーバーに展開することを余儀なくされる場合もあります。 また、構成が無効な場合、メモリの使用が壊滅的に非効率になる可能性があります（StatsDの無効なプロトコルなど）。 そのため、StatsDとGraphite as a Serviceが適切な決定になる可能性があります。 Hosted GraphiteとHosted StatsDを提供しているので、時間とエネルギーを節約できます。 また、目標を達成するのに役立つ[ドキュメント](https://www.hostedgraphite.com/docs/agent/index.html?_gl=1*1nlnafm*_gcl_aw*R0NMLjE1ODk4OTA3NTMuRUFJYUlRb2JDaE1JNDh1c3lQU182UUlWUWxSZ0NoMGRPd0lZRUFBWUFTQUFFZ0wzSFBEX0J3RQ..&_ga=2.155676603.1442907523.1595812598-2038175526.1567400116)をこちらよりご参考ください。

#まとめ
Collectdは統計収集デーモンです。定期的にさまざまなソースをメトリックスについてポーリングし、メトリックスを受信することもできます。プラグインコレクションは非常に網羅的です。 Collectdは、システム、一般的なさまざまなサービス（Webサーバー、データベースサーバーなど）、およびカスタムアプリケーションからメトリックを収集することに長けています。カスタムアプリケーションの場合、アプリケーションはこれらのメトリックを生成する必要があります。

StatsDは、イベントカウンター/集計サービスです。イベントごとのタイミングを受け取り、集計値を計算して生成します。これは、カスタムアプリケーションメトリックをカウントおよび集計するために構築されています。アプリケーションは、集約を必要とせずに、イベントを送信することのみを必要とします。

これらのコレクターを同時に使用できます。両方のコレクターを同時に使用することは、コミュニティーの間で一貫して見られます。

判断に役立つように、Hosted GraphiteやHosted StatsDなどのホストされたサービスをご覧ください。 collectdおよびStatsDプラグインをプラットフォームで直接試すことができ、メトリックをすぐにデプロイできます。 [MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=CollectD%20vs%20StatsD)には14日間の[無料トライアル](https://www.hostedgraphite.com/accounts/signup-metricfire/?signup=japan&utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=CollectD%20vs%20StatsD)があるので、実際に試してみてください。また、ご不明な点がございましたら、いつでもご連絡ください。