ASP.NET Core 实现微服务 - Elastic APM

devtools/2025/1/12 23:50:32/

这次要给大家介绍的是Elastic APM ,一款应用程序性能监控组件。APM 监控围绕对应用、服务、容器的健康监控,对接口的调用链、性能进行监控。在我们实施微服务后,由于复杂的业务逻辑,服务之间的调用会像蜘蛛网一样复杂。有了调用链监控后服务之间的调用可以用图像的方式展示出来,每个请求的性能,响应等都会记录下来。对于提前防范问题,以及排查问题有非常大的意义。

Elastic APM

大家对 ELK 套件一定非常熟悉。ELastic APM 同样也是 Elastic 系列产品的一个组件。Elastic APM 是一款免费开源的应用程序性能监控组件。它底层依赖 Elasticsearch 来存储跟查询数据,使用 Kibana 来展示分析数据。它支持多种程序语音的探针,包括 JAVA,.NET, Nodejs 等语音。对于 .NET 的集成非常方便,只要简单的配置就可以采集 .NET 程序的信息,对代码几乎是零入侵。
 


Elastic APM 的架构由4个部分组成。

  1. Elasticsearch 负责数据的持久化,查询等能力
  2. Kibana APM数据的分析展示界面
  3. APM Agent 每个服务集成对应的 sdk 后就是一个个 agent,负责采集程序的各种指标数据
  4. APM Server ,agent 采集到数据后会上报给 APM Server ,由APM Server汇集数据后存储到 Elasticsearch 。

使用 docker-compose 安装

elasticsearch:image: docker.elastic.co/elasticsearch/elasticsearch:7.13.2restart: alwayscontainer_name: elasticsearchhostname: elasticsearchenvironment:- discovery.type=single-nodeports:- 9200:9200- 9300:9300kibana:image: docker.elastic.co/kibana/kibana:7.13.2restart: alwayscontainer_name: kibanahostname: kibanaenvironment:- ELASTICSEARCH_HOSTS=http://elasticsearch:9200ports:- 5601:5601depends_on:- elasticsearchapm_server:image: docker.elastic.co/apm/apm-server:7.13.2restart: alwayscontainer_name: apm_serverhostname: apm_servercommand: --strict.perms=false -eenvironment:- output.elasticsearch.hosts=["elasticsearch:9200"]ports:- 8200:8200depends_on:- kibana- elasticsearch

使用 docker-compose 来安装 Elastic APM 。Elastic APM 依赖 elasticsearch kibana,所以 docker-compose 文件需要定义3个service。其中 apm_server 定义depends_on: kibana,elasticsearch 。
 


访问 http://localhost:5601 出现 kabina 界面。点击"Add Data" 出现添加 Apm Server 指引。
 


滚动到最后,点击 "Check APM Server Status "。
 


如果出现 “You have correctly setup APM Server” 的提示,说明我们的APM Server安装成功了。

在 ASP.NET Core 集成 Elastic APM

Install-Package Elastic.Apm.NetCoreAll

