FreeBSD14 + collectd + RRDtoolをportsからビルドしてインストール

OpenTelemetryの環境を構築するのはまだ時期尚早と判断してcollectdをインストールしたときの覚書。
参考: OpenTelemetry(OTel)とはアプリケーションの動作を観測・計測するための標準規格
Gemini 2.5 Proと対話。

環境: FreeBSD 14.3-RELEASE-p2


1. collectdとRRDtoolとは?

collectdは、システムやアプリケーションのパフォーマンス状況を定期的かつ継続的に収集するための、オープンソースのサービス。
参考: FreeBSDのsystatとcollectdでリソース情報を取得

RRDtoolは、Round Robin Database toolの略称。
RRD (Round Robin Database) は、サイズが変動しないデータベース。
容量を気にせず保存できるため、監視ツールのバックエンドとして長年利用されてきた実績がある。
参考: RRDツール - Wikipedia

RRDファイルは作成された瞬間にファイルサイズが固定される。

collectdは、RRDファイルがすでに存在する場合、その構造を変更しない。
つまりRRDの保存容量を変更する場合は、既存を削除する必要があるらしい。


2. collectdをビルド(RRDtoolオプション付き)

公式リポジトリにあるcollectd5のビルドオプションを確認。
# pkg search -f collectd5

pkgでインストールされるのはRRDtoolオプションが付いてない。
rrdtoolsは公式リポジトリからインストールしておく。
# pkg search rrdtool

portsに移動して最新に更新。
# cd /usr/ports/
# git pull

collectdがどこにあるか見つける。
# find ./ -type d -name "collectd*"

./net-mgmt/collectd5

移動してビルド。
# cd net-mgmt/collectd5/
# make config
# make

Gemini先生によるビルドオプションの説明一覧。

一般オプション

  • CGI: Webグラフ表示(CGI)機能。rrdtoolのデータをブラウザで見るCGIをインストールします。
  • GCRYPT: 暗号化機能。ネットワーク通信などを暗号化するためにlibgcryptを有効にします。
  • JAVA: Javaサポート。Javaで書かれたプラグインを実行できるようにします。
  • LOGGING: デバッグログ出力。トラブルシューティング用に詳細なログを出力する機能を有効にします。
  • LOGSTASH: Logstash連携。収集データをLogstashへ送信するプラグインを有効にします。
  • VIRT: 仮想マシン監視。libvirt経由で仮想マシンの情報を収集します。(不安定な可能性あり)

INPUT (データ収集プラグイン)

  • CHRONY: chronyの情報を収集します (時刻同期デーモン)。
  • CURL: Webサーバー等の情報をcurl経由で収集します (Apache, Nginxなど)。
  • CURL_JSON: JSON形式のデータをcurl経由で収集します。
  • CURL_XML: XML形式のデータをcurl経由で収集します。
  • DBI: 各種データベースの情報をDBI経由で収集します。
  • IPMI: サーバーハードウェア情報をIPMI経由で収集します (温度、電圧、ファンなど)。
  • JSON: JSON形式のデータを扱うためのサポートを有効にします。
  • MEMCACHEC: Memcachedの情報を収集します。
  • MODBUS: Modbus対応機器の情報を収集します (産業用センサーなど)。
  • MQTT: MQTTブローカーの統計情報を収集します。
  • MYSQL: MySQL/MariaDBの情報を収集します。
  • NUTUPS: UPS(無停電電源装置)の情報をNUT経由で収集します。
  • OLSRD: OLSRDの情報を収集します (メッシュネットワーク)。
  • ONEWIRE: 1-Wireデバイスの情報を収集します (温度センサーなど)。
  • OPENLDAP: OpenLDAPサーバーの情報を収集します。
  • PERL: Perlプラグインを実行できるようにします (自作スクリプトでの収集)。
  • PF: PF(パケットフィルタ)の統計情報を収集します。
  • PGSQL: PostgreSQLの情報を収集します。
  • PINBA: Pinbaの情報を収集します (PHPリアルタイム監視)。
  • PING: Pingの応答時間を収集します。
  • PYTHON: Pythonプラグインを実行できるようにします (自作スクリプトでの収集)。
  • RABBITMQ: RabbitMQの情報を収集します。
  • REDIS: Redisの情報を収集します。
  • SIGROK: sigrok対応機器の情報を収集します。(現在利用不可)
  • SLURM: Slurm(クラスタ管理)の情報を収集します。(現在利用不可)
  • SNMP: SNMP経由での情報を収集します (ネットワーク機器など)。
  • STATSD: StatsD形式のデータを受信できるようにします。
  • TOKYOTYRANT: Tokyo Tyrantデータベースの情報を収集します。
  • VARNISH: Varnish Cacheの統計情報を収集します。
  • XML: XML形式のデータを扱うためのサポートを有効にします。
  • ZOOKEEPER: ZooKeeperの情報を収集します。

