当我在我之前的博客文章中触摸时,摄入AWS Lambda Logs直接降低云花费,新遗物的整合与AWS lambda扩展让您直接访问您的AWS Lambda日志流,独立于亚马逊CloudWatch.。这种集成通过使您能够管理和优化云支出而不会影响可观察性的云支出,使您作为工程师 - 您可以简单地将Lambda函数日志和遥测数据直接摄取给新的遗物遥测数据平台

在这篇文章中,我探索了如何新的遗物Lambda延期作为一个轻量级工具,可以帮助从AWS Lambda函数中收集,增强和传输遥测数据到新的遗物。

从基础开始

让我们从一些关于Lambda环境的基础知识以及让遥测数据超出无状态和短暂的函数的挑战。Lambda Telemetry包括各种活动,包括:

  • 调用事件(Awslambdainvocation.
  • 错误事件(awslambdainvocationerror.
  • 分布式迹线(跨度事件)
  • 开发人员创建的任何自定义事件

该数据最初由新的遗物单个代码收集,其中包含您要观察的功能。为简单的缘故,我们将参考这一点作为语言代理,尽管只适用于节点,Python和Go。Java和.NET使用代码基于OpenTracing标准来收集遥测。

每个功能Lambda执行环境是在自定义执行环境中运行的容器图像。这些容器的基础图像是Amazon Linux(通常是版本2)。每个容器图像都包含一个名为的可执行文件引导这实现了处理程序生命周期。

在启动时,Lambda服务执行引导并使本地HTTP服务器可用,这将返回事件有效载荷,以响应阻塞长轮询HTTP GET请求调用API/下一个。如果没有事件可以立即用于处理功能,请呼叫/下一个块。(长轮询请求是一个阻止请求旨在同步HTTP客户端 - 服务器交互并允许服务器将事件发送到客户端。)

现在这里是它有趣的地方:在新事件到达之前,将安排在容器中运行的进程都没有。还可以在等待事件的同时随时终止容器。因此,函数必然是无状态的。

这种情况有点不同,Lambda扩展API除了执行调用事件通知之外,还接收生命周期事件,如关掉并且可以注册日志事件。这允许函数来维护非持久状态并执行与Java Finalizer类似的结局器。请注意,时间是不可预测的,因此API不能用于实现时间敏感的逻辑。

除了这个基本的生命周期API之外,Lambda还提供了几种是预构建的实现的运行时引导可执行文件可以以不同语言主持处理程序。引导将事件处理委托给这些处理程序。

将遥测从容器中拿出来

由于Lambda执行环境无状态,我们必须收集遥测并立即将其从执行容器中取出。AWS有一个富有灵活灵活的许可系统AWS身份和访问管理(IAM),每个函数都采用管理其与其他服务的交互的执行角色。但是,“富有灵活的”始终是复杂的同义词。

为了使遥测关闭容器而不需要复杂的权限,我们留下了三个选项:

  • 在每个调用结束时进行HTTP请求(请求必须阻止调用响应)
  • 通过打印它来发出遥测标准出版。默认情况下,一切写给了stdout.斯德尔文件描述符被发送到CloudWatch日志。
  • 使用扩展将状态添加到函数。遥测将收集,存储在缓冲区中,并批量发送。

最初,新的遗物使用了stdout /CloudWatch选项设置CloudWatch日志组以将过滤的日志批次发送到其他位置,例如另一个Lambda函数。我们提供了一个Lambda函数,可以解析日志,提取遥测,并将所有人发送到新的遗物。但是,这种方法存在一些缺点:

  • 它需要使用在AWS无法源应用程序存储库中发布的Lambda函数
  • 日志订阅过滤器有限
  • CloudWatch摄取增加成本
  • 对于需要快速玻璃的客户来说可能是一个问题。

介绍优雅的解决方案

相反,我们新的遗物Lambda延期克服了收集,增强和运输遥测数据的挑战。在功能的容器内运行,扩展缓冲区遥测并定期发送它。扩展摊销了阻止函数执行的需求,同时使遥测将请求发送到多个调用。代理使用简单的语言 - 不可知的IPC机制将遥测发送到扩展(命名管道),这意味着我们只需要一个扩展代码库来服务所有语言代理。

这种方法的主要缺点是Lambda执行环境中的容器生命周期。可以累积几个调用的遥测的缓冲区,只能使功能停止接收调用。没有机会发送此累计缓冲区,直到函数最终调用或关闭函数。

在任何一种情况下,向新遗物发送到新的遥测需要新的遗物许可证密钥来代表客户识别和认证自己。对于我所描述的日志摄取λa在我以前的帖子中,这很简单:每个区域只有一个,所以在环境变量中具有许可证密钥很简单。对于遥测扩展,很清楚我们需要更好的解决方案来管理许可证密钥。答案是AWS的秘密管理服务。我们使用新的遗物Lambda扩展程序集成了服务,并使其成为许可证密钥检索的默认路径。因此,在设置(每个区域)期间,我们创建许可证密钥秘密。然后,每个函数的执行角色都需要包括读取该秘密的权限。秘密仅读取功能冷启动,避免了AWS Secrets Manager的API延迟的担忧,并最大限度地减少AWS成本。

为您装饰遥测

现在我们已经解决了让遥测数据进入新的遗物摄取管道的挑战,让我们谈谈元数据装饰。

如果你仔细看,你会看到更多的领域Awslambdainvocation.当您查询它们而不是代理生成它们时的事件。为什么是这样?这是元数据装饰的结果。这是它的工作原理。

新的遗物遗物维护您的AWS帐户中所有Lambda函数的库存(这就是我们需要帐户配对步骤的原因)。除了简单的身份信息之外,我们可以从Lambdas中收集配置信息,例如运行时,标签,最大内存和超时。此信息存储在新的遗物遗物中,可用新的遗物资源管理器,实体资源管理器,无论您是如何检测给定功能。

Most of this metadata isn’t available to the function itself, which is why we collect it separately by adding this metadata to invocation events at write time, letting us maintain a record of the state of your function as it was invoked, rather than as it is today.

由于摄入管道的一部分是“用最近收集的功能元数据”装饰“调用事件,您可以通过自定义查询,仪表板或NRQL警报中的功能元数据切片和骰子。

了解无服务器的应用程序

通过将Lambda直接从Lambda发送到新的遗物,您可以观察和了解您无服务器的行为和性能。使用新的遗物Lambda扩展绕过CloudWatch让您执行此操作,同时最大限度地减少延迟并优化您的云花费。

了解有关新的遗物Lambda延期(以及贡献)的更多信息git repo.

Matt Whelan是新型遗物无服务团队的高级软件工程师。当他没有用言语建造机器时,他徒步或骑自行车徘徊他的天然太平洋西北。查看帖子

对新遗物博客的写作有兴趣吗?亚搏体育登入网送我们一个球场!!