Trent MickBahubali ShettiHemant Malik

使用 Elastic 可观测性跟踪您的 Azure 函数应用程序

部署在 Azure Functions 上的无服务器应用程序的使用正在增长。本博文展示了如何使用 Elastic Agent 在 Azure 函数上部署无服务器应用程序,以及如何使用 Elastic 的 APM 功能来管理和解决问题。

阅读时长:8 分钟
Trace your Azure Function application with Elastic Observability

过去几年里,在 Microsoft Azure 上的云原生应用程序中采用 Azure Functions 的速度呈指数级增长。无服务器函数(例如 Azure Functions)提供了从底层基础设施和编排中高度抽象的级别,因为这些任务由云提供商管理。然后,软件开发团队可以专注于业务和应用程序逻辑的实现。其他一些好处包括根据实际消耗的计算和内存资源对无服务器函数进行计费,以及自动按需扩展。

虽然使用无服务器函数的好处很多,但也有必要在更广泛的端到端微服务架构上下文中使它们可观测。

Elastic 可观测性 (APM) 用于 Azure 函数:架构

Elastic 可观测性 8.7 引入了对 Microsoft Azure 函数的分布式跟踪功能 - 可用于 .NET、Node.js 和 Python 的 Elastic APM Agent。HTTP 请求的自动检测功能已开箱即用,能够检测性能瓶颈和错误来源。

观察 Azure 函数的解决方案的关键组件是

  1. 相关语言的 Elastic APM Agent
  2. Elastic 可观测性

APM 服务器验证并处理来自各个 APM Agent 的传入事件,并将它们转换为 Elasticsearch 文档。APM Agent 为正在观察的应用程序提供自动检测功能。Node.js APM Agent 可以跟踪 Azure Functions 应用程序中的函数调用。

为 Azure 函数设置 Elastic APM

为了演示 Elastic APM 的设置和用法,我们将使用一个Node.js 示例应用程序

应用程序概述

Node.js 应用程序有两个名为“Hello”和“Goodbye”的HTTP 触发函数。部署后,可以按如下方式调用它们,并且跟踪数据将发送到配置的 Elastic 可观测性部署。

curl -i https://<APP_NAME>.azurewebsites.net/api/hello
curl -i https://<APP_NAME>.azurewebsites.net/api/goodbye

设置

步骤 0. 先决条件

要运行示例应用程序,您需要

步骤 1. 克隆示例应用程序存储库并安装依赖项

git clone https://github.com/elastic/azure-functions-apm-nodejs-sample-app.git
cd azure-functions-apm-nodejs-sample-app
npm install

步骤 2. 部署 Azure 函数应用
注意图标!将函数应用部署到 Azure 会产生费用。以下设置使用 Azure Functions 的免费层。步骤 5 介绍了资源的清理。

步骤 2.1
为了避免与独立运行此演示的其他用户发生名称冲突,我们需要一个简短的唯一标识符来表示一些需要全局唯一的资源名称。我们将其称为 DEMO_ID。您可以运行以下命令来生成一个并将其保存到 DEMO_ID 和“demo-id”文件中。

if [[ ! -f demo-id ]]; then node -e 'console.log(crypto.randomBytes(3).toString("hex"))' >demo-id; fi
export DEMO_ID=$(cat demo-id)
echo $DEMO_ID

步骤 2.2
在部署到 Azure 之前,您需要创建一些 Azure 资源:资源组、存储帐户和函数应用。对于此演示,您可以使用以下命令。(有关更多详细信息,请参阅此 Azure 文档部分。)

REGION=westus2   # Or use another region listed in 'az account list-locations'.
az group create --name "AzureFnElasticApmNodeSample-rg" --location "$REGION"
az storage account create --name "eapmdemostor${DEMO_ID}" --location "$REGION" \
    --resource-group "AzureFnElasticApmNodeSample-rg" --sku Standard_LRS
az functionapp create --name "azure-functions-apm-nodejs-sample-app-${DEMO_ID}" \
    --resource-group "AzureFnElasticApmNodeSample-rg" \
    --consumption-plan-location "$REGION" --runtime node --runtime-version 18 \
    --functions-version 4 --storage-account "eapmdemostor${DEMO_ID}"

步骤 2.3
接下来,使用 Elastic 部署的 APM 服务器 URL 和密钥令牌配置您的函数应用。这可以在Azure 门户或使用 az CLI 完成。

在 Azure 门户中,浏览到您的函数应用,然后浏览到其应用程序设置(Azure 用户指南)。您需要添加两个设置

