在 AWS Lambda 上排查 .NET 跟踪问题

如果 AWS Lambda 函数的跟踪功能未按预期工作,请先尝试常规的故障排除步骤,然后再处理具体情况。

一般故障诊断

完成以下步骤:

  1. 验证先决条件:

    • 检查 .NET 的版本兼容性:

      • .NET 运行时: 8.0 或更高版本
    • 请确认 Instana 层已正确关联到Lambda函数。
    • 验证Layer的安装:当 Instana Layer正确加载后,您应在 CloudWatch 日志中看到初始化消息:

      • 请查找 Instana 的初始化信息。
      • 检查是否有与图层加载相关的错误信息。
      • 请确认环境变量是否被正确读取。

      如果未显示以下消息:

      • 请确认图层的 ARN 是否正确。
      • 检查 Lambda 函数的运行时兼容性。
      • 请确保环境变量是在函数级别设置的。
  2. 验证环境变量:如果跟踪功能无法正常工作,请检查环境变量是否为:

    • 设置正确。
    • 拼写正确。
    • 请根据应用程序的部署环境进行适当设置。
    • 有效、可被进程或应用程序访问且正确。
  3. 验证 Lambda 配置:

    • 请确保 Lambda 函数使用的是正确的运行时(.NET 8 或更高版本)。
    • 请确认 Instana Layer的ARN是否与正确的 AWS 区域和.NET 运行时相匹配。
    • 请确认 Lambda 函数具有互联网连接,或者已正确配置虚拟私有云(VPC),以便能够访问 Instana 端点。
  4. 验证端点 URL 的配置:

    • SaaS Instana : 请使用您在 Instana 租户中的正确无服务器端点:

      • 格式: https://serverless-<region>.instana.io
      • 示例: https://serverless-blue-saas.instana.io
    • 自主托管的 Instana :

      • 格式: https://<instana-backend-ip>/serverless
      • 设置环境变量: INSTANA_DISABLE_CA_CHECK=true1
  5. 请确认 Lambda 函数的超时时间是否足够(建议初始冷启动时至少设置为 30 秒)。
  6. 请检查 CloudWatch 日志中是否存在与 Instana 相关的错误或警告。

针对具体情况的故障排除

如果常规故障排除无法解决您的问题,请参考以下故障排除方案:

场景 1: Instana 用户界面中未显示任何跟踪记录

症状: Lambda 函数运行成功,但在配置完成后, Instana 界面中未显示任何跟踪信息。

故障诊断步骤:

  1. 请确认 Lambda 函数的运行时环境受支持(.NET 8 或更高版本)。
  2. 请确认 Instana 层已正确关联到Lambda函数:

    1. 在 AWS 控制台中,转到 Lambda > 函数 > 您的函数
    2. 在 Lambda 函数的 “配置 ”选项卡中,点击 “层”
    3. 请确认“ Instana ”层是否已列出。
  3. 请确认该图层的 ARN 与正确的区域以及 .NET 运行时版本相符:

    • 标准 AWS 区域的ARN格式: arn:aws:lambda:<region>:410797082306:layer:instana-dotnetcore:<layer-version>
    • 中国 AWS 区域的ARN格式: arn:aws:lambda:<region>:107998019096:layer:instana-dotnetcore:<layer-version>
  4. 请确认环境变量已正确设置,且路径有效、可被进程或应用程序访问,并且正确无误:

    CORECLR_ENABLE_PROFILING=1
    CORECLR_PROFILER={cf0d821e-299b-5307-a3d8-b283c03916dd}
    CORECLR_PROFILER_PATH=/opt/instana_tracing/CoreProfiler.so
    DOTNET_STARTUP_HOOKS=/opt/Instana.Tracing.Core.dll
    INSTANA_AGENT_KEY=<your-agent-key>
    INSTANA_ENDPOINT_URL=<serverless_instana_endpoint>
    INSTANA_AWS_ACCOUNT_ID=<your_aws_account_id>
    LAMBDA_HANDLER=<Assembly::Namespace.ClassName::MethodName>
  5. 请确认端点 URL 是否正确:

    • SaaS Instana : 请使用您在 Instana 租户中的正确无服务器端点:

      • 格式: https://serverless-<region>.instana.io
      • 示例: https://serverless-blue-saas.instana.io
    • 自主托管的 Instana :

      • 格式: https://<instana-backend-ip>/serverless
      • 将环境变量 INSTANA_DISABLE_CA_CHECK 设置为 true1
  6. 请确认 Lambda 函数具有互联网连接,或者 VPC 配置正确,以便能够访问 Instana 端点。
  7. 请检查 Lambda 函数的执行角色是否具备必要的权限。
  8. 请确认 Lambda 函数的超时时间是否足够(建议初始冷启动时至少设置为 30 秒)。
  9. 请检查 CloudWatch 日志中是否存在与 Instana 相关的错误或警告。

场景 2:Lambda 函数超时问题

症状: 在添加 Instana 跟踪后,Lambda函数超时,或者执行时间显著增加。

故障诊断步骤:

  1. 检查 Lambda 函数的超时配置(如有必要,请延长超时时间):

    1. 在 AWS 控制台中,转到 Lambda > 函数 > 您的函数
    2. 选择配置选项卡。
    3. 点击 “常规设置” > “编辑 ”。
    4. 超时值调高(建议至少设置为30秒)。
  2. 检查冷启动开销:首次启动所需时间较长。
  3. 请确认 Lambda 函数的内存分配是否充足(建议至少为 512 MB):

    1. 在 AWS 控制台中,转到 Lambda > 函数 > 您的函数
    2. 选择配置选项卡。
    3. 点击 “常规设置” > “编辑 ”。
    4. 如有需要,请增加内存分配。
  4. 查看 CloudWatch 日志以获取性能指标。
  5. 检查同步调用是否阻塞了 Lambda 的执行。
  6. 如果支持,请考虑使用异步追踪。
  7. 验证与 Instana 端点的网络延迟。

