1 Kibana
Kibana 是一个开源的分析与可视化平台,可以用 Kibana 搜索、查看存放在 Elasticsearch 中的数据,就跟谷歌的 elasticsearch head
插件类似,但 Kibana 与 Elasticsearch 的交互方式是各种不同的图表、表格、地图等,直观的展示数据,从而达到高级的数据分析与可视化的目的。
Elasticsearch、Logstash 和 Kibana 这三个技术就是常说的 ELK 技术栈,很典型的 MVC
思想,模型持久层,视图层和控制层。Logstash 担任控制层的角色,负责搜集和过滤数据。Elasticsearch担任数据持久层的角色,负责储存数据。而 Kibana 担任视图层角色,拥有各种维度的查询和分析,并使用图形化的界面展示存放在 Elasticsearch 中的数据。
1.1 Kibana 的安装与使用
去 官网 下载与对应 Elasticsearch 一致的版本,并解压,修改存放在 config
目录下核心配置文件 kibana.yml
,该文件所有的配置都是注释掉的,说明所有的配置都是使用默认的。
其中比较重点的配置如下
server.port
:服务的端口配置,默认是5601
server.host
:允许远程访问的地址配置,默认为本机,如果需要把 Kibana 服务给远程主机访问,只需要在这个配置中填写远程的那台主机的ip
地址,那如果希望所有的远程主机都能访问,那就填写0.0.0.0
elasticsearch.url
:连接 Elasticsearch 服务配置,默认为连接到本机的 Elasticsearch,并且端口为9200
,即localhost:9200
elasticsearch.username
和elasticsearch.password
: Elasticsearch的用户名和密码,默认是没有用户名和密码
使用以下命令运行 Kibana:
/usr/local/kibana-6.4.3/bin/kibana
Kibana默认的端口是 5601
,防火墙打开 5601
的端口后,在浏览器访问 ip:5601
就可以访问到 Kibana 了。
如下图添加 Index Patterns
创建好之后,回到 Discovery
就可以看到对应的视图了,同时还可以自定义添加筛选条件查看数据。
2 Watcher
Elasticsearch 提供了数据的存储及快速的搜索,而其中的 Watcher 功能可以实时地根据一些条件来发送警报。与 Elasticsearch 的使用一样,可以通过 Resfulapi 调用创建、管理、更新预警任务。
- 查看
watcher
插件是否正常运行,返回含有"watcher_state": "started"
则表示正常运行
GET /_cluster/health
配置一个 Watcher
,我们必须配置如下的几个:
PUT _watcher/watch/log_error_watch
{
"trigger": {},
"input": {},
"condition": {},
"transform" {},
"actions": {}
}
即一个 Watcher
由五个部分组成:
trigger
定义多长时间watcher
运行一次input
获取评估的数据condition
评估你加载到watch
中的数据并确定是否需要任何操作,比如已经将日志error
加载到watch
中,你可以定义一个条件来检查是否发现了某个特定的error
actions
操作,watch
的操作定义了当watch
条件评估为真时要做什么
PUT _xpack/watcher/watch/error_log_collector_watcher
{
## 定义5秒触发一次监听
"trigger": {
"schedule": {
"interval": "5s"
}
},
"input": {
"search": {
"request": {
"indices": ["<error_log_collector-{now+8h/d}>"], ## 监听的 Elasticsearch 索引
"body": {
"size": 0, ## 表示不查数据,不返回全部数据,只返回命中数
"query": {
"bool": {
"must": [
{
"term": {"level": "ERROR"} ## 匹配条件,日志级别为 error
}
],
"filter": {
"range": {
"currentDateTime": {
"gt": "now-30s" , "lt": "now" ## 筛选条件,currentDateTime 在 30 秒内
}
}
}
}
}
}
}
}
},
## 如果上面查询返回的命中数大于 0
"condition": {
"compare": {
"ctx.payload.hits.total": {
"gt": 0
}
}
},
## 数据转化,真正把数据查询出来
"transform": {
"search": {
"request": {
"indices": ["<error-log-collector-{now+8h/d}>"],
"body": {
"size": 1, ## 只返回一条
"query": {
"bool": {
"must": [
{
"term": {"level": "ERROR"}
}
],
"filter": {
"range": {
"currentDateTime": {
"gt": "now-30s" , "lt": "now"
}
}
}
}
},
"sort": [
{
"currentDateTime": {
"order": "desc"
}
}
]
}
}
}
},
## 满足 condition 条件后操作
"actions": {
"test_error": {
## 将错误信息发送到自定义的 api
"webhook" : {
"method" : "POST",
"url" : "http://192.168.212.128:8088/logCollector/accurateWatch",
"body" : "{\"title\": \"异常错误告警\", \"applicationName\": \"{{#ctx.payload.hits.hits}}{{_source.applicationName}}{{/ctx.payload.hits.hits}}\", \"level\":\"告警级别P1\", \"body\": \"{{#ctx.payload.hits.hits}}{{_source.messageInfo}}{{/ctx.payload.hits.hits}}\", \"executionTime\": \"{{#ctx.payload.hits.hits}}{{_source.currentDateTime}}{{/ctx.payload.hits.hits}}\"}"
}
}
}
}