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": [""], ## 监听的 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": [""],"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}}\"}"}} }}