Jonathan Simon

如何在 Azure 容器应用上使用 Elastic 可观测性部署 Hello World Web 应用程序

按照分步流程,为在 Azure 容器应用上运行的 Hello World Web 应用程序配置 Elastic 可观测性。

12 分钟阅读
How to deploy a Hello World web app with Elastic Observability on Azure Container Apps

Elastic 可观测性是为您的正在运行的 Web 应用程序提供可见性的最佳工具。Microsoft Azure 容器应用是一个完全托管的环境,使您能够在无服务器平台上运行容器化应用程序,从而使您的应用程序可以向上和向下扩展。这使您可以实现双重目标,即满足每个客户对可用性的需求,同时满足您尽可能高效地实现此目标的需求。

使用 Elastic 可观测性和 Azure 容器应用是开发人员部署可自动缩放且具有完全可观测操作的 Web 应用程序的完美组合。

这篇博文将向您展示如何将简单的 Hello World Web 应用程序部署到 Azure 容器应用,然后引导您完成配置 Hello World Web 应用程序的步骤,以便使用 Elastic Cloud 观察应用程序的操作。

Elastic 可观测性设置

我们将从设置 Elastic Cloud 部署开始,这是我们将要部署的 Web 应用程序进行可观测性的地方。

Elastic Cloud 控制台中,选择 创建部署

输入部署名称,然后单击 创建部署。创建部署需要几分钟。在等待期间,系统会提示您保存部署的管理员凭据,这将为您提供对 Elastic® 部署的超级用户访问权限。请妥善保管这些凭据,因为它们只会显示一次。

Elastic 可观测性需要 APM 服务器 URL 和 APM 密钥令牌,才能让应用程序将可观测性数据发送到 Elastic Cloud。创建部署后,我们将复制 Elastic 可观测性服务器 URL 和密钥令牌,并将其安全地存储在某处,以便在稍后的步骤中添加到我们的 Web 应用程序代码中。

要复制 APM 服务器 URL 和 APM 密钥令牌,请转到 Elastic Cloud。然后转到部署页面,其中列出了您创建的所有部署。选择您要使用的部署,这将打开部署详细信息页面。在 Kibana 链接行中,单击 打开 以打开您部署的 Kibana®。

从顶层菜单中选择 集成。然后单击 APM 磁贴。

在 APM 代理页面上,复制 secretToken 和 serverUrl 值,并保存它们以供稍后步骤使用。

现在我们已经完成了 Elastic Cloud 设置,下一步是在 Azure 中设置我们的帐户,以便将应用程序部署到容器应用服务。

Azure 容器应用设置

首先,我们需要一个 Azure 帐户,因此让我们转到 Microsoft Azure 门户并创建一个新项目。单击 开始免费 按钮,然后按照步骤登录或创建新帐户。

将 Hello World Web 应用程序部署到容器应用

我们将使用名为 Cloud Shell 的便捷 Azure 工具执行将 C# Hello World Web 应用程序部署到容器应用的过程。要部署 Hello World 应用程序,我们将执行以下 12 个步骤

  1. Azure 门户中,单击门户顶部的 Cloud Shell 图标以打开 Cloud Shell…

…当 Cloud Shell 首次打开时,选择 Bash 作为要使用的 shell 类型。

  1. 如果您收到“您没有挂载任何存储”的提示,请单击 创建存储 按钮以创建用于从 Cloud Shell 保存和编辑文件的文件存储。

  1. 在 Cloud Shell 中,通过输入以下命令从 GitHub 克隆一个 C# Hello World 示例应用程序存储库。
git clone https://github.com/elastic/observability-examples
  1. 将目录更改为 Hello World Web 应用程序代码的位置。
cd observability-examples/azure/container-apps/helloworld
  1. 定义我们将在整个博文的命令中使用的环境变量。
RESOURCE_GROUP="helloworld-containerapps"
LOCATION="centralus"
ENVIRONMENT="env-helloworld-containerapps"
APP_NAME="elastic-helloworld"
  1. 通过运行以下命令定义唯一的注册表容器名称。
ACR_NAME="helloworld"$RANDOM
  1. 通过运行以下命令创建 Azure 资源组。
az group create --name $RESOURCE_GROUP --location "$LOCATION"
  1. 运行以下命令在 Azure 容器注册表中创建注册表容器。
az acr create --resource-group $RESOURCE_GROUP \
--name $ACR_NAME --sku Basic --admin-enable true
  1. 通过运行以下命令构建应用程序镜像并将其推送到 Azure 容器注册表。
az acr build --registry $ACR_NAME --image $APP_NAME .
  1. 通过运行以下命令将 Microsoft.OperationalInsights 命名空间注册为提供程序。
az provider register -n Microsoft.OperationalInsights --wait
  1. 运行以下命令以创建一个容器应用环境,用于将您的应用程序部署到其中。
