- 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的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我创建了一个邻接链表来显示城市之间的航类。该程序从 2 个文件中读取,一个包含城市名称,另一个包含不同航类的来源和目的地。我为所服务的城市创建了一个数组,并为数组的每个城市索引创建了一个连接城市的链接
我正在寻找可以让我更好地了解着色器在游戏中的用途、它们可以做什么,甚至更重要的是,它们不能做什么的资源。我了解图形管道的工作原理以及所有这些,并且我在 GLSL 中制作了一些非常基本的着色器(主要是为
我正在尝试根据单选按钮的选择制作显示两个 div 之一的东西。就单选按钮而言,我有这段代码: 然后是我的DIV: Purchase and Sale Purchase or Sale 我
谁能告诉我应该使用哪些 GitHub API 来检索 GitHub 展示?谢谢。 为了获取GitHub的列表showcases ,我应该使用什么确切的 GitHub API? 选择主题后,要检索该主题
我添加了 showcaseview jar 到我的项目中并像这样使用它 ShowcaseView.ConfigOptions co = new ShowcaseView.ConfigOptio
如果这不可能,那么在使用应用程序 3 分钟后我该如何做?这将用于“给我们评分”提醒,但我希望用户在要求他们评分之前有一些时间实际使用该应用程序。 最佳答案 - (BOOL)application:(U
除了选择 0-4 之间的随机数,如果它的 3 显示广告,是否有更好的方式来展示插页式广告? 此方法有其缺点,因为有时广告不会展示一段时间,有时它们会连续展示 3 次,这非常烦人。任何帮助将不胜感激!
我们正在尝试在我们的 Android 应用程序中监控 Firebase 云消息传递功能的状态。我们经常收到用户的反馈,他们说他们没有。 通过检查 Google Firebase 报告工具,我们发现在过
我制作了一个加载苹果测试广告的测试应用程序。我想知道如何加载实时广告而不是苹果测试广告。加载实时 iAd 的机制是什么?任何人都可以在这方面帮助我吗? 问候阿卜杜勒·萨马德 最佳答案 作为docume
我正在尝试让我的应用程序在屏幕上休眠。 我研究过 pmset 但没有成功,我什至尝试过 IOHIDPostEvent。我可以让 IOHIDPostEvent 按下 Eject 键,但设置 Shift
有没有办法使用 manim 显示 latex 表并为其设置动画? 例如 \begin{table}[] \centering \begin{tabular}{lllll} & & \multico
有没有办法使用 manim 显示 latex 表并为其设置动画? 例如 \begin{table}[] \centering \begin{tabular}{lllll} & & \multico
此代码调用新数据并将其放入 div,但不会替换旧的 htm。它只是增加了它。代码中有错误,但我找不到它们。如何获取它来替换 htm 文件而不仅仅是添加到数据中? .click(function ()
我想检测网络状态,当网络状态发生变化时,在当前 Controller 中显示错误 View 。但是使用协议(protocol)有一个问题。这是代码: private func networkingDe
我被要求创建一个小环境,展示使用 NoSQL - SQL 混合数据库相对于仅使用 SQL 数据库的优势。由于我的背景主要是管理/DevOps,所以我对数据库有基本的了解,但我从未做过这样的事情。 我想
我有一个使用模式的表单。似乎在任何浏览器上,当我单击图标(上传链接)时,模式弹出,然后页面向左缩小一点。 此处为实例:http://dev.handyvet.org/VetProsDevSite/_M
我正在准备一个大师类,向工作中的一组技术美 worker 员展示。小组中的每个人以前都使用 C/C++/MEL/MAXScript/Python 进行过编程。该类(class)的目的是共同将每个人的技
几天前,我将我的 Beta (公开 Beta 测试) 应用程序提升到生产环境。一切顺利。我可以在 Playstore 中搜索我的应用程序。但是有一个问题,Playstore 没有删除我的应用程序名称旁
使用 Bootstrap 3,我想要一个方形的平铺菜单,看起来像 Bootstrap 的缩略图 (http://getbootstrap.com/components/#thumbnails)。获得平
我想显示 admob Ad通过mopub sdk在我的一个 iPhone 应用程序中,但我找不到 API Password和API Key通过 Ad Mob。 谁能帮我将 Admob 网络集成到 mo
我是一名优秀的程序员,十分优秀!