摘要

NanoProfiler是一个开源.NET性能调试类库,CoreProfiler是其.NET Core版本的实现。在之前的一些文章中,我曾介绍过NanoProfiler的主要使用方式,以及如何为生产环境,基于ELK对应用性能进行调试和监控。不过,对于一般的用户来说,尤其是本机开发和小团队开发,搭建ELK,维护这套这套支持系统的稳定运行,学习曲线还是有点高。而如果只是单个app孤立的使用NanoProfiler,则大大浪费了其原本能发挥的跨应用性能调试监控的能力。

本文演示了3个不同平台的后端应用使用CoreProfiler/NanoProfiler实现跨应用的性能调试和监控。这三个应用包括.Net Core和传统的.NET 4.5 Web项目,演示的技术包括:

  • 如何在.NET Core程序中使用CoreProfiler进行Wcf服务、Http REST服务和EntityFramework数据库调用的性能监控;
  • 如何在传统.NET 4.5 Web项目中使用NanoProfiler进行Wcf服务和Http REST服务调用的性能监控;
  • 如何配置CoreProfiler/NanoProfiler实现自动的跨平台&应用的整合性能调试和监控;

完整的示例源码,可以从下面的地址下载:
https://github.com/teddymacn/cross-app-profiling-demo

示例代码目录结构

  • Core.UI - .Net Core Mvc 应用,用于UI呈现,调用外部Wcf服务和Http REST服务
  • Core.Api - .Net Core WebApi 应用,提供Http REST服务,使用EntityFramework进行数据访问
  • Net45.Api - 传统.Net 4.5 WebApi 应用,提供Wcf服务和Http REST服务,调用自己提供的Wcf服务,调用外部.Net Core Api提供的Http REST服务

示例代码运行步骤

  1. 开发环境要求:Windows 7+,IIS7+,VS2015 Update 3,.Net Core SDK VS Tool v1.0.0+;
  2. 从github上git clone上面的示例repo;
  3. 运行run_api.cmd启动Core.Api服务;
  4. 使用VS2015打开Net45.Api项目,按F5运行,确保页面打开显示正在运行;
  5. 运行run_ui.cmd启动Core.UI服务;
  6. 在任意浏览器中访问Core.UI的首页: http://127.0.0.1:3001;
  7. 点击打开页面上的链接,进一步点击链接,查看详细的性能调试的结果;
  8. 点击drill down/drill up链接,查看关联服务调用的性能调试结果;

图示

访问Core.UI首页:

查看Core.UI首页的性能调试结果:

注意上图中的drill down链接,点击这些链接,可以drill down到Core.UI对外发出的Wcf服务和REST服务调用的性能调试结果。比如,如果我们点击http://127.0.0.1/Net45Api/AsyncHandler.ashx旁边的drill down链接:

在进一步点击http://127.0.0.1:3002/?from-Net45Api旁边的drill down,我们可以看到从Net45.Api应用调用Core.Api的REST服务的性能调试结果:

代码解析

Core.UI

Core.UI的project.json中,我们可以看到对CoreProfiler和Wcf相关的nuget package的引用:

Core.UI的Startup中,我们可以看到,开启CoreProfiler性能调试,只需要添加这一行代码(这里的参数true表示开启跨应用drilldown功能):

Net45ApiServiceConfiguration.cs中为Wcf服务的client添加了开启CoreProfiler的Wcf调试的Behavior:

这个static partial方法,是.Net Core中,为由Wcf Connected Services生成的Wcf client代码进行额外配置的标准方式,这里不做详述。

在Core.UI/Controllers/HomeController.cs中,值得一提的是,对自定义REST请求,为使drilldown功能工作,需要添加一个header,使得两个请求的性能调试结果能够互相关联:

调用Wcf服务,无需特殊处理,因为前面添加的WCF Behavior已经自动添加对应的header:

Core.Api

Core.Api因为同样是.Net Core项目,总体配置方式和Core.UI类似,唯一额外的是,为EntityFramework,开启了的CoreProfiler的DB profiling支持:

Net45.Api

Net45.Api是一个传统.Net 4.5项目,在之前的NanoProfiler系列中,已经介绍过NanoProfiler在Web应用中的使用,这里不重复介绍了。这里唯一额外的是,开启了跨应用drilldown功能,和.NetCore项目略有不同,需要左两个步骤。

步骤1,在Web.config中添加NanoProfilerImportModule:

步骤2,在Global.asax.cs中,设置TryToImportDrillDownResult开关为true:

基本上就是这样了,Enjoy!

