【Collectdプラグイン】メトリック（時系列データ）を収集する方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/86a97346-638b-ee65-98eb-1744fb0494c1.png)


#はじめに
Collectdは、ローカルで監視されているマシンからメトリックをフェッチし、それらをGraphite、Prometheusなどにプッシュできるデータ収集ソフトウェアです。すべてはプラグインによって行われ、collectdプラグインは、CPU、メモリ、Postgres、JVM、およびその他多くのメトリックに関するメトリックを収集できます。 プラグインを使用して、これらのメトリックをGraphiteにプッシュし、データを集約し、アラートを送信し、通知を電子メールに送信することもできます。

この記事では、Linuxマシンを監視し、これらのメトリックをGraphiteにプッシュするcollectdプラグインを備えたテストシステムを作成します。 最後に、すべてがGrafanaダッシュボードで機能することも確認します。

セットアップ時間を短縮するには、[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Collectd%20Plugins)の[無料トライアル](https://www.hostedgraphite.com/accounts/signup-metricfire/?signup=japan&utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Collectd%20Plugins)を使用して、GraphiteとGrafanaを実行します。 MetricFireはホストされたGraphiteおよびGrafanaサービスであり、メトリックを送信してすぐに視覚化できるはずです。

#CollectDとは？
Collectdは、メトリックを収集するために設計されたソフトウェアです。 また、すべてのペイロードを実行するプラグインをセットアップおよび管理するプラットフォームでもあります。 Collectdは、監視する必要があるアプリケーションをホストする各マシンにインストールする必要があります。

では、プラグインは何ができるのでしょうか？ 最も一般的なプラグインは、CPU、メモリ、ネットワーク、およびスワップの使用状況を監視できます。 Nginx、Apache、JVM、Postgresなど、ソフトウェアを監視するプラグインも多数あります。

しかし、メトリックを集約、アラート、通知、データベースにプッシュできるプラグインもあります。 Collectdは、必要な各プラグインを構成できるため、本当に柔軟です。

実際にどのように機能するか確認してみましょう。

#collectdプラグインをGraphiteとGrafanaに接続する方法
多くのメトリックを収集できることは素晴らしいことですが、適切な視覚化なしにそれらを処理することは難しいです。 そのため、システムにGrafanaをアタッチすることをお勧めします。 Graphiteは独自のWebインターフェイスを提供するので場合によってはこれで十分ですが、Grafanaのより高度なダッシュボードシステムした方が、監視が確実にスムーズになるでしょう。

タスクを定義しましょう：
これらのプラグインを使用してローカルシステムを監視します。
a) [CPU](https://collectd.org/wiki/index.php/Plugin:CPU) 
b) [Disk](https://collectd.org/wiki/index.php/Plugin:Disk)
c) [DF‍](https://collectd.org/wiki/index.php/Plugin:DF)
d) [Swap‍ Memory](https://collectd.org/wiki/index.php/Plugin:Swap)
‍e) [Memory](https://collectd.org/wiki/index.php/Plugin:Memory)

すべてのデータはGraphiteに送信され、また、Graphiteに接続されたGrafanaインスタンスがあります。

ローカルマシン上の無用の大量のパッケージから保護するために、collectdのみをローカルにインストールします。 他のすべてのサービスについては、Docker-composeを使用します。 これは、このシステムを簡単に展開するためにも役立ってくるはずです。

#Grafanaを使用したGraphiteの設定
このセクションでは、GrafanaでGraphiteをセットアップします。次のセクションでは、collectdのインストールとプラグインの構成について説明します。

docker-compose.ymlファイルを定義しましょう：

```
version: '3'
services: 
 graphite:
  image: "graphiteapp/graphite-statsd"
  ports: 
   - 80:80 
   - 2003-2004:2003-2004 
   - 2023-2024:2023-2024 
   - 8080:8080
 grafana:
  image: "grafana/grafana"
  ports:
   - 3000:3000
  network_mode: host
  depends_on:
   - graphite
```

この設定ファイルで2つのサービス（Graphite&Grafana）について説明しています。

#Graphite
Graphiteをインストールするには、StatsDが含まれたGraphiteを実装するイメージを使用します。 ただし、この記事では、Graphiteのみを使用します。 また、このイメージは、コンテナーからアクセスできるいくつかのポートを公開しています。

マッピングされたポート
80 - Nginx
2003 - carbon receiver (plain text)
2004 - carbon receiver (pickle)
2023 - carbon aggregator (plain text)
2024 - carbon aggregator (pickle)
8080 - Graphite internal gunicorn port (without Nginx proxying)

StatsDポート8125、8126もありますが、この記事では役立ちません。 また、カーボンアグリゲーターの高度な構成をスキップし、レシーバーのみを使用します。

StatsDに興味がある場合は、[collectdとStatsDの違い](https://www.metricfire.com/blog/collectd-vs-statsd)について詳しくは、他の記事をご覧ください。

#Grafana
次に、Grafanaサービスを作成します。 ポート3000はユーザーインターフェイスへのアクセスに使用されるため、最初にポート3000を公開する必要があります。 また、GrafanaはGraphiteにリクエストを送信してデータをインポートする必要があるため、これを可能にする必要があります（```network_mode：host```）。 次に、このサービスがGraphiteに依存することを指定します。

collectdとGraphiteおよびGrafanaとの接続
collectdは、ローカルPCからメトリックを収集し、それらをポート番号2003でGraphiteに送信します。GraphiteをデータソースとしてGrafanaに追加し、すべてがどのように機能するかを視覚化します。
```docker-compose.yml```を実行する
```docker-compose up```

そして、設定後にcollectdを再起動します：
```sudo service collectd restart```

メトリックがcollectdによって収集され、Graphiteにパイプされるようになるまでしばらく待つ必要があります（メトリックを分析するために約１分時間がかかります）。

次に、アドレス[http：// localhost /](http://localhost/)に移動して、Graphiteを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/676b3f28-01ed-9f2e-d666-6a27cbf1b1bc.png)

その後、[http：// localhost：3000 /](http://localhost:3000/)にアクセスしてGrafanaにログインします。 次に、Grafanaで新しいデータソースを構成します。 Grafanaデータソースの設定方法の詳細については、[こちらの記事](https://www.metricfire.com/blog/grafana-data-sources)をご覧ください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/542dff8a-eb71-6e80-c725-38a90d11ddd4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/de27e4d1-c339-c0d5-5f2b-6a51a8c79823.png)

そして一つ目のダッシュボードを作成してみましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/614998/4b83e8be-e7b1-8189-cf39-418f8587ce88.png)

#サーバーパラメータを監視するためのCollectdプラグイン
collectdをローカルマシンにインストールしましょう：
```sudo apt install collectd```

次に、プラグインを使用してcollectdサービスを構成する必要があります。 これを行うには、collectdサービスを停止します。
sudoサービスcollectd停止

次に、構成を含むファイルを開きます（以前のもののバックアップを保持することをお勧めします）。
```sudo gedit /etc/collectd/collectd.conf```

ファイルの例を次に示します。

```
Hostname "my-local-pc.local" 
FQDNLookup true

LoadPlugin cpu

LoadPlugin disk

LoadPlugin df

LoadPlugin swap

LoadPlugin memory

# LoadPlugin write_prometheus
# <Plugin "write_prometheus">
#  Port "9103"
# </Plugin>

LoadPlugin write_graphite
<Plugin write_graphite>
  <Node "Graphite">  # random name in this case
    Host "127.0.0.1"
    Port "2003"
    Protocol "tcp"
    LogSendErrors true
    Prefix "collectd." # will be used in metrics name
    Postfix "collectd." # will be used in metrics name
    StoreRates true
    AlwaysAppendDS true
    EscapeCharacter "-"
  </Node>
</Plugin>
```

最初の行は現在のホストの名前を定義し（今のところランダムに選択できます）、2番目の行はホスト名の選択方法を制御します。 有効にすると、ノードのホスト名は完全修飾ドメイン名（FQDN）に設定されます。 実サーバーでは、最初の行をスキップできます。

このファイルを使用して、更新間隔などを指定することもできます。

次に、使用するプラグインを次のファイルで構成します。

```
LoadPlugin <plugin_name>
<Plugin <plugin_name>> # optional for some plugins
# ... configuration
</Plugin>
```
この例では、特別な設定なしでプラグインを使用します。 上記のコード例では、Prometheusインスタンスにデータを送信するための構成でプラグインをコメントアウトすることもできます。 プラグインはwrite_prometheusと呼ばれ、```<LoadPlugin“ write_prometheus”>```という行を見つけることができます。

これらのcollectdプラグインについて説明しましょう。

###CPU
CPUプラグインは、CPUがさまざまな状態、特にユーザーコードの実行、システムコードの実行、IO操作の待機、アイドル状態で費やした時間を収集します。

CPUプラグインはパーセンテージを収集しません。 スケジューリングの単位である「jiffies」を収集します。 ただし、次のように構成できます。

```
<Plugin cpu> 
    ReportByState = true 
    ReportByCpu = true 
    ValuesPercentage = true 
</Plugin>
```

収集されるメトリックはシステムに依存します。 これは、Windowsで実行するときに収集されるメトリックの例です。

 - Iddle
 - User
 - System
 - IRQ ( interrupt requests )

メトリックは、CPUごとに個別に収集され、各コアには、0からNまでの番号が付けられています。

###Disk
Diskプラグインは、ハードディスクとパーティションのパフォーマンス統計を収集します。

設定例：

```
<Plugin "disk">
  Disk "sda" # which partition to monitor
  IgnoreSelected false
</Plugin>
```

これもプラットフォームに依存するプラグインです。 Linux環境から収集されるメトリックの例には、次のものが含まれます。

 - マージ済み（1つのディスクが一度に実行できる操作の数）
 - 時間（I / O操作が完了するまでにかかった平均時間）
 - 保留中の操作
 - IO時間（IO操作の実行に必要な時間）
 - 加重IO時間（I / O完了時間と累積されている可能性のあるバックログの両方の尺度）。

###DF
DFプラグインは、ファイルシステムの使用状況情報（マウントされたパーティションの使用済みおよび空き領域）を収集します。 出力は「df」Linuxコマンドに似ています。

特定のパーティション、ファイルシステムタイプ、またはマウントポイントのみを監視するように設定できます。 すべてのデータを監視することもできます。 次に例を示します。

```
<Plugin "df">
  Device "/dev/hda1"
  FSType "ext3"
  IgnoreSelected false
</Plugin>
```

このメトリックは、マウントされたパーティションごとに2つの値（空きと使用）で構成されます。


###Swap
Swapプラグインは、使用されているスワップの量を示します。

例：

```
<Plugin swap>
  ReportByDevice false
  ReportBytes true
</Plugin>
```

そこには3つの値（Free、Cached、Used）を確認できるはずです。

###Memory
Memoryプラグインは、物理メモリの使用状況を収集します。
例：

```
<Plugin memory> 
  ValuesAbsolute true 
  ValuesPercentage true 
</Plugin>
```
Linuxでは、次のメトリックが表示されます。

 - Used
 - Buffered
 - Cached
 - Free

#まとめ
collectdは、メトリック収集のすべてのペイロードを実行するプラグインを管理するために構築されたプラットフォームです。たとえば、JVM、Nginx、MongoDBなどのインフラストラクチャやアプリケーションを監視するときに使用できます。システムは本当に柔軟に構成可能で、各プラグインは個別に構成できます。さまざまなcollectdプラグインにより、いつでもメトリックを収集、処理、および収集システムにプッシュできます。メール通知などの機能でアラートを設定することもできます。

collectdモニタリングを実行するには、モニタリングアーキテクチャを開発してセットアップするための知識が必要です。これは、本番環境での維持が困難になる可能性があります。さらに、一部のプラグインは十分に文書化されていません。コストのかかるプロセスを回避し、インフラストラクチャの監視にかかる費用を節約する最善の方法は、プラグインがすでにインストールされていて、適切なドキュメントがある[MetricFire](https://try.metricfire.com/japan/?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Collectd%20Plugins)などのサービスを使用することです。たとえば、MetricFireには、ユーザーがcollectdまたはStatsDの使用を完全にスキップできるホストされたグラファイトエージェントがあります。

[無料試用版](https://www.hostedgraphite.com/accounts/signup-metricfire/?signup=japan&utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Collectd%20Plugins)にサインオンして、ホストされているcollectd、Graphite、Grafanaスタックを試してください。また、[デモを予約](https://calendly.com/metricfire-chatwithus/chat?utm_source=blog&utm_medium=Qiita&utm_campaign=Japan&utm_content=Collectd%20Plugins)して、会社の監視ニーズについて直接弊社に相談することもできます。