forked from jaegertracing/jaeger
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Signed-off-by: Harshvir Potpose <hpotpose62@gmail.com>
- Loading branch information
1 parent
6662e1c
commit 522e0ca
Showing
11 changed files
with
270 additions
and
4 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
service: | ||
extensions: [jaeger_storage, jaeger_query] | ||
pipelines: | ||
traces: | ||
receivers: [otlp] | ||
processors: [batch] | ||
exporters: [jaeger_storage_exporter] | ||
|
||
extensions: | ||
jaeger_query: | ||
trace_storage: memstore | ||
trace_storage_archive: memstore_archive | ||
ui_config: ./cmd/jaeger/config-ui.json | ||
|
||
jaeger_storage: | ||
badger_primary: | ||
memstore: | ||
directory_key: "/tmp/jaeger/" | ||
directory_value: "/tmp/jaeger/" | ||
ephemeral: false | ||
maintenance_interval: 5 | ||
metrics_update_interval: 10 | ||
memstore_archive: | ||
directory_key: "/tmp/jaeger_archive/" | ||
directory_value: "/tmp/jaeger_archive/" | ||
ephemeral: false | ||
maintenance_interval: 5 | ||
metrics_update_interval: 10 | ||
|
||
receivers: | ||
otlp: | ||
protocols: | ||
grpc: | ||
http: | ||
|
||
processors: | ||
batch: | ||
|
||
exporters: | ||
jaeger_storage_exporter: | ||
trace_storage: memstore |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
FIXME |
19 changes: 19 additions & 0 deletions
19
cmd/jaeger/integration/receivers/storagereceiver/config.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,19 @@ | ||
// Copyright (c) 2024 The Jaeger Authors. | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
package storagereceiver | ||
|
||
import ( | ||
"github.com/asaskevich/govalidator" | ||
|
||
badgerCfg "github.com/jaegertracing/jaeger/plugin/storage/badger" | ||
) | ||
|
||
type Config struct { | ||
Badger badgerCfg.NamespaceConfig `mapstructure:"badger"` | ||
} | ||
|
||
func (cfg *Config) Validate() error { | ||
_, err := govalidator.ValidateStruct(cfg) | ||
return err | ||
} |
32 changes: 32 additions & 0 deletions
32
cmd/jaeger/integration/receivers/storagereceiver/factory.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,32 @@ | ||
// Copyright (c) 2024 The Jaeger Authors. | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
package storagereceiver | ||
|
||
import ( | ||
"context" | ||
|
||
"go.opentelemetry.io/collector/component" | ||
"go.opentelemetry.io/collector/consumer" | ||
"go.opentelemetry.io/collector/receiver" | ||
) | ||
|
||
const componentType = component.Type("jaeger_storage_receiver") | ||
|
||
func NewFactory() receiver.Factory { | ||
return receiver.NewFactory( | ||
componentType, | ||
createDefaultConfig, | ||
receiver.WithTraces(createTraces, component.StabilityLevelDevelopment), | ||
) | ||
} | ||
|
||
func createDefaultConfig() component.Config { | ||
return &Config{} | ||
} | ||
|
||
func createTraces(ctx context.Context, set receiver.CreateSettings, config component.Config, nextConsumer consumer.Traces) (receiver.Traces, error) { | ||
cfg := config.(*Config) | ||
|
||
return newReceiver(cfg, set.TelemetrySettings, nextConsumer) | ||
} |
135 changes: 135 additions & 0 deletions
135
cmd/jaeger/integration/receivers/storagereceiver/receiver.go
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,135 @@ | ||
// Copyright (c) 2024 The Jaeger Authors. | ||
// SPDX-License-Identifier: Apache-2.0 | ||
|
||
package storagereceiver | ||
|
||
import ( | ||
"context" | ||
"fmt" | ||
|
||
jaeger2otlp "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger" | ||
"go.opentelemetry.io/collector/component" | ||
"go.opentelemetry.io/collector/consumer" | ||
"go.uber.org/zap" | ||
|
||
"github.com/jaegertracing/jaeger/model" | ||
"github.com/jaegertracing/jaeger/pkg/metrics" | ||
"github.com/jaegertracing/jaeger/plugin/storage/badger" | ||
"github.com/jaegertracing/jaeger/storage/spanstore" | ||
) | ||
|
||
type storageReceiver struct { | ||
cancelConsumeLoop context.CancelFunc | ||
config *Config | ||
logger *zap.Logger | ||
consumedTraces map[model.TraceID]*consumedTrace | ||
nextConsumer consumer.Traces | ||
spanReader spanstore.Reader | ||
} | ||
|
||
type consumedTrace struct { | ||
spanIDs map[model.SpanID]struct{} | ||
} | ||
|
||
func newReceiver(config *Config, otel component.TelemetrySettings, nextConsumer consumer.Traces) (*storageReceiver, error) { | ||
f, err := badger.NewFactoryWithConfig( | ||
config.Badger, | ||
metrics.NullFactory, | ||
otel.Logger, | ||
) | ||
if err != nil { | ||
return nil, fmt.Errorf("failed to init storage factory: %w", err) | ||
} | ||
|
||
spanReader, err := f.CreateSpanReader() | ||
if err != nil { | ||
return nil, fmt.Errorf("failed to create span reader: %w", err) | ||
} | ||
|
||
return &storageReceiver{ | ||
config: config, | ||
logger: otel.Logger, | ||
consumedTraces: make(map[model.TraceID]*consumedTrace), | ||
nextConsumer: nextConsumer, | ||
spanReader: spanReader, | ||
}, nil | ||
} | ||
|
||
func (r *storageReceiver) Start(_ context.Context, host component.Host) error { | ||
ctx, cancel := context.WithCancel(context.Background()) | ||
r.cancelConsumeLoop = cancel | ||
|
||
go func() { | ||
if err := r.consumeLoop(ctx); err != nil { | ||
host.ReportFatalError(err) | ||
} | ||
}() | ||
|
||
return nil | ||
} | ||
|
||
func (r *storageReceiver) consumeLoop(ctx context.Context) error { | ||
services := []string{"", "customers", "OTLPResourceNoServiceName"} | ||
|
||
for { | ||
for _, svc := range services { | ||
if err := r.consumeTraces(ctx, svc); err != nil { | ||
r.logger.Error("Error from consumer", zap.Error(err)) | ||
} | ||
if ctx.Err() != nil { | ||
r.logger.Error("Consumer stopped", zap.Error(ctx.Err())) | ||
return ctx.Err() | ||
} | ||
} | ||
} | ||
} | ||
|
||
func (r *storageReceiver) consumeTraces(ctx context.Context, serviceName string) error { | ||
traces, err := r.spanReader.FindTraces(ctx, &spanstore.TraceQueryParameters{ | ||
ServiceName: serviceName, | ||
}) | ||
if err != nil { | ||
return err | ||
} | ||
|
||
cnt := 0 | ||
for _, trace := range traces { | ||
cnt += len(trace.Spans) | ||
traceID := trace.Spans[0].TraceID | ||
if _, ok := r.consumedTraces[traceID]; !ok { | ||
r.consumedTraces[traceID] = &consumedTrace{ | ||
spanIDs: make(map[model.SpanID]struct{}), | ||
} | ||
} | ||
if len(trace.Spans) > len(r.consumedTraces[traceID].spanIDs) { | ||
r.consumeSpans(ctx, r.consumedTraces[traceID], trace.Spans) | ||
} | ||
} | ||
|
||
return nil | ||
} | ||
|
||
func (r *storageReceiver) consumeSpans(ctx context.Context, tc *consumedTrace, spans []*model.Span) error { | ||
for _, span := range spans { | ||
if _, ok := tc.spanIDs[span.SpanID]; !ok { | ||
tc.spanIDs[span.SpanID] = struct{}{} | ||
td, err := jaeger2otlp.ProtoToTraces([]*model.Batch{ | ||
{ | ||
Spans: []*model.Span{span}, | ||
Process: span.Process, | ||
}, | ||
}) | ||
if err != nil { | ||
return err | ||
} | ||
r.nextConsumer.ConsumeTraces(ctx, td) | ||
} | ||
} | ||
|
||
return nil | ||
} | ||
|
||
func (r *storageReceiver) Shutdown(_ context.Context) error { | ||
r.cancelConsumeLoop() | ||
return nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters