想必很多时候我们都想直观的看出访问我们网站的用户是主要来自哪些地区的,kibana的作者在开发的时候也没少给大家福利,

已经内置了基于访问IP做用户热力地图展示的功能。所以也算是kibana给广大用户提供的一大福利,今天笔者就来带大家一起

做一个直观的热力地图出来。


热力地图需要在filter模块中使用geoip插件解析出用户访问IP所对应的地理位置信息并存储进ES,然后kibana从ES中抽取geoip

信息进行直观展示。


第一步,logstash配置部分

filter {

  if [type] == "nginx-access-log" {

    grok {

      match => { "message" => "%{HOSTNAME:logserver} %{PATH:logpath} %{NGINX_ACCESS_LOG}" }

      remove_field  => "message"

    }

    date {

      match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z", "yyyy/MM/dd HH:mm:ss" ]

    }

    geoip {

      source => "remote_addr"

    }

  }

}


geoip实际需要的配置比较少,但需要我们理解清楚这个配置的意义

source => "remote_addr"意思是解析remote_addr这个字段中保存的IP信息的地理位置

也就是说如何让IP和地图上的地理位置对应起来,是需要使用remote_addr字段中的IP进行

处理的,所以需要提前解析出remote_addr这个字段,当然这个字段名称不是死的,只

要能对应上就行。

    geoip {

      source => "remote_addr"

    }


做完这一步,我们可以通过控制台输出的方式直接查看goeip模块是否已经生效

  "_source": {

    "type": "nginx-access-log",

    "request_body": "\"-\"",

    "logpath": "/data/log/nginx/2hz-nginx-frontend-access.log",

    "@version": "1",

    "logserver": "web-1-test",

    "user_agent": "\"Mozilla/5.0 (Windows NT 5.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36\"",

    "remote_addr": "27.216.191.190",

    "geoip": {

      "timezone": "Asia/Shanghai",

      "region_name": "Shandong",

      "ip": "27.216.191.190",

      "latitude": 37.3592,

      "continent_code": "AS",

      "country_code2": "CN",

      "location": {

        "lat": 37.3592,

        "lon": 120.3964

      },

      "region_code": "37",

      "country_code3": "CN",

      "city_name": "Zhaoyuan",

      "longitude": 120.3964,

      "country_name": "China"

    },

    "@timestamp": "2018-10-26T01:43:54.000Z",

    "timestamp": "26/Oct/2018:09:43:54 +0800",

    "body_bytes": "245",

    "request": "\"GET /buy/load-numbers/99?_=1540507840931 HTTP/1.0\"",

    "status_code": "200",

    "upstream_response_time": "0.040",

    "http_referer": "\"https://www.test.com/buy/order/db30c\"",

    "remote_user": "-",

    "request_time": "0.041"

  }


如何能够看到如下的这一部分解析结果说明logstash部分配置正确

    "geoip": {

      "timezone": "Asia/Shanghai",

      "region_name": "Shandong",

      "ip": "27.216.191.190",

      "latitude": 37.3592,

      "continent_code": "AS",

      "country_code2": "CN",

      "location": {

        "lat": 37.3592,

        "lon": 120.3964

      },

      "region_code": "37",

      "country_code3": "CN",

      "city_name": "Zhaoyuan",

      "longitude": 120.3964,

      "country_name": "China"

    },


这一步中还需要补充说明一下的就是如果nginx的索引名称自定义过(不是使用logstash-开头的索引名称时),

就需要修改ES的映射模板,或者通过logstash管理自定义的mapping映射模板,否则自定义nginx索引不会把

geoip信息保存会geo_point类型,最后设定kibana时就会直接报错说“找不到goe_point类型的字段,以致

无法实现展示地图的效果。


关于如何自定义nginx映射模板问题请参阅博文https://blog.51cto.com/183530300/2308763


第二步:kibana页面上的设定

点击visualize选项卡-->点击搜索栏右边的“+”-->选择"Coordinate Map"-->"From a New Search, Select Index"-->选择nginx的索引模式-->点击“Geo Coordinates”-->点击“Aggregation”下拉前头-->选择“GeoHash”-->field字段选择“geoip.location”-->

点击索引名称下文的“Apply changes”按键,就可以看到热力地图了。

想要保存刚才所做的配置的话,只需要点击页面最上方的“Save”按钮就可以给自己的热力配置命个名称并保存。

ELK-基于用户访问IP做用户热力地图展示_第1张图片

到此为止,想要的热力地图就要拿去给同种秀一秀了。还可以把热力地图做为Dashboard的一部分,和其它图形

放在一直进行综合展示,只要能把自己想要的图形做出来,向综合页面添加就太简单了。