西安监控安装_天津监控安装_广州监控安装
西安监控安装_天津监控安装_广州监控安装
在应用程序的实际操作和维护过程中,我们需要更多日志和监视,以使我们能够全面了解应用程序的运行状态。但是,对于大多数开发人员而言,通常要注意的是如何以更高的成本实现业务,或者如何使应用程序的响应速度更快,以及其他与编码相关的技术。对于应用程序监视,它可能仍然停留在日志文件的级别,并且在尝试通过日志查找问题之前,大多数是在车祸中发现的。
本文打算引入的Elastic APM是一组用于监视应用程序的指标,例如系统响应时间,异常,EF执行的SQL记录等,并且可以将这些记录组织到一个可跟踪的链接中,方便查询问题。此外,Elastic APM还可以使用Kibana进行特别漂亮的视觉显示,这对于我们查找和发现问题很方便。
别胡说八道,开始战斗吧〜
弹性APM简介
弹性APM由以下四个组成部分组成西安监控安装,如下所示:
APM代理
APM代理是.NET Core程序中安装的Nuget程序包。它收集各种数据(例如性能和错误),并将收集的数据批量缓存到APM Server。当然,除了.NET Core使用的Nuget程序包之外,它还可以支持许多其他语言,例如Java,Node.Js,Python等。
请参阅此处以获取受支持的语言列表:
APM服务器
APM Server是部署在服务器上的应用程序,用于接收代理发送的数据包,并基于此数据包手动创建文档,然后将数据转储到Elastic Server。
弹性搜索
我相信您对此太熟悉了。它是基于Lucene的高性能,分布式全文搜索引擎西安监控安装,可快速,实时地存储,搜索和分析大量数据。在这里,他提供了数据存储和搜索功能!
基巴纳语
如果您熟悉Elastic Search,那么您将在某种程度上了解Kibana。 Kibana是一个开源分析和可视化平台。它可以与Elastic Search很好地配合使用,以帮助您快速可视化存储在Elastic Search中的数据。并制作各种精美的报告,图形等。
环境规划
在此实际战斗过程中,我们需要满足以下条件:
弹性搜索的安装:
安装Kibana:
我的环境是Centos 7,因此我根据此官方网站教程进行了安装,整个过程非常简单:
server.host: 0.0.0.0 server.name: 主机IP server.port: 一个你喜欢的端口号 elasticsearch.hosts: ["已安装好的ES地址,多个之间用逗号隔开"] logging.dest: /var/log/kibana.log //需要提前把这个文件创建好,然后把权限给够
sudo /bin/systemctl daemon-reload sudo /bin/systemctl enable kibana.service sudo systemctl start kibana.service
在这里您必须注意Elastic Search的版本,并且Kibana必须匹配,否则将报告错误。 (我的ES是在一段时间前安装的,因此会出现此问题。如果一次性安装所有ES,应该不会有问题)
如果不幸遇到问题,可以通过配置文件中logging.dest中配置的路径查看日志。
安装APM服务器
APM Server的安装类似于Kibana的安装,过程如下:
output.elasticsearch: hosts: ["已安装好的ES地址,多个之间用逗号隔开"]
sudo /bin/systemctl daemon-reload sudo /bin/systemctl enable apm-server.service sudo systemctl start apm-server.service
执行上述操作后,尝试在浏览器中打开服务器Ip:8200,最后,如果安装了APM服务器而没有问题,浏览器将复制类似于以下内容:
{ "build_date": "2019-06-20T14:39:23Z", "build_sha": "9a099b63c53eac8c55707df96193143ec66337e9", "version": "7.2.0" }
这时,我们在浏览器中打开Kibana,然后单击“添加APM”
然后向下滚动到新打开的页面,然后单击“检查APM服务器状态”按钮。如果您已经正确设置了APM服务器,则表明安装完成〜
到目前为止,我们的安装工作已经完成。接下来,让我们尝试将.NET Core与Elastic APM集成在一起,让我们一起继续〜
.NET Core应用程序集成
我们创建了一个演示项目来测试APM的各种功能。
请参考GitHub获取该项目的地址:
依赖引用的软件包
我们需要引用Nuget的相关SDK以与我们的应用程序集成。实际上,我们引用了开始时提到的APM代理部分。在Nuget中,我们引用了软件包Elastic.Apm.NetCoreAll。
尽管依赖此程序包等同于手动依赖以下三个程序包,但是根据需要,您也可以仅依赖其中的一些程序包。
在这里,为了简单起见,我们将直接打印软件包Elastic.Apm.NetCoreAll
将代理添加到.NET Core
找到.NET Core的启动文件,并在上述Configure方法中添加以下代码:
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { app.UseAllElasticApm(Configuration); }
然后在application.json中添加以下内容:
{ "ElasticApm": { "LogLevel": "Error", // Log级别,根据自己的需要来定"ServerUrls": "http://localhost:8200", //设置前面安装好的APM Server URL,默认端口号是8200 "ServiceName" : "MyApp", //应用的名字,跟着实际情况起就行,allowed characters: a-z, A-Z, 0-9, -, _, and space. Default is the entry assembly of the application } }
这时,我们启动项目,刷新几次,然后返回到Kibana,在页面上向下滚动,选择.NET,然后单击“检查代理状态”按钮。如果一切顺利,它将显示““从一个或多个代理成功接收到的数据””,如果不幸的是没有显示此句子,则可以通过VS的诊断工具中的“事件”对其进行跟踪,以查看是否没有配置权限。
查看监控数据
在Kibana的“添加APM”页面的底部,找到“加载Kibana对象”以创建索引西安监控安装,然后单击“ APM仪表板”按钮进入APM数据查看页面。
单击“ APM仪表板”按钮后,显示的页面如下:
此页面上的功能分为两个主要功能模块,服务和跟踪。首先,让我们简要了解这两个标签页中的相应功能。
服务
尽管下面列表中显示的XianDotnetCommunity是您在配置文件中配置的ServiceName,但是单击此名称以输入,您将看到以下报告,该报告具有三个选项卡页:“事务”,“错误”和“度量”。
其中
事务:显示当前应用程序请求的概述,包括请求响应时间,请求调用数等。
错误:程序中的异常列表
指标:应用程序所在计算机的CPU /内存使用情况
PS:实际上,我觉得我确实需要当前应用程序占用的视频内存和CPU值,但是实际上,.NET Core版本的代理程序未实现此功能,请耐心等待更新
踪迹
有一个用于链接跟踪的视图。主页包含所有交易的名称列表和响应时间等。
单击特定交易进入,您可以查看交易通过的链接列表以及一些更详细的响应信息,这些信息可以帮助您分析整个链接的困境。我们将在下面讨论更多细节。
探索更多
弹性APM还具有许多其他功能,例如链接跟踪,数据库调用执行,让我们一起探索〜
Monitor API调用链接跟踪
如果您了解微服务架构,那么您必须了解链接跟踪的概念。那么哪些是链接跟踪?给一个栗子:
有一个服务A,它将依赖于服务B和C,服务B将依赖于服务D和E,服务C将依赖于F和G(省去了无数依赖),然后持续三天,服务A似乎很慢,那么如何找到速度较慢的服务呢?至此西安监控安装_天津监控安装_广州监控安装,链接终于派上用场了!
让我们简单地模拟这些嵌套调用:
在一个WebAPI项目Demo1中,有一个带API A的ConsumerController,它在另一个WEB API项目Demo2中调用套接字B / C / D / E。代码大致如下:
项目B:
[Route("api/consumer")] [ApiController] public class ConsumerController : ControllerBase { private readonly IHttpClientFactory _httpClientFactory; public ConsumerController(IHttpClientFactory httpClientFactory) { //使用HttpClientFactory时需要先在StartUp中调用services.AddHttpClient(); _httpClientFactory = httpClientFactory; } private const string baseUri = "http://localhost:54597"; [HttpGet("a")] public async TaskA() { //HttpClient client = new HttpClient(); var client = _httpClientFactory.CreateClient(); Thread.Sleep(new Random().Next(1, 1500)); var b = await client.GetStringAsync($"{baseUri}/api/data-source/b"); var c = await client.GetStringAsync($"{baseUri}/api/data-source/c"); var d = await client.GetStringAsync($"{baseUri}/api/data-source/d"); var e = await client.GetStringAsync($"{baseUri}/api/data-source/e"); return $"b={b} & c={c} & d={d} & e={e}"; } }
项目A:
[Route("api/data-source")] [ApiController] public class DataSourceController : ControllerBase { [HttpGet("b")] public async TaskB() { Thread.Sleep(new Random().Next(1, 1500)); return "B"; } [HttpGet("c")] public async Task C() { Thread.Sleep(new Random().Next(1, 1500)); return "C"; } [HttpGet("d")] public async Task D() { Thread.Sleep(new Random().Next(1, 1500)); return "D"; } [HttpGet("e")] public async Task E() { Thread.Sleep(new Random().Next(1, 1500)); return "E"; } }
这时,我们在Demo1中请求API A(xxx / api / consumer / a),然后在Kibana的APM中打开Traces,并找到记录“ GET Consumer / A”(似乎默认值是,然后单击以查看详细信息。
在详细信息的底部,找到时间线,我们可以看到下图所示的图形:
我们可以看到请求API A所花费的时间花在了调用4个API上,并且还看到了调用第三个API所花费的时间更长。单击红色条以查看请求的详细信息。
这里不好的是,默认显示的名称是GET localhost。实际上,我们希望将其显示为api uri,对吗?我向他们提到了一个公关,每个人都可以关注它:
监控EF执行记录
这不需要过多解释。它用于监视EF何时执行数据库操作,以检测性能和其他问题。我的代码大致如下:
[HttpGet("person")] public void TestEfCore() { using (var db = new ApmDbContext()) { var jax = new Person { Name = "西安.NET社区", Age = 26, Remark = "做最好的技术社区~" }; db.Persons.Add(jax); db.SaveChanges(); db.Persons.FirstOrDefault(x => x.Id == jax.Id ); db.Persons.FirstOrDefault(x => x.Name == "西安.NET社区"); jax.Name = ".NET西安社区"; db.SaveChanges(); db.Persons.Remove(jax); db.SaveChanges(); } }
当我们使用Kibana查看此请求时,时间线显示如下:
我们可以清楚直观地看到在此请求中执行了哪些SQL语句以及每个语句持续了多长时间,这对于我们的请求分析非常有用。单击特定的绿色条以查看更多详细的数据,但是不幸的是,数据中未记录SQL Params,这对于我们完全重现此请求而言还不够友好〜
自己购买要点
相对而言,当前的弹性APM生态系统还不够好,组件的支持比空中行走稍差。如果要使用Elastic APM,将不可避免地自己或为第三方做一些性能数据的埋入记录。当组件和类库提供支持时,还必须完成一些数据埋入点。接下来,我们将保留一些其他信息,我们希望将其记录在请求中。示例代码如下:
[HttpGet] public void RecordMyApmData() { var transaction = Agent.Tracer.CurrentTransaction; var span1 = transaction.StartSpan("Stage 1", "Customize"); Thread.Sleep(300); span1.End(); Thread.Sleep(200); var span2 = transaction.StartSpan("Stage 2", "Customize"); Thread.Sleep(100); span2.End(); Thread.Sleep(100); var span3 = transaction.StartSpan("Stage 3", "Customize"); Thread.Sleep(500); span3.End(); }
最终记录的功效如下:
该演示实际上非常简单,但是我相信您已经知道如何使用Elastic Apm Agent类来自定义您需要捕获的一些监视数据〜
异常监视
当我们的程序中发生异常时,Elastic APM可以帮助您记录它。此功能与日志类似,但可能会略胜于日志。让我们一起看看吧!
示例代码如下:
[HttpGet] public void TestException() { try { throw new Exception("捕获的异常"); } catch (Exception) { } throw new Exception("未捕获的异常"); }
执行代码后,我们可以单击“服务名称”,然后在“错误”选项卡页面中查看异常
单击详细信息,我们可以查看详细的堆栈调用信息:
此外,我们可以在“事务”选项卡中找到对异常的请求,然后单击以查看详细信息。在细节中,我们还可以看到异常的发生:
摘要
本文介绍了如何使用Elastic APM来收集.NET Core应用程序中的性能和异常数据,以及如何使用Kibana进行可视化分析。总体而言,Elastic APM仍然非常强大,可用于性能监视,链接跟踪和异常监视。
目前,Elastic APM支持的组件仍然相对有限。例如,它仅支持EF Core进行数据库查询,不支持更多组件。链接跟踪也仅支持HTTP请求跟踪,而无需支持其他请求。形式。此外,我个人觉得Elastic APM将监视报告(Watcher)放在X-Pack费用包中感到非常难过。尽管异常监视报告仍然非常重要。
欢迎尝试Elastic APM,并一起说明问题〜