Kibana是一個針對Elasticsearch的開源分析及可視化平臺,用來搜索、查看交互存儲在Elasticsearch索引中的數據。它操做簡單,基於瀏覽器的用戶界面能夠快速建立儀表板(dashboard)實時顯示Elasticsearch查詢動態。html
kibana須要64位操做系統,而且須要先安裝Elasticsearch,運行Elasticsearch又須要先安裝java。vue
參考資料:java
Elasticsearch guide
Kibana guidenode
下面以mac上安裝部署kibana爲例:react
1.安裝java。到java裏面下載對應的最新java版本,並安裝。git
2.安裝並運行elasticsearch。到download elasticsearch裏面下載對應的最新elasticsearch版本,解壓以後進入elasticsearch文件夾運行命令:./bin/elasticsearch。github
3.查看elasticsearch是否運行成功。瀏覽器打開elasticsearch默認地址:http://localhost:9200/
,若是顯示以下信息則表示運行成功:chrome
{ "name" : "Cv0Qzv6", "cluster_name" : "elasticsearch", "cluster_uuid" : "LFNZ-yjkRRW4dcVyuWlbug", "version" : { "number" : "6.5.3", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "159a78a", "build_date" : "2018-12-06T20:11:28.826501Z", "build_snapshot" : false, "lucene_version" : "7.5.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" }
4.安裝並運行kibana。到download kibana裏面下載對應的最新kibana版本,解壓以後進入kibana文件夾運行命令:./bin/kibana。npm
5.查看kibana是否運行成功。在瀏覽器打開kibana默認地址:http://localhost:5601
,若是可以打開kibana則表示kibana運行成功。json
6.添加數據。首次打開kibana會提示導入數據,直接倒入demo data便可。而後就能夠愉快的調教kibana了。
kibana是開源的,可是隻能用於elastic公司的項目。從這裏能夠看到kibana的源碼:elastic/kibana。
kibana的大體結構以下:
總體框架:React 和 Angular 結合使用(利用ngReact庫在Angular裏面內嵌React)。
ui框架:EUI。Elastic公司本身開發的一套UI,開源,可是不是MIT協議,只能用於Elastic公司開發的產品。https://github.com/elastic/eui。
使用的拖拽庫:react-grid-layout。
word cloud用的d3-cloud。優勢是可以自動把文本直接轉化爲word cloud。
實現angular裏面使用react的庫:ngreact。
主要研究kibana的visualize和dashboard兩個板塊。
說明:visualization指的是visualize板塊裏面那樣的展現圖表,saved searches指的是儲存的數據,它在dashboard裏面以表格的形式展現出來。
爲了實現上面的主要功能,kibana有以下的數據結構:
經過一個index儲存這三類數據:saved searches, visualizations and dashboards。
kibana把全部能放在dashboard上的數據都叫作embeddable,按個人理解就是visualization 和 saved searches的數據。
每一個embeddable數據包含2類數據:
注意:embeddable state裏面有沒有具體查詢出來的數據?我以爲應該有,還應該有相應的查詢條件。
經過embeddable state,kibana實現了2個功能:
每一個dashboard都有2類數據:
dashboard板塊有這麼一個功能:能夠經過右飄窗實時查看panel裏面的數據。
而從panel到右飄窗之間,kibana封裝了一層inspecter,用來處理panel數據並顯示到右飄窗上面。這之間的東西又叫作adapter。
目前kibana有2個adapter,一個用來處理visualization裏面的數據,一個用來發送http請求(saved searches須要這種處理)。
因爲從dashboard到es之間的數據獲取是異步的,而且有等待時間。因此kibana封裝了一層courier來處理requests,好比說設置ß時間間距啊,中斷requests,分發fetch事件來更新panels等。
其中把requests queued up的必要性沒有看懂~
kibana同時使用D3和Vega圖表庫,其中:
kibana的主要目錄以下(其餘目錄有的沒有看懂,有的是服務目錄,有的是處理特定業務邏輯的目錄,就不研究了):
├── src │ ├── core_plugins #核心插件 │ │ ├── kibana #kibana插件 │ │ ├── elasticsearch #處理elasticsearch的插件 │ │ ├── table_vis #處理table圖表的插件 │ │ └── ... #其餘插件 │ ├── ui #ui │ │ ├── public #主要ui模塊 │ │ │ ├── chrome #chrome瀏覽器模塊 │ │ │ ├── draggable #拖拽模塊 │ │ │ ├── embeddable #embeddable模塊 │ │ │ ├── i18n #國際化模塊 │ │ │ ├── inspector #inspector模塊 │ │ │ ├── private #ag模塊 │ │ │ ├── register #ag註冊模塊 │ │ │ ├── vis #可視化模塊 │ │ │ └── ... #其餘模塊 │ │ ├── ui_render #ui的render │ │ ├── ui_setting #ui的setting │ │ └── ... #其它ui模塊 │ └── test #測試 │ ├── functional #功能測試 │ ├── scripts #封裝的js │ ├── dev_certs #封裝的受權js │ └── ... #其餘
從上面能夠看到:
下面對於core_plugins,ui和test三個模塊分別進行深刻研究。
core_plugins中的每個插件都至少有public文件夾,index.js和package.json。其中public文件夾進行業務處理,index.js進行導出,package.json標註這個插件的名字和版本等信息。
其中index.js的結構是這樣的:
// 以相似npm module的形式掛載模塊 Object.defineProperty(exports, "__esModule", { value: true }); exports.default = function (kibana) { return new kibana.Plugin({ id: require: config() {} init(){} uiExports: {} }) }
ui主要包括渲染相關的模塊。其中最重要的是modules.js,它裏面導出一個uiModules來進行ag模塊加載,提取和刪除等。
其它一些模塊會根據provider和factory來進行封裝,其中利用provider來導出,利用factory以工廠模式的形式來建立模塊。部分代碼示例以下:
// 提供導出內容 const noneRequestHandlerProvider = function () { return { name: 'none', handler: function () { return new Promise((resolve) => { resolve(); }); } }; }; // 註冊這個模塊 VisRequestHandlersRegistryProvider.register(noneRequestHandlerProvider); // 導出 export { noneRequestHandlerProvider };
// 獲取kibana模塊 const module = uiModules.get('kibana'); // 以工廠模式的形式封裝PersistedState module.factory('PersistedState', ($injector) => { const Private = $injector.get('Private'); const Events = Private(EventsProvider); // Extend PersistedState to override the EmitterClass class with // our Angular friendly version. return class AngularPersistedState extends PersistedState { constructor(value, path) { super(value, path, Events); } }; });
像這種大項目又是怎麼進行測試的呢?因爲測試的每一個模塊都與不少模塊關聯,因此kibana作了以下工做:
import expect from 'expect.js'; // 接受測試環境的getService和getPageObjects做爲參數導入 export default function ({ getService, getPageObjects }) { const log = getService('log'); const PageObjects = getPageObjects(['common', 'visualize']); describe('chart types', function () { before(function () { log.debug('navigateToApp visualize'); return PageObjects.common.navigateToUrl('visualize', 'new'); }); it('should show the correct chart types', async function () { const expectedChartTypes = [ 'Area', 'Controls', 'Coordinate Map', 'Data Table', 'Gauge', 'Goal', 'Heat Map', 'Horizontal Bar', 'Line', 'Markdown', 'Metric', 'Pie', 'Region Map', 'Tag Cloud', 'Timelion', 'Vega', 'Vertical Bar', 'Visual Builder', ]; // find all the chart types and make sure there all there const chartTypes = await PageObjects.visualize.getChartTypes(); log.debug('returned chart types = ' + chartTypes); log.debug('expected chart types = ' + expectedChartTypes); expect(chartTypes).to.eql(expectedChartTypes); }); }); }
通常vue項目的目錄結構是這樣的:
├── src │ ├── api #api │ ├── assets #圖片等資源 │ ├── components #組件 │ ├── i18n #國際化 │ ├── plugins #插件 │ ├── router #路由 │ ├── store #store │ ├── styles #樣式 │ ├── utils #工具 │ ├── views #視圖 │ │ ├── admin #管理界面 │ │ ├── auth #權限界面 │ │ ├── layouts #視圖佈局 │ │ └── ... #其餘
對於小項目來講,上面的目錄結構已經足夠了,而且比kibana的結構更加清晰(我的認爲,kibana的目錄結構有點混亂,多是由於kibana迭代過不少次的緣由)。可是隨着項目的增大,能夠考慮參考kibana的目錄結構。
另外,對於vue項目,組件通常都是.vue後綴的單文件組件,因此若是想要在這之上對組件進行封裝的話,怎麼辦?mixin和vue.extend瞭解一下。
以上純屬我的理解,因爲我本身水平和時間有限,一些理解錯誤在所不免,歡迎提出並一塊兒討論。
感覺:
Discover Context App Implementation Notes
Discover Context App Implementation Notes
unify the way global context is passed down to visualize
[Meta] Improve support for custom embeddable configurations at the dashboard panel level