OUTPUT (データ書き込みプラグイン)

  • INFLUXDB: データをInfluxDBへ書き込みます。
  • KAFKA: データをApache Kafkaへ書き込みます。
  • MONGODB: データをMongoDBへ書き込みます。
  • NOTIFYDESKTOP: データをデスクトップ通知として表示します。
  • NOTIFYEMAIL: データをEメールで通知します。
  • PROMETHEUS: データをPrometheus形式で公開します。
  • RIEMANN: データをRiemannへ送信します (イベントストリーム処理)。
  • RRDTOOL: データをRRDtool形式のファイル(.rrd)に書き込みます。
  • TSDB: データをOpenTSDBへ書き込みます。


有効にしたオプション

  • RRDTOOL

最初ビルドしたとき、いくつかオプションを有効にしたことでビルドが長くなったので、RRDTOOLだけでビルドすることにした。

途中で表示されるビルドオプションは全て無効にする。
「NLS」は各言語サポート。出力メッセージは英語で問題ないので無効にする。


前のビルド時に設定した依存関係のビルドオプションをリセットして再ビルドする場合のコマンド。
# make rmconfig-recursive
# make clean-depends
# make clean

make installしたあとは一旦アンインストールして、依存関係もアンインストールしてから試すのが安全。
# make deinstall
# pkg autoremove -n
# pkg autoremove

依存関係でインストールするパッケージが分かったので、公式リポジトリからインストールしておく。
これでこれらのビルドは行わないはず。
# pkg install libtool pkgconf

後で知ったけど、下記コマンドで必要な依存関係が分かる。
ビルド時にのみ必要な依存関係を表示。
# make build-depends-list

実行時に必要な依存関係を表示。
# make run-depends-list


もう一度ビルド実行。
# make config
# make

インストールしてクリーンアップする。
# make install clean

pkgコマンドによる変更から保護する。
# pkg lock collectd5

オプションを確認。
pkg infoはインストール済みパッケージの情報を表示するコマンド。
# pkg info collectd5


3. collectdの設定

Gemini先生に設定ファイルを作ってもらう。
Gist: 環境: FreeBSD 14.3-RELEASE-p2, Generated by Gemini 2.5 Pro

設定ファイル編集。
# cd /usr/local/etc/
# mv collectd.conf collectd.conf.bak20250901
# vim collectd.conf

ネットワークインターフェースの確認。
# ifconfig

dfプラグインで指定するDeviceとFSTypeの値を確認。
# df -hT

テストしてサービス起動。
# collectd -t
# sysrc collectd_enable="YES"
# service collectd start

Starting collectd.
Error: Parsing the config file failed!
/usr/local/etc/rc.d/collectd: WARNING: failed to start collectd

エラーの確認。
# less /var/log/messages

エラーをそのままGemini先生に伝えて設定ファイルを修正。再起動。
# collectd -t
# service collectd start
# service collectd status


4. RRD形式からデータを読み出し

記録されたRRDファイルの構造を確認する。
# ls /var/db/collectd/rrd/
# rrdtool info /var/db/collectd/rrd/vm-dev3/memory/memory-free.rrd

出力例と解説

# ■ ファイルの基本情報 (Header)

filename = "/var/db/collectd/rrd/vm-dev3/memory/memory-free.rrd"
# 【解説】このRRDファイルの名前とフルパスです。

rrd_version = "0003"
# 【解説】RRDファイルのフォーマットバージョンです。通常は "0003" です。

step = 10
# 【解説】★重要★ このデータベースが期待するデータ更新の基本間隔(秒)です。
# collectd.confの 'Interval' 設定と一致します。このファイルは10秒ごとにデータが投入されることを前提としています。

last_update = 1725141612
# 【解説】このファイルが最後に更新された時刻です。UNIXタイムスタンプ形式で表示されます。
# (date -r 1725141612 コマンドで人間が読める形式に変換できます)

