主頁 >  其他 > Grafana系列-統一展示-8-ElasticSearch日志快速搜索儀表板

Grafana系列-統一展示-8-ElasticSearch日志快速搜索儀表板

2023-05-14 07:59:00 其他

系列文章

  • Grafana 系列文章

概述

我們是基于這篇文章: Grafana 系列文章(十二):如何使用 Loki 創建一個用于搜索日志的 Grafana 儀表板, 創建一個類似的, 但是基于 ElasticSearch 的日志快速搜索儀表板.

最終完整效果如下:

ElasticSearch Logs Quick Search Dashboard

??Notes:

其實我基于 ElasticSearch 做了2個儀表板

  • 用于檢索 Applog 的
  • 用于檢索 accesslog 的

在下面的講解中會綜合2個儀表板來進行說明.

這次不會講述詳細細節, 只選擇部分關鍵點進行說明.

知識儲備

創建 Query

使用自定義的JSON字串撰寫查詢,field 在Elasticsearch索引映射中被映射為一個 keyword,

如果查詢是 multi-field 的 textkeyword 型別,使用 "field": "fieldname.keyword"(有時是fieldname.raw)來指定你查詢中的關鍵字欄位,

Query

Query Description
{"find": "fields", "type": "keyword"} 回傳一個索引型別為keyword 的欄位名串列,
{"find": "terms", "field": "hostname.keyword", "size": 1000} 使用 terms 聚合回傳一個 keyword 的值串列,查詢將使用當前儀表板的時間范圍作為時間范圍查詢,
{"find": "terms", "field": "hostname", "query": '<Lucene query>'} 使用terms 聚合和指定的Lucene查詢過濾器,回傳一個keyword field 的值串列,查詢將使用當前儀表板的時間范圍作為查詢的時間范圍,

terms 的查詢默認有500個結果的限制,要設定一個自定義的限制,需要在你的查詢中設定size屬性,

Variable 語法

面板標題和 metric 查詢可以使用多種不同的語法來參考變數:

  • $varname, 這種語法很容易閱讀,但它不允許你在詞的中間使用變數,例如:apps.frontend.$server.requests.count
  • ${var_name}, 當你想在運算式的中間插值一個變數時,請使用這種語法,
  • ${var_name:<format>} 這種格式讓你對Grafana如何插值有更多控制,
  • [[varname]] 不建議使用,廢棄的舊語法,將在未來的版本中洗掉,

高級變數格式選項

變數插值的格式取決于資料源,但在有些情況下,你可能想改變默認的格式,

例如,MySql資料源的默認格式是以逗號分隔的方式連接多個值,并加引號, 如:'server01', 'server02'.在某些情況下,你可能希望有一個不帶引號的逗號分隔的字串, 如:server01,server02,你可以用下面列出的高級變數格式化選項來實作這一目的,

通用語法

語法: ${var_name:option}

可以在Grafana Play網站上測驗格式化選項,

如果指定了任何無效的格式化選項,那么 glob 就是默認/回退選項,

CSV

將具有多個值的變數形成一個逗號分隔的字串,

servers = ['test1', 'test2']
String to interpolate: '${servers:csv}'
Interpolation result: 'test1,test2'
分布式 - OpenTSDB

以OpenTSDB的自定義格式對具有多個值的變數進行格式化,

servers = ['test1', 'test2']
String to interpolate: '${servers:distributed}'
Interpolation result: 'test1,servers=test2'
雙引號

將單值和多值變數形成一個逗號分隔的字串,在單個值中用\"轉義",并將每個值用""引號括起來,

servers = ['test1', 'test2']
String to interpolate: '${servers:doublequote}'
Interpolation result: '"test1","test2"'
Glob - Graphite

將具有多個值的變陣列成一個glob(用于Graphite查詢),

servers = ['test1', 'test2']
String to interpolate: '${servers:glob}'
Interpolation result: '{test1,test2}'
JSON

將具有多個值的變數形成一個逗號分隔的字串,

