下一个计划 : .NET/.NET Core应用性能管理

前言

最近几个月一直在研究开源的APM和监控方案,并对比使用了Zipkin,CAT,Sky-walking,PinPoint(仅对比,未实际部署),Elastic APM,TICK Stack,Prometheus等开源产品,其中不乏功能强大的监控和追踪系统,但它们都对.NET/.NET Core没有支持或支持不够完备。而在.NET/.NET Core平台也仅有Metrics.NET,AppMetrics,MiniProfiler等轻量级监控组件,它们也都和功能完备的APM系统差距甚远,也无法完全满足对当前流行的微服务系统进行全链路追踪和端对端监控的需求。为了满足实际的监控需求以及自身对APM系统的研究刨析,我决定从零开发.NET/.NET Core的APM,它应该包含

  1. Http请求监控

  2. 应用健康检查

  3. 方法执行监控

  4. 应用内数据库访问监控

  5. 应用内缓存访问监控(Redis)

  6. CLR/CoreCLR Runtime/GC/Threading监控

  7. 请求链路监控

  8. 分布式追踪

为了实现如上需求,我创建了AspectCoreAPM(基于AspectCore AOP的APM client agent)和Butterfly(独立的分布式追踪Server)两个开源项目,你可以在dotnet-lab[https://github.com/dotnet-lab]这个github organization下找到它们。下面将分别对两个项目进行简单介绍。

Butterfly--A distributed tracing server

Butterfly被设计为分布式追踪和APM的Server端,它将包含Collector,Storage,独立的Web UI,并使用Open Tracing规范来设计追踪数据。目前仅根据规范实现了Open Tracing API。

AspectCoreAPM

AspectCoreAPM抽象了APM的应用探针设计,它将会使用自动探针(收集CLR/CoreCLR数据),AOP探针(收集方法执行数据)和手动探针(业务数据)三种方式来收集数据发送到不同Collector Server或Storage。鉴于Butterfly Server并未完全实现,现阶段使用InfluxDB作为数据存储,并使用Grafana进行监控展示(在Butterfly Server完成后在Web UI进行统一的监控数据展示)。AspectCoreAPM目前已经完成了Http请求监控,简单的GC/Threading监控和RedisClient监控。
在使用AspectCoreAPM之前,我们需要先安装InfluxDB和Grafana。

在这里我使用ubuntu作为演示,如需在其他系统安装InfluxDB和Grafana,请各自参考它们的文档:  
InfluxDb:https://portal.influxdata.com/downloads  Grafana:https://grafana.com/grafana/download

安装InfluxDB:

wget https://dl.influxdata.com/influxdb/releases/influxdb_1.4.2_amd64.debsudo dpkg -i influxdb_1.4.2_amd64.deb

安装之后,执行influx进入influxdb的CLI,并创建一个名称为aspectcore的database:

CREATE DATABASE aspectcore

然后安装Grafana:

wget https://s3-us-west-2.amazonaws.com/grafana-releases/release/grafana_4.6.2_amd64.deb sudo dpkg -i grafana_4.6.2_amd64.deb

Grafana默认绑定的http地址为localhost,我们需要修改http_addr才可在外部访问Grafana,使用vi打开Grafana的配置文件:

sudo vi /etc/grafana/grafana.ini

找到http_addr配置修改为0.0.0.0:3000或你的外网IP。

在浏览器打开Grafana,默认账号和密码均为admin,然后添加DataSource。Type选择influxdb,并且database填写我们上面创建的aspectcore

下载并导入AspectCoreAPM的Dashborad : https://grafana.com/dashboards/3837

接下来创建一个Asp.Net Core项目,并从nuget添加AspectCoreAPM:

Install-Package AspectCore.APM.AspNetCoreInstall-Package AspectCore.APM.LineProtocolCollectorInstall-Package AspectCore.APM.ApplicationProfiler

修改Startup.cs

public class Startup{   

 public Startup(IConfiguration configuration)    {Configuration = configuration;}    
 
 public IConfiguration Configuration { get; }    // This method gets called by the runtime. Use this method to add services to the container.
  public IServiceProvider ConfigureServices(IServiceCollection services)    {services.AddMvc();services.AddAspectCoreAPM(component =>{component.AddApplicationProfiler();
  //注册ApplicationProfiler收集GC和ThreadPool数据component.AddHttpProfiler();      
    //注册HttpProfiler收集Http请求数据component.AddLineProtocolCollector(options => //注册LineProtocolCollector将数据发送到InfluxDb{options.Server = "http://192.168.3.4:8086"; //你自己的InfluxDB Http地址options.Database = "aspectcore";    //你自己创建的Database});});      
    return services.BuildAspectCoreServiceProvider(); //返回AspectCore AOP的ServiceProvider,这句代码一定要有}  
    
     // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
      public void Configure(IApplicationBuilder app, IHostingEnvironment env)    {app.UseAspectCoreAPM();     //启动AspectCoreAPM,这句代码一定要有app.UseHttpProfiler();      //启动Http请求监控if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseMvc();} }

启动应用并访问页面。最后回到Grafana,在DataSource处选择aspectcore,就能看到我们的监控数据啦。

有问题反馈

希望有更多的.NET/.NET Core开发者能关注到这个项目并参与进来。
如果您有任何问题,请提交 Issue 给我们。
Github : https://github.com/dotnet-lab/AspectCore-APM
如果您觉得此项目对您有帮助,请点个Star~
AspectCore QQ群: 306531723

原文:http://www.cnblogs.com/liuhaoyang/p/next-plan-apm.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/322792.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

详解proxy_pass、upstream与resolver

转载自 详解proxy_pass、upstream与resolver 应用场景 这里列举几个应用场景,下文会针对这几个场景并结合代码进行分析。 (1)proxy_pass upstream upstream foo.example.com {server 127.0.0.1:8001;}server {listen 80;server_na…

如何用python将srt文件转化成数组形式

原srt文件 0 00:00:00,150 --> 00:00:11,430 Fighting this pandemic needs political commitment and commitment at the highest level possible and the Presidents commitment.1 00:00:11,431 --> 00:00:16,020 you have what it is in it and the would it have se…

架构演化:云原生时代开启之系列一演化篇

信息技术从出现伊始到渐成主流,其趋势经历了软件、开源和云三个阶段: 软件改变世界。纵观人类社会漫长的发展历程,农耕时代、工业时代与信息时代可谓是三个明显分水岭,每个时代人类涉及的领域范畴均喷井式增长。作为信息时代最重要…

mysql出现unblock with 'mysqladmin flush-hosts'

转载自 mysql出现unblock with mysqladmin flush-hosts 朋友发来消息,说一个系统应用登录的时候提示连接超时,让帮忙处理一下。 问他应用和数据库是否都正常,回复说数据库好像没有问题,但是应用日志报无法连接数据库。 数据库版…

laravel部署到服务器显示Permission denied

解决这个问题可以先cd到项目根目录中 依次输入以下两个命令 find storage -type d -exec chmod 777 {} \;find storage -type f -exec chmod 777 {} \;不报错就证明成功了

亿些模板【数论数学】

文章目录前言数论数学模板GCDexgcd快速幂线性推逆元线性推逆元(非连续)逆元求组合数矩阵乘法线性筛素数-埃氏筛线性筛素数-线性筛线性筛欧拉-埃氏筛线性求欧拉龟速乘FFTNTT分治FFT多项式求逆扩展中国剩余定理Lucas定理高斯消元BSGS拉格朗日插值二次剩余线性基杜教筛前言 因为老…

基于OIDC(OpenID Connect)的SSO

在[认证授权]系列博客中,分别对OAuth2和OIDC在理论概念方面进行了解释说明,其间虽然我有写过一个完整的示例(https://github.com/linianhui/oidc.example),但是却没有在实践方面做出过解释。在这里新开一个系列博客&am…

Consul集群搭建

转载自 Consul集群搭建 概述 作为服务发现的几种产品,比较可以查看这里。Consul官方也提供了几种产品之间的比较,点击查看。 服务发现产品 Consul有很多组件,但总体来说,它是一个发现和配置服务工具,特性&#xff…

js遍历对象的key和value

如果想要得到数组的键值对,可以用以下方法 object {"name":"kejin","age":"18"}for(var index in object){console.log(index);console.log(object[index]); }

亿些模板【字符串+其他】

文章目录前言其他快读快输卡常DataMakerDataMakerDataMaker字符串模板KMP字符串hashTrie最小表示法ManacherAC自动机SASAM广义SAMPAM其他模板凸包模拟退火前言 因为老是懒得打模板的时候老是扣不到自己的标(因为之前的都打得太丑了),所以导致我十分的不爽。便打算开…

使用Identity Server 4建立Authorization Server (6) - js(angular5) 客户端

预备知识: 学习Identity Server 4的预备知识 第一部分: 使用Identity Server 4建立Authorization Server (1) 第二部分: 使用Identity Server 4建立Authorization Server (2) 第三部分: 使用Identity Server 4建立Authorization Server (3) 第四部分: 使用Identity Server 4建立…

SpringBoot整合kafka(实现producer和consumer)

转载自 SpringBoot整合kafka(实现producer和consumer) 在Windows环境下安装运行Kafka&#xff1a;https://www.jianshu.com/p/d64798e81f3b 本文代码使用的是Spring Boot 2.1.1.RELEASE 版本 <parent><groupId>org.springframework.boot</groupId><art…

js的字符串和变量拼接

使用反引号拼接字符串和变量 let count 1 name 用户${count} console.log(name);注意是反引号不是引号&#xff0c;反引号是Esc下面的一个按键

ASP.NET Core 认证与授权[7]:动态授权

基于资源的授权 有些场景下&#xff0c;授权需要依赖于要访问的资源&#xff0c;例如&#xff1a;每个资源通常会有一个创建者属性&#xff0c;我们只允许该资源的创建者才可以对其进行编辑&#xff0c;删除等操作&#xff0c;这就无法通过[Authorize]特性来指定授权了。因为授…

maven中scope属性的

转载自 maven中scope属性的 Dependency Scope 在POM 4中&#xff0c;<dependency>中还引入了<scope>&#xff0c;它主要管理依赖的部署。目前<scope>可以使用5个值&#xff1a; * compile&#xff0c;缺省值&#xff0c;适用于所有阶段&#xff0c;会随着…

P3384-[模板]树链剖分

正题 题目大意 要求支持路径加和求和&#xff0c;子树加和求和 解题思路 树剖不解释 codecodecode #include<cstdio> #include<algorithm> using namespace std; const int N200000; int tot,cnt,n,m,s,p,ls[N],pw[N],id[N]; int siz[N],dep[N],f[N],son[N],seg…

H5的Websocket基本使用

前端代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> </head> &…

springboot手动提交kafka offset

转载自 springboot手动提交kafka offset enable.auto.commit参数设置成了false 但是测试发现enable.auto.commit参数设置成了false&#xff0c;kafka的offset依然提交了&#xff08;也没有进行人工提交offset&#xff09;。 查看源码 如果我们enable.auto.commit设置为false…

P2114-[NOI2014]起床困难综合症【位运算】

正题 题目大意 若干个位操作&#xff0c;求一个值xxx使得进行了以后的最大值。 解题思路 每位分开运算计算出每一位为0和为1时的结果&#xff0c;然后贪心选择。 codecodecode // luogu-judger-enable-o2 #include<cstdio> using namespace std; int n,m,ans,t; char …

可观测性与原生云监控

在近日发表的一篇文章中&#xff0c;Cindy Sridharan概括介绍了可观测性及其与原生云应用程序监控的关系。可观测性是一种理念&#xff0c;包括监控、日志聚合、指标和分布式跟踪&#xff0c;可以实时更深入地观察系统。 Sridharan的文章基于她就同一个主题所做的Velocity演讲。…