Kibana 可视化和仪表盘
Kibana 可视化和仪表盘
Kibana 是 Elastic Stack 的"门面"。日志采集入库只是第一步,让数据变得可见、可探索、可监控,才是 Kibana 的核心价值。本文将系统介绍 Kibana 四大可视化工具的使用方法,并从零搭建一个 Nginx 监控面板。
1. Discover:快速搜索和查看日志
Discover 是最常用的功能入口,用于浏览和搜索索引中的数据。
基础操作
| 操作 | 说明 |
|---|---|
| Index Pattern 选择 | 选择要查询的索引(如 nginx-*) |
| 时间范围 | 右上角时间选择器,支持绝对/相对时间 |
| KQL 搜索 | 用户友好的查询语法 |
| Lucene 搜索 | 传统 Lucene 查询语法(功能更强) |
| 字段列表 | 左侧可展开,查看字段 Top 5 值 |
| 列自定义 | 选择要显示的字段列 |
KQL vs Lucene 对比
| 查询 | KQL | Lucene |
|---|---|---|
| 精确匹配 | status: 200 |
status:200 |
| 范围查询 | response_time > 1000 |
response_time:[1000 TO *] |
| 多条件 AND | status: 200 and method: GET |
status:200 AND method:GET |
| 通配符 | message: *timeout* |
message:*timeout* |
| 字段存在 | message: * |
_exists_:message |
| 短语匹配 | message: "connection refused" |
message:"connection refused" |
KQL 是 ES 7.x 后引入的,语法更友好、自动补全更好,推荐日常使用。Lucene 语法在特殊场景(正则、模糊搜索)仍有用。
实用 Discover 技巧
# 找出所有 5xx 错误的请求
response_code >= 500 and response_code < 600
# 找出响应时间超过 2 秒的请求
response_time > 2000 and not (uri_path: "/health")
# 找出来自特定 IP 段的错误
client_ip: "10.0.*" and response_code >= 500
2. Lens:拖拽式可视化
Lens 是 Kibana 7.x 推出的零门槛可视化工具,拖拽字段即可生成图表。
支持的图表类型
| 图表类型 | 适用场景 | ES 聚合类型 |
|---|---|---|
| 柱状图 | 按维度统计数量 | terms + count |
| 折线图 | 时序趋势 | date_histogram |
| 饼图 | 占比分布 | terms + count |
| 热力图 | 二维分布 | date_histogram + terms |
| 表格 | 多维度列表 | terms + max/min/avg |
| 指标 | 单个数值 | sum/avg/cardinality |
Lens 操作流程(以 Nginx 状态码分布为例)
Step 1:进入 Visualize Library -> Create visualization -> Lens
Step 2:选择数据视图(如 nginx-*)
Step 3:拖拽字段:
- 横轴:拖入
response_code.keyword - 竖轴:拖入
Records(即 count)
Step 4:选择图表类型 -> Bar vertical
Step 5:右侧配置:
- 标题:
Nginx 响应状态码分布 - 图例位置:右侧
- 数值标签:开启
生成的 ES DSL 框架类似:
{
"aggs": {
"status_distribution": {
"terms": {
"field": "response_code.keyword",
"size": 10
}
}
}
}
3. TSVB(Time Series Visual Builder)
TSVB 专为时序数据设计,比 Lens 更灵活,支持数学运算、自定义颜色、标注线。
TSVB 三大模式
| 模式 | 说明 |
|---|---|
| Timeseries | 时间序列折线图 |
| Metric | 单值指标面板 |
| Top N | 排名 |
| Gauge | 仪表盘 |
| Markdown | 自定义文本 |
实战:Nginx QPS 折线图
配置:
- Aggregation:
Count - Group by:
Filters,按response_code分组 - 过滤器 1:
response_code:[200 TO 299](2xx) - 过滤器 2:
response_code:[300 TO 399](3xx) - 过滤器 3:
response_code:[400 TO 499](4xx) - 过滤器 4:
response_code:[500 TO 599](5xx)
这样生成的折线图会按状态码类别显示不同颜色的折线,一眼看出 QPS 和错误率趋势。
TSVB 实用技巧:添加百分比标注
TSVB 支持自定义公式。例如展示 5xx 占比:
# 在 Series Options -> Data Formatter -> Custom 中
# 或者添加第二个 Series:
.es(index=nginx-*, timefield=@timestamp, metric=count:response_code.keyword).divide(
.es(index=nginx-*, timefield=@timestamp, metric=count)
).multiply(100).label("Error Rate %")
4. Dashboard:组合可视化
添加好仪表盘后,可以把多个可视化拼成一个 Dashboard。
Dashboard 关键功能
| 功能 | 说明 |
|---|---|
| 时间联动 | Dashboard 上的所有面板共享同一个时间范围 |
| 刷新间隔 | 可设自动刷新(5s / 30s / 1m / 5m) |
| 面板筛选 | 点击图表中的某个数据点会作为全局筛选器 |
| 保存/分享 | 支持导出 Embed iframe、Share Link |
| 全屏模式 | 适合大屏展示 |
刷新间隔建议
| 场景 | 建议刷新间隔 |
|---|---|
| 实时监控大屏 | 30s ~ 1min |
| 运营看板 | 5min |
| 日报分析 | 不需要自动刷新 |
踩坑提醒:Dashboard 自动刷新频率过高(如 5 秒)且面板中包含复杂聚合,会在 ES 上产生大量重复查询,增大搜索线程池压力。请根据业务需求和 ES 负载合理设置。
5. 从零搭建 Nginx 监控面板
仪表盘布局设计
第一行:核心指标
┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐
│ 总QPS │ │ 2xx 请求 │ │ 4xx 请求 │ │ 5xx 请求 │
│ (TSVB) │ │ (TSVB) │ │ (TSVB) │ │ (TSVB) │
└──────────┘ └──────────┘ └──────────┘ └──────────┘
第二行:趋势图
┌──────────────────────────────────────────────────┐
│ QPS 趋势(按状态码分色) │
│ (TSVB Timeseries) │
└──────────────────────────────────────────────────┘
第三行:分布分析
┌───────────────────────┐ ┌────────────────────────┐
│ 状态码分布(饼图) │ │ 响应时间 P99 趋势 │
│ (Lens) │ │ (TSVB) │
└───────────────────────┘ └────────────────────────┘
第四行:详情
┌──────────────────────────────────────────────────┐
│ 慢请求 Top 10 URL │
│ (Lens Table) │
└──────────────────────────────────────────────────┘
各面板配置要点
总 QPS(TSVB - Metric 模式):
- Agg:
Count,显示为string格式 - 颜色:正常绿色,异常红色(通过 Rules 设置)
QPS 趋势按状态码分色(TSVB - Timeseries 模式):
- 按 2xx/3xx/4xx/5xx 分别建 4 个 Series
- 颜色:绿/蓝/黄/红
- 线宽:2px,点大小:0
响应时间 P99 趋势(TSVB - Timeseries 模式):
- Agg:
Percentile,选择response_time字段,值99 - 叠加 50 百分位线(P50 用虚线表示中位数)
慢请求 Top 10 URL(Lens - Table 模式):
- Rows:
uri_path.keyword(Top 10) - Metrics:
Max of response_time、Count of records - 按
Max of response_time降序排列
6. Dashboard 导出导入(Saved Objects)
Dashboard 通过 Saved Objects 机制管理,支持导出为 NDJSON 文件。
导出
Kibana -> Stack Management -> Saved Objects
-> 勾选要导出的 Dashboard 和相关 Visualization
-> Export -> 下载 .ndjson 文件
导出时注意勾选 Include related objects,否则只导出 Dashboard 定义,关联的 Visualization 不会一起导出。
导入
Kibana -> Stack Management -> Saved Objects
-> Import -> 选择 .ndjson 文件
-> 如果 conflicts -> 选择 Skip 或 Override
通过 API 导出导入(自动化)
# 导出
curl -X POST "localhost:5601/api/saved_objects/_export" \
-H "kbn-xsrf: true" \
-H "Content-Type: application/json" \
-d '{
"objects": [{"type": "dashboard", "id": "your-dashboard-id"}],
"includeReferencesDeep": true
}' \
-o dashboard.ndjson
# 导入
curl -X POST "localhost:5601/api/saved_objects/_import" \
-H "kbn-xsrf: true" \
--form file=@dashboard.ndjson
总结
| 工具 | 适用场景 | 学习曲线 |
|---|---|---|
| Discover | 日志搜索、问题排查 | 低 |
| Lens | 快速可视化、业务报表 | 低 |
| TSVB | 时序数据监控、指标看板 | 中 |
| Dashboard | 组合展示、大屏监控 | 低 |
| Canvas | 精美幻灯片、年报 | 高 |
Kibana 的学习路径建议:先用 Discover 熟悉数据结构和查询语法,然后用 Lens 快速出图,遇到时序场景切 TSVB,最后拼成 Dashboard。不要一上来就追求花哨的 Canvas 大屏——先把数据看清、查准、告警到位,才是真正的价值所在。