Trent MickBahubali ShettiHemant Malik

使用 Elastic Observability 追踪您的 Azure 函数应用程序

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

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

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

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

适用于 Azure Functions 的 Elastic Observability (APM):架构

Elastic Observability 8.7 引入了 Microsoft Azure Functions 的分布式追踪功能 — 可用于 .NET、Node.js 和 Python 的 Elastic APM Agent。支持 HTTP 请求的自动检测,从而能够检测性能瓶颈和错误源。

用于观测 Azure Functions 的解决方案的关键组件是

  1. 相关语言的 Elastic APM Agent
  2. Elastic Observability

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

设置适用于 Azure Functions 的 Elastic APM

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

应用程序概述

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

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 节点包在“Goodbye”函数上生成一些轻负载(2 个并发用户,每个用户以 5 个请求/秒的速度调用 60 秒)。

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

az group delete --name "AzureFnElasticApmNodeSample-rg"

在 Elastic 中分析 Azure 函数 APM 数据

成功设置示例应用程序并开始生成负载后,您应该会在 Elastic Observability APM 服务功能中看到出现的 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 Observability 为您生产环境中的 Azure 函数提供实时监控,适用于各种用例。精选的仪表板可帮助 DevOps 团队执行性能瓶颈和错误的根本原因分析。SRE 团队可以快速查看上游和下游依赖关系,以及在分布式微服务架构的上下文中执行分析。

了解更多

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