|
本文档采用自动化机器翻译技术翻译。 尽管我们力求提供准确的译文,但不对翻译内容的完整性、准确性或可靠性作出任何保证。 若出现任何内容不一致情况,请以原始 英文 版本为准,且原始英文版本为权威文本。 |
自动为 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 端点,不带任何http或https前缀。使用端口 443 进行安全通信。 -
*区域特定层:*Lambda 层是区域绑定的。确保您用于
OTLP_INSTR_LAYER_ARN和OTLP_COLLECTOR_LAYER_ARN的 ARN 与您的 Lambda 函数部署的 AWS 区域匹配。 -
*架构匹配:*OpenTelemetry Collector 层是特定于架构的。选择适合您 Lambda 函数架构的正确 ARN(例如,
amd64或arm64)。
完整示例:请注意,您需要输入自己的值。
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 的影响。
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
请注意,超时是一个表示秒数的整数值。
参考资料
查找最新 ARN 的 GitHub 发布页面 → https://github.com/open-telemetry/opentelemetry-lambda/releases