Kibana 中文指南 Guide Cn
User Manual:
Open the PDF directly: View PDF .
Page Count: 128
Download | |
Open PDF In Browser | View PDF |
Table of Contents 1. 简介 2. Kibana 3 指南 i. 10 分钟入门 ii. 请求和过滤 iii. 行和面板 iv. 保存和加载 v. 仪表板纲要(schema) vi. 模板和脚本 vii. 配置文件 viii. 面板 i. histogram ii. table iii. map iv. bettermap v. terms vi. column vii. stats viii. query ix. trends x. text xi. sparklines xii. hits xiii. goal xiv. percentile xv. range ix. 认证鉴权 i. 用 nodejs 实现 CAS 认证 ii. 用 Perl 实现的认证鉴权框架 x. 源码剖析与二次开发 i. 源码目录结构 ii. 入口和模块依赖 iii. 控制器和服务 iv. 面板相关指令 v. 面板内部实现 3. Kibana 4 指南 i. 安装和运行 ii. 访问 iii. discover iv. visualize v. dashboard vi. 配置 vii. 生产环境部署 viii. 新功能介绍 ix. 源码剖析 i. 主页入口 ii. 搜索页 iii. 可视化页 iv. 仪表板页 v. 设置页 vi. .kibana 索引数据结构 4. 捐赠名单 简介 Kibana 是一个使用 Apache 开源协议的 Elasticsearch 分析和搜索仪表板。已经历经了 v1, v2, v3, v4 个版本,分别采用了 PHP,Ruby,AngularJS,JRuby,NodeJS 等不同语言编写。本书主要介绍 v3 和 v4 的使用。 注释 本书原始内容来源Elasticsearch 官方指南 Kibana 部分,并对 v3 的 panel 部分加以截图注释。在有时间的前提下,将会添加 更多关于 kibana 源码解析和第三方 panel 的介绍。 译作者的话 Kibana 因其丰富的图表类型和漂亮的前端界面,被很多人理解成一个统计工具。而我个人认为,ELK 这一套体系,不应该和 Hadoop 体系同质化。定期的离线报表,不是 Elasticsearch 专长所在(多花费分词、打分这些步骤在高负载压力环境上太奢 侈了),也不应该由 Kibana 来完成(每次刷新都是重新计算)。Kibana 的使用场景,应该集中在两方面: 实时监控 通过 histogram 面板,配合不同条件的多个 queries 可以对一个事件走很多个维度组合出不同的时间序列走势。时间序 列数据是最常见的监控报警了。 问题分析 通过 Kibana 的交互式界面可以很快的将异常时间或者事件范围缩小到秒级别或者个位数。期望一个完美的系统可以给 你自动找到问题原因并且解决是不现实的,能够让你三两下就从 TB 级的数据里看到关键数据以便做出判断就很棒了。 这时候,一些非 histogram 的其他面板还可能会体现出你意想不到的价值。全局状态下看似很普通的结果,可能在你锁 定某个范围的时候发生剧烈的反方向的变化,这时候你就能从这个维度去重点排查。而表格面板则最直观的显示出你最 关心的字段,加上排序等功能。入库前字段切分好,对于排错分析真的至关重要。 以上是我在和同事就 ES 跟 Hadoop 对比的谈话中形成的思路。特此留笔。2014 年 8 月 28 日 关于 elk 的用途,我想还可以参照其对应的商业产品 splunk 的场景: 使用 Splunk 的意义在于使信息收集和处理智能化。而其操作智能化表现在: 1. 搜索,通过下钻数据排查问题,通过分析根本原因来解决问题; 2. 实时可见性,可以将对系统的检测和警报结合在一起,便> 于跟踪 SLA 和性能问题; 3. 历史分析,可以从中找出趋势和历史模式,行为基线和阈值,生成一致性报告。 ——2014 年 11 月 17 日摘自 Peter Zadrozny, Raghu Kodali 著/唐宏,陈健译《Splunk大数据分析》 参阅 Elasticsearch 权威指南 精通 Elasticsearch Logstash 最佳实践 The Logstash Book 进度 欢迎捐赠,作者支付宝账号:rao.chenlin@gmail.com 简介 Kibana 是一个使用 Apache 开源协议,基于浏览器的 Elasticsearch 分析和搜索仪表板。Kibana 非常容易安装和使用。整个 项目都是用 HTML 和 Javascript 写的,所以 Kibana 不需要任何服务器端组件,一个纯文本发布服务器就够了。Kibana 和 Elasticsearch 一样,力争>成为极易上手,但同样灵活而强大的软件。 10 分钟入门 Kibana 对实时数据分析来说是特别适合的工具。本节内容首先让你快速入门,了解 Kibana 所能做的大部分事情。如果你还 没下载 Kibana,点击右侧链接:下载 Kibana。我们建议你在开始本教程之前,先部署好一个干净的 elasticsearch 进程。 到本节结束,你就会: 导入一些数据 尝试简单的仪表板 搜索你的数据 配置 Kibana 只显示你的新索引而不是全部索引 我们假设你已经: 在自己电脑上安装好了 Elasticsearch 在自己电脑上搭建好了网站服务器,并把 Kibana 发行包解压到了发布目录里 对 UNIX 命令行有一点了解,使用过 curl 导入数据 我们将使用莎士比亚全集作为我们的示例数据。要更好的使用 Kibana,你需要为自己的新索引应用一个映射集(mapping)。 我们用下面这个映射集创建"莎士比亚全集"索引。实际数据的字段比这要多,但是我们只需要指定下面这些字段的映射就可 以了。注意到我们设置了对 speaker 和 play_name 不分析。原因会在稍后讲明。 在终端运行下面命令: curl -XPUT http://localhost:9200/shakespeare -d ' { "mappings" : { "_default_" : { "properties" : { "speaker" : {"type": "string", "index" : "not_analyzed" }, "play_name" : {"type": "string", "index" : "not_analyzed" }, "line_id" : { "type" : "integer" }, "speech_number" : { "type" : "integer" } } } } } '; 很棒,我们这就创建好了索引。现在需要做的时导入数据。莎士比亚全集的内容我们已经整理成了 elasticsearch 批量 导入 所需要的格式,你可以通过shakeseare.json下载。 用如下命令导入数据到你本地的 elasticsearch 进程中。这可能需要一点时间,莎士比亚可是著作等身的大文豪! curl -XPUT localhost:9200/_bulk --data-binary @shakespeare.json 访问 Kibana 界面 现在你数据在手,可以干点什么了。打开浏览器,访问已经发布了 Kibana 的本地服务器。 如果你解压路径无误(译者注:使用 github 源码的读者记住发布目录应该是 kibana/src/ 里面),你已经就可以看到上面这个 可爱的欢迎页面。点击 Sample Dashboard 链接 好了,现在显示的就是你的 sample dashboard!如果你是用新的 elasticsearch 进程开始本教程的,你会看到一个百分比占 比很重的饼图。这里显示的是你的索引中,文档类型的情况。如你所见,99% 都是 lines,只有少量的 acts 和scenes。 再下面,你会看到一长段 JSON 格式的莎士比亚诗文。 第一次搜索 Kibana 允许使用者采用 Lucene Query String 语法搜索 Elasticsearch 中的数据。请求可以在页面顶部的请求输入框中书 写。 在请求框中输入如下内容。然后查看表格中的前几行内容。 friends, romans, countrymen 关于搜索请求的语法,请阅读 Queries and Filters。 配置另一个索引 目前 Kibana 指向的是 Elasticsearch 一个特殊的索引叫 引, shakespeare _all 。 _all 可以理解为全部索引的大集合。目前你只有一个索 ,但未来你会有更多其他方面的索引,你肯定不希望 Kibana 在你只想搜《麦克白》里心爱的句子的时候 还要搜索全部内容。 配置索引,点击右上角的配置按钮: 在这里,你可以设置你的索引为 下一步 shakespeare ,这样 Kibana 就只会搜索 shakespeare 索引的内容了。 恭喜你,你已经学会了安装和配置 Kibana,算是正式下水了!下一步,打开我们的视频和其他教程学习更高级的技能吧。现 在,你可以尝试在一个空白仪表板上添加自己的面板。这方面的内容,请阅读 Rows and Panels。 译者注 在 Elasticsearch 发布 1.4 版后,使用 kibana3 访问 ES1.4 集群,会显示如下错误: 这是因为 ES1.4 增强了权限管理。你需要在 ES 配置文件 elasticsearch.yml 中添加下列配置并重启服务后才能正常访问: http.cors.enabled: true http.cors.allow-origin: "*" 记住 kibana3 页面也要刷新缓存才行。 此外,如果你可以很明确自己 kibana 以外没有其他 http 访问,可以把 kibana 的网址写在 中。比如: http.cors.allow-origin: "/https?:\/\/kbndomain/" http.cors.allow-origin 参数的值 请求和过滤 图啊,表啊,地图啊,Kibana 有好多种图表,我们怎么控制显示在这些图表上的数据呢?这就是请求和过滤起作用的地方。 Kibana 是基于 Elasticsearch 的,所以支持强大的 Lucene Query String 语法,同样还能用上 Elasticsearch 的过滤器能力。 我们假设你已经: 在自己电脑上安装好了 Elasticsearch 在自己电脑上搭建好了网站服务器,并把 Kibana 发行包解压到了发布目录里 读过 Using Kibana for the first time 并且按照文章内容准备好了存有莎士比亚文集的索引 我们的仪表板 我们的仪表板像下面这样,可以搜索莎士比亚文集的内容。如果你喜欢本章截图的这种仪表板样式,你可以下载导出的仪表 板纲要(dashboard schema) 请求 在搜索栏输入下面这个非常简单的请求 to be or not to be 你会注意到,表格里第一条就是你期望的《哈姆雷特》。不过下一行却是《第十二夜》的安德鲁爵士,这里可没有"to be", 也没有"not to be"。事实上,这里匹配上的是 to OR be OR or OR not OR to OR be 。 我们需要这么搜索(译者注:即加双引号)来匹配整个短语: "to be or not to be" 或者指明在某个特定的字段里搜索: line_id:86169 我们可以用 AND/OR 来组合复杂的搜索,注意这两个单词必须大写: food AND love 还有括号: ("played upon" OR "every man") AND stage 数值类型的数据可以直接搜索范围: line_id:[30000 TO 80000] AND havoc 最后,当然是搜索所有: * 多个请求 有些场景,你可能想要比对两个不同请求的结果。Kibana 可以通过 OR 的方式把多个请求连接起来,然后分别进行可视化处 理。 添加请求 点击请求输入框右侧的 + 号,即可添加一个新的请求框。 点击完成后你应该看到的是这样子 在左边,绿色输入框,输入 "not to be" "to be" 然后右边,黄色输入框,输入 "not to be" 。这就会搜索每个包含有 "to be" 或者 内容的文档,然后显示在我们的 hits 饼图上。我们可以看到原先一个大大的绿色圆形变成下面这样: 移除请求 要移除一个请求,移动鼠标到这个请求输入框上,然后会出现一个 x 小图标,点击小图标即可: 颜色和图例 Kibana 会自动给你的请求分配一个可用的颜色,不过你也可以手动设置颜色。点击请求框左侧的彩色圆点,就可以弹出请求 设置下拉框。这里面可以修改请求的颜色,或者设置为这个请求设置一个新的图例文字: 过滤 很多 Kibana 图表都是交互式的,可以用来过滤你的数据视图。比如,点击你图表上的第一个条带,你会看到一些变动。整 个图变成了一个大大的绿色条带。这是因为点击的时候,就添加了一个过滤规则,要求匹配 play_name 字段里的单词。 你要问了“在哪里过滤了”? 答案就藏在过滤(FILTERING)标签上出现的白色小星星里。点击这个标签,你会发现在 filtering 面板里已经添加了一个过滤规 则。在 filtering 面板里,可以添加,编辑,固定,删除任意过滤规则。很多面板都支持添加过滤规则,包括表格(table),直 方图(histogram),地图(map)等等。 过滤规则也可以自己点击 + 号手动添加。 更多阅读 你现在已经可以处理过滤和请求了,你可能很好奇在 Kibana schema 里,他们是怎么存在的。如果你还想知道如何通过 URL 参数来添加请求和过滤,欢迎阅读 Templated and Scripted Dashboards 行和面板 Kibana 的仪表板是由行和面板组成的。这些都可以随意的添加,删除和重组。 这节我们会介绍: 加载一个空白仪表板 添加,隐藏行,以及修改行高 添加面板和修改面板宽度 删除面板和行 我们假设你已经: 在自己电脑上安装好了 Elasticsearch 在自己电脑上搭建好了网站服务器,并把 Kibana 发行包解压到了发布目录里 读过 Using Kibana for the first time 并且按照文章内容准备好了存有莎士比亚文集的索引 加载一个空白仪表板 从主屏里选择第三项,就会加载一个空白仪表板(Blank Dashboard)。默认情况下,空白仪表板会搜索 Elasticsearch 的 _all 索引,也就是你的全部索引。要指定搜索某个索引的,阅读 Using Kibana for the first time。 添加一行 你的新空白仪表板上只有展开的请求和过滤区域,页面顶栏上有个时间过滤选择器,除此以外什么都没有。在右下方,点击 添加行(ADD A ROW)按钮,添加你的第一行。 给你的行取个名字,然后点击创建(Create Row)按钮。你会看到你的新行出现在左侧的行列表里。点击保存(Save) 行的控制 现在你有了一行,你会注意到仪表板上多了点新元素。主要是左侧多出来的三个小小的不同颜色的长方形。移动鼠标到它们 上面 哈哈!看到了吧,这三个按钮是让你做这三件事情的: 折叠行(蓝色) 配置行(橘色) 添加面板(绿色) 添加面板 现在我们专注在行控制力的绿色按钮上,试试点击它。你也可以点击空白行内的灰色按钮(Add panel to empty row),不过它 是灰色的啊,有啥意思…… 让我们来添加一个 terms 面板。terms 面板可以让我们用上 Elasticsearch 的 terms facet 功能,查找一个字段内最经常出现 的几个值。 你可以看到,terms 面板有一系列可配置选选,不过我们现在先只管第一段里德通用配置好了: 1. Title: 面板的名称 2. Span: 面板的宽度。Kibana 仪表板等分成 12 个 spans 面板最大就是到 12 个 spans 宽。但是行可以容纳超过 12 个 spans 的总宽度,因为它会自动把新的面板放到下面显示。现在我们先设置为 4。 3. Editable: 面板是否在之后可以继续被编辑。现在先略过。 4. Inspectable: 面板是否允许用户查看所用的请求内容。现在先略过。 5. 点击 Save 添加你的新 terms 面板到你的仪表板 译者注:面板宽度也可以在仪表板内直接拖拽修改,将鼠标移动至面板左(右)侧边线处,鼠标会变成相应的箭头,按住左键 拖拽成满意宽度松开即可 太棒了!你现在有一个面板了!你可能意识到这个数据跟 Using Kibana for the first time 中的饼图数据一样。 shakespeare 数据集集中在 lines,还有少量的 acts 和 scenes。 折叠和展开行 蓝色按钮可以折叠你的行。被折叠行里的面板不会刷新数据,也就不要求 Elasticsearch 资源。所以折叠行可以用于那些你不 需要经常看的数据。有需要的时候点击蓝色按钮展开就可以了。 顶部的请求和过滤区域也可以被折叠。点击彩色标签就可以折叠和展开。 编辑行 通过行编辑器,可以给行重命名,改行高等其他配置。点击橙色按钮打开行编辑器。 这个对话框还允许你修改面板的排序和大小,以及删除面板。 移动和删除面板 面板可以在本行,甚至其他行之间任意拖拽。按住面板右上角的十字架形状小图标然后拖动即可。 点击面板右上角的 remove 小图标就可以从仪表板上移除它。前面说到从行编辑器上也可以做到统一效果。 移动和删除行 行可以在仪表板配置页中重新排序和删。点击屏幕右上角的配置按钮,选择行(Rows)标签切换到行配置层。看到这里你一定 会记起来我们在添加第一个行时候的屏幕。 左侧的箭头用来修改仪表板上行的次序。X 用来删除行。 下一步 在你关闭浏览器之前,你可能打算保存这个新仪表板。请阅读 Saving and Loading dashboards。 保存和加载 你已经构建了一个漂亮的仪表板!现在你打算分享给团队,或者开启自动刷新后挂在一个大屏幕上?Kibana 可以把仪表板设 计持久化到 Elasticsearch 里,然后在需要的时候通过加载菜单或者 URL 地址调用出来。 保存你漂亮的仪表板 保存你的界面非常简单,打开保存下拉菜单,取个名字,然后点击保存图表即可。现在你的仪表板就保存在一个叫做 kibana-int 的 Elasticsearch 索引里了。 调用你的仪表板 要搜索已保存的仪表板列表,点击右上角的加载图标。在这里你可以加载,分享和删除仪表板。 分享仪表板 已保存的仪表板可以通过你浏览器地址栏里的 URL 分享出去。每个持久化到 Elasticsearch 里的仪表板都有一个对应的 URL,像下面这样: http://your_host/index.html#/dashboard/elasticsearch/MYDASHBOARD 这个示例中 MYDASHBOARD 就是你在保存的时候给仪表板取得名字。 你还可以分享一个即时的仪表板链接,点击 Kibana 右上角的分享图标,会生成一个临时 URL。 默认情况下,临时 URL 保存 30 天。 保存成静态仪表板 仪表板可以保存到你的服务器磁盘上成为 .json 文件。把文件放到 app/dashboards 目录,然后通过下面地址访问 http://your_host/index.html#/dashboard/file/MYDASHBOARD.json MYDASHBOARD.json 就是磁盘上文件的名字。注意路径中得 /#dashboard/file/ 看起来跟之前访问保存在 Elasticsearch 里的 仪表板很类似,不过这里访问的是文件而不是 elasticsearch。导出的仪表板纲要的详细信息,阅读 The Dashboard Schema Explained 下一步 你现在知道怎么保存,加载和访问仪表板了。你可能想知道怎么通过 URL 传递参数来访问,这样可以在其他应用中直接链接 过来。请阅读 Templated and Scripted Dashboards 仪表板纲要 Kibana 仪表板可以很容易的在浏览器中创建出来,而且绝大多数情况下,浏览器已经足够支持你创建一个很有用很丰富的节 目了。不过,当你真的需要一点小修改的时候,Kibana 也可以让你直接编辑仪表板的纲要。 注意:本节内容只针对高级用户。JSON 语法非常严格,多一个逗号,少一个大括号,都会导致你的仪表板无法加载。 我们会用上面这个仪表板作为示例。你可以导出任意的仪表板纲要,点击右上角的保存按钮,指向高级(Advanced)菜单,然 后点击导出纲要(Export Schema)。示例使用的纲要文件可以在这里下载: schema.json 因为仪表板是由特别长的 JSON 文档组成的,我们只能分成一段段的内容,分别介绍每段的作用和目的。 和所有的 JSON 文档一样,都是以一个大括号开始的。 { 服务(services) "services": { 服务(Services)是被多个面板使用的持久化对象。目前仪表板对象附加有 2 种服务对象,不指明的话,就会自动填充成请求 (query)和过滤(filter)服务了。 Query Filter query "query": { "list": { "0": { "query": "play_name:\"Romeo and Juliet\"", "alias": "", "color": "#7EB26D", "id": 0, "pin": false, "type": "lucene", "enable": true } }, "ids": [ 0 ] }, 请求服务主要是由仪表板顶部的请求栏控制的。有两个属性: List: 一个以数字为键的对象。每个值描述一个请求对象。请求对象的键命名一目了然,就是描述请求输入框的外观和行 为的。 Ids: 一个由 ID 组成的数组。每个 ID 都对应前面 list 对象的键。 ids 数组用来保证显示时 list 的排序问题。 filter "filter": { "list": { "0": { "type": "querystring", "query": "speaker:ROMEO", "mandate": "must", "active": true, "alias": "", "id": 0 } }, "ids": [ 0 ] } }, 过滤的行为和请求很像,不过过滤不能在面板级别选择,而是对全仪表板生效。过滤对象和请求对象一样有 list 和 ids 两个 属性,各属性的行为和请求对象也一样。 垂幕(pulldown) "pulldowns": [ 垂幕是一种特殊的面板。或者说,是一个特殊的可以用来放面板的地方。在垂幕里的面板就跟在行里的一样,区别就是不能 设置 span 宽度。垂幕里的面板永远都是全屏宽度。此外,垂幕里的面板也不可以吧被使用者移动或编辑。所以垂幕特别适 合放置输入框。垂幕的属性是一个由面板对象构成的数组。关于特定的面板,请阅读 Kibana Panels { "type": "query", "collapse": false, "notice": false, "enable": true, "query": "*", "pinned": true, "history": [ "play_name:\"Romeo and Juliet\"", "playname:\"Romeo and Juliet\"", "romeo" ], "remember": 10 }, { "type": "filtering", "collapse": false, "notice": true, "enable": true } ], 垂幕面板有 2 个普通行面板没有的选项: Collapse: 设置为真假值,代表着面板被折叠还是展开。 Notice: 面板设置这个值,控制在垂幕的标签主题上出现一个小星星。用来通知使用者,这个面板里发生变动了。 导航(nav) nav 属性里也有一个面板列表,只是这些面板是被用来填充在页首导航栏里德。目前唯一支持导航的面板是时间选择器 (timepicker) "nav": [ { "type": "timepicker", "collapse": false, "notice": false, "enable": true, "status": "Stable", "time_options": [ "5m", "15m", "1h", "6h", "12h", "24h", "2d", "7d", "30d" ], "refresh_intervals": [ "5s", "10s", "30s", "1m", "5m", "15m", "30m", "1h", "2h", "1d" ], "timefield": "@timestamp" } ], loader loader 属性描述了仪表板顶部的保存和加载按钮的行为。 "loader": { "save_gist": false, "save_elasticsearch": true, "save_local": true, "save_default": true, "save_temp": true, "save_temp_ttl_enable": true, "save_temp_ttl": "30d", "load_gist": false, "load_elasticsearch": true, "load_elasticsearch_size": 20, "load_local": false, "hide": false }, 行数组 rows 就是通常放置面板的地方。也是唯一可以通过浏览器页面添加的位置。 "rows": [ { "title": "Charts", "height": "150px", "editable": true, "collapse": false, "collapsable": true, 行对象包含了一个面板列表,以及一些行的具体参数,如下所示: title: 行的标题 height: 行的高度,单位是像素,记作 px editable: 真假值代表面板是否可被编辑 collapse: 真假值代表行是否被折叠 collapsable: 真价值代表使用者是否可以折叠行 面板数组 行的 panels 数组属性包括有一个以自己出现次序排序的面板对象的列表。各特定面板本身的属性列表和说明,阅读 Kibana Panels "panels": [ { "error": false, "span": 8, "editable": true, "type": "terms", "loadingEditor": false, "field": "speech_number", "exclude": [], "missing": false, "other": false, "size": 10, "order": "count", "style": { "font-size": "10pt" }, "donut": false, "tilt": false, "labels": true, "arrangement": "horizontal", "chart": "bar", "counter_pos": "above", "spyable": true, "queries": { "mode": "all", "ids": [ 0 ] }, "tmode": "terms", "tstat": "total", "valuefield": "", "title": "Longest Speeches" }, { "error": false, "span": 4, "editable": true, "type": "goal", "loadingEditor": false, "donut": true, "tilt": false, "legend": "none", "labels": true, "spyable": true, "query": { "goal": 111397 }, "queries": { "mode": "all", "ids": [ 0 ] }, "title": "Percentage of Total" } ] } ], 索引设置 索引属性包括了 Kibana 交互的 Elasticsearch 索引的信息。 "index": { "interval": "none", "default": "_all", "pattern": "[logstash-]YYYY.MM.DD", "warm_fields": false }, interval: none, hour, day, week, month。这个属性描述了索引所遵循的时间间隔模式。 default: 如果 interval 被设置为 none,或者后面的 failover 设置为 true 而且没有索引能匹配上正则模式的话,搜 索这里设置的索引。 pattern: 如果 interval 被设置成除了 none 以外的其他值,就需要解析这里设置的模式,启用时间过滤规则,来确定请 求哪些索引。 warm_fields: 是否需要解析映射表来确定字段列表。 其余 下面四个也是顶层的仪表板配置项 "failover": false, "editable": true, "style": "dark", "refresh": false } failover: 真假值,确定在没有匹配上索引模板的时候是否使用 index.default 。 editable: 真假值,确定是否在仪表板上显示配置按钮。 style: "亮色(light)" 或者 "暗色(dark)" refresh: 可以设置为 "false" 或者其他 elasticsearch 支持的时间表达式(比如 10s, 1m, 1h),用来描述多久触发一次面板 的数据更新。 导入纲要 默认是不能导入纲要的。不过在仪表板配置屏的控制(Controls)标签里可以开启这个功能,启用 "Local file" 选项即可。然后 通过仪表板右上角加载图标的高级设置,选择导入文件,就可以导入纲要了。 模板和脚本 Kibana 支持通过模板或者更高级的脚本来动态的创建仪表板。你先创建一个基础的仪表板,然后通过参数来改变它,比如通 过 URL 插入一个新的请求或者过滤规则。 模板和脚本都必须存储在磁盘上,目前不支持存储在 Elasticsearch 里。同时它们也必须是通过编辑或创建纲要生成的。所以 我们强烈建议阅读 The Kibana Schema Explained 仪表板目录 仪表板存储在 Kibana 安装目录里的 子目录里。你会注意到这里面有两种文件: app/dashboards .json 文件和 .js 文件。 模板化仪表板(.json) .json 文件就是模板化的仪表板。模板示例可以在 logstash.json 语法,可以让你在 json 里插入 javascript 语句。URL 参数存在 仪表板的请求和过滤对象里找到。模板使用 handlebars 对象中。下面是 ARGS logstash.json (on github) 里请求和过 滤服务的代码片段: "0": { "query": "{{ARGS.query || '*'}}", "alias": "", "color": "#7EB26D", "id": 0, "pin": false } [...] "0": { "type": "time", "field": "@timestamp", "from": "now-{{ARGS.from || '24h'}}", "to": "now", "mandate": "must", "active": true, "alias": "", "id": 0 } 这允许我们在 URL 里设置两个参数, 会搜索过去 7 天内 注意:千万注意 url status:200 query 和 from 。如果没设置,默认值就是 || 后面的内容。比如说,下面的 URL 就 的数据: #/dashboard/file/logstash.json 里的 file 字样 http://yourserver/index.html#/dashboard/file/logstash.json?query=status:200&from=7d 脚本化仪表板(.js) 脚本化仪表板比模板化仪表板更加强大。当然,功能强大随之而来的就是构建起来也更复杂。脚本化仪表板的目的就是构建 并返回一个描述了完整的仪表板纲要的 javascript 对象。 app/dashboards/logstash.js 本化仪表板示例。这个文件的最终结果和 一致,但提供了更强大的功能,比如我们可以以逗号分割多个请 logstash.json (on github) 就是一个有着详细注释的脚 求: 注意:千万注意 URL #/dashboard/script/logstash.js 里的 script 字样。这让 kibana 解析对应的文件为 javascript 脚本。 http://yourserver/index.html#/dashboard/script/logstash.js?query=status:403,status:404&from=7d 这会创建 2 个请求对象, status:403 和 status:404 并分别绘图。事实上这个仪表板还能接收另一个参数 split 定用什么字符串切分。 http://yourserver/index.html#/dashboard/script/logstash.js?query=status:403!status:404&from=7d&split=! 我们可以看到 logstash.js (on github) 里是这么做的: // In this dashboard we let users pass queries as comma separated list to the query parameter. // Or they can specify a split character using the split aparameter // If query is defined, split it into a list of query objects // NOTE: ids must be integers, hence the parseInt()s if(!_.isUndefined(ARGS.query)) { queries = _.object(_.map(ARGS.query.split(ARGS.split||','), function(v,k) { return [k,{ query: v, id: parseInt(k,10), alias: v }]; })); } else { // No queries passed? Initialize a single query to match everything queries = { 0: { query: '*', id: 0, } }; } 该仪表板可用参数比上面讲述的还要多,全部参数都在 logstash.js (on github) 文件里开始的注释中有讲解。 ,用于指 配置 config.js 是 Kibana 核心配置的地方。文件里包括得参数都是必须在初次运行 kibana 之前提前设置好的。 参数 elasticsearch 你 elasticsearch 服务器的 URL 访问地址。你应该不会像写个 http://localhost:9200 在这,哪怕你的 Kibana 和 Elasticsearch 是在同一台服务器上。默认的时候这里会尝试访问你部署 kibana 的服务器上的 ES 服务,你可能需要设置为 你 elasticsearch 服务器的主机名。 注意:如果你要传递参数给 http 客户端,这里也可以设置成对象形式,如下: +elasticsearch: {server: "http://localhost:9200", withCredentials: true}+ default_route 没有指明加载哪个仪表板的时候,默认加载页路径的设置参数。你可以设置为文件,脚本或者保存的仪表板。比如,你有一 个保存成 "WebLogs" 的仪表板在 elasticsearch 里,那么你就可以设置成: default_route: /dashboard/elasticsearch/WebLogs, kibana-int 默认用来保存 Kibana 相关对象,比如仪表板,的 Elasticsearch 索引名称。 panel_name 可用的面板模块数组。面板只有在仪表板中有定义时才会被加载,这个数组只是用在 "add panel" 界面里做下拉菜单。 面板 Kibana 仪表板由面板( panels )块组成。面板在行中可以起到很多作用,不过大多数是用来给一个或者多个请求的数据集结 果做可视化。剩下一些面板则用来展示数据集或者用来为使用者提供插入指令的地方。 面板可以很容易的通过 Kibana 网页界面配置。为了了解更高级的用法,比如模板化或者脚本化仪表板,这章开始介绍面板 属性。你可以发现一些通过网页界面看不到的设置。 每个面板类型都有自己的属性,不过有这么几个是大家共有的。 span 一个从 1-12 的数字,描述面板宽度。 editable 是否在面板上显示编辑按钮。 type 本对象包含的面板类型。每个具体的面板类型又要求添加新的属性,具体列表说明稍后详述。 译作者注 官方文档中只介绍了各面板的参数,而且针对的是要使用模板化,脚本化仪表板的高级用户,其中有些参数甚至在网页界面 上根本不可见。 为了方便初学者,我将在每个面板的参数介绍之后,自行添加界面操作和效果方面的说明。 histogram 状态:稳定 histogram 面板用以显示时间序列图。它包括好几种模式和变种,用以显示时间的计数,平均数,最大值,最小值,以及数 值字段的和,计数器字段的导数。 参数 轴(axis)参数 mode 用于 Y 轴的值。除了 count 以外,其他 mode 设置都要求定义 value_field 参数。可选值为:count, mean, max, min, total。我的 fork 中新增了一个可选值为 uniq。 time_field X 轴字段。必须是在 Elasticsearch 中定义为时间类型的字段。 value_field 如果 mode 设置为 mean, max, min 或者 total,Y 轴字段。必须是数值型。 x-axis 是否显示 X 轴。 y-axis 是否显示 Y 轴。 scale 以该因子规划 Y 轴 y_format Y 轴数值格式,可选:none, bytes, short 注释 注释对象 可以指定一个请求的结果作为标记显示在图上。比如说,标记某时刻部署代码了。 annotate.enable 是否显示注释(即标记) annotate.query 标记使用的 Lucene query_string 语法请求 annotate.size 最多显示多少标记 annotate.field 显示哪个字段 annotate.sort 数组排序,格式为 [field,order]。比如 [‘@timestamp’,‘desc’] ,这是一个内部参数。 auto_int 是否自动调整间隔 resolution 如果 auto_int 设为真,shoot for this many bars. interval 如果 auto_int 设为假,用这个值做间隔 intervals 在 View 选择器里可见的间隔数组。比如 [‘auto’,‘1s’,‘5m’,‘3h’],这是绘图参数。 lines 显示折线图 fill 折线图的区域填充因子,从 1 到 10。 linewidth 折线的宽度,单位为像素 points 在图上显示数据点 pointradius 数据点的大小,单位为像素 bars 显示条带图 stack 堆叠多个序列 spyable 显示审核图标 zoomlinks 显示 ‘Zoom Out’ 链接 options 显示快捷的 view 选项区域 legend 显示图例 show_query 如果没设别名(alias),是否显示请求 interactive 允许点击拖拽进行放大 legend_counts 在图例上显示计数 timezone 是否调整成浏览器时区。可选值为:browser, utc percentage 把 Y 轴数据显示成百分比样式。仅对多个请求时有效。 zerofill 提高折线图准确度,稍微消耗一点性能。 derivative 在 X 轴上显示该点数据在前一个点数据上变动的数值。 提示框(tooltip)对象 tooltip.value_type 控制 tooltip 在堆叠图上怎么显示,可选值:独立(individual)还是累计(cumulative) tooltip.query_as_alias 如果没设别名(alias),是否显示请求 网格(grid)对象 Y 轴的最大值和最小值 grid.min Y 轴的最小值 grid.max Y 轴的最大值 请求(queries) 请求对象 这个对象描述本面板使用的请求。 queries.mode 在可用请求中应该用哪些?可设选项有: all, pinned, unpinned, selected queries.ids 如果设为 selected 模式,具体被选的请求编号。 界面配置说明 添加面板的方式在之前的"行和面板"一节中已经有过讲解。在 "Add panel"对话框选择类型为 "histogram" 后,你会看到一系 列可配置的选项: 选项分为四类,可以在添加之后,通过点击面板右上角的配置"Configure"小图标弹出浮层继续修改。 通用(General)配置 主要用来修改面板的标题和宽度 面板(Panel)配置 设置面板向 Elasticsearch 发出何种请求,以及请求中需要使用的变量。 在 histogram 面板中,经常用的 Chart value (即参数部分描述的 mode ) 有: count 最常见场景就是统计请求数。这种时候只需要提供一个在 Elasticsearch 中是时间类型的字段(即参数部分描述的 time_field )即可。一般来说,都是 @timestamp ,所以不用修改了。这也是默认的 Logstash 仪表板的基础面板的 样式 mean 最常见场景就是统计平均时间。这时候配置浮层会变成下面这个样子: 这里就需要提供一个在 Elasticsearch 中是数值类型的字段(即参数部分描述的 value_field )作为计算平均值的数 据集来源了。以 nginx 访问日志为例,这里就填 "request_time"。 如果你在 Logstash 中使用的是 %{NUMBER:request_time} 的方法,也只能生成 String 结果),必须写成 ,那么实际类型还是字符串(请记住,正则捕获是 String 类 %{NUMBER:request_time:float} 强制转换才行。否则,你会看到如下报 错信息: total 最常见场景就是统计带宽。配置界面和 mean 是一样的。同样要求填写数值类型的字段名,比如 "bytes_sent"。 带宽在习惯上会换算成每秒数据,但是通过修改 interval 的方式来求每秒数据,对 elasticsearch 性能是一个很大 的负担,绘制出来的图形也太过密集影响美观。所以 Kibana 提供了另一种方式:保持 Kibana 会自动将每个数值除以间隔秒数得到每秒数据。( count interval ,勾选 也可以这样,用来计算 qps 等数据) seconds 。 另一个有用的功能,假如你的日志量实在太大,被迫采用抽样日志的方式,可以在 Kibana 上填写 分之一的抽样日志, Scale Scale 。比如百 框就写 100,带宽数据就会在展示的时候自动翻 100 倍显示出来。 uniq ES 从 1.1 版本开始通过 HyperLogLog++ 算法支持去重统计聚合。在用 Aggregation API 重写了 histogram panel 后,也可以支持了。 常用场景比如:UV 统计。效果如下: 风格(Style)配置 设置获取的数据如何展现。其中小部分(即条带(Bars)、折线(Lines)、散点(Points))可以直接在面板左上角的 "View" 下拉 菜单里直接勾选。 对于带宽数据,可以切换 Y Format 为 bytes。则 Y 轴数据可以自动换算成 MB,GB 的形式,比较方便 此外,还可以在 Grid 区域定义 Y 轴的起始点和终点的具体值。这可以用来在 Y 轴上放大部分区域,观察细微变动;或 者忽略某些异常值。 如果面板关联了多个请求,可以勾选以堆叠( 堆叠的另一种形式是百分比。在勾选了 Stack Stack )方式展示(最常见的堆叠展示的监控数据就是 CPU 监控)。 的前提下勾选 Percent 。 效果如下。注意:百分比是 A / (A + B) 的值,而不是 A / B。 关联请求(Queries)配置 默认的 Queries 方式是 all 。可以使用 selected 方式,在右侧选择具体的请求框(可多选)。被选中的会出现边框加粗 放大效果。 多请求的默认效果如下。而堆叠和百分比效果,在之前已经谈过。可以对比上下两图的 Y 轴刻度: table 状态:稳定 表格面板里是一个可排序的分页文档。你可以定义需要排列哪些字段,并且还提供了一些交互功能,比如执行 terms 聚合查 询。 参数 size 每页显示多少条 pages 展示多少页 offset 当前页的页码 sort 定义表格排序次序的数组,示例如右:[‘@timestamp’,‘desc’] overflow css 的 overflow 属性。‘min-height’ (expand) 或 ‘auto’ (scroll) fields 表格显示的字段数组 highlight 高亮显示的字段数组 sortable 设为假关掉排序功能 header 设为假隐藏表格列名 paging 设为假隐藏表格翻页键 field_list 设为假隐藏字段列表。使用者依然可以展开它,不过默认会隐藏起来 all_fields 设为真显示映射表内的所有字段,而不是表格当前使用到的字段 trimFactor 裁剪因子(trim factor),是参考表格中的列数来决定裁剪字段长度。比如说,设置裁剪因子为 100,表格中有 5 列,那么 每列数据就会被裁剪为 20 个字符。完整的数据依然可以在展开这个事件后查看到。 localTime 设为真调整 timeField 的数据遵循浏览器的本地时区。 timeField 如果 localTime 设为真,该字段将会被调整为浏览器本地时区。 spyable 设为假,不显示审查(inspect)按钮。 请求(queries) 请求对象 这个对象描述本面板使用的请求。 queries.mode 在可用请求中应该用哪些?可设选项有: all, pinned, unpinned, selected queries.ids 如果设为 selected 模式,具体被选的请求编号。 界面配置说明 table 和 histogram 面板,是 kibana 默认的 logstash 仪表板里唯二使用的面板。可以说是最重要和常用的组件。 虽然重要,table 面板的可配置项却不多。主要是 panel 和 paging 两部分: panel panel 设置可以分成几类,其中比较重要和有用的是: 时间字段 Time Field 设置的作用,和 histogram 面板中类似,主要是帮助 Kibana 使用者自动转换 elasticsearch 中的 UTC 时间成本 地时间。 裁剪因子 和 Splunk 不同,Kibana 在显示事件字段的时候,侧重于单行显示。详情内容通过点击具体某行向下展开的方式参看。每个 字段在屏幕中的可用宽度,就会通过裁剪因子来计算。计算方式见官方参数说明部分。 字段列表 table 面板左侧,是字段列表多选区域。字段分为 _all 和 current 两种。_all 是 Kibana 通过 elasticsearch 的 直接获取的索引内所有存在过的字段;current 则仅显示 table 匹配范围内的数据用到的字段。 勾选字段列表中某个字段,该字段就加入 table 面板右侧的表格中成为一列。 字段列表中,可以点击具体字段,查看 table 匹配范围内该字段数据的统计和排行数据的小面板。 _mapping API 小面板上虽然只显示一个很小范围内(即size pages,默认是 500)的数据统计,但是点击小面板底部的 *TERMS 下拉菜单选 项,生成的 term panel 浮层数据却都是基于整个搜索结果的。这部分的内容介绍。请阅读 term panel 章节。 排序 设置中可以设置一个默认的排序字段。在 logstash 仪表板默认的 event table 中,设置的是时间字段 @timestamp 。不过这个 设置,指的是面板加载的时候,使用该字段排序,实际你可以在表头任意字段名上单击,以该字段的值来临时排序。排序字 段会在表头本列字段名后,出现一个小三角图标,三角箭头朝上代表升序,反之降序: 高亮 elasticsearch 作为一种搜索引擎,很贴心的提供了高亮功能。Kibana 中也同样支持解析 ES 返回的 HTML 高亮文本。只需 要在 panel 标签页右侧添加 Highlighted field ,在搜索框里填入的关键词,如果出现在被指定为 Highlighted field 的字段 里,这个词在 table 里就会高亮显示(前提是该字段已经在字段列表中勾选)。 小贴士:高亮仅在 table 状态有效,点击展开后的事件详情中是不会高亮的。 paging 考虑到同时展示太多内容,一来对 elasticsearch 压力较大,二来影响页面展示效果和渲染性能。 map 状态:稳定 map 面板把 2 个字母的国家或地区代码转成地图上的阴影区域。目前可用的地图包括世界地图,美国地图和欧洲地图。 参数 map 显示哪个地图:world, usa, europe colors 用来涂抹地图阴影的颜色数组。一旦设定好这 2 个颜色,阴影就会使用介于这 2 者之间的颜色。示例 [‘#A0E2E2’, ‘#265656’] size 阴影区域的最大数量 exclude 排除的区域数组。示例 [‘US’,‘BR’,‘IN’] spyable 设为假,不显示审查(inspect)按钮。 请求(queries) 请求对象 这个对象描述本面板使用的请求。 queries.mode 在可用请求中应该用哪些?可设选项有: all, pinned, unpinned, selected queries.ids 如果设为 selected 模式,具体被选的请求编号。 界面配置说明 考虑到都是中国读者,本节准备采用中国地图进行讲解,中国地图代码,,基于本人 https://github.com/chenryn/kibana.git 仓库,除标准的 map 面板参数外,还提供了 terms_stats 功能,也会一并讲述。 map 面板,最重要的配置即输入字段,对于不同的地图,应该配置不同的 Field : 对于世界地图,其所支持的格式为由 2 个字母构成的国家名称缩写,比如: US world LogStash::Filters::GeoIP , CN , JP 等。如果你使用了 插件,那么默认生成的 geoip.country_code2 字段正好符合条件。 cn 对于中国地图,其所支持的格式则是由 2 个数字构成的省份编码,比如: 如果你使用了 LogStash::Filters::GeoIP 01 (即安徽), 30 (即广东), 04 (即江苏)等。 插件,那么默认生成的 geoip.region_name 字段正好符合条件。 如果你使用了我的仓库代码,或者自行合并了该功能,你的 map 面板配置界面会稍有变动成下面样子 如果选择 terms_stats 模式,就会和 histogram 面板一样出现需要填写 value_field 的位置。同样必须使用在 Elasticsearch 中是数值类型的字段,然后显示的地图上,就不再是个数而是具体的均值,最大值等数据了。 bettermap 状态:实验性 Bettermap 之所以叫 bettermap 是因为还没有更好(better)的名字。Bettermap 使用地理坐标来在地图上创建标记集群,然后 根据集群的密度,用橘色,黄色和绿色作为区分。 要查看细节,点击标记集群。地图会放大,原有集群分裂成更小的集群。一直小到没法成为集群的时候,单个标记就会显现 出来。悬停在标记上可以查看 tooltip 设置的值。 注意: bettermap 需要从互联网上下载它的地图面板文件。 参数 field 包含了地理坐标的字段,要求是 geojson 格式。GeoJSON 是一个数组,内容为 [longitude,latitude] 。这可能跟大多 数实现([latitude, longitude])是反过来的。 size 用来绘制地图的数据集大小。默认是 1000。注意:table panel 默认是展示最近 500 条,跟这里的大小不一致,可能引 起误解。 spyable 设为假,不显示审查(inspect)按钮。 tooltip 悬停在标记上时显示哪个字段。 provider 选择哪家地图提供商。 请求(queries) 请求对象 这个对象描述本面板使用的请求。 queries.mode 在可用请求中应该用哪些?可设选项有: all, pinned, unpinned, selected queries.ids 如果设为 selected 模式,具体被选的请求编号。 界面配置说明 bettermap 面板是为了解决 map 面板地图种类太少且不方便大批量添加各国地图文件的问题开发的。它采用了 leaflet 库,其 L.tileLayer 加载的 OpenStreetMap 地图文件都是在使用的时候单独请求下载,所以在初次使用的时候会需要一点时间才能 正确显示。 在 bettermap 的配置界面,我提供了 provider ,可以选择各种地图提供商。比如中文用户可以选择 GaoDe(高德地图): 其他 leaflet 库有丰富的插件资源。比如 热力图 小贴士:其实 Kibana 官方效果的标记集群也是插件实现的,叫markercluster terms 状态:稳定 基于 Elasticsearch 的 terms facet 接口数据展现表格,条带图,或者饼图。 参数 field 用于计算 facet 的字段名称。 script 用于提交 facet 的 scriptField 脚本字符串。系我的 fork 中新增的功能,仅在 fmode 为 script 时生效。 exclude 要从结果数据中排除掉的 terms missing 设为假,就可以不显示数据集内有多少结果没有你指定的字段。 other 设为假,就可以不显示聚合结果在你的 size 属性设定范围以外的总计数值。 size 显示多少个 terms order terms 模式可以设置:count, term, reverse_count 或者 reverse_term;terms_stats 模式可以设置:term, reverse_term, count, reverse_count, total, reverse_total, min, reverse_min, max, reverse_max, mean 或者 reverse_mean donut 在饼图(pie)模式,在饼中画个圈,变成甜甜圈样式。 tilt 在饼图(pie)模式,倾斜饼变成椭圆形。 lables 在饼图(pie)模式,在饼图分片上绘制标签。 arrangement 在条带(bar)或者饼图(pie)模式,图例的摆放方向。可以设置:水平(horizontal)或者垂直(vertical)。 chart 可以设置:table, bar 或者 pie counter_pos 图例相对于图的位置,可以设置:上(above),下(below),或者不显示(none)。 spyable 设为假,不显示审查(inspect)按钮。 请求(queries) 请求对象 这个对象描述本面板使用的请求。 queries.mode 在可用请求中应该用哪些?可设选项有: all, pinned, unpinned, selected queries.ids 如果设为 selected 模式,具体被选的请求编号。 tmode Facet 模式:terms 或者 terms_stats。 fmode Field 模式:normal 或者 script。我的 fork 中新增参数,normal 行为和原版一致,选择 script 时,scriptField 参数生 效。 tstat Terms_stats facet stats 字段。 valuefield Terms_stats facet value 字段。 界面配置说明 terms 面板是针对单项数据做聚合统计的面板。可配置项比较简单: 主要分为两部分,数据模式和显示风格。 数据模式 terms 面板能够使用两种数据模式(也是 Kibana 大多数面板所使用的): terms terms 即普通的分类计数(类比为 group by 语法)。填写具体字段名即可。此外,排序( order by )和结果数( limit )也可以定 义,具体选项介绍见本页前半部分。 terms_stats terms_stats 在 terms 的基础上,获取另一个数值类型字段的统计值作为显示内容。可选的统计值有:count, total_count, min, max, total, mean。最常用的就是 mean。 显示风格 terms 面板可以使用多个风格来显示数据。 bar pie 这时候可能就会觉得这个 "other value" 太大了,又不关心它。那么可以在配置里去掉 other 的勾选。图形会变成这样: 如果勾选 "donut",则可以看到圈圈饼效果: table 如果你是个对数字敏感的人,或者主要数据差距不大,通过 bar 或者 pie 方式不是很明显,那么看表格最好了: 注意这个表格只有单列数据,使用配置里定义的排序,不像 table 面板。 如果你需要同时看多种统计数据,则应该使用 stats 面板。 script field 在 fmode 选择 script 的时候,可以填写 script 脚本字符串获取脚本化字段结果做聚合。 在 scriptField 输入框中输入 doc['path.raw'].value 的时候,效果完全等价于直接在 Field 输入框中输入 path.raw 因为 script 和 analyzer 的次序关系,务必使用带有 "not_analyzed" 属性的字段。否则一条数据中只会有一个分词结果参与 后续聚合运算。 支持的 script 语法,请参阅 ES 官方文档:http://www.elasticsearch.org/guide/en/elasticsearch/reference/3.0/modulesscripting.html#_document_fields 需要注意的是,出于安全考虑,ES 1.4 以下 大多建议关闭动态脚本运行的支持;在 1.4 新增了沙箱运行并设置为默认。所 以,建议在 ES 1.4 的前提下使用该特性。 column 状态:稳定 这是一个伪面板。目的是让你在一列中添加多个其他面板。虽然 column 面板状态是稳定,它的限制还是很多的,比如不能 拖拽内部的小面板。未来的版本里,column 面板可能被删除。 参数 panel 面板对象构成的数组 界面配置说明 column 面板是为了在高度较大的 row 中放入多个小 panel 准备的一个容器。其本身配置界面和 row 类似只有一个 panel 列 表: 在 column 中的具体的面板本身的设定,需要点击面板自带的配置按钮来配置: stats 状态: Beta 基于 Elasticsearch 的 statistical Facet 接口实现的统计聚合展示面板。 参数 format 返回值的格式。默认是 number,可选值还有:money,bytes,float。 style 主数字的显示大小,默认为 24pt。 mode 用来做主数字显示的聚合值,默认是 count,可选值为:count(计数),min(最小值),max(最大值),mean(平均值), total(总数),variance(方差),std_deviation(标准差),sum_of_squares(平方和)。 show 统计表格中具体展示的哪些列。默认为全部展示,可选列名即 mode 中的可选值。 spyable 设为假,不显示审查(inspect)按钮。 请求 请求对象 这个对象描述本面板使用的请求。 queries.mode 在可用请求中应该用哪些?可设选项有: all, pinned, unpinned, selected queries.ids 如果设为 selected 模式,具体被选的请求编号。 query query 面板和 filter 面板都是特殊类型的面板,在 dashboard 上有且仅有一个。不能删除不能添加。 query 和 filter 的普通样式和基本操作,在官方的请求和过滤章节已经讲述过。这里,额外讲一下一些高阶功能。 请求类型 query 搜索框支持三种请求类型: lucene 这也是默认的类型,使用要点就是请求语法。语法说明 见:http://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#query-string-syntax regex topN topN 是一个方便大家进行多项对比搜索的功能。其配置界面如下: 注意 topN 后颜色选择器的小圆点变成了齿轮状! 其运行实质,是先根据你填写的 field 和 size,发起一次 termsFacet 查询,获取 topN 的 term 结果;然后拿着这个列表,逐 一发起附加了 term 条件的其他请求(比如绑定在 histogram 面板就是 求),也就获得了 topN 结果。 date_histogram 请求,stats 面板就是 termStats 请 小贴士:如果 ES 响应较慢的时候,你甚至可以很明显的看到 histogram 面板上的多条曲线是一条一条出来数据绘制的。 trends 状态: Beta 以证券报价器风格展示请求随着时间移动的情况。比如说:当前时间是 1:10pm,你的时间选择器设置的是 "Last 10m",而 本面板的 "Time Ago" 参数设置的是 "1h",那么面板会显示的是请求结果从 12:00-12:10pm 以来变化了多少。 参数 ago 描述需要对比请求的时期的时间数值型字符串。 arrangement ‘horizontal’ 或 ‘vertical’ spyable 设为假,不显示审查(inspect)按钮。 请求(queries) 请求对象 这个对象描述本面板使用的请求。 queries.mode 在可用请求中应该用哪些?可设选项有: all, pinned, unpinned, selected queries.ids 如果设为 selected 模式,具体被选的请求编号。 界面配置说明 trends 面板用来对比实时数据与过去某天的同期数据的量的变化。配置很简单,就是设置具体某天前: 效果如下: 文本(text) 状态:稳定 文本面板用来显示静态文本内容,支持 markdown,简单的 html 和纯文本格式。 参数 mode ‘html’, ‘markdown’ 或者 ‘text’ content 面板内容,用 mode 参数指定的标记语言书写 sparklines 状态: 试验性 sparklines 面板显示微型时间图。目的不是显示一个确切的数值,而是以紧凑的方式显示时间序列的形态。 参数 mode 用作 Y 轴的数值模式。除 count 以外,都需要定义 value_field 字段。可选值有:count, mean, max, min, total. time_field X 轴字段。必须是 Elasticsearch 中的时间类型字段。 value_field 如果 mode 设置为 mean, max, min 或者 total,Y 轴字段。必须是数值类型字段。 interval 如果有现成的时间过滤器,Sparkline 会自动计算间隔。如果没有,就用这个间隔。默认是 5 分钟。 spyable 显示 inspect 图标。 请求(queries) 请求对象 这个对象描述本面板使用的请求。 queries.mode 在可用请求中应该用哪些?可设选项有: queries.ids 如果设为 selected all, pinned, unpinned, selected 模式,具体被选的请求编号。 界面配置说明 sparklines 面板其实就是 histogram 面板的缩略图模式。在配置上,只能选择 Chart value 模式,填写 Time Field 或者 Value Field 字段。上文描述中的 interval 在配置页面上是看不到的。 我们可以对比一下对同一个 topN 请求绘制的 sparklines 和 histogram 面板的效果: sparklines histogram 注:topN 请求的配置和说明,见 query 面板 hits 状态: 稳定 hits 面板显示仪表板上每个请求的 hits 数,具体的显示格式可以通过 "chart" 属性配置指定。 参数 arrangement 在条带(bar)或者饼图(pie)模式,图例的摆放方向。可以设置:水平(horizontal)或者垂直(vertical)。 chart 可以设置:none, bar 或者 pie counter_pos 图例相对于图的位置,可以设置:上(above),下(below) donut 在饼图(pie)模式,在饼中画个圈,变成甜甜圈样式。 tilt 在饼图(pie)模式,倾斜饼变成椭圆形。 lables 在饼图(pie)模式,在饼图分片上绘制标签。 spyable 设为假,不显示审查(inspect)图标。 请求(queries) 请求对象 这个对象描述本面板使用的请求。 queries.mode 在可用请求中应该用哪些?可设选项有: all, pinned, unpinned, selected queries.ids 如果设为 selected 模式,具体被选的请求编号。 goal 状态: 稳定 goal 面板在一个饼图上显示到达指定目标的进度。 参数 donut 在饼图(pie)模式,在饼中画个圈,变成甜甜圈样式。 tilt 在饼图(pie)模式,倾斜饼变成椭圆形。 legend 图例的位置,上、下或者无。 lables 在饼图(pie)模式,在饼图分片上绘制标签。 spyable 设为假,不显示审查(inspect)图标。 请求(queries) 请求对象 query.goal goal 模式的指定目标 percentile 状态: Beta 基于 Elasticsearch 的 percentile Aggregation 接口实现的统计聚合展示面板。 参数 format 返回值的格式。默认是 number,可选值还有:money,bytes,float。 style 主数字的显示大小,默认为 24pt。 modes 用来做百分比的聚合值。包括25%, 50%, 75%, 90%, 95%, 99%。 show 统计表格中具体展示的哪些列。默认为全部展示,可选列名即 modes 中的可选值。 spyable 设为假,不显示审查(inspect)按钮。 请求 请求对象 这个对象描述本面板使用的请求。 queries.mode 在可用请求中应该用哪些?可设选项有: all, pinned, unpinned, selected queries.ids 如果设为 selected 模式,具体被选的请求编号。 界面配置说明 percentile 面板界面与 stats 面板界面类似。 代码实现要点 1. percentile Aggregation 是 Elasticsearch 从 1.1.0 开始新加入的实验性功能,而且在 1.3.0 之后其返回的数据结构发生了 变动。所以代码中对 ESversion 要做判断和兼容性处理。 2. percentile Aggregation 返回的数据中,强制保留了百分数的小数点后一位,这导致在 js 处理中会把小数点当做是属性调 用的操作符。所以需要在前端展示的 "." 替换成后端使用的 "_"。 3. percentile Aggregation 请求中,不支持使用中文做 aggregation name。如果 所以这里直接采用序号了。 query.alias 写了中文的,就会出问题。 range 基于 Elasticsearch 的 range facet 接口数据展现表格,条带图,或者饼图。 参数 field 用于计算 facet 的字段名称。 values 用于计算 facet 的数值范围数组。数组每个元素包括: from range 范围的起始点 to range 范围的结束点 exclude 要从结果数据中排除掉的 terms missing 设为假,就可以不显示数据集内有多少结果没有你指定的字段。 other 设为假,就可以不显示聚合结果在你的 size 属性设定范围以外的总计数值。 size 显示多少个 terms order terms 模式可以设置:count, term, reverse_count 或者 reverse_term;terms_stats 模式可以设置:term, reverse_term, count, reverse_count, total, reverse_total, min, reverse_min, max, reverse_max, mean 或者 reverse_mean donut 在饼图(pie)模式,在饼中画个圈,变成甜甜圈样式。 tilt 在饼图(pie)模式,倾斜饼变成椭圆形。 lables 在饼图(pie)模式,在饼图分片上绘制标签。 arrangement 在条带(bar)或者饼图(pie)模式,图例的摆放方向。可以设置:水平(horizontal)或者垂直(vertical)。 chart 可以设置:table, bar 或者 pie counter_pos 图例相对于图的位置,可以设置:上(above),下(below),或者不显示(none)。 spyable 设为假,不显示审查(inspect)按钮。 请求(queries) 请求对象 这个对象描述本面板使用的请求。 queries.mode 在可用请求中应该用哪些?可设选项有: all, pinned, unpinned, selected queries.ids 如果设为 selected 模式,具体被选的请求编号。 界面配置说明 range 面板是针对单项数据做聚合统计的面板。效果与 terms 面板类似。其配置界面如下: 认证鉴权 配置Kibana的CAS验证 感谢携程网的[@childe]童鞋贡献本节内容 我们公司用的是 CAS 单点登陆, 用如下工具将kibana集成到此单点登陆系统 准备工具 nginx: 仅仅是为了记录日志, 不用也行 nodejs: 为了跑 kibana-authentication-proxy kibana: https://github.com/elasticsearch/kibana kibana-authentication-proxy: https://github.com/fangli/kibana-authentication-proxy 配置 1. nginx 配置 8080 端口, 反向代理到 es 的 9200 2. git clone kibana-authentication-proxy 3. git clone kibana 4. 将 kibana 软链接到 kibana-authentication-proxy 目录下 5. 配置 kibana-authentication-proxy/config.js 可能有如下参数需要调整: es_host #这里是nginx地址 es_port #nginx的8080 listen_port #node的监听端口, 80 listen_host #node的绑定IP, 可以0.0.0.0 cas_server_url #CAS地址 6. 安装 kibana-authentication-proxy 的依赖, 7. 运行 npm install express ,等 node kibana-authentication-proxy/app.js 原理 app.js 里面 app.get('/config.js', kibana3configjs) 里面,调用 ES 数据的 URL 前面加了一个 __es ; 返回了一个新的 config.js, 不是用的 kibana/config.js, 在这个配置 的前缀 在 app.js 入口这里, 有两个关键的中间层(我也不知道叫什么)被注册: 一个是 一个请求来的时候, 会到 configureESProxy configureCas configureCas , 一个是 configureESProxy 判断是不是已经登陆到 CAS, 没有的话就转到 cas 登陆页面 在 lib/es-proxy.js 里, 会把 __es 打头的请求(其实就是请求 es 数据的请求)转发到真正的 es 接口那里 (我们这里是 nginx) 请求路径 node(80) <=> nginx(8080) <=> es(9200) kibana-authentication-proxy 本身没有记录日志的代码, 而且转发 es 请求用的流式的(看起来), 并不能记录详细的 request body. 所以我们就用 nginx 又代理一层做日志了.. Auth WebUI in Mojolicious 社区已经有用 nodejs 或者 rubyonrails 写的 kibana-auth 方案了。不过我这两种语言都不太擅长,只会写一点点 Perl5 代 码,所以我选择用 Mojolicious web 开发框架来实现我自己的 kibana 认证鉴权。 整套方案的代码以 可。事实上, kbnauth 子目录形式存在于我的 kibana 仓库中,如果你不想用这套认证方案,照旧使用 目录下的静态文件我都是通过软连接方式指到 kbnauth/public/ src/ src 子目录即 下的。 特性 全局透明代理 和 nodejs 实现的那套方案不同,我这里并没有使用 __es/ 个方案来控制。除了使用 elasticsearch config.js.ep 模版来定制 这样附加的路径。所有发往 Elasticsearch 的请求都是通过这 地址设置以外,方案还会伪造 /_nodes 请求的响应 体,伪造的响应体中永远只有运行着认证方案的这台服务器的 IP 地址。 这么做的原因是我的 kibana 升级了 elasticjs 版本,新版本默认会通过这个 API 获取 nodes 列表,然后浏览器直接轮询 多个 IP 获取响应。 注意:Mojolicious 有一个环境变量叫 据。我在 script/kbnauth max_message_size ,默认是 10MB,即只允许代理响应大小在 10MB 以内的数 启动脚本中把它修改成了 0,即不限制。如果你有这方面的需求,可以修改成任意你想要的阈 值。 使用 kibana-auth elasticsearch 索引做鉴权 因为所有的请求都会发往代理服务器(即运行着认证鉴权方案的服务器),每个用户都可以有自己的仪表板空间(没错,这 招是从 kibana-proxy 项目学来的,每个用户使用单独的 还提供另一个高级功能:还可以通过另一个新的索引 kibana-int-$username kibana-auth 索引保存自己的仪表板设置)。而本方案 来指定每个用户所能访问的 Elasticsearch 集群地址 和索引列表。 给用户 "sri" 添加鉴权信息的命令如下: $ curl -XPOST http://127.0.0.1:9200/kibana-auth/indices/sri -d '{ "prefix":["logstash-sri","logstash-ops"], "server":"192.168.0.2:9200" }' 这就意味着用户 "sri" 能访问的,是存在 "192.168.0.2:9200" 上的 "logstash-sri-YYYY.MM.dd" 或者 "logstash-opsYYYY.MM.dd" 索引。 小贴士:所以你在 请求 kibana-auth kbn_auth.conf 里配置的 eshost/esport,其实并不意味着 kibana 数据的来源,而是认证方案用来 信息的地址! 使用 Authen::Simple 框架做认证 Authen::Simple 是一个很棒的认证框架,支持非常多的认证方法。比如:LDAP, DBI, SSH, Kerberos, PAM, SMB, NIS, PAM, ActiveDirectory 等。 默认使用的是 Passwd 方法。也就是用 htpasswd 命令行在本地生成一个 如果要使用其他方法,比如用 LDAP 认证,只需要配置 authen => { LDAP => { host => 'ad.company.com', binddn => 'proxyuser@company.com', bindpw => 'secret', kbn_auth.conf .htpasswd 文件存用户名密码。 文件就行了: basedn => 'cn=users,dc=company,dc=com', filter => '(&(objectClass=organizationalPerson)(objectClass=user)(sAMAccountName=%s))' }, } 可以同时使用多种认证方式,但请确保每种都是有效可用的。某一个认证服务器连接超时也会影响到其他认证方式超 时。 安装 该方案代码只有两个依赖:Mojolicious 框架和 Authen::Simple 框架。我们可以通过 cpanm 部署: curl http://xrl.us/cpanm -o /usr/local/bin/cpanm chmod +x /usr/local/bin/cpanm cpanm Mojolicious Authen::Simple::Passwd 如果你需要使用其他认证方法,每个方法都需要另外单独安装。比如使用 LDAP 部署,就再运行一行: Authen::Simple::LDAP 小贴士:如果你是在一个新 RHEL 系统上初次运行代码,你可能会发现有报错说找不到 Perl 核心模块,但是 RedHat 公司把所有的 Perl 核心模块单独打包成了 -y perl-core cpanm 就可以了。 perl-core.rpm Digest::SHA 模块。这个模块其实是 ,所以你得先运行一下 yum install 才行。我讨厌 RedHat! 运行 cd kbnauth # 开发环境监听 3000 端口,使用单进程的 morbo 服务器调试 morbo script/kbnauth # 生产环境监听 80 端口,使用高性能的 hypnotoad 服务器, 具体端口在 kbn_auth.conf 中定义 hypnotoad script/kbnauth 现在,打开浏览器,就可以通过默认的用户名/密码:"sri/secr3t" 登录进去了。(sri 是 Mojolicious 框架的作者,感谢他为 Perl5 社区提供这么高效的 web 开发框架) 注意:这时候你虽然认证通过进去了 kibana 页面,但是还没有赋权。按照上面提到的 成。 kibana-auth 命令操作,才算全部完 源码剖析与二次开发 Kibana 3 作为 ELKstack 风靡世界的最大推动力,其与优美的界面配套的简洁的代码同样功不可没。事实上,graphite 社区 就通过移植 kibana 3 代码框架的方式,启动了 grafana 项目。至今你还能在 grafana 源码找到二十多处 "kbn" 字样。 巧合的是,在 Kibana 重构 v4 版的同时,grafana 的 v2 版也到了 Alpha 阶段,从目前的预览效果看,主体 dashboard 沿用 了 Kibana 3 的风格,不过添加了额外的菜单栏,供用户权限设置等使用 —— 这意味着 grafana 2 跟 kibana 4 一样需要一个 单独的 server 端。 笔者并非专业的前端工程师,对 angularjs 也处于一本入门指南都没看过的水准。所以本节内容,只会抽取一些个人经验中 会有涉及到的地方提出一些"私货"。欢迎方家指正。 源码目录结构 下面是 kibana 源码的全部文件的 tree 图: . ├── │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ app ├── ├── │ │ │ │ │ ├── │ │ │ │ │ ├── │ │ │ │ │ │ │ │ ├── │ │ │ │ │ │ │ │ │ │ │ │ │ ├── │ ├── │ ├── │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ app.js components ├── extend-jquery.js ├── kbn.js ├── lodash.extended.js ├── require.config.js └── settings.js controllers ├── all.js ├── dash.js ├── dashLoader.js ├── pulldown.js └── row.js dashboards ├── blank.json ├── default.json ├── guided.json ├── logstash.js ├── logstash.json ├── noted.json ├── panel.js └── test.json directives ├── addPanel.js ├── all.js ├── arrayJoin.js ├── configModal.js ├── confirmClick.js ├── dashUpload.js ├── esVersion.js ├── kibanaPanel.js ├── kibanaSimplePanel.js ├── ngBlur.js ├── ngModelOnBlur.js ├── resizable.js └── tip.js factories └── store.js filters └── all.js panels ├── bettermap │ ├── editor.html │ ├── leaflet │ │ ├── images │ │ │ ├── layers-2x.png │ │ │ ├── layers.png │ │ │ ├── marker-icon-2x.png │ │ │ ├── marker-icon.png │ │ │ └── marker-shadow.png │ │ ├── leaflet-src.js │ │ ├── leaflet.css │ │ ├── leaflet.ie.css │ │ ├── leaflet.js │ │ ├── plugins.css │ │ ├── plugins.js │ │ └── providers.js │ ├── module.css │ ├── module.html │ └── module.js ├── column │ ├── editor.html │ ├── module.html │ ├── module.js │ └── panelgeneral.html ├── dashcontrol │ ├── editor.html │ ├── module.html │ └── module.js ├── derivequeries │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── │ │ │ │ ├── │ │ │ │ ├── │ │ │ ├── │ │ │ ├── │ │ │ │ │ │ │ ├── │ │ │ ├── │ │ │ │ │ │ │ │ │ ├── │ │ │ │ │ │ │ │ ├── │ │ │ ├── │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── │ │ │ ├── │ │ │ │ │ ├── ├── editor.html ├── module.html └── module.js fields ├── editor.html ├── micropanel.html ├── module.html └── module.js filtering ├── editor.html ├── meta.html ├── module.html └── module.js force ├── editor.html ├── module.html └── module.js goal ├── editor.html ├── module.html └── module.js histogram ├── editor.html ├── interval.js ├── module.html ├── module.js ├── queriesEditor.html ├── styleEditor.html └── timeSeries.js hits ├── editor.html ├── module.html └── module.js map ├── editor.html ├── lib │ ├── jquery.jvectormap.min.js │ ├── map.cn.js │ ├── map.europe.js │ ├── map.usa.js │ └── map.world.js ├── module.html └── module.js multifieldhistogram ├── editor.html ├── interval.js ├── markersEditor.html ├── meta.html ├── module.html ├── module.js ├── styleEditor.html └── timeSeries.js percentiles ├── editor.html ├── module.html └── module.js query ├── editor.html ├── editors │ ├── lucene.html │ ├── regex.html │ └── topN.html ├── help │ ├── lucene.html │ ├── regex.html │ └── topN.html ├── helpModal.html ├── meta.html ├── module.html ├── module.js └── query.css ranges ├── editor.html ├── module.html └── module.js sparklines ├── editor.html ├── interval.js ├── module.html ├── module.js └── timeSeries.js statisticstrend │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ├── │ │ │ │ │ │ │ │ │ │ ├── ├── │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── │ │ │ │ │ │ │ │ │ │ │ │ │ └── │ │ │ ├── │ │ │ ├── │ │ │ │ │ │ │ ├── │ │ │ ├── │ │ │ │ │ ├── │ │ │ │ │ ├── │ │ │ └── ├── editor.html ├── module.html └── module.js stats ├── editor.html ├── module.html └── module.js table ├── editor.html ├── export.html ├── micropanel.html ├── modal.html ├── module.html ├── module.js └── pagination.html terms ├── editor.html ├── module.html └── module.js text ├── editor.html ├── lib │ └── showdown.js ├── module.html └── module.js timepicker ├── custom.html ├── editor.html ├── module.html ├── module.js └── refreshctrl.html trends ├── editor.html ├── module.html └── module.js valuehistogram ├── editor.html ├── module.html ├── module.js ├── queriesEditor.html └── styleEditor.html partials ├── connectionFailed.html ├── dashLoader.html ├── dashLoaderShare.html ├── dashboard.html ├── dasheditor.html ├── inspector.html ├── load.html ├── modal.html ├── paneladd.html ├── paneleditor.html ├── panelgeneral.html ├── querySelect.html └── roweditor.html services ├── alertSrv.js ├── all.js ├── dashboard.js ├── esVersion.js ├── fields.js ├── filterSrv.js ├── kbnIndex.js ├── monitor.js ├── panelMove.js ├── querySrv.js └── timer.js config.js css ├── angular-multi-select.css ├── animate.min.css ├── bootstrap-responsive.min.css ├── bootstrap.dark.min.css ├── bootstrap.light.min.css ├── font-awesome.min.css ├── jquery-ui.css ├── jquery.multiselect.css ├── normalize.min.css └── timepicker.css favicon.ico font ├── FontAwesome.otf │ │ │ │ ├── │ │ │ │ │ │ │ │ │ │ ├── └── ├── fontawesome-webfont.eot ├── fontawesome-webfont.svg ├── fontawesome-webfont.ttf └── fontawesome-webfont.woff img ├── annotation-icon.png ├── cubes.png ├── glyphicons-halflings-white.png ├── glyphicons-halflings.png ├── kibana.png ├── light.png ├── load.gif ├── load_big.gif ├── small.png └── ui-icons_222222_256x240.png index.html vendor ├── LICENSE.json ├── angular │ ├── angular-animate.js │ ├── angular-cookies.js │ ├── angular-dragdrop.js │ ├── angular-loader.js │ ├── angular-resource.js │ ├── angular-route.js │ ├── angular-sanitize.js │ ├── angular-scenario.js │ ├── angular-strap.js │ ├── angular.js │ ├── bindonce.js │ ├── datepicker.js │ └── timepicker.js ├── blob.js ├── bootstrap │ ├── bootstrap.js │ └── less │ ├── accordion.less │ ├── alerts.less │ ├── bak │ │ ├── bootswatch.dark.less │ │ └── variables.dark.less │ ├── bootstrap.dark.less │ ├── bootstrap.less │ ├── bootstrap.light.less │ ├── bootswatch.dark.less │ ├── bootswatch.light.less │ ├── breadcrumbs.less │ ├── button-groups.less │ ├── buttons.less │ ├── carousel.less │ ├── close.less │ ├── code.less │ ├── component-animations.less │ ├── dropdowns.less │ ├── forms.less │ ├── grid.less │ ├── hero-unit.less │ ├── labels-badges.less │ ├── layouts.less │ ├── media.less │ ├── mixins.less │ ├── modals.less │ ├── navbar.less │ ├── navs.less │ ├── overrides.less │ ├── pager.less │ ├── pagination.less │ ├── popovers.less │ ├── progress-bars.less │ ├── reset.less │ ├── responsive-1200px-min.less │ ├── responsive-767px-max.less │ ├── responsive-768px-979px.less │ ├── responsive-navbar.less │ ├── responsive-utilities.less │ ├── responsive.less │ ├── scaffolding.less │ ├── sprites.less │ ├── tables.less │ ├── tests │ │ ├── buttons.html │ │ ├── css-tests.css │ │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ├── │ │ ├── ├── ├── │ │ │ │ │ │ │ │ │ │ │ │ │ ├── ├── ├── ├── ├── ├── │ │ │ │ │ ├── ├── └── │ ├── css-tests.html │ ├── forms-responsive.html │ ├── forms.html │ ├── navbar-fixed-top.html │ ├── navbar-static-top.html │ └── navbar.html ├── thumbnails.less ├── tooltip.less ├── type.less ├── utilities.less ├── variables.dark.less ├── variables.less ├── variables.light.less └── wells.less chromath.js elasticjs ├── elastic-angular-client.js └── elastic.js elasticsearch.angular.js filesaver.js jquery ├── jquery-1.8.0.js ├── jquery-ui-1.10.3.js ├── jquery.flot.byte.js ├── jquery.flot.events.js ├── jquery.flot.js ├── jquery.flot.pie.js ├── jquery.flot.selection.js ├── jquery.flot.stack.js ├── jquery.flot.stackpercent.js ├── jquery.flot.threshold.js ├── jquery.flot.time.js ├── jquery.multiselect.filter.js └── jquery.multiselect.js jsonpath.js lodash.js modernizr-2.6.1.js moment.js numeral.js require ├── css-build.js ├── css.js ├── require.js ├── text.js └── tmpl.js simple_statistics.js timezone.js underscore.string.js 一目了然,我们可以归纳出下面几类主要文件: 入口:index.html 模块库:vendor/ 程序入口:app/app.js 组件配置:app/components/ 仪表板控制:app/controllers/ 挂件页面:app/partials/ 服务:app/services/ 指令:app/directives/ 图表:app/panels/ 入口和模块依赖 这一部分是网页项目的基础。从 index.html 里就可以学到 angularjs 最基础的常用模板语法了。出现的指令有: ng-controller }} , ng-include , ng-view , ng-slow , ng-click , ng-href ,以及变量绑定的语法: ng-repeat , {{ dashboard.current.** 。 index.html 中,需要注意 js 的加载次序,先 require.js ,然后再 require.config.js 过 requrie 方式加载的。而具体的模块,和模块的依赖关系,则定义在 ,最后 require.config.js app 。整个 kibana 项目都是通 里。这些全部加载完成后,才是 启动 app 模块,也就是项目本身的代码。 require.config.js 中,主要分成两部分配置,一个是 paths ,一个是 shim 。paths 用来指定依赖模块的导出名称和模块 js 文 件的具体路径。而 shim 用来指定依赖模块之间的依赖关系。比方说:绘制图表的 js,kibana3 里用的是 jquery.flot 库。这个 就首先依赖于 jquery 库。(通俗的说,就是原先普通的 HTML 写法里,要先加载 jquery.js 再加载 jquery.flot.js) 在整个 paths 中,需要单独提一下的是 elasticjs:'../vendor/elasticjs/elastic-angular-client' angular.js 的文件。这里面实际是定义了一个 angular.module 的 factory,名叫 跟 Elasticsearch 交互的所有方法,都在这个 ejsResource ejsResource 。这是串联 elastic.js 和 。后续我们在 kibana 3 里用到的 里了。 factory 是 angular 的一个单例对象,创建之后会持续到你关闭浏览器。Kibana 3 就是通过这种方式来控制你所有的图表是从 同一个 Elasticsearch 获取的数据 app.js 中,定义了整个应用的 routes,加载了 controller, directives 和 filters 里的全部内容。就是在这里,加载了主页面 app/partials/dashboard.html 的 controller 上。 。当然,这个页面其实没啥看头,因为里面就是提供 pulldown 和 row 的 div,然后绑定到对应 controller 和 service controller 里没太多可讲的。kibana 3 里,pulldown 其实跟 row 差别不大,看这简单的几行代码里,最关键的就是几个注 入: define(['angular','app','lodash'], function (angular, app, _) { 'use strict'; angular.module('kibana.controllers').controller('RowCtrl', function($scope, $rootScope, $timeout,ejsResource, querySrv) { var _d = { title: "Row", height: "150px", collapse: false, collapsable: true, editable: true, panels: [], notice: false }; _.defaults($scope.row,_d); $scope.init = function() { $scope.querySrv = querySrv; $scope.reset_panel(); }; $scope.init(); } ); }); 这里面,注入了 特殊变量。 $scope ejsResource , ejsResource 和 querySrv 。 $scope 是一个 factory ,前面已经讲过。 是控制器作用域内的模型数据对象,这是 angular 提供的一个 querySrv 是一个 service,下面说一下。 service 跟 factory 的概念非常类似,一般来说,可能 factory 偏向用来共享一个类,而 service 用来共享一组函数功能。 kibana 3 里,比较有用和常用的 services 包括: dashboard dashboard.js 里提供了关于 Kibana 3 仪表板的读写操作。其中主要的几个是提供了三种读取仪表板布局纲要的方式,也就是 读取文件,读取存在 .kibana-int 索引里的数据,读取 js 脚本。下面是读取 js 脚本的相关函数: this.script_load = function(file) { return $http({ url: "app/dashboards/"+file.replace(/\.(?!js)/,"/"), method: "GET", transformResponse: function(response) { /*jshint -W054 */ var _f = new Function('ARGS','kbn','_','moment','window','document','angular','require','define','$','jQuery',response); return _f($routeParams,kbn,_,moment); } }).then(function(result) { if(!result) { return false; } self.dash_load(dash_defaults(result.data)); return true; },function() { alertSrv.set('Error', "Could not load scripts/"+file+". Please make sure it exists and returns a valid dashboard" , 'error'); return false; }); }; 可以看到,最关键的就是那个 new Function 。知道这步传了哪些函数进去,也就知道你的 js 脚本里都可以调用哪些内容了~ 最后调用的 方法也需要提一下。这个方法的最后,有几行这样的代码: dash_load self.availablePanels = _.difference(config.panel_names, _.pluck(_.union(self.current.nav,self.current.pulldowns),'type')); self.availablePanels = _.difference(self.availablePanels,config.hidden_panels); 从最外层的 里读取了 config.js panel_names 数组,然后取出了 nav 和 pulldown 用过的 panel,剩下就是我们能在 row 里 添加的 panel 类型了。 querySrv querySrv.js 里定义了跟 query 框相关的函数和属性。主要有几个值得注意的。 一个是 color 列表; 一个是 queryTypes ,尤其是里么的 topN ,可以看到 topN 方式其实就是先请求了一次 termsFacet,然后把结果 map 成一组普通的 query。 一个是 ids 和 idsByMode 。之后图表的绑定具体 query 的时候,就是通过这个函数来选择的。 filterSrv filterSrv.js 跟 querySrv 相似。特殊的是两个函数。 一个是 toEjsObjs 。根据不同的 filter 类型调用不同的 ejs 方法。 一个是 timeRange 。因为在 histogram panel 上拖拽,会生成好多个 range 过滤器,都是时间。这个方法会选择最后一 个类型为 time 的 filter,作为实际要用的 filter。这样保证请求 ES 的是最后一次拖拽选定的时间段。 fields fields.js 里最重要的作用就是通过 mapping 接口获取索引的字段列表,存在 编辑页里,都以 bs-typeahead="fields.list" fields.list 里。这个数组后来在每个 panel 的 的形式作为文本输入时的自动补全提示。在 table panel 里,则是左侧栏的显示 来源。 esVersion esVersion.js 里提供了对 ES 版本号的对比函数。之所以专门提供这么个 service,一来是因为不同版本的 ES 接口有变化, 比如我自己开发的 percentile panel 里,就用 esVersion 判断了两次版本。因为 percentile 接口是 1.0 版之后才有,而从 1.3 版以后返回数据的结构又发生了一次变动。二来 ES 的版本号格式比较复杂,又有点又有字母。 panel 相关指令 添加 panel 前面在讲 app/services/dashboard.js 同样是之前讲过的 的时候,已经说到能添加的 panel 列表是怎么获取的。那么panel 是怎么加上的呢? app/partials/dashaboard.html 里,加载了 partials/roweditor.html 页面。这里有一段:
Term | {{ panel.tmode == 'terms_stats' ? panel.tstat : 'Count' }} | Action |
---|---|
{{term.label}} | {{term.data[0][1]}} |