0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Instana で NVIDIA GPU の温度監視アラートを API で自動作成する

Last updated at Posted at 2025-11-30

はじめに

本記事では、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"
  }
}
  • metricNamenull に設定
  • metricPattern で GPU 番号を動的に指定

aggregation: max の設定:

{
  "aggregation": "max"
}
  • 必須設定
  • sumavg は使用しない

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 での確認

  1. Instana UI にログイン
  2. Settings (歯車アイコン) → Events
  3. 検索ボックスに 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 使用率、電力、メモリ)の監視追加

参考リンク:

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?