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

发布于:2024-10-15 ⋅ 阅读:(101) ⋅ 点赞:(0)

前言

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_HOST0.0.0.0

Datakit 监听的端口号

  • DD_TRACE_AGENT_PORT9529

DataWay 真实地址

  • ENV_DATAWAYhttps://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层和相关配置是否有更新。

参考资料


网站公告

今日签到

点亮在社区的每一天
去签到