详解ElasticAPM实现微服务的链路追踪(NET)

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

前言Elastic APM实现链路追踪,首先要引用开源的APMAgent(APM代理),然后将监控的信息发送到APMServer,然后在转存入ElasticSearch,最后有Kibana展示;具体流程如下图所示:

前言

Elastic APM实现链路追踪,首先要引用开源的APMAgent(APM代理),然后将监控的信息发送到APMServer,然后在转存入ElasticSearch,最后有Kibana展示;具体流程如下图所示:

详解ElasticAPM实现微服务的链路追踪(NET)

 

首先我们下载ElasticSearch、Kibana、APM Server;可以先简单的理解为 ElasticSearch是存储数据用的,Kibana是展示数据用的。

ElasticSearch下载地址:

https://www.elastic.co/cn/downloads/elasticsearch

Kibana下载地址:

https://www.elastic.co/cn/downloads/kibana

APM Server下载地址:

https://www.elastic.co/cn/downloads/apm

在下载时需要注意,ElasticSearch、Kibana、APM Server要下载相同的版本,相同平台的;下图为下载时的注意事项。

详解ElasticAPM实现微服务的链路追踪(NET)

这里我下载的都是window下的安装包,下载文件如下图:

详解ElasticAPM实现微服务的链路追踪(NET)

Elastic免费版本支持内容

安装ElasticSearch

ElasticSearch依赖于java的SDK,所以需要安装Java的SDK。

java安装参考

为了测试,我随便找了一台有java环境的电脑,系统是window10,java环境如下图:

详解ElasticAPM实现微服务的链路追踪(NET)

然后将ElasticSearch压缩包解压,找到configelasticsearch.yml文件,记事本打开,修改配置如下:

cluster.name: kiba001 node.name: master node.master: true network.host: 0.0.0.0 http.cors.enabled: true http.cors.allow-origin: "*" cluster.initial_master_nodes: ["kiba518"]

然后找到bin下面的elasticsearch.bat,双击运行脚本安装ElasticSearch。

详解ElasticAPM实现微服务的链路追踪(NET)

elasticsearch.bat会启动一个CMD窗口,该窗口将是ElasticSearch的宿主,即关闭了他,ElasticSearch就会关闭。

让CMD窗口运行一会,然后打开浏览器,输入 http://localhost:9200 ,显式以下画面,说明ES安装成功。因为我是随机找的有java环境的电脑安装的,所以ElasticSearch虽然依赖于JDK,但似乎对版本并不苛刻。

详解ElasticAPM实现微服务的链路追踪(NET)

安装Kibana

与ElasticSearch类似,将Kibana压缩包解压,找到bin下面的Kibana.bat,双击运行脚本安装Kibana。

Kibana.bat也会启动一个CMD窗口,该窗口将是Kibana的宿主。

让CMD窗口运行一会,然后打开浏览器,输入http://localhost:5601/,显式以下画面,说明kibana安装成功。

详解ElasticAPM实现微服务的链路追踪(NET)

Config文件夹下的kibana.yml是默认的配置文件,想深入研究的可以百度搜索一下这个文件的使用,这里我没有配置,所以使用的都是默认配置,用的请求地址也是localhost。

详解ElasticAPM实现微服务的链路追踪(NET)

修改server.host可以修改请求地址:

server.host: "0.0.0.0"

修改i18n.locale的值为"zh-CN"为,可以启动汉化版本kibana。

详解ElasticAPM实现微服务的链路追踪(NET)

安装APM Server

首先解压APM Server的压缩包,如下图:

详解ElasticAPM实现微服务的链路追踪(NET)

然后在里面找到ApmServer的配置文件apm-server.ym。

将配置文件最开始的host: “localhost:8200”修改成“0.0.0.0:8200”,以便让他能允许通过ip:端口号的方式访问。然后增加elasticsearch地址配置:

apm-server:   # Defines the host and port the server is listening on. Use "unix:/path/to.sock" to listen on a unix domain socket.   host: "0.0.0.0:8200" output.elasticsearch:   hosts: ["localhost:9200"]   #hosts: ["已安装好的ES地址,多个之间用逗号隔开"]

效果如下:

详解ElasticAPM实现微服务的链路追踪(NET)

然后运行apm-server.exe,这里需要注意的是apm-server.exe是个window服务,所以这里不能双击运行。不过安装包中已经有可以启动服务的文件了——install-service-apm-server.ps1。

具体安装ApmServer步骤。

1.从下载页面下载 APM Server Windows zip 文件。

2.将 zip 文件的内容解压缩到 C:Program Files

3.将 apm-server-7.16.3-windows 目录重命名为 APM-Server

4.以管理员身份打开 PowerShell 提示符(右键单击 PowerShell 图标,然后选择以管理员身份运行)。如果运行的是 Windows XP,则可能需要下载并安装 PowerShell。

5.从 PowerShell 提示符处,运行以下命令以将 APM Server 安装为 Windows 服务。

