Grafana系列-统一展示-8-ElasticSearch日志快速搜索仪表板
系列文章
- Grafana 系列文章
概述
我们是基于这篇文章: Grafana 系列文章(十二):如何使用 Loki 创建一个用于搜索日志的 Grafana 仪表板, 创建一个类似的, 但是基于 ElasticSearch 的日志快速搜索仪表板.
最终完整效果如下:
📝Notes:
其实我基于 ElasticSearch 做了2个仪表板
- 用于检索 Applog 的
- 用于检索 accesslog 的
在下面的讲解中会综合2个仪表板来进行说明.
这次不会讲述详细细节, 只选择部分关键点进行说明.
知识储备
创建 Query
使用自定义的JSON字符串编写查询,field 在Elasticsearch索引映射中被映射为一个 keyword。
如果查询是 multi-field 的 text
和 keyword
类型,使用 "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-value 或 Include 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 变量的默认值可以设置为同时勾选: ERROR
和 FATAL
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
保存为默认的变量值.
3. Panel
Dashboard 只有 2 个面板组成:
- 上图: Time series, 显示日志柱状图, 并着色,
INFO
日志为绿色,WARN
日志为黄色,ERROR
和FATAL
日志为红色. - 下日志
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 随之改变.
另外一个需要注意的点是, Metric
是 Count
(日志条数) 而不是 Logs
(具体日志).
还有, 需要配置 Override -> Color, 如下:
最后, 如果柱子太密, 可以通过调整如 3 Colors Time series panel
图中的 Interval
来调整时间间隔, 本例调整为 1m
Logs panel
在 Logs panel 中, 也可以根据实际情况做一系列调整.
如下图, 可以对日志展示方式做调整:
- 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 进行转换调整. 具体如下图:
总结
这篇文章算是该系列文章的一个重点了. 包含了非常多的实用细节.
如:
- 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 编写.
相关文章:

Grafana系列-统一展示-8-ElasticSearch日志快速搜索仪表板
系列文章 Grafana 系列文章 概述 我们是基于这篇文章: Grafana 系列文章(十二):如何使用 Loki 创建一个用于搜索日志的 Grafana 仪表板, 创建一个类似的, 但是基于 ElasticSearch 的日志快速搜索仪表板. 最终完整效果如下: 📝…...

【K8s】openEuler23操作系统安装Docker和Kubernetes
openEuler23操作系统安装 服务器搭建环境随手记 文章目录 openEuler23操作系统安装前言:一、前期准备(所有节点)1.1所有节点,关闭防火墙规则,关闭selinux,关闭swap交换,打通所有服务器网络&am…...

异常数据检测 | Python实现ADTK时间序列异常数据检测
文章目录 文章概述模型描述程序设计参考资料文章概述 异常数据检测 | Python实现ADTK时间序列异常数据检测 智能运维AIOps的数据基本上都是时间序列形式的,而异常检测告警是AIOps中重要组成部分。 模型描述 笔者最近在处理时间序列数据时有使用到adtk这个python库,在这里和大…...

