

# 将 Lambda 遥测 API `Event` 对象转换为 OpenTelemetry 跨度
<a name="telemetry-otel-spans"></a>

AWS Lambda 遥测 API 架构在语义上与 OpenTelemetry（OTel）兼容。这意味着您可以将 AWS Lambda 遥测 API `Event` 对象转换为 OpenTelemetry（OTel）跨度。转换时，不应将单个 `Event` 对象映射到单个 OTel 跨度。相反，您应该在单个 OTel 跨度中呈现与生命周期阶段相关的所有三个事件。例如，`start`、`runtimeDone` 和 `runtimeReport` 事件代表单个函数调用。将所有这三项事件作为单个 OTel 跨度呈现。

您可以使用跨度事件或子（嵌套）跨度来转换事件。此页面上的表格描述了两种方法的遥测 API 架构属性和 OTel 跨度属性之间的映射。有关 OTel 跨度的更多信息，请参阅 OpenTelemetry Docs 网站 **Tracing API**（跟踪 API）页面上的 [Span](https://opentelemetry.io/docs/reference/specification/trace/api/#span)（跨度）。

**Topics**
+ [使用 Span 事件映射到 OTel 跨度](#telemetry-otel-span-events)
+ [使用子跨度映射到 OTel 跨度](#telemetry-otel-child-spans)

## 使用 Span 事件映射到 OTel 跨度
<a name="telemetry-otel-span-events"></a>

在下表中，`e` 代表来自遥测源的事件。

**映射 \$1Start 事件**


| OpenTelemetry | Lambda 遥测 API 架构 | 
| --- | --- | 
|  `Span.Name`  |  扩展根据 `type` 字段生成此值。  | 
|  `Span.StartTime`  |  使用 `e.time`。  | 
|  `Span.EndTime`  |  不适用，因为事件尚未完成。  | 
|  `Span.Kind`  |  设置为 `Server`。  | 
|  `Span.Status`  |  设置为 `Unset`。  | 
|  `Span.TraceId`  |  解析 `e.tracing.value` 中找到的 AWS X-Ray 标头，然后使用 `TraceId` 值。  | 
|  `Span.ParentId`  |  解析 `e.tracing.value` 中找到的 X-Ray 标头，然后使用 `Parent` 值。  | 
|  `Span.SpanId`  |  如果可用，请使用 `e.tracing.spanId`。否则，生成一个新的 `SpanId`。  | 
|  `Span.SpanContext.TraceState`  |  X-Ray 跟踪上下文不适用。  | 
|  `Span.SpanContext.TraceFlags`  |  解析 `e.tracing.value` 中找到的 X-Ray 标头，然后使用 `Sampled` 值。  | 
|  `Span.Attributes`  |  扩展可以在此处添加任何自定义值。  | 

**映射 \$1RuntimeDone 事件**


| OpenTelemetry | Lambda 遥测 API 架构 | 
| --- | --- | 
|  `Span.Name`  |  扩展根据 `type` 字段生成此值。  | 
|  `Span.StartTime`  |  使用匹配 `*Start` 事件中的 `e.time`。 或者，请使用 `e.time - e.metrics.durationMs`。  | 
|  `Span.EndTime`  |  不适用，因为事件尚未完成。  | 
|  `Span.Kind`  |  设置为 `Server`。  | 
|  `Span.Status`  |  如果 `e.status` 不等于 `success`，则设置为 `Error`。 否则，设置为 `Ok`。  | 
|  `Span.Events[]`  |  使用 `e.spans[]`。  | 
|  `Span.Events[i].Name`  |  使用 `e.spans[i].name`。  | 
|  `Span.Events[i].Time`  |  使用 `e.spans[i].start`。  | 
|  `Span.TraceId`  |  解析 `e.tracing.value` 中找到的 AWS X-Ray 标头，然后使用 `TraceId` 值。  | 
|  `Span.ParentId`  |  解析 `e.tracing.value` 中找到的 X-Ray 标头，然后使用 `Parent` 值。  | 
|  `Span.SpanId`  |  使用 `*Start` 事件中的相同 `SpanId`。如果不可用，则使用 `e.tracing.spanId` 或生成一个新的 `SpanId`。  | 
|  `Span.SpanContext.TraceState`  |  X-Ray 跟踪上下文不适用。  | 
|  `Span.SpanContext.TraceFlags`  |  解析 `e.tracing.value` 中找到的 X-Ray 标头，然后使用 `Sampled` 值。  | 
|  `Span.Attributes`  |  扩展可以在此处添加任何自定义值。  | 

**映射 \$1Report 事件**


| OpenTelemetry | Lambda 遥测 API 架构 | 
| --- | --- | 
|  `Span.Name`  |  扩展根据 `type` 字段生成此值。  | 
|  `Span.StartTime`  |  使用匹配 `*Start` 事件中的 `e.time`。 或者，请使用 `e.time - e.metrics.durationMs`。  | 
|  `Span.EndTime`  |  使用 `e.time`。  | 
|  `Span.Kind`  |  设置为 `Server`。  | 
|  `Span.Status`  |  使用与 `*RuntimeDone` 事件相同的值。  | 
|  `Span.TraceId`  |  解析 `e.tracing.value` 中找到的 AWS X-Ray 标头，然后使用 `TraceId` 值。  | 
|  `Span.ParentId`  |  解析 `e.tracing.value` 中找到的 X-Ray 标头，然后使用 `Parent` 值。  | 
|  `Span.SpanId`  |  使用 `*Start` 事件中的相同 `SpanId`。如果不可用，则使用 `e.tracing.spanId` 或生成一个新的 `SpanId`。  | 
|  `Span.SpanContext.TraceState`  |  X-Ray 跟踪上下文不适用。  | 
|  `Span.SpanContext.TraceFlags`  |  解析 `e.tracing.value` 中找到的 X-Ray 标头，然后使用 `Sampled` 值。  | 
|  `Span.Attributes`  |  扩展可以在此处添加任何自定义值。  | 

## 使用子跨度映射到 OTel 跨度
<a name="telemetry-otel-child-spans"></a>

下表描述了如何将 Lambda 遥测 API 事件转换为带 `*RuntimeDone` 跨度子（嵌套）跨度的 OTel 跨度。对于 `*Start` 和 `*Report` 映射，请参阅 [使用 Span 事件映射到 OTel 跨度](#telemetry-otel-span-events) 中的表，因为它们与子跨度相同。在此表中，`e` 代表来自遥测源的事件。

**映射 \$1RuntimeDone 事件**


| OpenTelemetry | Lambda 遥测 API 架构 | 
| --- | --- | 
|  `Span.Name`  |  扩展根据 `type` 字段生成此值。  | 
|  `Span.StartTime`  |  使用匹配 `*Start` 事件中的 `e.time`。 或者，请使用 `e.time - e.metrics.durationMs`。  | 
|  `Span.EndTime`  |  不适用，因为事件尚未完成。  | 
|  `Span.Kind`  |  设置为 `Server`。  | 
|  `Span.Status`  |  如果 `e.status` 不等于 `success`，则设置为 `Error`。 否则，设置为 `Ok`。  | 
|  `Span.TraceId`  |  解析 `e.tracing.value` 中找到的 AWS X-Ray 标头，然后使用 `TraceId` 值。  | 
|  `Span.ParentId`  |  解析 `e.tracing.value` 中找到的 X-Ray 标头，然后使用 `Parent` 值。  | 
|  `Span.SpanId`  |  使用 `*Start` 事件中的相同 `SpanId`。如果不可用，则使用 `e.tracing.spanId` 或生成一个新的 `SpanId`。  | 
|  `Span.SpanContext.TraceState`  |  X-Ray 跟踪上下文不适用。  | 
|  `Span.SpanContext.TraceFlags`  |  解析 `e.tracing.value` 中找到的 X-Ray 标头，然后使用 `Sampled` 值。  | 
|  `Span.Attributes`  |  扩展可以在此处添加任何自定义值。  | 
|  `ChildSpan[i].Name`  |  使用 `e.spans[i].name`。  | 
|  `ChildSpan[i].StartTime`  |  使用 `e.spans[i].start`。  | 
|  `ChildSpan[i].EndTime`  |  使用 `e.spans[i].start + e.spans[i].durations`。  | 
|  `ChildSpan[i].Kind`  |  与父 `Span.Kind` 一样。  | 
|  `ChildSpan[i].Status`  |  与父 `Span.Status` 一样。  | 
|  `ChildSpan[i].TraceId`  |  与父 `Span.TraceId` 一样。  | 
|  `ChildSpan[i].ParentId`  |  使用父 `Span.SpanId`。  | 
|  `ChildSpan[i].SpanId`  |  生成新的 `SpanId`。  | 
|  `ChildSpan[i].SpanContext.TraceState`  |  X-Ray 跟踪上下文不适用。  | 
|  `ChildSpan[i].SpanContext.TraceFlags`  |  与父 `Span.SpanContext.TraceFlags` 一样。  | 