当前位置: 首页 > news >正文

.NET Core 集成 MiniProfiler性能分析工具

前言:

 在日常开发中,应用程序的性能是我们需要关注的一个重点问题。当然我们有很多工具来分析程序性能:如:Zipkin等;但这些过于复杂,需要单独搭建。

 MiniProfiler就是一款简单,但功能强大的应用新能分析工具;可以帮助我们定位:SQL性能问题、响应慢等问题。

 本篇文章将介绍MiniProfiler在Asp.Net Core中如何使用

一、MiniProfiler介绍

  MiniProfiler是一款针对.NET, Ruby, Go and Node.js的性能分析的轻量级程序。可以对一个页面本身,及该页面通过直接引用、Ajax、Iframe形式访问的其它页面进行监控,监控内容包括数据库内容,并可以显示数据库访问的SQL(支持EF、EF CodeFirst等 )。并且以很友好的方式展现在页面上。

    MiniProfiler官网:http://miniprofiler.com/

    MiniProfiler的一个特别有用的功能是它与数据库框架的集成。除了.NET原生的 DbConnection类,MiniProfiler还内置了对实体框架(Entity Framework)以及LINQ to SQL、RavenDb和MongoDB的支持。任何执行的Step都会包括当时查询的次数和所花费的时间。为了检测常见的错误,如N+1反模式,profiler将检测仅有参数值存在差异的多个查询。

二、MiniProfiler用法

 1、Nuget包安装:

//Mvc
Install-Package MiniProfiler.AspNetCore.Mvc
//EF分析添加
Install-Package MiniProfiler.EntityFrameworkCore
//Reids 缓存添加
Install-Package MiniProfiler.Providers.Redis

 2、配置MiniProfiler:修改Startup.cs

  a) 注入MiniProfiler

public void ConfigureServices(IServiceCollection services)
{// ...其他配置...// 注入MiniProfilerservices.AddMiniProfiler(options =>{//获取redis配置var redisOptions = App.GetOptions<RedisOptions>();if (redisOptions.Enable)options.Storage =new RedisStorage((ConnectionMultiplexer)App.GetService<IConnectionMultiplexer> ());elseoptions.Storage = new MemoryCacheStorage(App.GetService<IMemoryCache>(), TimeSpan.FromMinutes(60));//访问地址路由根目录;默认为:/mini-profiler-resourcesoptions.RouteBasePath = "/profiler";//数据缓存时间(options.Storage as MemoryCacheStorage).CacheDuration = TimeSpan.FromMinutes(60);//sql格式化设置options.SqlFormatter = new StackExchange.Profiling.SqlFormatters.InlineFormatter();//跟踪连接打开关闭options.TrackConnectionOpenClose = true;//界面主题颜色方案;默认浅色options.ColorScheme = StackExchange.Profiling.ColorScheme.Dark;//.net core 3.0以上:对MVC过滤器进行分析options.EnableMvcFilterProfiling = true;//对视图进行分析options.EnableMvcViewProfiling = true;//控制访问页面授权,默认所有人都能访问//options.ResultsAuthorize;//要控制分析哪些请求,默认说有请求都分析//options.ShouldProfile;//内部异常处理//options.OnInternalError = e => MyExceptionLogger(e);})// AddEntityFramework是要监控EntityFrameworkCore生成的SQL.AddEntityFramework();
}

  b) 启用MiniProfiler  

public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, IMemoryCache cache)
{// ...其他配置//该方法必须在app.UseEndpoints以前app.UseMiniProfiler();app.UseEndpoints(routes =>{// ...});
}

  c) MVC项目:

   修改 _ViewImports.cshtml    

@using StackExchange.Profiling
@addTagHelper *, MiniProfiler.AspNetCore.Mvc

   将MiniProfiler添加到布局文件(Shared/_Layout.cshtml)中

<mini-profiler />

  d) 运行效果:

三、 Swagger UI接入MiniProfiler

 使用步骤和前面大体一样

 1、下载Swagger页面:

  请先在Github中下载对应版本的swagger页面:https://github.com/domaindrivendev/Swashbuckle.AspNetCore/blob/master/src/Swashbuckle.AspNetCore.SwaggerUI/index.html

 2、添加到项目中,并设置index.html为:内嵌资源

  

  3、修改UseSwaggerUI中间件的配置

