.Net Core with 微服务 – Elastic APM

  • A+
所属分类:.NET技术
摘要

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

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

Elastic APM

大家对 ELK 套件一定非常熟悉。ELastic APM 同样也是 Elastic 系列产品的一个组件。Elastic APM 是一款免费开源的应用程序性能监控组件。它底层依赖 Elasticsearch 来存储跟查询数据,使用 Kibana 来展示分析数据。它支持多种程序语音的探针,包括 JAVA,.NET, Nodejs 等语音。对于 .NET 的集成非常方便,只要简单的配置就可以采集 .NET 程序的信息,对代码几乎是零入侵。
.Net Core with 微服务 - Elastic APM
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.2     restart: always     container_name: elasticsearch     hostname: elasticsearch     environment:       - discovery.type=single-node     ports:       - 9200:9200       - 9300:9300   kibana:     image: docker.elastic.co/kibana/kibana:7.13.2     restart: always     container_name: kibana     hostname: kibana     environment:       - ELASTICSEARCH_HOSTS=http://elasticsearch:9200     ports:       - 5601:5601     depends_on:       - elasticsearch   apm_server:     image: docker.elastic.co/apm/apm-server:7.13.2     restart: always     container_name: apm_server     hostname: apm_server     command: --strict.perms=false -e     environment:       - output.elasticsearch.hosts=["elasticsearch:9200"]     ports:       - 8200:8200     depends_on:       - kibana       - elasticsearch 

使用 docker-compose 来安装 Elastic APM 。Elastic APM 依赖 elasticsearch kibana,所以 docker-compose 文件需要定义3个service。其中 apm_server 定义depends_on: kibana,elasticsearch 。
.Net Core with 微服务 - Elastic APM
访问 http://localhost:5601 出现 kabina 界面。点击"Add Data" 出现添加 Apm Server 指引。
.Net Core with 微服务 - Elastic APM
滚动到最后,点击 "Check APM Server Status "。
.Net Core with 微服务 - Elastic APM
如果出现 “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接口。
.Net Core with 微服务 - Elastic APM
打开 kibana 界面,点击菜单 “APM” 。
.Net Core with 微服务 - Elastic APM
可以看到我们3个服务已经出现在服务列表里面。列表上显示了环境,TPM等信息。
.Net Core with 微服务 - Elastic APM
点击 “Traces” 标签,这里就会列出刚才所有的请求列表。
.Net Core with 微服务 - Elastic APM
随便点击一个服务,会出现这个服务的详细信息,显示了并发情况,延迟情况,已经请求的历史。

查看调用链

在微服务架构下,服务之间的调用是非常复杂的。这给我们排错的时候带来非常大的压力。现在有了 APM 可以帮我们改进这个问题。Elastic APM 可以帮我们显示每个请求的调用链情况。
.Net Core with 微服务 - Elastic APM
以我们订单服务的获取订单详情接口为例。我们找到/order/OD001 这个请求,点击展示它的明细信息。可以看到这个请求里面包含了另外两次调用。第一次是访问Consul获取会员服务的地址,第二次是访问会员服务获取会员明细信息。点击每一次请求,里面都有详细的元数据。这为我们调试,排错,监控带来了非常大的便利。

Metrics 指标

.Net Core with 微服务 - Elastic APM
这个页面展示了服务的硬件指标,主要是显示了CPU,内存利用率。

总结

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

演示项目地址

https://github.com/kklldog/myhotel_microservice

相关文章

NET Core with 微服务 - 什么是微服务
.Net Core with 微服务 - 架构图
.Net Core with 微服务 - Ocelot 网关
.Net Core with 微服务 - Consul 注册中心
.Net Core with 微服务 - Seq 日志聚合

关注我的公众号一起玩转技术

.Net Core with 微服务 - Elastic APM