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.usernameelasticsearch.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}}\"}"}} }}