在正式的生產環境中,數據庫的性能和延遲對于確保系統的穩定和高效運行至關重要。特別是在與 CnosDB 數據庫進行交互時,更深入地了解其表現變得尤為重要。這時Jaeger 分布式追蹤系統發揮了巨大的作用。在本篇博客中,我們將深入探討如何通過使用 Jaeger 追蹤和監控 CnosDB 數據庫,以便更全面地了解其性能、延遲以及潛在的問題。
了解 Jaeger 和 CnosDB
Jaeger:Jaeger 是一款強大的開源分布式追蹤系統,兼容 OpenTracing API,專為監控和調試軟件服務架構中的請求流程而設計。通過捕獲請求在不同微服務之間的流動,Jaeger 幫助開發人員識別性能瓶頸和潛在問題。
CnosDB:CnosDB 是一款高性能的開源數據庫,常用于存儲和管理大量時序數據。在微服務架構中,CnosDB 通常充當數據存儲和檢索的后端。
在CnosDB中啟用Jaeger支持
取消?[trace][https://docs.cnosdb.com/zh/latest/reference/config.html#trace]配置注釋開啟 Jaeger 跟蹤功能。
| 提示:如需使配置生效需要重啟服務。
[trace]auto_generate_span = false
[trace.log]path = '/tmp/cnosdb'
[trace.jaeger]jaeger_agent_endpoint = 'http://127.0.0.1:14268/api/traces'max_concurrent_exports = 2max_queue_size = 4096
安裝并啟動Jaeger
| 其他部署方式,請參考?Jaeger Deployment[https://www.jaegertracing.io/docs/deployment/]
docker run -d --name jaeger \-p 6831:6831/udp \-p 6832:6832/udp \-p 16686:16686 \-p 14268:14268 \jaegertracing/all-in-one:latest
成功啟動后,使用瀏覽器訪問?http://127.0.0.1:16686
跟蹤CnosDB中的事件
1.在請求中添加 span context。
| 可以設置配置文件中的 auto_generate_span = true 自動生成,如果需要分析特定的語句,請在請求中自定義 uber-trace-id 值,格式如下所示(詳細格式說明請參考:Propagation Format[https://www.jaegertracing.io/docs/1.46/client-libraries/#propagation-format])
uber-trace-id: 3a3a43:432e345:0:1
示例:
| 示例中的數據來源請參考:
https://docs.cnosdb.com/zh/latest/start/quick_start.html
查詢數據庫 oceanic_station 中 air 表中的數據,并且按時間倒序排序,返回前 5 條數據 。
curl -i -u "root:" -H "Accept: application/json" -H "uber-trace-id: 3a3a43:432e345:0:1" -XPOST "http://127.0.0.1:8902/api/v1/sql?db=oceanic_station&pretty=true" -d "select * from air order by time desc limit 5;"
使用儀表盤進行分析
?
1.記錄 Span:
當客戶端應用程序發送查詢或寫入請求到 CnosDB 數據庫時,CnosDB 會將產生的 Span 記錄發送給Jaeger 。每個 span 表示了請求的一個階段,包括了處理時間、操作名稱和其他相關信息。
2.選擇 Service:
在 Jaeger 用戶界面的 Service 下拉框中,選擇與 CnosDB 相關的服務(例如:cnosdb_singleton_1001)。
3.查找 Traces:
在界面上,點擊 "Find Traces" 按鈕,系統將檢索與選擇的服務相關的所有 traces(追蹤)。這將顯示一系列的請求和對應的 spans。
4.分析 Trace 詳情:
點擊所感興趣的 trace,進入詳細視圖。在這個視圖中,你將看到整個請求的流程,以及每個 span 執行的時間。這些時間信息將幫助你了解查詢的每個步驟在處理時所花費的時間。
5.優化查詢和系統:
利用詳細的時間記錄,你可以精確地分析查詢語句的性能。在正式的生產環境中,這將成為優化查詢語句和改進系統性能的寶貴工具。通過分析每個 span 的執行時間,你可以找到可能導致延遲的步驟,從而采取針對性的優化措施。
除此之外,Jaeger 還可以跟蹤 CnosDB 的其他事件,具體如下:
- Query 組件
- REST API
- Arrow Flight SQL API
結語
通過使用 Jaeger 來跟蹤 CnosDB 數據庫的性能和延遲,我們可以更全面地了解數據庫的表現。通過在關鍵代碼段中插入適當的儀器化代碼,我們可以捕獲請求的流動和數據庫交互,輕松識別性能瓶頸,并及時解決潛在問題。集成 Jaeger 和 CnosDB,讓我們能夠從中獲得更深入的洞察,提升整體性能和可靠性。
拓展示例
REST API請求
curl -i -u "root:" -H "Accept: application/json" -H "uber-trace-id: 3a3a43:432e345:0:1" -XPOST "http://127.0.0.1:8902/api/v1/sql?db=usage_schema&pretty=true" -d "select * from user_queries order by time desc limit 5;"
curl -i -u "root:" -H "Accept: application/json" -H "uber-trace-id: 3a3a43:432e345:0:1" -XPOST "http://127.0.0.1:8902/api/v1/sql?db=usage_schema&pretty=true" -d "CREATE TABLE air (visibility DOUBLE,temperature DOUBLE,presssure DOUBLE,TAGS(station));"
curl -i -u "root:" -H "Accept: application/json" -H "uber-trace-id: 3a3a43:432e345:0:1" -XPOST "http://127.0.0.1:8902/api/v1/write?db=public&pretty=true" -d "ma,station=XiaoMaiDao visibility=50,temperature=63,pressure=52"
使用 Prometheus 進行遠程讀寫
remote_write:
- url: "http://127.0.0.1:8902/api/v1/prom/write?db=prometheus"headers:uber-trace-id: '3a3a43:432e345:0:1'basic_auth:username: 'root'password: ''
remote_read cnosdb
remote_read:
- url: "http://127.0.0.1:8902/api/v1/prom/read?db=prometheus"
headers:uber-trace-id: '3a3a43:432e345:0:1'
basic_auth:username: 'root'password:
使用 OpenTSDB 寫入
curl -i -u "root:" -H "Accept: application/json" -H "uber-trace-id: 3a3a43:432e345:0:1" -XPOST "http://127.0.0.1:8902/api/v1/opentsdb/write?db=public" -d 'opentsdb 1689054412124000000 1 tag1=t1 field1="f1" value1=1'
curl -i -u "root:" -H "Accept: application/json" -H "uber-trace-id: 3a3a43:432e345:0:1" -XPOST "http://127.0.0.1:8902/api/v1/opentsdb/put?db=public" -d '[{"metric":"tsdbput","timestamp": 1689069407572000000,"value": 9,"tags":{"tag1":"t1","tag2":"t2"}}]'
CnosDB簡介
CnosDB是一款高性能、高易用性的開源分布式時序數據庫,現已正式發布及全部開源。
歡迎關注我們的社區網站:https://cn.cnosdb.com