.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 。
访问 出现 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 的集成做到了几乎零代码入侵,界面也非常友好。
演示项目地址
相关文章
net core with 微服务 - 什么是微服务
.net core with 微服务 - 架构图
.net core with 微服务 - ocelot 网关
.net core with 微服务 - consul 注册中心
.net core with 微服务 - seq 日志聚合
关注我的公众号一起玩转技术
上一篇: 吃蛋糕吃到戒指
推荐阅读
-
ASP.NET Core Web程序托管到Windows 服务
-
Linux服务器部署.Net Core笔记:五、安装Nginx
-
ASP.NET Core单文件和多文件上传并保存到服务端的方法
-
asp.net core系列 74 Exceptionless服务端安装
-
ASP.NET Core依赖注入系列教程之服务的注册与提供
-
Linux服务器部署.Net Core笔记:四、安装Supervisor进程守护
-
详解.NET Core+Docker 开发微服务
-
[目录] ASP.Net Core 搭建微服务网站
-
Linux服务器部署.Net Core笔记:目录
-
微信公共服务平台开发(.Net 的实现)4-------语音识别