软件测试之jmeter性能测试让你打开一个全新的世界
一、Jmeter简介 1 概述 jmeter是一个软件,使负载测试或业绩为导向的业务(功能)测试不同的协议或技术。 它是 Apache 软件基金会的Stefano Mazzocchi JMeter 最初开发的。 它主要对 Apache JServ(现在称为如 Apache Tomcat…...

Redis数据结构——动态字符串、Dict、ZipList
一、Redis数据结构-动态字符串 我们都知道Redis中保存的Key是字符串,value往往是字符串或者字符串的集合。可见字符串是Redis中最常用的一种数据结构。 不过Redis没有直接使用C语言中的字符串,因为C语言字符串存在很多问题: 获取字符串长度…...

ipad可以用别的品牌的手写笔吗?便宜的ipad电容笔
而对于那些把ipad当做学习工具的人而言,苹果Pencil就成了必备品。但因为苹果Pencil太贵了,学生们买不起。因此,最好的选择还是平替电容笔。作为一个ipad的忠实用户,同时也是一个数字热爱着,这两年来,我一直…...

【数据库】关于SQL SERVER的排序规则的问题分析
在安装报表系统,运行sql语句时候提示“无法解决 equal to 操作的排序规则冲突。”,费了半天时间才搞定,原来是因为sql语句中没有加全collate Chinese_PRC_CI_AI_WS ! 用排序规则特点计算汉字笔划和取得拼音首字母 SQL SERVER的…...

算法修炼之练气篇——练气十三层
博主:命运之光 专栏:算法修炼之练气篇 目录 题目 1023: [编程入门]选择排序 题目描述 输入格式 输出格式 样例输入 样例输出 题目 1065: 二级C语言-最小绝对值 题目描述 输入格式 输出格式 样例输入 样例输出 题目 1021: [编程入门]迭代法求…...

ChatGPT:AI不取代程序员,只取代的不掌握AI的程序员
作者:成都兰亭集势信息技术有限公司技术总监张雄 可能大家会有如下的问题,我就使用chatGPT这个AI工具的API来问一下。 问:chatGPT会替换掉程序员吗?如果能,预计好久? 答:作为一名 AI 语言模型&a…...

数字革命下的产品:百数十年变迁的启示与思考。
随着数字化时代的到来,软件开发成为各行各业不可或缺的一部分。然而,传统的软件开发方法需要长时间的开发周期,高昂的成本和大量的人力资源。因此,低代码开发平台应运而生。低代码开发平台通过简化开发人员的工作和加速软件开发流…...

部门新来一00后,给我卷崩溃了...
2022年已经结束结束了,最近内卷严重,各种跳槽裁员,相信很多小伙伴也在准备今年的金三银四的面试计划。 在此展示一套学习笔记 / 面试手册,年后跳槽的朋友可以好好刷一刷,还是挺有必要的,它几乎涵盖了所有的…...

使用Spring Boot和Docker构建可伸缩的微服务架构,应对增长的业务需求
使用Spring Boot和Docker构建可伸缩的微服务架构,应对增长的业务需求 一、简介1. 微服务架构的定义2. Spring Boot和Docker的概述 二、Spring Boot1. Spring Boot的介绍2. Spring Boot的优势3. Spring Boot的组件4. Spring Boot的应用 三、Docker1. Docker的介绍2. …...

计算机组成原理基础练习题第四章
1.下述说法中()是正确的。 A、半导体RAM信息可读可写,且断电后仍能保持记忆 B、半导体RAM是易失性RAM,而静态RAM中的存储信息是不易失的 C、半导体RAM是易失性RAM,而静态RAM只有在电源不掉电时,所存信息是不易失的 D、以上选项都不对 解析…...

浅谈Gradle构建工具
一、序言 常见的项目构建工具有Ant、Maven、Gradle,以往项目常见采用Maven进构建,但随着技术的发展,越来越多的项目采用Gradle进行构建,例如 Spring-boot。Gradle站在了Ant和Maven构建工具的肩膀上,使用强大的表达式语…...

如何获取和制作免费的icon图标素材
icon 图标在界面设计中虽然占比不大,但却是不可缺少的设计元素之一。设计师通过 icon 图标,将抽象的概念通俗化,降低用户理解某个操作的难度。而设计师也会通过改变 icon 图标的样式来展现整体界面的视觉效果。icon 图标的风格有很多…...

【MySQL】MySQL索引--聚簇索引和非聚簇索引的区别
文章目录 前言1.聚簇索引和非聚簇索引的概念2.两者详细介绍2.1 聚簇索引2.2 非聚簇索引 3. 两者的区别3.1 数据存储方式3.2 二级索引查询 前言 1.聚簇索引和非聚簇索引的概念 数据库表的索引从数据存储方式上可以分为聚簇索引和非聚簇索引两种。“聚簇”的意思是数据行被按照…...

如何使用 SVG.js 中的一些相关方法来创建、设置和操作 image 元素
SVG.js 是一个基于 JavaScript 的 SVG 库,提供了许多常用的 SVG 元素和方法,方便开发者进行 SVG 图形的创建和操作。其中,image 元素是 SVG.js 中较为常用的元素之一,本文将详细介绍 SVG.js 中与 image 元素相关的方法。 一、创建…...

展会进行时!5月16-18日箱讯与您相约中国航交会
宁波国际会展中心7、8号馆 第五届中国(宁波)国际航运物流交易会 暨2023全球物流企业合作博览会 火爆进行中 箱讯与您相约 8号馆 C033K-C036展位 期待您的光临! 2023年5月16-18日,第五届中国(宁波)国际…...

CMake:递归检查并拷贝所有需要的DLL文件
文章目录 1. 目的2. 设计整体思路多层依赖的处理获取 DLL 所在目录探测剩余的 DLL 文件 3. 代码实现判断 stack 是否为空判断 stack 是否为空获取所有 target检测并拷贝 DLL 4. 使用 1. 目的 在基于 CMake 构建的 C/C 工程中,拷贝当前工程需要的每个DLL文件到 Visu…...

python常见问题及解决方案
Python是一种高级编程语言,具有易于学习、易于阅读和易于维护的特点。然而,即使是最有经验的Python开发人员也可能会遇到一些常见的错误。在本文中,我们将讨论一些常见的Python运行时错误,并提供解决这些错误的办法。 语法错误 …...

JUC之Synchronized与Lock
Synchronized 称之为”同步锁 作用: 保证在同一时刻, 被修饰的代码块或方法只会有一个线程执行,以达到保证并发安全的效果 用法: 1.修饰方法:方法锁,锁的对象是当前对象 2.修饰静态方法:类锁…...

动态规划理论基础
文章目录 定义动态规划与分治问题的区别两种方式实现动态规划方法一:带备忘录的自顶向下法方法二:自底向上法 本质核心解题步骤常见题型划分 定义 动态规划方法通常用来求解最优化问题(optimization problem)。这类问题可以有很多可行解,每个…...

Redis的数据类型
参考文档:https://www.runoob.com/redis/redis-tutorial.html redis当中一共支持五种数据类型,分别是: string字符串 list列表 set集合 hash表 zset有序集合 1、对字符串string的操作 下表列出了常用的 redis 字符串命令 1 设置值 获取…...

vue3鼠标经过显示按钮
在前端开发中,我们经常需要在页面中添加一些交互效果来提升用户体验。其中一个常见的需求就是鼠标经过某个元素时显示一个按钮,这个按钮可以用于触发一些操作或者显示更多的内容。 在本篇文章中,我将会介绍如何使用 Vue3 实现一个鼠标经过显…...

【2023华为OD笔试必会25题--C语言版】《18 最短木板长度》——数组
本专栏收录了华为OD 2022 Q4和2023Q1笔试题目,100分类别中的出现频率最高(至少出现100次)的25道,每篇文章包括原始题目 和 我亲自编写并在Visual Studio中运行成功的C语言代码。 仅供参考、启发使用,切不可照搬、照抄,查重倒是可以过,但后面的技术面试还是会暴露的。✨✨…...

yolov5车道线检测+测距(碰撞检测)
yolov5车道线检测+测距(碰撞检测) 1. 车道线检测2. 测距2.1 测距原理2.2 相机标定2.2.1:标定方法12.2.2:标定方法23. 相机测距3.1 测距添加3.2 主代码4. 实验结果相关链接 1. 基于yolov5的车道线检测及安卓部署 2. YOLOv5+单目测距(python) 3. 具体实现效果...

微服务学习笔记--(Gateway网关)
统一网关Gateway 为什么需要网关gateway快速入门断言工厂过滤器工厂全局过滤器跨域问题 Gateway网关-网关作用介绍 为什么需要网关 网关功能: 身份认证和权限校验服务路由、负载均衡请求限流 网关的技术实现 在SpringCloud中网关的实现包括两种: …...

QML插件的创建及调用
QML插件的创建及调用 创建QML Plugin注册插件调用插件 创建QML Plugin 1、 注册插件 1、可以将qml文件放在qmldir中进行声明。 此种方式需要将qml文件和qmldir放在一起 module EularFrame plugin EularFrameEButton 1.0 MyButton.qml2、可以在*plugin.cpp注册 此种方式只需…...

数据结构学习分享之树的介绍
💓博主CSDN主页:杭电码农-NEO💓 ⏩专栏分类:数据结构学习分享⏪ 🚚代码仓库:NEO的学习日记🚚 🌹关注我🫵带你了解更多数据结构的知识 🔝🔝 数据结构第六课 1. 前言&a…...

MySQL数据库基础2
文章目录 数据类型表的约束 数据类型 1、数值类型:BIT、TINYINT、BOOL、SMALLINT、INT、BIGINT、FLOAT[(M,D)]、DOUBLE[(M,D)]、DECIMAL[(M,D)] FLOAT[(M,D)]:占用四个字节,M表示显示位数,D表示小数位数,精度保证&am…...