情况 3:缺失的跨度或不完整的轨迹

症状: 出现了一些记录,但不完整,缺少下游调用,或存在缺失。

故障诊断步骤:

  1. 请确认所有受支持的库均在兼容的版本范围内:
  2. 检查特定库是否需要自定义仪器配置。
  3. 审查以下 Lambda 函数的代码:

    • 可能无法正确追踪的 async/await 模式
    • 在 Lambda 返回后完成的后台任务
    • 使用不受支持的客户端进行的外部服务调用
  4. 启用调试日志 ,以查看生成了哪些跨度。
  5. 在发送所有跨度之前,请检查 Lambda 函数是否已停止。
  6. 验证分布式追踪中的上下文传播是否正确。

场景 4:层连接失败

症状: 无法将 Instana 图层附加到 AWS Lambda 函数上,或者图层已附加但函数执行期间无法正确加载。

故障诊断步骤:

  1. 请确认图层 ARN 是否匹配:

    • 更正 AWS 区域
    • 正确的.NET 运行时版本(.NET 8 或更高版本)
    • 最新可用图层版本
  2. 请确认 Lambda 函数的运行时与层兼容性一致:

    • .NET 8 或更高版本

    如果运行时不受支持,请在挂载层之前更新 Lambda 运行时。

  3. 请确认“ AWS ”账户具有访问“ Instana ”图层的权限。
  4. 检查 Lambda 函数是否已达到 5 个层级的限制。
  5. 检查 CloudWatch 日志 ,查看图层初始化错误。
  6. 请确认该层与 Lambda 函数架构兼容( x86_64 或 arm64 ):

    • 请检查 Lambda 函数的架构设置。
    • 请确保 Instana 层支持所选的架构。

场景 5:环境变量配置问题

症状:Instana 环境变量已设置,但 Lambda 函数无法识别。

故障诊断步骤:

  1. 请确认环境变量是在 Lambda 函数级别设置的,而不仅仅是在代码中设置:

    1. 在 AWS 控制台中,转到 Lambda > 函数 > 您的函数
    2. 选择配置选项卡。
    3. 单击 “环境变量”
    4. 请确认所有必需的变量均已存在。
  2. 检查环境变量名称中是否存在拼写错误(区分大小写)。
  3. 请确认 是否 INSTANA_AGENT_KEY 有效且未过期。
  4. 请确认 Lambda 执行环境能够访问该 INSTANA_ENDPOINT_URL 资源。
  5. 通过以下方式检查环境变量是否被覆盖:

    • Lambda 函数代码
    • 容器镜像设置(适用于容器化 Lambda)
    • 基础设施即代码( Terraform 或 CloudFormation )
  6. 查看 CloudWatch 日志中的环境变量加载信息。

场景 7:VPC 配置问题

症状: VPC 中的 Lambda 函数无法将跟踪信息发送到 Instana。

故障诊断步骤:

  1. 请通过以下方式验证 Lambda 函数是否具有互联网访问权限:

    • NAT网关(适用于公共 Instana 端点)
    • VPC 端点(适用于 AWS 服务)
    • 互联网网关(若位于公共子网中)
  2. 请确认安全组是否允许外发 HTTPS 流量(端口443):

    1. 在 AWS 控制台中,转到 Lambda > 函数 > 您的函数
    2. 选择配置选项卡。
    3. 点击 VPC
    4. 检查相关的安全组。
    5. 请确认出站规则允许访问 HTTPS (端口 443)。
  3. 请确认网络访问控制列表 (ACL) 未阻止出站流量:

    1. 在 AWS 控制台中,转到 VPC > 网络访问控制列表
    2. 查找与您的 Lambda 函数子网关联的 Network ACL。
    3. 请确认出站规则允许 HTTPS 的流量。
  4. wget使用测试 Lambda 函数并结合 curl 或 来测试连接:

    创建一个简单的 Lambda 函数来测试连接:

    using System.Net.Http;
    
    public async Task<string> TestConnectivity()
    {
        using var client = new HttpClient();
        var response = await client.GetAsync("https://serverless-<region>.instana.io");
        return $"Status: {response.StatusCode}";
    }
  5. 对于自托管的 Instana :

    • 验证 VPC 对等连接或 Transit Gateway 的配置。
    • 检查路由表以确保路由正确。
    • 请确认 DNS 的解析在 Instana 后端上是否正常。

收集日志

AWS Lambda 不支持自动日志收集。 因此,您必须手动收集日志。

手动收集日志

完成以下步骤:

  1. 通过在 Lambda 函数中添加环境变量来启用调试日志记录:

    INSTANA_DEBUG=true
    INSTANA_LOG_LEVEL=DEBUG
  2. 访问 CloudWatch 日志:

    1. Go 转到 AWS 控制台 > CloudWatch > 日志组
    2. /aws/lambda/<function-name>查找日志组:.
    3. 查看 Instana 相关消息的近期日志流。
  3. 收集 Lambda 函数配置:

    aws lambda get-function-configuration --function-name <function-name>
  4. 收集 Lambda 函数的详细信息:

    aws lambda get-function --function-name <function-name>
  5. 测试 Lambda 函数调用:

    aws lambda invoke --function-name <function-name> --payload '{}' response.json
  6. 查看图层信息:

    aws lambda list-layers
    aws lambda get-layer-version --layer-name instana-dotnet --version-number <version>