Created
September 2, 2025 23:47
-
-
Save DaikiSuganuma/fd49b7f88b9f5d97675d9a822104a0a1 to your computer and use it in GitHub Desktop.
collectd/rrdtoolデータ取得。Generated by Gemini 2.5 Pro.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/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