servers = ['test1', 'test2']
String to interpolate: '${servers:json}'
Interpolation result: '["test1", "test2"]'
Lucene - Elasticsearch

以Lucene格式對Elasticsearch的多值變數進行格式化,

servers = ['test1', 'test2']
String to interpolate: '${servers:lucene}'
Interpolation result: '("test1" OR "test2")'
URL 編碼 (Percentencode)

對單值和多值變數進行格式化,以便在URL引數中使用,

servers = ['foo()bar BAZ', 'test2']
String to interpolate: '${servers:percentencode}'
Interpolation result: 'foo%28%29bar%20BAZ%2Ctest2'
Pipe

將具有多個值的變數形成一個管道分隔的字串,

servers = ['test1.', 'test2']
String to interpolate: '${servers:pipe}'
Interpolation result: 'test1.|test2'
Raw

關閉資料源特定的格式化,如SQL查詢中的單引號,

servers = ['test.1', 'test2']
String to interpolate: '${var_name:raw}'
Interpolation result: 'test.1,test2'
Regex

將有多個值的變數形成一個regex字串,

servers = ['test1.', 'test2']
String to interpolate: '${servers:regex}'
Interpolation result: '(test1\.|test2)'
單引號

將單值和多值變數形成一個逗號分隔的字串,在單個值中用\'轉義',并將每個值用'引號括起來,

servers = ['test1', 'test2']
String to interpolate: '${servers:singlequote}'
Interpolation result: "'test1','test2'"
Sqlstring

