Node ExporterはPrometheusの重要なコンポーネントであり、システムレベルのメトリクス(CPU使用率、メモリ使用量、ディスク容量、ネットワークトラフィックなど)を収集し、Prometheusが取得できる形式で公開します。
課題:膨大な監視データの中での精確な問題特定
Node ExporterはPrometheusエコシステムの中心的な役割を果たしており、秒単位で数万のメトリクスを生成します。このような大量のデータから:
- 特定ノードのパフォーマンスボトルネックを迅速に特定する方法は?
- 多くのメトリクスから重要なデータをフィルタリングする方法は?
- 複数の次元を組み合わせて分析し、潜在的なシステム問題を見つける方法は?
この記事では、Node Exporterのメトリクスクエリのテクニックについて解説し、多次元分析と詳細クエリを通じて問題を精確に特定する方法を紹介します。
主要なメトリクス概観
CPU関連メトリクス
# CPU使用率統計
node_cpu_seconds_total{mode="idle"} # CPUアイドル時間
node_cpu_seconds_total{mode="user"} # ユーザーモードCPU時間
node_cpu_seconds_total{mode="system"} # システムモードCPU時間
# CPU周波数情報
node_cpu_frequency_hertz # CPU周波数
node_cpu_frequency_min_hertz # 最小周波数
node_cpu_frequency_max_hertz # 最大周波数
メモリ関連メトリクス
# メモリ使用状況
node_memory_MemTotal_bytes # 総メモリ
node_memory_MemFree_bytes # 空きメモリ
node_memory_MemAvailable_bytes # 利用可能なメモリ
node_memory_Buffers_bytes # バッファリングされたメモリ
node_memory_Cached_bytes # キャッシュされたメモリ
# メモリ圧力指標
node_memory_SwapTotal_bytes # 総スワップスペース
node_memory_SwapFree_bytes # 空きスワップスペース
node_memory_SwapCached_bytes # スワップキャッシュ
ディスクI/Oメトリクス
# ディスク読み書き統計
node_disk_read_bytes_total # ディスク読み込みバイト数
node_disk_written_bytes_total # ディスク書き込みバイト数
node_disk_reads_completed_total # 読み込み完了回数
node_disk_writes_completed_total # 書き込み完了回数
# ディスク時間統計
node_disk_io_time_seconds_total # I/O時間合計
node_disk_io_time_weighted_seconds_total # 重み付けされたI/O時間
ネットワークメトリクス
# ネットワークトラフィック統計
node_network_receive_bytes_total # 受信バイト数
node_network_transmit_bytes_total # 送信バイト数
node_network_receive_packets_total # 受信パケット数
node_network_transmit_packets_total # 送信パケット数
# ネットワークエラー統計
node_network_receive_errs_total # 受信エラー数
node_network_transmit_errs_total # 送信エラー数
node_network_receive_drop_total # 受信ドロップ数
node_network_transmit_drop_total # 送信ドロップ数
多次元クエリ分析のテクニック
1. ラベルフィルタリングとセレクタの使用
# インスタンス別フィルタリング
node_cpu_seconds_total{instance="192.168.1.100:9100"}
# デバイス別フィルタリング
node_disk_read_bytes_total{device="sda"}
# 複数のラベルの組み合わせクエリ
node_network_receive_bytes_total{device="eth0", instance=~"web.*"}
# 特定のラベル値を除外
node_filesystem_avail_bytes{mountpoint!~"/proc|/sys|/dev"}
2. 時間範囲クエリと集約化
# 最近5分間のCPU使用率
100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
# ディスクIOPS統計
rate(node_disk_reads_completed_total[5m]) + rate(node_disk_writes_completed_total[5m])
# ネットワーク帯域幅使用率
rate(node_network_receive_bytes_total[5m]) * 8 / 1000 / 1000 # Mbpsに変換
3. 複数のメトリクスの関連分析
# メモリ使用率とスワップスペースの関連
(
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes)
/ node_memory_MemTotal_bytes * 100
) > 80
and
(
node_memory_SwapCached_bytes / node_memory_SwapTotal_bytes * 100
) > 10
# CPUと負荷の関連分析
node_load1 > count by(instance) (node_cpu_seconds_total{mode="idle"}) * 0.7
詳細クエリの実践例
ケース1:ディスクパフォーマンス問題の診断
-- 第1ステップ:全体的なディスクIOPS監視
sum by(instance) (rate(node_disk_reads_completed_total[5m]) + rate(node_disk_writes_completed_total[5m]))
-- 第2ステップ:特定デバイスへの下層
rate(node_disk_reads_completed_total{device="sdb"}[5m])
rate(node_disk_writes_completed_total{device="sdb"}[5m])
-- 第3ステップ:読み書き遅延の分析
rate(node_disk_read_time_seconds_total{device="sdb"}[5m]) / rate(node_disk_reads_completed_total{device="sdb"}[5m])
rate(node_disk_write_time_seconds_total{device="sdb"}[5m]) / rate(node_disk_writes_completed_total{device="sdb"}[5m])
-- 第4ステップ:キューの深さのチェック
rate(node_disk_io_time_weighted_seconds_total{device="sdb"}[5m])
ケース2:ネットワーク異常トラフィックの分析
-- 第1レベル:全体的なネットワークエラーモニタリング
sum by(instance) (rate(node_network_receive_errs_total[2m])) /
sum by(instance) (rate(node_network_receive_packets_total[2m])) > 0.01
-- 第2レベル:特定のNICへの下層
rate(node_network_receive_errs_total{device=~"eth.*"}[2m]) /
rate(node_network_receive_packets_total{device=~"eth.*"}[2m])
-- 第3レベル:TCP再送信の関連分析
rate(node_netstat_Tcp_RetransSegs[2m]) /
rate(node_netstat_Tcp_OutSegs[2m]) > 0.05
-- 第4レベル:接続レベルへの深い下層
topk(10, rate(node_netstat_TcpExt_TCPTimeouts[5m]))
高度なクエリモードとベストプラクティス
1. Recording Rulesによるクエリパフォーマンスの最適化
groups:
- name: node_rules
rules:
- record: instance:cpu:avg_rate5m
expr: 100 - (avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)
- record: instance:memory_usage:ratio
expr: (node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes
- record: instance:disk_iops:total
expr: rate(node_disk_reads_completed_total[5m]) + rate(node_disk_writes_completed_total[5m])
- record: instance:network_error_rate:ratio
expr: rate(node_network_receive_errs_total[2m]) / rate(node_network_receive_packets_total[2m])
2. 多次元下層クエリテンプレート
-- テンプレート:クラスタからノードへの下層クエリ
-- 第1層:クラスタレベルの集約化
sum by(cluster) (メトリクス{環境="本番"})
-- 第2層:ノードレベルへの下層
sum by(instance, cluster) (メトリクス{環境="本番", cluster="k8s-prod"})
-- 第3層:デバイス/サービスレベルへの下層
メトリクス{環境="本番", cluster="k8s-prod", instance="ノード-1", device="eth0"}
-- 第4層:時間シリーズへの下層
メトリクス{環境="本番", cluster="k8s-prod", instance="ノード-1", device="eth0"}[10m]
3. 異常検知とベースライン比較
-- ベースラインとの比較
(
node_memory_MemAvailable_bytes
/ node_memory_MemTotal_bytes * 100
) < (
avg_over_time(
(node_memory_MemAvailable_bytes
/ node_memory_MemTotal_bytes * 100)[7d]
) * 0.7 # 歴史平均値の70%未満
)
-- 同期比較による異常検知
(
rate(node_network_receive_bytes_total[5m])
>
1.5 * rate(node_network_receive_bytes_total offset 1d[5m])
)
監視データの可視化ベストプラクティス
Grafanaダッシュボード設計の原則
- 階層構造:全体から詳細へとレイアウト
- 色コード:異なる状態を一貫した色で表す
- 下層リンク:サマリーパネルから詳細パネルへのリンク設定
- テンプレート変数:動的フィルタリングを実現する
推奨のパネル設定
{
"panels": [
{
"title": "CPU使用率",
"type": "graph",
"targets": [{
"expr": "100 - (avg by(instance) (rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)",
"legendFormat": "{{instance}}"
}]
},
{
"title": "メモリ使用トレンド",
"type": "graph",
"targets": [{
"expr": "(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100",
"legendFormat": "{{instance}}"
}]
}
]
}