

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 创建自定义 SageMaker HyperPod 集群指标
<a name="hyperpod-observability-addon-custom-metrics"></a>

Amazon SageMaker HyperPod (SageMaker HyperPod) 可观察性附加组件提供了数百个运行状况、性能和效率指标 out-of-the-box。除上述指标外，您可能还需要监控一些默认指标未涵盖的、特定于应用程序或业务需求的自定义指标，例如模型特定的性能指标、数据处理统计数据或应用程序特定的测量值。为了满足这一需求，你可以 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})
```