Kibana可视化组件概述
Kibana提供丰富的可视化组件,主要分为三类:
- Basic Chart:基础图表(区域图、柱状图、折线图、饼图、热力图、散点图)。
- Data:数据展示类(表格、仪表盘、目标图、指标卡)。
- 地图类:
- Coordinate Map:基于经纬度的坐标系地图(需
geo_point字段)。 - Region Map:分级统计地图(需行政区划编码如
country ISO code)。 - 时间序列类:需结合
Timeline或Time Series聚合。
- Coordinate Map:基于经纬度的坐标系地图(需
核心原理:所有图表均基于Elasticsearch聚合(Aggregation) 实现,需熟练掌握metrics(Y轴指标)与buckets(X轴分桶)的配置逻辑,需熟练掌握terms、date_histogram、filters等聚合类型
Basic Chart 配置详解
操作流程:
- 创建图表:进入
Visualize→Create→ 选择图表类型(如Area)。 - 选择数据源:
- 新建
Search或使用已保存的Saved Search(如logstashtest)。
- 新建
- 配置聚合:
- Metrics:Y轴指标(如
count、average、sum)。 - Buckets:X轴分桶(如
Date Histogram按时间分组)。 - 拆分逻辑:
Split Series:同图表内分系列展示(如不同国家的折线)。Split Chart:分多个子图表展示(如每个国家独立图表)。
- Metrics:Y轴指标(如
关键技巧:
- 聚合顺序影响结果:
示例1:先按时间分桶 → 再按国家分系列 → 显示每个时间段内前5个国家。 示例2:先按国家分桶 → 再按时间分组 → 显示总量前5国家的时间趋势。 - 图表优化:
- 在
Metrics & Axis中调整图表类型(堆叠柱状图 vs 普通柱状图)。 - 使用
Panel Settings控制网格线、总计值等。
- 在
热力图(Heatmap)配置示例:
Metrics: count
X-axis: Date Histogram (interval: daily)
Y-axis: Terms (field: geo.src.keyword, size: 15)
Options: 颜色方案选"Greens",数值越高颜色越深。
Data 类图表应用场景
| 图表类型 | 用途 | 配置要点 |
|---|---|---|
| Table | 多维表格分析 | 添加多个metrics(如sum(bytes))和buckets。 |
| Gauge | 仪表盘(健康指标监控) | 设置ranges定义阈值(如0-60绿色,60-120黄色)。 |
| Goal | 目标进度(如用户增长) | 隐藏scale,突出目标值。 |
| Metric | 单指标展示(如总流量) | 通过ranges触发颜色警报(如>1000标红)。 |
示例:Gauge 阈值配置
Aggregation: Sum(field: bytes)
Ranges: [0, 100000], [100000, 500000], [500000, max]
Color Schema: Green to Red
Lens图表配置详解
1 ) 数据层(Data Tab)配置
- Metrics(Y轴指标):
- 支持
count、sum、average、max等聚合。 - 可添加多指标(如同时显示请求量和平均流量)。
- 支持
- Buckets(X轴/分桶):
- 控制横坐标,支持
date_histogram(时间分桶)、terms(字段分桶)。 - 分桶顺序影响结果:
- 先
terms后date_histogram→ 显示总量前N项的时序分布。 - 先
date_histogram后terms→ 显示每个时间段内前N项,可能导致数据分散。
- 先
- 拆分方式:
Split Series:同一图表展示多系列(如不同国家的流量对比)。Split Chart:分多个子图表展示(如每个国家独立图表)。
- 控制横坐标,支持
2 ) 图表优化与调试
- Metrics Axis:
- 调整图表类型(柱状/线形)、堆叠模式(
stack或normal)。 - 解决单位差异:为不同指标分配独立Y轴坐标系。
- 调整图表类型(柱状/线形)、堆叠模式(
- Panel Settings:
- 控制网格线(
gridline)、图例(legend)、标签角度(避免重叠)。
- 控制网格线(
- 调试技巧:
- 通过 “Inspect” → “Request” 查看ES查询语句,验证聚合逻辑。
// 示例:按小时统计请求量 "aggs": { "hourly_traffic": { "date_histogram": { "field": "@timestamp", "fixed_interval": "1h" }, "aggs": { "count": { "value_count": { "field": "request.keyword" } } } } }
地图可视化技术解析
1 ) 地理坐标系基础
- 经纬度(Geographic Coordinate):
三维球面定位(如上海:北纬31.2°, 东经121.5°)。 - Geohash 编码:
将二维经纬度压缩为一维字符串(如wt7),提升聚合性能。// Geohash 精度示例(层级越高越精确) wt7 → 上海区域 wt7k → 上海市中心
2 ) 地图类型配置
- Coordinate Map:
Aggregation: Geohash (field: geo.location) Precision: 自动适配缩放层级(高精度=小方格) Options: 选择圆形标记(Circle Markers)或热力模式。 - Region Map:
Field: country_iso_code Map Service: Built-in "Countries" 或自定义 GeoJSON 需在 kibana.yml 启用: regionmap.includeElasticMapsService: true
自定义地图场景:
支持通过Map Service集成球场平面图、楼层布局等,需提供GeoJSON边界数据。
可视化配置核心技术原理
-
数据聚合(Aggregation)驱动图表生成
- Y轴指标(Metrics):
count,sum,average,max,min,percentiles - X轴分桶(Buckets):
// ElasticSearch 聚合语法示例 "aggs": { "date_histogram": { "field": "@timestamp", "calendar_interval": "3h" }, "country_terms": { "terms": { "field": "geo.src.keyword", "size": 5 } } } - 聚合顺序决定结果:
- ❗️ 关键差异:先分桶后Terms返回总量Top5;先Terms后分桶返回每个时段的Top5
- Y轴指标(Metrics):
-
图表高级控制
- 拆分模式(Splitting):
模式 效果 Split Series单图表多曲线(不同颜色) Split Chart多图表独立展示(行/列布局) - 坐标轴优化:
- 双Y轴解决单位差异(如请求计数 vs 字节大小)
- 热力图时间间隔(Interval)不宜过小,避免数据溢出
- 拆分模式(Splitting):
高级图表应用案例
- 热力图(Heatmap)配置
- 横轴:
date_histogram(按天聚合)。 - 纵轴:
terms(国家字段,size: 15)。 - 颜色深浅:基于
count或sum指标。 - 注意事项:时间间隔不宜过小,避免数据点过密导致渲染异常。
- 趋势分析(Pipeline Aggregation)
- 使用
serial_diff(序列差分) 计算环比:"aggs": { "daily_bytes": { "date_histogram": { "field": "@timestamp", "interval": "day" }, "aggs": { "sum_bytes": { "sum": { "field": "bytes" } }, "bytes_diff": { "serial_diff": { "buckets_path": "sum_bytes", "lag": 24 // 与24小时前对比 } } } } }- 结果:正值为增长,负值为下降。
- 仪表盘(Gauge)与目标图(Goal)
- Gauge:
- 设置
ranges定义阈值(如[0, 60]绿色,[60, 120]黄色)。 - 字段类型需为数值(如
sum(bytes))。
- 设置
- Goal:
- 隐藏刻度(
skill),专注目标进度(如注册用户数达100万)。
- 隐藏刻度(
工程示例:1
方案1:基础聚合查询(NestJS + Elasticsearch)
// 1. 安装依赖
import { Injectable } from '@nestjs/common';
import { ElasticsearchService } from '@nestjs/elasticsearch';
@Injectable()
export class DashboardService {
constructor(private readonly esService: ElasticSearchService) {}
async getTrafficByCountry() {
const response = await this.esService.search({
index: 'logstash-*',
body: {
size: 0,
aggs: {
by_country: {
terms: { field: 'geo.src.keyword', size: 5 },
aggs: {
total_bytes: { sum: { field: 'bytes' } }
}
}
}
}
});
return response.aggregations.by_country.buckets;
}
}
2 ) 方案2:Geohash 地理位置聚合
// 获取区域热力图数据
async getGeoHeatmap() {
const response = await this.esService.search({
index: 'logstash-*',
body: {
size: 0,
aggs: {
heatmap: {
geohash_grid: {
field: 'geo.location',
precision: 7
},
aggs: { request_count: { value_count: { field: 'request' } } }
}
}
}
});
return response.aggregations.heatmap.buckets;
}
3 ) 方案3:定时任务与仪表盘数据更新
// 结合 @nestjs/schedule 定时刷新指标
import { SchedulerRegistry } from '@nestjs/schedule';
@Injectable()
export class MetricsService {
constructor(
private scheduler: SchedulerRegistry,
private esService: ElasticsearchService
) {
this.scheduleDailyUpdate();
}
private scheduleDailyUpdate() {
const job = setInterval(() => this.updateDashboard(), 24 * 60 * 60 * 1000);
this.scheduler.addInterval('daily-metrics', job);
}
private async updateDashboard() {
const result = await this.esService.search({ ... });
// 存储结果到Kibana索引或数据库
}
}
工程示例:2
1 ) 方案1:基础数据索引与聚合查询
// nestjs.service.ts
import { Injectable } from '@nestjs/common';
import { Client } from '@elastic/elasticsearch';
@Injectable()
export class EsService {
private readonly esClient: Client;
constructor() {
this.esClient = new Client({ node: 'http://localhost:9200' });
}
// 创建索引
async createIndex(index: string) {
await this.esClient.indices.create({ index });
}
// 执行聚合查询
async runAggregation(index: string, aggQuery: any) {
const { body } = await this.esClient.search({
index,
body: { aggs: aggQuery, size: 0 }
});
return body.aggregations;
}
}
// 调用示例:按国家分桶统计
const aggQuery = {
country_stats: {
terms: { field: 'geo.src.keyword', size: 5 },
aggs: { total_bytes: { sum: { field: 'bytes' } } }
}
};
2 ) 方案2:GeoHash聚合与地图集成
// geo.controller.ts
import { Controller, Get } from '@nestjs/common';
import { EsService } from './es.service';
@Controller('geo')
export class GeoController {
constructor(private readonly esService: EsService) {}
@Get('heatmap')
async getGeoHeatmap() {
const aggQuery = {
heatmap_data: {
geohash_grid: { field: 'location', precision: 6 },
aggs: { count: { value_count: { field: 'request.keyword' } } }
}
};
return this.esService.runAggregation('logs', aggQuery);
}
}
3 ) 方案3:Kibana仪表盘自动化配置
// kibana-dashboard.service.ts
import { Injectable } from '@nestjs/common';
import axios from 'axios';
@Injectable()
export class KibanaService {
private readonly kibanaUrl = 'http://localhost:5601/api';
// 创建可视化图表
async createVisualization(title: string, visState: object) {
const response = await axios.post(
`${this.kibanaUrl}/saved_objects/visualization`,
{ type: 'visualization', attributes: { title, visState } }
);
return response.data;
}
// 示例:生成区域图配置
buildAreaVisState(indexPattern: string) {
return {
type: 'area',
params: {
type: 'area',
grid: { categoryLines: true },
seriesParams: [{ type: 'area', drawLinesBetweenPoints: true }]
},
aggs: [
{ type: 'count', schema: 'metric' },
{
type: 'date_histogram',
schema: 'segment',
params: { field: '@timestamp', interval: 'auto' }
}
]
};
}
}
ES与NestJS协同配置要点
-
ES连接优化:
- 使用连接池:
new Client({ nodes: ["http://es-node1:9200", "http://es-node2:9200"] })。 - 启用压缩:
{ compression: 'gzip' }减少网络开销。
- 使用连接池:
-
安全加固:
- 通过
@elastic/elasticsearch的auth配置API Key或TLS证书:new Client({ auth: { apiKey: 'base64EncodedKey' }, ssl: { ca: fs.readFileSync('./ca.crt') } })
- 通过
-
性能调优:
- 聚合分页:使用
composite聚合替代terms避免深度分页问题。 - 缓存策略:在ES索引设置中启用
request_cache: true。
- 聚合分页:使用
-
错误处理:
- 捕获ES异常并重试:
try { await esClient.search(...); } catch (error) { if (error.meta?.body?.error?.type === 'circuit_breaking_exception') { // 内存熔断时降级查询 } }
- 捕获ES异常并重试:
地理空间分析关键技术
1 ) GeoHash 原理与实战
- 编码逻辑:将二维经纬度(如
31.23°N, 121.47°E)转为字符串(如WTW2),通过四叉树无限细分地球表面 - Kibana地图配置:
// ElasticSearch 地理聚合 "aggs": { "geo_hash": { "geohash_grid": { "field": "location", "precision": 6 // 控制网格精度 } } } - 可视化优化:
Marker Position:聚合点居中显示Heatmap Mode:基于密度渲染颜色渐变
2 ) 区域地图(Region Map)
- 依赖字段:国家ISO编码(如
CN/US) - 服务配置:需在
kibana.yml启用Elastic Maps Service:region_map.includeElasticMapsService: true
地理空间数据可视化
1 ) 坐标系地图(Coordinate Map)
- 数据基础:
- 经纬度字段:需定义为
geo_point类型。 - GeoHash原理:将二维坐标编码为一维字符串,提升聚合效率(如
wtw25n表示上海区域)。
- 经纬度字段:需定义为
- 聚合配置:
- 使用
geohash_grid聚合,通过precision控制精度(值越大网格越细)。
"aggs": { "geo_data": { "geohash_grid": { "field": "location", "precision": 6 } } } - 使用
2 ) 区域地图(Region Map)
- 依赖字段:国家/地区编码(如
country_iso_code)。 - 地图源配置:
- 启用Elastic Maps Service:在
kibana.yml设置regionmap.includeElasticMapsService: true。 - 自定义地图:通过
map server加载GeoJSON轮廓(如球场、楼层平面图)。
- 启用Elastic Maps Service:在
3 ) GeoHash可视化工具推荐:
ES 周边配置优化
- 索引模板(Geopoint 字段):
PUT _index_template/geo_template { "mappings": { "properties": { "geo.location": { "type": "geo_point" } } } } - Kibana 高级设置:
regionmap.includeElasticMapsService: truevisualization:colorMapping自定义颜色方案
- 性能优化:
- 使用
Geohash替代GeoJSON降低计算开销。 - 聚合时添加
size: 0禁止返回原始文档。
- 使用
配置调优与运维要点
-
ElasticSearch 性能配置
# elasticsearch.yml thread_pool.search.size: 20 # 搜索线程数(建议=CPU核心数+1) indices.query.bool.max_clause_count: 10000 # 提高复杂聚合能力 -
NestJS 连接池管理
// 重试策略配置 new Client({ node: 'http://es-cluster:9200', ConnectionPool: require('@elastic/elasticsearch').ConnectionPool, maxRetries: 5, resurrectStrategy: 'optimistic' })
最佳实践
- 核心原则:
- 聚合顺序决定结果:分桶顺序影响数据分布(如先
terms还是先date_histogram) - GeoHash精度权衡:高精度(
precision: 8+)适合小范围,低精度(precision: 3-5)适合全球视图
- 聚合顺序决定结果:分桶顺序影响数据分布(如先
- 调试技巧:
- 通过Kibana "Inspect"功能验证ES查询逻辑
- 使用Dev Tools直接调试DSL语句
- 扩展性:
- 自定义地图服务:通过
region_map集成GeoJSON,支持球场、建筑等场景 - 管道聚合:
serial_diff、moving_avg实现高级分析
- 自定义地图服务:通过
总结
- 聚合顺序陷阱:Bucket顺序直接影响结果,时序数据建议先
date_histogram后terms - 地理数据优化:
- GeoHash精度(
precision)随缩放级别动态调整 - 区域地图需预置GeoJSON边界数据
- GeoHash精度(
- 异常检测模式:
// 同比分析pipeline聚合 "aggs": { "diff": { "derivative": { "buckets_path": "sum_bytes" } } }
初学者提示:
- 聚合(Aggregation):ES的数据分组计算机制,类似SQL的
GROUP BY - GeoHash:将经纬度编码为字符串,提升地理查询效率(如
wtw25n代表上海某区域) - 分桶(Bucket):将数据按规则分组(如按时间、国家)
总结
Kibana可视化核心在于理解ES聚合逻辑与地理数据处理原理。Basic Chart用于通用趋势分析,Data类图表聚焦目标监控,地图可视化需结合Geohash或行政区划编码。工程中可通过NestJS封装聚合查询,结合定时任务实现动态仪表盘,同时注意索引设计与集群配置优化以提升性能
416



被折叠的 条评论
为什么被折叠?



