在使用ELK进行日志数据的可视化时,可以通过logstash地理插件(geoip)将IP地址转换为地理坐标,然后我们就可以利用坐标实现热力图、地区分布图等地图可视化数据。

但是在实际操作过程中,在定制图表的时候,会出现无法识别地理坐标(geo_point)的问题,在此对如何解决该问题汇总一二。

问题原因:

kibana在绘制地图数据需要用到地理坐标数据时,必须是geo_point类型,如果location经纬度坐标是number或String类型,则会出现无法识别的问题。

解决方案:

1)在Logstash输出数据至ES时指定映射模板(template),将location转换为geo_point类型;此方式的说明文章挺多,在此不再赘述。

2)在ES创建index template,在template的mapping配置中指定client.geo.location为geo_point类型;

PUT /_template/zglive_template
{
	"order" : 1,
    "version" : 1,
    "index_patterns" : [
      "zglive-*"
    ],
    "settings" : { },
	"aliases" : { },
	"mappings" : {
      "properties" : {
        "client": {
        "properties": {
          "geo": {
            "properties": {
			  "location": {
				"type" : "geo_point"
			  }
            }
          }
        }
      }
      }
    }
}

index template应用成功后,新生成的索引字段中cliet.geo.location字段类型已经变成geo_point类型,如图:

index template只会对新生成的索引生效,已经存在的索引不会发生变化。 

采坑记录:

1)通过以上方法指定index template后,Elasticsearch基于匹配索引名的索引模式将模板应用于新索引。之前产生的索引并不会自动应用模板实现字段的转换,这会导致mapping conflict(字段映射冲突问题)。解决方法:reindex(重建索引),您可以结合使用_reindex和Painless来重新索引每日索引,以便将新模板应用于现有文档。

POST _reindex
{
  "source": {
    "index": "zglive-*"
  },
  "dest": {
    "index": "zglive"
  },
  "script": {
    "lang": "painless",
    "source": "ctx._index = 'zglive-' + (ctx._index.substring('zglive-'.length(), ctx._index.length())) + '-1'"
  }
}

通过_reindex配合painless重建每日索引,索引重建后,删除旧索引即可。

2)索引重建或更新后,index pattern并不会自动更新字段信息,需要手动刷新,如下图所示:

当前index pattern覆盖的所有索引字段冲突问题解决后,需要手动刷新才能看到冲突解决后的正确的字段信息。

 总结:

使用ELK的地理插件获取地理信息后,需要进行字段映射将client.geo.location字段映射为geo_point类型,如果在已有索引的情况下新增字段映射,会导致新旧索引的字段映射冲突(mapping conflict),解决字段映射冲突的办法是重建旧索引。

Logo

永洪科技,致力于打造全球领先的数据技术厂商,具备从数据应用方案咨询、BI、AIGC智能分析、数字孪生、数据资产、数据治理、数据实施的端到端大数据价值服务能力。

更多推荐