將單值和多值變陣列成一個逗號分隔的字串,每個值中的'''轉義,每個值用'引號括起來,

servers = ["test'1", "test2"]
String to interpolate: '${servers:sqlstring}'
Interpolation result: "'test''1','test2'"
Text

將單值和多值變數轉換成其文本表示法,對于一個單變數,它將只回傳文本表示法,對于多值變數,它將回傳與+相結合的文本表示法,

servers = ["test1", "test2"]
String to interpolate: '${servers:text}'
Interpolation result: "test1 + test2"

查詢引數

將單值和多值變數編入其查詢引數表示法,例如:var-foo=value1&var-foo=value2

servers = ["test1", "test2"]
String to interpolate: '${servers:queryparam}'
Interpolation result: "servers=test1&servers=test2"

配置變數選擇選項

Selection Options 是一個你可以用來管理變數選項選擇的功能,所有的選擇選項都是可選的,它們在默認情況下是關閉的,

Multi-value Variables

內插一個選擇了多個值的變數是很棘手的,因為如何將多個值格式化為一個在使用該變數的給定環境中有效的字串并不直接,Grafana試圖通過允許每個資料源插件告知模板插值引擎對多個值使用什么格式來解決這個問題,

??Notes:

變數上的Custom all value選項必須為空,以便Grafana將所有值格式化為一個字串,如果它留空,那么Grafana就會把查詢中的所有值連接起來(加在一起),類似于value1,value2,value3,如果使用了一個自定義的所有值,那么該值將是類似于*all的東西,

帶有Prometheus或InfluxDB資料源的多值變數

InfluxDB和Prometheus使用regex運算式,所以host1, host2, host3 變數會被插值為{host1,host2,host3},每個值都會被regex轉義,

使用Elastic資料源的多值變數

Elasticsearch使用lucene查詢語法,所以同樣的變數會被格式化為("host1" OR "host2" OR "host3"),在這種情況下,每一個值都必須被轉義,以便該值只包含lucene控制詞和引號,

Include All 選項

Grafana在變數下拉串列中添加了一個 All 選項,如果用戶選擇了這個選項,那么所有的變數選項都被選中,

自定義 all 的值

這個選項只有在選擇了 Include All option 時才可見,

在Custom all value欄位中可以輸入regex、globs或lucene語法來定義All選項的值,

默認情況下,All 值包括組合運算式中的所有選項,這可能會變得非常長,而且會產生性能問題,有時,指定一個自定義的所有值可能會更好,比如通配符,

為了在 Custom all value 選項中擁有自定義的regex、globs或lucene語法,它永遠不會被轉義,所以你將不得不考慮什么是你的資料源的有效值,

ElasticSearch Template Variables

選擇一種 Variable 語法

如上文所述, Elasticsearch資料源支持在查詢欄位中使用多種變數語法.

當啟用 Multi-valueInclude all value 選項時,Grafana 會將標簽從純文本轉換為與 Lucene 兼容的條件,即隱式轉換 $varname${varname:lucene}

實戰

1. 弄清楚有哪些索引欄位

首先, 最重要的, 就是弄清楚該索引有哪些索引欄位(fields), 以及有哪些keywords, 選擇部分欄位和 keywords 作為 varibles. 可以直接通過 Kibana 界面進行查詢和嘗試.

如本次選擇的有:

  • app_name
  • level
  • request_path (?? 通過多次在 Kibana 上使用發現, 查詢時應該使用 request_path.keyword 而不是 request_path)
  • request_method
  • status_code

2. 創建 Variables

app_name

設定如下:

  • Name: app_name
  • Type: Query
  • Data source: ES
  • Query: {"find": "terms", "field": "current_app_name"}, 另外, 如果嵌套使用, 可以類似這樣 {"find": "terms", "field": "pod_name", "query": "app_name:$app_name"}

request_path

設定如下:

  • Name: request_path
  • Type: Query
  • Data source: ES
  • Query: {"find": "terms", "field": "request_path.keyword", "query": "app_name:$app_name"}
  • Multi-value: ??
  • Include All option: ??
  • Custom all value: *

?? 注意, 這里使用了 Custom all value, 最終 Query All 的運算式就會變成: request_path.keyword:* 而不是 request_path.keyword:(<path1> OR <path2> ...)

request_method

request_method 常用的就這么幾個:

  • GET
  • POST
  • DELETE
  • HEAD
  • PUT
  • PATCH
  • OPTIONS

所以可以將其設定為 Custom variable, 設定如下:

  • Name: request_method
  • Type: Custom
  • Values separated by comma: GET,POST,DELETE,HEAD, PUT,PATCH,OPTIONS
  • Multi-value: ??
  • Include All option: ??
  • Custom all value: *

level

日志級別可以直接使用 Custom 型別變數. 如下:

  • Name: level
  • Type: Custom
  • Values separated by comma: INFO, WARN, ERROR,FATAL
  • Multi-value: ??
  • Include All option: ??

如果只關注錯誤日志, 那么 level 變數的默認值可以設定為同時勾選: ERRORFATAL

status_code

這里會將 status_code variable 用于 Lucene 的范圍語法 [](包括開頭和結尾的2個數字), 所以有用到Custom all value 以及 Variable 語法配置.

  • Name: status_code
  • Type: Custom
  • Values separated by comma: 200 TO 299, 300 TO 399, 400 TO 499, 500 TO 599
  • Include All option: ??
  • Custom all value: 200 TO 599 (??Note: 即包括所有的 http 狀態碼, 從 200 到 599)

后續要在 Query 中使用, 用法如下:

status_code:[${status_code:raw}]

直接使用 ${status_code:raw}, 這樣傳入就會變成:

status_code:[200 TO 299]
status_code:[200 TO 599]

按期望完成對 ES 的查詢.

filter

最后, 還添加一個 Ad hoc filters variable, 方便用戶進行更多自定義的過濾篩選.

  • Name: filter
  • Type: Ad hoc filters
  • Data source: ${datasource}

后續會在該 Dashboard 的所有 Query 中自動使用. 一個典型使用場景如下:

對于 request_path, 需要過濾監控/健康檢查等請求(包含info health metric 等關鍵詞), 那么可以將該 filter 保存為默認的變數值.

request_path ad hoc filter

3. Panel

Dashboard 只有 2 個面板組成:

  • 上圖: Time series, 顯示日志柱狀圖, 并著色, INFO日志為綠色, WARN 日志為黃色, ERRORFATAL 日志為紅色.
  • 下日志

Time series panel

如下圖:

3 Colors Time series panel

可以通過如下 Query 實作:

app_name:$app_name AND level:($level AND INFO)
app_name:$app_name AND level:($level AND ERROR or FATAL)

$level AND INFO 這種寫法是一個 workaround, 為的是在 level 變數改變時, Time series panel 隨之改變.

另外一個需要注意的點是, MetricCount(日志條數) 而不是 Logs (具體日志).

還有, 需要配置 Override -> Color, 如下:

Color Override

最后, 如果柱子太密, 可以通過調整如 3 Colors Time series panel 圖中的 Interval 來調整時間間隔, 本例調整為 1m

Logs panel

在 Logs panel 中, 也可以根據實際情況做一系列調整.

如下圖, 可以對日志展示方式做調整:

Logs panel settings

  • Time: 是否加時間戳
  • Unique labels: 是否每條日志加 label
  • Common labels: 是否對 logs panel 左上角對所有日志加 common labels
  • Wrap lines
  • Pretify JSON: JSON 美化
  • Enable log details: 啟用查看日志詳細資訊
  • Deduplication: 日志去重, 去重方式有:
    • None: 不去重
    • Exact: 精確去重
    • Numbers: 不同數字記為同一類的去重方式
    • Signature: 根據計算得出的 Signature 去重
  • Order: 排序.

另外, 考慮到 ES 日志的 log details 會有很多我們不關注的 fields, 如: _source _id 等, 可以通過 Transform 進行轉換調整. 具體如下圖:

Logs panel Transform

總結

這篇文章算是該系列文章的一個重點了. 包含了非常多的實用細節.

如:

  • ES Query
  • Variable 語法
    • Variable raw 語法
    • Lucene - Elasticsearch 語法
  • Multi-value Variables
  • Include All 選項
  • 自定義 all 的值
  • Ad hoc filters Variable
  • ES Metric Type
    • Count
    • Logs
  • 調整Query 時間間隔
  • Logs panel 設定
  • Panel Transform

希望對你有所幫助.

三人行, 必有我師; 知識共享, 天下為公. 本文由東風微鳴技術博客 EWhisper.cn 撰寫.

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/552379.html

標籤:其他

上一篇:聯邦學習:聯邦場景下的域泛化

下一篇:返回列表

標籤雲
其他(158984) Python(38129) JavaScript(25420) Java(18034) C(15226) 區塊鏈(8265) C#(7972) AI(7469) 爪哇(7425) MySQL(7181) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5871) 数组(5741) R(5409) Linux(5339) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4572) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2433) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) .NET技术(1972) 功能(1967) Web開發(1951) HtmlCss(1936) python-3.x(1918) C++(1915) 弹簧靴(1913) xml(1889) PostgreSQL(1875) .NETCore(1860) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 網閘典型架構簡述

    網閘架構一般分為兩種:三主機的三系統架構網閘和雙主機的2+1架構網閘。 三主機架構分別為內端機、外端機和仲裁機。三機無論從軟體和硬體上均各自獨立。首先從硬體上來看,三機都用各自獨立的主板、記憶體及存盤設備。從軟體上來看,三機有各自獨立的作業系統。這樣能達到完全的三機獨立。對于“2+1”系統,“2”分為 ......

    uj5u.com 2020-09-10 02:00:44 more
  • 如何從xshell上傳檔案到centos linux虛擬機里

    如何從xshell上傳檔案到centos linux虛擬機里及:虛擬機CentOs下執行 yum -y install lrzsz命令,出現錯誤:鏡像無法找到軟體包 前言 一、安裝lrzsz步驟 二、上傳檔案 三、遇到的問題及解決方案 總結 前言 提示:其實很簡單,往虛擬機上安裝一個上傳檔案的工具 ......

    uj5u.com 2020-09-10 02:00:47 more
  • 一、SQLMAP入門

    一、SQLMAP入門 1、判斷是否存在注入 sqlmap.py -u 網址/id=1 id=1不可缺少。當注入點后面的引數大于兩個時。需要加雙引號, sqlmap.py -u "網址/id=1&uid=1" 2、判斷文本中的請求是否存在注入 從文本中加載http請求,SQLMAP可以從一個文本檔案中 ......

    uj5u.com 2020-09-10 02:00:50 more
  • Metasploit 簡單使用教程

    metasploit 簡單使用教程 浩先生, 2020-08-28 16:18:25 分類專欄: kail 網路安全 linux 文章標簽: linux資訊安全 編輯 著作權 metasploit 使用教程 前言 一、Metasploit是什么? 二、準備作業 三、具體步驟 前言 Msfconsole ......

    uj5u.com 2020-09-10 02:00:53 more
  • 游戲逆向之驅動層與用戶層通訊

    驅動層代碼: #pragma once #include <ntifs.h> #define add_code CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS) /* 更多游戲逆向視頻www.yxfzedu.com ......

    uj5u.com 2020-09-10 02:00:56 more
  • 北斗電力時鐘(北斗授時服務器)讓網路資料更精準

    北斗電力時鐘(北斗授時服務器)讓網路資料更精準 北斗電力時鐘(北斗授時服務器)讓網路資料更精準 京準電子科技官微——ahjzsz 近幾年,資訊技術的得了快速發展,互聯網在逐漸普及,其在人們生活和生產中都得到了廣泛應用,并且取得了不錯的應用效果。計算機網路資訊在電力系統中的應用,一方面使電力系統的運行 ......

    uj5u.com 2020-09-10 02:01:03 more
  • 【CTF】CTFHub 技能樹 彩蛋 writeup

    ?碎碎念 CTFHub:https://www.ctfhub.com/ 筆者入門CTF時時剛開始刷的是bugku的舊平臺,后來才有了CTFHub。 感覺不論是網頁UI設計,還是題目質量,賽事跟蹤,工具軟體都做得很不錯。 而且因為獨到的金幣制度的確讓人有一種想去刷題賺金幣的感覺。 個人還是非常喜歡這個 ......

    uj5u.com 2020-09-10 02:04:05 more
  • 02windows基礎操作

    我學到了一下幾點 Windows系統目錄結構與滲透的作用 常見Windows的服務詳解 Windows埠詳解 常用的Windows注冊表詳解 hacker DOS命令詳解(net user / type /md /rd/ dir /cd /net use copy、批處理 等) 利用dos命令制作 ......

    uj5u.com 2020-09-10 02:04:18 more
  • 03.Linux基礎操作

    我學到了以下幾點 01Linux系統介紹02系統安裝,密碼啊破解03Linux常用命令04LAMP 01LINUX windows: win03 8 12 16 19 配置不繁瑣 Linux:redhat,centos(紅帽社區版),Ubuntu server,suse unix:金融機構,證券,銀 ......

    uj5u.com 2020-09-10 02:04:30 more
  • 05HTML

    01HTML介紹 02頭部標簽講解03基礎標簽講解04表單標簽講解 HTML前段語言 js1.了解代碼2.根據代碼 懂得挖掘漏洞 (POST注入/XSS漏洞上傳)3.黑帽seo 白帽seo 客戶網站被黑帽植入劫持代碼如何處理4.熟悉html表單 <html><head><title>TDK標題,描述 ......

    uj5u.com 2020-09-10 02:04:36 more
最新发布
  • Grafana系列-統一展示-8-ElasticSearch日志快速搜索儀表板

    系列文章 Grafana 系列文章 概述 我們是基于這篇文章: Grafana 系列文章(十二):如何使用 Loki 創建一個用于搜索日志的 Grafana 儀表板, 創建一個類似的, 但是基于 ElasticSearch 的日志快速搜索儀表板. 最終完整效果如下: 📝Notes: 其實我基于 E ......

    uj5u.com 2023-05-14 07:59:00 more
  • 聯邦學習:聯邦場景下的域泛化

    然而,目前大多數域泛化方法需要將不同領域的資料進行集中收集。然而在現實場景下,由于隱私性的考慮,資料常常是分布式收集的。因此我們需要考慮聯邦域泛化(federated domain generalization, FedDG)方法。這里需要注意的是,傳統的域泛化方法常常要求直接對齊表征或操作資料,這... ......

    uj5u.com 2023-05-14 07:58:17 more
  • AtCoder Beginner Contest 301

    title: AtCoder Beginner Contest 301 categories: 演算法題解 description: 咕咕咕 tags: Atcoder 貪心 BFS DP cover: /img/chino/vec/chino17.jpg katex: true date: 2023 ......

    uj5u.com 2023-05-14 07:57:41 more
  • 牛客小白月賽72

    A.跳躍游戲 題目: 分析: 根據跳躍規則,只要中間存在高度介于起點和終點之間的平臺即可讓小Z從第一個平臺跳到最后一個平臺。 code: #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; int a[N]; in ......

    uj5u.com 2023-05-14 07:57:29 more
  • Codeforces Round 871 (Div. 4)

    A.Love Story 題意: 給定n個長度為10的字串,問其與codeforces字串的對應下標字母不同的個數。 分析: 對于每個字串從前往后依次和“codeforces”對應字符比較然后統計不同字母數即可 code: #include <bits/stdc++.h> using name ......

    uj5u.com 2023-05-14 07:57:17 more
  • Codeforces Round 867 (Div. 3)

    A. TubeTube Feed 分析: 從所有a[i]+i-1<=t的選擇種取個max即可 code: #include <bits/stdc++.h> using namespace std; const int N = 55; int a[N], b[N]; int main() { std: ......

    uj5u.com 2023-05-14 07:57:10 more
  • 牛客小白月賽71

    A.貓貓與廣告 題目: 分析: 只需考慮c * d的矩陣豎著擺和橫著擺兩種情況。本題提示了考慮兩矩陣對應邊平行的情況,實際上可以證明倘若能斜著放,那么一定可以橫著放或豎著放,證明方式可已通過構造三角形來證明a* b的矩陣的長寬一定小于c * d矩陣的長寬。 code: #include <iostr ......

    uj5u.com 2023-05-14 07:56:50 more
  • 給你安利一款國產良心軟體uTools

    前言 大家好,我是xiezhr 最近由于換了新電腦,也是在各種折騰搭建開發環境,安裝各種常用軟體。今天呢給大家安利一款你可能沒用過的國產良心軟體uTools,這也是我剛剛拿到電腦后安裝的第一款軟體吧。第一次知道這軟體是在B站刷程式員魚皮up主視頻的時候,up主推薦的。它能極大提作業和學習效率,可以稱 ......

    uj5u.com 2023-05-14 07:49:58 more
  • 爆肝一周,我開源了ChatGPT 中文版介面,官方1:1鏡像支持全部 官方介

    這里實作我之前文章承諾承接上文 人人實作ChatGPT自由,手把手教你零擼部署自己聊天私服 現在ChatGPT 提供了api介面 可以讓我自己對接去實作我們自己想要gpt應用,但是由于一些原因,國內也不開放介面,所以我就1:1 自己對接了官方所有介面。 大家可以通過我的介面輕松實作一個自己定制化的聊 ......

    uj5u.com 2023-05-14 07:31:46 more
  • 打開windows批處理大門

    大家好,我是xiezhr。 1 前言 打開歷史文章一看,上一篇文章是2021年3月20號更新的,又拖更了。 一個原因是,最近作業上真的挺忙的,有比較著急需要加班加點趕的需求。好在清明前算是把比較著急的改好了。本來安排清明也是要加班的,但是真的加不動了。(連著加班真的挺影響效率的,適當休息是非常有必要 ......

    uj5u.com 2023-05-14 07:26:20 more