详解ElasticAPM实现微服务的链路追踪(NET)

然后在弹出的页面中输入Y,然后回车。

详解ElasticAPM实现微服务的链路追踪(NET)

注意:如果您的系统禁用了脚本执行,则需要为当前会话设置执行策略,以允许脚本运行。示例:

PowerShell.exe -ExecutionPolicy UnRestricted -File .install-service-apm-server.ps1`

然后我们打开控制面板—管理工具—服务,就可以看到,我们已经安装了一个apm-server的服务了。

不过他的当前状态是未启动,我们右键将服务启动就可以了。

详解ElasticAPM实现微服务的链路追踪(NET)

然后我们浏览http://localhost:8200/,得到如下界面,代表ApmServer已经安装成功了。

详解ElasticAPM实现微服务的链路追踪(NET)

默认的日志在:C:ProgramDataapm-server

联合测试

我们重新打开Kibana——http://localhost:5601/,然后点击AddIntegrations。

然后点击ElasticAPM。

详解ElasticAPM实现微服务的链路追踪(NET)

然后选择Windows。

详解ElasticAPM实现微服务的链路追踪(NET)

然后页面向下拉,点击Check APM Server status——检测APM Server的状态。

详解ElasticAPM实现微服务的链路追踪(NET)

如下图,提示了已经正确安装了APM Server。

详解ElasticAPM实现微服务的链路追踪(NET)

APMAgent使用

首先创建一个NETCore的Web项目,然后引入Elastic相关DLL。

可以单独引用独立的DLL。

也可以直接就引用一个整合的DLL,推荐就引用一个Elastic.Apm.NetCoreAll。

然后在Startup的Configure方法中使用 app.UseElasticApm(Configuration)。

代码如下:

using ... using Elastic; using Elastic.Apm; using Elastic.Apm.AspNetCore; using Elastic.Apm.EntityFrameworkCore; namespace ElasticAPMTest {     public class Startup     {         public Startup(IConfiguration configuration)         {             Configuration = configuration;         }          public IConfiguration Configuration { get; }          public void ConfigureServices(IServiceCollection services)         {              services.AddControllers();         }            public void Configure(IApplicationBuilder app, IWebHostEnvironment env)         {             if (env.IsDevelopment())             {                 app.UseDeveloperExceptionPage();             }             app.UseElasticApm(Configuration);             app.UseRouting();              app.UseAuthorization();              app.UseEndpoints(endpoints =>             {                 endpoints.MapControllers();             });         }     } }

然后appsettings.json修改如下:

{   "Logging": {     "LogLevel": {       "Default": "Information",       "Microsoft": "Warning",       "Microsoft.Hosting.Lifetime": "Information"     }   },   "AllowedHosts": "*",   "ElasticApm": {     "Environment": "production", // Set the service environment     "SecretToken": "",     "ServerUrl": "http://192.168.50.28:8200/", //设置前面安装好的APM Server URL,默认端口号是8200     "LogLevel": "Error", // Log级别,      "ServiceName": "TEST1", //应用的名字     //"CaptureBody": "all",     //"CaptureBodyContentTypes": "application/x-www-form-urlencoded*, text/*, application/json*, application/xml*",     "ServiceVersion": "1.0.0.0"     //"Environment": "staging",     //"CaptureHeaders": "false",     //"TransactionSampleRate": 0.456,     //"TransactionMaxSpans": 375,     //"CaptureBody": "all",     //"CaptureBodyContentTypes": "application/x-www-form-urlencoded*, text/*, application/json*, application/xml*"   } }

然后运行网站,如下图:

详解ElasticAPM实现微服务的链路追踪(NET)

项目运行后,第一行提示我们ElasticAPM收集数据是30000毫秒的间隔,即每30秒采集一次数据。

Github参考网站,可以下载源代码了解更多详情。

查看检测的数据

我们回到刚才Kibana的页面,继续向下拉,如下图(截图已经是中文 了,因为我已经汉化了)。

详解ElasticAPM实现微服务的链路追踪(NET)

点击【检测代理状态】,提示尚未从代理收到任何数据,但我的项目运行正常,所以直接点击加载Kibana对象,然后启动APM,进入服务管理界面。

详解ElasticAPM实现微服务的链路追踪(NET)

点击Test1,这是配置ApmAgent的项目,界面如下。

详解ElasticAPM实现微服务的链路追踪(NET)

可以看到,他已经在检测我的网站的访问和吞吐量等等信息了。

点击【指标】,还有CPU和内存的统计。

详解ElasticAPM实现微服务的链路追踪(NET)

点击【事务】,这里的【时间线】就有我们请求的链路跟踪,即微服务所需的链路跟踪功能。

详解ElasticAPM实现微服务的链路追踪(NET)

结语

如果一个公司存在Java团队和C#团队,我们在使用APM的时候,强烈建议使用ELK,因为大家都统一使用一个工具交流很方便,可以避免非常非常非常多不必要的麻烦。