az containerapp env create --name $ENVIRONMENT \
--resource-group $RESOURCE_GROUP --location "$LOCATION"
  1. 通过使用以下命令将 Hello World 应用程序的镜像部署到容器应用来创建一个新的容器应用。
az containerapp create \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --environment $ENVIRONMENT \
  --image $ACR_NAME.azurecr.io/$APP_NAME \
  --target-port 3500 \
  --ingress 'external' \
  --registry-server $ACR_NAME.azurecr.io \
  --query properties.configuration.ingress.fqdn

此命令将输出已部署的 Hello World 应用程序的完全限定域名 (FQDN)。将 FQDN 复制并粘贴到浏览器中以查看正在运行的 Hello World 应用程序。

使用 Elastic 可观测性配置 Hello World Web 应用程序

在容器应用中成功运行 Web 应用程序后,我们现在可以添加必要的最小代码,以在 Elastic Cloud 中为 Hello World 应用程序启用可观测性。我们将执行以下八个步骤

  1. 在 Azure Cloud Shell 中,通过键入以下命令创建一个名为 Telemetry.cs 的新文件。
touch Telemetry.cs
  1. 通过在 Cloud Shell 中键入以下命令打开 Azure Cloud Shell 文件编辑器。
code .
  1. 在 Azure Cloud Shell 编辑器中,打开 Telemetry.cs 文件并粘贴以下代码。通过按键盘上的 [Ctrl] + [s] 键(如果您使用的是 macOS 计算机,请使用 [⌘] + [s] 键)将编辑后的文件保存在 Cloud Shell 中。此类文件用于创建跟踪器 ActivitySource,它可以生成用于可观测性的跟踪 Activity 跨度。
using System.Diagnostics;

public static class Telemetry
{
	public static readonly ActivitySource activitySource = new("Helloworld");
}
  1. 在 Azure Cloud Shell 编辑器中,编辑名为 Dockerfile 的文件,添加以下 Elastic OpenTelemetry 环境变量。将 ELASTIC_APM_SERVER_URL 文本和 ELASTIC_APM_SECRET_TOKEN 文本替换为您在前面步骤中复制并保存的 APM 服务器 URL 和 APM 密钥令牌值。

通过在键盘上按 [Ctrl] + [s] 键(如果您使用的是 macOS 计算机,则使用 [⌘] + [s] 键)在 Cloud Shell 中保存编辑后的文件。

更新后的 Dockerfile 应如下所示

FROM ${ARCH}mcr.microsoft.com/dotnet/aspnet:7.0. AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:8.0-preview AS build
ARG TARGETPLATFORM

WORKDIR /src
COPY ["helloworld.csproj", "./"]
RUN dotnet restore "./helloworld.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "helloworld.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "helloworld.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
EXPOSE 3500
ENV ASPNETCORE_URLS=http://+:3500

ENV OTEL_EXPORTER_OTLP_ENDPOINT='https://******.apm.us-east-2.aws.elastic-cloud.com:443'
ENV OTEL_EXPORTER_OTLP_HEADERS='Authorization=Bearer ***********'
ENV OTEL_LOG_LEVEL=info
ENV OTEL_METRICS_EXPORTER=otlp
ENV OTEL_RESOURCE_ATTRIBUTES=service.version=1.0,deployment.environment=production
ENV OTEL_SERVICE_NAME=helloworld
ENV OTEL_TRACES_EXPORTER=otlp

ENTRYPOINT ["dotnet", "helloworld.dll"]
  1. 在 Azure Cloud Shell 编辑器中,编辑 helloworld.csproj 文件,添加 Elastic APM 和 OpenTelemetry 依赖项。更新后的 helloworld.csproj 文件应如下所示

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
	<TargetFramework>net7.0</TargetFramework>
	<Nullable>enable</Nullable>
	<ImplicitUsings>enable</ImplicitUsings>
  </PropertyGroup>
  <ItemGroup>
	<PackageReference Include="Elastic.Apm" Version="1.24.0" />
	<PackageReference Include="Elastic.Apm.NetCoreAll" Version="1.24.0" />
	<PackageReference Include="OpenTelemetry" Version="1.6.0" />
	<PackageReference Include="OpenTelemetry.Exporter.Console" Version="1.6.0" />
	<PackageReference Include="OpenTelemetry.Exporter.OpenTelemetryProtocol" Version="1.6.0" />
	<PackageReference Include="OpenTelemetry.Extensions.Hosting" Version="1.6.0" />
	<PackageReference Include="OpenTelemetry.Instrumentation.AspNetCore" Version="1.5.0-beta.1" />
  </ItemGroup>

</Project>
  1. 在 Azure Cloud Shell 编辑器中,编辑 Program.cs
  • 在文件顶部添加 using 语句,导入 System.Diagnostics,用于创建与 OpenTelemetry 中的“span”等效的 Activity。同时导入 OpenTelemetry.Resources 和 OpenTelemetry.Trace 包。
