Kibana实操指南:从版本匹配到Dashboard监控大盘搭建
先说一个我个人很确定的事情只要你的公司用了ElasticsearchKibana基本就是默认搭配的那张脸。别人问你们日志系统长什么样你拉到工位旁边打开浏览器指给他看的东西十有八九就是Kibana。我前几年第一次接手这套东西的时候心里其实挺没底的Elasticsearch好歹能通过REST API直接操作Kibana这个界面一打开就是一堆英文菜单什么Discover、Visualize、Dashboard看起来像数据工具又像图表工具完全不知道从哪下手。后来用得多了才慢慢摸清楚套路。这篇是Kibana系列的第一篇我打算把从装好到能用好的全过程串一遍包括版本匹配、配置改动、索引模式、KQL查询、图表制作、Dashboard组装最后再来一批我实际踩过、也帮同事排查过的典型坑。无论你是运维、后端、测试还是产品想自己拉数据看一眼这套东西应该都能让你少走不少弯路。1. 先搞清楚Kibana到底是什么以及它解决了什么问题1.1 一次真实的线上排障经过有一回晚上线上告警接口超时率突然抬头。我第一反应是登服务器看日志但那套服务是容器化的日志散在几十个Pod里光kubectl logs就能把人看吐。后来直接打开Kibana在Discover里把索引切成当天的业务日志索引用KQL敲了一行查询level: ERROR and service: order-service and timestamp now-15m结果一瞬间就把最近15分钟所有错误日志拉出来了再按exception_type字段做个快速分析马上定位到是下游数据库连接池被打满。整个过程不到五分钟比一群人围着终端翻日志强太多了。这就是Kibana最核心的价值它把Elasticsearch里那些JSON文档变成了一个可以搜索、过滤、分析、可视化的交互界面。你不需要记一大堆REST API也不需要在服务器上敲命令打开浏览器就能干活。1.2 Kibana在整个Elastic Stack中的位置Kibana不是独立工作的它是Elastic Stack的展示和数据探索层。整个链条通常是这样的Elasticsearch负责存储和检索数据是所有数据的落地位置Logstash或Beats比如Filebeat、Metricbeat负责把日志、指标从服务器上采集并送入ElasticsearchKibana负责把Elasticsearch里的数据呈现出来提供搜索、图表、告警、管理等功能。打个生活化的比方Elasticsearch是仓库Beats是搬运工Logstash是分拣流水线Kibana就是仓库门口的接待室和展示厅。你不需要自己钻进仓库翻箱子直接在展示厅里输入条件让仓库自动把对应的货拿出来列在你面前。理解了这条链路你就能明白为什么排查Kibana问题的时候一半以上都在查Elasticsearch连接和数据本身。Kibana只是个皮数据在ES里皮坏了可以换数据没了才是真麻烦。1.3 核心功能模块全景Kibana的功能模块看起来多实际日常用下来主要就这几个Discover数据探索区用来搜索、过滤、查看原始文档是整个工具的入口Visualize Library图表制作区把查询结果变成柱状图、折线图、饼图、数据表等Dashboard仪表盘把多个图表放到一个页面里形成一块可监控、可分享的大屏Dev Tools开发者工具里面带一个Console可以直接写ES的REST请求做调试和复杂查询非常方便Management管理后台索引模式、保存对象、用户权限如果开了安全功能、告警规则都在这里配置。另外还有Maps、Canvas、ML等进阶模块但对于大多数人来说前面这四个就覆盖了百分之八九十的日常需求。我自己的习惯是查数据用Discover调接口用Dev Tools做汇报材料用Dashboard这三个用熟了Kibana就算真正入门了。2. 部署安装实战版本、配置与启动的完整过程2.1 版本匹配是第一个深坑如果你以前装过Jenkins、GitLab这类工具多半觉得安装就是下载、解压、启动三步。Kibana也差不多是这个节奏但它有一个比别的工具都严格的约束Kibana的版本必须和Elasticsearch的版本完全一致。这不是建议一致而是必须一致。ES是8.11.0Kibana就一定要是8.11.0。少一个次版本号都可能出现兼容问题。我一个同事图省事ES装了8.9Kibana随手下了个8.8结果Kibana启动日志里一直报版本不匹配页面怎么都进不去最后把Kibana升到同版本才解决。所以在下载之前第一件事是确认你ES的准确版本。执行curl http://localhost:9200或者直接访问http://es-host:9200返回的JSON里有个number字段那个就是版本号。拿到版本号之后再下载相同版本的Kibana安装包。下载地址直接在Elastic官网选择对应系统版本就好。Linux服务器一般用tar.gz或deb/rpm包本地开发机也可以用Docker镜像。比如tar包方式wget https://artifacts.elastic.co/downloads/kibana/kibana-8.11.0-linux-x86_64.tar.gz tar -zxvf kibana-8.11.0-linux-x86_64.tar.gz cd kibana-8.11.0-linux-x86_642.2 最主要的两份功夫kibana.yml 和启动方式解压之后Kibana的配置文件在config/kibana.yml。默认配置其实已经能启动但对实际环境来说至少要改这几个地方server.port: 5601 server.host: 0.0.0.0 elasticsearch.hosts: [http://localhost:9200] kibana.index: .kibana i18n.locale: zh-CN每一项的作用我拆开说一下server.portKibana的Web端口默认5601如果被占用可以改但改完访问地址也要跟着变server.host默认是localhost意味着只能本机访问。改成0.0.0.0才能让其他机器通过浏览器访问elasticsearch.hosts告诉Kibana去哪儿连Elasticsearch。如果ES在别的机器上这里就写那台机器的IP和端口kibana.indexKibana自身用来存配置、保存图表、保存搜索的索引名默认.kibana就够用不用动i18n.locale设成zh-CN之后界面大部分地方会变成中文对不熟悉英文的同学很友好。不过要注意这个选项在7.x是i18n.locale在更早的版本里写法可能不太一样。改完配置后直接后台启动bin/kibana 或者用systemd管理sudo systemctl start kibana启动日志在logs/kibana.log。看到类似server http running at http://0.0.0.0:5601的日志就说明起来了。然后浏览器访问http://服务器IP:5601。如果EPEL源里没有这些包也可以用官方yum仓库装但道理都一样核心就两件事版本对上配置指向ES。2.3 8.x和7.x的启动差异这里必须单独提一句Kibana 8.x和7.x的启动体验差别非常大主要是因为Elasticsearch 8.x默认开启了安全功能。在ES 8.x环境里Elasticsearch首次启动时会在终端输出两个关键信息elastic用户的初始密码和一条Enrollment Token。Kibana首次启动后浏览器打开5601端口会让你粘贴这条Enrollment Token之后再用elastic用户和密码登录。如果你像以前一样只改elasticsearch.hosts就想连上8.x的ES大概率会报安全认证错误。解决办法有两个正式环境建议在Kibana配置里加上服务账号密码或者继续使用页面上的Enrollment Token流程如果只是在本地开发环境可以在ES的elasticsearch.yml里关掉安全功能再试但千万不要在公网环境这么做。7.x就简单一些没开安全功能的情况下只要elasticsearch.hosts配好就能进页面。所以如果你网上搜到的教程说改完配置就能用注意看一下是不是针对7.x的。2.4 关于授权边界Kibana真的免费吗用户经常搜elasticsearch kibana(elk)软件多少钱这类问题这里说下我了解的情况。Kibana和Elasticsearch一样有免费版Basic License和付费订阅之分。免费版已经包含Discover、Visualize、Dashboard、Dev Tools这些核心功能个人学习、中小团队做日志分析基本够用。但像告警Alerting、机器学习ML、安全权限管理RBAC、跨集群复制这类X-Pack高级功能就需要白金版或企业版订阅。Kibana里的部分菜单免费版里能看到但进不去或者功能是受限的。所以企业真正要算成本的时候不只是算软件本身的钱还要考虑运维人力、存储成本和订阅费用。这也是为什么市面上有那么多ELK替代方案的原因真的要评估ROI。3. 日常使用最频繁的四个功能区3.1 Discover数据探查的第一站我平时打开Kibana80%的时间都待在Discover里。Discover本质上是一个搜索框加一堆过滤条件让你以最快的方式查看Elasticsearch里的原始数据。用Discover之前必须先创建索引模式Index Pattern。索引模式就是告诉Kibana你要查哪些索引支持通配符。比如你的日志索引按天切分那索引模式可以写成nginx-access-*这样它就能匹配nginx-access-2024.01.15、nginx-access-2024.01.16这样的所有索引。创建路径是Management → Stack Management → Index Patterns → Create index pattern。填上索引模式后它会让你选一个时间字段。这一步很关键如果索引里没有合适的时间字段或者你选错了Discover里的时间过滤器就是失效的数据可能一直显示不出来。进了Discover之后最常用的就是顶部那个搜索框。这里支持KQL语法。有几个我几乎每天都在用的写法# 精确匹配 status: 200 # 范围查询 response_time 200 and response_time 500 # 逻辑组合 level: ERROR and (service: order-service or service: user-service) # 通配符 message: timeout*这比在ES的JSON查询里写一长串bool、must要直观太多了。KQL是Kibana的查询语言你不用记复杂的DSL只要记住字段: 值这种格式再加上and、or、not、括号和比较符号就足够覆盖日常绝大多数查询需求。右侧的字段列表也很有用。点开字段可以看到它的Top Values分布比如你想知道今天报错最多的是哪个服务直接在service.keyword字段旁边看数量排行就行。3.2 Dev Tools绕过界面直接跟ES对话Discover和图表确实方便但有一个场景必须用Dev Tools验证数据没毛病。什么情况算数据没毛病比如你怀疑某个字段的值不规范或者想精确统计某个时间段的聚合结果在界面上点来点去可能费劲但在Dev Tools里写一段ES的REST请求几秒钟就能出结果。Dev Tools在Kibana左侧菜单里打开之后就是一个Console左边写请求右边显示结果。比如我经常用这几个查索引分布GET _cat/indices?v查某索引的字段映射GET nginx-access-*/_mapping精确统计请求平均耗时GET nginx-access-*/_search { size: 0, aggs: { avg_response_time: { avg: { field: response_time } } } }Dev Tools最大的好处是支持自动补全你输入GET它会提示后续命令输入JSON时也会提示字段。遇到复杂的聚合分析我都是先在Dev Tools里把DSL调通然后再去建图表这样能省很多来回排查的时间。3.3 Lens与Visualize把查询变成图表数据看明白了下一步往往是给别人看。这时候就要用到Visualize。Kibana 7.17之后主推Lens这种拖拽式可视化编辑器比老式的聚合图表面板亲民很多。打开Visualize Library → New visualization选好数据源索引模式就进入Lens界面。Lens的操作逻辑可以理解为左侧选要展示的字段拖到中间画布选一个合适的图表类型右侧调整维度、指标、过滤条件。比如我想看过去24小时每小时请求量的趋势就是在X轴选timestamp并且用日期直方图Date histogram做时间分组Y轴选择Count of records文档计数之类。系统会自动生成折线图或柱状图再微调一下样式和标题就能保存。如果你要更精细的控制比如计算P95响应时间、按多个条件分组、对时间序列做平滑、甚至写表达式那就需要用到TSVBTime Series Visual Builder或者Vega。TSVB的表达式我摘一个例子value: average(response_time)它支持percentile、rate等聚合函数也能嵌套算术。比如要算耗时超过500ms的请求占比表达式可以写成value: (count(response_time 500) / count(*)) * 100说句经验之谈先用Lens搞不定再TSVB最后才考虑Vega。Vega能画出自定义级别很高的图但它的学习曲线也陡得多日常场景很少需要用上。3.4 Dashboard把零散图表变成可用大盘图表做出来之后最后一步就是扔进Dashboard里组装成监控页面。Dashboard的用法很简单创建一个新仪表盘然后Add panels把之前保存的图表一个个拖进去。调整好大小和排列顺序设置一个自动刷新时间比如每1分钟刷新一次这就算是一块可用的监控大屏了。但这里有一个容易被忽略的事Dashboard里的每一个图表本质上是绑定了一个查询和一个时间范围。如果你在图表里忘了选时间范围它可能默认跟随Dashboard右上角的时间选择器。如果你的时间选择器选的是最近15分钟那这块图表就只看最近15分钟的数据不管你原始数据有多全。所以我做Dashboard的习惯是每个图表保存前都确认清楚它该跟随全局时间还是固定时间范围。比如近7天错误趋势这种就应该跟随全局而当前分区磁盘使用率这种指标型图表固定近5分钟反而更合适。另外Dashboard右上角有个全屏按钮点开之后可以隐藏所有菜单变成纯大屏模式。汇报的时候直接全屏演示体验很好。4. 实操从原始Nginx日志到一块监控大盘4.1 数据准备与索引模式这里用一个完整的例子把整个流程串起来。假设我们要监控一套Nginx服务的访问日志日志已经被Filebeat采集进了Elasticsearch索引名是nginx-access-2024.01.15这样的格式。第一步还是在Management里创建索引模式索引模式写成nginx-access-*时间字段选择timestamp。如果你的日志里没有timestamp那就是Filebeat没配好先去把采集端搞定再回来。如果你的环境里没有现成的Nginx日志为了练习也可以手动往ES里塞几条模拟数据。Dev Tools里执行POST nginx-access-2024.01.15/_bulk { index: {}} { timestamp: 2024-01-15T10:00:00.000Z, method: GET, url: /api/v1/users, status: 200, response_time: 120, client_ip: 10.0.0.11 } { index: {}} { timestamp: 2024-01-15T10:01:00.000Z, method: POST, url: /api/v1/orders, status: 500, response_time: 980, client_ip: 10.0.0.12 }这样就有一个最简单的可查询数据源了。4.2 用KQL把真正关心的请求筛出来索引模式建好之后打开Discover把时间过滤器切到今天右侧就能看到刚才插入的数据了。接下来我们先把异常请求筛出来。如果想看所有5xx错误status 500如果想看接口响应慢的请求response_time 500想同时满足两个条件比如5xx错误且响应超过1秒status 500 and response_time 1000看到结果了就可以把这个搜索保存下来。Discover界面右上角有个Save按钮保存搜索对象时给它起一个清晰的名字比如5xx错误且响应超过1秒。保存之后后续做图表时可以直接复用这个搜索条件不用每次重新敲一遍。4.3 图表制作与仪表盘组装接下来我们做一块请求状态码分布饼图。打开Visualize Library → Create visualization → 选择nginx-access-*索引模式。在Lens里左侧拖status.keyword到画布图表类型选饼图Kibana会自动按status分组统计数量。保存成请求状态码分布。再做一张每小时请求量与平均响应时间的趋势图。X轴拖timestampY轴分别拖文档计数和response_time的平均值。图表类型选折线图或柱状图都行保存成请求量与平均响应时间趋势。图表做好后新建一个Dashboard把这两张图加进去调整大小把右上角刷新时间设成1分钟。到这一步你已经拥有了一块最基础的Nginx访问监控大盘。4.4 保存对象迁移与复用最后提醒一个很多人忽略的点Kibana里所有保存的搜索、图表和Dashboard本质都是一份JSON配置。Management → Stack Management → Saved Objects里可以导出这些对象生成一个.ndjson文件。这套操作在环境切换时特别有用。比如你测试环境把图表调试好了要同步到生产Kibana直接把测试环境导出的文件在生产环境导入就行不用重新做一遍。我见过不止一个团队因为没保存这些对象环境一换图表全没了只好从头再拖一遍确实挺折腾的。所以养成习惯每做完一个Dashboard顺手导出一次备份。5. 实操中遇到的坑白屏、无数据与时空错位5.1 页面打不开、白屏或一直转圈Kibana页面打不开通常是三种原因第一种是Kibana进程根本没起来。用ps -ef | grep kibana看进程是否存在再查看logs/kibana.log里有没有报错。常见报错是Java版本不对或内存配置不足日志里会明确写。第二种是端口没暴露。Kibana默认只监听localhost如果你改了server.host还是打不开先curl http://localhost:5601试一下能通说明配置没生效检查有没有改错配置文件、有没有重启进程。第三种是Elasticsearch连不上。Kibana界面做了很久的白屏或一直转圈多半是elasticsearch.hosts配置有问题或者ES节点挂掉了。这时候先去确认ES 9200端口能返回状态信息再检查Kibana日志里的连接报错。我把排查路径整理成了表格方便后续直接照着查现象可能原因排查手段访问5601没有响应Kibana进程未启动或server.host配置为localhost看进程、看日志、curl localhost:5601页面能开但一直转圈ES连接不上或Kibana索引无法初始化检查es hosts配置确认ES是否健康页面白屏且控制台报JS错误浏览器缓存或Kibana资源损坏清缓存换浏览器检查kibana日志登录报认证错误ES开启了安全功能但Kibana没有配置凭据检查用户名密码或enrollment token5.2 索引模式看不到数据索引模式建好了结果Discover里一打开就是No results这种问题太常见了。我踩过之后总结了四个检查点第一时间字段选没选对。Kibana的Discover默认会套用一个时间范围如果你索引里的时间字段不是选中的那个字段或者时间数据是字符串格式Kibana就没法正确地做时间过滤。第二时间范围对不对。右上角时间选择器如果选了最近15分钟而你的数据是昨天插入的那必然查不到。先切到今天或最近7天试试。第三索引名字和模式匹不匹配。比如你的索引实际叫nginx-access-2024.01.15索引模式却写成nginx-access-*正常情况下没问题但如果你把模式写成了nginx-access-2024*也没问题。就怕中间隔了一个字符大小写或者下划线Kibana对索引名是严格匹配的。第四数据里有没有文档。用Dev Tools执行GET nginx-access-*/_search如果返回的total是0那就是采集端问题跟Kibana没关系。5.3 图表数字对不上与时间范围陷阱一个常见的困惑是我在ES查询出来的总数是1000在Kibana图表里却显示只有800。排除数据在查询期间发生变化的情况后多半是时间范围或者精度不同。Elasticsearch聚合默认返回的是近似值某些情况下会做精度取舍。再加上图表的时间桶和你的查询时间范围可能不同显示结果就会不一样。我一般这样核对先用Dev Tools写一个精确的聚合查询拿到数字之后再去改图表的查询和范围直到两边对得上。如果对不上就一层层加过滤条件定位是在哪个环节丢的数据。5.4 版本升级后的兼容问题每次ES大版本升级Kibana都有可能出现兼容性问题。最常见的是图表配置迁移失败。比如从7.x升到8.x有的旧图表用的可视化类型已经被移除或改名Kibana会在升级时尝试自动迁移但有一些复杂图表可能迁移失败。这种情况在Saved Objects里能看到报错需要手动重新创建。另外Kibana自身升级前一定要彻底检查确认所有已保存的Dashboard和索引模式是否都做了导出备份。升级过程中不要同时改动配置和索引一步一步来出了问题也容易回滚。6. 个人建议几个越早养成越好的使用习惯6.1 先在Dev Tools验证再怀疑UI不管在Discover里查到奇怪的数据还是图表结果对不上我第一个动作永远是打开Dev Tools自己查一遍。界面是给人用的但界面背后有大量的默认设置和自动优化有时候它的智能反而是干扰源。直接用ES的API确认原始数据长什么样再回到界面上调整排查效率会高很多。比如你以为某些请求的response_time字段没值界面上看像是空的但实际可能是字段类型不对或者映射里根本没这个字段。用GET index/_mapping看一眼就清楚了比自己猜省太多时间。6.2 把常用搜索和图表做成Saved Objects刚开始用Kibana的人最容易犯的毛病就是每次现查现做做完不保存。等到下次要用又得重新设置索引模式、重写搜索条件、重新拖图表。一次两次还行次数多了就特别浪费时间。我的做法是凡是超过一次用到的搜索条件一定命名清晰并保存凡是汇报要用到的图表一定放进Dashboard每个Dashboard做完了顺手导出一份.ndjson备份。这些操作都是被逼出来的有一次生产环境Kibana数据被误删我靠备份几分钟就恢复了从那之后养成了习惯。6.3 设置好时间范围与索引通配符最后一个习惯是关于索引模式的命名。如果你的日志索引按天切分索引模式一定要写成通配符比如nginx-access-*而不是指向具体某一天的索引。这样你以后看历史数据不用重建模式新一天的索引也不用额外配置Kibana自动就能匹配上。另外最好在索引模式里把要显示的时间字段固定下来尽量避免出现多个时间字段混合的情况。Kibana如果识别到多个时间字段会让你选选错一次之后很容易一直用错字段直到某天数据消失才反应过来。还有一个小细节Kibana右上角的时间过滤器支持快捷方式比如now-15m、now/d、now-1h用熟了之后比点日历快很多。我经常在排查问题时用now-30m看最近半小时的数据比默认的15分钟范围宽一些容错率更高。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →