數據探索
Elasticsearch具有強大的數據檢索和分析同能,支持模糊、全文、過濾、管道等數據查詢。對於日志型數據處理很有優勢。
下圖為KIbana的主頁圖,將逐步說明每一部分的功能:
依照圖中的編號:
1、Discover點擊后是整個日志總況,這也是經常使用的入口,在這個地方可以定時刷新最新日志,過濾整個日志,添加指定字段顯示,展示不同時段的日志總量等等。
2、顯示8所選定的時間范圍內的日志總量按時間的分布情況,通過該直方圖,可以判斷應用一天的高峰期時段,通常日志量越大,使用的用戶越多。同時,當服務出現故障,會有某類日志暴增,所以環比前一天的數據可以判斷服務運行狀況。
3、具體日志顯示區域,其中Time字段為固定字段,對應日志中的@timestamp字段,該區域從6的區域添加任何你想關注的字段值,在表頭位置,鼠標放置該位置 有排序圖表 以及左右移動的圖標。
4、表示該條件下所查詢到的日志總條數
5、當被添加到3(表格)中的字段會顯示在該區域,鼠標滑到對應字段可以移除
6、可用字段區域,下方的字段鼠標滑上去會有 add 按鈕, 通過該按鈕可以添加到3的表格區域顯示,點擊字段名可以看出該字段的值分布占比。旁邊的齒輪小按鈕,點擊后會展開輸入框,輸入字符后可以自動匹配下方的字段(該功能在字段特別多的情況下非常有用)。另外,該區域顯示的字段總數可以在 Management -> Advanced Settings->Number of terms處設置最大顯示字段數。字段中 前面的 t 表示字段類型為字符串, # 表示number字段,時鍾表示時間類型字段(具體字段類型請查閱elasticsearch文檔),?表示未maping字段,需要在Management ->Index Patterns 處選中對應的索引模式,點擊右上角的刷新按鈕。
7、查詢輸入框,查詢方式以elasticsearch的query_string查詢,如以下查詢:
NOT(+app_feed_bug_1 +app_feed_bug_2 +app_feed_bug_3 +app_feed_bug_4 +app_feed_bug_5 +app_feed_bug_6 +app_feed_bug_7 +app_feed_bug_8 +app_feed_bug_9 +app_feed_bug_10)
表示app_feed_bug_1 到 app_feed_bug_10都不同時存在的結果。具體查詢語法參考 https://www.elastic.co/guide/en/elasticsearch/reference/6.4/query-dsl-query-string-query.html#query-string-syntax
8、時間段選擇,通過@timestamp字段過濾時間段
9、查詢條件保存操作,當我們配置好一次查詢之后,希望下次可以直接使用,就可以點擊該按鈕進行保存
10、保存的查詢條件可以通過點擊此處打開
11、定時刷新操作
12、添加日志字段過濾,支持 is , is one of 等等條件過濾,是一個經常使用而其非常強大的功能
告警模塊
sentinl 插件安裝,kibana插件安裝很簡單,只需要注意插件版本和kibana版本保持一致即可。以下是一個安裝sentinal 6.4.0的命令:
在kibana安裝目錄的/bin 目錄下執行:
./kibana-plugin install https://github.com/sirensolutions/sentinl/releases/download/tag-6.4.2-0/sentinl-v6.4.0.zip
kibana-plugin會自動下載並解壓安裝該插件,以及下載安裝插件的依賴。默認安裝目錄在 kibana目錄的plugin目錄下。
插件的依賴聲明在插件包的package.json文件中,其使用方式和nodejs的 npm一致。
插件安裝好之后,重啟kibana。打開kibana,可以看到左側已經有Sentinl 菜單,單擊該菜單可以添加告警規則,以下展示一個告警規則的配置(可以使用配置向導圖形化操作之后再更改):
1 { 2 "actions": { 3 "email_html_alarm_07ba0173-4e8e-4835-afb9-654687859fdd87": { 4 "name": "復習模塊資源錯誤", 5 "throttle_period": "24h", //告警頻率閥,如果滿足告警條件,每多少時間告警一次,防止頻繁消息,這兒顯示24小時限制告警一次 6 "email_html": { //以email的形式告警 7 "stateless": false, 8 "subject": "[告警] - {{payload.hits.hits.0._source.app_ppt_module}} - {{payload.hits.hits.0._source.app_ppt_name}} - {{payload.hits.hits.0._source.app_ppt_error_type}} From日志系統", //email的主題 9 "priority": "high", 10 "html": "<p><p>模塊:{{payload.hits.hits.0._source.app_ppt_module}}</p><p>名稱:{{payload.hits.hits.0._source.app_ppt_name}}</p><p>出錯頁碼:{{payload.hits.hits.0._source.app_ppt_file_name}}</p><p>出錯類型:{{payload.hits.hits.0._source.app_ppt_error_type}}</p><p>userid:{{payload.hits.hits.0._source.user_id}}</p><p>From:日志系統, <i>修改告警郵件請聯系 謝正才</i></p></p>", //EMAIL的郵件內容 11 "to": "qqq@qq.com,bbbb@ddd.com,bbb@ddd.com,bb@ddd.com", //郵件的接收這 12 "from": "xxxx@xxxxx.com" //郵件的發送者,該值需要再kibana配置,稍后會有介紹 13 } 14 } 15 }, 16 "input": { 17 "search": { 18 "request": { 19 "index": [ 20 "client_report-*" 21 ], 22 "body": { 23 "query": { //這兒表示的是一個elasticsearch搜索 24 "bool": { 25 "must": [ 26 { 27 "match": { 28 "app_eventid": "app1096" 29 } 30 }, 31 { 32 "match": { 33 "app_ppt_module": "復" 34 } 35 }, 36 { 37 "range": { 38 "@timestamp": { 39 "gte": "now-1440m", 40 "lt": "now" 41 } 42 } 43 } 44 ] 45 } 46 } 47 } 48 } 49 } 50 }, 51 "condition": { 52 "script": { 53 "script": "payload.hits.total > 2" //告警條件,此處表示查詢條數大於2條開始告警 54 } 55 }, 56 "trigger": { 57 "schedule": { 58 "later": "every 5 minutes" //每5分鍾執行一次告警條件 59 } 60 }, 61 "disable": false, 62 "report": false, 63 "title": "復習模塊資源錯誤告警", 64 "save_payload": false, 65 "spy": false, 66 "impersonate": false 67 }
該告警規則中,可以訪問Elasticsearch查詢結果中的字段,如:payload.hits.hits.0._source.app_ppt_module 獲取app_ppt_module字段的值,(注意:如果數組不是用[0]的方式,而是 .0 的方式)
kibana.yml 中增加配置:
sentinl: settings: email: active: true user: xxxx@xxxx.com password: xxxx host: smtp.exmail.qq.com port: 465 ssl: true report: active: true
該配置設置了發送郵箱的相關參數,包括密碼、smtp服務器等。配置好之后重啟kibana。
總體來說,該告警功能還是比較強大的。也支持webhook等告警方式,
可視化
可視化是Kibana中很重要的一部分,而其也很強大。下圖展示一張折線圖的配置(看上去是柱形圖,實際是折現圖,只是在展現形式上做了調整,文中會說明)
按圖中的順序,一步一步說明:
1、可視化的菜單入口
2、查詢輸入框和過濾欄,使用方式和Discover處相同,該處的條件設置好以后,則定義好了圖表的數據總體,表明圖表在該數據總體上去做可視化。是很關鍵和重要的一步。在我們考慮要做一張圖形化的時候,第一步就該考慮數據總體是什么。
3、需要觀察的指標,圖中表示我要觀察count值,配合第二條,此時說明我想count 該查詢條件下的日志總數,在這兒特別說明一下,指標的計算類型:
Average : 求總量的平均值,需要指定number型字段
Count: 計算總量的總條數,
Max:計算總量的最大值,需要指定number型字段
Median:計算總量中的中間值,需要指定number型字段
Min:計算總量的最小值,需要指定number型字段
Percentile Ranks
Percentile
Standard Deviation 計算總量的均方差,需要指定number型字段
Sum 計算總量的總和,需要指定number型字段
Top Hit
Unique Count 去重統計總條數,如計算獨立IP數、獨立userid數等非常有用
Average Bucket
Max Bucket
Min Bucket
Sum Bucket
Cumulative Sum 對總量的累計匯總,比如每分鍾日志條數是 10 、 12、15、8、15、13 。那么按每兩分中按該公式計算的結果為, 10+12 = 22、10+12+15+8 = 45、0+12+15+8+15+13 = 73,最終結果為 22、45、73
Derivative 導數,需要添加一個計算公司,該計算方式會自動計算該公式的導數值。
Moving Avg 移動平均數,類似與股票中的移動平均線
Serial Diff 微分
4、桶配置,桶時根據字段值的不同,將數據分為不同的部分,每一個部分就叫一個桶,比如說 字段 a 是 1-100的數字, 可以將a 分為 1- 20 , 21- 50, 51-70 ,71-100 四個桶。因此對於不同的數據類型,桶可以分為以下幾種:
Date Histogram 以時間日期字段 按 天、按 年、 按月 ...分桶。
Date Range 日期范圍,指定日期的間斷來分桶
Filters 指定多個過濾條件,將數據分為多個桶,該方式做漏斗型數據非常有效
Histogram 指定一個數值字段,然后給定一個間隔長度,以此間隔來分桶
IPv4 Range 根據IPv4的范圍來分桶
Range 指定要給數值字段,然后指定多個數值區間(類似於上面的列子),以該數值區間進行分桶
Significant Terms
當桶配置好之后,數據總量被分配到不同的桶中。
熟悉桶的概念之后,對於X-Axis就很容易理解 : X坐標即使根據桶的數量生成坐標刻度,而桶的生成過程也是聚合的過程。下面介紹在桶中進行 Split Series:
Split Series 即使在桶內根據字段的值的不同進行拆分成不同的小塊,拆分的塊數多少在圖表中形成多少條折線。
Split Chart 即拆分為不同的圖表,這都是在桶內進行的。
5、圖列,在對桶進行中的數據進行 Split Series 時,圖列會顯示拆分后的字段分布值,該值有可能時1、2、3、4 ...這樣的數字表示,比如說1 表示 首頁入口 、2 表示個人中心入口 等,這樣的數字作為圖列時很難看懂的,這個時候如果需要友好的圖列,kibana中沒有直接配置的入口,需要在使用腳本字段,編寫painless語句(該部分內容下面會有介紹),然后使用添加好的腳本字段作為 Split Series的字段,最終才能得到友好的圖列顯示。
6、最終顯示圖表,圖中的圖表類型為線圖,為什么顯示為柱狀圖呢?是在圖表配置的Metrics & Axes 中的 Chart Type 配置為 bar。
7、查看該圖表在elasticsearch的查詢情況,配置圖表過程中非常有用
8、保存圖表,記得保存,保存后可以添加到面板。
腳本字段
在mysql中我們經常會 用 AS 將一個計算表達式的結果賦值給一個字段,這在elasticsearch中怎么做呢? 答案是:使用腳本字段。
腳本字段采用painless語言,關於該語言的學習,參靠elasticsearch官方網站:https://www.elastic.co/guide/en/elasticsearch/painless/current/painless-getting-started.html 。
在kibana中配置painless入口:management->Index Patterns->Scripted fields ,點擊 Add scripted field 按鈕可以得到下面的配置界面:
Name:腳本字段的名字, 類似mysql AS 后的字段名
Language: 采用的語言,有兩種:painless 和 expression , painless是elasticsearch標准語言,強大、性能好。expression是elasticsearch表達式
Type:字段類型
Format: 字段格式
Popularity: 優先級,通常優先級高於0, 0是普通字段的優先級
Script:腳本類容,通過return來賦值給 Name 處填寫的字段
關於painless的學習,這兒不再贅述, 下面是一個腳本樣例:
if('app1097'.equals(doc['app_eventid.keyword'].value) || 'app1098'.equals(doc['app_eventid.keyword'].value) ){ if('7'.equals(doc['app_payment_entrance.keyword'] .value)) { return '我的賬戶入口'; } if('8'.equals(doc['app_payment_entrance.keyword'] .value)) { return '充值記錄入口'; } if('1'.equals(doc['app_payment_entrance.keyword'] .value)) { return 'h5獎學金頁入口'; } if('2'.equals(doc['app_payment_entrance.keyword'] .value)) { return 'h5活動頁入口'; } if('3'.equals(doc['app_payment_entrance.keyword'] .value)) { return '課時卡頁入口'; } if('4'.equals(doc['app_payment_entrance.keyword'] .value)) { return '(上課記錄)去付款入口'; } if('5'.equals(doc['app_payment_entrance.keyword'] .value)) { return '(完成付款)再次購買入口'; } if('6'.equals(doc['app_payment_entrance.keyword'] .value)) { return '(已取消的訂單)再次購買'; } }
該腳本返回一個字符串類型的數據,賦值給Name處命名的字段。
漏斗視圖
kibana沒有自帶的 可視化 漏斗視圖,需要在kibana安裝ob-kb-funnel插件,該插件的github地址:https://github.com/outbrain/ob-kb-funnel,該插件目前最新支持到 6.4.0,但是沒有release的包,安裝步驟如下:
a、下載倉庫代碼,
b、修改package.json包中的json至如下所示:
{ "name": "ob-kb-funnel", "version": "6.4.0", "kibana": { "version": "6.4.0" }, "devDependencies": { "numeral": "1.5.3", "d3-funnel": "^1.2.0" } }
主要修改 version 和 kibana.version字段,修改與所支持的版本,注意:該版本也要與kibana的版本一致。
c、拷貝到kibana的plugins下,進入該目錄, 執行 npm install (如果提示沒有安裝npm,網上查找nodejs npm 安裝),會自動下載所依賴的包,安裝在node_module下面。
d、重啟kibana及可。
安裝好之后會在可視化界面選擇視圖類型處看到Funnel View 組件,