

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 建立自訂 SageMaker HyperPod 叢集指標
<a name="hyperpod-observability-addon-custom-metrics"></a>

Amazon SageMaker HyperPod (SageMaker HyperPod) 可觀測性附加元件提供數百個開箱即用的運作狀態、效能和效率指標。除了這些指標之外，您可能需要監控應用程式特定的自訂指標，或是預設指標未擷取的業務需求，例如模型特定的效能指標、資料處理統計資料或應用程式特定的測量。若要解決此需求，您可以使用 OpenTelemetry 實作自訂指標收集，方法是將 Python 程式碼片段整合到您的應用程式。

若要建立自訂指標，請先執行下列 Shell 命令，安裝檢測 Python 應用程式以取得可觀測性所需的核心 OpenTelemetry 元件。此安裝可讓在 SageMaker HyperPod 叢集上執行的 Python 應用程式發出自訂遙測資料。該資料由 OpenTelemetry 收集器收集並轉送至可觀測性基礎設施。

```
pip install opentelemetry-api opentelemetry-sdk opentelemetry-exporter-otlp-proto-grpc
```

下列範例指令碼會設定 OpenTelemetry 指標管道，自動使用 Pod 和節點資訊標記指標，確保叢集內的適當屬性，並每秒將這些指標傳送至 SageMaker HyperPod 內建可觀測性堆疊。指令碼會建立與 SageMaker HyperPod 指標收集器的連線、設定適當的資源屬性以進行識別，並提供一個計量介面，您可以透過此介面建立各種類型的指標 (計數器、儀器或直方圖)，以追蹤應用程式效能的任何層面。自訂指標會與 SageMaker HyperPod 監控儀表板以及系統指標整合。此整合允許透過單一介面取得全面的可觀測性，您可以在其中建立自訂警示、視覺化和報告，以監控工作負載的完整效能設定檔。

```
import os
from opentelemetry import metrics
from opentelemetry.exporter.otlp.proto.grpc.metric_exporter import OTLPMetricExporter
from opentelemetry.sdk.metrics import MeterProvider
from opentelemetry.sdk.metrics.export import PeriodicExportingMetricReader
from opentelemetry.sdk.resources import Resource

# Get hostname/pod name
hostname = os.uname()[1]
node_name = os.getenv('NODE_NAME', 'unknown')

collector_endpoint = "hyperpod-otel-collector.hyperpod-observability:4317"

# Configure the OTLP exporter
exporter = OTLPMetricExporter(
    endpoint=collector_endpoint,
    insecure=True,
    timeout=5000  # 5 seconds timeout
)

reader = PeriodicExportingMetricReader(
    exporter,
    export_interval_millis=1000
)

resource = Resource.create({
    "service.name": "metric-test",
    "pod.name": hostname,
    "node.name": node_name
})

meter_provider = MeterProvider(
    metric_readers=[reader],
    resource=resource
)
metrics.set_meter_provider(meter_provider)

# Create a meter
meter = metrics.get_meter("test-meter")

# Create a counter
counter = meter.create_counter(
    name="test.counter",
    description="A test counter"
)

counter.add(1, {"pod": hostname, "node": node_name})
```