[WEB API]web api的效能監控(使用nanoprofiler監控每個執行的時間,執行的sql或sp還有執行的參數)
前言
nanoprofiler之前在上一個專案就做了很好的整合,會知道此package的來源也是來自mrkt 的程式學習筆記,當時也是使用dapper,然後整合的是mssql的部份,而這篇想要介紹的則是與oracle的整合,當我們在使用web api的時候,整合起來可能就會分很多部份,資料庫存取的部份,或者是C#(AP server)的部份,另外就是各個ui整合的部份,但是每個環節都是有各自的學問,各個效能都需要有相對應的監控,而nanoprofiler則是針對AP的監控。
各位試想一下我們一個action可能會來自於不同sp或sql,更複雜一點的話可能一個post的參數會有多個數值,而多個數值傳進不同的存取資料的部份,這時候如果有bug或效能瓶頸的時候,其實我們很難去求證到底是哪部份的問題,如果sql或sp有問題的話,假設sp是別的同事寫的,可能我們測試出來的部份,他很難去模擬我們到底是怎麼輸入,他該測試哪些sp或丟進去什麼參數,而只要有了nanoprofiler的話,任何一個action到底呼叫了哪些sp,或者丟了什麼參數都會非常清楚的顯示出來。
導覽
這篇會整合了oracle和dapper還有web api的部份,如果各位對上述的技術皆不熟悉的話,可參考筆者之前的文章,或者自行上網找資源學習,這篇主要記錄的是nanoprofiler整合的部份,而且也不會去特別介紹除了設定nanoprofiler餘外的東西。
在此我裝了四種,.Web代表的是web api要用的,Storages.json代表的是記錄log要用的,Data則是針對數據連線要包裝的
安裝完之後,其實整個專案完全都沒有什麼變化,我們需要到web.config自行加入相對應需要的部份,首先是ConfigSections的部份
<configSections>
<section name="slf4net" type="slf4net.Configuration.SlfConfigurationSection, slf4net" />
<section name="nanoprofiler" type="EF.Diagnostics.Profiling.Configuration.NanoProfilerConfigurationSection, NanoProfiler" />
</configSections>
接著在web.config的configuration的節點底下加入nanoprofiler的設定,circularBufferSize則是要記錄多少筆的意思,以筆者設定的200則是代表超過200筆的話就會刪除掉,也就是queue的先進先出的概念
<nanoprofiler circularBufferSize="200" storage="EF.Diagnostics.Profiling.Storages.Json.JsonProfilingStorage, NanoProfiler.Storages.Json">
<filters>
<add key="_tools" value="_tools/" type="Contain" />
<add key="exts" value="ico,jpg,js,css" type="EF.Diagnostics.Profiling.Web.ProfilingFilters.FileExtensionProfilingFilter, NanoProfiler.Web" />
<add key="ViewProfilingLogsHandler" value="ViewProfilingLogsHandler.*" type="regex" />
</filters>
</nanoprofiler>
簡單設定之後,當我們使用web api就應該可以看到偵測到的效能了,請直接連到您的nanoprofiler/view,就可以看到,以筆者的例子示例
這部份也很簡單,我們只需要把原本回吐的connection再包裝一下,就可以偵測到db的部份了,包括執行什麼sp,或者什麼sql,丟了什麼參數,以筆者的例子如下。
public IDbConnection GetConnection //回傳OracleConnection
{
get
{
string connString = "Data source=localhost/book;User id=C##ANSON;Password=7154;";
var conn= new OracleConnection(connString);
if (ProfilingSession.Current == null)
{
return conn;
}
var dbProfiler = new DbProfiler(ProfilingSession.Current.Profiler);
return new ProfiledDbConnection(conn, dbProfiler);
}
}
最後我測試了新增一百筆資料(花費2100毫秒),還有取得資料(花費314毫秒),然後是以id取得資料的示例(花費68毫秒)
首先來看一下post的部份,執行了EMPLOYEE_CREATE這個sp
data點進去還能看到丟進去的三個參數還有是什麼值
取得所有資料的部份
用id取得資料的部份
有了這個工具,不管是偵測效能,或者直接抓出到底是sp的錯誤還是api的錯誤,或者是前端的錯誤,都會非常的快速,只是當我們在production的時候,我們不會希望能讓人家快速的看光我們呼叫api之後的所有細節,所以我們必須要把nanoprofiler/view關掉,但是如果我們關掉了的話,我們就必須要把這些數據另外做處理,存log或者是把這些數據存到db裡面,而這些方法留待我之後再做介紹了。