通过观测云 DataKit Extension 接入 AWS Lambda 最佳实践

前言

AWS Lambda 是一项计算服务,使用时无需预配置或管理服务器即可运行代码。AWS Lambda 只在需要时执行代码并自动缩放。借助 AWS Lambda,几乎可以为任何类型的应用程序或后端服务运行代码,而且无需执行任何管理。

Lambda Layer 是一个包含补充代码或数据的 .zip 文件存档,通常包含库依赖项、自定义运行时系统或配置文件。Lambda 扩展则是可以增强 Lambda 函数的功能,例如集成监控、安全性和监管工具等。

在本文中,我们将引导您了解如何将观测云服务集成到 AWS Lambda,通过配置 Lambda 层、设置环境变量,实现 Lambda 函数的指标、日志和链路采集。

前提条件

  • 确保您拥有 AWS 账户,并且具备管理 Lambda 函数的权限。
  • 已注册观测云账号

第1步:创建Lambda层

1、打开 AWS Lambda 控制台并导航至「Layers」页面。

2、点击「Create layer」,创建一个新的层。

3、在「Layer configuration」中,填写层的名称。

4、选择「Upload a .zip file」并上传以下链接对应的文件:

第2步:复制 ARN 并添加层到 Lambda 函数

  • 创建成功后,复制层的 ARN 值。
  • 在 Lambda 函数配置中添加此 ARN 到 Layers 部分。

第3步:配置环境变量

设置以下环境变量以确保数据正确传输到观测云:

Datakit 监听的地址名

  • DD_AGENT_HOST: 0.0.0.0

Datakit 监听的端口号

  • DD_TRACE_AGENT_PORT: 9529

DataWay 真实地址

  • ENV_DATAWAY: https://xxxx.guance.com?token=<your-token>

第4步:日志、链路和指标采集

日志采集

  • 支持采集控制台日志。
  • Node.js 18.x 和 Go 日志采集示例。

链路采集

  • 使用 OpenTelemetry 或 DDTrace 进行链路采集

  • 对于 Go 语言,需要在业务代码中添加相应的追踪代码。Go 代码示例较为复杂,需要修改业务代码,示例如下:

    package main

    import (
    "context"
    "fmt"
    "github.com/aws/aws-lambda-go/lambda"
    "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/ext"
    "gopkg.in/DataDog/dd-trace-go.v1/ddtrace/tracer"
    "os"
    "time"
    )

    type MyEvent struct {
    Name string json:"name"
    }

    func HandleRequest(ctx context.Context, event *MyEvent) (*string, error) {
    return run(ctx, event)
    }

    func run(ctx context.Context, event *MyEvent) (*string, error) {
    tracer.Start(
    tracer.WithEnv("prod"),
    tracer.WithService("test-file-read"),
    tracer.WithServiceVersion("1.2.3"),
    tracer.WithGlobalTag("project", "add-ddtrace-in-golang-project"),
    tracer.WithLambdaMode(false),
    )

    复制代码
          // end of app exit, make sure tracer stopped
          defer tracer.Stop()
    
          tick := time.NewTicker(time.Second)
          defer tick.Stop()
          ctx, cancel := context.WithTimeout(ctx, time.Minute*2)
          defer cancel()
          // your-app-main-entry...
          for {
                  runApp()
                  runAppWithError()
    
                  select {
                  case <-tick.C:
                  case <-ctx.Done():
                          message := fmt.Sprintf("Hello %s!", event)
                          return &message, nil
                  }
          }

    }

    func main() {
    //run(context.Background(), &MyEvent{Name: "Hello World!"})
    lambda.Start(HandleRequest)
    }

    func runApp() {
    var err error
    // Start a root span.
    span := tracer.StartSpan("get.data")
    defer span.Finish(tracer.WithError(err))

    复制代码
          // Create a child of it, computing the time needed to read a file.
          child := tracer.StartSpan("read.file", tracer.ChildOf(span.Context()))
          child.SetTag(ext.ResourceName, os.Args[0])
    
          // Perform an operation.
          var bts []byte
          bts, err = os.ReadFile(os.Args[0])
          span.SetTag("file_len", len(bts))
          child.Finish(tracer.WithError(err))

    }

    func runAppWithError() {
    var err error
    // Start a root span.
    span := tracer.StartSpan("get.data")

    复制代码
          // Create a child of it, computing the time needed to read a file.
          child := tracer.StartSpan("read.file", tracer.ChildOf(span.Context()))
          child.SetTag(ext.ResourceName, "somefile-not-found.go")
    
          defer func() {
                  child.Finish(tracer.WithError(err))
                  span.Finish(tracer.WithError(err))
          }()
    
          // Perform an error operation.
          if _, err = os.ReadFile("somefile-not-found.go"); err != nil {
                  // error handle
          }

    }

  • 链路效果展示

