

# Application Signals 收集的指标
<a name="AppSignals-MetricsCollected"></a>

Application Signals 会从为其启用的应用程序收集[标准应用程序指标](#AppSignals-StandardMetrics)和[运行时指标](#AppSignals-StandardMetrics)。

标准应用程序指标与服务性能、延迟和可用性中最关键的部分相关。

运行时指标会跟踪应用程序随时间变化的指标，包括内存使用情况、CPU 使用情况和垃圾回收。Application Signals 显示为 Application Signals 启用的服务上下文中的运行时指标。遇到操作问题时，观察运行时指标有助于您找到问题的根本原因。例如，可以查看服务中的延迟峰值是否与运行时指标的峰值有关。

**Topics**
+ [收集的标准应用程序指标](#AppSignals-StandardMetrics)
+ [运行时指标](#AppSignals-RuntimeMetrics)
+ [禁用运行时指标的收集](#AppSignals-RuntimeMetrics-Disable)

## 收集的标准应用程序指标
<a name="AppSignals-StandardMetrics"></a>

Application Signals 从其发现的服务中收集*标准应用程序指标*。这些指标与服务性能中最关键的方面有关：延迟、故障和错误。这些指标可以帮助您识别问题、监控性能趋势并优化资源以改善整体用户体验。

下表列出了 Application Signals 收集的指标。这些指标被发送到 `ApplicationSignals` 命名空间中的 CloudWatch。


| 指标 | 说明 | 
| --- | --- | 
|  `Latency`  |  请求发出后、数据传输开始前的延迟。 单位：毫秒 | 
|  `Fault`  |  HTTP 5XX 服务器端故障和 OpenTelemetry 跨度状态错误的计数。 单位：无 | 
|  `Error`  |  HTTP 4XX 客户端错误的计数。这些错误被视为不是由服务问题引起的请求错误。因此，Application Signals 控制面板上显示的 `Availability` 指标不会将这些错误视为服务故障。 单位：无 | 

Application Signals 控制面板上显示的 `Availability` 指标的计算公式为 **（1 - `Faults`/总数）\$1100**。回复总数包括所有回复，并源自 `SampleCount(Latency)`。成功响应是指没有 `5XX` 错误的所有响应。当 Application Signals 计算 `Availability` 时，`4XX` 响应会被视为成功响应。

### 收集的维度和维度组合
<a name="AppSignals-StandardMetrics-Dimensions"></a>

为每个标准应用程序指标定义了以下维度。有关维度的更多信息，请参阅 [Dimensions](cloudwatch_concepts.md#Dimension)。

为*服务指标*和*依赖项指标*收集不同的维度。在 Application Signals 发现的服务中，当微服务 A 调用微服务 B 时，微服务 B 正在处理请求。在这种情况下，微服务 A 发出依赖项指标，微服务 B 发出服务指标。当客户端调用微服务 A 时，微服务 A 正在处理请求并发出服务指标。

**服务指标的维度**

为服务指标收集以下维度。


| 维度 | 说明 | 
| --- | --- | 
|  `Service`  |   服务的名称。 最大值为 255 个字符。  | 
|  `Operation`  |  API 操作或其他活动的名称。 最大值为 1024 个字符。仅当操作名称不超过 194 个字符时，您才能为操作设置服务级别目标。  | 
| `Environment` | 运行服务的环境的名称。如果服务未在 Amazon EKS 上运行，则可以在 `OTEL_ATTRIBUTE_RESOURCES` 参数中为 `deployment.environment` 指定可选的自定义值。 最大值为 259 个字符。 | 

当您在 CloudWatch 控制台中查看这些指标时，可以使用以下维度组合进行查看：
+ `[Environment, Service, Operation, [Latency, Error, Fault]]`
+ `[Environment, Service, [Latency, Error, Fault]]`

**依赖项指标的维度**

为依赖项指标收集以下维度：


| 维度 | 说明 | 
| --- | --- | 
|  `Service`  |   服务的名称。 最大值为 255 个字符。  | 
|  `Operation`  |  API 操作或其他操作的名称。 最大值为 1024 个字符。  | 
|  `RemoteService`  |  所调用远程服务的名称。 最大值为 255 个字符。  | 
|  `RemoteOperation`  |  所调用 API 操作的名称。 最大值为 1024 个字符。  | 
|  `Environment`  | 运行服务的环境的名称。如果服务未在 Amazon EKS 上运行，则可以在 `OTEL_ATTRIBUTE_RESOURCES` 参数中为 `deployment.environment` 指定可选的自定义值。 最大值为 259 个字符。 | 
|  `RemoteEnvironment`  |  运行依赖项服务的环境的名称。当服务调用依赖项并且它们都在同一集群中运行时，会自动生成 `RemoteEnvironment` 参数。否则，不会生成 `RemoteEnvironment`，也不会在服务依赖项的指标中报告该参数。目前仅在 Amazon EKS 和 K8S 平台上可用。 最大值为 259 个字符。  | 
|  `RemoteResourceIdentifier`  |  远程调用所调用资源的名称。如果服务调用远程 AWS 服务，则会自动生成 `RemoteResourceIdentifier` 参数。否则，不会生成 `RemoteResourceIdentifier`，也不会在服务依赖项的指标中报告该参数。 最大值为 1024 个字符。  | 
|  `RemoteResourceType`  |  远程调用所调用资源的类型。仅在定义 `RemoteResourceIdentifier` 时需要。 最大值为 1024 个字符。  | 

当您在 CloudWatch 控制台中查看这些指标时，可以使用以下维度组合进行查看：

**在 Amazon EKS 集群上运行**
+ `[Environment, Service, Operation, RemoteService, RemoteOperation, RemoteEnvironment, RemoteResourceIdentifier, RemoteResourceType, [Latency, Error, Fault]]`
+ `[Environment, Service, Operation, RemoteService, RemoteOperation, RemoteEnvironment, [Latency, Error, Fault]]`
+ `[Environment, Service, Operation, RemoteService, RemoteOperation, RemoteResourceIdentifier, RemoteResourceType, [Latency, Error, Fault]]`
+ `[Environment, Service, Operation, RemoteService, RemoteOperation, [Latency, Error, Fault]]`
+ `[Environment, Service, RemoteService, RemoteEnvironment, [Latency, Error, Fault]]`
+ `[Environment, Service, RemoteService, [Latency, Error, Fault]]`
+ `[Environment, Service, RemoteService, RemoteOperation, RemoteEnvironment, RemoteResourceIdentifier, RemoteResourceType, [Latency, Error, Fault]]`
+ `[Environment, Service, RemoteService, RemoteOperation, RemoteEnvironment, [Latency, Error, Fault]]`
+ `[Environment, Service, RemoteService, RemoteOperation, RemoteResourceIdentifier, RemoteResourceType, [Latency, Error, Fault]]`
+ `[Environment, Service, RemoteService, RemoteOperation, [Latency, Error, Fault]]`
+ `[RemoteService [Latency, Error, Fault]]` 
+ `[RemoteService, RemoteResourceIdentifier, RemoteResourceType [Latency, Error, Fault]]`

## 运行时指标
<a name="AppSignals-RuntimeMetrics"></a>

Application Signals 使用 AWS Distro for OpenTelemetry SDK 从 Java 和 Python 应用程序中自动收集与 OpenTelemetry 兼容的指标。要收集运行时指标，必须满足以下先决条件：
+ CloudWatch 代理必须是版本 `1.300049.1` 或更高版本。
+ 如果使用 Amazon CloudWatch 可观测性 EKS 附加组件，其必须是版本 `2.30-eksbuild.1` 或更高版本。如果更新附加组件，则必须重新启动应用程序。
+ 对于 Java 应用程序，必须运行适用于 Java 的 AWS Distro for OpenTelemetry SDK `1.32.5` 版本或更高版本。
+ 对于 Python 应用程序，必须运行适用于 Python 的 AWS Distro for OpenTelemetry SDK `0.7.0` 版本或更高版本。
+ 对于 .Net 应用程序，必须运行适用于 .Net 的 AWS Distro for OpenTelemetry SDK `1.6.0` 版本或更高版本。

不收集 Node.js 应用程序的运行时指标。

运行时间指标作为 Application Signals 费用的一部分收费。有关 CloudWatch 定价的信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing)。

**注意**  
**已知问题**  
众所周知，Java SDK 版本 v1.32.5 中的运行时指标收集不适用于使用 JBoss Wildfly 的应用程序。此问题扩展到 Amazon CloudWatch 可观测性 EKS 附加组件，影响版本 `2.3.0-eksbuild.1` 至 `2.6.0-eksbuild.1`。该问题已在 Java SDK 版本 `v1.32.6` 和 Amazon CloudWatch Observability EKS 附加组件版本 `v3.0.0-eksbuild.1` 中修复。  
如果您受到影响，请升级 Java SDK 版本或通过向应用程序添加环境变量 `OTEL_AWS_APPLICATION_SIGNALS_RUNTIME_ENABLED=false` 来禁用运行时指标收集。

### Java 运行时指标
<a name="AppSignals-RuntimeMetrics-JVM"></a>

对于启用了 Application Signals 的 Java 应用程序，Application Signals 从其中收集以下 JVM 指标。所有运行时指标都将发送到 `ApplicationSignals` 命名空间中的 CloudWatch，并使用 `Service` 和 `Environment` 维度集进行收集。


| 指标名称 | 说明 | 有意义的统计数据 | 
| --- | --- | --- | 
|  `JVMGCDuration` |  JVM 垃圾回收操作持续时间的聚合指标。 单位：毫秒  | 总和、平均值、最小值、最大值 | 
|  `JVMGCOldGenDuration` |  旧一代 JVM 垃圾回收操作持续时间的聚合指标。仅在 G1 中可用。 单位：毫秒  | 总和、平均值、最小值、最大值 | 
|  `JVMGCYoungGenDuration` |  新一代 JVM 垃圾回收操作持续时间的聚合指标。仅在 G1 中可用。 单位：毫秒  | 总和、平均值、最小值、最大值 | 
|  `JVMGCCount` |  JVM 垃圾回收操作数的聚合指标。 单位：无  | 总和、平均值、最小值、最大值 | 
|  `JVMGCOldGenCount` |  旧一代 JVM 垃圾回收操作数的聚合指标。仅在 G1 中可用。 单位：无  | 总和、平均值、最小值、最大值 | 
|  `JVMGCYoungGenCount` |  新一代 JVM 垃圾回收操作数的聚合指标。仅在 G1 中可用。 单位：无  | 总和、平均值、最小值、最大值 | 
|  `JVMMemoryHeapUsed` |  使用的内存堆量。 单位：字节  | 平均值、最小值、最大值 | 
|  `JVMMemoryUsedAfterLastGC` |  已使用的内存量，在此池上最近的垃圾回收事件之后测量所得。 单位：字节  | 平均值、最小值、最大值 | 
|  `JVMMemoryOldGenUsed` |  旧一代使用的内存量。 单位：字节  | 平均值、最小值、最大值 | 
|  `JVMMemorySurvivorSpaceUsed` |  幸存空间使用的内存堆量。 单位：字节  | 平均值、最小值、最大值 | 
|  `JVMMemoryEdenSpaceUsed` |  Eden 空间使用的内存量。 单位：字节  | 平均值、最小值、最大值 | 
|  `JVMMemoryNonHeapUsed` |  使用的非内存堆量。 单位：字节  | 平均值、最小值、最大值 | 
|  `JVMThreadCount` |  正在执行的线程数，包括进程守护程序线程和非进程守护程序线程。 单位：无  | 总和、平均值、最小值、最大值 | 
|  `JVMClassLoaded` |  加载的类数量。 单位：无  | 总和、平均值、最小值、最大值 | 
|  `JVMCpuTime` |  JVM 报告的进程使用的 CPU 时间。 单位：无（纳秒）  | 总和、平均值、最小值、最大值 | 
|  `JVMCpuRecentUtilization` |  JVM 所报告的进程最近使用的 CPU。 单位：无  | 平均值、最小值、最大值 | 

### Python 运行时指标
<a name="AppSignals-RuntimeMetrics-Python"></a>

对于启用了 Application Signals 的 Python 应用程序，Application Signals 从其中收集以下指标。所有运行时指标都将发送到 `ApplicationSignals` 命名空间中的 CloudWatch，并使用 `Service` 和 `Environment` 维度集进行收集。


| 指标名称 | 说明 | 有意义的统计数据 | 
| --- | --- | --- | 
|  `PythonProcessGCCount` |  当前正在跟踪的对象总数。 单位：无  | 总和、平均值、最小值、最大值 | 
|  `PythonProcessGCGen0Count` |  当前正在第 0 代中跟踪的对象总数。 单位：无  | 总和、平均值、最小值、最大值 | 
|  `PythonProcessGCGen1Count` |  当前正在第 1 代中跟踪的对象总数。 单位：无  | 总和、平均值、最小值、最大值 | 
|  `PythonProcessGCGen2Count` |  当前正在第 2 代中跟踪的对象总数。 单位：无  | 总和、平均值、最小值、最大值 | 
|  `PythonProcessVMSMemoryUsed` |  进程使用的虚拟内存总量。 单位：字节  | 平均值、最小值、最大值 | 
|  `PythonProcessRSSMemoryUsed` |  进程使用的非交换物理内存总量。 单位：字节  | 平均值、最小值、最大值 | 
|  `PythonProcessThreadCount` |  进程当前使用的线程数。 单位：无  | 总和、平均值、最小值、最大值 | 
|  `PythonProcessCpuTime` |  进程使用的 CPU 时间。 单位：秒  | 总和、平均值、最小值、最大值 | 
|  `PythonProcessCpuUtilization` |  进程的 CPU 使用率。 单位：无  | 平均值、最小值、最大值 | 

### .Net 运行时指标
<a name="AppSignals-RuntimeMetrics-Python"></a>

对于启用了 Application Signals 的 .Net 应用程序，Application Signals 从其中收集以下指标。所有运行时指标都将发送到 `ApplicationSignals` 命名空间中的 CloudWatch，并使用 `Service` 和 `Environment` 维度集进行收集。


| 指标名称 | 说明 | 有意义的统计数据 | 
| --- | --- | --- | 
|  `DotNetGCGen0Count` |  自进程启动以来，在第 0 代中跟踪的垃圾回收指标的总数。 单位：无  | 总和、平均值、最小值、最大值 | 
|  `DotNetGCGen1Count` |  自进程启动以来，在第 1 代中跟踪的垃圾回收指标的总数。 单位：无  | 总和、平均值、最小值、最大值 | 
|  `DotNetGCGen2Count` |  自进程启动以来，在第 2 代中跟踪的垃圾回收指标的总数。 单位：无  | 总和、平均值、最小值、最大值 | 
|  `DotNetGCDuration` |  自进程启动以来，垃圾回收暂停的总时间。 单位：无  | 总和、平均值、最小值、最大值 | 
|  `DotNetGCGen0HeapSize` |  在最近的垃圾回收期间观察到的第 0 代的堆大小（包括碎片）。 此指标仅在第一次垃圾回收完成后可用。 单位：字节  | 平均值、最小值、最大值 | 
|  `DotNetGCGen1HeapSize` |  在最近的垃圾回收期间观察到的第 1 代的堆大小（包括碎片）。 此指标仅在第一次垃圾回收完成后可用。 单位：字节  | 平均值、最小值、最大值 | 
|  `DotNetGCGen2HeapSize` |  在最近的垃圾回收期间观察到的第 2 代的堆大小（包括碎片）。 此指标仅在第一次垃圾回收完成后可用。 单位：字节  | 平均值、最小值、最大值 | 
|  `DotNetGCLOHHeapSize` |  在最近的垃圾回收期间观察到的大型对象堆大小（包括碎片）。 此指标仅在第一次垃圾回收完成后可用。 单位：字节  | 平均值、最小值、最大值 | 
|  `DotNetGCPOHHeapSize` |  在最近的垃圾回收期间观察到的固定对象堆大小（包括碎片）。 此指标仅在第一次垃圾回收完成后可用。 单位：字节  | 平均值、最小值、最大值 | 
|  `DotNetThreadCount` |  当前存在的线程池线程数。 单位：无  | 平均值、最小值、最大值 | 
|  `DotNetThreadQueueLength` |  当前排队等待线程池处理的工作项数量。 单位：无  | 平均值、最小值、最大值 | 

## 禁用运行时指标的收集
<a name="AppSignals-RuntimeMetrics-Disable"></a>

对于启用了 Application Signals 的 Java 和 Python 应用程序，默认收集运行时指标。如果想要禁用这些指标的收集，请按照本节中针对您环境的说明执行操作。

### Amazon EKS
<a name="AppSignals-RuntimeMetrics-Disable-EKS"></a>

要在应用程序级别禁用 Amazon EKS 应用程序中的运行时指标，请将以下环境变量添加到工作负载规范中。

```
env:
    - name: OTEL_AWS_APPLICATION_SIGNALS_RUNTIME_ENABLED 
      value: "false"
```

要在集群级别禁用 Amazon EKS 应用程序中的运行时指标，请将该配置应用于 Amazon CloudWatch 可观测性 EKS 附加组件的高级配置。

```
{
  "agent": {
    "config": {
      "traces": {
        "traces_collected": {
          "application_signals": {
            
          }
        }
      },
      "logs": {
        "metrics_collected": {
          "application_signals": {
            
          }
        }
      }
    },
    "manager": {
      "autoInstrumentationConfiguration": {
        "java": {
          "runtime_metrics": {
            "enabled": false
          }
        },
        "python": {
          "runtime_metrics": {
            "enabled": false
          }
        },
        "dotnet": {
          "runtime_metrics": {
            "enabled": false
          }
        }
      }
    }
  }
}
```

### Amazon ECS
<a name="AppSignals-RuntimeMetrics-Disable-ECS"></a>

要禁用 Amazon ECS 应用程序中的运行时指标，请在新的任务定义修订中添加环境变量 `OTEL_AWS_APPLICATION_SIGNALS_RUNTIME_ENABLED=false` 并重新部署应用程序。

### EC2
<a name="AppSignals-RuntimeMetrics-Disable-EC2"></a>

要禁用 Amazon EC2 应用程序中的运行时指标，请在应用程序启动之前添加环境变量 `OTEL_AWS_APPLICATION_SIGNALS_RUNTIME_ENABLED=false`。

### Kubernetes
<a name="AppSignals-RuntimeMetrics-Disable-Kubernetes"></a>

要在应用程序级别禁用 Kubernetes 应用程序中的运行时指标，请将以下环境变量添加到工作负载规范中。

```
env:
    - name: OTEL_AWS_APPLICATION_SIGNALS_RUNTIME_ENABLED 
      value: "false"
```

要在集群级别禁用 Kubernetes 应用程序中的运行时指标，请使用以下命令：

```
helm upgrade ... \
--set-string manager.autoInstrumentationConfiguration.java.runtime_metrics.enabled=false \
--set-string manager.autoInstrumentationConfiguration.python.runtime_metrics.enabled=false \
-\-set-string manager.autoInstrumentationConfiguration.dotnet.runtime_metrics.enabled=false
```