一、ES Mapping创建
collector启动时,创建writer时会自动设置service、mapping的模板。
CreateSpanWriter
plugin/storage/factory.go:CreateSpanWriter
func (f *Factory) CreateSpanWriter() (spanstore.Writer, error) {
var writers []spanstore.Writer
for _, storageType := range f.SpanWriterTypes {
factory, ok := f.factories[storageType]
if !ok {
return nil, fmt.Errorf("no %s backend registered for span store", storageType)
}
// 调用具体的存储实现
writer, err := factory.CreateSpanWriter()
if err != nil {
return nil, err
}
writers = append(writers, writer)
}
ES的具体实现
plugin/storage/es/factory.go:createSpanWriter
func createSpanWriter(
mFactory metrics.Factory,
logger *zap.Logger,
client es.Client,
cfg config.ClientBuilder,
archive bool,
) (spanstore.Writer, error) {
var tags []string
if cfg.GetTagsFilePath() != "" {
var err error
if tags, err = loadTagsFromFile(cfg.GetTagsFilePath()); err != nil {
logger.Error("Could not open file with tags", zap.Error(err))
return nil, err
}
}
// 获取span service的模板文件
spanMapping, serviceMapping := GetMappings(cfg.GetNumShards(), cfg.GetNumReplicas(), client.GetVersion())
writer := esSpanStore.NewSpanWriter(esSpanStore.SpanWriterParams{
Client: client,
Logger: logger,
MetricsFactory: mFactory,
IndexPrefix: cfg.GetIndexPrefix(),
AllTagsAsFields: cfg.GetAllTagsAsFields(),
TagKeysAsFields: tags,
TagDotReplacement: cfg.GetTagDotReplacement(),
Archive: archive,
UseReadWriteAliases: cfg.GetUseReadWriteAliases(),
})
// 判断是否需要创建索引模板
if cfg.IsCreateIndexTemplates() {
err := writer.CreateTemplates(spanMapping, serviceMapping)
if err != nil {
return nil, err
}
}
return writer, nil
}
二、Mapping相关
mapping文件
jaeger1.13版本将相关文件放到目录:plugin/storage/es/mappings下,jaeger-span.json是span的定义,jaeger-span-7.json对ES7进行支持。
jaeger1.7版本是直接写在代码中的。
静态资源引入
Java程序可以打个jar包,把所需要的资源文件放到包内,但是go直接编译为二进制包,没办法把jaeger-span.json文件放到包内。怎么办?可以尝试搜索一下GO静态资源打包,基本原理都是将资源文件打包为go文件,资源内容作为字符串定义在go中。
Jaeger实现方式是使用esc(https://github.com/mjibson/esc),将文件打包成文件plugin\storage\es\mappings\gen_assets.go。
三、思考
1 ES索引删除
系统正在运行,手动清除ES索引。会导致ES span的mapping丢失,进行检索的时候会又问题。例如:http状态码查询需要使用聚合查询,tags属性需要是个nest对象。
网友评论