使用 nuget 来安装 Elastic APM 的sdk包。在 nuget 上搜索 Elastic apm 会出现多个包,这里选择 Elastic.Apm.NetCoreAll 包。

  "ElasticApm": {"ServerUrls": "http://192.168.18.164:8200", //Set custom APM Server URL "ServiceName": "ordering_service", //allowed characters: a-z, A-Z, 0-9, -, _, and space. Default is the entry assembly of the application"Environment": "dev" // Set the service environment}

在 appsettings.json 文件内添加一个 ElasticApm 节点。

  • ServerUrls:apm server 地址
  • ServiceName: 服务的名称
  • Environment:环境
     public void Configure(IApplicationBuilder app, IWebHostEnvironment env){app.UseAllElasticApm(Configuration);if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseAuthorization();app.UseEndpoints(endpoints =>{endpoints.MapControllers();});}

在 startup 类的 Configure 方法的顶部注入 ElasticApm 的中间件。这样 Elastic APM 就跟 asp.net core 集成好了,整个过程还是很方便的。

查看 Kibana UI

我们把几个示例项目集成后之后运行起来,随便访问几个http接口。
 


打开 kibana 界面,点击菜单 “APM” 。
 


可以看到我们3个服务已经出现在服务列表里面。列表上显示了环境,TPM等信息。
 


点击 “Traces” 标签,这里就会列出刚才所有的请求列表。
 


随便点击一个服务,会出现这个服务的详细信息,显示了并发情况,延迟情况,已经请求的历史。

查看调用链

在微服务架构下,服务之间的调用是非常复杂的。这给我们排错的时候带来非常大的压力。现在有了 APM 可以帮我们改进这个问题。Elastic APM 可以帮我们显示每个请求的调用链情况。
 


以我们订单服务的获取订单详情接口为例。我们找到/order/OD001 这个请求,点击展示它的明细信息。可以看到这个请求里面包含了另外两次调用。第一次是访问Consul获取会员服务的地址,第二次是访问会员服务获取会员明细信息。点击每一次请求,里面都有详细的元数据。这为我们调试,排错,监控带来了非常大的便利。

Metrics 指标


这个页面展示了服务的硬件指标,主要是显示了CPU,内存利用率。

总结

我们通过以上内容,介绍了什么是Elastic APM ,如何安装Elastic APM,如何在 ASP.NET Core 程序里集成 Elastic APM 的 sdk ,以及简单介绍了 Kibana 上的展示信息,特别是服务调用链的内容。可以看到Elastic APM 还是非常不错的一款 APM 组件,特别是对 ASP.NET Core 的集成做到了几乎零代码入侵,界面也非常友好。


http://www.ppmy.cn/devtools/150001.html

相关文章

外观模式详解与应用

外观模式(Facade Pattern),也称为门面模式,是一种结构型设计模式。它提供了一个统一的接口来访问子系统中的一组接口,从而简化了高层模块对子系统的使用。通过外观模式,可以将复杂的子系统封装起来&#xf…

HTML5 渐变动画(Gradient Animation)

HTML5 渐变动画(Gradient Animation) 渐变动画是一种动态效果,通过改变元素的背景颜色或其他属性来实现渐变变化。以下是如何使用 CSS 和 HTML5 创建渐变动画的详细说明。 1. 基本概念 渐变动画:通过在不同颜色之间平滑过渡来创…

windows安装wsl

安装Windows Subsystem for Linux (WSL): • 打开PowerShell并运行以下命令安装WSL: wsl --install Windows PowerShell 版权所有 © Microsoft Corporation。保留所有权利。 尝试新的跨平台 PowerShell https://aka.ms/pscore6 PS C:\Users\Admi…

P7012 [CERC2013] Draughts

网址如下&#xff1a; P7012 [CERC2013] Draughts - 洛谷 | 计算机科学教育新生态 有点坑了&#xff0c;白棋不止一个&#xff0c;而题目说“你会得到一个白棋的位置” 总的来说就是dfs硬做 代码如下&#xff1a; #include<cstdio> #include<cstring> #include&…

LeetCode - #186 翻转字符串里的单词 II(会员题)

网罗开发 &#xff08;小红书、快手、视频号同名&#xff09; 大家好&#xff0c;我是 展菲&#xff0c;目前在上市企业从事人工智能项目研发管理工作&#xff0c;平时热衷于分享各种编程领域的软硬技能知识以及前沿技术&#xff0c;包括iOS、前端、Harmony OS、Java、Python等…

C# 获取某日期所属当周、当月的第一天和最后一天

见过不少人、经过不少事、也吃过不少苦&#xff0c;感悟世事无常、人心多变&#xff0c;靠着回忆将往事串珠成链&#xff0c;聊聊感情、谈谈发展&#xff0c;我慢慢写、你一点一点看...... 1、获取某日期所在周的第一天 public DateOnly GetFirstDayOfWeek(DateTime dateTime)…

人工智能前沿探讨:从Transformer架构到机器意识与迁移学习的应用

Transformer架构可能为理解人脑的运作提供新的视角 Transformer架构与人脑的相似之处是一个颇受关注的话题。虽然人脑和Transformer架构之间有许多差异&#xff0c;但也有一些相似之处&#xff0c;值得我们探讨。 相似之处: 注意力机制: Transformer架构中的注意力机制是它的…

AI刷题-数位长度筛选问题、数值生成与运算问题

目录 一、数位长度筛选问题 问题描述 测试样例 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤 关键点 最终代码&#xff1a; 运行结果&#xff1a; 二、数值生成与运算问题 问题描述 测试样例 解题思路&#xff1a; 问题理解 数据结构选择 算法步骤…