using System.Diagnostics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;
  • 更新“builder”初始化代码块,以包含启用 Elastic OpenTelemetry 可观测性的配置。
builder.Services.AddOpenTelemetry().WithTracing(builder => builder.AddOtlpExporter()
                	.AddSource("helloworld")
                	.AddAspNetCoreInstrumentation()
                	.AddOtlpExporter()
    	.ConfigureResource(resource =>
        	resource.AddService(
            	serviceName: "helloworld"))
);
builder.Services.AddControllers();
  • 替换“Hello World!” HTML 输出字符串…
<h1>Hello World!</h1>
  • ...替换为“Hello Elastic Observability” HTML 输出字符串。
<div style="text-align: center;">
  <h1 style="color: #005A9E; font-family:'Verdana'">
    Hello Elastic Observability - Azure Container Apps - C#
  </h1>
  <img
    src="https://elastichelloworld.blob.core.windows.net/elastic-helloworld/elastic-logo.png"
  />
</div>
  • 利用 Telemetry 类的 ActivitySource 在输出响应周围添加一个遥测跟踪 span。
using (Activity activity = Telemetry.activitySource.StartActivity("HelloSpan")!)
   	{
   		Console.Write("hello");
   		await context.Response.WriteAsync(output);
   	}

更新后的 Program.cs 文件应如下所示

using System.Diagnostics;
using OpenTelemetry.Resources;
using OpenTelemetry.Trace;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddOpenTelemetry().WithTracing(builder => builder.AddOtlpExporter()
                	.AddSource("helloworld")
                	.AddAspNetCoreInstrumentation()
                	.AddOtlpExporter()
    	.ConfigureResource(resource =>
        	resource.AddService(
            	serviceName: "helloworld"))
);
builder.Services.AddControllers();
var app = builder.Build();

string output =
"""
<div style="text-align: center;">
<h1 style="color: #005A9E; font-family:'Verdana'">
Hello Elastic Observability - Azure Container Apps - C#
</h1>
<img src="https://elastichelloworld.blob.core.windows.net/elastic-helloworld/elastic-logo.png">
</div>
""";

app.MapGet("/", async context =>
	{
    	using (Activity activity = Telemetry.activitySource.StartActivity("HelloSpan")!)
    		{
        		Console.Write("hello");
        		await context.Response.WriteAsync(output);
    		}
	}
);
app.Run();
  1. 通过运行以下命令,重新构建 Hello World 应用程序映像,并将该映像推送到 Azure 容器注册表。
az acr build --registry $ACR_NAME --image $APP_NAME .
  1. 使用以下命令,将更新后的 Hello World 应用程序重新部署到 Azure 容器应用。
az containerapp create \
  --name $APP_NAME \
  --resource-group $RESOURCE_GROUP \
  --environment $ENVIRONMENT \
  --image $ACR_NAME.azurecr.io/$APP_NAME \
  --target-port 3500 \
  --ingress 'external' \
  --registry-server $ACR_NAME.azurecr.io \
  --query properties.configuration.ingress.fqdn

此命令将输出已部署的 Hello World 应用程序的完全限定域名 (FQDN)。将 FQDN 复制并粘贴到浏览器中,以查看在 Azure 容器应用中运行的更新后的 Hello World 应用程序。

观察 Hello World Web 应用程序

现在,我们已经配置了 Web 应用程序,使其将可观测性数据发送到 Elastic Observability,现在我们可以使用 Elastic Cloud 来监控 Web 应用程序的操作。

  1. 在 Elastic Cloud 中,选择“可观测性”服务菜单项。

  2. 单击 helloworld 服务。

  3. 单击事务选项卡。

  4. 向下滚动并单击 GET / 事务。向下滚动到 Trace Sample 部分,查看 GET / , HelloSpan 跟踪示例。

可扩展的观测性

您已经了解了将 Web 应用程序部署到 Azure 容器应用的整个过程,该应用程序已使用 Elastic Observability 进行配置。此 Web 应用程序现在完全可以在 Web 上运行,并且将在一个可以自动扩展以服务于全球访问者的平台上运行。它还使用 OpenTelemetry 配置为 Elastic Observability APM,以便将数据摄取到 Elastic Cloud 的 Kibana 仪表板中。

现在您已经了解了如何部署具有基本可观测性设置的 Hello World Web 应用程序,请访问 Elastic Observability 以了解有关扩展到应用程序的全面可观测性覆盖解决方案的更多信息。或访问 在 Microsoft Azure 上开始使用 Elastic 以获取更多示例,说明如何通过将 Microsoft Azure 的云计算服务与 Elastic 的搜索驱动平台相结合来驱动您所需的数据洞察。

本文中描述的任何功能或特性的发布和时间安排均由 Elastic 自行决定。任何当前不可用的功能或特性可能无法按时交付,或者根本无法交付。

分享这篇文章