elk-kibana视图-maps

maps介绍

最有效的还得看官网介绍,这里简单说明下:

  • 创建具有多个图层和索引的地图。
  • 将GeoJSON文件上传到Elasticsearch中。
  • 可把地图嵌入到仪表板中。
  • 绘制单个文档或使用聚合来绘制任何数据集,无论大小如何。
  • 创建Choropleth贴图。
  • 使用数据驱动的样式从属性值中符号化要素。
  • 通过搜索集中显示要显示的数据。

工作原理

maps插件是利用GeoIP获取地图上的详细信息并展示,所以,我们需要在elasticsearch中存储IP对应的geoip.location字段geo_point的类型。然后在kibana的maps上可以配置图层展示了。

准备工作

####ELKF版本介绍

Name Version
filebeat 7.2.0
ibana 7.6.2
elasticsearch 7.6.2
logstash 7.6.2

数据传输流程

服务日志

我这里测试用的是NGINX日志作为示例:

1
2
3
4
5
nginx {
...
log_format ... $remote_addr ... # nginx获取客户端IP的采集函数$remote_addr
...
}

请求日志信息:

1
2
3
xx.xx.com 202.12.22.151 - [14/May/2020:14:03:14 +0800] "POST /getArea?requestId=123 HTTP/1.1" 200

# 这里 202.12.22.151就是我们获取到的客户端IP地址

GeoIP数据库下载

可以通过上面GeoIP链接下载或则自行百度下载数据包,我这里存放至/opt/App/GeoIP目录下

logstash配置

通过filebeat工具传输至logstash,再由logstash进行过滤存储至elasticsearch,logstash过滤信息:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
input {
beats {
port => FILEBEAT_PORT
}
}

filter {
grok {
match => [
"message", '...%{IPV4:user_ip}...' # 匹配NGINX的IP规则
]
}

geoip {
source => "user_ip" # grok中定义的获取客户端IP变量user_ip
target => "geoip" # 标记为geoip模块
database => "/opt/App/GeoIP/GeoLite2-City.mmdb" # GeoIP数据
add_field => [ "[geoip][coordinates]", "%{[geoip][longitude]}" ]
add_field => [ "[geoip][coordinates]", "%{[geoip][latitude]}" ]
}

mutate {
convert => [ "[geoip][coordinates]", "float"]
convert => [ "responsetime", "float"]
}

date {
match => [ "timestamp" , "dd/MMM/YYYY:HH:mm:ss Z" ]
}
}

output {
elasticsearch {
hosts => ["http://ELASTICSEARCH_IP:ELASTICSEARCH_PORT"]
index => "logstash-nginx-%{[@metadata][beat]}-%{[@metadata][version]}-%{+YYYY.MM.dd}"
} # 索引文件必须以logstash开头
}

maps展示

由于kibana自带默认地图加载起来非常耗时,这里用的是高德地图,在kibana的配置文件末尾引入高德地图插件即可:

1
echo "map.tilemap.url: 'http://webrd02.is.autonavi.com/appmaptile?lang=zh_cn&size=1&scale=1&style=7&x={x}&y={y}&z={z}'" >> kibana.yml

完成后重启kibana服务

添加索引

请求下NGINX页面,并在kibana的配置管理中添加上述配置的索引

地图配置

依次选择maps菜单->创建地图->添加图层->文档->索引模式列表中选择你添加的索引即可:

最后效果