store/store.go (67 lines of code) (raw):

package store import ( "errors" "github.com/Azure/azure-kusto-go/kusto" "github.com/dodopizza/jaeger-kusto/config" "github.com/hashicorp/go-hclog" "github.com/jaegertracing/jaeger/plugin/storage/grpc/shared" "github.com/jaegertracing/jaeger/storage/dependencystore" "github.com/jaegertracing/jaeger/storage/spanstore" ) type store struct { dependencyStoreReader dependencystore.Reader reader spanstore.Reader writer spanstore.Writer } // NewStore creates new Kusto store for Jaeger span storage func NewStore(pc *config.PluginConfig, kc *config.KustoConfig, logger hclog.Logger) (shared.StoragePlugin, error) { var kcsb *kusto.ConnectionStringBuilder if kc.UseManagedIdentity { if kc.ClientID == "" { logger.Info("Using system managed identity") kcsb = kusto.NewConnectionStringBuilder(kc.Endpoint).WithSystemManagedIdentity() } else { logger.Info("Using user managed identity") kcsb = kusto.NewConnectionStringBuilder(kc.Endpoint).WithUserManagedIdentity(kc.ClientID) } } else { if kc.UseWorkloadIdentity { logger.Info("Using workload identity for authentication") kcsb = kusto.NewConnectionStringBuilder(kc.Endpoint).WithDefaultAzureCredential() } else { if kc.ClientID == "" || kc.ClientSecret == "" || kc.TenantID == "" { return nil, errors.New("missing client configuration (ClientId, ClientSecret, TenantId) for kusto") } logger.Info("Authenticating using AppId [%s] / Secret / TenantId [%s]", kc.ClientID, kc.TenantID) kcsb = kusto.NewConnectionStringBuilder(kc.Endpoint).WithAadAppKey(kc.ClientID, kc.ClientSecret, kc.TenantID) } } kcsb.SetConnectorDetails("Kusto Jaeger", "0.0.1", "plugin", "", false, "") client, err := kusto.New(kcsb) if err != nil { return nil, err } // create factory for trace table opertations factory := newKustoFactory(client, pc, kc.Database, kc.TraceTableName) reader, err := newKustoSpanReader(factory, logger, kc.ClientRequestOptions) if err != nil { return nil, err } writer, err := newKustoSpanWriter(factory, logger, pc) if err != nil { return nil, err } store := &store{ dependencyStoreReader: reader, reader: reader, writer: writer, } return store, nil } // DependencyReader returns implementation of dependencystore.Reader interface func (store *store) DependencyReader() dependencystore.Reader { return store.dependencyStoreReader } // SpanReader returns implementation of spanstore.Reader interface func (store *store) SpanReader() spanstore.Reader { return store.reader } // SpanWriter returns implementation of spanstore.Writer interface func (store *store) SpanWriter() spanstore.Writer { return store.writer }