如何在 Azure 容器应用程序上部署具有 Elastic Observability 的 Hello World Web 应用程序
作者:Jonathan Simon
Elastic Observability 是提供对正在运行的 Web 应用程序的可见性的最佳工具。 Microsoft Azure 容器应用程序是一个完全托管的环境,使你能够在无服务器平台上运行容器化应用程序,以便你的应用程序可以扩展和缩减。 这使你能够实现双重目标:满足每个客户的可用性需求,同时满足你尽可能高效地开展工作的需求。
使用 Elastic Observability 和 Azure 容器应用程序是开发人员部署可通过完全可观察操作自动扩展的 Web 应用程序的完美组合。
本博文将向你展示如何将简单的 Hello World Web 应用程序部署到 Azure 容器应用程序,然后引导你完成实施 Hello World Web 应用程序的步骤,以便能够通过 Elastic Cloud 观察应用程序的操作。
Elastic 可观测性设置
我们将从设置 Elastic Cloud 部署开始,这是我们将要部署的 Web 应用程序的可观察性所在。
从 Elastic Cloud 控制台中,选择 Create deployment。
输入部署名称并单击 Create deployment。 创建部署需要几分钟时间。 等待期间,系统会提示你保存部署的管理员凭据,这为你提供了对 Elastic® 部署的超级用户访问权限。 确保这些凭据的安全,因为它们仅显示一次。
Elastic Observability 需要 APM 服务器 URL 和 APM Secret token,应用程序才能将可观察性数据发送到 Elastic Cloud。 创建部署后,我们将复制 Elastic Observability 服务器 URL 和秘密 token,并将它们安全地存储在某个位置,以便在后续步骤中添加到我们的 Web 应用程序代码中。
要复制 APM 服务器 URL 和 APM 秘密 token,请转到 Elastic Cloud 。 然后转到 “Deployment” 页面,其中列出了你已创建的所有部署。 选择你要使用的部署,这将打开部署详细信息页面。 在 Kibana 链接行中,单击 Open 以打开 Kibana® 进行部署。
从顶级菜单中选择 integrations。 然后单击 APM。
在 APM 代理页面上,复制 SecretToken 和 serverUrl 值并保存它们以供后续步骤使用。
现在我们已经完成了 Elastic Cloud 设置,下一步是在 Azure 中设置我们的帐户,以便将应用程序部署到容器应用程序服务。
Azure 容器应用程序设置
首先,我们需要一个 Azure 帐户,因此让我们通过转到 Microsoft Azure 门户并创建一个新项目来创建一个帐户。 单击 “Start free” 按钮,然后按照步骤登录或创建新帐户。
将 Hello World Web 应用程序部署到容器应用程序
我们将使用名为 Cloud Shell 的便捷 Azure 工具执行将 C# Hello World Web 应用程序部署到容器应用程序的过程。 要部署 Hello World 应用程序,我们将执行以下 12 个步骤:
1. 在 Azure 门户中,单击门户顶部的 Cloud Shell 图标以打开 Cloud Shell...
…当 Cloud Shell 首次打开时,选择 Bash 作为要使用的 shell 类型。
2. 如果系统提示你 “You have no storage mounted”,请单击 Create storage 按钮创建一个文件存储,用于从 Cloud Shell 保存和编辑文件。
3. 在 Cloud Shell 中,通过输入以下命令从 GitHub 克隆 C# Hello World 示例应用存储库。
git clone https://github.com/elastic/observability-examples
4. 将目录更改为 Hello World Web 应用程序代码的位置。
cd observability-examples/azure/container-apps/helloworld
5. 定义我们将在本博文中的命令中使用的环境变量。
RESOURCE_GROUP="helloworld-containerapps"
LOCATION="centralus"
ENVIRONMENT="env-helloworld-containerapps"
APP_NAME="elastic-helloworld"
6. 通过运行以下命令定义唯一的注册表容器名称。
ACR_NAME="helloworld"$RANDOM
7. 通过运行以下命令创建 Azure 资源组。
az group create --name $RESOURCE_GROUP --location "$LOCATION"
8. 运行以下命令在 Azure 容器注册表中创建注册表容器。
az acr create --resource-group $RESOURCE_GROUP \
--name $ACR_NAME --sku Basic --admin-enable true
9. 构建应用程序映像并通过运行以下命令将其推送到 Azure 容器注册表。
az acr build --registry $ACR_NAME --image $APP_NAME .
10. 通过运行以下命令将 Microsoft.OperationalInsights 命名空间注册为提供程序。
az provider register -n Microsoft.OperationalInsights --wait
11. 运行以下命令创建容器应用程序环境以将你的应用程序部署到其中。
az containerapp env create --name $ENVIRONMENT \
--resource-group $RESOURCE_GROUP --location "$LOCATION"
12. 使用以下命令将 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 Observability 检测 Hello World Web 应用程序
随着 Web 应用程序在容器应用程序中成功运行,我们现在已准备好添加所需的最少代码,以启用 Elastic Cloud 中的 Hello World 应用程序的可观察性。 我们将执行以下八个步骤:
1. 在 Azure Cloud Shell 中,通过键入以下命令创建一个名为 Telemetry.cs 的新文件。
touch Telemetry.cs
2. 在 Cloud Shell 中键入以下命令,打开 Azure Cloud Shell 文件编辑器。
code .
3. 在 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");
}
4. 在 Azure Cloud Shell 编辑器中,编辑名为 Dockerfile 的文件以添加以下 Elastic OpenTelemetry 环境变量。 将 ELASTIC_APM_SERVER_URL 文本和 ELASTIC_APM_SECRET_TOKEN 文本替换为你在先前步骤中复制并保存的 APM 服务器 URL 和 APM 秘密 token 值。
按键盘上的 [Ctrl] + [s] 键(或者如果你使用的是 macOS 计算机,请使用 [⌘] + [s] 键),将编辑后的文件保存在 Cloud Shell 中。
更新后的 Dockerfile 应如下所示:
FROM ${ARCH}mcr.microsoft.com/dotnet/aspnet:7.0. AS base
WORKDIR /appFROM mcr.microsoft.com/dotnet/sdk:8.0-preview AS build
ARG TARGETPLATFORMWORKDIR /src
COPY ["helloworld.csproj", "./"]
RUN dotnet restore "./helloworld.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "helloworld.csproj" -c Release -o /app/buildFROM build AS publish
RUN dotnet publish "helloworld.csproj" -c Release -o /app/publishFROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
EXPOSE 3500
ENV ASPNETCORE_URLS=http://+:3500ENV 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=otlpENTRYPOINT ["dotnet", "helloworld.dll"]
5. 在 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>
6. 在 Azure Cloud Shell 编辑器中,编辑 Program.cs:
- 在文件顶部添加一条 using 语句来导入 System.Diagnostics,该语句用于创建相当于OpenTelemetry中 “spans” 的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>
- 使用遥测类的 ActivitySource 在输出响应周围添加遥测跟踪范围。
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();
7. 重建 Hello World 应用程序映像,并通过运行以下命令将该映像推送到 Azure 容器注册表。
az acr build --registry $ACR_NAME --image $APP_NAME .
8. 使用以下命令将更新的 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 应用程序的操作。
- 在 Elastic Cloud 中,选择可观测性 Services 菜单项。
- 单击 helloworld 服务。
- 单击 Transactions 选项卡。
- 向下滚动并单击 GET / transaction。向下滚动到 Trace Sample 部分以查看 GET /、HelloSpan 跟踪示例。
规模化的可观察性
你已经了解了将 Web 应用程序部署到使用 Elastic Observability 进行检测的 Azure 容器应用程序的整个过程。 该网络应用程序现已在网络上完全可用,该平台运行在一个平台上,该平台将自动扩展以服务全球访问者。 它针对 Elastic Observability APM 进行了检测,使用 OpenTelemetry 将数据提取到 Elastic Cloud 的 Kibana 仪表板中。
现在你已经了解了如何使用基本的可观测性设置来部署 Hello World Web 应用程序,请访问 Elastic Observability 以了解有关为你的应用程序扩展为全面的可观测性覆盖解决方案的更多信息。 或者访问 Microsoft Azure 上的 Elastic 入门,获取更多示例,了解如何通过将 Microsoft Azure 的云计算服务与 Elastic 的搜索驱动平台相结合来获得所需的数据洞察。
本文中描述的任何特性或功能的发布和时间安排均由 Elastic 自行决定。 当前不可用的任何特性或功能可能无法按时交付或根本无法交付。
相关文章:

如何在 Azure 容器应用程序上部署具有 Elastic Observability 的 Hello World Web 应用程序
作者:Jonathan Simon Elastic Observability 是提供对正在运行的 Web 应用程序的可见性的最佳工具。 Microsoft Azure 容器应用程序是一个完全托管的环境,使你能够在无服务器平台上运行容器化应用程序,以便你的应用程序可以扩展和缩减。 这使…...

JAVA排序
再看各种排序前我们先了解一下什么叫 稳定性 比如一组数据arr[i]下标与arr[j下标]相等,arr[i]在前面,arr[j]在arr[i]后面,排序后这两个数据仍然是arr[i]在arr[j]前面,arr[j]在arr[i]后面,这就叫稳定 插入排序: 优势: 越有序查找速度越快 时间复杂度: O(N^2) 空间复…...

opencalib中lidar2camera安装记录
目录 一、opencalib安装 二、lidar2camera的安装 三、测试运行 四、出现过的问题 一、opencalib安装 代码地址:https://github.com/PJLab-ADG/SensorsCalibration/blob/master/README.md # pull docker image sudo docker pull scllovewkf/opencalib:v1 # Aft…...

整个自动驾驶小车001:概述
材料: 1,树梅派4b,作为主控,这个东西有linux系统,方便 2,HC-S104超声波模块,我有多个,不少于4个,我可以前后左右四个方向都搞一个 3,l298n模块,…...
windows本地搭建mmlspark分布式机器平台流程
文章目录 windows本地搭建mmlspark分布式机器平台流程安装环境pyspark环境spark环境java环境hadoop环境1.修改hadoop配置文件下的jdk地址为自己的实际地址2.修改bin文件离线环境jar包环境1mmlsprk第三方包jar包环境2参考代码我有话说其他问题记录概要参考文献windows本地搭建mm…...
深入探究 Next.js 中的 getServerSideProps 和 getStaticProps 用法及区别
引言: Next.js 是一个流行的 React 框架,它提供了许多强大的功能来简化服务器渲染(SSR)和静态生成(SSG)的过程。其中,getServerSideProps 和 getStaticProps 是两个重要的函数,用于在…...

