您的位置:首页 > 运维架构

petapoco 使用 MiniProfiler Glimpse监控

2016-04-22 11:35 363 查看
PetaPoco是一款适用于.Net(window)和Mono(linux)的微小、快速、单文件的微型ORM。

MVCMiniProfiler是Stack
Overflow团队设计的一款对ASP.NETMVC的性能分析的小程序,适用于.Net(window)和Mono(linux)。可以对一个页面本身,及该页面通过直接引用、Ajax、Iframe形式访问的其它页面进行监控,监控内容包括数据库内容,并可以显示数据库访问的SQL(支持EF、EFCodeFirst等
)。并且以很友好的方式展现在页面上。

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

MiniProfiler是以ApacheLicenseV2.0协议发布的,你可以在NuGet找到。

1.安装MiniProfiler
Install-PackageMiniProfiler

Install-PackageMiniProfiler.MVC4

2.在Global.asax加入MiniProfiler相关的监控代码

usingStackExchange.Profiling;

protectedvoidApplication_BeginRequest()
{
if(Request.IsLocal)
{
MiniProfiler.Start();
}
}
protectedvoidApplication_EndRequest()
{
MiniProfiler.Stop();
}


3.修改_Layout.cshtml视图文件

在Views\Shared\_Layout.cshtml文件的body前面加上一段代码,让监控展示在页面上。

增加

@StackExchange.Profiling.MiniProfiler.RenderIncludes()


如图



4.在Web.config加入代码

<system.webServer>
<handlers>
<addname="MiniProfiler"path="mini-profiler-resources/*"verb="*"type="System.Web.Routing.UrlRoutingModule"resourceType="Unspecified"preCondition="integratedMode"/>
</handlers>
</system.webServer>



4.查看运行结果

运行程序,查看页面如下图:





已经可以看到页面生成所需要的时间,此时还没监控到sql的运行情况

5.给内部函数增加监控

varprofiler=MiniProfiler.Current;
using(profiler.Step("获取UserInfo"))
{
tmp=_userService.GetUserInfo(1);
tmp.username="王五";
}


6.给petapoco增加监控,新增DatabaseWithMVCMiniProfiler.cs

usingSystem;
usingSystem.Data;
usingSystem.Data.Common;
usingStackExchange.Profiling;
namespaceSL.ORM.PetaPoco
{
publicclassDatabaseWithMiniProfiler:Database
{
publicDatabaseWithMiniProfiler(IDbConnectionconnection):base(connection){}
publicDatabaseWithMiniProfiler(stringconnectionStringName):base(connectionStringName){}
publicDatabaseWithMiniProfiler(stringconnectionString,stringproviderName):base(connectionString,providerName){}
publicDatabaseWithMiniProfiler(stringconnectionString,DbProviderFactorydbProviderFactory):base(connectionString,dbProviderFactory){}

publicoverrideIDbConnectionOnConnectionOpened(IDbConnectionconnection)//重点
{
//wraptheconnectionwithaprofilingconnectionthattrackstimings
returnnewStackExchange.Profiling.Data.ProfiledDbConnection((DbConnection)connection,MiniProfiler.Current);
}
}

}


7.生成和返回Database

publicDatabaseAccountDbContext
{
get
{
//returnnewDatabase(connectionName);
returnnewDatabaseWithMiniProfiler(connectionName);//使用MiniProfiler监控性能
}
set{this.AccountDbContext=value;}
}


8.再次运行可以看到有了sql的监控









其他监控软件参考资料

Thereareafewwaystodebug/profileNPoco.Theyarelistedbelow,andarecommonlydonebyinheritingfromDatabaseandoverridingaspecificmethod.Note:Makesureyou
instantiateyournewclass(
MyDb
asbelow)whencreatingaDatabasefromthenon.

NanoProfiler是一个EFLearningLabs出品的免费性能监控类库(即将开源)。它的思想和使用方式类似于MiniProfiler的。

是国人设计,并开源.

/content/3539566.html


publicclassMyDb:Database
{
publicMyDb(stringconnectionStringName):base(connectionStringName){}
publicoverrideIDbConnectionOnConnectionOpened(IDbConnectionconn)
{
vardbprofiler=newDbProfiler(profilingSession.Current.Profiler);
returnnewProfiledDbConnection(conn,dbprofiler);
}
}



miniprofiler


http://miniprofiler.com/

publicclassMyDb:Database
{
publicMyDb(stringconnectionStringName):base(connectionStringName){}
publicoverrideIDbConnectionOnConnectionOpened(IDbConnectionconn)
{
returnnewProfiledDbConnection((DbConnection)conn,MiniProfiler.Current);
}
}



Manual


publicclassMyDb:Database
{
publicMyDb(stringconnectionStringName):base(connectionStringName){}
publicoverridevoidOnExecutingCommand(IDbCommandcmd)
{
File.WriteAllText("log.txt",FormatCommand(cmd));
}
}




Glimpse


http://getglimpse.com/

Glimpsewillusuallyhookitselfupbyinstallingthefollowingpackages.
Install-PackageGlimpse.ADO
Install-PackageGlimpse.Mvc4(oryourmvcversion)





ShowlastSQLexecuted
ontheASP.NETerrorpage


Credit:Sam
Saffron
publicclassMyDb:Database
{
publicMyDb(stringconnectionStringName):base(connectionStringName){}

publicoverridevoidOnException(Exceptione)
{
base.OnException(e);
e.Data["LastSQL"]=this.LastSQL;
}
}

voidApplication_Error(objectsender,EventArgse)
{
varlastError=Server.GetLastError();

stringsql=null;
try
{
sql=lastError.Data["LastSQL"]asstring;
}
catch
{
//skipit
}
if(sql==null)return;

varex=newHttpUnhandledException("Anunhandledexceptionoccurredduringtheexecutionofthecurrentwebrequest.Pleasereviewthestacktraceformoreinformationabouttheerrorandwhereitoriginatedinthecode.",lastError);

Server.ClearError();

varhtml=ex.GetHtmlErrorMessage();
html=html.Insert(html.IndexOf("<b>StackTrace:</b>"),@"
<b>LastSql:</b><br><br>
<tablewidth='100%'bgcolor='#ffffccc'>
<tbody>
<tr>
<td><code><pre>"+sql+@"</pre></code></td>
</tr>
</tbody>
</table><br>");

Response.Write(html);
Response.StatusCode=500;
Response.End();
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: