はじめに
本記事では、Instana で NVIDIA GPU の温度監視アラートを API 経由で自動作成する方法を解説します。
前提記事:
上記の記事で、DCGM Exporter と OpenTelemetry Collector を使った GPU メトリクスの収集と Instana への送信が完了していることを前提とします。
本記事の目的:
- Instana UI で手動作成せず、API を使って複数 GPU 用のカスタムイベントを自動作成
- Entity Type の特定から、Metric Pattern の使い方、スクリプト実行、動作確認までを網羅
背景: なぜ API での自動化が必要か
NVIDIA GPU を複数搭載したサーバーでは、各 GPU の温度を個別に監視するため、GPU の数だけ Instana のカスタムイベントを作成する必要があります。
検証環境の例:
- NVIDIA H200 GPU × 8 基搭載のサーバー
- 各 GPU を個別に監視するため、8 個のカスタムイベントが必要
手動作成の問題点:
- 1 つ作成するのに約 2 分 × GPU 数 = 大幅な時間を消費
- 設定ミス(閾値、メトリクス名、Aggregation など)のリスク
- Infrastructure as Code (IaC) として管理できない
API 自動化のメリット:
- GPU 数に関わらず、1 分程度で全てのイベントを作成
- 設定の一貫性を保証(特に重要な
aggregation: maxを強制) - Git で管理可能(バージョン管理、レビュー)
ステップ1: 正しい Entity Type を特定する
1.1 問題: UI と API で Entity Type の表記が異なる
Instana UI では、GPU エンティティは OTel GPU と表示されますが、API では異なる表記が使われます。
よくある失敗例:
# これらは全て失敗する
"entityType": "otelDcgm" # 全小文字
"entityType": "OTEL_DCGM" # アンダースコア区切り
"entityType": "otel_dcgm" # 小文字+アンダースコア
1.2 利用可能な Entity Type を API で取得
コマンド:
curl -X GET \
"https://YOUR_INSTANA_URL/api/infrastructure-monitoring/catalog/plugins" \
-H "Authorization: apiToken YOUR_API_TOKEN" \
| jq '.[] | select(.label | contains("OTEL") or contains("Dcgm") or contains("GPU"))'
期待される出力:
{
"plugin": "oTelDcgm",
"label": "OTel GPU"
}
確認できたこと:
- 正しい Entity Type は
oTelDcgm - UI 上の表記は
OTel GPU
1.3 結果: oTelDcgm が正しい Entity Type
重要なポイント:
- 正しい Entity Type は
oTelDcgm(小文字のo+ 大文字のT) - これは
otelDcgm(全小文字) やOTEL_DCGMとは異なる
ステップ2: メトリクス名と GPU 数の確認
2.1 DCGM Exporter が公開するメトリクスを確認
# DCGM Exporter Pod 名を取得
DCGM_POD=$(kubectl get pod -n gpu-observe -l app=dcgm-exporter -o jsonpath='{.items[0].metadata.name}')
# Port Forward で メトリクスエンドポイントにアクセス
kubectl port-forward -n gpu-observe $DCGM_POD 9400:9400 &
sleep 2
# GPU 温度メトリクスを確認
curl -s http://localhost:9400/metrics | grep "DCGM_FI_DEV_GPU_TEMP"
# Port Forward を終了
kill %1
期待される出力:
# HELP DCGM_FI_DEV_GPU_TEMP GPU temperature (in C).
# TYPE DCGM_FI_DEV_GPU_TEMP gauge
DCGM_FI_DEV_GPU_TEMP{gpu="0",UUID="GPU-...",device="nvidia0",modelName="NVIDIA H200",...} 30
DCGM_FI_DEV_GPU_TEMP{gpu="1",UUID="GPU-...",device="nvidia1",modelName="NVIDIA H200",...} 29
DCGM_FI_DEV_GPU_TEMP{gpu="2",UUID="GPU-...",device="nvidia2",modelName="NVIDIA H200",...} 30
DCGM_FI_DEV_GPU_TEMP{gpu="3",UUID="GPU-...",device="nvidia3",modelName="NVIDIA H200",...} 31
DCGM_FI_DEV_GPU_TEMP{gpu="4",UUID="GPU-...",device="nvidia4",modelName="NVIDIA H200",...} 31
DCGM_FI_DEV_GPU_TEMP{gpu="5",UUID="GPU-...",device="nvidia5",modelName="NVIDIA H200",...} 29
DCGM_FI_DEV_GPU_TEMP{gpu="6",UUID="GPU-...",device="nvidia6",modelName="NVIDIA H200",...} 30
DCGM_FI_DEV_GPU_TEMP{gpu="7",UUID="GPU-...",device="nvidia7",modelName="NVIDIA H200",...} 31
ポイント:
- 各 GPU の温度が 30°C 前後(アイドル状態)
-
gpu="0"からgpu="7"まで確認できる(この環境では 8 GPU を搭載) -
modelName="NVIDIA H200"で GPU モデルを確認 -
DCGM_FI_DRIVER_VERSION="580.95.05"でドライバーバージョンを確認
2.2 GPU 数の自動検出
スクリプトで GPU 数を自動検出する方法:
# GPU 数を自動検出
GPU_COUNT=$(curl -s http://localhost:9400/metrics | grep "DCGM_FI_DEV_GPU_TEMP{" | wc -l)
echo "検出された GPU 数: ${GPU_COUNT}"
期待される出力:
検出された GPU 数: 8
2.3 利用可能な主要メトリクス一覧
| メトリクス名 | 説明 | 単位 |
|---|---|---|
DCGM_FI_DEV_GPU_TEMP |
GPU 温度 | °C |
DCGM_FI_DEV_GPU_UTIL |
GPU 使用率 | % |
DCGM_FI_DEV_POWER_USAGE |
電力使用量 | W |
DCGM_FI_DEV_FB_USED |
GPU メモリ使用量 | MB |
DCGM_FI_DEV_SM_CLOCK |
SM クロック周波数 | MHz |
DCGM_FI_DEV_XID_ERRORS |
XID ハードウェアエラー | 件数 |
ステップ3: Metric Pattern を使った個別 GPU 監視
3.1 Metric Pattern とは
複数の GPU を個別に監視するため、Metric Pattern を使用します。
通常のメトリクス指定(全 GPU が対象):
{
"metricName": "DCGM_FI_DEV_GPU_TEMP"
}
この場合、どの GPU で温度が上昇しても全てのアラートが発火してしまいます。
Metric Pattern を使用(特定 GPU のみ):
{
"metricName": null,
"metricPattern": {
"prefix": "DCGM_FI_DEV_GPU_TEMP",
"postfix": null,
"placeholder": "0",
"operator": "is"
}
}
この場合、DCGM_FI_DEV_GPU_TEMP{gpu="0"} に対してのみアラートが発火します。
メリット:
- GPU 番号を動的に指定可能
- 各 GPU を個別に監視できる
- アラート発火時に、どの GPU で問題が発生したかを特定可能
3.2 最重要設定: aggregation は必ず max
GPU 温度監視では、60秒間の時間枠内で最も高い温度 を監視する必要があります。
間違った設定(sum)の場合:
{
"aggregation": "sum",
"window": 60000,
"conditionValue": 70
}
問題点:
- 60秒間の温度の 合計 が70を超えるかを判定
- 例:毎秒60°C の場合、合計は
60°C × 60秒 = 3600となり、常にアラートが発火 - 温度監視として全く機能しない
正しい設定(max):
{
"aggregation": "max",
"window": 60000,
"conditionValue": 70
}
動作:
- 60秒間の温度の 最大値 が70°C以上の場合にアラートが発火
- 瞬間的な温度スパイクも検知可能
- 温度監視として正しく機能する
ステップ4: GPU 数に応じたイベントを自動作成
4.1 スクリプトの全体像
ファイル名: create-gpu-temperature-alerts.sh
#!/bin/bash
# ====================================
# Instana GPU Temperature Alerts
# 自動作成スクリプト
# ====================================
# Instana API 設定
INSTANA_URL="https://YOUR_INSTANA_URL" # 例: https://your-tenant.instana.io
API_TOKEN="YOUR_API_TOKEN" # Settings → API Tokens で取得
# アラート設定パラメータ
THRESHOLD=70 # 閾値: 70°C
TIME_WINDOW=60000 # 60秒(ミリ秒)
# GPU 数を取得(環境に応じて変更)
GPU_COUNT=8 # または自動検出: GPU_COUNT=$(kubectl exec ... | grep "DCGM_FI_DEV_GPU_TEMP{" | wc -l)
echo "======================================"
echo "Instana GPU温度アラートの一括作成"
echo "======================================"
echo "GPU 数: ${GPU_COUNT}"
echo "閾値: ${THRESHOLD}°C"
echo "時間枠: $(($TIME_WINDOW / 1000))秒"
echo "Entity Type: oTelDcgm"
echo "======================================"
echo ""
# 各GPU(0〜GPU_COUNT-1)に対してアラートを作成
for ((CORE=0; CORE<GPU_COUNT; CORE++)); do
echo "[$(date +%T)] Creating alert for GPU Core ${CORE}..."
RESPONSE=$(curl -s -w "\nHTTP_STATUS:%{http_code}" -X POST \
"${INSTANA_URL}/api/events/settings/event-specifications/custom" \
-H "Authorization: apiToken ${API_TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"name": "GPU Temperature - Core '"${CORE}"' - Critical",
"description": "GPU Core '"${CORE}"' の温度が '"${THRESHOLD}"'°C以上になった場合に通知",
"enabled": true,
"triggering": true,
"entityType": "oTelDcgm",
"expirationTime": 60000,
"rules": [
{
"ruleType": "threshold",
"metricName": null,
"metricPattern": {
"prefix": "DCGM_FI_DEV_GPU_TEMP",
"postfix": null,
"placeholder": "'"${CORE}"'",
"operator": "is"
},
"aggregation": "max",
"conditionOperator": ">=",
"conditionValue": '"${THRESHOLD}"',
"window": '"${TIME_WINDOW}"',
"severity": 10
}
]
}')
# HTTPステータスコードを抽出
HTTP_BODY=$(echo "$RESPONSE" | sed -e 's/HTTP_STATUS\:.*//g')
HTTP_STATUS=$(echo "$RESPONSE" | tr -d '\n' | sed -e 's/.*HTTP_STATUS://')
if [ "$HTTP_STATUS" -eq 201 ] || [ "$HTTP_STATUS" -eq 200 ]; then
echo " Successfully created (HTTP ${HTTP_STATUS})"
else
echo " Failed (HTTP ${HTTP_STATUS})"
echo " Response: ${HTTP_BODY}"
fi
echo ""
sleep 1
done
echo "======================================"
echo "全${GPU_COUNT}個のアラートルール作成完了"
echo "======================================"
echo ""
echo "確認方法:"
echo " Instana UI → Settings → Events"
echo " 検索: 'GPU Temperature - Core'"
4.2 重要なポイント
GPU 数の設定:
# 方法1: 手動設定
GPU_COUNT=8
# 方法2: 自動検出(推奨)
GPU_COUNT=$(kubectl exec -n gpu-observe <dcgm-pod> -- curl -s http://localhost:9400/metrics | grep "DCGM_FI_DEV_GPU_TEMP{" | wc -l)
Metric Pattern の使用:
{
"metricName": null,
"metricPattern": {
"prefix": "DCGM_FI_DEV_GPU_TEMP",
"postfix": null,
"placeholder": "0",
"operator": "is"
}
}
-
metricNameはnullに設定 -
metricPatternで GPU 番号を動的に指定
aggregation: max の設定:
{
"aggregation": "max"
}
- 必須設定
-
sumやavgは使用しない
Entity Type:
"entityType": "oTelDcgm"
-
小文字の
o+ 大文字のTに注意
4.3 実行方法
ステップ1: スクリプトを保存
nano create-gpu-temperature-alerts.sh
ステップ2: 実行権限を付与
chmod +x create-gpu-temperature-alerts.sh
ステップ3: 実行
./create-gpu-temperature-alerts.sh
期待される出力(8 GPU の場合):
======================================
Instana GPU温度アラートの一括作成
======================================
GPU 数: 8
閾値: 70°C
時間枠: 60秒
Entity Type: oTelDcgm
======================================
[21:12:53] Creating alert for GPU Core 0...
Successfully created (HTTP 200)
[21:12:55] Creating alert for GPU Core 1...
Successfully created (HTTP 200)
[21:12:56] Creating alert for GPU Core 2...
Successfully created (HTTP 200)
[21:12:58] Creating alert for GPU Core 3...
Successfully created (HTTP 200)
[21:13:00] Creating alert for GPU Core 4...
Successfully created (HTTP 200)
[21:13:01] Creating alert for GPU Core 5...
Successfully created (HTTP 200)
[21:13:03] Creating alert for GPU Core 6...
Successfully created (HTTP 200)
[21:13:04] Creating alert for GPU Core 7...
Successfully created (HTTP 200)
======================================
全8個のアラートルール作成完了
======================================
確認方法:
Instana UI → Settings → Events
検索: 'GPU Temperature - Core'
所要時間: 約 12 秒(8 GPU × 1〜2 秒/GPU)
注意: GPU 数が異なる環境では、GPU_COUNT を変更するだけで対応可能です。
ステップ5: 作成結果の確認
5.1 Instana UI での確認
- Instana UI にログイン
- Settings (歯車アイコン) → Events
- 検索ボックスに
GPU Temperatureと入力
表示されるイベント(8 GPU の場合):
- GPU Temperature - Core 0 - Critical
- GPU Temperature - Core 1 - Critical
- GPU Temperature - Core 2 - Critical
- GPU Temperature - Core 3 - Critical
- GPU Temperature - Core 4 - Critical
- GPU Temperature - Core 5 - Critical
- GPU Temperature - Core 6 - Critical
- GPU Temperature - Core 7 - Critical
5.2 イベントの詳細確認
各イベントをクリックすると、以下の設定が確認できます:
Name: GPU Temperature - Core 0 - Critical
Description: GPU Core 0 の温度が 70°C以上になった場合に通知
Entity Type: OTel Dcgm
Status: Active
Condition:
Source: Built-in metrics
Entity type: OTel dcgm
Time window: 60 s
Metric: Availability > DCGM GPU TEMP
Matching operator: is
GPU Core: 0
Aggregation: max
Operator: >=
Count: 70
Scope:
All available entities
トラブルシューティング
エラー1: HTTP 405 Method Not Allowed
症状:
{"code":405,"message":"HTTP 405 Method Not Allowed"}
原因: エンドポイント URL が間違っている
解決策:
# 正しいエンドポイント
POST /api/events/settings/event-specifications/custom
# 間違い(Built-in Events用のエンドポイント)
POST /api/events/settings/event-specifications/built-in
エラー2: Unknown entity type
症状:
{"errors":["Unknown entity type: otelDcgm"]}
原因: Entity Type の表記が間違っている
解決策:
# 間違い
"entityType": "otelDcgm" # 全小文字
# 正しい
"entityType": "oTelDcgm" # 小文字o + 大文字T + 小文字el + 大文字Dcgm
確認コマンド:
curl -X GET \
"https://YOUR_INSTANA_URL/api/infrastructure-monitoring/catalog/plugins" \
-H "Authorization: apiToken YOUR_API_TOKEN" \
| jq '.[] | select(.label | contains("GPU"))'
エラー3: aggregation が sum になっている
症状:
アラートが常に発火する
原因:
{
"aggregation": "sum" // ← 間違い
}
解決策:
{
"aggregation": "max" // ← 正しい
}
まとめ
達成したこと:
- Instana API を使って NVIDIA GPU の数に応じた温度監視アラートを自動作成
- 正しい Entity Type (
oTelDcgm) の特定方法を習得 - Metric Pattern を使って各 GPU を個別に監視
- aggregation: max の重要性を理解
- スクリプト化により、GPU 数に関わらず短時間で全アラートを作成(検証環境では 8 GPU に対して約 12 秒)
重要なポイント:
- Entity Type:
oTelDcgm(小文字のo+ 大文字のT) - Metric Pattern: GPU 番号を動的に指定
-
aggregation:
max(必須設定) - Threshold: 70°C(推奨)
汎用性:
-
GPU_COUNT変数を変更するだけで、任意の GPU 数に対応可能 - 4 GPU、8 GPU、16 GPU など、様々な構成で利用可能
次のステップ:
- Alert Channel の設定(Slack/Email 通知)
- GPU 負荷テストによるアラート発火の確認
- 他のメトリクス(GPU 使用率、電力、メモリ)の監視追加
参考リンク: