Skip to content

Instantly share code, notes, and snippets.

@DaikiSuganuma
Created September 2, 2025 23:47
Show Gist options
  • Save DaikiSuganuma/fd49b7f88b9f5d97675d9a822104a0a1 to your computer and use it in GitHub Desktop.
Save DaikiSuganuma/fd49b7f88b9f5d97675d9a822104a0a1 to your computer and use it in GitHub Desktop.
collectd/rrdtoolデータ取得。Generated by Gemini 2.5 Pro.
#!/bin/sh
# ==============================================================================
# collectd/rrdtoolデータ取得・整形スクリプト (FreeBSD向け修正版)
#
# 指定した期間のシステムリソース(メモリ、CPU、負荷、ネットワーク)の
# データをcollectdのRRDファイルから抽出し、人間が読みやすい形式で表示します。
# ==============================================================================
# --- 設定項目 ---
# データを取得したい期間を指定してください。
# YYYYMMDD HH:MM 形式で指定します。
# (例: "20250903 07:10")
START_TIME="20250903 07:10"
END_TIME="20250903 07:30"
# 監視対象のネットワークインターフェース名
# collectd.confの<Plugin interface>で設定した名前に合わせてください。
INTERFACE_NAME="vtnet0"
# 監視対象のCPUコア番号 (0から始まる)
# 代表としてコア0のデータを取得します。
CPU_CORE_NUM="0"
# --- 設定ここまで ---
# --- 初期設定 ---
# スクリプト内で使用する変数を準備します。
# ホスト名を自動取得します。RRDファイルのパスに使われます。
HOSTNAME=$(hostname)
# collectdのRRDデータが保存されているベースディレクトリ
RRD_BASE_DIR="/var/db/collectd/rrd"
# --- 関数定義 ---
# rrdtool fetchコマンドを実行し、結果を見やすく整形して出力する関数
#
# 使い方: fetch_and_print "表示タイトル" "RRDファイルパス" "データソース名1" "データソース名2" ...
#
fetch_and_print() {
local title="$1"
local rrd_file="$2"
# 引数の1番目(タイトル)と2番目(ファイルパス)をシフトして削除
shift 2
# 残りの引数をデータソース名として保持
local data_sources="$@"
echo "============================================================"
echo "■ ${title}"
echo "------------------------------------------------------------"
# RRDファイルが存在するかチェック
if [ ! -f "${rrd_file}" ]; then
echo "エラー: RRDファイルが見つかりません: ${rrd_file}"
echo ""
return
fi
# ヘッダー行を整形して出力
header="日時 " # 22文字幅
for ds in ${data_sources}; do
header="${header}| ${ds} " # 15文字幅
done
echo "${header}"
echo "------------------------------------------------------------"
# rrdtool fetch を実行し、パイプで後続の処理に渡す
rrdtool fetch "${rrd_file}" AVERAGE --start "${START_TIME}" --end "${END_TIME}" | \
# 最初の2行 (ヘッダーと空行) をスキップ
tail -n +3 | \
# 1行ずつ読み込んで処理
while read -r line; do
# 空行はスキップ
[ -z "$line" ] && continue
# 行を「:」で分割し、タイムスタンプと値を取得
timestamp=$(echo "$line" | cut -d':' -f1)
values=$(echo "$line" | cut -d':' -f2 | sed 's/^[ \t]*//') # 値の先頭にあるスペースを削除
# タイムスタンプを人間が読める形式 (YYYY-MM-DD HH:MM:SS) に変換
# FreeBSDのdateコマンドは -r オプションでUNIXタイムスタンプを変換できます
human_date=$(date -r "${timestamp}" +"%Y-%m-%d %H:%M:%S")
# 値部分を整形
# awkを使い、各値を科学技術表記(e)で15文字幅に整形します
formatted_values=""
for val in ${values}; do
formatted_values="${formatted_values}| $(printf "%-14.2e" ${val})"
done
# 整形した日付と値を出力
printf "%s %s\n" "${human_date}" "${formatted_values}"
done
echo "" # 見やすくするために最後に改行
}
# --- メイン処理 ---
# ここからスクリプトの本体が実行されます。
echo "collectdデータ取得スクリプトを開始します。"
echo "対象ホスト: ${HOSTNAME}"
echo "取得期間: ${START_TIME} から ${END_TIME} まで"
echo ""
# 1. メモリ使用量の確認 (単位: Bytes)
# 【修正点】memory-used.rrd -> memory-active.rrd に変更
fetch_and_print "メモリ使用量 - アクティブ (active) [Bytes]" \
"${RRD_BASE_DIR}/${HOSTNAME}/memory/memory-active.rrd" "値"
# こちらは元々ファイルが存在していたので変更なし
fetch_and_print "メモリ使用量 - 空き (free) [Bytes]" \
"${RRD_BASE_DIR}/${HOSTNAME}/memory/memory-free.rrd" "値"
# 2. CPU使用率の確認 (単位: %)
# 【修正点】cpu-user.rrd -> percent-user.rrd に変更
fetch_and_print "CPU-${CPU_CORE_NUM} 使用率 - ユーザー (user) [%]" \
"${RRD_BASE_DIR}/${HOSTNAME}/cpu-${CPU_CORE_NUM}/percent-user.rrd" "値"
# 【修正点】cpu-idle.rrd -> percent-idle.rrd に変更
fetch_and_print "CPU-${CPU_CORE_NUM} 使用率 - アイドル (idle) [%]" \
"${RRD_BASE_DIR}/${HOSTNAME}/cpu-${CPU_CORE_NUM}/percent-idle.rrd" "値"
# 3. ロードアベレージの確認 (変更なし)
fetch_and_print "ロードアベレージ" \
"${RRD_BASE_DIR}/${HOSTNAME}/load/load.rrd" "1分平均" "5分平均" "15分平均"
# 4. ネットワークトラフィックの確認 (単位: Bytes/sec) (変更なし)
fetch_and_print "ネットワークトラフィック (${INTERFACE_NAME}) [Bytes/sec]" \
"${RRD_BASE_DIR}/${HOSTNAME}/interface-${INTERFACE_NAME}/if_octets.rrd" "受信(rx)" "送信(tx)"
echo "データ取得が完了しました。"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment