想觀察某個老 .NET 程式的 Oracle 連線數使用狀況,之前慣用的 v$Session 查詢法在本案因沒有所需 DB 權限行不通。爬文查到 ODP.NET 23.3.2 開始支援 .NET 效能遙測,可整合 .NET OpenTelemetry 串接 Prometheus、Grafana、Azure 監視器等現代應用程式效能監控平台(Application Performance Monitoring, APM)。

看完高大上的現代科技回到現實世界,老系統用的還是舊版 Managed ODP.NET,沒理由配合日常修繕改版升級,所以只能遵循古法 - 開效能監視器蒐集連線狀態數據。延伸閱讀:SQL Connection Pooling 行為觀察

Managed ODP.NET 用法簡便,只需在專案新增 NuGet 參照即可使用不需額外安裝,但要用效能計數器得乖乖安裝 Oracle ODAC。在安裝目錄找到 product\<版號>\client\odp.net\managed\x64,裡面有個 OraProvCfg.exe 是註冊計數器的必要工具。參考內附的 configure.bat,我寫了個 reg-perfcounter.bat 自動取得 DLL 路徑註冊,方便未來重複利用:

OraProvCfg /action:register /product:odpm /component:perfcounter /providerpath:"%~dp0..\Common\Oracle.ManagedDataAccess.dll"

註冊完成,在效能監視器便會多出 "ODP.NET, Managed" 項目可選:

計數器說明如下:參考 (LLM 翻譯)

效能計數器旗標值描述
None0未啟用(預設)
HardConnectsPerSecond1每秒與 Oracle 資料庫建立的會話數量。
HardDisconnectsPerSecond2每秒與 Oracle 資料庫切斷的會話數量。
SoftConnectsPerSecond4每秒來自連線池的活動連線數量。
SoftDisconnectsPerSecond8每秒返回連線池的活動連線數量。
NumberOfActiveConnectionPools16活動連線池的總數。
NumberOfInactiveConnectionPools32非活動連線池的數量。
NumberOfActiveConnections64使用中的連線總數。
NumberOfFreeConnections128所有連線池中可用的連線總數。
NumberOfPooledConnections256池中活動連線的數量。
NumberOfNonPooledConnections512非池中活動連線的數量。
NumberOfReclaimedConnections1024被隱式垃圾回收的連線數量。
NumberOfStasisConnections2048將很快可在池中使用的連線數量。
用戶已關閉這些連線,但它們目前正在等待操作,如交易完成,然後才能返回池中作為可用連線。

且慢,最後還必須修改 .NET config 設定檔啟用計數器並運行程式,效能監視器才有東西可看。(註:4095 表啟用所有計數器,若不要全開可自行參考上表挑選所需計數器調整設定值)

<oracle.manageddataaccess.client>
  <version number="*">
    <settings>
      <setting name="PerformanceCounters" value="4095" />
    </settings>
  </version>
</oracle.manageddataaccess.client>

Check It Out!

To monitor Oracle connections without extra permissions, use Performance Monitor with Managed ODP.NET by registering performance counters using OraProvCfg.exe. This allows tracking metrics like active connections and connection pool activities without upgrading to newer ODP.NET versions.


Comments

Be the first to post a comment

Post a comment