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

简介: Grafana 系列 - 统一展示 -8-ElasticSearch 日志快速搜索仪表板

概述

我们是基于这篇文章创建一个类似的, 但是基于 ElasticSearch 的日志快速搜索仪表板.

最终完整效果如下:

ElasticSearch Logs Quick Search Dashboard

📝Notes:

其实我基于 ElasticSearch 做了 2 个仪表板

  • 用于检索 Applog 的
  • 用于检索 accesslog 的

在下面的讲解中会综合 2 个仪表板来进行说明.

这次不会讲述详细细节, 只选择部分关键点进行说明.

知识储备

创建 Query

使用自定义的 JSON 字符串编写查询,field 在 Elasticsearch 索引映射中被映射为一个 keyword

如果查询是 multi-fieldtextkeyword 类型,使用 "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'
AUTOIT
分布式 - OpenTSDB

以 OpenTSDB 的自定义格式对具有多个值的变量进行格式化。

servers = ['test1', 'test2']
String to interpolate: '${servers:distributed}'
Interpolation result: 'test1,servers=test2'
AUTOIT
双引号

将单值和多值变量形成一个逗号分隔的字符串,在单个值中用 \" 转义 ",并将每个值用"" 引号括起来。

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

将具有多个值的变量组成一个 glob(用于 Graphite 查询)。

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

将具有多个值的变量形成一个逗号分隔的字符串。

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

以 Lucene 格式对 Elasticsearch 的多值变量进行格式化。

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

对单值和多值变量进行格式化,以便在 URL 参数中使用。

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

将具有多个值的变量形成一个管道分隔的字符串。

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

关闭数据源特定的格式化,如 SQL 查询中的单引号。

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

将有多个值的变量形成一个 regex 字符串。

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

将单值和多值变量形成一个逗号分隔的字符串,在单个值中用 \' 转义 ',并将每个值用' 引号括起来。

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

