- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
我们是基于这篇文章: Grafana 系列文章(十二):如何使用 Loki 创建一个用于搜索日志的 Grafana 仪表板 , 创建一个类似的, 但是基于 ElasticSearch 的日志快速搜索仪表板. 。
最终完整效果如下
📝 Notes
其实我基于 ElasticSearch 做了2个仪表板 。
- 用于检索 Applog 的
- 用于检索 accesslog 的
在下面的讲解中会综合2个仪表板来进行说明. 。
这次不会讲述详细细节, 只选择部分关键点进行说明. 。
使用自定义的JSON字符串编写查询,field 在Elasticsearch索引映射中被映射为一个 keyword .
如果查询是 multi-field 的 text 和 keyword 类型,使用 "field": "fieldname.keyword" (有时是 fieldname.raw )来指定你查询中的关键字字段.
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 属性.
面板标题和 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 就是默认/回退选项.
将具有多个值的变量形成一个逗号分隔的字符串.
servers = ['test1', 'test2']
String to interpolate: '${servers:csv}'
Interpolation result: 'test1,test2'
以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查询).
servers = ['test1', 'test2']
String to interpolate: '${servers:glob}'
Interpolation result: '{test1,test2}'
将具有多个值的变量形成一个逗号分隔的字符串.
servers = ['test1', 'test2']
String to interpolate: '${servers:json}'
Interpolation result: '["test1", "test2"]'
以Lucene格式对Elasticsearch的多值变量进行格式化.
servers = ['test1', 'test2']
String to interpolate: '${servers:lucene}'
Interpolation result: '("test1" OR "test2")'
对单值和多值变量进行格式化,以便在URL参数中使用.
servers = ['foo()bar BAZ', 'test2']
String to interpolate: '${servers:percentencode}'
Interpolation result: 'foo%28%29bar%20BAZ%2Ctest2'
将具有多个值的变量形成一个管道分隔的字符串.
servers = ['test1.', 'test2']
String to interpolate: '${servers:pipe}'
Interpolation result: 'test1.|test2'
关闭数据源特定的格式化,如SQL查询中的单引号.
servers = ['test.1', 'test2']
String to interpolate: '${var_name:raw}'
Interpolation result: 'test.1,test2'
将有多个值的变量形成一个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'"
将单值和多值变量组成一个逗号分隔的字符串,每个值中的 ' 用 '' 转义,每个值用 ' 引号括起来.
servers = ["test'1", "test2"]
String to interpolate: '${servers:sqlstring}'
Interpolation result: "'test''1','test2'"
将单值和多值变量转换成其文本表示法。对于一个单变量,它将只返回文本表示法。对于多值变量,它将返回与 + 相结合的文本表示法.
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 是一个你可以用来管理变量选项选择的功能。所有的选择选项都是可选的,它们在默认情况下是关闭的.
内插一个选择了多个值的变量是很棘手的,因为如何将多个值格式化为一个在使用该变量的给定环境中有效的字符串并不直接。Grafana试图通过允许每个数据源插件告知模板插值引擎对多个值使用什么格式来解决这个问题.
📝 Notes
变量上的 Custom all value 选项必须为空,以便Grafana将所有值格式化为一个字符串。如果它留空,那么Grafana就会把查询中的所有值连接起来(加在一起)。类似于 value1,value2,value3 。如果使用了一个自定义的所有值,那么该值将是类似于 * 或 all 的东西.
InfluxDB和Prometheus使用regex表达式,所以 host1 , host2 , host3 变量会被插值为 {host1,host2,host3} 。每个值都会被regex转义.
Elasticsearch使用lucene查询语法,所以同样的变量会被格式化为 ("host1" OR "host2" OR "host3") 。在这种情况下,每一个值都必须被转义,以便该值只包含lucene控制词和引号.
Grafana在变量下拉列表中添加了一个 All 选项。如果用户选择了这个选项,那么所有的变量选项都被选中.
这个选项只有在选择了 Include All option 时才可见.
在Custom all value字段中可以输入regex、globs或lucene语法来定义All选项的值.
默认情况下, All 值包括组合表达式中的所有选项。这可能会变得非常长,而且会产生性能问题。有时,指定一个自定义的所有值可能会更好,比如通配符.
为了在 Custom all value 选项中拥有自定义的regex、globs或lucene语法,它永远不会被转义,所以你将不得不考虑什么是你的数据源的有效值.
如上文所述, Elasticsearch数据源支持在查询字段中使用多种变量语法. 。
当启用 Multi-value 或 Include all value 选项时,Grafana 会将标签从纯文本转换为与 Lucene 兼容的条件。即隐式转换 $varname 为 ${varname:lucene} 。
首先, 最重要的, 就是弄清楚该索引有哪些索引 字段(fields) , 以及有哪些 keywords , 选择部分字段和 keywords 作为 varibles. 可以直接通过 Kibana 界面进行查询和尝试. 。
如本次选择的有
app_name
level
request_path
(🐾 通过多次在 Kibana 上使用发现, 查询时应该使用 request_path.keyword
而不是 request_path
) request_method
status_code
设置如下
app_name
{"find": "terms", "field": "current_app_name"}
, 另外, 如果嵌套使用, 可以类似这样 {"find": "terms", "field": "pod_name", "query": "app_name:$app_name"}
设置如下
request_path
{"find": "terms", "field": "request_path.keyword", "query": "app_name:$app_name"}
*
🐾 注意, 这里使用了 Custom all value, 最终 Query All 的表达式就会变成: request_path.keyword:* 而不是 request_path.keyword:(<path1> OR <path2> ...) 。
request_method 常用的就这么几个
所以可以将其设置为 Custom variable, 设置如下
request_method
GET,POST,DELETE,HEAD, PUT,PATCH,OPTIONS
*
日志级别可以直接使用 Custom 类型变量. 如下
level
Custom
INFO, WARN, ERROR,FATAL
如果只关注错误日志, 那么 level 变量的默认值可以设置为同时勾选: ERROR 和 FATAL 。
这里会将 status_code variable 用于 Lucene 的范围语法 [] (包括开头和结尾的2个数字), 所以有用到 Custom all value 以及 Variable 语法配置. 。
status_code
Custom
200 TO 299, 300 TO 399, 400 TO 499, 500 TO 599
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 的查询. 。
最后, 还添加一个 Ad hoc filters variable, 方便用户进行更多自定义的过滤筛选. 。
Ad hoc filters
${datasource}
后续会在该 Dashboard 的所有 Query 中自动使用. 一个典型使用场景如下
对于 request_path , 需要过滤监控/健康检查等请求(包含 info health metric 等关键词), 那么可以将该 filter 保存为默认的变量值. 。
Dashboard 只有 2 个面板组成
INFO
日志为绿色, WARN
日志为黄色, ERROR
和 FATAL
日志为红色. 如下图
可以通过如下 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 中, 也可以根据实际情况做一系列调整. 。
如下图, 可以对日志展示方式做调整
另外, 考虑到 ES 日志的 log details 会有很多我们不关注的 fields, 如: _source _id 等, 可以通过 Transform 进行转换调整. 具体如下图
这篇文章算是该系列文章的一个重点了. 包含了非常多的实用细节. 。
如
Ad hoc filters
Variable 希望对你有所帮助. 。
三人行, 必有我师; 知识共享, 天下为公. 本文由东风微鸣技术博客 EWhisper.cn 编写. 。
最后此篇关于Grafana系列-统一展示-8-ElasticSearch日志快速搜索仪表板的文章就讲到这里了,如果你想了解更多关于Grafana系列-统一展示-8-ElasticSearch日志快速搜索仪表板的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在为期末考试学习,但我无法理解这个 FC 算法: 我理解你标准化每条规则的部分。然后我认为下一行是说对于满足广义 Modus Ponens (p'_iTheta = p_iTheta) 的每个 t
我有一个 3d 世界,它有一个 simpel 平台和一个代表玩家的立方体。当我旋转平台时,立方体会滑动并按照您预期的方式执行,增加和减少物理 Material 中的摩擦力。 我希望立方体在输入例如 f
所以我的 Unity 项目有一个大问题。我昨天工作,我没有做备份今天,在我打开项目后,我的笔记本电脑因电池电量不足而关机。之后,当我进入项目时,我得到了这个:加载“Assets/MyScene.uni
好的,我正在尝试创建一个函数来确定元组列表是否是可传递的,即如果 (x,y) 和 (y,z) 在列表中,那么 (x,z) 也在列表中。 例如,[(1,2), (2,3), (1,3)]是传递的。 现在
这个问题在这里已经有了答案: How to pass data between scenes in Unity (5 个回答) 9 个月前关闭。 我有一个游戏,我有一个队列匹配系统。 我想向玩家展示他
我现在正在为我的游戏创建一个 keystore (统一)但是当我按下添加键按钮时,会弹出一个错误 Java Development Kit (JDK) directory is not set or
我想将YouTube流视频放入Cardboard(适用于Android和iOS)应用中。我知道这些插件可以执行类似的操作,例如“Easy Movie Texture”,但它们不支持YouTube流媒体
我需要限制 ConfigurableJoint 的目标旋转以避免关节变形或破坏。 为了了解角度限制的工作原理,我做了一个实验。 在场景中放置一个人形模型。 为骨骼添加ConfigurableJoint
尝试实现一种有限形式的匹配统一。 尝试匹配两个公式匹配如果我们能找到替代出现在公式中的变量使得两者在句法上是等价。 我需要写一个函数来判断一个对应于基本项的常数,例如 Brother(George)
我正在使用 Unity 和 C#我想在运行时将输出日志文件发送到我的电子邮件,我使用了来自 this question 的 ByteSheep 答案和来自 this question 的 Arkane
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
我希望能够将鼠标悬停在游戏对象(代理)上并在右键或左键单击时创建一个类似于 Windows 右键单击菜单的 float 菜单。我试过结合使用 OnGUI() 和 OnMouseOver() 但我要
我正在为 oculus Gear VR 开发游戏(考虑内存管理),我需要在特定时间(以秒为单位)后加载另一个屏幕 void Start () { StartCoroutine (loadSce
我设法生成了敌人,但它们一直在生成。如何设置限制,避免不断生成? 我已经尝试添加 spawnLimit 和 spawnCounter 但无法让它工作。 var playerHealth = 100;
我正在参加使用 Unity 进行游戏开发的在线类(class),讲师有时会含糊不清。我的印象是使用游戏对象与使用游戏对象名称(在本例中为 MusicPlayer)相同,但是当我尝试将 MusicPla
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 6 年前。 Improve this qu
为了好玩,我正在(用 Java)开发一个使用统一算法的应用程序。 我选择了我的统一算法返回所有可能的统一。例如,如果我尝试解决 添加(X,Y)=成功(成功(0)) 返回 {X = succ(succ(
如何让对象在一段时间后不可见(或只是删除)?使用 NGUI。 我的示例(更改): public class scriptFlashingPressStart : MonoBehaviour {
我有下一个错误: The type or namespace name 'NUnit' could not be found (are you missing a using directive or
这是可以做到的 但是属性 autoSizeTextType 只能用于 API LEVEL >= 26,并且 Android Studio 会显示有关该问题的烦人警告。 为了摆脱这个问题,我想以编程方
我是一名优秀的程序员,十分优秀!