

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

Amazon Lambda 遥测 API 架构在语义上与 OpenTelemetry（OTel）兼容。这意味着您可以将 Amazon 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` 代表来自遥测源的事件。

**映射 \*Start 事件**


| OpenTelemetry | Lambda 遥测 API 架构 | 
| --- | --- | 
| `Span.Name` | 扩展根据 `type` 字段生成此值。 | 
| `Span.StartTime` | 使用 `e.time`。 | 
| `Span.EndTime` | 不适用，因为事件尚未完成。 | 
| `Span.Kind` | 设置为 `Server`。 | 
| `Span.Status` | 设置为 `Unset`。 | 
| `Span.TraceId` | 解析 `e.tracing.value` 中找到的 Amazon 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` | 扩展可以在此处添加任何自定义值。 | 

**映射 \*RuntimeDone 事件**


| OpenTelemetry | Lambda 遥测 API 架构 | 
| --- | --- | 
| `Span.Name` | 扩展根据 `type` 字段生成此值。 | 
| `Span.StartTime` | 使用匹配 `*Start` 事件中的 `e.time`。<br />或者，请使用 `e.time - e.metrics.durationMs`。 | 
| `Span.EndTime` | 不适用，因为事件尚未完成。 | 
| `Span.Kind` | 设置为 `Server`。 | 
| `Span.Status` | 如果 `e.status` 不等于 `success`，则设置为 `Error`。<br />否则，设置为 `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` 中找到的 Amazon 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` | 扩展可以在此处添加任何自定义值。 | 

**映射 \*Report 事件**


| OpenTelemetry | Lambda 遥测 API 架构 | 
| --- | --- | 
| `Span.Name` | 扩展根据 `type` 字段生成此值。 | 
| `Span.StartTime` | 使用匹配 `*Start` 事件中的 `e.time`。<br />或者，请使用 `e.time - e.metrics.durationMs`。 | 
| `Span.EndTime` | 使用 `e.time`。 | 
| `Span.Kind` | 设置为 `Server`。 | 
| `Span.Status` | 使用与 `*RuntimeDone` 事件相同的值。 | 
| `Span.TraceId` | 解析 `e.tracing.value` 中找到的 Amazon 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` 代表来自遥测源的事件。

**映射 \*RuntimeDone 事件**


| OpenTelemetry | Lambda 遥测 API 架构 | 
| --- | --- | 
| `Span.Name` | 扩展根据 `type` 字段生成此值。 | 
| `Span.StartTime` | 使用匹配 `*Start` 事件中的 `e.time`。<br />或者，请使用 `e.time - e.metrics.durationMs`。 | 
| `Span.EndTime` | 不适用，因为事件尚未完成。 | 
| `Span.Kind` | 设置为 `Server`。 | 
| `Span.Status` | 如果 `e.status` 不等于 `success`，则设置为 `Error`。<br />否则，设置为 `Ok`。 | 
| `Span.TraceId` | 解析 `e.tracing.value` 中找到的 Amazon 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` 一样。 | 