app.UseSwaggerUI(c =>
{//Blog.Core.Api 项目命名空间c.SwaggerEndpoint("/swagger/v1/swagger.json", "Blog.Core.API V1");c.IndexStream = () => GetType().GetTypeInfo().Assembly.GetManifestResourceStream("Blog.Core.Api.index.html");
});

  4、获取MiniProfiler的html代码片段 

/// <summary>
/// 获取html片段
/// </summary>
/// <returns></returns>
[HttpGet]
[Route("GetHtml")]
public IActionResult GetHtml()
{var html = MiniProfiler.Current.RenderIncludes(HttpContext);return Ok(html.Value);
}

<!--1、版本号要与nuget包一致;2、id不能为空-->
<script async="async" id="mini-profiler" src="/mini-profiler-resources/includes.min.js?v=4.2.22+4563a9e1ab" data-version="4.2.22+4563a9e1ab" data-path="/mini-profiler-resources/" data-current-id="f6b88311-015a-44ed-bde0-cdab4c2d0d9b" data-ids="ac204d24-e2df-486e-a135-8167336643b7,f6b88311-015a-44ed-bde0-cdab4c2d0d9b" data-position="Left" " data-scheme="Light" data-authorized="true" data-max-traces="15" data-toggle-shortcut="Alt+P" data-trivial-milliseconds="2.0" data-ignored-duplicate-execute-types="Open,OpenAsync,Close,CloseAsync"></script>

 5、在Swagger的Html中添加获取的MiniProfiler片段

