Grafana 後端:架構和後續規劃
後端:架構和後續規劃 原文
Torkel Ödegaard 於2018.6.4編輯本頁面
Grafana 的後端採用GO語言編寫, 使用 sqlite3/mysql 或者 postgres 作為儀表板,使用者資料等的儲存. Grafana 誕生之初並沒有太多關於如何編寫中型應用程式的指南或方向. 因此 Grafana 部分基礎程式碼沒有我們想要的那麼通用. 那麼下文就說下更多關於當前重寫的內容! :)
Grafana 的後端核心元件
包名 | 描述 |
---|---|
/pkg/api | Http處理程式和路由. 大部分的處理程式函式是全域性的,而這是我們後續要改進的. 處理程式應該與引用所有依賴的結構體相關聯. 額外的匯流排 |
/pkg/bus | 匯流排! 下面會有更多的介紹 |
/pkg/cmd | 我們要構建的二進位制檔案. Grafana-server 和 grafana-cli |
/pkg/metrics | 儀器程式碼用於檢測 Grafana 本身. 目前使用 Prometheus 客戶端庫抓取資料,不過也可以把資料匯入 graphite. |
/pkg/models | 這是我們保留 domain model 的地方. 這個包不依賴於標準庫外的任何程式包. (確實有包含了一些 Grafana 中的引用,不過這正是我們後續要避免的) |
/pkg/registry | service 管理包. |
/pkg/services/alerting | Grafana 的報警服務. 該報警引擎執行在獨立的 go routine 而且不依賴於包括 Grafana 在內的其他東西. |
/pkg/services/sqlstore | 目前所有的資料庫呼叫都在這裡. |
/pkg/setting | Grafana 的配置包. 任何與 Grafana 相關的全域性配置都可以使用這個包來處理. |
/pkg/tsdb | Grafana datasources 的所有後端實現. 包括 Grafana 前端以及報警服務也在使用. |
測試
我們重視清晰可讀的程式碼,鬆耦合並且覆蓋單元測試.這樣可以更輕鬆地協作和維護程式碼.在 sqlstore 包中,我們在測試中進行資料庫操作,而有些人可能會說這不適合單元測試.我們認為這樣做相當快並且有價值.
我們的大多數測試都使用 go 輸出,但標準庫測試也做的很好。
匯流排
匯流排是我們在http處理程式和 sqlstore 之間引入隔離的方法(負責從資料庫中獲取資料).Http處理程式和 sqlstore 相不依賴.它們只依賴於匯流排和 domain model(pkg / models).這樣可以更輕鬆地測試程式碼,避免耦合.更多資訊詳見目前的重寫/重構
服務/知識圖譜
Grafana 中的服務是要自包含的,並且只能使用通過 Grafana 服務登錄檔提供的匯流排或知識圖譜與 Grafana 的其他部分通訊.所有服務都應該在init函式中自注冊.只能在init函式中進行註冊.應儘可能避免使用Init函式.
當 Grafana 啟動時,將呼叫服務中的所有init函式並自行註冊.然後,Grafana 將建立所有依賴項的圖並注入其他服務所依賴的服務中.這在 https://github.com/grafana/grafana/blob/master/pkg/cmd/grafana-server/server.go#L75 通過注入庫解決了.
擴充套件性
應該可以使用配置檔案配置所有需要的新功能.額外的資料來源,警報通知程式,儀表板,團隊管理等.目前,它只能配置資料來源和儀表板,但我們想要支援所有 Grafana 的東西.
當前的重寫/重構
-
刪除全域性變數
-
儘可能避免使用內部變數
-
減少使用init()函式,只註冊服務/實現
配置重構
計劃是將所有配置項從配置包中的包級別變數移動到setting.Cfg物件.可以通過注入setting.Cfg物件來訪問配置 services/components.
Cfg 物件: https://github.com/grafana/grafana/blob/master/pkg/setting/setting.go#L184
注入例項: https://github.com/grafana/grafana/blob/master/pkg/services/cleanup/cleanup.go#L19
Sqlstore 重構
sqlstore 處理程式使用全域性的 xorm 引擎變數,這要重構為 Sqlstore 例項.
Http 處理程式重構
Http 處理程式要重構為 HttpServer 例項的方法.這樣他們就可以訪問 HttpServer 的服務依賴項(以及 Cfg 物件).
程式設計風格
我們的目標是遵循golang的風格,但我們也不會全盤接受.
當我們進行持續整合構建時,執行gofmt -w -s 和gometalinter ,以驗證是否最重要的部分獲益.