餐饮业如何高效经营?赶紧闭眼抄这个方法!
在现代社会,餐饮业已经成为人们日常生活中不可或缺的一部分。为了提高食堂运营效率,满足不断增长的客户需求,智慧收银系统应运而生。 智慧收银系统帮助食堂业主更好地理解其客户,提高服务质量,优化库存管理,…...

餐饮外卖小程序商城的作用是什么
随着互联网及线上餐饮的发展趋势,行业洗牌正在加速,并且对餐饮连锁门店提出更高要求,餐饮数字化转型加快,积极发展线上经营是不少餐饮商家的首选。这其中,餐饮外卖商城成为很多餐饮品牌的线上经营品牌,也是…...

nRF52832 SDK15.3.0 基于ble_app_uart demo FreeRTOS移植
参考资料:Nrf52832 freeOS系统移植_nrf5283操作系统-CSDN博客 这里把移植经验记录下来,供有需要的同学参考,有不对的地方也请大家批评指正。 把FreeRTOS移植到 nRF5_SDK_15.3.0_59ac345\examples\ble_peripheral\ble_app_uart工程ÿ…...

电厂数据可视化三维大屏展示平台加强企业安全防范
园区可视化大屏是一种新型的信息化手段,能够将园区内各项数据信息以图像的形式直观呈现在大屏幕上,便于管理员和员工进行实时监控、分析和决策。本文将从以下几个方面介绍园区可视化大屏的作用和应用。 VR数字孪生园区系统是通过将实际园区的各种数据和信…...
2246: 【区赛】【宁波32届小学生】最佳交换
目录 题目描述 输入 输出 样例输入 样例输出 提示 代码 题目描述 星星小朋友和 N-1 个小伙伴一起玩了一上午的纸牌游戏,星星总是能赢,气焰嚣张, 小伙伴们决定出道纸牌问题难倒星星,让他别再狂妄自大了,问题是这…...
Java面试记录
文章目录 1、final关键字2、synchronized关键字(1)synchronized的功能:(2)synchronized的底层实现原理: 3、Java中线程同步的实现方法(1). 使用synchronized关键字:&…...
【数据库】聚集函数
聚集函数 聚集函数一览AVG() 函数COUNT() 函数MAX() 函数MIN() 函数SUM() 函数 组合聚集函数 聚集函数一览 我们需要汇总数据而不是实际检索,此时我们使用聚集函数进行处理; 聚集函数一览表如下: 函数说明AVG()返回平均值COUNT()返回数量总…...
【单元测试】--编写单元测试
一、编写第一个单元测试 编写第一个单元测试通常包括以下步骤。以下示例以C#和NUnit为例: 创建测试项目: 在Visual Studio中,创建一个新的Class Library项目,这将是你的单元测试项目。在解决方案资源管理器中,右键点…...

