通过观测云 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」并上传以下链接对应的文件:
- AMD架构:https://static.guance.com/datakit/datakit_aws_extension-linux-amd64.zip
- ARM架构:https://static.guance.com/datakit/datakit_aws_extension-linux-arm64.zip
第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 mainimport ("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 stoppeddefer 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 []bytebts, 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层和相关配置是否有更新。
参考资料
- AWSLambda:AWS Lambda 扩展 - 观测云文档
相关文章:

通过观测云 DataKit Extension 接入 AWS Lambda 最佳实践
前言 AWS Lambda 是一项计算服务,使用时无需预配置或管理服务器即可运行代码。AWS Lambda 只在需要时执行代码并自动缩放。借助 AWS Lambda,几乎可以为任何类型的应用程序或后端服务运行代码,而且无需执行任何管理。 Lambda Layer 是一个包…...

MySQL-三范式 视图
文章目录 三范式三范式简介第一范式第二范式第三范式 表设计一对一一对多多对多最终的设计 视图 三范式 三范式简介 所谓三范式, 其实是表设计的三大原则, 目的都是为了节省空间, 但是三范式是必须要遵守的吗? 答案是否定的(但是第一范式必须遵守) 因为有时候严格遵守三范式…...

多线程(三):线程等待获取线程引用线程休眠线程状态
目录 1、等待一个线程:join 1.1 join() 1.2 join(long millis)——"超时时间" 1.3 join(long millis,int nanos) 2、获取当前线程的引用:currentThread 3、休眠当前进程:sleep 3.1 实际休眠时间 3.2 sleep的特殊…...

Hi3244 应用指导
Hi3244 是一款DIP8封装高性能、多模式工作的原边控制功率开关。Hi3244内高精度的恒流、恒压控制机制结合完备的保护功能,使其适用于小功率离线式电源应用中。在恒压输出模式中,Hi3244 采用多模式工作方式,即调幅控制(AM࿰…...

【LeetCode热题100】哈希
1.两数之和 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。 你可以假设每种输入只会对应一个答案,并且你不能使用两次相同的元素。 你可以按任意顺序返回答…...

Java的四种循环语句
背景: Java 中主要有四种循环语句:for 循环、while 循环、do-while 循环 和 foreach 循环(也称为增强型 for 循环)。下面我将分别介绍这四种循环语句,并给出相应的实例。 for循环: 1. for 循环for 循环是…...

Qt杂记目录
Qt 杂记目录 QMenu 1.menu转string Qt 窗口阴影边框...

项目开发--基于docker实现模型容器化服务
背景 1、docker-compose build 和 docker-compose up -d分别是什么作用? 2、如何进入新构建的容器当中 3、模型保存的方法区别 4、如何让docker容器启动的时候能使用cuda进行模型推理加速 5、如何实现容器的迭代 解决方案 问题1 docker-compose build 和 docker…...

C语言 | Leetcode C语言题解之第477题汉明距离总和
题目: 题解: int totalHammingDistance(int* nums, int numsSize) {int ans 0;for (int i 0; i < 30; i) {int c 0;for (int j 0; j < numsSize; j) {c (nums[j] >> i) & 1;}ans c * (numsSize - c);}return ans; }...

Bug剖析
Bug剖析 • 所有的Bug报告有以下的基本要求: • 标题。要简略。 • 指派。谁来处理这个问题。 • 重现步骤。问题再次出现的相关步骤。 • 优先级别。问题的紧迫性与重要性。 • 严重程度。问题所产生的后果。 • 解决方案。怎么解决问题。 其他很多方面对修复问题…...

HI3516DV500 相机部分架构初探
Hi3516DV500 是一颗面向视觉行业推出的高清智能 Soc。该芯片最高支持 2 路 sensor 输入,支持最高 5M30fps 的 ISP 图像处理能力,支持 2F WDR、多级降噪、六轴防 抖、多光谱融合等多种传统图像增强和处理算法,支持通过 AI 算法对输入图像进行实…...

训练yolo系列出现问题mAP, R, P等为零
1. 问题 40系列显卡训练yolo系列出现问题,loss正常,但mAP,R,P等为零。 环境:ultralytics版本为8.3.9,cuda11.8, torch2.4。 40系列显卡网上说可以使用cuda低于11.7的,自己测试了下…...

数字媒体技术基础:色度子采样(4:4:4、4:2:2 、4:2:0)
在数字视频处理中,色度子采样 Chroma Subsampling可以用于压缩视频文件的大小,同时在大多数情况下保持较高的视觉质量,它的原理基于人类视觉系统对亮度 Luminance比对色度 Chrominance更加敏感这一特点。 一、 采样格式的表示方法 色度子采样…...

tkinter库的应用小示例:文本编辑器
tkinter库的应用小示例:文本编辑器 要 求: 创建一个文本编辑器,功能包括,创建、打开、编辑、保存文件。一个Button小组件,命名为btn_open,用于打开要编辑的文件,一个Button小组件,命名为btn_s…...
信息抽取数据集处理——RAMS
引言 RAMS数据集(RAMS:Richly Annotated Multilingual Schema-guided Event Structure)由约翰斯霍普金斯大学于2020年发布,是一个以新闻为基础的事件抽取数据集。它标注了9,124个事件,涵盖了139种不同的事件类型和65种…...

SpringBoot+XXL-JOB:高效定时任务管理
前言 在现代应用程序中,定时任务是不可或缺的一部分。Spring Boot 和 XXL-Job 为你提供了一个强大的工具组合,以简化任务调度和管理。 本文将带领你探索如何将这两者集成在一起,实现高效的定时任务管理。无论你是初学者还是有经验的开发者&…...

openpyxl -- 简介
文章目录 介绍核心类 介绍 开源的python读写Excel的工具库,由志愿者在业余时间维护;安装,pip install openpyxl;官方文档地址源码地址issues列表默认openpyxl不能保证抵御大量的xml攻击,为抵御这些攻击需安装defusedxmlÿ…...

滚雪球学MySQL[8.3讲]:数据库中的JSON与全文检索详解:从数据存储到全文索引的高效使用
全文目录: 前言8.3 JSON与全文检索1. JSON数据类型的使用1.1 JSON 数据类型概述1.2 JSON 数据的插入与查询1.3 JSON 常用函数与操作1.4 JSON使用的优缺点与性能考虑 2. 全文索引与全文检索2.1 全文索引概述2.2 全文检索的使用2.3 全文检索模式2.4 全文索引优化与性能…...

position定位静态定位/绝对定位/相对定位
1.静态定位static:按照标准流进行布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>D…...

2024年09月CCF-GESP编程能力等级认证C++编程三级真题解析
本文收录于专栏《C++等级认证CCF-GESP真题解析》,专栏总目录:点这里。订阅后可阅读专栏内所有文章。 一、单选题(每题 2 分,共 30 分) 第 1 题 下列代码中,输出结果是( ) #include<iostream> using namespace std; i...

Web自动化Demo-PHP+Selenium
1.新建工程 打开PhpStorm新建工程如下: 打开终端输入如下命令安装selenium: composer require php-webdriver/webdriver 2.编写代码 <?php require vendor/autoload.php;use Facebook\WebDriver\Remote\RemoteWebDriver; use Facebook\WebDriver…...

Python速成笔记——知识(GUI自动化处理屏幕和按键输出)
处理屏幕 获取屏幕快照 函数:pyautogui.screenshot(); 【注】该函数返回包含一个屏幕快照的Image对象; 分析屏幕快照 函数:pyautogui.pixel(); 【注】 传递一个坐标的元组,函数返回坐标对应像素点的RGB值(RGB元组) 函数:pyautogui.pixelMatchesColor() 【注】 函数第一…...

计算机是如何输入存储输出汉字、图片、音频、视频的
计算机是如何输入存储输出汉字、图片、音频、视频的 为了便于理解,先了解一下计算机的组成。 冯诺依曼计算机的五大组成部分。分别是运算器、控制器、存储器、输入设备和输出设备。参见下图: 一、运算器 运算器又称“算术逻辑单元”,是计算…...

springboot系列--web相关知识探索五
一、前言 web相关知识探索四中研究了请求中所带的参数是如何映射到接口参数中的,也即请求参数如何与接口参数绑定。主要有四种、分别是注解方式、Servlet API方式、复杂参数、以及自定义对象参数。web相关知识探索四中主要研究了复杂参数底层绑定原理。本次主要是研…...

开源商城系统crmeb phpstudy安装配置
BOSS让我最快时间部署一套开源商场系统,今天就以crmeb为例。 快速部署在linux中我会首选docker,因为我要在windows中部署,本文就选用phpstudy集成环境做了。 什么是crmeb 我从官网摘点: CRMEB产品与服务 CRMEB通过将CRM&#x…...

【论文阅读笔记】Bigtable: A Distributed Storage System for Structured Data
文章目录 1 简介2 数据模型2.1 行2.2 列族2.3 时间戳 3 API4 基础构建4.1 GFS4.2 SSTable4.3 Chubby 5 实现5.1 Tablet 位置5.2 Tablet 分配5.3 为 tablet 提供服务5.4 压缩5.4.1 小压缩5.4.2 主压缩 6 优化6.1 局部性组6.2 压缩6.3 缓存6.4 布隆过滤器6.5 Commit日志实现6.6 T…...

linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十一)--rpm管理和计划任务
linux从入门到精通-从基础学起,逐步提升,探索linux奥秘(十一)–rpm管理和计划任务 一、rpm管理(重点) 1、rpm管理 作用: rpm的作用类似于windows上的电脑管家中“软件管理”、安全卫士里面“…...

【C++几种单例模式解读及实现方式】
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、单例是什么?二、解读1.懒汉式2.饿汉式3.static变量特性4.call_once特性 总结 前言 单例模式几乎是每种语言都不可少的一种设计模式,…...

QT开发--串口通信
第十六章 串口通信 16.1 串口通信基础 串口通信主要通过DB9接口,适用于短距离(<10米)。关键参数包括: 波特率:每秒传输bit数,如9600。数据位:信息包中的有效数据位数。停止位:…...

数据库(至少还的再花两天 )
1 连接查询 左连接 右连接 2 聚合函数 SQL 统计求和 求最值 count sum avg max min 3 SQL关键字 limit 分页 group by 分组 distinct 去重 4 Select执行顺序 from where group by order by 5 数据库三范式 原子性 唯一性 直接性 6 存储引擎 MyISAM InnoDB 7 …...