kibana官方沒有外掛的開發教程,Tim Rose的教程寫的十分詳盡,也是官方推薦的。由於這個系列的教程是英文版的,且基於kibana4,近日需要做kibana的開發,硬啃下這些教程之後,且根據kibana6.3.2版本做了些改進,記錄下來,留下個爪。由於本人水平有限,錯漏的地方歡迎大家指出。
原文連結:www.timroes.de/writing-kib…
原文標題:Writing Kibana 4 Plugins – Simple Visualizations
簡單視覺化外掛
你需要先閱讀基礎篇,才能閱讀本文。 在本章中,我們會介紹如何定義一個簡單的視覺化外掛。這個簡單的外掛不需要來自elasticsearch的資料,只展示靜態內容(就像markdown 視覺化外掛一樣)。在後面的章節再構建消費動態資料的視覺化外掛。本文將介紹一個簡單的時鐘外掛,之後你可以在儀表盤中新增一個時間。
作者版的程式碼可以在GitHub上面找到: timroes/tr-k4p-clock
整個編碼工作會分成以及版本,會在各個階段分別給出對應的tag,讀者可以自行檢視不同的版本。
註冊你的視覺化外掛
首先建立package.json
和index.js
,如我們前面講到的。另外目錄名稱也要選擇合適的。
如果你想要為你的外掛建立一個視覺化圖形,你需要新增一個js檔案,我們暫時把他叫做clock.js
,放在外掛根目錄的public
資料夾下。
在我們為外掛新增內容之前,我們需要註冊這個外掛,新增如下程式碼到clock.js
:
module.exports = function(kibana) {
return new kibana.Plugin({
uiExports: {
visTypes: [ 'plugins/<plugin-name>/clock' ]
}
});
};
複製程式碼
在<plugin-name>的地方換成你的外掛名稱(接下來的程式碼片段也是這樣做)。
uiExports
物件描述了你的外掛將從何種擴充套件點來為使用者介面新增功能。在本例中,我們只是用了visTypes
陣列來註冊了一個視覺化功能(實際上你可以註冊多個)。你定義的字串會被傳遞給webpack是用來解決依賴問題,會把plugins/<plugin-name>
對映到外掛的public
資料夾下。這樣你就可以得到任意你想要的檔案的引用了(本例中,clock
會被定義成引用clock.js
)。
目前就已經把外掛成功註冊到kibana了。
定義你的視覺化外掛
在你註冊完外掛之後,下一步就是定義他了。往clock.js
裡面新增點內容,通過一個簡單的html片段來定義視覺化外掛。
define(function(require) {
function ClockProvider(Private) {
var TemplateVisType = Private(require('ui/template_vis_type/TemplateVisType'));
return new TemplateVisType({
name: 'trClock', // the internal id of the visualization
title: 'Clock', // the name shown in the visualize list
icon: 'fa-clock-o', // the class of the font awesome icon for this
description: 'Add a digital clock to your dashboards.', // description shown to the user
requiresSearch: false, // Cannot be linked to a search
template: require('plugins/<plugin-name>/clock.html') // Load the template of the visualization
});
}
require('ui/registry/vis_types').register(ClockProvider);
return ClockProvider;
});
複製程式碼
如你所見,public
下的全部js檔案都是符合requirejs(AMD規範)的,全部都被包裹在define函式裡面。
更新
這個教程是很久之前寫的了,現在的話是用webpack打包的,所以現在不需要符合AMD規範了。你可以直接require進來。因為庫裡面的檔案就是按照amd規範寫的,在這裡我就不修改了,後面的教程會拋棄amd的寫法。
首先,我們需要寫一個provider函式,就是一個基於angularjs的provider函式,引數是由angular主動注入的,在本例中我們只需注入Private服務。
Private服務是kibana的一個angular服務,用來從angular的providers例項化或者載入服務。從下一行可以看出,我們用requirejs來載入ui/template_vis_type/TemplateVisType
服務(這是一個angular provider,用private服務來例項化TemplateVisType
這個provider),這個requirejs載入angular服務的一個通用模式。
你得到了例項化的TemplateVisType
(這是一個你的每個視覺化外掛都需要的基礎的型別,這個型別自帶一個html模板展示給kibana使用者),你的外掛需要返回一個新的TemplateVisType
的例項,這個例項儲存這所有關於你的視覺化外掛的資訊。
下面是模板欄位的介紹:
- name 是一個kibana內部的id,用來識別你的外掛,應該是全域性唯一的(就跟外掛的資料夾名稱一樣),你最好加上一個字首,就像我加上tr。
- title & description 將展示在kibana的視覺化介面上
- requiesearch 預設為true,像本例這樣的不需要資料的靜態外掛
- icon 一個類名,表示FontAwsome中的一個圖示。會在kibana的好幾處地方使用到
- template 外掛的html片段,準確的說是外掛實際內容片段(不是編輯片段或者其他東西)。我們還是使用require把
clock.html
從public
資料夾下引入進來,我們等一下再來往裡面寫入內容。
完成provider函式之後,你還需要把這個provider註冊到vistypes
中去。嗯,儘管你已經在index.js
中定義了他,但是這裡還有一個open issue,需要解決。就像你上面做的一樣,需要獲取註冊函式,然後呼叫他的註冊函式。
最後,你可以從模組中返回provider函式,就算不這麼做你的視覺化外掛也能工作,但是如果你這麼做,就可以在其他地方使用這個provider了。kibana的外掛都是這樣做的,所以我也推薦你這麼做。
寫一個簡單的模板
下一步就是在public
資料夾下建立clock.html
檔案了,我們在上面寫到,我們的外掛需要這個模板。我們就從一個非常簡單的html開始:
<div class="clockVis"> 15:00:00 </div>
複製程式碼
這是我們外掛的第一個里程碑,如果你在kibana中載入這個外掛,你可以從視覺化列表中找到這個外掛,然後把他儲存為一個圖表,新增到儀表盤,像其他外掛一樣。你可以找到這個程式碼在GitHub0.1.0
在html片段中,你需要把所有的東西都放在一個根元素下,如果你最直接把文字放在根目錄下,這個是不會顯示的。
新增樣式
為了新增一些樣式,我們來建立一個clock.css
檔案,並放在public
資料夾下。只是新增一點居中樣式,和一點字型樣式:
.clockVis {
width: 100%;
display: flex;
align-items: center;
justify-content: center;
color: #555;
font-weight: bold;
font-size: 2.5em;
}
複製程式碼
現在我們要做的就是把樣式檔案在clock.js
中引入進來,然後我們就新增下面一行程式碼(注:一定要在provider函式之外)。
require('plugins/<plugin-name>/clock.css');
複製程式碼
你也可以用less,只要改一下檔案字尾即可
為時鐘外掛加邏輯
為了提升我們外掛,我們需要為我們的時鐘加點邏輯程式碼。因此我們需要把angular的控制器和模板關聯到一起。
angular模組已經經過了kibana的包裝了,所以為了給我們的外掛(我們應該為外掛建立一個新的模組),建立一個新的控制器,我們可以在clock.js
中新增以下程式碼:
var module = require('ui/modules').get('<module-name>');
module.controller('ClockController', function($scope) {
// ...
});
複製程式碼
ui/modules
模組有一個get方法,可以用來建立或者獲取一個angular模組,把模組的名字(唯一)當作引數傳進去,可以用你的外掛名稱作為模組名稱。get方法的第二個引數是一個你所依賴的模組組成的陣列(就像你呼叫angular.module一樣),第二個引數不寫就是不依賴任何模組。一個最重要的模組你可能會需要的就是kibana模組,就是上面提供private服務的模組。但是本例中,我們用不到這些。
在本例中,我們直接把這些程式碼寫在clock.js
中,在大些的外掛,你可能想要把他放在一個單獨的檔案下,只要在主檔案下把這個檔案引入就可以了(本例中,主檔案就是clock.js
)。
我們來完成控制器函式,使用$timeout服務來每分鐘重新整理以下當前時間:
module.controller('ClockController', function($scope, $timeout) {
var setTime = function() {
$scope.time = Date.now();
$timeout(setTime, 1000);
};
setTime();
});
複製程式碼
現在我們就可以把控制器和模板關聯起來,顯示我們的時間了,如平常我們在angular下做的一樣:
<div class="clockVis" ng-controller="ClockController">
{{ time | date:'HH:mm:ss' }}
</div>
複製程式碼
如果你現在把這個外掛新增到儀表盤,那你就有了一個真正能工作的時鐘了。程式碼可以在0.3.0找到
視覺化選項
這裡還可以做一個優化,讓使用者自己去選擇時間的顯示格式。也就是給我們的外掛新增一些引數,當使用者編輯的時候,顯示出來。
我們首先新增一個名字叫clock-deitor.html
(public資料夾下),來在側邊欄展示選項的引數。
<div class="form-group">
<label>Time Format</label>
<input type="text" ng-model="vis.params.format" class="form-control">
</div>
複製程式碼
同樣,這裡也是一個簡單的angular文件片段,在我們的編輯器html片段中,(從上面可以看出,也是一個普通的模板),有一個vis
變數。這是視覺化物件自帶的,包含自身資訊的一個物件,在這個物件中有一個params
物件,可以用來儲存我們外掛的引數選項。這就是我們為什麼要繫結vis.params.format
到我們的輸入框中(format只是設定的名稱)。
我們需要來修改一下,傳遞給TemplateVisType
建構函式的物件,來註冊我們的編輯器文件片段。我們新增一個params
物件如下,完成的片段請參考GitHub:
{
// ...
params: {
editor: require('plugins/<plugin-name>/clock-editor.html'),
defaults: {
format: 'HH:mm:ss'
}
}
// ...
}
複製程式碼
我們註冊完上面所些的片段(通過require)之後,我們同時給我們的引數設定一個預設值。
我們需要做的最後一件事就是,在我們的主文件片段(clock.html
)中,使用這個設定:
<div class="clockVis" ng-controller="ClockController">
{{ time | date:vis.params.format }}
</div>
複製程式碼
如上面提到的,在這個模板中vis
是一個物件,我們可以讀到他的值
現在我們就完成了我們的時鐘外掛了:
你可以在0.4.0找到完整的原始碼和一大堆的評論。下一步
我們剛剛建立了一個簡單的外掛,完全不包含認為資料的,所以下一步,當然是建立一個使用聚合資料的外掛啦。在下一章,我們會建立一個簡單的標籤雲視覺化外掛。