<!--1、版本号要与nuget包一致;2、id不能为空-->
<script async="async" id="mini-profiler" src="/mini-profiler-resources/includes.min.js?v=4.2.22+4563a9e1ab" data-version="4.2.22+4563a9e1ab" data-path="/mini-profiler-resources/" data-current-id="f6b88311-015a-44ed-bde0-cdab4c2d0d9b" data-ids="ac204d24-e2df-486e-a135-8167336643b7,f6b88311-015a-44ed-bde0-cdab4c2d0d9b" data-position="Left" " data-scheme="Light" data-authorized="true" data-max-traces="15" data-toggle-shortcut="Alt+P" data-trivial-milliseconds="2.0" data-ignored-duplicate-execute-types="Open,OpenAsync,Close,CloseAsync"></script><!-- 加在页面顶部,下面代码是swagger 代码,可忽略 --><!-- HTML for static distribution bundle build -->
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><!--极速模式--><meta name="renderer" content="webkit" /><meta name="force-rendering" content="webkit" /><title>%(DocumentTitle)</title><link href="./swagger-ui.css" rel="stylesheet"><meta name="viewport" content="width=device-width, initial-scale=1.0"><link rel="stylesheet" type="text/css" href="./swagger-ui.css"><link rel="icon" type="image/png" href="./logo/favicon-32x32.png" sizes="32x32" /><script src="js/jquery-3.3.1.min.js"></script><style>.swagger-ui .opblock-summary-control:focus {outline: none}.swagger-ui .topbar .download-url-wrapper {display: flex;flex: 3;margin-bottom: 0px;justify-content: flex-end;}.swagger-ui .auth-container input[type=password], .swagger-ui .auth-container input[type=text] {min-width: 565px;}html {box-sizing: border-box;overflow-y: scroll;}*,*:before,*:after {box-sizing: inherit;}body {margin: 0;background: #fafafa;}.qqgroup {position: absolute;right: 0px;top: 0px;}.info {float: left;position: relative;width: 100%;}.download-contents {display: none;}/* 滚动槽 */::-webkit-scrollbar {width: 9px;height: 9px;}::-webkit-scrollbar-track {border-radius: 3px;background: rgba(0,0,0,0.06);-webkit-box-shadow: inset 0 0 5px rgba(0,0,0,0.08);}/* 滚动条滑块 */::-webkit-scrollbar-thumb {border-radius: 3px;background: rgba(0,0,0,0.12);-webkit-box-shadow: inset 0 0 10px rgba(0,0,0,0.2);}</style>%(HeadContent)
</head>
<body style=" user-select: text;" >

 6、调用效果:

  

 

   如上图可以查看到所有请求路径及Sql操作耗时,那么如果需要监控指定代码块耗时如何实现呢

四、自定义标记:

   1、添加标记代码:

var miniPro = MiniProfiler.Current;
using (miniPro.Step("Add AuditLog"))
{//保存审计日志await _auditLogService.SaveAsync(auditInfo);
}

  2、取消监控方式:  

using(MiniProfiler.Current.Ignore())
{//代码     
}

 3、当然MiniProfiler还有很多其他功能等待解锁:如监控ADO.NET执行耗时,需要使用:ProfileDBConnection 和 ProfileDBCommand对象:

总结:

 1、MiniProfiler使用非常简单
 2、功能满足日常中程序性能优化相关问题

其他: 

 MiniProfiler的监控列表地址:http://{xxx}/profiler/results-index

  

相关文章:

.NET Core 集成 MiniProfiler性能分析工具

前言&#xff1a; 在日常开发中&#xff0c;应用程序的性能是我们需要关注的一个重点问题。当然我们有很多工具来分析程序性能&#xff1a;如&#xff1a;Zipkin等&#xff1b;但这些过于复杂&#xff0c;需要单独搭建。 MiniProfiler就是一款简单&#xff0c;但功能强大的应用…...

【JAVA开源】基于Vue和SpringBoot的旅游管理系统

本文项目编号 T 063 &#xff0c;文末自助获取源码 \color{red}{T063&#xff0c;文末自助获取源码} T063&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析5.4 用例设计 六、核…...

信息学奥赛一本通 1885:【14NOIP提高组】寻找道路 | 洛谷 P2296 [NOIP2014 提高组] 寻找道路

【题目链接】 洛谷 P2296 [NOIP2014 提高组] 寻找道路 ybt 1885&#xff1a;【14NOIP提高组】寻找道路 【题目考点】 1. 图论&#xff1a;广搜 2. 图论&#xff1a;反图 【解题思路】 设path数组&#xff0c;path[i]表示顶点i出发到终点t是否有路径。 先求path数组&#…...

JVM 基础、GC 算法与 JProfiler 监控工具详解

目录 1、引言 1.1 JVM内存与本地内存 1.2 JVM与JDK的关系 2、JVM基础 2.1 JVM&#xff08;Java Virtual Machine&#xff09; 2.2 Java与JVM的关系 2.3 JVM的内存结构 2.3.1 堆内存 2.3.2 栈内存 2.3.3 方法区 2.3.4 本地方法栈 2.3.5 程序计数器&#xff08;PC寄存…...

nodejs安装及环境配置

一、下载 进入官网https://nodejs.org/en/download/prebuilt-installer下载node.js安装包&#xff0c;选择对应版本的node&#xff0c;这里我选择的是14.21.3版本 二、安装 1、下载完成后&#xff0c;双击“node-v14.21.3-x64.msi”&#xff0c;开始安装Node.js 2、勾选复…...

无人机电力巡检:点亮电力巡检新视野!

一、无人机电力巡查的优势 提高巡检效率&#xff1a;无人机可以搭载高清摄像头、红外热像仪等先进设备&#xff0c;实时拍摄和传输图像&#xff0c;帮助巡检人员快速发现潜在问题&#xff0c;如电线破损、绝缘子污损、设备过热等&#xff0c;从而大大缩短了巡检周期。 降低人…...

详细介绍:API 和 SPI 的区别

文章目录 Java SPI (Service Provider Interface) 和 API (Application Programming Interface) 的区别详解目录1. 定义和目的1.1 API (Application Programming Interface)1.2 SPI (Service Provider Interface) 2. 使用场景2.1 API 的应用场景2.2 SPI 的应用场景 3. 加载和调…...

【面向对象】设计模式概念和分类

零.前提提要 本文章是我考中级软件设计师时的笔记&#xff0c;基本都是一些自己的思路和见解&#xff0c;现记录一下&#xff0c;希望可以帮助到即将考证的同学。 一.面向对象设计模式的概念 二.面向对象的设计模式分类 设计模式确定了所包含的类和实例、他们的角色和写作方式以…...

APK安装包arm64-v8a、armeabi-v7a、x86、x86_64如何区别?(2024年10月1日)

其实就是安卓CPU的进步史 安卓CPU类型: arm64-v8a: 第8代、64位ARM处理器&#xff0c;目前手机大多数是此架构(新手机&#xff0c;可以无脑选择)armeabiv-v7a: 第七代及以上的 ARM 处理器。2011年5月以后生产的大部分安卓设备都使用它armeabi: 第5代、第6代的ARM处理器&#…...

【DataLoom】智能问数 - 自然语言与数据库交互

探索DataLoom的智能问数功能&#xff1a;简化数据库查询 在数据驱动的决策制定中&#xff0c;数据库查询是获取洞察的关键步骤。但是&#xff0c;传统的数据库查询方法往往复杂且技术性强&#xff0c;这限制了非技术用户的使用。DataLoom的智能问数功能正是为了解决这一问题而…...

【Linux】进程地址空间(初步了解)

文章目录 1. 奇怪的现象2. 虚拟地址空间3. 关于页表4. 为什么要有虚拟地址 1. 奇怪的现象 我们先看一个现象&#xff1a; 为什么父子进程从“同一块地址中”读取到的值不一样呢&#xff1f; 因为这个地址不是物理内存的地址 &#xff0c;如果是物理内存的地址是绝对不可能出…...

hdu-6024

hdu-6024 struct node {int x, c;bool operator<(const node &a) const{return x < a.x;} }; // dp[i][0]为到第i个教室且第i个教室不建糖果店的花费前缀和&#xff0c;dp[i][1]为到第i个教室且第i个教室建糖果店的花费前缀和 int dp[N][2]; void solve() {int n;wh…...

jmeter操作数据库

jmeter操作数据库 一、打开数据库 二、jmeter下载驱动&#xff0c;安装jdbc驱动 1、下载好的驱动包 2、将驱动包复制粘贴 存放在包的路径下 &#xff08;1&#xff09;jdk下面 a、路径&#xff1a;jdk1\jre\lib b、jdk1\jre\lib\ext &#xff08;2&#xff09;jmeter下 a、…...

Stable Diffusion绘画 | 如何做到不同动作表情,人物角色保持一致性(上篇)

由于 SD 具有强大的可控性&#xff0c;在固定人物角色方面&#xff0c;SD 是远超 MJ 的&#xff0c; 其中最好用&#xff0c;也是最优先的方法就是训练一个自己专属的角色模型&#xff0c;例如之前使用秋叶训练器得到的 LoRA模型。 另外&#xff0c;如果不想自己训练模型的话…...

中国计量大学《2023年801+2023年819自动控制原理真题》 (完整版)

本文内容&#xff0c;全部选自自动化考研联盟的&#xff1a;《中国计量大学801819自控考研资料》的真题篇。后续会持续更新更多学校&#xff0c;更多年份的真题&#xff0c;记得关注哦~ 目录 2023年801真题 2023年819真题 Part1&#xff1a;2023年完整版真题 2023年801真题…...

本地运行LLama 3.2的三种方法

大型语言模型&#xff08;LLMs&#xff09;已经彻底改变了AI领域&#xff0c;小型模型也在崛起。因此&#xff0c;即使是在旧的PC和智能手机上运行先进的LLMs也成为了可能。为了给大家一个起点&#xff0c;我们将探索三种不同的方法来本地与LLama 3.2进行交互。 先决条件 在我…...

基于单片机的温度和烟雾检测

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DS18B20读取温度&#xff0c;滑动变阻器链接ADC0832数模转换模拟烟雾&#xff0c; 通过lcd1602显示屏显示&#xff0c; 超过阈值则对应的led灯亮起&#xff0c;蜂鸣器…...

利士策分享,探寻中华民族的精神纽带

利士策分享&#xff0c;探寻中华民族的精神纽带 在历史的长河中&#xff0c;中华民族以其独特的文化魅力和坚韧不拔的民族精神&#xff0c;屹立于世界民族之林。 这份力量&#xff0c;源自何处&#xff1f;或许&#xff0c;正是那份纯真的情&#xff0c;如同纽带一般&#xff…...

JAVA思维提升案例3

需求&#xff1a; 某系统的数字密码是一个四位数&#xff0c;如1983&#xff0c;为了安全&#xff0c;需要加密后再传输&#xff0c;加密规则是&#xff1a;对密码中的每位数&#xff0c;都加5 ,再对10求余&#xff0c;最后将所有数字顺序反转&#xff0c;得到一串加密后的新数…...

vscode配置golang

1.安装golang解释器 从网址https://go.dev/dl/下载对应的golang解释器 2.配置环境 Extensions中搜索安装go 2.配置settings.json {"go.autocompleteUnimportedPackages": true,"go.gocodeAutoBuild": false,"explorer.confirmPasteNative"…...

设计模式之原型模式(通俗易懂--代码辅助理解【Java版】)

文章目录 设计模式概述1、原型模式2、原型模式的使用场景3、优点4、缺点5、主要角色6、代码示例7、总结题外话关于使用序列化实现深拷贝 设计模式概述 创建型模式&#xff1a;工厂方法、抽象方法、建造者、原型、单例。 结构型模式有&#xff1a;适配器、桥接、组合、装饰器、…...

Study-Oracle-10-ORALCE19C-RAC集群维护

一路走来&#xff0c;所有遇到的人&#xff0c;帮助过我的、伤害过我的都是朋友&#xff0c;没有一个是敌人。 一、RAC的逻辑架构与进程 1、RAC 与单实例进程的对比 2、RAC相关进程功能 3、在主机查看RAC进程 其他的不列举了 4、RAC集群启停命令 检查集群状态 ORACLE 19C …...

【无题】夜入伊人笑愉,泪湿心夜难眠。

在这句诗中&#xff0c;意境描绘了一种深沉的情感体验&#xff0c;充满了温柔与哀愁。诗人通过“夜入伊人笑愉”开启了一段梦境之旅&#xff0c;其中“夜入”象征着进入梦境的状态。在这个梦幻的世界里&#xff0c;诗人与心爱的人欢笑嬉戏&#xff0c;那份快乐和亲昵如同真实的…...

docker下载mysql时出现Unable to pull mysql:latest (HTTP code 500) server error 问题

报错 Unable to pull mysql:latest (HTTP code 500) server error - Get “https://registry-1.docker.io/v2/”: EOF 解决方法 将VPN开到Global模式 解决啦...

厦门网站设计的用户体验优化策略

厦门网站设计的用户体验优化策略 在信息化快速发展的今天&#xff0c;网站作为企业与用户沟通的重要桥梁&#xff0c;用户体验&#xff08;UX&#xff09;的优化显得尤为重要。尤其是在交通便利、旅游资源丰富的厦门&#xff0c;吸引了大量企业进驻。在这样竞争激烈的环境中&am…...

Fastjson反序列化

Fastjson反序列化一共有三条利用链 TempLatesImpl&#xff1a;实战中不适用JdbcRowSetImpl&#xff1a;实际运用中较为广泛BasicDataSource&#xff08;BCEL&#xff09; 反序列化核心 反序列化是通过字符串或字节流&#xff0c;利用Java的反射机制重构一个对象。主要有两种…...

Python Linux解压安装脚本

本脚本用于安装python3.x, 需要指定python版本&#xff0c;如12代表3.12 安装文件下载自 python-build-standalone 我下载的文件后缀是&#xff1a;-x86_64-unknown-linux-gnu-pgo-full.tar.zst&#xff0c;根据需要自行下载 注意&#xff1a;install_only或tar.gz包的目录没有…...

numpy 逻辑运算方法介绍

在 NumPy 中&#xff0c;逻辑运算方法用于对数组中的元素进行逻辑操作&#xff0c;通常用于布尔数组&#xff0c;也可用于数值数组&#xff0c;非零值视为 True&#xff0c;零值视为 False。常见的逻辑运算方法有&#xff1a; 1. numpy.logical_and 逐元素进行逻辑与运算&…...

怎么查看网站是否被谷歌收录,查看网站是否被谷歌收录的简便方法

查看网站是否被谷歌收录&#xff0c;有多种简便方法可供选择。以下是一些常用的简便方法&#xff1a; 一、使用“site:”指令 打开谷歌搜索引擎&#xff1a; 在浏览器中打开Google.com&#xff0c;确保使用的是谷歌的官方搜索引擎。 输入查询指令&#xff1a; 在搜索框中输…...

【前端开发入门】前端开发环境配置

目录 引言一、Vscode编辑器安装1. 软件下载2. 软件安装3. 插件安装 二、Nodejs环境安装及版本控制1. 安装内容2. 使用nvm安装2.1 软件下载并安装2.2 nvm基本指令2.3 nvm下载过慢导致超时解决 三、git安装及配置1. 软件下载2. 软件安装3. 基础配置 四、总结 引言 本系列教程旨在…...