首先设置您的 APM URL 和令牌。

export ELASTIC_APM_SERVER_URL="<your serverUrl>"
export ELASTIC_APM_SECRET_TOKEN="<your secretToken>"

或者,您可以使用 az functionapp config appsettings set ... CLI 命令,如下所示

az functionapp config appsettings set \
  -g "AzureFnElasticApmNodeSample-rg" -n "azure-functions-apm-nodejs-sample-app-${DEMO_ID}" \
  --settings "ELASTIC_APM_SERVER_URL=${ELASTIC_APM_SERVER_URL}"
az functionapp config appsettings set \
  -g "AzureFnElasticApmNodeSample-rg" -n "azure-functions-apm-nodejs-sample-app-${DEMO_ID}" \
  --settings "ELASTIC_APM_SECRET_TOKEN=${ELASTIC_APM_SECRET_TOKEN}"

ELASTIC_APM_SERVER_URL 和 ELASTIC_APM_SECRET_TOKEN 设置在 Azure 函数应用的设置中,并由 Elastic APM Agent 使用。这是由 initapm.js 文件启动的,该文件使用以下命令启动 Elastic APM Agent:

require("elastic-apm-node").start();

当您登录 Azure 并查看函数的配置时,您将看到它们已设置。

步骤 2.4
现在您可以发布您的应用。(每次更改代码后,重新运行此命令。)

func azure functionapp publish "azure-functions-apm-nodejs-sample-app-${DEMO_ID}"

您应该登录 Azure 以查看正在运行的函数。

步骤 3. 试用

% curl https://azure-functions-apm-nodejs-sample-app-${DEMO_ID}.azurewebsites.net/api/Hello
{"message":"Hello."}
% curl https://azure-functions-apm-nodejs-sample-app-${DEMO_ID}.azurewebsites.net/api/Goodbye
{"message":"Goodbye."}

过一会儿,Elastic 部署中的 APM 应用将显示 Azure 函数应用的跟踪数据。

步骤 4. 对您的应用施加一些负载
为了获得更多有趣的数据,您可以运行以下命令来对已部署的函数应用生成一些负载

npm run loadgen

这使用 autocannon Node 包对“Goodbye”函数生成一些轻量级负载(2 个并发用户,每个用户以 5 个请求/秒的速度调用 60 秒)。

步骤 5. 清理资源
如果您部署到 Azure,则应确保删除所有资源,以免产生任何费用。

az group delete --name "AzureFnElasticApmNodeSample-rg"

在 Elastic 中分析 Azure 函数 APM 数据

成功设置示例应用程序并开始生成负载后,您应该会看到 APM 数据出现在 Elastic 可观测性 APM 服务功能中。

服务映射

使用默认设置,您将在 APM 服务映射中看到两个服务。

主函数:azure-functions-apm-nodejs-sample-app

以及您的函数可访问的端点:azure-functions-apm-nodejs-sample-app-ec7d4c.azurewebsites.net

您将看到这两个服务之间存在连接,因为您的应用程序正在接收请求并通过端点进行响应。

APM 服务 映射中,您可以进一步调查函数、分析跟踪、查看日志等等。

服务详情

当我们深入了解详细信息时,可以看到几个项目。

  • 我们针对应用程序运行的最近负载的延迟
  • 事务(Goodbye 和 Hello)
  • 平均吞吐量
  • 以及更多

事务详情

我们可以看到事务详情。

单个跟踪向我们显示“Goodbye”函数 在返回之前调用同一函数应用中的“Hello”函数

基于机器学习的延迟关联

正如我们在其他博文中提到的,我们还可以关联诸如高于正常延迟的问题。由于我们在 1 秒处看到一个峰值,因此我们运行嵌入式延迟关联,该关联使用机器学习通过分析日志、指标和跟踪来帮助分析潜在的影响组件。

关联表明,由于主机发送负载(我的机器),存在潜在原因(25%)。

冷启动检测

此外,我们可以看到 冷启动 对请求延迟的影响。

总结

Elastic 可观测性为生产环境中的 Azure 函数提供实时监控,适用于各种用例。精心设计的仪表板可帮助 DevOps 团队对性能瓶颈和错误进行根本原因分析。SRE 团队可以快速查看上游和下游依赖项,以及在分布式微服务架构的上下文中执行分析。

了解更多

要了解如何将 Elastic APM Agent 添加到现有的 Node.js Azure 函数应用,请阅读 监控 Node.js Azure 函数。其他资源包括