[WEB API]web api的效能監控(使用nanoprofiler監控每個執行的時間,執行的sql或sp還有執行的參數)

[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,或者丟了什麼參數都會非常清楚的顯示出來。

導覽

  1. 特別說明
  2. 安裝nanoprofiler和初始化
  3. 設定db連線的部份
  4. 結論

 

特別說明

這篇會整合了oracle和dapper還有web api的部份,如果各位對上述的技術皆不熟悉的話,可參考筆者之前的文章,或者自行上網找資源學習,這篇主要記錄的是nanoprofiler整合的部份,而且也不會去特別介紹除了設定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,就可以看到,以筆者的例子示例

 

設定db連線的部份

這部份也很簡單,我們只需要把原本回吐的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裡面,而這些方法留待我之後再做介紹了。