Zipkin整合elasticsearch遇到的问题
问题描述
由于Zipkin默认将数据存储在内存中,这种方式不便于扩展也不能持久化,因此准备使用官方推荐的方式,将Zipkin与es进行集成。根据官方文档在开发环境进行了设置可以正常启动Zipkin,但同样的方式到了测试环境发现Zipkin启动没报错,页面正常展示但无法显示trace数据。
通过设置启动参数--logging.level.zipkin2=DEBUG
更改了日志级别,启动后看到了如下的错误信息:
java.lang.IllegalStateException: {"took":0,"errors":true,"items":[{"index":{"_index":"zipkin:span-2019-03-12","_type":"span","_id":null,"status":404,"error":{"type":"index_not_found_exception","reason":"no such index and [action.auto_create_index] ([.security,.monitoring*,.watches,.triggered_watches,.watcher-history*]) doesn't match","index_uuid":"_na_","index":"zipkin:span-2019-03-12"}}}]}
at zipkin2.elasticsearch.internal.HttpBulkIndexer$CheckForErrors.convert(HttpBulkIndexer.java:77) ~[zipkin-storage-elasticsearch-2.12.2.jar!/:?]
at zipkin2.elasticsearch.internal.HttpBulkIndexer$CheckForErrors.convert(HttpBulkIndexer.java:71) ~[zipkin-storage-elasticsearch-2.12.2.jar!/:?]
at zipkin2.elasticsearch.internal.client.HttpCall.parseResponse(HttpCall.java:148) ~[zipkin-storage-elasticsearch-2.12.2.jar!/:?]
at zipkin2.elasticsearch.internal.client.HttpCall$V2CallbackAdapter.onResponse(HttpCall.java:125) [zipkin-storage-elasticsearch-2.12.2.jar!/:?]
at okhttp3.RealCall$AsyncCall.execute(RealCall.java:216) [okhttp-3.13.1.jar!/:?]
at okhttp3.internal.NamedRunnable.run(NamedRunnable.java:32) [okhttp-3.13.1.jar!/:?]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [?:1.8.0_181]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [?:1.8.0_181]
at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
看到action.auto_create_index
字段怀疑是在es中无法创建索引造成数据无法写入es中,手动在es中创建了对应的索引后Zipkin回复正常运行,这进一步证明了我的猜想。
问题处理
在开发和测试环境es的elasticsearch.yml
配置中果然看出了差别,开发环境的默认没有配置action.auto_create_index
字段,而测试环境对其进行了配置,这说明该字段不设置时默认是开启状态。进一步查询了es的文档,简要说明如下:
向es中插入数据时,如果没有对应的索引,那么默认会直接创建这个索引;并且type字段也会自动创建。也就是说,es并不需要像传统的数据库那样事先定义表的结构。
每个索引中的类型都有一个mapping映射,这个映射是动态生成的,因此当增加新的字段时,会自动增加mapping的设置。
通过在配置文件中设置action.auto_create_index
为false,可以关闭自动创建index这个功能。
自动创建索引功能,也可以设置黑名单或者白名单,比如:
action.auto_create_index:+aaa*,-bbb*
,这里'+'号意味着允许创建aaa开头的索引,'-'号意味着不允许创建bbb开头的索引。
于是既为了es的安全性,又考虑到Zipkin的使用,于是我使用了白名单的配置方式action.auto_create_index:+zipkin*
,问题解决。