使用CoreProfiler/NanoProfiler实现跨平台&应用的整合性能调试的更多相关文章

  1. CoreProfiler/NanoProfiler性能调试监控系列总目录

    NanoProfiler - 适合生产环境的性能监控类库 之 基本功能篇 NanoProfiler - 适合生产环境的性能监控类库 之 大数据篇 NanoProfiler - 适合生产环境的性能监控类 ...

  2. CoreProfiler/NanoProfiler

    使用CoreProfiler/NanoProfiler实现跨平台&应用的整合性能调试 摘要 NanoProfiler是一个开源.NET性能调试类库,CoreProfiler是其.NET Cor ...

  3. NanoProfiler - 适合生产环境的性能监控类库 之 大数据篇

    上期回顾 上一期:NanoProfiler - 适合生产环境的性能监控类库 之 基本功能篇 上次介绍了NanoProfiler的基本功能,提到,NanoProfiler实现了MiniProfiler欠 ...

  4. Java的最大优势还是跨平台么?

    之前码农界有码农说Java的最大优势是跨平台,真的是这样么?其实当时网络没这么火爆的时候,确实是这样的,但现在这已然不是了. 跨平台还是Java的最大优势么? 有跨平台需求的仅仅是客户端应用,而不是服 ...

  5. 【译】使用 Flutter 实现跨平台移动端开发

    作者: Mike Bluestein   | 原文地址:[https://www.smashingmagazine.com/2018/06/google-flutter-mobile-developm ...

  6. Java最大的优势真的在于跨平台吗?

    下面讨论仅仅针对PC端和移动端. 曾经是,但如今已经不是了. 有跨平台需求的仅仅是client应用.而不是服务端.比如桌面应用,你的客户可能是Windows用户.也可能是Linux用户,这时候假设不想 ...

  7. SpringBoot | 第二十三章:日志管理之整合篇

    前言 在本系列<第四章:日志管理>中,由于工作中日志这块都是走默认配置,也没有深入了解过,因为部署过程中直接使用了linux中的输出重定向功能,如java -jar xx.jar > ...

  8. 跨平台框架与React Native基础

    跨平台框架 什么是跨平台框架? 这里的多个平台一般是指 iOS 和 Android . 为什么需要跨平台框架? 目前,移动开发技术主要分为原生开发和跨平台开发两种.其中,原生应用是指在某个特定的移动平 ...

  9. 老王讲自制RPC框架.(一.前言与技术选型)

    (#)背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进. 单一应用架构 当网站流量很小时,只 ...

随机推荐

  1. redux学习

    redux学习: 1.应用只有一个store,用于保存整个应用的所有的状态数据信息,即state,一个state对应一个页面的所需信息 注意:他只负责保存state,接收action, 从store. ...

  2. Linux上如何查看物理CPU个数,核数,线程数

    首先,看看什么是超线程概念 超线程技术就是利用特殊的硬件指令,把两个逻辑内核模拟成两个物理芯片,让单个处理器都能使用线程级并行计算,进而兼容多线程操作系统和软件,减少了CPU的闲置时间,提高的CPU的 ...

  3. [原]HAproxy 代理技术原理探究

    HAproxy 技术分享 简介 HAProxy是一款提供高可用性.负载均衡以及基于TCP(第四层)和HTTP(第七层)应用的代理软件 Features 1.免费 2.能够做到4层以上代理 3.高性能 ...

  4. C#项目中文件的具体含义

    1.Bin 目录 用来存放编译的结果,bin是二进制binary的英文缩写,因为最初C编译的程序文件都是二进制文件,它有Debug和Release两个版本,分别对应的文件夹为bin/Debug和bin ...

  5. 图解DevExpress RichEditControl富文本的使用,附源码及官方API

    9点半了,刚写到1.2.   该回家了,明天继续写完. 大家还需要什么操作,留言说一下,没有的我明天继续加. 好久没有玩DevExpress了,今天下载了一个玩玩,发现竟然更新到14.2.5了..我去 ...

  6. [Unity3D]利用Raycast实现物体的选择与操作

    本文系作者原创 转载请注明出处 如果是一个2D的平面项目或者说需要在三维空间选择一个物体时(经常表现为抓取物件),我们需要用到Raycast事件 那么首先先说说什么是Raycast 按照字面上来理解的 ...

  7. mono for android学习过程系列教程(2)

    接着上一讲继续开始写,今天介绍的是安卓的基本组成结构. 在大多数情况下,MONO FOR ANDROID的命名空间和Android的命名空间 是互相映射的.有时候需要大小写,非字母数字字符的用法以及名 ...

  8. ZooKeeper简介

    本文中,我们将对ZooKeeper进行介绍.简单地说,ZooKeeper是一个用来在构成应用的各个子服务之间进行协调的一个服务. 由于其本身并没有特别复杂的机制,因此我们将会把更多的笔墨集中在如何对Z ...

  9. 我认为JS还可以改进的点

    曾经我一度在寻找JS的替代语言,尝试过CoffeeScript/TypeScript/Dart(都是浅尝).不为什么原因,而是当你写的越多的JS,越觉得JS很多时候显得很操蛋.好在ES2015和Bab ...

  10. 利用log4j+mongodb实现分布式系统中日志统一管理

    背景     在分布式系统当中,我们有各种各样的WebService,这些服务可能分别部署在不同的服务器上,并且有各自的日志输出.为了方便对这些日志进行统一管理和分析.我们可以将日志统一输出到指定的数 ...