.Net Core with 微服务 - Elastic APM
上一次我们介绍了Seq日志聚合组件。这次要给大家介绍的是Elastic APM ,一款应用程序性能监控组件。APM 监控围绕对应用、服务、容器的健康监控,对接口的调用链、性能进行监控。在我们实施微服务后,由于复杂的业务逻辑,服务之间的调用会像蜘蛛网一样复杂。有了调用链监控后服务之间的调用可以用图像的方式展示出来,每个请求的性能,响应等都会记录下来。对于提前防范问题,以及排查问题有非常大的意义。
Elastic APM#
大家对 ELK 套件一定非常熟悉。ELastic APM 同样也是 Elastic 系列产品的一个组件。Elastic APM 是一款免费开源的应用程序性能监控组件。它底层依赖 Elasticsearch 来存储跟查询数据,使用 Kibana 来展示分析数据。它支持多种程序语音的探针,包括 JAVA,.NET, Nodejs 等语音。对于 .NET 的集成非常方便,只要简单的配置就可以采集 .NET 程序的信息,对代码几乎是零入侵。
Elastic APM 的架构由4个部分组成。
- Elasticsearch 负责数据的持久化,查询等能力
- Kibana APM数据的分析展示界面
- APM Agent 每个服务集成对应的 sdk 后就是一个个 agent,负责采集程序的各种指标数据
- 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 。
访问 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<span class="hljs-selector-class">.UseDeveloperExceptionPage</span>();
}
app<span class="hljs-selector-class">.UseRouting</span>();
app<span class="hljs-selector-class">.UseAuthorization</span>();
app<span class="hljs-selector-class">.UseEndpoints</span>(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 的集成做到了几乎零代码入侵,界面也非常友好。
演示项目地址#
https://github.com/zhizhengzhaoxi/myhotel_microservice
相关文章#
NET Core with 微服务 - 什么是微服务
.Net Core with 微服务 - 架构图
.Net Core with 微服务 - Ocelot 网关
.Net Core with 微服务 - Consul 注册中心
.Net Core with 微服务 - Seq 日志聚合