Kibana 基础配置详解
1 ) 核心配置文件 (kibana.yml)
yaml
# 网络配置
server.port: 5601
server.host: "0.0.0.0"
server.maxPayloadBytes: 1048576 # 请求体大小限制
# Elasticsearch 连接配置 (重点参数)
elasticsearch.hosts: ["http://localhost:9200"]
kibana.index: ".kibana" # Kibana元数据存储索引
kibana.defaultAppId: "discover" # 默认打开页面
elasticsearch.username: "kibana_user"
elasticsearch.password: "your_password"
# 超时控制 (集群响应慢时调整)
elasticsearch.requestTimeout: 30000 # 单位毫秒
elasticsearch.shardTimeout: 30000
elasticsearch.startupTimeout: 5000 # 启动连接等待时间
# 日志配置
logging.dest: stdout # 可选值:file(输出到文件)/ silent(仅错误)
logging.quiet: false # 减少非错误日志
# 监控与国际化
monitoring.kibana.collection.interval: 10000
i18n.locale: "en" # 多语言支持(中文尚未完全支持)
2 ) 生产环境部署架构
推荐方案:
Kibana Server ES Coordinating Only Node Data Node 1 Data Node 2 Data Node 3
优势:
-专用协调节点实现请求负载均衡,避免直接连接数据节点导致的资源争用
- 将Kibana请求分散到专用协调节点,避免Kibana直接访问数据节点造成的资源争用
- 显著提升大规模查询稳定性
- 配置方法:
elasticsearch.hosts指向协调节点地址
管理界面核心功能解析
1 ) 索引模式 (Index Patterns)
创建流程:
- 输入索引名称模式(支持
*通配符,如filebeat-*) - 选择时间字段(Time Field,用于时序数据分析)
- 自定义索引ID(可选)
或
bash
Step1:定义索引模式(支持通配符)
PUT /filebeat-*/_mapping
{
"properties": {
"@timestamp": { "type": "date" } # 必须声明时间字段
}
}
Step2:Kibana界面操作
1. Management → Index Patterns → Create
2. 输入模式名:filebeat-*
3. 指定时间字段:@timestamp(关键步骤)
4. 自定义ID:my_filebeat_pattern(可选)
字段管理功能:
| 功能类型 | 作用描述 | 示例配置 |
|---|---|---|
| 字段格式 | 控制可视化显示方式 | bytes格式自动转换KB/MB/GB |
| 脚本字段 | 动态生成字段(影响性能) | Painless脚本拼接字段 |
| 源过滤 | 隐藏_source中的指定字段 |
过滤元数据字段 |
字段格式化(Format)实战:
| 字段类型 | 格式化方案 | 应用场景 |
|---|---|---|
bytes |
Bytes | 网络流量可视化(自动转KB/MB) |
url |
URL → Link | 实现字段点击跳转 |
duration |
Duration → Seconds | 请求耗时统计 |
number |
Percent | 百分比指标展示 |
脚本字段示例:
py
// 示例:拼接beat名称生成新字段
# painless脚本:
def beatName = doc['beat.name'].value;
return beatName + "_customized";
配置界面操作:
- Language:
Painless - Type:
String - Script:
return doc['beat.name'].value + '_modified';
注意:动态计算影响查询性能,避免在大数据集使用
2 ) 已保存对象 (Saved Objects)
- 管理范围:
- Dashboards(仪表板)
- Visualizations(可视化图表)
- Searches(保存的搜索条件)
- 关键操作:
- 跨环境迁移设置
- 导出/导入:跨环境迁移仪表盘(Dashboard)、可视化(Visualization)
- 批量操作:过滤 → 全选 → 删除(UI未提供批量删除功能)
3 ) 高级设置 (Advanced Settings)
关键参数:
yaml
query:queryString:options: {} # Lucene查询语法配置
search:queryLanguage: 'kuery' # 切换KQL查询语言
dateFormat: 'MMMM Do YYYY, HH:mm:ss.SSS' # 时间格式
dateFormat:tz: 'Browser' # 时区设置(建议UTC)
索引模式(Index Pattern)管理
核心功能:定义Kibana从Elasticsearch检索数据的规则
操作流程:
-
创建模式
- 匹配符:
filebeat-*(支持通配符) - 时间字段:
@timestamp(时序数据必选) - 自定义ID:
my_filebeat(替代自动生成ID)
- 匹配符:
-
字段管理
字段属性 含义 依赖条件 Searchable 是否支持全文检索 倒排索引启用 Aggregatable 是否支持聚合分析 doc_values启用 Excluded 是否从_source排除 mapping配置 -
字段格式化示例
javascript// URL字段转超链接 format: { id: "url", params: { urlTemplate: "http://{{value}}", labelTemplate: "访问链接" } } // 字节单位自动转换 format: { id: "bytes", params: { decimals: 2, suffix: "MB" } } -
脚本字段(Scripted Fields)
groovy// 动态生成服务器全名 def name = doc['host.name'].value; def domain = doc['network.domain'].value; return name + '.' + domain;
- 注意:脚本字段实时计算会显著影响查询性能。
Elasticsearch 数据分析实践
测试数据导入流程:
bash
# 1. 创建地理信息模板
curl -X PUT "es-node:9200/_template/logs" -H 'Content-Type: application/json' -d'
{
"index_patterns": ["logs-*"],
"mappings": {
"properties": {
"geoip": {
"type": "geo_point"
}
}
}
}'
# 2. 导入测试数据(需Logstash或Bulk API)
POST _bulk
{"index":{"_index":"logs-2023.03.01"}}
{"@timestamp":"2023-03-01T12:00:00Z", "message":"sample data1"...}
{"index":{"_index":"logs-2023.03.02"}}
{"@timestamp":"2023-03-02T14:30:00Z", "message":"sample data2"...}
Discover模块数据探索
1 ) 核心界面功能拆解
Discover 时间过滤器 查询语法切换 字段分析面板 文档详情视图
2 ) 时间范围精准控制
| 模式 | 语法示例 | 特点 |
|---|---|---|
| Quick | Last 15 minutes | 预置常用区间 |
| Relative | Now-7d/d to Now | 动态相对时间 |
| Absolute | 2023-01-01T00:00:00Z | 精确到秒的绝对时间 |
3 ) 多语法查询实战
Lucene语法:
sql
response:200 AND extension:php # 状态码200且PHP文件请求
KQL(Kibana Query Language):
kql
geo.src: "CN" and os: "Windows" # 中国区Windows用户
DSL原生查询:
json
{
"query": {
"bool": {
"must": [
{ "match": { "geo.src": "CN" }},
{ "term": { "os.keyword": "Windows" }}
]
}
}
}
4 ) 字段深度分析技巧
- 字段统计:点击字段名 → 显示Top 5值分布(基于前500文档)
- 快速过滤:
+:添加包含条件(field: value)-:添加排除条件(NOT field: value)★:过滤字段存在(_exists_: field)
5 ) 文档上下文分析
- View Surrounding Documents:
- 展示目标日志前后相邻记录
- 关键参数:
interval控制时间范围 - 应用场景:故障排查时定位关联事件
数据探索 (Discover) 深度指南
1 ) 数据准备
bash
导入地理信息模板
curl -XPUT "http://localhost:9200/_template/geo_template" -H 'Content-Type: application/json' -d'
{
"index_patterns": ["logstash-*"],
"mappings": {
"properties": {
"geoip": {
"properties": {
"location": { "type": "geo_point" }
}
}
}
}
}'
批量导入测试数据
curl -XPOST "http://localhost:9200/logstash-2023.03.01/_bulk" --data-binary "@logs.json"
2 ) 界面功能解析
核心区域:
搜索栏 时间过滤器 字段过滤栏 字段统计面板 文档表格 文档详情视图
高级操作:
-
时间筛选:
- Quick:预设范围(如"Last 15 minutes")
- Relative:自定义相对时间
- Absolute:精确时间范围
-
查询语法切换:
kibana# KQL语法 (推荐) response.code : 200 and os : "Windows" # Lucene语法 response.code:200 AND os:"Windows" -
上下文查看:
View Surrounding Documents显示日志事件的相邻记录
Discover 模块操作解析:
-
时间范围过滤
- Quick Select:预设时间区间(如
Last 15 minutes) - Relative:相对时间(如
Now-7d to Now) - Absolute:绝对时间范围选择器
- Quick Select:预设时间区间(如
-
查询语法切换
kibana// Lucene 语法 status:200 AND extension:php // KQL 语法(推荐) status:200 and extension:php
- 启用路径:
Management → Advanced Settings → search:queryLanguage
-
字段过滤器
操作符 DSL等效 用途 is { "term": { "os": "win" } } 精确匹配 is not { "bool": { "must_not": [...] } } 排除匹配 exists { "exists": { "field": "ip" } } 字段存在性检查
工程示例:1
1 ) 方案1:基础服务封装
typescript
// kibana.service.ts
import { Injectable } from '@nestjs/common';
import { ElasticsearchService } from '@nestjs/elasticsearch';
@Injectable()
export class KibanaService {
constructor(private readonly esService: ElasticsearchService) {}
async createIndexPattern(indexName: string) {
return this.esService.indices.putTemplate({
name: `${indexName}_pattern`,
body: {
index_patterns: [`${indexName}-*`],
template: {
mappings: {
properties: {
timestamp: { type: 'date' },
// 其他字段映射...
}
}
}
}
});
}
}
2 ) 方案2:安全连接配置
typescript
// elastic.module.ts
import { Module } from '@nestjs/common';
import { ElasticsearchModule } from '@nestjs/elasticsearch';
@Module({
imports: [
ElasticsearchModule.register({
node: 'http://localhost:9200',
auth: {
username: 'elastic',
password: 'your_password'
},
ssl: {
ca: fs.readFileSync('./ca.crt'),
rejectUnauthorized: false
}
})
],
exports: [ElasticsearchModule]
})
export class ElasticModule {}
3 ) 方案3:异步脚本字段处理
typescript
async generateScriptField(index: string, script: string) {
return this.esService.updateByQuery({
index,
body: {
script: {
source: script,
lang: 'painless'
}
}
});
}
// 调用示例
await generateScriptField(
'logstash-*',
'ctx._source.full_message = ctx._source.service + ":" + ctx._source.message'
);
工程示例:2
1 ) 方案1:基础数据查询服务
typescript
// src/elastic/elastic.service.ts
import { Injectable } from '@nestjs/common';
import { ElasticsearchService } from '@nestjs/elasticsearch';
@Injectable()
export class ElasticService {
constructor(private readonly esService: ElasticsearchService) {}
async searchLogs(index: string, query: any) {
return this.esService.search({
index,
body: { query }
});
}
}
// src/discover/discover.controller.ts
import { Controller, Get, Query } from '@nestjs/common';
import { ElasticService } from '../elastic/elastic.service';
@Controller('discover')
export class DiscoverController {
constructor(private readonly elasticService: ElasticService) {}
@Get()
async getLogs(@Query('q') query: string) {
const dsl = {
bool: {
must: [ { query_string: { query } } ]
}
};
return this.elasticService.searchLogs('logstash-*', dsl);
}
}
2 ) 方案2:动态Scripted Fields处理
typescript
// 创建运行时字段
async createRuntimeField(indexPattern: string, fieldName: string, script: string) {
await this.esService.transport.request({
method: 'POST',
path: `/${indexPattern}/_runtime_mapping`,
body: {
runtime: {
[fieldName]: {
type: 'keyword',
script: { source: script }
}
}
}
});
}
// 使用示例
await createRuntimeField(
'filebeat-*',
'error_level',
"if (doc['log.level'].value == 'ERROR') { emit('CRITICAL') } else { emit('NORMAL') }"
);
3 ) 方案3:ES集群性能监控
配置建议:
yaml
config/kibana.yml 关键优化项
xpack.monitoring:
enabled: true
elasticsearch:
hosts: ["http://coordinating-node:9200"] # 专用协调节点
kibana:
collection.interval: 10s # 监控数据采集频率
ui.container.elasticsearch.enabled: true
NestJS监控端点:
typescript
// 获取集群健康状态
@Get('cluster-health')
async getClusterHealth() {
return this.esService.cluster.health();
}
// 索引性能分析
@Get('index-stats/:index')
async getIndexStats(@Param('index') index: string) {
return this.esService.indices.stats({ index });
}
工程示例:3
1 ) 方案1:基础连接配置
typescript
// src/elastic/elastic.module.ts
import { Module } from '@nestjs/common';
import { ElasticsearchModule } from '@nestjs/elasticsearch';
@Module({
imports: [
ElasticsearchModule.register({
node: 'http://es-coordinator:9200',
auth: {
username: process.env.ES_USER,
password: process.env.ES_PASS
},
ssl: {
ca: fs.readFileSync('./certs/ca.crt'),
rejectUnauthorized: false
}
})
],
exports: [ElasticsearchModule]
})
export class ElasticModule {}
2 ) 方案2:索引服务层封装
typescript
// src/search/search.service.ts
import { Injectable } from '@nestjs/common';
import { ElasticsearchService } from '@nestjs/elasticsearch';
@Injectable()
export class SearchService {
constructor(private readonly esService: ElasticsearchService) {}
async queryLogs(index: string, query: any) {
return this.esService.search({
index,
body: {
query: {
bool: {
filter: [
{ range: { "@timestamp": { gte: "now-1d" } } },
query
]
}
},
aggs: {
status_stats: { terms: { field: "status.keyword" } }
}
}
});
}
}
3 ) 方案3:安全与性能优化
yaml
elasticsearch.yml 协调节点配置
node.roles: [coordinating_only]
thread_pool.search.size: 8
thread_pool.search.queue_size: 1000
Kibana连接配置增强
elasticsearch.maxSockets: 50 # 最大连接数
elasticsearch.compression: true
elasticsearch.sniffOnStart: false
关键问题解决方案
-
性能调优
-
慢查询处理:调整
elasticsearch.requestTimeout(默认30000ms) -
大数据量分页:启用
search_after代替from/sizejsonPOST logs-*/_search { "size": 100, "sort": [{"@timestamp": "asc"}, {"_id": "asc"}], "search_after": [1654041600000, "abc123"] }
-
-
安全加固
-
TLS加密传输
-
RBAC权限控制
bash# 创建Kibana专属角色 POST _security/role/kibana_admin { "indices": [ { "names": [".kibana*", "logs-*"], "privileges": ["read", "view_index_metadata"] } ] }
-
Elasticsearch 生产配置要点
-
协调节点配置 (elasticsearch.yml)
yamlnode.roles: [coordinating_only] # 专用协调节点 thread_pool.search.size: 10 # 搜索线程数 thread_pool.search.queue_size: 500 # 队列容量 -
安全策略
bash# 创建Kibana专用角色 bin/elasticsearch-keystore create bin/elasticsearch-users roles kibana_role -a "kibana_system" -
性能监控配置
yaml# kibana.yml 追加 monitoring.ui.container.elasticsearch.enabled: true xpack.monitoring.collection.interval: 10000
可视化分析进阶技巧
-
时间序列优化:
- 使用
date_histogram聚合自动适配时间间隔 - 启用
auto间隔避免数据点过密
- 使用
-
字段格式实战:
json// 地理坐标转地图可视化 "format": { "id": "geo_point", "params": { "transform": "wkt" } } -
仪表板叙事(Storytelling):
- 通过Dashboard排列顺序构建数据故事线
- 利用时间动画展示趋势演变
最佳实践提示:
- 生产环境禁用
fielddata(针对text类型字段) - 定期清理
.kibana索引历史版本 - 使用Index Lifecycle Management(ILM)管理日志类索引