JaegerCollector存储

一、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。

image.png

三、思考

1 ES索引删除

系统正在运行,手动清除ES索引。会导致ES span的mapping丢失,进行检索的时候会又问题。例如:http状态码查询需要使用聚合查询,tags属性需要是个nest对象。

你可能感兴趣的:(JaegerCollector存储)