指标采集

以下是 AWS Lambda 指标的详细列表

awslambda-metric

标签 描述
aws_account_id AWS 账户ID。
aws_lambda_function_memory_size Configured memory size for the Lambda function.
aws_lambda_function_name Lambda function name.
aws_lambda_function_version Lambda function version.
aws_lambda_initialization_type Initialization type of the Lambda function.
aws_region AWS region where the function is executed.
指标 描述 类型 单位
billed_duration_ms Billed duration in milliseconds. int ms
duration_ms Total duration in milliseconds. int ms
errors Errors count. int count
init_duration_ms Initialization duration in milliseconds. int ms
invocations Invocation count. int count
max_memory_used_mb Maximum memory used in MB. int Mb
memory_size_mb Memory size configured for the Lambda function in MB. int Mb
out_of_memory Out of memory errors count. int count
post_runtime_duration Duration of the post-runtime phase in milliseconds. int ms
produced_bytes Bytes produced. int B
response_duration_ms Response duration in milliseconds. int ms
response_latency Response latency in milliseconds. int ms
runtime_duration_ms Duration of the runtime in milliseconds. int ms
timeouts Timeouts count. int count

安全和隐私说明

  • 确保在配置 ENV_DATAWAY 时使用安全的连接(例如 HTTPS)。
  • 不要在日志或错误消息中暴露敏感信息。

注意事项

  • 在部署之前,确保测试所有配置。
  • 监控Lambda函数的性能,确保指标收集符合预期。
  • 定期检查Lambda层和相关配置是否有更新。

参考资料

相关推荐
yunlaodacom12 小时前
腾讯云国际站服务代理商:CVM连接TencentDB失败排查指南
云计算·php·腾讯云
云宏信息13 小时前
超融合和存算分离怎么选?从性能、可靠性、扩展、成本四个维度讲述如何精准匹配架构选型 | 附企业降本轻量云方案
运维·服务器·架构·云计算
腾讯云大数据20 小时前
腾讯云+TBDS+智算平台:多模态数据处理与机器学习一体化实践
大数据·机器学习·云计算·腾讯云
知已难寻21 小时前
00 · OpenStack 总纲——从云计算到 OpenStack 全景
运维·服务器·云原生·云计算·负载均衡·openstack·perl
大力财经21 小时前
山东山大华天软件与阿里云达成合作,旗下产品CrownCAD已接入Qoder
人工智能·阿里云·云计算
长不大的杨瑞杰1 天前
OpenCode v2 多源上下文实战:Websearch、References、Attachments 与缓存预热
人工智能·安全·云计算·软件工程·devops
知已难寻2 天前
第 5 篇 · 云原生生态与实践:微服务、DevOps、可观测性与 Serverless
大数据·linux·服务器·微服务·云原生·云计算·devops
Vitaliy Kostrov(柯维远)2 天前
Multi-CDN 决策闭环:QoE、成本、安全与内容正确性如何进入同一个策略引擎?
安全·网络安全·云计算·音视频·负载均衡·cdn
长不大的杨瑞杰2 天前
OpenCode v2 远程开发实战:Web UI、Pair、SSH 隧道与 OpenTunnel 安全接入
人工智能·安全·云计算·软件工程·devops
T量子永生2 天前
Android SISO 分布式编译集群配置方案
android·分布式·云计算·源代码管理