系列文章
- 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 编写.