header_size = 2968
# 【解説】ファイル先頭のヘッダー部分のサイズ(バイト)です。


# ■ データソースの定義 (Data Source - DS)
# "何を" 記録するかの定義です。

ds[value].index = 0
# 【解説】データソースのインデックス番号です(0から始まります)。

ds[value].type = "GAUGE"
# 【解説】★重要★ データの種類です。
#  - GAUGE: そのままの値を記録します (例: メモリ使用量, 温度)。
#  - COUNTER: 常に増加する値。差分を計算し、秒間レートに変換して記録します (例: ネットワークトラフィック)。
#  - DERIVE: COUNTERと似ていますが、値が減少することも許容します。
#  - ABSOLUTE: COUNTERと似ていますが、リセットされることを前提とします。

ds[value].minimal_heartbeat = 20
# 【解説】ハートビート。この秒数 (stepの2倍が一般的) 以上更新がない場合、その間のデータは「不明(UNKNOWN)」として扱われます。

ds[value].min = 0.0000000000e+00
# 【解説】記録される値の最小値です。これより小さい値は記録されません。

ds[value].max = NaN
# 【解説】記録される値の最大値です。NaN (Not a Number) は、事実上無制限を意味します。

ds[value].last_ds = "2113706496"
# 【解説】最後に rrdtool update で受け取った「生」のデータ値です。

ds[value].value = 2.1137064960e+09
# 【解説】最後に計算・正規化されたデータポイント(PDP - Primary Data Point)の値です。

ds[value].unknown_sec = 0
# 【解説】最後にデータを受け取ってから経過した秒数です。stepの値を超えると、データが途切れていると判断されます。


# ■ ラウンドロビンアーカイブの定義 (Round Robin Archive - RRA)
# "どのように" データを統合し、保存するかの定義です。
# 複数のRRAを持つことで、異なる解像度のデータを保持できます。

rra[0].cf = "AVERAGE"
# 【解説】統合関数(Consolidation Function)です。「AVERAGE」は平均値を取ることを意味します。
# 他に MAX(最大), MIN(最小), LAST(最後) があります。

rra[0].rows = 17280
# 【解説】この解像度のデータポイントを何行(何個)保存するかを示します。

rra[0].pdp_per_row = 1
# 【解説】★重要★ 1つのデータポイントを作成するために、いくつの元データ(PDP)を統合するか(ステップ数)です。
# '1' は統合しないことを意味し、最も解像度が高い(生データに近い)アーカイブです。
# (保存期間: 1ステップ * 10秒/ステップ * 17280行 = 172800秒 ≒ 2日)

rra[0].xff = 5.0000000000e-01
# 【解説】XFiles Factor。データポイントを計算する際に、元データのうち何割が有効(UNKNOWNでない)であれば良いかを示す閾値です。
# 0.5 は 50% を意味します。

# --- 次の解像度のRRA ---

rra[1].cf = "AVERAGE"
rra[1].rows = 14400
rra[1].pdp_per_row = 6
# 【解説】このRRAでは、6つの元データ(PDP)を1つにまとめて平均値を取ります。
# (解像度: 6ステップ * 10秒/ステップ = 60秒 = 1分)
# (保存期間: 60秒/行 * 14400行 = 864000秒 ≒ 10日)

# --- (以下、他のRRA定義が続く) ---

rra[2].cf = "AVERAGE"
rra[2].rows = 5760
rra[2].pdp_per_row = 60
# 【解説】60個の元データを1つにまとめます。
# (解像度: 60 * 10秒 = 600秒 = 10分)
# (保存期間: 600秒/行 * 5760行 = 3456000秒 ≒ 40日)

rra[3].cf = "AVERAGE"
rra[3].rows = 8760
rra[3].pdp_per_row = 360
# 【解説】360個の元データを1つにまとめます。
# (解像度: 360 * 10秒 = 3600秒 = 1時間)
# (保存期間: 3600秒/行 * 8760行 ≒ 1年)

rra[4].cf = "MAX"
rra[4].rows = 5760
rra[4].pdp_per_row = 60
# 【解説】このRRAは統合関数としてMAX(最大値)を使います。
# 10分間のピーク値を確認するのに役立ちます。


次はパフォーマンスの統計情報を生成AIに送信して、解析と改善案を提案させるバッチ処理を作る予定。


▼ 関連記事