将单值和多值变量组成一个逗号分隔的字符串,每个值中的 '''转义,每个值用 ' 引号括起来。

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

将单值和多值变量转换成其文本表示法。对于一个单变量,它将只返回文本表示法。对于多值变量,它将返回与 + 相结合的文本表示法。

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

查询参数

将单值和多值变量编入其查询参数表示法。例如:var-foo=value1&var-foo=value2

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

配置变量选择选项

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}]
CSS

直接使用 ${status_code:raw}, 这样传入就会变成:

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

按期望完成对 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)
ROUTEROS

$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

希望对你有所帮助.

相关实践学习
以电商场景为例搭建AI语义搜索应用
本实验旨在通过阿里云Elasticsearch结合阿里云搜索开发工作台AI模型服务,构建一个高效、精准的语义搜索系统,模拟电商场景,深入理解AI搜索技术原理并掌握其实现过程。
ElasticSearch 最新快速入门教程
本课程由千锋教育提供。全文搜索的需求非常大。而开源的解决办法Elasricsearch(Elastic)就是一个非常好的工具。目前是全文搜索引擎的首选。本系列教程由浅入深讲解了在CentOS7系统下如何搭建ElasticSearch,如何使用Kibana实现各种方式的搜索并详细分析了搜索的原理,最后讲解了在Java应用中如何集成ElasticSearch并实现搜索。 &nbsp;
相关文章
|
3月前
|
缓存 监控 前端开发
顺企网 API 开发实战:搜索 / 详情接口从 0 到 1 落地(附 Elasticsearch 优化 + 错误速查)
企业API开发常陷参数、缓存、错误处理三大坑?本指南拆解顺企网双接口全流程,涵盖搜索优化、签名验证、限流应对,附可复用代码与错误速查表,助你2小时高效搞定开发,提升响应速度与稳定性。
|
3月前
|
存储 Linux iOS开发
Elasticsearch Enterprise 9.1.5 发布 - 分布式搜索和分析引擎
Elasticsearch Enterprise 9.1.5 (macOS, Linux, Windows) - 分布式搜索和分析引擎
366 0
|
4月前
|
JSON 监控 Java
Elasticsearch 分布式搜索与分析引擎技术详解与实践指南
本文档全面介绍 Elasticsearch 分布式搜索与分析引擎的核心概念、架构设计和实践应用。作为基于 Lucene 的分布式搜索引擎,Elasticsearch 提供了近实时的搜索能力、强大的数据分析功能和可扩展的分布式架构。本文将深入探讨其索引机制、查询 DSL、集群管理、性能优化以及与各种应用场景的集成,帮助开发者构建高性能的搜索和分析系统。
367 0
|
11月前
|
存储 前端开发 数据可视化
Grafana Loki,轻量级日志系统
本文介绍了基于Grafana、Loki和Alloy构建的轻量级日志系统。Loki是一个由Grafana Labs开发的日志聚合系统,具备高可用性和多租户支持,专注于日志而非指标,通过标签索引而非内容索引实现高效存储。Alloy则是用于收集和转发日志至Loki的强大工具。文章详细描述了系统的架构、组件及其工作流程,并提供了快速搭建指南,包括准备步骤、部署命令及验证方法。此外,还展示了如何使用Grafana查看日志,以及一些基本的LogQL查询示例。最后,作者探讨了Loki架构的独特之处,提出了“巨型单体模块化”的概念,即一个应用既可单体部署也可分布式部署,整体协同实现全部功能。
4420 69
Grafana Loki,轻量级日志系统
|
8月前
|
存储 安全 Linux
Elasticsearch Enterprise 9.0 发布 - 分布式搜索和分析引擎
Elasticsearch Enterprise 9.0 (macOS, Linux, Windows) - 分布式搜索和分析引擎
371 0
|
8月前
|
存储 Linux iOS开发
Elasticsearch Enterprise 8.18 发布 - 分布式搜索和分析引擎
Elasticsearch Enterprise 8.18 (macOS, Linux, Windows) - 分布式搜索和分析引擎
338 0
|
存储 运维 监控
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
中信银行信用卡中心每日新增日志数据 140 亿条(80TB),全量归档日志量超 40PB,早期基于 Elasticsearch 构建的日志云平台,面临存储成本高、实时写入性能差、文本检索慢以及日志分析能力不足等问题。因此使用 Apache Doris 替换 Elasticsearch,实现资源投入降低 50%、查询速度提升 2~4 倍,同时显著提高了运维效率。
750 3
金融场景 PB 级大规模日志平台:中信银行信用卡中心从 Elasticsearch 到 Apache Doris 的先进实践
|
数据采集 人工智能 运维
从企业级 RAG 到 AI Assistant,阿里云Elasticsearch AI 搜索技术实践
本文介绍了阿里云 Elasticsearch 推出的创新型 AI 搜索方案
743 3
从企业级 RAG 到 AI Assistant,阿里云Elasticsearch AI 搜索技术实践
|
机器学习/深度学习 人工智能 运维
阿里云技术公开课直播预告:基于阿里云 Elasticsearch 构建 AI 搜索和可观测 Chatbot
阿里云技术公开课预告:Elastic和阿里云搜索技术专家将深入解读阿里云Elasticsearch Enterprise版的AI功能及其在实际应用。
613 2
阿里云技术公开课直播预告:基于阿里云 Elasticsearch 构建 AI 搜索和可观测 Chatbot
|
人工智能 自然语言处理 搜索推荐
云端问道12期实操教学-构建基于Elasticsearch的企业级AI搜索应用
本文介绍了构建基于Elasticsearch的企业级AI搜索应用,涵盖了从传统关键词匹配到对话式问答的搜索形态演变。阿里云的AI搜索产品依托自研和开源(如Elasticsearch)引擎,提供高性能检索服务,支持千亿级数据毫秒响应。文章重点描述了AI搜索的三个核心关键点:精准结果、语义理解、高性能引擎,并展示了架构升级和典型应用场景,包括智能问答、电商导购、多模态图书及商品搜索等。通过实验部分,详细演示了如何使用阿里云ES搭建AI语义搜索Demo,涵盖模型创建、Pipeline配置、数据写入与检索测试等步骤,同时介绍了相关的计费模式。
405 3

推荐镜像

更多