本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。

自动为 NodeJS Lambda 进行自动仪表化

简介

本文档指导您通过 OpenTelemetry 自动为 NodeJS Lambda 函数进行自动仪表化。自动仪表化简化了为您的 Lambda 函数添加可观测性的过程,通过自动捕获性能指标和追踪信息。

先决条件

在开始之前,请确保您具备以下条件:

  • *AWS Lambda 函数:*您想要仪表化的函数。

  • *OpenTelemetry SDK:*已安装在您的 Lambda 函数中。

  • *OpenTelemetry Collector:*已部署并配置。

  • *SUSE Observability:*一个与 SUSE Observability 相关的账户,您将在其中发送遥测数据。

  • *Memory(内存):*足够的内存以运行 Lambda,包括仪表化。

由环境提供的值

OpenTelemetry 依赖于各种配置值以正确运行。这些值控制数据收集、导出和与后端系统的通信等方面。为了使您的 OpenTelemetry 部署灵活且适应不同环境,您可以通过环境变量提供这些设置。这种方法提供了几个好处:

  • *动态配置:*轻松调整设置而无需更改代码。

  • *环境特定设置:*为开发、测试和生产配置 OpenTelemetry。

  • *秘密管理:*安全存储敏感信息,如 API 密钥。

对于本文档中描述的 OpenTelemetry 设置,您需要定义以下环境变量:

  • *VERBOSITY:*控制 OpenTelemetry 日志的详细程度。

  • *OTLP_API_KEY:*验证您的 Lambda 函数以将数据发送到 SUSE Observability。

  • *OTLP_ENDPOINT:*指定您的 SUSE Observability 实例的地址。

  • *OPENTELEMETRY_COLLECTOR_CONFIG_FILE:*指向 OpenTelemetry Collector 的配置文件。

  • *AWS_LAMBDA_EXEC_WRAPPER:*配置 Lambda 执行环境以使用 OpenTelemetry 处理程序。

  • *OTLP_INSTR_LAYER_ARN:*提供 OpenTelemetry 仪表化层的 ARN(亚马逊资源名称),该层添加了自动仪表化所需的组件。

  • *OTLP_COLLECTOR_LAYER_ARN:*提供 OpenTelemetry 收集器层的 ARN,该层负责接收、处理和导出遥测数据。

重要考虑事项:

  • GRPC 端点:OTLP_ENDPOINT 应指定您的 SUSE Observability 实例的 gRPC 端点,不带任何 httphttps 前缀。使用端口 443 进行安全通信。

  • *区域特定层:*Lambda 层是区域绑定的。确保您用于 OTLP_INSTR_LAYER_ARNOTLP_COLLECTOR_LAYER_ARN 的 ARN 与您的 Lambda 函数部署的 AWS 区域匹配。

  • *架构匹配:*OpenTelemetry Collector 层是特定于架构的。选择适合您 Lambda 函数架构的正确 ARN(例如,amd64arm64)。

完整示例:请注意,您需要输入自己的值。

VERBOSITY: "normal"
OTLP_API_KEY: "<your api key for sending data to SUSE Observability here>"
OTLP_ENDPOINT: "<your-dns-name-for-suse-observability-here>:443"
OPENTELEMETRY_COLLECTOR_CONFIG_FILE: "/var/task/collector.yaml"
AWS_LAMBDA_EXEC_WRAPPER: "/opt/otel-handler"
OTLP_INSTR_LAYER_ARN: "arn:aws:lambda:<aws-region>:184161586896:layer:opentelemetry-nodejs-0_11_0:1"
OTLP_COLLECTOR_LAYER_ARN: "arn:aws:lambda:<aws-region>:184161586896:layer:opentelemetry-collector-<amd64|arm64>-0_12_0:1"

collector.yaml 文件

OTEL 收集配置设置了如何分配收集到的数据。 这在放置在 src 目录中的 collector.yaml 文件中完成,那里可以找到 Lambda 文件。 以下是一个示例 collector.yaml 文件。

# collector.yaml in the root directory
# Set an environemnt variable 'OPENTELEMETRY_COLLECTOR_CONFIG_FILE' to
# '/var/task/collector.yaml'

receivers:
  otlp:
    protocols:
      grpc:
      http:

exporters:
  debug:
    verbosity: "${env:VERBOSITY}"
  otlp/stackstate:
    headers:
      Authorization: "SUSEObservability ${env:OTLP_API_KEY}"
    endpoint: "${env:OTLP_ENDPOINT}"

service:
  pipelines:
    traces:
      receivers: [otlp]
      exporters: [debug, otlp/stackstate]
      processors: []
    metrics:
      receivers: [otlp]
      exporters: [debug, otlp/stackstate]
      processors: []

请注意,此收集器用于将数据发送到下一个收集器,然后用于尾部采样、指标聚合等,然后再将数据发送到 SUSE Observability。第二个收集器也需要在客户的环境中运行。

根据所需的功能,或基于由以这种方式进行仪表化的 Lambda 生成的数据量等因素,可以设置收集器进行批处理、尾部采样和其他预处理技术,以减少对 SUSE Observability 的影响。

请遵循 入门指南 来设置收集器以将数据发送到 SUSE Observability。有关自定义收集器的配置(如采样、过滤等)的方法,请参阅我们的 收集器文档

AWS Lambda 与 OpenTelemetry 的仪表化

Package.json

确保将 "@opentelemetry/auto-instrumentations-node": "^0.55.2",+ 添加到 package.json 并执行 npm install 以将自动仪表化客户端库添加到您的 NodeJS Lambda。

查错

超时

如果添加 OTEL Lambda 层导致 Lambda 超时(检查日志可能表明收集器在仍然忙碌时被要求关闭,例如看到以下日志条目):

{
    "level": "info",
    "ts": 1736867469.2312617,
    "caller": "internal/retry_sender.go:126",
    "msg": "Exporting failed. Will retry the request after interval.",
    "kind": "exporter",
    "data_type": "traces",
    "name": "otlp/stackstate",
    "error": "rpc error: code = Canceled desc = context canceled",
    "interval": "5.125929689s"
}

在收到关闭指令后不久:

{
    "level": "info",
    "ts": 1736867468.4311068,
    "logger": "lifecycle.manager",
    "msg": "Received SHUTDOWN event"
}

上述表明 Lambda 分配的资源不足以允许 Lambda 执行以及 OTEL 仪表化带来的额外负担。 为了解决此问题,可以根据需要调整内存分配和 Lambda 超时设置,以允许 Lambda 完成其工作,同时也允许遥测收集成功。

尝试修改失败的 Lambda 的 MemorySize 和 TimeOut 属性:

MemorySize: 256
Timeout: 25

请注意,默认内存分配为 128 MB

请注意,内存增量为 128 MB

请注意,超时是一个表示秒数的整数值。

身份验证和源 IP 过滤

如果在向您的集群提交收集器数据时遇到`error 403 Unauthorized`,或向任何预处理或代理收集器提交时,请仔细检查 VPC NAT 网关的源 IP 地址是否与收集器入口白名单匹配,同时还要检查所选的身份验证机制是否与源和目标匹配,并确保凭据(密钥等)设置正确。

有关配置 OpenTelemetry 收集器身份验证的更多信息,请参阅https://github.com/open-telemetry/opentelemetry-collector/blob/main/config/configauth/README.md[官方文档]。