新聞中心
JDBC做過java開發(fā)的都知道JDBC是干什么的,RestApi其實就是http的調(diào)用,http的調(diào)用就是調(diào)用第三方的服務(wù)的時候,第三方的服務(wù)并不是在自己的系統(tǒng)范圍內(nèi),如果出現(xiàn)不穩(wěn)定掛掉,對自身來說是不可控了,所以第三方服務(wù)而言對我們而言是非常的明感的。JDBC和RestApi的監(jiān)控對系統(tǒng)來講意義很大,數(shù)據(jù)庫得多重要,在系統(tǒng)的內(nèi)部進行監(jiān)控更能良好的反應(yīng)sql的執(zhí)行性能。

目前創(chuàng)新互聯(lián)公司已為上千的企業(yè)提供了網(wǎng)站建設(shè)、域名、雅安服務(wù)器托管、成都網(wǎng)站托管、企業(yè)網(wǎng)站設(shè)計、洪江管理區(qū)網(wǎng)站維護等服務(wù),公司將堅持客戶導向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
(一)JDBC調(diào)用攔截
- JDBC插樁目的
哪些監(jiān)控懟開發(fā)運維來說最有用的。
- SQL語句、SQL參數(shù)、用了多長時間、SQL類型、結(jié)果集大小、返回字段、規(guī)范、Join次數(shù)
- 攔截監(jiān)聽SQL語句
- 找出慢查詢語句
- 模型結(jié)構(gòu)
字段類型描述sqltextsql語句paramsjson參數(shù)resultSizeint結(jié)果大小urlvarchar數(shù)據(jù)庫連接路徑userNamevarchar數(shù)據(jù)庫用戶名errortext異常堆棧useTimeint用時
- JDBC插樁位置
這些user,框架,連接池,驅(qū)動都依賴jdbc,jdbc是一個什么東西?jdbc是一種規(guī)范,一堆接口組成的規(guī)范j2se,由驅(qū)動來實現(xiàn)的。servlet也是一種接口規(guī)范,是j2ee的規(guī)范,由tomcat,jetty等容器實現(xiàn)的。任任何一層都可以做為插樁的切入點,但是選用User 層、框架層、連接池&數(shù)據(jù)源層、驅(qū)動層其實現(xiàn)是多樣的,無法做到普適性。所以在此選用JDBC 作為插樁切入 點。
- JDBC插樁機制
從上圖可以分析出JDBC執(zhí)行過程
1.從驅(qū)動獲取連接(Connection)
2.基于連接構(gòu)建預處理對象(prepareStatement)
3.執(zhí)行SQL
4.讀取結(jié)果集(ResultSet)
5.關(guān)閉釋放連接。
其中涉及對象構(gòu)建邏輯如下:
Driver==》Connection==》prepareStatement==》ResultSet
(二)Http調(diào)用攔截
- Http埋點目的
很多時候我們會調(diào)用第三方API。比如:消息推送、短信發(fā)送、第三方支付接口等,因為服務(wù)是第三方提供,如果服務(wù)出現(xiàn)性能或可用性問題對于我方而言不可控,所以這類接口的穩(wěn)定性是我們需要重點關(guān)注的對象。
通常這類接口會基于Http協(xié)議實現(xiàn),所對Htpp協(xié)議監(jiān)控,即實現(xiàn)了對第三方接口的監(jiān)控。
- Http埋點位置
1.user層:無法判斷User具體執(zhí)行方法,基于配置又做不到普適性。
2.Http協(xié)議層:能找到具體方法,也能做到普適性。需要對Http協(xié)議進行全面解析,而且Http協(xié)議為文本協(xié)議,解析難度更大,實現(xiàn)成本居高。
3.專有SDK、與自定義封裝的Http工具包,跟具體業(yè)務(wù)偶合同樣無法做到普適應(yīng)。
4.java net URL 與 HttpClient 都是Http client 基于二者實現(xiàn)可以在一定程度上達成我們的目標。
- Http埋點機制(java.net.URL)
URL常用寫法:
- URL url = new URL("https://www.baidu.com");
- URLConnection conn = url.openConnection();
- conn.setDoInput(true);
- conn.setDoOutput(true);
- conn.connect();
- OutputStream output = conn.getOutputStream();
- output.write("a=c&b=1".getBytes());
- InputStream input = conn.getInputStream();
- byte[] bytes = IOUtils.readFully(input, -1, false);
- System.out.println(new String(bytes));
URL 裝載執(zhí)行過程:
- URL 基于protocol 構(gòu)建對應(yīng) UrlStreamHandler
- UrlStreamHandler.openConnection() 打開連接,返回URlConnection
- URlConnection 設(shè)置連接屬性
- URlConnection 打開 outPutStream 寫入?yún)?shù)
- URlConnection 打開 inPutStream讀取結(jié)果
其中涉及對象構(gòu)建邏輯如下:
URL==》URLStreamHandler==》URLConnection==》outPutStream、InputStream。
如果上述過程加一層靜態(tài)代理即可監(jiān)控這些對象所有的執(zhí)行過程從而得到所需監(jiān)控數(shù)據(jù):
URL==》Proxy(URLStreamHandler)==》Proxy(URLConnection)==》Proxy(outPutStream)、Proxy(InputStream)。
- URL的類結(jié)構(gòu)
怎么樣才能加上這層代理呢?其關(guān)鍵方法在于 通過靜態(tài)代理的方式。 java.net.URL#setURLStreamHandlerFactory。該方法允許用戶自定義URL協(xié)議實現(xiàn).
網(wǎng)站名稱:監(jiān)控系統(tǒng)如何做埋點,監(jiān)控數(shù)據(jù)庫和HTTP請求
本文URL:http://m.5511xx.com/article/dhosoge.html


咨詢
建站咨詢
