正如我在之前的博客中提到的,直接摄取AWS Lambda日志以减少云支出, New Relic与AWS lambda扩展让您直接访问您的AWS Lambda日志流,独立于亚马逊监测。这种集成通过使您能够管理和优化云支出而不会影响可观察性的云支出,使您作为工程师 - 您可以简单地将Lambda函数日志和遥测数据直接摄取给新的遗物遥测数据平台

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

从基础开始

让我们从Lambda环境的一些基础知识开始,以及从无状态和短暂的函数中获取遥测数据的挑战。Lambda遥测包括各种事件,包括:

  • 调用事件(AwsLambdaInvocation)
  • 错误事件(AwsLambdaInvocationError)
  • 分布式跟踪(跨事件)
  • 开发人员创建的任何自定义事件

这个数据最初是由你想要观察的功能集成的New Relic One代码收集的。为了简单起见,我们将其称为语言代理,尽管它只适用于Node、Python和Go。Java和. net使用基于OpenTracing标准的代码来收集遥测数据。

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

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

现在有趣的地方来了:容器中运行的所有进程都不会被调度,直到新事件到来。容器也可以在等待事件时随时终止。因此,函数必然是无状态的。

这种情况与Lambda Extension API有些不同,后者除了执行调用事件通知外,还接收生命周期事件,例如关闭也可以注册日志事件。这允许函数保持非持久状态并执行终结器,类似于Java终结器。请注意,时间是不可预测的,因此API不能用于实现时间敏感的逻辑。

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

将遥测从容器中拿出来

因为Lambda执行环境是无状态的,所以我们必须收集遥测数据并立即将其从执行容器中取出。AWS具有丰富而灵活的权限系统,称为AWS身份和访问管理(IAM),每个功能都采用一个执行角色,该角色管理其与其他服务的交互。然而,“丰富和灵活”总是复杂的同义词。

为了在不需要复杂权限的情况下从容器中获取遥测数据,我们剩下三个选项:

  • 在每次调用结束时发出一个HTTP请求(请求必须阻塞调用响应)
  • 将遥测数据打印到标准输出。控件中写入的所有内容stdoutstderr文件描述符发送到CloudWatch Logs。
  • 使用扩展向函数添加状态。遥测数据将被收集,存储在缓冲区中,并分批发送。

最初,New Relic使用stdout /CloudWatch选项用于设置CloudWatch日志组,将过滤后的日志批发送到其他地方,比如另一个Lambda函数。我们提供了一个Lambda函数来解析日志,提取遥测数据,并将其全部发送给New Relic One。然而,这种方法也有一些缺点:

  • 它需要使用发布在AWS无服务器应用程序存储库中的Lambda函数
  • 日志订阅过滤器受到限制
  • CloudWatch消耗了更多的成本
  • 对于那些需要快速转换时间的客户来说,延迟可能是个问题。

引入一个优雅的解决方案

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

这种方法的主要缺点是Lambda执行环境中的容器生命周期。可以积累多个遥测调用值的缓冲区,从而使函数停止接收调用。在函数最终被调用或被关闭之前,不会有机会发送这个累积的缓冲区。

在任何一种情况下,发送到New Relic One的遥测需要New Relic授权密钥来代表客户识别和验证自己。对于我描述的日志摄取Lambda在我之前的文章中,这很简单:每个区域只有一个许可密钥,所以在一个环境变量中拥有许可密钥很简单。对于遥测扩展,很明显我们需要一个更好的解决方案来管理许可密钥。答案是AWS的秘密管理服务。我们已经将该服务与New Relic Lambda扩展集成,并将其作为授权密钥检索的默认路径。因此,在设置期间(每个区域),我们创建许可密钥secret。然后,每个函数的执行角色都需要包含读取该秘密的权限。该秘密仅在功能冷启动时读取,这避免了对AWS Secrets Manager的API延迟的担忧,并将AWS成本降至最低。

为你装饰遥测技术

现在我们已经解决了将遥测数据输入New Relic摄入管道的挑战,让我们来讨论元数据装饰。

如果你仔细看,你会发现你的AwsLambdaInvocation事件在查询时发生,而不是在代理生成时发生。这是为什么呢?这是元数据装饰的结果。它是这样工作的。

New Relic One在你的AWS帐户中维护了所有Lambda函数的清单(这就是为什么我们需要帐户配对步骤)。除了简单的标识信息外,我们还从Lambdas收集配置信息,比如运行时、标记、最大内存和超时。这个信息存储在新遗迹1和可用的New Relic的探险家无论您是否插装了给定的函数。

大部分元数据对函数本身是不可用的,这就是为什么我们通过在写时将元数据添加到调用事件中来单独收集它的原因,这样我们就可以维护函数被调用时的状态记录,而不是像现在这样。

因为接收管道的部分工作是用最近收集的函数元数据“装饰”调用事件,所以您可以在定制查询、仪表板或NRQL警报中根据函数元数据对事件数据进行分割。

理解无服务器应用程序

通过将日志和遥测数据从Lambda直接发送到New Relic One,您可以观察和理解您的无服务器应用程序的行为和性能。使用New Relic Lambda扩展绕过CloudWatch可以让你做到这一点,同时最小化延迟和优化你的云支出。

了解更多关于New Relic Lambda扩展(和贡献)在我们的git repo.

Matt Whelan是New Relic无服务器团队的高级软件工程师。当他不用文字制造机器的时候,他就步行或骑自行车在他的家乡太平洋西北部漫游。查看贴子

有兴趣为New Relic博客写作吗?亚搏体育登入网给我们一个推介!