ES(elasticsearch) - 三种姿势进行分页查询
1. from size 浅分页 "浅"分页可以理解为简单意义上的分页。它的原理很简单,就是查询前20条数据,然后截断前10条,只返回10-20的数据。这样其实白白浪费了前10条的查询。 GET test_dev/_search {"query": {"bool&…...

AQS是什么?AbstractQueuedSynchronizer之AQS原理及源码深度分析
文章目录 一、AQS概述1、什么是AQS2、技术解释3、基本原理4、AQS为什么这么重要 二、AQS数据结构1、AQS的结构2、ReentrantLock与AbstractQueuedSynchronizer3、AQS的state变量4、AQS的队列5、AQS的Node(1)Node的waitStatus(2)属性…...
【数据库】函数处理(文本处理函数、日期和时间处理函数、数值处理函数)
函数处理数据 算术运算函数文本处理函数日期和时间处理函数数值处理函数 算术运算 操作符说明加-减*乘/除 e . g . e.g. e.g. 列出 Orders 表中所有每项物品的 id,数量 quantity,单价 item_price,总价 expanded_price(数量 * 单价…...

GEE案例——一个完整的火灾监测案例dNBR差异化归一化烧毁指数
差异化归一化烧毁指数 dNBR是"差异化归一化烧毁指数"的缩写。它是一种用于评估卫星图像中烧毁区域严重程度的遥感指数。dNBR值通过将火灾前的归一化烧毁指数(NBR)减去火灾后的NBR来计算得出。该指数常用于野火监测和评估。 dNBR(差异化归一化烧毁指数)是一种用…...

计算机算法分析与设计(20)---回溯法(0-1背包问题)
文章目录 1. 题目描述2. 算法思路3. 例题分析4. 代码编写 1. 题目描述 对于给定的 n n n 个物品,第 i i i 个物品的重量为 W i W_i Wi,价值为 V i V_i Vi,对于一个最多能装重量 c c c 的背包,应该如何选择放入包中的物品…...
什么是IO多路复用?Redis中对于IO多路复用的应用?
IO多路复用是一种高效的IO处理方式,它允许一个进程同时监控多个文件描述符(包括套接字、管道等),并在有数据可读或可写时进行相应的处理。这种机制可以大大提高系统的并发处理能力,减少资源的占用和浪费。 在Redis中&…...

紫光同创FPGA系列实现Aurora 8b/10b协议
特性 1.兼容XILINX aurora IP核 2.支持X1、X2、X4、X8模式(根据硬件条件选择模式) 3.支持FRAMING和STREAMING 用户接口 4.自动初始化和维护链路状态 5.支持热插拔 6.支持扰码、解扰 7.支持流量控制 8.支持crc用户数据 9.支持全双工或者半双工模式 10.最…...
AI不会杀死创作,但会杀死平庸
作为一个敲了8年Java代码的普通本科程序员,日常主要泡在会议后台管理系统的开发里。从2023年底被朋友拽着试了第一把AI工具到现在,电脑手机上的AI软件比外卖App还多——写代码的Copilot、画时序图的工具、聊天的ChatGPT、Deepseek,基本市面上…...

Spring AI(10)——STUDIO传输的MCP服务端
Spring AI MCP(模型上下文协议)服务器Starters提供了在 Spring Boot 应用程序中设置 MCP 服务器的自动配置。它支持将 MCP 服务器功能与 Spring Boot 的自动配置系统无缝集成。 本文主要演示支持STDIO传输的MCP服务器 仅支持STDIO传输的MCP服务器 导入j…...
JavaScript 本地存储 (localStorage) 完全指南
文章目录 JavaScript 本地存储 (localStorage) 完全指南 🔐一、什么是 localStorage?💡二、如何使用 localStorage?🔧1. 存储数据2. 读取数据3. 删除数据4. 清空所有数据 三、存储对象和数组的技巧 🎨1. 存…...
分布式微服务系统架构第144集:FastAPI全栈开发教育系统
加群联系作者vx:xiaoda0423 仓库地址:https://webvueblog.github.io/JavaPlusDoc/ https://1024bat.cn/ https://github.com/webVueBlog/fastapi_plus https://webvueblog.github.io/JavaPlusDoc/ 使用docker搭建常用开发环境 docker安装mysql docker ru…...
接口不是json的内容能用Jsonpath获取吗,如果不能,我们选用什么方法处理呢?
JsonPath 是一种专门用于查询和提取 JSON 数据的查询语言(类似 XPath 用于 XML)。以下是详细解答: JsonPath 的应用场景 API 响应处理:从 REST API 返回的 JSON 数据中提取特定字段。配置文件解析:读取 J…...
Komiko 视频到视频功能炸裂上线!
Komiko 平台作为行业的创新先锋,近日宣布推出全新的视频到视频(Video-to-Video)功能,这一举措犹如一颗重磅炸弹,瞬间在漫画、动画和插画创作的世界里掀起了惊涛骇浪,进一步巩固了其作为 AI 驱动的一体化创作…...

网络安全厂商F5推出AI Gateway,化解大模型应用风险
AI正以前所未见的速度重塑数字化体验。然而,企业在加速落地现代化数字体验的过程中,其在保障和交付AI应用方面仍面临严峻挑战。这些应用需处理海量数据,涉及复杂流量模式,并引入更高级的安全威胁,而企业当前的安全能力…...
ES6——对象扩展之Set对象
在ES6(ECMAScript 2015)中,Set 对象允许存储任何类型的唯一值,无论是原始值还是对象引用。Set 对象有一些有用的方法,可以操作集合中的数据。以下是一些常用的 Set 对象方法: 方法描述 add 向 Set 对象添加…...
撰写脚本,通过发布/joint_states话题改变机器人在Rviz中的关节角度
撰写脚本,通过发布/joint_states话题改变机器人在Rviz中的关节角度 提问 为我写一个改变关节base_spherical_center_high_joint角度的python脚本吧。适用于ROS2的humble 回答 下面是一个适用于 ROS 2 Humble 的 Python 脚本,它会以指定频率持续发布 …...