From 998fe18617a5fa520358e33e2167581b32b58724 Mon Sep 17 00:00:00 2001 From: James Ryans Date: Tue, 16 Jan 2024 14:54:06 +0700 Subject: [PATCH 01/13] Add jaeger-v2 kafka exporter and receiver configuration Signed-off-by: James Ryans --- .gitignore | 1 + Makefile | 10 + cmd/jaeger/collector-with-kafka.yaml | 30 ++ cmd/jaeger/ingester-with-remote.yaml | 31 ++ cmd/jaeger/ingester.yaml | 32 ++ cmd/jaeger/integration/README.md | 16 + cmd/jaeger/integration/datareceivers/.nocover | 1 + .../datareceivers/jaegerstorage.go | 59 ++++ cmd/jaeger/integration/datareceivers/kafka.go | 57 ++++ .../fixtures/generated_pict_pairs_spans.txt | 307 ++++++++++++++++++ .../fixtures/generated_pict_pairs_traces.txt | 33 ++ .../integration/fixtures/pict_input_spans.txt | 14 + .../fixtures/pict_input_traces.txt | 3 + cmd/jaeger/integration/kafka_diagram.jpeg | Bin 0 -> 237338 bytes cmd/jaeger/integration/kafka_test.go | 102 ++++++ .../receivers/storagereceiver/.nocover | 1 + .../receivers/storagereceiver/config.go | 19 ++ .../receivers/storagereceiver/factory.go | 33 ++ .../receivers/storagereceiver/receiver.go | 142 ++++++++ cmd/jaeger/internal/command.go | 2 +- cmd/jaeger/internal/components.go | 2 +- .../extension/jaegerstorage/config.go | 2 + .../extension/jaegerstorage/extension.go | 15 + go.mod | 41 ++- go.sum | 62 +++- idl | 2 +- jaeger-ui | 2 +- plugin/storage/grpc/factory.go | 14 + scripts/otel-kafka-integration-test.sh | 83 +++++ 29 files changed, 1087 insertions(+), 29 deletions(-) create mode 100644 cmd/jaeger/collector-with-kafka.yaml create mode 100644 cmd/jaeger/ingester-with-remote.yaml create mode 100644 cmd/jaeger/ingester.yaml create mode 100644 cmd/jaeger/integration/README.md create mode 100644 cmd/jaeger/integration/datareceivers/.nocover create mode 100644 cmd/jaeger/integration/datareceivers/jaegerstorage.go create mode 100644 cmd/jaeger/integration/datareceivers/kafka.go create mode 100644 cmd/jaeger/integration/fixtures/generated_pict_pairs_spans.txt create mode 100644 cmd/jaeger/integration/fixtures/generated_pict_pairs_traces.txt create mode 100644 cmd/jaeger/integration/fixtures/pict_input_spans.txt create mode 100644 cmd/jaeger/integration/fixtures/pict_input_traces.txt create mode 100644 cmd/jaeger/integration/kafka_diagram.jpeg create mode 100644 cmd/jaeger/integration/kafka_test.go create mode 100644 cmd/jaeger/integration/receivers/storagereceiver/.nocover create mode 100644 cmd/jaeger/integration/receivers/storagereceiver/config.go create mode 100644 cmd/jaeger/integration/receivers/storagereceiver/factory.go create mode 100644 cmd/jaeger/integration/receivers/storagereceiver/receiver.go create mode 100755 scripts/otel-kafka-integration-test.sh diff --git a/.gitignore b/.gitignore index a66dcb760cd..af6f463bdda 100644 --- a/.gitignore +++ b/.gitignore @@ -27,6 +27,7 @@ cmd/collector/collector cmd/collector/collector-* cmd/ingester/ingester cmd/ingester/ingester-* +cmd/jaeger/integration/results cmd/remote-storage/remote-storage cmd/remote-storage/remote-storage-* cmd/es-index-cleaner/es-index-cleaner-* diff --git a/Makefile b/Makefile index dec6b58afe8..1d6920ffe81 100644 --- a/Makefile +++ b/Makefile @@ -4,6 +4,7 @@ SHELL := /bin/bash JAEGER_IMPORT_PATH = github.com/jaegertracing/jaeger STORAGE_PKGS = ./plugin/storage/integration/... +OTEL_INTEGRATION_PATH = ./cmd/jaeger/integration/... # These DOCKER_xxx vars are used when building Docker images. DOCKER_NAMESPACE?=jaegertracing @@ -141,6 +142,15 @@ index-rollover-integration-test: docker-images-elastic go clean -testcache bash -c "set -e; set -o pipefail; $(GOTEST) -tags index_rollover -coverpkg=./... -coverprofile cover-index-rollover.out $(STORAGE_PKGS) $(COLORIZE)" +# Don't detect data race because testbed has race condition issue +.PHONY: otel-integration-test +otel-integration-test: GOTEST := GOCACHE=$(GOCACHE) $(GO) test -v +otel-integration-test: + # Expire tests results for storage integration tests since the environment might change + # even though the code remains the same. + go clean -testcache + bash -c "set -e; set -o pipefail; $(GOTEST) -coverpkg=./... -coverprofile cover.out $(OTEL_INTEGRATION_PATH) $(COLORIZE)" + .PHONY: cover cover: nocover bash -c "set -e; set -o pipefail; $(GOTEST) -tags=memory_storage_integration -timeout 5m -coverprofile cover.out ./... | tee test-results.json" diff --git a/cmd/jaeger/collector-with-kafka.yaml b/cmd/jaeger/collector-with-kafka.yaml new file mode 100644 index 00000000000..41dc206badd --- /dev/null +++ b/cmd/jaeger/collector-with-kafka.yaml @@ -0,0 +1,30 @@ +service: + pipelines: + traces: + receivers: [otlp, jaeger, zipkin] + processors: [batch] + exporters: [kafka] + +receivers: + otlp: + protocols: + grpc: + http: + + jaeger: + protocols: + grpc: + thrift_binary: + thrift_compact: + thrift_http: + + zipkin: + +processors: + batch: + +exporters: + kafka: + brokers: + - localhost:9092 + encoding: otlp_proto # available encodings are otlp_proto, jaeger_proto, jaeger_json, zipkin_proto, zipkin_json, zipkin_thrift diff --git a/cmd/jaeger/ingester-with-remote.yaml b/cmd/jaeger/ingester-with-remote.yaml new file mode 100644 index 00000000000..52ff7f68ef0 --- /dev/null +++ b/cmd/jaeger/ingester-with-remote.yaml @@ -0,0 +1,31 @@ +service: + extensions: [jaeger_storage] + pipelines: + traces: + receivers: [kafka] + processors: [batch] + exporters: [jaeger_storage_exporter] # same as in the default cmd/jaeger-v2/config.yaml + telemetry: + metrics: + address: 0.0.0.0:8889 # to avoid port conflict with collector-with-kafka.yaml + +extensions: + jaeger_storage: + grpc: + memstore: + server: localhost:17271 + connection-timeout: 5s + +receivers: + kafka: + brokers: + - localhost:9092 + encoding: otlp_proto # available encodings are otlp_proto, jaeger_proto, jaeger_json, zipkin_proto, zipkin_json, zipkin_thrift + initial_offset: earliest # consume messages from the beginning + +processors: + batch: + +exporters: + jaeger_storage_exporter: + trace_storage: memstore diff --git a/cmd/jaeger/ingester.yaml b/cmd/jaeger/ingester.yaml new file mode 100644 index 00000000000..cfc02b91936 --- /dev/null +++ b/cmd/jaeger/ingester.yaml @@ -0,0 +1,32 @@ +service: + extensions: [jaeger_storage] + pipelines: + traces: + receivers: [kafka] + processors: [batch] + exporters: [jaeger_storage_exporter] # same as in the default cmd/jaeger-v2/config.yaml + telemetry: + metrics: + address: 0.0.0.0:8889 # to avoid port conflict with collector-with-kafka.yaml + +extensions: + jaeger_storage: + memory: + memstore: + max_traces: 100000 + memstore_archive: + max_traces: 100000 + +receivers: + kafka: + brokers: + - localhost:9092 + encoding: otlp_proto # available encodings are otlp_proto, jaeger_proto, jaeger_json, zipkin_proto, zipkin_json, zipkin_thrift + initial_offset: earliest # consume messages from the beginning + +processors: + batch: + +exporters: + jaeger_storage_exporter: + trace_storage: memstore diff --git a/cmd/jaeger/integration/README.md b/cmd/jaeger/integration/README.md new file mode 100644 index 00000000000..b382c31c7cd --- /dev/null +++ b/cmd/jaeger/integration/README.md @@ -0,0 +1,16 @@ +# Integration + +Jaeger v2 integration tests are built on top of [OTEL Testbed module](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/testbed). OTEL Testbed provide comprehensive tools for conducting end-to-end tests for the OTEL Collector, such as reproducible short-term benchmarks, correctness tests, long-running stability tests and maximum load stress tests. To learn more about OTEL Testbed, please refer to the their [README](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/testbed/README.md) + +## kafka_test + +Kafka e2e test checks if the pipelines through `kafka` and finally at `remote-storage` have stored match exactly with the provided data using `GoldenDataProvider` (Provides data from the "Golden" dataset generated using pairwise combinatorial testing a.k.a PICT techniques for use in correctness tests) and validated using `CorrectnessTestValidator`. + +The pipelines are checked in 2 steps, which the first test case verifies if the spans sent to Kafka are correct, and the second one checks the spans stored in the remote storage. +![kafka diagram](kafka_diagram.jpeg) + +To conduct the tests, run the following command: + +``` +scripts/otel-kafka-integration-test.sh [kafka_version=latest] [remote_storage_version=latest] +``` diff --git a/cmd/jaeger/integration/datareceivers/.nocover b/cmd/jaeger/integration/datareceivers/.nocover new file mode 100644 index 00000000000..9d6cf4b7fb6 --- /dev/null +++ b/cmd/jaeger/integration/datareceivers/.nocover @@ -0,0 +1 @@ +FIXME diff --git a/cmd/jaeger/integration/datareceivers/jaegerstorage.go b/cmd/jaeger/integration/datareceivers/jaegerstorage.go new file mode 100644 index 00000000000..1d9cf40f9bf --- /dev/null +++ b/cmd/jaeger/integration/datareceivers/jaegerstorage.go @@ -0,0 +1,59 @@ +// Copyright (c) 2024 The Jaeger Authors. +// SPDX-License-Identifier: Apache-2.0 + +package datareceivers + +import ( + "context" + "fmt" + "time" + + "github.com/open-telemetry/opentelemetry-collector-contrib/testbed/testbed" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/receiver" + "go.opentelemetry.io/collector/receiver/receivertest" + + "github.com/jaegertracing/jaeger/cmd/jaeger/integration/receivers/storagereceiver" +) + +type jaegerStorageDataReceiver struct { + Port int + receiver receiver.Traces +} + +func NewJaegerStorageDataReceiver(port int) testbed.DataReceiver { + return &jaegerStorageDataReceiver{Port: port} +} + +func (dr *jaegerStorageDataReceiver) Start(tc consumer.Traces, _ consumer.Metrics, _ consumer.Logs) error { + factory := storagereceiver.NewFactory() + cfg := factory.CreateDefaultConfig().(*storagereceiver.Config) + cfg.GRPC.RemoteServerAddr = fmt.Sprintf("localhost:%d", dr.Port) + cfg.GRPC.RemoteConnectTimeout = time.Duration(5 * time.Second) + // TODO add support for other backends + + var err error + set := receivertest.NewNopCreateSettings() + dr.receiver, err = factory.CreateTracesReceiver(context.Background(), set, cfg, tc) + if err != nil { + return err + } + + return dr.receiver.Start(context.Background(), componenttest.NewNopHost()) +} + +func (dr *jaegerStorageDataReceiver) Stop() error { + return dr.receiver.Shutdown(context.Background()) +} + +func (dr *jaegerStorageDataReceiver) GenConfigYAMLStr() string { + return fmt.Sprintf(` + jaeger_storage_receiver: + grpc-plugin: + server: localhost:%d`, dr.Port) +} + +func (dr *jaegerStorageDataReceiver) ProtocolName() string { + return "jaeger_storage_receiver" +} diff --git a/cmd/jaeger/integration/datareceivers/kafka.go b/cmd/jaeger/integration/datareceivers/kafka.go new file mode 100644 index 00000000000..09b0b7c3e46 --- /dev/null +++ b/cmd/jaeger/integration/datareceivers/kafka.go @@ -0,0 +1,57 @@ +// Copyright (c) 2024 The Jaeger Authors. +// SPDX-License-Identifier: Apache-2.0 + +package datareceivers + +import ( + "context" + "fmt" + + "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver" + "github.com/open-telemetry/opentelemetry-collector-contrib/testbed/testbed" + "go.opentelemetry.io/collector/component/componenttest" + "go.opentelemetry.io/collector/consumer" + "go.opentelemetry.io/collector/receiver" + "go.opentelemetry.io/collector/receiver/receivertest" +) + +type kafkaDataReceiver struct { + testbed.DataReceiverBase + receiver receiver.Traces +} + +func NewKafkaDataReceiver(port int) testbed.DataReceiver { + return &kafkaDataReceiver{DataReceiverBase: testbed.DataReceiverBase{Port: port}} +} + +func (dr *kafkaDataReceiver) Start(tc consumer.Traces, _ consumer.Metrics, _ consumer.Logs) error { + factory := kafkareceiver.NewFactory() + cfg := factory.CreateDefaultConfig().(*kafkareceiver.Config) + cfg.Brokers = []string{fmt.Sprintf("localhost:%d", dr.Port)} + cfg.GroupID = "testbed_collector" + + var err error + set := receivertest.NewNopCreateSettings() + dr.receiver, err = factory.CreateTracesReceiver(context.Background(), set, cfg, tc) + if err != nil { + return err + } + + return dr.receiver.Start(context.Background(), componenttest.NewNopHost()) +} + +func (dr *kafkaDataReceiver) Stop() error { + return dr.receiver.Shutdown(context.Background()) +} + +func (dr *kafkaDataReceiver) GenConfigYAMLStr() string { + return fmt.Sprintf(` + kafka: + brokers: + - localhost:%d + encoding: otlp_proto`, dr.Port) +} + +func (dr *kafkaDataReceiver) ProtocolName() string { + return "kafka" +} diff --git a/cmd/jaeger/integration/fixtures/generated_pict_pairs_spans.txt b/cmd/jaeger/integration/fixtures/generated_pict_pairs_spans.txt new file mode 100644 index 00000000000..138f2974806 --- /dev/null +++ b/cmd/jaeger/integration/fixtures/generated_pict_pairs_spans.txt @@ -0,0 +1,307 @@ +Parent Tracestate Kind Attributes Events Links Status +Root Empty Producer FaaSPubSub Empty Empty Ok +Child One Internal Internal Empty Empty Ok +Child Four Producer Empty Empty Empty Ok +Child One Unspecified gRPCServer Eight Empty Unset +Root Four Server HTTPServer One Empty Unset +Child Four Unspecified Internal Two Empty Ok +Root Four Producer Empty Empty Empty Unset +Child Four Server FaaSHTTP Empty Empty Unset +Child Empty Server FaaSHTTP Two Empty Error +Child Four Unspecified MessagingConsumer Two Empty Ok +Child One Producer MessagingProducer One Empty Unset +Child One Internal Internal Eight Empty Error +Child One Server FaaSTimer Eight Empty Ok +Root Empty Server FaaSTimer Two Empty Ok +Child Four Unspecified FaaSDatasource One Empty Ok +Child One Unspecified HTTPServer One Empty Ok +Root One Server gRPCServer One Empty Ok +Child Empty Unspecified DatabaseNoSQL One Empty Ok +Child One Client DatabaseNoSQL Empty Empty Error +Child Four Client HTTPClient Eight Empty Ok +Root Four Producer Empty One Empty Error +Root One Server FaaSTimer Empty Empty Ok +Child Four Consumer FaaSDatasource Eight Empty Unset +Child One Server FaaSOther Two Empty Ok +Child Four Server FaaSHTTP Two Empty Error +Child Four Unspecified gRPCClient Two Empty Ok +Root Four Producer MessagingProducer Two Empty Ok +Root One Server MaxCount Eight Empty Ok +Child Four Server MaxCount Two Empty Unset +Child One Client gRPCClient Empty Empty Error +Root Empty Producer FaaSPubSub One Empty Unset +Child Four Server FaaSTimer Two Empty Ok +Child One Producer MessagingProducer Two Empty Unset +Child Four Unspecified Empty One Empty Ok +Root One Server FaaSHTTP Eight Empty Error +Child Four Client DatabaseNoSQL Two Empty Ok +Child Empty Unspecified FaaSPubSub Eight Empty Ok +Child Empty Server gRPCServer Eight Empty Error +Child Four Client DatabaseNoSQL Two Empty Error +Root One Producer MessagingProducer One Empty Unset +Root One Server FaaSTimer One Empty Ok +Child Four Internal Internal Eight Empty Error +Child One Client DatabaseNoSQL Two Empty Error +Child Four Unspecified gRPCClient One Empty Error +Root Four Server FaaSTimer Empty Empty Ok +Child Four Client HTTPClient Eight Empty Error +Child Empty Unspecified Empty Two Empty Ok +Child One Server HTTPServer Eight Empty Ok +Child Empty Unspecified gRPCClient Empty Empty Ok +Child One Unspecified Internal Two Empty Error +Child Four Unspecified MessagingConsumer Empty Empty Ok +Child Empty Unspecified FaaSDatasource Empty Empty Error +Root One Producer MessagingProducer One Empty Ok +Child Four Unspecified DatabaseNoSQL One Empty Error +Root One Server HTTPServer Two Empty Unset +Child One Producer Empty Eight Empty Unset +Child One Unspecified DatabaseNoSQL One Empty Unset +Child Four Client DatabaseNoSQL Eight Empty Unset +Child Empty Unspecified Internal One Empty Ok +Child One Unspecified MessagingProducer Eight Empty Unset +Child Four Server FaaSOther Empty Empty Ok +Child Empty Consumer MessagingConsumer Eight Empty Unset +Child One Server FaaSOther Empty Empty Ok +Child Empty Unspecified MaxCount Empty Empty Error +Child Four Producer FaaSPubSub Two Empty Unset +Child One Client Empty One Empty Ok +Child Empty Producer Empty One Empty Unset +Child Four Client DatabaseSQL Eight Empty Error +Child Four Server FaaSOther Eight Empty Unset +Root Empty Server FaaSHTTP Two Empty Ok +Child One Client DatabaseSQL Eight Empty Unset +Child One Unspecified FaaSHTTP Empty Empty Error +Child One Unspecified MessagingProducer Eight Empty Ok +Child Empty Consumer MessagingConsumer Two Empty Unset +Child Empty Unspecified DatabaseNoSQL Two Empty Error +Child Four Unspecified FaaSDatasource Empty Empty Error +Child One Unspecified MaxCount Empty Empty Ok +Child One Unspecified FaaSDatasource Eight Empty Unset +Child Four Consumer MessagingConsumer Empty Empty Error +Child Four Client Empty Eight Empty Ok +Child One Consumer MessagingConsumer One Empty Error +Child One Client gRPCClient Eight Empty Error +Child Four Unspecified FaaSTimer Two Empty Error +Child One Client gRPCClient Eight Empty Ok +Child Empty Server FaaSHTTP Empty Empty Error +Child Four Unspecified FaaSOther Empty Empty Unset +Child Empty Consumer MessagingConsumer One Empty Ok +Child Four Client DatabaseSQL Eight Empty Unset +Child Four Unspecified MessagingProducer Empty Empty Ok +Child One Client DatabaseSQL Empty Empty Ok +Root Four Server FaaSOther Empty Empty Ok +Child Four Unspecified gRPCClient One Empty Unset +Child Empty Unspecified HTTPServer Two Empty Ok +Root One Producer Empty Eight Empty Ok +Child One Producer FaaSPubSub One Empty Error +Root Four Server FaaSHTTP Two Empty Ok +Child One Unspecified DatabaseSQL Two Empty Ok +Root Empty Server FaaSTimer Empty Empty Error +Child One Server MaxCount One Empty Unset +Child One Producer Empty Two Empty Unset +Child Four Server HTTPServer Eight Empty Unset +Root Empty Server HTTPServer One Empty Ok +Child Four Server FaaSOther One Empty Unset +Child One Producer Empty One Empty Unset +Child One Producer MessagingProducer One Empty Error +Child One Unspecified gRPCClient Two Empty Ok +Root Empty Server HTTPServer Eight Empty Error +Child Empty Unspecified FaaSHTTP One Empty Ok +Root One Server FaaSHTTP One Empty Unset +Child Four Unspecified MessagingConsumer Eight Empty Error +Child Empty Unspecified FaaSPubSub Two Empty Unset +Child Empty Client DatabaseSQL Two Empty Ok +Child Four Unspecified Empty Empty Empty Error +Child Empty Producer FaaSPubSub Eight Empty Ok +Child Four Producer Empty Two Empty Unset +Child Four Unspecified MessagingProducer Eight Empty Ok +Child Empty Unspecified MessagingProducer One Empty Error +Child Empty Server MaxCount One Empty Unset +Root Four Server FaaSHTTP One Empty Ok +Child Empty Server HTTPServer Two Empty Unset +Child One Unspecified Empty One Empty Ok +Child Empty Server gRPCServer Empty Empty Error +Child Four Unspecified gRPCServer One Empty Ok +Child Four Consumer MessagingConsumer Eight Empty Ok +Child Empty Unspecified DatabaseSQL Empty Empty Unset +Child Four Producer MessagingProducer Empty Empty Unset +Child One Client Empty Two Empty Error +Child Four Unspecified gRPCServer Empty Empty Unset +Child Empty Producer FaaSPubSub Two Empty Error +Child One Unspecified FaaSTimer Two Empty Unset +Child Empty Internal Internal One Empty Ok +Child One Client DatabaseSQL Empty Empty Error +Child Four Producer Empty Empty Empty Error +Child Four Unspecified FaaSTimer Empty Empty Unset +Child Four Client gRPCClient Two Empty Unset +Child Empty Unspecified Internal One Empty Error +Root Empty Server FaaSHTTP Empty Empty Error +Child Empty Server FaaSTimer Two Empty Unset +Child Four Consumer MessagingConsumer Empty Empty Unset +Child Empty Unspecified Internal Empty Empty Ok +Child Empty Producer MessagingProducer Two Empty Error +Child Four Client Empty Eight Empty Error +Child One Client DatabaseNoSQL One Empty Unset +Child Empty Client Empty Eight Empty Ok +Child One Server FaaSTimer One Empty Error +Child One Producer FaaSPubSub Eight Empty Ok +Child One Unspecified FaaSPubSub One Empty Ok +Child Empty Producer Empty Eight Empty Ok +Child Four Unspecified FaaSHTTP Empty Empty Unset +Child One Unspecified FaaSHTTP Empty Empty Ok +Child Empty Producer MessagingProducer One Empty Error +Child One Consumer FaaSDatasource One Empty Ok +Child One Client HTTPClient Eight Empty Error +Child Four Unspecified MaxCount Two Empty Ok +Root Empty Server HTTPServer Empty Empty Ok +Child Four Server HTTPServer Empty Empty Error +Child Four Internal Internal One Empty Error +Child Empty Server FaaSTimer Two Empty Error +Root Four Producer FaaSPubSub Two Empty Ok +Child Four Unspecified FaaSDatasource Eight Empty Error +Child One Unspecified DatabaseNoSQL Two Empty Error +Root One Server FaaSHTTP One Empty Error +Child Empty Server gRPCServer Two Empty Unset +Root Empty Producer Empty Empty Empty Error +Child Four Unspecified FaaSPubSub One Empty Error +Child One Unspecified FaaSHTTP Eight Empty Error +Child One Server MaxCount Two Empty Unset +Root Four Server FaaSOther Eight Empty Error +Child Empty Client DatabaseNoSQL Empty Empty Error +Child One Client Empty Empty Empty Error +Root Empty Server FaaSTimer One Empty Ok +Child One Consumer FaaSDatasource Empty Empty Ok +Child Empty Unspecified MessagingProducer Empty Empty Error +Child One Unspecified HTTPServer Eight Empty Error +Child Empty Server gRPCServer One Empty Ok +Child One Server MaxCount Empty Empty Error +Child Four Server FaaSOther Two Empty Error +Child Four Server HTTPServer One Empty Unset +Root One Server FaaSOther One Empty Error +Child Empty Unspecified FaaSOther One Empty Ok +Root Empty Server MaxCount Empty Empty Unset +Child Four Unspecified DatabaseSQL One Empty Unset +Child Four Unspecified Internal Two Empty Error +Child Four Unspecified DatabaseNoSQL Two Empty Unset +Child One Producer FaaSPubSub Eight Empty Error +Child Four Internal Internal Empty Empty Unset +Child Four Consumer FaaSDatasource Empty Empty Unset +Child One Client DatabaseNoSQL Two Empty Ok +Child Empty Producer FaaSPubSub One Empty Unset +Root One Server FaaSHTTP Two Empty Ok +Root Four Server gRPCServer Two Empty Ok +Child Four Unspecified DatabaseNoSQL Two Empty Error +Child Four Unspecified FaaSTimer Two Empty Unset +Child One Unspecified FaaSHTTP Eight Empty Ok +Child Empty Client DatabaseNoSQL Eight Empty Ok +Child Empty Client DatabaseSQL One Empty Error +Child Four Unspecified FaaSTimer One Empty Ok +Child Four Producer FaaSPubSub One Empty Error +Child One Server FaaSTimer Eight Empty Unset +Child Four Unspecified MessagingConsumer One Empty Unset +Root Four Server MaxCount Empty Empty Ok +Root Empty Server MaxCount Eight Empty Error +Child One Consumer FaaSDatasource Eight Empty Ok +Child Four Unspecified FaaSHTTP One Empty Error +Child Empty Server MaxCount One Empty Error +Child One Unspecified Internal One Empty Error +Child One Unspecified DatabaseSQL Eight Empty Unset +Root One Server FaaSTimer One Empty Error +Root Empty Server HTTPServer Eight Empty Unset +Child Four Server MaxCount One Empty Unset +Child One Unspecified FaaSTimer Eight Empty Error +Root Four Server FaaSTimer One Empty Unset +Root One Producer MessagingProducer Two Empty Error +Child Empty Unspecified gRPCServer Two Empty Ok +Child Four Server FaaSHTTP Two Empty Ok +Child Four Unspecified FaaSPubSub One Empty Unset +Child One Unspecified HTTPServer One Empty Unset +Child Empty Unspecified FaaSTimer One Empty Ok +Child One Unspecified gRPCServer Empty Empty Unset +Child Four Unspecified FaaSDatasource Two Empty Error +Child One Unspecified FaaSPubSub Empty Empty Unset +Root Four Server MaxCount Two Empty Error +Root Empty Producer MessagingProducer Empty Empty Ok +Child Four Unspecified FaaSOther Two Empty Unset +Child Four Server HTTPServer One Empty Error +Root Four Server HTTPServer Empty Empty Ok +Root One Server gRPCServer Two Empty Error +Root Four Server HTTPServer One Empty Error +Child Empty Client Empty Two Empty Error +Child Empty Unspecified MaxCount Empty Empty Unset +Child Empty Unspecified HTTPClient Eight Empty Error +Child Empty Producer Empty Eight Empty Unset +Child One Consumer FaaSDatasource One Empty Unset +Child Four Producer FaaSPubSub Empty Empty Error +Child One Consumer MessagingConsumer Two Empty Ok +Child Four Unspecified gRPCServer Two Empty Ok +Child One Unspecified FaaSHTTP Eight Empty Unset +Child Empty Client DatabaseNoSQL Empty Empty Ok +Child One Server FaaSHTTP One Empty Error +Child Four Unspecified MaxCount Eight Empty Ok +Child Four Unspecified MaxCount Empty Empty Ok +Child Empty Consumer FaaSDatasource Two Empty Error +Root One Server MaxCount Empty Empty Ok +Child Four Consumer FaaSDatasource One Empty Unset +Child Four Unspecified FaaSDatasource Empty Empty Ok +Child Four Unspecified gRPCClient Eight Empty Unset +Child One Unspecified DatabaseSQL One Empty Unset +Child One Internal Internal Two Empty Ok +Child Empty Client DatabaseNoSQL Two Empty Unset +Child Empty Unspecified gRPCServer Eight Empty Ok +Root One Server gRPCServer Empty Empty Ok +Child One Unspecified Empty Two Empty Error +Root Four Server MaxCount Two Empty Unset +Child Empty Unspecified HTTPClient Eight Empty Ok +Child One Server FaaSHTTP Empty Empty Ok +Child Four Unspecified HTTPServer One Empty Error +Child Empty Server FaaSOther One Empty Error +Child One Unspecified HTTPServer Empty Empty Unset +Child Four Unspecified HTTPClient Two Empty Unset +Child Empty Unspecified gRPCServer One Empty Unset +Child Empty Unspecified DatabaseNoSQL Eight Empty Unset +Child Four Unspecified HTTPServer Eight Empty Error +Root Empty Producer Empty Two Empty Ok +Root One Server gRPCServer Empty Empty Unset +Root One Producer FaaSPubSub Empty Empty Ok +Child Four Producer FaaSPubSub Empty Empty Ok +Child Four Unspecified Empty Eight Empty Ok +Child Empty Unspecified FaaSTimer One Empty Error +Child Four Unspecified FaaSTimer Two Empty Ok +Root One Server HTTPServer Eight Empty Error +Root Empty Server FaaSTimer One Empty Unset +Root Empty Server MaxCount Two Empty Unset +Child One Unspecified Empty Eight Empty Unset +Child One Unspecified HTTPServer Two Empty Ok +Child Empty Producer FaaSPubSub Empty Empty Ok +Root Four Server FaaSHTTP Eight Empty Error +Child Empty Unspecified Internal Eight Empty Ok +Child Four Unspecified HTTPServer Empty Empty Ok +Child One Client HTTPClient Two Empty Unset +Child One Unspecified FaaSTimer One Empty Unset +Child Empty Client Empty One Empty Unset +Child Four Unspecified MessagingConsumer Empty Empty Error +Child Empty Unspecified gRPCClient Eight Empty Error +Root Four Server FaaSOther Two Empty Error +Child Four Unspecified FaaSHTTP Eight Empty Ok +Child One Client Empty Eight Empty Ok +Child Empty Unspecified MaxCount Eight Empty Ok +Child Empty Unspecified FaaSOther One Empty Unset +Root Four Server FaaSTimer Eight Empty Unset +Child One Client DatabaseSQL One Empty Ok +Child Four Unspecified DatabaseNoSQL Empty Empty Unset +Child Empty Internal Internal Empty Empty Unset +Root Empty Server gRPCServer One Empty Ok +Child Four Server HTTPServer Two Empty Unset +Child One Unspecified MaxCount One Empty Unset +Child Four Client DatabaseSQL One Empty Error +Child Four Unspecified FaaSTimer One Empty Unset +Child One Unspecified gRPCClient One Empty Ok +Child Four Unspecified FaaSPubSub Eight Empty Ok +Root One Server FaaSOther Eight Empty Error +Child Empty Unspecified DatabaseSQL One Empty Error +Child Four Unspecified HTTPServer Eight Empty Unset +Root Four Server FaaSTimer Two Empty Error +Child One Unspecified MessagingConsumer Eight Empty Ok +Child Empty Unspecified HTTPServer Eight Empty Error +Root One Server gRPCServer Eight Empty Unset diff --git a/cmd/jaeger/integration/fixtures/generated_pict_pairs_traces.txt b/cmd/jaeger/integration/fixtures/generated_pict_pairs_traces.txt new file mode 100644 index 00000000000..ccbc54ba6c1 --- /dev/null +++ b/cmd/jaeger/integration/fixtures/generated_pict_pairs_traces.txt @@ -0,0 +1,33 @@ +Resource InstrumentationLibrary Spans +Empty None Several +K8sCloud None One +VMCloud None One +VMOnPrem None All +VMCloud None Several +Exec None One +VMCloud Two One +VMOnPrem One Several +K8sCloud One All +VMCloud Two None +Faas None Several +K8sCloud Two All +Empty Two None +Empty One None +VMCloud One All +VMOnPrem None One +K8sOnPrem Two Several +Empty Two Several +Exec Two Several +K8sOnPrem None One +K8sCloud One None +Empty None All +Empty None One +VMCloud None None +K8sCloud Two One +Exec None None +K8sOnPrem One Several +VMOnPrem Two All +VMOnPrem Two Several +K8sOnPrem One One +Faas One Several +Faas None One diff --git a/cmd/jaeger/integration/fixtures/pict_input_spans.txt b/cmd/jaeger/integration/fixtures/pict_input_spans.txt new file mode 100644 index 00000000000..10cea9916ff --- /dev/null +++ b/cmd/jaeger/integration/fixtures/pict_input_spans.txt @@ -0,0 +1,14 @@ +Parent: Root, Child +Tracestate: Empty, One, Four +Kind: Unspecified, Internal, Server, Client, Producer, Consumer +Attributes: Empty, DatabaseSQL, DatabaseNoSQL, FaaSDatasource, FaaSHTTP, FaaSPubSub, FaaSTimer, FaaSOther, HTTPClient, HTTPServer, MessagingProducer, MessagingConsumer, gRPCClient, gRPCServer, Internal, MaxCount +Events: Empty, One, Two, Eight +Links: Empty +Status: Unset, Ok, Error + +IF [Parent] = "Root" THEN [Kind] in {"Server", "Producer"}; +IF [Kind] = "Internal" THEN [Attributes] in {"Nil", "Internal"}; +IF [Kind] = "Server" THEN [Attributes] in {"Nil", "FaaSHTTP", "FaaSTimer", "FaaSOther", "HTTPServer", "gRPCServer", "MaxCount"}; +IF [Kind] = "Client" THEN [Attributes] in {"Empty", "DatabaseSQL", "DatabaseNoSQL", "HTTPClient", "gRPCClient"}; +IF [Kind] = "Producer" THEN [Attributes] in {"Empty", "MessagingProducer", "FaaSPubSub"}; +IF [Kind] = "Consumer" THEN [Attributes] in {"Nil", "MessagingConsumer", "FaaSDatasource"}; diff --git a/cmd/jaeger/integration/fixtures/pict_input_traces.txt b/cmd/jaeger/integration/fixtures/pict_input_traces.txt new file mode 100644 index 00000000000..9eb0b9a29c1 --- /dev/null +++ b/cmd/jaeger/integration/fixtures/pict_input_traces.txt @@ -0,0 +1,3 @@ +Resource: Empty, VMOnPrem, VMCloud, K8sOnPrem, K8sCloud, Faas, Exec +InstrumentationLibrary: None, One, Two +Spans: None, One, Several, All diff --git a/cmd/jaeger/integration/kafka_diagram.jpeg b/cmd/jaeger/integration/kafka_diagram.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..9dfa2ca64f3e53d9cdca6736fa1b36bddb56909b GIT binary patch literal 237338 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

)+q{yVicBHGa9U<6!01j?-u=EZeIZ^52Z>I@R6 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

3zxwq|4V|*IPo`@78@8X z>=}hl7`3#td;w81R{MLjd2py}wR@$9f77oUmRa=ny+qmFO>StJRBbAH_sXe5pJ0dw zW}L>L^|9OmZP(66XMNh4pWY*AWj^VCfPNh5n}9|ny=6VNtYi1G^9fe1-Q$&H56yjS z{4X`owCHF>O~B+_CC8?3vUSm>qoZNLF6BJR;YFTZ5yU}71m>2-e=@JM&tHCmOp@&G zq8KduYtWP0L^uFU}zje{Dm zh$m!8o}QhEE#~|OCxG#wH7F8R$xm!p_RjQ5J-gumD`Tpkm3u>I;C64X!3_>nd0^@xS`I0xi`3BUkeD`GT3LZeN^sfEBni)2&LD^GsfLTi zjI&;M?IH9QIlZ$!j`qKGt5k+@X1QL}<(C`{Rwg`&I{Tf?W7O=Beb$#-(zPebgK~7j z_^dR#`x`8%qbYAN3zIdca`LPaoqZ+m!1Dce`6A;8>?Y6s8ltpMlIoa`;m^!Ud9Bua zo!L3?SMcfgcPXBT{SYpgvN^c6FE_SvT|PkVbTZzl3C3-30eO@BR*!)=r?DM z8wQi`(lFC(`sWDJv=6pemLMo34$4pVX7v@Miyoy~B=(*+zkmOHrp$@7(X_0RkKQ5i zYGGBijOYsoL-aj+@A}=t3sz#z53;6XnKd1r^wzBdG6}1?jyA5{lago3^o*B?TqJrxX(ufiIl|7d+@J7pl6`tGK~olh;Kc?2ySI)sACQ5l)%j%?)B zG8`?qF;8uD!quN_iRMB0-4A}>FK)0#SqHpPdz?`1Ah6WsUhlPI{Ttw>p0&o`WyM3i zqkEu9E1HQV0wbtW8CGVdIfP#FC5GYSMAC-J8T$c#K7{Eo3B)+*vNk~ zjQI57YF9hU*Zh|$OE!UFO`Fn*-b<`3Gjf&(DwMtX#r#R2Nz*n<_D%_C;$S;ff9CK& zXl}sEVJ6LYf9vZKyV2?!x8ADPrcPH}T3DU^_UR?Zu>bvnSR>zuOawAt?zVk0C%$td zUaAaVqayuv_w*I(t*lI|LlFh}W?Y>EG8tq?&kZ@Kha^ic<}h8TA%A`xIaBVxn&bX6 z>e^GLwZ6paxhwK8p0h`Udz!{iyp|_xcF|DrqIf!M zv!Ie%;N1oBhkjX=WqP4a%#SnfS8vhP9(?myl`=7Bj9ZlZ@{;nAf$pmoYd^*ks)q37 zCO%G$6x%I*6*4F6XtR7v%vp)aqk)A!$bZoI+k?qwCxI>HOV!Uzqow)V!^Q<~Dxw6^s@QNdmGAxFb!F)UU2;yL1 zyf7JXGdJrS-qO9AbN33pH}#R8(Ss%7igXylV22cQD#CHM+gWk(a`?vH$~LsRtM#(e zsv}ob`WjR^?K%ugDK6qt)Sw2=^y!;I)pxzk?E=y|61?x(L>>bPQ;dh99&0)k6pmGx z!sw4RQNAWG+h;J)9n|ms&&8?VmgNjMeg2e8!wfkLA$ej&b*L>L&2E9Ka19NK##>@S z(_Y5=M5aH=mClBwsnAd$dW5e>4xYnau}XCPdqijg~_=;q>n>@%V zPA{+yl=D=J|B6QcD@APPWkcWA_cEz@XN1mpwjCFf!bYOeQun~@A~%rT>SS)u)4lE4 z8T7)M-iB`{Zyw1;|85;&E$o3(s*GpPAh5XqG=T29b**k!v3+h*wP}6=H@rI!`~t&`9=~I^k4}X~eGWK#9W{ z{^Hjs)p&?Be)%y2D zP9a=scax$j$2juX)UU;`E`>z0c8t{-2^pl%hTLG0kQ*vKWP=&tI0NlyM9{>C{MLEL zlSwhZb?ETaJCa8)Lu1yp5-~`-X&`TE4m6o`e4t%B$eRc+!JOXh~X12x3 zB4qq{p-nsxY>b#%D37XPge&HSdamF;a$p#P1Vh!Z!kPsap{DEVL_5&hs5>z(CVVuk zEC1>2zzV0i7sj`n%REkht2#o<0H(EkJ}&_%iXA(bNK3UVdjR7>#*E#q(_)%C7IMh6 z2GT43?P$WrCdCr8-MT-E}YN46W+Kz~`-nsU(%eSE&wPL=#u@`&uEV>-oMC;q`v|C&WUXyIhTS-Wg^&Xifl zNk8b8OX{2z*`T62%+)lwzi^{-q(|s-@$2yO-uk7XG>?R-G~?KWVcr7DHG`kZ4!_-Z zdC_j8qM887Rtb8PJlNxtL5xSbTOo$p7#3yQ%1aXs5_ROoA_Bu>FUB&GV~RfVN5P{F zS&OI{U8<%V#$kO(LYg^_##ev30WERhM?M(K-PVHY*C251U^2QFlz7P?jgd@~wm2;$GRAi%3jO=O zVtIMm)f4!hNZ?^ViNNm)PrT=;5A*;t_Y^bXAwB1LvXtJMkt5v{S%>~$=8(mqb1ujb zd8oYY)P@+u*3SH`kQeF>pGv*^*t8NpAYuw={V#vMCssX9NOCKFk1|INC!U(~h2&>t{F8F)>-w89E6!}{#rELt-EGT489lu z7vn!)p~o5Nre8^J6nm)QqkxSOY2bwdl+TCV6#8{y-DSQ_bT~y0)lBXKzxQLbq7kc? zEFwi&J`2li`F=6eE-UDmpXkhv9H6t#79jgkg7i~uX}E#76@H}bf6Sz)$4 zuvvs<^dB5<{$Kg3InBSJoI}Zv5W5>aCIOUuSkJR{v%S^9T%h+t0?6jZp=mFcG)t6R z5#u1DxW9?Jv?Pp?<~3j01GvG=Zo4=p7KGiz4Z1}7D{`1q!AuRtwDNEav!Wx~`RhkU zmB}hEY-aOZ`D+t572`MlUu@#n>Ipm~!sFBRR=p*0f6Vn9GT7T^{(JPy69?AXVPrkO zLJmTBhDvLv*x`btr%-1>Ulq=?_pFIMoNiIv;^5+trgn>Mtm(c3vkrN-Fu9e+mVfYt z=kK?T|1~j7d90wsL*rhYK-^JwMYy;3EI^oGl`-sOFvJD|3pKrYsip!3~xpHO@pM+V7Jt&I}tA>K+RCCD*^$ zkUqdLS+2}o9g2+X{#z{sQ-%N2sLsz`3VZR|hbLj#(b^En_xq|JahUnJ8k@#7#mGJ} zT%7tT1`j#85zQ;H%Tybb3o>uT1_>4l8-un>JyTT1i|+b4CyFd0VBa^RZWmJe;W_Hb zmjbB=?9dv+S?&dg3(ZG%!q`a7j%;@}L0m>Z4H=IM(ue2c_r}YWt2+*BUpUngvW1GsugVQG@11_XqsA@ItP%Hd~d*_<%urBcnj_fwK4K^)rS8C^L z8+30C7%nVCdb+%`m(wf`S{jq@Mp{-}9nF(-ZrH9EY+?Um0sVkP%$UH(yWxh& zeZLZ@yU>h6Eh7N=Yp%u9Cl33L^l|VF;LGN9a^Jh6JY5*M*w;}AqMC7BIc&oBn=B z1At55lV>^&Tj**E>Ful?)07az{f7dc8!rWhY8 zxN1^wPF-M=jD;Mx;cH+a$Hx)R)1>fd?7L_`vvWuO-o74|6L>klwF}Ev36UCvpnsZi zWTjKSaOT@^8d2N4gd*LLzS>bB)TlXd=vji9!B6AveinOOMW$gY+HrTHOhbFm>Orza zlPA-OoEXXeeJFz3ZHK5~U(-TX`oU!M*$tzSg!`8&58LyKeX)sB zQZwYrZ!v<+g-!P_O^$ERCRi?$GtK_EWv$xo4Q(}%vl?`DsxE06sm%CRCucvXOIw_N zf6DesZV0VX(H)#=HF4MyZ&qTr#7qtS5Meq6xyCGHaF@7}JEBse&W-Lc7zhVoM{FgE zZ09O5d*Z~kp9Wd!ajIzQ4Ov|W%AH{MGG3DmDi!XVs*f7N0pV zF9k_ciCO%S6k;~#*|2;C=??(_blU^YP+cqQ2$ooVX?5e|f(c8161ni%BCBP3x9&nU zZE^H1AIGi4DUW)iFPeiNM|Vb_k*o00^LAFpm0gy_A(uTcYJB)Jb6N!~l# zn{DdEOYXKtRNfxiSE*_s_v+A)wj)|=YR9O&$aUt+R1~VJ-ShT1e{DNSTxoL6Nvg(o z7htbfY1QJiE_@iefQfM_)3GKMap`Iw4O0ypb0jG)ykUNht0>SRhD(U&{sKSng$bo| zI+DE-UHu!qaUclr8OttxLax!6Cm4d`poWdX`g)&sWGTFq&Y{wEMc+gdy9KQg*434+ zs0#drkM-%VOK)+ur1Uf@IIyOM#-7&b4pRx{8vNF6$iTSJ<(*&5mx+J7pp#ESIJeeJ zAMYxCm`q=^ROp-6ik3IDaaw294oE>dbVRz<$)c0R4R8PCK00*)PWe+4c}2n|H1&`V zU4k?ACh}yeoqc};PA`c&gZ|gduT0ehKTBl&HubGca(IaR@rUm(DO#Ak-}}l5Zw@xJ zx{LnE@`$i)IvBNXw5+La%_X+&zBcBG&^(^ml2Z(7%`2Pa7yUSD@nnwZ_LVIt2=E|V zbBo)!T)oMo#9kq!r5DiOM0o zEysJ`*_%}*;w;$5Y7uYP-RR&}f7xu^$6=zmb&XxyisVe_y>NHSgX{%10sg+HF6yxS zXGU5eZ!`3h?#?n^Vd0d=32Q9DV^f+fNFNT7mDFi9)9^Htn|I_s+PL94GXKO`i%Wi^ zs5Vx#$UeCjHA_cx?ryW7%(=WascIcUi@-XosyDkQH>?)AYWUB+*^sN*67}D%%%jbp z6(u$Df3JMG-ab^N)6p|Oo(g9Luk==q2NXj3PjTCs+h0WO7Yz7jmk!>A9q{2jM=SCv zA@d2b^l<~o{XDqRP4yjAxd^9PT5yz{a6`YIYV7)=t$&)4UMe-=Nr^9XElvuJhcnLR zZbq}<2ZYHzuIUh^a^_f=K*J%-Tli$Mp_Pj14Yjx27kf!FG^(ZgxGdhzYRgoiAfaGX z(RW1U0gr3j(}Mmf&p!zI?N@-S_nbY3SNNGB9=h0Y@7aPck4ZN7SV@8JRWtR5v$?#4wCcfS{I-;h%FYZM{I3R7f2wME zI13r99ZTuCWtQ42ZMjZt85G7PUad%bmspVQ1FmKe!QT*))VUNm1YtsRd*=mANDt}> zn86B#Ni%38XaAgcm7$D;$?~LK0(5A?>mT1wv_^dQf7`33#gy)#p~OQ}=7>R|-W>f3OLVSu8UnBWYJuxD#sx%z zn@bFkC;T1T%izDQ0p$TC0GkNsu3r|I`anudMI|ggl`N#UDzjlMVOXvSg1@C|oXRWy zG)zUxDUzIIk3&?&8T*4+aLyjUpTHq=nZLfg-R_x0SU?*2ZN7|Xq$M&|>Y<^vzjWf9 z!$EGApbjdX26ir4;hb#Q(?feB8eibGs4ocsK4lffF?{bS;OsFBB`I&%EtZJxBH;R0 zcCaa2m~X=CG~53eE?T>hPcxkC99vlTHa1=XlNo7kCDiu;ml0Ex6LXlmPq-e3^w2&-iSC~X0l{NcT_I(&L{qD~* zL;9Zczy8;C&UMapu5->a^UU*nKKJLo-|yGE_5}M5EjxOVx7`yJ(2`(OX18n#cJ(tF zJ$dbE%jW}$IcJQY&&VF-*y<*7OU8MbI?v5wZlzak={e(vk)-yuFydU)kso2${M0pX zCZe-Z%IIcvf4b)qO!NsVs%>a3EE2)#P(M<9p74Xw8NYnV4j%bExHUgFIR~%2<&`|- zIB@EPMAudN?UDbyoZtGM_5NBymZ@diT4ioxif;JXF`PftSRJN@mTHA{FNV#dH*UE) zUj8ZlV#J!_m9JiYKE0zeU?yYLtD6~vgxOF+N|C zn=coPyWzm8;Q~7bOkt-Q8Jm8SDKW=p0#Vai;Uk>R@d@-3;HK0kNS~irvj^Jic=Bg$0wD&jaq^E!CvP^T;KVe=juiHGR-8`uzLnHbfdrbk2`rpd*kg z!L2HAKA4?j0=!KZ_rWlo_X*72d_=Wzi}`IG57<=;T&G)2ESj7Oo+KU$7?17>)!;s6 zf1i0ZTrTT39fK>bEPFI1C?A(%Df6_wq45f5q|u|u6SoiRojAvE(u&vYc+}VWLq+DU zpIfqSOEmYwueaFHISw5Ra$)oCaR}Blq4r6RCBexKmNNH2&Tr5l8u~Gip-4IeWq8qh zci%Rm%RBegF;AO^-JE#%c7JcWydsr3Qj_;eMYISnKga!X%cSp_0xZNB?S1&bOb;ak zowy4s$*s)<#oe>!SMwu3JWsKhjj@|`pW6GpP$m2ki9_N#-@<5M07opj~A%oyIui>!21 z^9kJcG${nX0QR3)(v1u(zd{m*G${ zWpWK@jX(McSTbsGgw0T*Z%>u*aUnGI_BT3hK(?~|9Dv9XdV_i2+oC6g=mb4j%oNuFu0l| zMXcuh{|qq39CdCzM`xZ+{hChxN|xM0V%X^lxNDcL-gQZG%>#(NS;YzOH86~;@yz# zGb(iSdNYhwQ19E@EXMK z9%R!CGjUdcXQY~2^q0eTbF7_-&)u#KYJ1o~W0x7a>Y&7UEX4f?GdlYrb4qgInvt8-)8$V?eMY>+($h)lGA+^OgB|elZppGmOA#Yw<sqi8 zf*vPcW?P8q=W{2&w1B&9m_Hek4~uh7|dXVm_(295;Pb|=5DD26o% zcnxVOKX~h$OF2(zCA@wl;UW)-AvLDdWGOT)sC7$U$Z0n{UVNTv;MT$n+<!17HZs_iI=B?BW37yM@Bj>HneE zi!;)K+THkJhHX%WA3esxab=U(;6N%-N6XB1{rvu~j%`e5=v?)m9_8*l+vh3up>TGG z2P4T8f~_=;dHu6rHD3%(5~;J%u&Ggf)`Z?asQaTp&^8;qzyb|f4_yn$h>>1n@Z&S6OmCs=n>!z+^!^n5- ztqWK~@UHE|&IkzwFyCCj8h(MYvTpLM)h93lL(c8ml$QJkPQQwcskmSW(re=u+uqLk6>)6(*hXb8D*%1}=Oe3iW}t8MpgPGCNYTCjkl%AFZ(;c)P= zhyFf-LoNUtFWd>JT)>VYb0xMhgo;U{xfrQZ}ugXt1`h8V*9h`Pt zGFXQM9zAO`8dvFC7>(1|hV1rz;?@GzkVb{#ek!Jv3sb^;AKMCl1h(PU{|UFj1R=J6 z9${J29JQ6yK55dM_7CLyeL421Us>l%mF%2D@ixML;%!of_+715cwpH$sv}f^izsLB zPSEW9Wz~iS2Iz)AXar9rZ+XaiSeX2UiZ{f2_B|Y40|On{nP$&V;9TE3{UGcQ4x>U8 zE4sfVWO^YOD$orVlB<@`4c{&>Q?Y^C{|a@2XDr7Xn%Q3WUk8dvil(X0|Cz_ZO*QH(1*F3i#c)!1`w|SS z?J%?Bq@W}3I*Y36UUjMPnJPwDqoLPp3?pKg+;-P79qd6x74+w8!VC61xJxpROqdD3 z67jsyv>XBU*4pp-xlp}f)Hj`i`*6WId^=c>sXd-Y60pGUmUZNs59Fi&DF45sTTHD2 zW!A&UW z;_$Zl-vwM8t$?%XpDx=K@;_wG@GExeY!&Mx+=j7s_vL-mSU$1)x<5fBqCCx1iKwW{ zDObH#uUd=`)aQQL~G8F>8q>l|Kgp4a!W zz$L{m|K!B(SZ>m`YoUk(V>RFg_CSg4ZQ`-&OB*a$eWH7I@E-^EtXXKV5fySltKqck zW~l~atlculY2~O~B>bXRa+wZ3q{W{YAb05xbx*sne<8&5MXbJ+|^lIWc9JYGyma>RfKkj(xj zcRsc~xj=T2)u!v@VVG-wVlVh`fSWX`#KiVtVC`-`OvG2ffv?!;J&dqgiI4DuM{uP_6 z{#N4<+zrQe@9Cm5htXNB7^~yPW&mf1K#DiTt)W=F(IMCPGe>7&E<3|L6xRI+O%ktm z%%7mbQMnC5a0r*7heP;nL`v3yLwK0)J)_QTr6#gJUS}^V+giTt-gf$&g|Z4la<|~$ z6yCQd{D4k4tTJGOl#ZboR$-?0!g22*O_SxoxL$-(~M3Iyu~G044B zz1!w7fOTK!6RuWj8e(L${SHx+AE~I0+fj@PYpmf7&oW3AU09$+(bITk>VkJydhlW( zBA{w~7S$#JpvyQ%4K+-Zki1LHDO_49^8L)a(70m@U<&T!E~Xli9%J`xk%|0raKH6@ zM2SvArmSw4t?Zap8zW__s&NX4 zY6M4Fva{Pu!Au+r`V$xqgK_lV_+{pj?!;?r5YI;l(9=}JjtMX=;>>pfrsGPa3WkS$ zdIEYmIH@75(4)&+Y72iC6mG?@Rc;igaW}SGF{|{!S5wFotRD`Orqx|*i=IIW^Ngen z&!SYbmZd;(aqo(lU1U|Bt&WdZg|F6JPc!|(0#2XiN zWRhaymj4yz1`1RR=JQRo(X$@f4_Z$xV+l-*&L^r5LN^*9IqdTPA!_4cP`s7&FHsvF z`0r4>;^4fEYP{fufL+drr68XatBAv60e{*LvA~rEJ_eMNpHDVHDq+V)NF{7Z&_}TQ z?J^|XZ54pl%NQ?!@q1nSsbx{`dm8*Z^G9&*E~K%cB6ifVC|@MMzQ19$+~H^8NNU*^G%MaseiLxBRGVJ%cSw!b_i81~`z_7rzrE_bGBACs1M zRSOG(-Y$MoZ?|cd-vFcWpl&EqnB!(@`>6SjoN)nA@J}GM&_SP9RhwtkE6uE79LeKO zRbzkg#})YeFA(D>KmNXfFsyu^K`th#g3fyVD3w%&5vu$Pdr_6|2h9P5z=ASAZ9x0Z zqXDQxJS3g25a`k7i{&Bwp-7v^Q|j6>&9DEayJUN#UU_Fd$FDQdEswu{ESFbIwH@Jh zaobKZtPI;To9LCOcAw7ptH2YVHxsCNdiZT50b8!fN;+cKOyXPjjj9I}DpP)(>}Z>dvg#EQrLt{x3#S;Ps4j;;P&EfG7>lvW!t2Dil3~vVaCD8U7`nNO~vThHZ@}$A$KNt-rBKB|*Hbh{+c zS!WPv4F_J#P}WHn5vK%32NN1dlu45u9gYLViW0ul z!`=iB|J!9OMA7QO?&sX*W5>j6LfyNBe;VO~@a^$U*}*HD0*YBe;$=sjlXAo@y;3VZ zQjWZjxW!Pld!^DE+db>@bPmoLsxHsK?eJbpsWaiDaC@430bZX;({DPhY;8-!vb5{- zhE|*kJhNIWRh7?(=yBh@&isrwsE1ACn%Dcu*VvR#^gE)R!4eJiZTz}@P~aA7lM4&E zn!v&~Z9hgIC^50RsC{d7P^M-7n|n>xyWCz|+dNccoaHWW53SHO**`BgW_4Bpa2-1Q z>U0`eL!000W@Mg?d)cm;BQWFQf+DBi{wkBe!vvM9v$ReVm1JFy6^yD2OwMh*x@~=_ z_fWoZLl-ci0Sv>+NjdmLO2%GF`h%P0P3e!})DQuV(SRAKZZVOZH5UnVc;s>UUzb_N zp)_O!{Ebbl;37f#IlM)4>^wC;U@6b$xcMMOb7jJ- zLygYZVIKNS*d?}&1L2y^vpz>jngG$zm_VB8zN%bsFK}pn0PY@Qp-J5y_t3QE*&vI_ zz})PN_pe$h!qDn-4d@`h1fmw2A1;of13U@Oj6OmWP8#hx`xx!9q>-(N0e>;P9mP+R zo`5vrQkDL!Nxrc4gSYKl32pYx;U8!{#Wd|}0I{QZdx2a+ZnoFX4tA1J)Z4N-?0Ou=(!#ojWetk@T)*kuX{jWu8rI!+nuPRe zv>jZTY!HB7rGCWS>N-S?C_rus5(ZPlrvtt2m!k0Lg_;h16@l|dxBFb@p#xm4dSaSLQmI53D*7A&_NpfUgun+(*VBPe{DQMtA+dMQHf%<2^@y}x z0}&!W;%erQ_@V&&iRL4UkOu_*2@KO$i|qsj^2-yeE$CtEFyqErm0*nlR3ojl15{&} zd&synuo}NwgTG-j_!~6e{1@^k;sQhX58s`GtuQU`;ebV8>e;vo*##z?NKxUfA@kW7 zCQ|jA{jdh0nF*liCiuT`_Ip0ez3|Elh2GVayC=|E@r0zWF&?FY3X3JzGP4UNzMjQ<1UzQp=y%5wZ z>!^bANr2S&SAmy!p8nSHS8x=J#7+A9#e2UMx2rvf#KKJ~y6X-;MDZb57Z1gU^egxxwqnHWYU%rM z8Nk+K8f;Mbz>BTNj{Bbl0DID>8qOxv&w}p9S)FA}fZ#6qu5CFnm=G_LU=|->Dlz?J z-)QM(%5dw>BE^scf`g~{lM64AgB0mIjm3*|)5^mGBO<|6AG|4MUPP~nHM8W(M^%5W z?TI^f@qJ{NUD5S4O>Ar$YK3euf*fTv@x(lUcGpR^e^sRVxPCrtLE zzr{cg<-aiIv>;JE2^xH#jS#JlIsISbMi4U}aJQU`lp|dTMLknFC z06xkEC*+x1!%z)FG4l7`ePMIX-~=?rOEJfviG4hZFG+Q7*?5t8RrlW_ZbXK|mp~^9 z0EuvgJKV2f7JHWdlZQi{2r~WgCxA{}k1zu}l+-Npuk2qKhVg0d;ZpRsOKdt+tisjv za?2nANQ?tB;asUw^3D*@g5a(&NFi#N@iwz&U z11VqJJh{x?>Zs?Mw)=~>@UI-4fD_JtqEUVA^#s4k5muF57q+mtc)49RH6y)YvUx7` zK_qDMQ>|6dxq!j32#IsN+zFUDk1_`TeIf4^&bG{TFUBr;5R-1qyxW8iXsSJtQ>OG{ z>PNHkNbdTicmIUvAHHQD`Cwaf9C|e4j^*H{$nGxR3IlR#RX2Qf7yJDk`q>fqOSc3l zoWwV?66~ERH_zyd9B%6;?%&r{UoYrhU;nL&kZ9q)XQDE>(a^AB9$ zHlj_dXL(jQWFMs$x%WBkokOQLZ0NI24e8n?wCRinLgUhsN<#hl4{kG^mb)8k@(h+| zb?VGSKYMJ)YLjU&RXCG^Jg5mgY7`K!($upB&GfAQfH>7KryTKuI)dfp!9=KbFUq%|PS3T-tAWCQJG z`R!0PUC~x*HXRxStHF}6P|IPFY~V5D=zPNV&TJNYP3$Q!YNmGfIIU}sULbeCdos5Y zgs;@>6h3V+Xp?DRvJX^SpZgu)iNPWKjO1WTNz)Fv6`C!_7y+L7&TnPP*p9k?d( z5b@%Y%^kGLqdW2KMZ%;+f^w^YJGYGBWUuO3uRcN&hE zF#4?cHyyX9gnfHk;M|tNGz&cUDTy8~51|?z-r#^6C)!62u#8TAKI48GO>{fwgY~|A zK?LRbHM7FCkU$3jZ)BFi0NyC!se4R!*zbepa_ILjTlp6*H|=x%=*W;YY1eEGk<)Z6 zr^D-hU{Pbt_;Y^I*Vml41@VO7leU{)=5iLaW_Yr<--M;ewyklXJojd8){isz6|S)& zhNelbFMnjVWk}nVBwIE6vKW66=U-hTtxd>*F^c2|KH1#*F-nm^cX*aeb-{wF33dFy zB?HaHr!y)&>M+|n)xZSHERcL@%dCES(U-l}du{hren@kCGEvaNwjJ!7l7LnWZw>g%ELI~gJDpz+^W7sssLl9(vCRmKaU(sHb9X%ppuP#z zM&Tv~zYk_R5cKT33K`9!j0Em0z6dCZ@Sj}2!TFSdn zM=ETm4w9eF9O4A;xDdnNeZoin{F>PD_98Y>@Cd=yF%8d&-PusG#&n;B;tpHf9BCEn z;`2Y~-z*jOXD5h+w=pH@ty`rl>`( zGks&EYOLmXK=njPvFvNf74W7~&yYBD+uR5JKqi&YI@QSVpWVezdr$vYk1#pm^{i2M zLupGw{tS)8Ej_s1_FpYRTA3OF3kTRwUw$};;_+-p7=D0+is8-YGHm+hes4nz&}@Ix zIRovx=m2PL0&L{_9`>ashYMqqi*VZHf@-xr?l&ZG8EXLNPU8f?R%K29&c`jPO33*f@B?3 z(wP9E$QEp+&07vt_j?ee7ObyHVJkN41KKwzg@7Q8?O+dal^pMO0vN)&E(ei$QRm=7 zoCAXy>d3ODAttU@`AF5c>xQlWMT^xx3pF2c7^{}B;<6ESCsI&Zmb1{DkR9Xb-03|8 zPzd{l-o#~@-c@#xf>(S94J=080HBYgEgCdw%ipD+7X0Q#?bOL&TmEGF7e6pB+db(8 zq{J z@lu}VPpF^zLYmi60id|h?)hM_XYk7kpiDn(Qv}Jd> zEfq;(sBh2|Y8?7oB=XW@4n@78E7UC!FP?yw5zY|5k|gIj*gF|3 zH%5sjjZUcNA0KApNfS=+T$XS&dfLYk4z>8V`cS~zU9=scP2B6tD14$g;#NYSklV^z zIq$R#Ziihfe<{cBvyJZLZK%J}e)XyGbYf!75l62sFf(hma_E}KS>V_d^<78?uE8Bg z>eO0!>*iUKE$!a-2)d4>6u!BkwtHEAKoawo`%_!>Z(G#9{Z*L- zojc{L1rLVfmX|3?X4IY>JQyIFhak~fx7Xpc30BsRz~q*9Tvz~b9qO5|kPa$_qf8MH z)zeaW?XgM@OE);S$yQ2a>#C}tlTGYjxM*e?m#6O*pTgMi(_p=!K7|6*p&VS0Xsz7S z`zQT(X`8JxskB#(dJxq>ioWd$CNR(G^r`!c4^Nf!ZQugJ`(_}#BOxthk5I*H@U>`H zS{VP`I5*C=-ya=$*Y~7Ey~YxG(^{4OIq*8>^80Hps7n^@tNh47iLB&i+7wzBbD9z5 zlc=y_4LwAMe^Q`!l4Z-kyfi62y!ueOw>_RXpEE`MR>hgh$FKT>-Ny&z4}f-C37tdB z6UAlk!l>3FVuk%KQaYj0pk~f{$7P8Hg`6(t!|@_x)6+;$$Wb}(bC8PK?GZBSrSnk^ zb@~3N$s}b~JsR(XaFRU`$tygfEp|y6GXcZw6aqD2puM-M>l(~Xp%ph%`!KfZ-xbl* zyZ@Q=4TCfEea=l%fT@V7{)TE-p~G$el1yF@{XNK5*%3+457O|9k?#yy~UyCGzZ#T{+gX`IPDDc6igr&27sj5$*#zFzxd?a!k11dw%rGrFrSQ% zG<3C4-Jzr{=LYA#|Cye0?Q+|{5cs`K3E#w1BwejS`!)d!!_yNt8j@MhW5d%wD622m z=GKD?xEFBpxza`rjA;nR#|9T zGSKMp?4;sfaPA1t0)Flm~gv>z72%iBasAs6;+^1nMA_q z#jm`Jyb$qwC2MMOlUe@Ez33JhGyST(ynCu)JQ^O$hYzG>>xe})6^asHLBu8ltohuk zTkbq~fq!TEv`I?KTKs+2&;g6DU5+tEhTCsUx?H{L9KT907`2-4Z#f=!55l;^7H(?l z4D+qQ@!`b%FMK7=*+!cllaD0t+6Po7ASm?45Fm4!rwqSoURQGPElKps8n1ua0B-s2 zeAiZ9a7I#nWak)(1QX@e>b=Au!MO~2GE0@3uwpEQx`TBi&+t+#g_ z7qVCYYv4=uq8Of{Uu}+QC$QueIPJ_+x-YcOpgBMZcp?pSNr`L(DF9a?qSmRXymY>G z*vLv7Ng8(x2(24fthAhGAtUI&>?~M}iOwWV_X{+XypZYHP)VqJy}JR{H1eB{zGuVN zD96W#Za*X)^aU5|%561yrYU^*kx1R^0T)4JXdXh#OQAIbQm)(Yh+IP--@de!4>{%k zd|0U$IL63_<&A?NcY+)AxJa{~MvH|u1U!NOb&ymiD2@h6gc_-@+6~mMtFQtI-sQC5=&`?%Th#kXQoB8`Oy3JfD4%467Syfgb?v zpD9v=JE|(scjAci9S|*90}g^N0DM$@C? zfln}9Hnq`ssLgyAbt8?2z!b#P!p1*3FqY=V#?p%`7uJqXK|H|4V;|PTKj)2KY-O5b zZk8&ln}ycOv~yQ4eIa8ToEuQmY`N{o96mroQLQOhPO2&=CPwCl(who1%d1-E^l~f0 zJRV~QHF|UyR76SQ*nu;Rzc!z~QUWfF8%g+rM?cXVg$!!wjoxAI^0x&?3TYMqV= z$1*4>TRE-HN*aSjWXk3S5#I@alh%^0eC=_Nc;Y0>?|Ntv-^QEs865v+<1Mc4vfe;qRw~wX?ouiHDk> zbTSwHMH#WZ_nS`sg6xoSiCw|%tCrjIc!@E?@PmGt>bFh>YlLsYE80o*kF?HDSQLgJ z$GMF#vj+-`a^+YJd^pBs4x6L1{U>iI|I34+T}6PZ#fkq%7=kE4?>o;s_|ts>T5VXo zcTrr&3pG&t1WYNw!ce9e>^sCiHvM+LG_^QHQ;O~yC_?`l!Sb=BwLgARihS3i-#7n% zYQugknd)Du?TO;@&LMIe(U3y^l& zz_hXWo$h+RNrLGs_i|cvofX7tg419_9Ljjl{O}MZ-AU1s?)I?TA&WMcC#a<%)uO!t z5N-#zLG;{(1)&8-iPMESP?74Q3Jr`Jf6No%i+~uVf3!1Z{~`-w#o>^O>}u72Ai6L^wkycEgDQs>o405NsdL_na-gbj1z02F#E<)Z z6Du)M-P2CZ{}R>VE|d1lK@Yv%Yf%poJi~7y4->))TErb@hk~6LaY0$&XG&@LueuOR z$CHP;5P&WrvH)~hzEe(hvMUApTS;Wtp{be+B-|r2kQhVU_)YMy4z;l4Lo13FJvX=w zErnB$>yQDA3LlNGXFakRjACeoCXl+FyW#3vI^ zv0+-15S?8_%g)9pv#zs7=dQYKE;!;waiekI7A}2L`)x3id!#>Gl-5?Or~+WYWRx>5 zQ~?GV`6LO>=ks5`x;|*(^t5IXyG9}@;WO!?^bV1?&Jkd4N*pQROVY^ToJdHuT1l1p#bt2k~@{}J8CdGsi~ioFo`uQg@fsSvQY zyBqzs&G6gyQ&qfAZ#T~hq2;0>6p5q|FvPaLgCF}vk@tUCwk(JC=2{@}Z!M27%t^LC=2 z>Z@-%E+||G8gCMhvKJaY6x4{Rg!S{?p^PVG3n=nK6TBm5DB~;f84&(_W4tRiybT5|}QWop4y?KKaI~=bigP-15 zt?^-Un!h&(Ozn+4)0Shn*wxQQ>)tOP#>cx^O%k8y-&PK_+PtM;jl5V?ncL132s8La z4x8F*`5~W0;uxW)N>cUE?=QHH4ESgtC&*-<6+6=BJ_&9;Gf7RmP|W}Tllb+A;s z*mFLz>8YOCXc;d>06Vg_CtoTQSljWJw8kZdM8`xQ$j|o5A!3ZLfX@C_ z@`>zkj-=iok8Ka%MBZpta7{c3W3XlmIham$r9KNuy$MS7pO{kJnE?DHA|BD_iT5*wN#)2uro8|@I2)lNQ9 z2<(*yyB{H0K2VNV<2KW)j0erzfL>B3WUPfjkT~UeSa5evi4&FbNNYj$IY)2c%7Ft!3J!W zbxGC_6&ds&U7{(mp8OR?i~P@+NvDWQ1YUtN^Jnh0mx&S9ByP=1an8!y{-9W-b=+gR z>s}R}xJ9}1YJG5D8mMJIX4xD4YB~PhzSD^_C0}pUwgF?SDS!)}#T>fxst zgnVtxZ7<3Xiy1m$JfK^ium>PZA^RtbBNnDiTv zd8X{G<~~QREw>!s%t90{zbm$@#na%93ghsDI+au3fOd2s-FTEW|YZ9M!%2dzECq8N?4s~uxmP~7Ki(zvTlzebY$-e$! zyFuTJoOw2$jtiANt*)fA(dT(yii9zpigf*4`_?3$@_zh9r3q0ardT!jQ~nq(#LOa0 zqBE@XotQnj_s0d2I{y4f+1i88usgNM%Ves4tZr1f_6-@DK$o6f6^rT&@c&d5tMTqi z_Bg@jLB-Z?PHYBd_K9?X@-aO%2Y<6^g`sN9?H4sJZ=zC354+9N(vJETUdo0i=NP4` zW>=WCL7B_)Wx2hlotRGSw}0>~Ys~7hn(y2l%DG{!`|U2? zZ9enJy1p8ZdlKu?&=a&N>08kNo}iW4&N#V7n9Lr2@S0c%WXMznx1!@qZvmoc!e9Uc zt7b=B#r2|34)&sHo==1y1aUfXqfeG41fSi}n_$08+Edx>EdEaGn!OKB@v?Mzo@I8A zFZQ^n^cnWC-*j|1r|-Y%;E%9)4~acnt6|UFN{)OY+Kb~d(smI0kmu;7ZpGjwYq%3C zp6LyS6nlD0Lsf?Qg~2hcP2BX(o0t6QN^dE5wgh`<$3rsWnNFCvBFf+q4^WUgIyo2tam8N zTP9labKjxU)11uv(0#f)Ha4s?N>FeAvFE3*%G?_p;+bx__T1BKY{iK$_)J9}*}zAD zcF{84#4Ywc-@uFRV!rFKq8O32GHu&ck2B^)=O{0mOluODK3waqM2yiGv*O?OZJsB! z`P8RJmK!%oTg4cRk}GF#{hW~LX-XPD5$MDd=V%?7Nz5XNzwdk?(9!A1Hzw@4=X)V% z=0L}@W=pOq9#@Isc0;$$TTPdaN912tb{6Tg7Yb%KV zS%BEdw|B3HwJ2r!J89^o&i&{+-x~GIxGr5E6Rp0xe3|e^Ppu9F!Kt1OC5|P#&YIh< zEg7vlkonEKYFu5mk#FRsSwro5Qg*VP^2`ASkxeo9^tJxZoRqy^6uq9Mls~gRZmHhM z_to36u4Qoi-jBf}@fsOY-b3e^onJ1ybfny?OOv?vh02&gnZWw2>h&df%PyVOr(7M* zWCnd`j@`>7*l#N&dU~b3;?)l;#oYATJgu2B` zOdr^%bo-LL)7}~lQSrFh`-fg#7kH~(c}w4tuO;WkJkMC0U%n>E*7GtEwrBc-U*@;8 zdu{(dT(4j1vdQfZ(`j41i+Uupj5|#lmyS!2z6)OLQmVqG6H43YD?1FU{qY+UN6Vii z6Za~zKmSFq7S?N-$B}!hU&~4)HZ;@c!v^QVZq`%-dil0|cv+q2cjweuXC^RO%FZ2f zfjNt!LZ@Z2uDwTE@QmTpm&2kvo(!!&`?&Jf^XERQ*N^R5<}J`%ss1|VeWB=BfY07G zCQtb>o8)_ELpz5~dYn4h(W~xiZjHk?-TJPo-RjJ^Qs`#)ieh}p{&{YahGo&Ze2?cA z{CjFM+pga^v!$SPZd1ceCxu2qCyQH}t-?Kz>|TcQ`rNnPzFNzf6PIq}z1JsgNPdh- zpO`$o$tYLNZ+(_FXPtV`A=bFShrXICW6o{wJiVr0_E`kO)C+}audymXk(%5rq;s7i z2$wnh+Gjl+l{lc^;C0W#QeJ4yPRoS+cUI}trA$TDyl*I38_GO-r zrDS4k;COIHRzdzfcMIn;YeTc2H#x=%nC*My#!Hv@aw?E5g^TIh{&iz4L+8iDJJrLV zE3P34ySk{38CiBTCm>#pDQZX-dZF0v|(xr|4x95*jFCU zVcB+*f8EsH9#n&&0QOeXji zaVehYDq7Pf!p~d3hmS?|Rn2$NALit620w=*pUbsBUdvGH{M>W1SnStFx`~k>3iE5? z&CzCvr2Xn-`GB$hOkGN5g6``G)xDW|lAk-`dREvRH1|#PRdX=8jpL+j^8OspHO5lR z;$QUo;=V0?;nl&DjTh@3H9O;UwPm%8XJ%yU4Bxg?m*!nmVpG}V!;n^26b>E8p+Y53 zk@`Z89|IfDFuQl#r53(k)+)_hv5VRN=`ERUS#?*3_0&{)3pWwHVAps-RDEo5=GnYz zy=1<6r$YVBOtPtFFom@v(T&O9!_d;=qW`Bn=IX6ZTT~c$9OUTROn6dAk|p5+V9u%* zU>ewsZl(vlAbZu zG0Tx_gGF~Z{;ZpH$cpZZA#-+6NvO&WmXP)xEf*!8Xn*8nC!Mv2X_b~M`DlZhA%xYR z@_-VcZDdkj>2nOoGRPywk!6OIW`T^vK|RTvO}p-N#RcE6Fl~DBSd>_Q~3>(r`tk2%z+4dDsEbX93!^efOx(m(sEf7_nw9m!y-Sg zWvQuo?Mpa+I?B5&A*1I#mq5oIpPlBjL4+0C4G9C|yDBK=4Z6eNPEMH_NiSIZFm;WT zI#@=$y6y@Q)7m?BwC^n)d3pNa^})#5TWLxG(8zchRNa+R!qk4N!FA?c4r{q{li~Xp zr==un6qZR5vQcYd%rFfKj{W({jz#O9fB%k);IbKc;&GEjKr+TI-#l3=YEV2OjvU35r#U>3vUjZQ+{`|cx#lraYo73cf+U|S|9n0t zzt|U>vnqwZI(hm9R%D3QD-{7Q$(S!|=*3riqb80!Qsa#(Jj>S*+N{iZQRmmP<21fK z4)`vdfmDeJ@b+k&6D@VyPt$nny)FPlBe|K+)2n8Zd2gOvJB1c z_o@&{IO?W2nRIy)4=SC3^fP=AgM~LfnY){LV7rC){d@TWid%M zD0eh_bxWL z6@5vZ#sbiFx_d@RV9E<5ed^~)^}+KmL;@q`y@~I3X8Va3-SiLUxY)Nc z&Q4S5hMN26){K7a99p7=UHlU$lxj%lZ(H3F-pK*7TfW`IQBYla%y#+L_z@5)+ z4|UN%4n-^!3JJWLxyiQr77MIQ8z>*S7+ACJCR$wle07-*Gkcwq`(zTn0rW1*V)Z1O z1Uj#@46SzAciZZfdOi1eiO4jsd#xEd3RWGK0?6FlHy2{;^v{J58Gt4ckP{7)6(z-a z>bqfX_Lfngz5-jsM1`PlvbusK;He?g(?Nb*D8l4bZ1^Zw&B8=}CClw|@hbDKPbgdi zo%QigaTWrB-rmLL_{`8(DMserS3TA#Sv0!9$!22JhT3UL(Fve8NRKT4SI2>#kAB6y zlWr>`KlM;%Z!~K;fKfMZSzTD6-?fUgYbMk3#Q5oaN^Ki!;pbCK7Y%)02s^E$>sq1c z_jAJjw1G)_PN`PKJ7e!JChQ`&1!b9?G~cN`u&3lZ^viYK)7<$RxXKh$-Ei-=`d>w( zqTT@;_HXg8Al=@QCZ@*UI(RYB{**QwHl zHRd$2V~lN%{#^E$*PDRbbD=|mE8fWc{G>qPa~X{vHuEzgUh5(sIB{%dw@m7l%_jzO z`d(kv9GX}sKb?a5GH@5TCZY3r1$~H+Uz^IWC#rA%)fAl-{SRBci>$PWvZc$hQ(+2d zPM5atn>TKLeNEt-?}dWIqvcm+3`-ndG^%!|T`m5&ZqSL&oT%+2A~W< z8kSO?kdbqvTkDfT$BpZ|*|Wd%5Z664vmKFb-ejYkzpP^DY)8jP0EJ;R($a+S^1h=X z?KW@Yj=u7(y|!q+vo|F5QCemqaI$yGg*rsh^*dT z!W&ucJ$7E9%}A(xnbS2Ev%Vm*1r->M06Sse)dOI7wF-dbp4fmXX2#zp{|)a-uFo(d z8wVBS*BDi3@jxiwiMOWBb7TYCn+Z|-AWtQLV6uM1@Dw?zaF3<;*6bkFTb2s+(VZ6R zCxR@qomS*jTIG+*|C~;Hr_;Exoux$cT)`;L&nm`v#V(Uy+(iXG=E}Bl@_2~?&xd}v ztz4hH1TjCjKfU#X>|Lk8ctq2BCNV%rjY%9xDJP35opZ<^5axa_-Wjbn6rPhhnNeCM zd2^&ZNw-NZ82t&$BdeJPSW+E6jzN$-P^gMiHQ($O9}=*N*0_nB0?t$lY_jb;)!pwg z)3*5{7(B)nMEt+$u8em2{MwMw}f(V^jbL(qq)i*3Oea z=nuRkGH4aU_+=Z8I9iR8<}{F@R0M3Ri-?iFhlvt`cjTAA=rH#}`&B@UFzt{K8~z^? z0-Dj*TE3y;Bmk}_2#OgWbh{P^Bbb39!t2Rrkk~iw?xC{ius|EgsQILM#B>pwJrs5y zdU1v7?&nT9YjI9YyH?0L#4}S(2t(Hwv{z^FCx6r3s2e^rT)MjL12fP+;#eOpaWJIr ze>1_2X7Ra=D5aN<&g_5YJwB?s|fYt-NNx;uq+h@x6VD|iUQs;LK%${StSGg9I#_vez+|#a4SJ_L|}So+BOVYuB$`e(0D5q@{uMv&^Xhe?VPa$8J`g2GNQD;IKV1>PyXMb2anPh z!o&KNN$zN=4tLPjr@uv2d}3KRg*S#_}$i>I0U1Zr%mKwq|Ed&_#Zr zL_=4^WIEagA}x?q4PS1t$29H_ik4{Hceyck0F>vP&{2ptb5*1&v_`k@-^mQB(x#qc zW)bKrx-e!>i7G>?aHttD{%he#t2^^n8CWbC5hFAf2O@W>1wT5r$Vo1^k7~g$m(58L zi0Dd99`>uyTpoq2GnmXBi9LbQTfSZUHMkDjjXyrD-U_nLMgv#|<_TG_M9q1%=NF|7 zB+Y!+(PG}7XXalKSPydg&rHBOReIBfatNXy(6Yd+B_IooYi9$sBt0TQAI>z`#P zHh_whgV=!iFd%t49Q`2{$D4%nZh!Hd{u&!K$^g+gnJ^2?>qkr$bOY2d7eL7aQEuX_ zU{^K7irNFZ(_hcszK$}d^c3pJx)D>Pbg%0ZtFdYDty}{dW04<=frdFB73y*-dlLaX zDWaEMlaR;ga%mDn0*6i3)Lug|gF;Le5Gjf?mmg{|e>fYyr~Ty?^s?VyoeP4`x~GT4 zz%oN$1wf072r!%%TlhGZbAtU@p|AJzee zNW0y(N9Aypb1Zj0HYdBHKtpW7P@@@|jT{#Z&9~r5sLZAkn+FT}p1ud;V*B$nq ztQc`4kg^J1^zd9jiDPn&WD?TXj>GqOwtkjhw;PnpA~e5!H6WTaNr3A$2k+$Ayp}B| zO?<3vZe6R><2@RR%rJiFheu`@A=PFPz`RjwFce){a}6T0zQD~IP<@F~Z}U-kqyy2o zpKfbYCR#rI*{*Qj<^)*c-EeN!k7==j5qW=@z=$`wV0}KEOgl>MWLd2?>?aV3MV4af z78htYIM>-!0;t!G|0LQ;X4Ox=z5VAh97b+snn)IG3R}q}f66RaJ`a4}5~k0E%$fLEdOUtWbzW>^u{vSc^0 zxqX<5d23oxe4PpeCXa95wIr?dH8ti0NIK!DraZf#vwu0rQPM5G3Zff)Ztg=0u?0i^ zD#BfA&YuA<5L$hxbbB7iBEd2Osi^QFK!va3`=yi~m=yRH6!d>(l|l*rx0q@LJ>tA+ z0OxI~6s;H;=0kQth{n>W+dZojs*rg=Bhe6emY{f?fqe|B%HZ{GyVVeVE$*fcxF!cc zT#3R1f5IcZRMWqcDn@&LWL5rOzRy%}iT;&!OPYf{O$}km)th?sgaXOUuB6wd2>YXY z2wv~oy2;P*$APXkBf4ZJK0qeD z_d77Q#^|{2X1Ftb%Uwv&9~O`O%B+_=67|}n=g>zF!O)d|_>W=BTv&^3NNsnUXQH04 zsFUN$2SBR%L<{hgtMp>l(%B?lSIbzaV#CWWaI zP5XO>1q#?=A9Cy=>7R9!eEDinq{Y^XzckiQ*-fS{4fF)A$1}=c(>>&J$svwWF_Bo} zKkv1gO{F76sZMEzCjOVQK!gxmJx6Lp8l+8X&ksgs1n_*4^dI$2h6&l})#Tdal`n)k zB2Y03byOmPO%7&CoT`Uzbt!_W74DP~?~GND+7F>&-)`$a9~f6E~tMBu`_>K_%t6y4e_R@+6rSp!sF;Y9w}9~OG>rUeU!9~?uagNLVKDwjU{+BHGyF(^{9@f>iS z!Nt}K(U$=_gh^s3)q@)NS%zI#b}6hU$0{&H&W+igyZ)+{C4-^1%+Zjl^^HS`IR->_ zg{C&7!4Z8d(8c}zE^Jbzt58T_h+-b6XkQF2euVPjH|@*Nsd^sYHl`H|4qAW_fP*%| zIrF%D0VkDvQV)><=wc#L^&7-)9=kX#*)Gz&!1(pP^MkfH20Qqhy zEMPY7w3`|P%mVmWmHuzkW(ZnfOo6%4;NUPBT7l>A9$Kn(=3pZr6>0@J2&gPU56^g{ zln;;m%<+uJWL(!0`QXa7_wI|u2P&x`!cY9?b+V9N z3hIb1^^?iVfJNp~EyQAI&wpG};(+kTd@YUp2lo#HAf6P6L>}Vy(8wn%wm&G&h0re> zeQM0`3eXb+5dt(EU2+hlKDj zSzrr5710IGBowi_4^~IVi%?IqCI>pFrBN!e5T!DUMX5B0%2P(~@ExHjF4`)XB2P_C z+6Zq%k&e>PW_q`2TIJw)R_;L@EkL0gV_~t7EQXYI0}e)z0c$beGB$<>i#6MweM$)y zQ>5fk+`~$&B`Dyukby1jkhdsTkUXqEA^?B2x;OvVqE)rWnguCJ+ELk$PyRtiQQDbH zWRpil89Iti?QTQJkpmcV#Pbk7O7G;rMqF{KuJEV^=h#+U6Wq*Yz4f;O#Pj6pjVOsC zdl^(fqz2B1Kk(A0q#=r8(V_t(`<%%lis3&FC&c-*h)7py=MVUaXya)>Sa2hj^hE<@ z>dI}XOpQy$vLjD#5`O$qYc3c-!{&L13L%trd`FL60bJ+gvaHx4%qx|%jT_d0 z5a`hJfeLGA>$g)HS{z95NSy0PdNd3qSBZ_o+%vB`s+1qvPmh%_1A>kT?7E9a$=BiQ z58U(hp^Ij5n7yFQ`AfZ*PXc9wddw1ADOK2xx!* zn;a3g(fZ6Wt)PqUl1w4UMS^+@^r3hR0SZ8s0nax-xWCEFbF9{aSO&RwplgDhw2>pM zFEV&;i-e!ne|qP=QY8upirZ~_7J5=8K?wNa(L5qMhF&Ydil|qFTn4LR_!F3=mxWcI z@w>$jeUx#Chd>Y#v6G0ES90}v<1lzezGf|= z!tk47S(e!7H8+)+$rbM+Io9|^Vf-10fq0IkxHbT(lnMg^;JWtb4kcIlx78l2y#b~? zKY)^fS{+8qJ7<*YR*-Wb6qe;cpm8xu`8s+8FgGhto@|kTepWHdckM6il@hLT65d~o zJL_S7CDPn{YixYg7)P+G_*}@>Zg|L$T@uTEcF?ammyD34n_q9` zNeO#}Z!5KoMK;E;mfSXf#CQouXix6XkF$r`dA?!1uCQ`UUEv;=`@iKdh2EtE zhe<)7*&^MIc^xnA1uN#1EuVekB{|WQ;u2ep^V!THOj)IH&d1s${0}V4c~to|P-g9b zWibOKTu8F17#^X5OusO50zoofB`sQa7s@fMA$Y~hrExHTWaOm!j2x)N<0WXoD4zU7CDO+aiig7XfXY}|73&DwddC3Idw z6N)p3;zbS?v3(;Ry|8sW_gk7z&!m!gV?0d&Q+NNb6WR;&9B9PA`72bwfg=A;Nihmw zaDlOz!sjhO%8R0FOMhhN>%D5|~M$2133eNQf^ z*GHly8Mzqy)aZ>yG-m3^E{+3LP$S%7hOg8-P;rkk1{i|A!ykoXxCohS#r?!9HcpqO>RZXBC+(bU%U2Am@{JWH%l^JIccOqp#jlC`Kvb9 zuw<|bs2=6@W}*vp4`AVTisVVQ*Fiky^|x#=D-_7Tkn;*93M>~AgyDRcoQ3&jc|>MhjPzYKFc+| z$MRR-9k8H|db?2X9ETip?>c7KNxUuw8N+Qu$fXS38s$LLdNyC95H}i z*)W(-!$`ByUWELKMQk84?+5|{4zj^Yw+i1o(6g&;S_oZdT8)MX`UNpZ1Jo#UusWOCs$-!=-0HWK%~BlSh3cLT5l-Gpewfu-7Smo zAvf@D4MJYY-CFdD7ez}tu2=YAhy0P0;Tz0Gb&|Y$@dwEM_eEJc^$_xa?HD|~@kAVD zgbjqb?o(9!$v6xTDEtdPwY~FYIq`=cyx|PmoO&>hIIDaMz2poIS^!MAJ*6)ws zEe&=)i)Nu0I-HQ<8oyK!1zwZ(;x_LoNac{~0j&X>2?=s>;H3w937~{w@T6w30p*Vj zf2_(zzvV4m!y~I9-Vyk~iE0n2weN~lKdk*vO$KkQ2$#crPZjN+@ZK6IT&>vOE%&rk z9z5LaMI-4DKiw>bf)c>pw-qfFIcbzt3xhYT0DKas29Vp(G9E($TzHocTD(%-tiBH$ z`KKO(8?x{3YD;QIw)O`{D1AQiG{R0I673{1z!i>=@Es$D43NwZhZCi}nxB^a7(Tbe zY&gY?gBxO)`m&juG3pRezUC@X@h<`qG0q?mYD=J6J&Y-(MdxEJ4aKEz| zIo7{i`r9tj!|t+p5!fz4G#yAF+O~X9&Nd~C6hp`>N?@M|Lc~A4L8}09+j?< z{}xWA{D3%|>9%)}Wv(THVcVXw6R@NwM|Xi9Ky79CO7s7k19!ddAA~<)xFJgAQv~`S zfI#JM^{$zBgPF(%D zeVUrStl?weroj)NcDX7Y+4|STYa5kTF&6Pu#TT;dUia=_ zzukGR0sd8Z+vCQt(fYEl+%h&RbmYSbc?V?~NJewa9~}gTtNt#LRO1S4qfNOl_@!h+ z&4+@CFWqs+8_z3UGZQnKp3jn<^De(BG}@+H!{4g?HR)%wr!2o#?x~^xHKwnnhl1P1 z#$x{3W4pxWl}`?ge#yz2B$9&BPOg zT0@U|;pEf=hG0u=_2eUwFYdf}d{DpFsx2_d`|$L)gYe*WzANlu?mH+==o5YGH`n7s z*mu6v-A;=A%FkO)HukTjVJUxpDiw;~6W+B~o;1Wd@Lzn<@3{G__NdsIXNb*@#6LygyR_F*4bPopR#dt} z>UaN7GtpZeyn4Yq1bnES=8Q(#bV=LQ`U`qZHcftt|J<=XeMgvS*YU!f?>BBorf?pR zPz1|VTz|{R_Vm8_y`JqW202Ch?GklT*%L?ZfREp=M=8n8{;C{wNWyAA8=RT~as-8; zhkc@(&=_H2Y^UB{6mVoyBY)-HvBw(o6N*6}gR`W-u-4O0XnB^iHnFElNY_n{vAk`? zyKSl_byDq|xA)gXgUND(ebhuecNH&)jZ(%c=cL{V6+)uc3Sz0UpAN~XjZ-qeiZR;s z(CIW~>h=#p8-IxXVqJ07it0J(UFifJktTfig*JgtwD(OL^Gxhc{kp+fOyhVvatyBA zOpNPaJG0Nq`~q8YSnE{g*?&H2{58(N*sK=4`-+2c@VQtXyYaaWW5-gvGZW>%L}Lr# zn>6i-Za-L((Z)>@-25;u*i)`Jmd3ZHb6XR!PjtycVc?$A|G;d!fC2D9yn;M$LYkjmtbzYMHhv7whx}#$wB?aKU{_N%Xg?_Qs>FMZaj zc<>R?3^8ra48ACeON6L(zAdFlO@`OwZO@m~*m4U4&%a$E2XHETyt9-NI>FVI0OdVw zW*T&wd1OG9)G2mw1ET*Stm3y@RZ zldTQ&9t8(DJqd*dPgOH^xrLKU`$Ml*zTJ2^t;ekUh@RnDUKSfRWs zOgrWLF%fV?IXRWbE5g^uIDlES==ZTDY94@(g%Ls-2GwOAIuJLTsac+4!qk1sglzcQ%VL69!i zNZ{})B#^rpl8S{f!FCB|w-nR;uEPQ|@*OZ84QbOf$cdIC4FkNY{+kyahS*Ewc%Mf7`j%N0s9f(p0=n zYt=giI~2<1^veI3!}?1xWmwzaZ$dOcarPKdw4TG zUE>!6InNCE;1gh6TQT`s=+}05H-GS6$ave1WxO?E@-^~aLn)bi*Tsh+35qJqWD(@` zX&yma4r4q~T^?clh~zl*Ajb(z;8qV-ik|Xj-60@SK8R7WmR8CuDBDwc#8N0ru!WYs znJ=uK)^FSOFG=q1WEKLaBECX_if&09h4uSJT0ag)RMV%p-KqG3*Yr?lpSh~X4}1dP zlUge^-k1HF?OIVCAb#Txil#|hu@S8?$wf9WQ#M*N0MU={s=m)iHPa*{6Enm$a@_F7 zqdeHj`ahjpXUeA3k8hj{*h`a$r>}wXrxDlVU}@v4+pYk3VnL8Yr)B*R1>qOEtJJ2-RvRkuRcOyL8%;-TW;86a-^{f@3d_L_2_lKh6+ z#2!d|KosSj*s2FY^2n;jOD3P_9j`7evLSrwzlk1ZA9>+YpwoG-A<1p9ipunc4(<8m zht&<3cJG`%p2OBn$zj7lS*UYKykr6oaJ?#uyf}}xX;5WDJT0Zl1|9XK^NNiygMlzx zYZPW%1fd>CN42bNeX0SGJTm@k>u8YEqHJUkVK7WdgxndyHpek#6W~^lNCFkF>x>O3Sk^*0 zF1=0;o!i%=;2(6Wb&4A=CCgc_W$9y31I5qa7?QC7FT9~Vr4s_>xNRo7BjqXC>`+Ey zZS}H@ja?frkFfqkI1^_WMrFB=L(T7?my5nHoqC>eXjZZU)01vFw8Qj9Yp(u~$N(&4F4m0Q>BArtKnnIU$ZfiKmIh0;I^`8$=>w0Qls$RI8B&Bm zkpT&lH)Mff0HI_C4g?fo0>x-t^*n>AGlTx+VNm}JXKS8txG(WpG6#)tfVJ?C!vuf@ z0s+!4y&1T%4#yzX;!C7|2ul3H^nnb;tL%@wvq2c+%3DOYwxBDZ$bc>VLZYKg6kKU) zt_b#|&GQUjg`#=&fx=h_gG$gMu9R4WJ=WRJKa~*j+$8k0Gsi_dHC4N>%is4I^^=m8 zAfG6ydY^L~PRbCw)`m7Kt08vH`5?K8=lVIS0vRNyqt2_kXg_X(u`vd0g+&|{GX&P~Fl0Hw& zy!hQThIFU!L{7@{8yYTM#pnK#58h6-k?%RJ=ZK1M3N0;ljnKzTO=5*s8mYcj?V&7N z+Wk7gyKj%?XA5{~Tz}ksJaDsy=LS~C0J@^#FS?DTytMqQcL{~I23w zt%Ctl$`C&Wtzlqh;wQ3fwr~`IJX%m&x(M}N^J{cw+1kuR{_^=Z}oxw(6_yz$D z07Qex_5*Xdwg?(^4?h7j7AhoW2v~yfqh`uT6{Df5cRwpa>tg}%Lf{K4@q{T~6dAof zIiMScA%W!B74aW`q#lzmf=72oG$L`?ABlp|R4+=6I?{ZN%c68#&js3)aVf<~ z1z1w^lYhbB;w-?7~ZWD$N1;Op)$e{6DNadk3uVtH*8FIWC;O)JKk!seY> zpRKuatcK6D-RXBk^6MK_zR%!`jIjf22{olL9uN2l@TY*h0XYh3YvXk=|VrqFvpyEe{ z?Z_&mx{P=N^Qh%Ej581bei{*8@BnZuXx#J9!IH;M&SNE5;PMg-P88tR6)fe~anit0 z7e&M|sNq~s)tZbjId4VWa_Z$T3MY3Co9#$i`z{l6gX1Y!uF zmWVv55>h!uzR3gvU~WK$_%53 z&g08meKf0tN_klUcAH#)QO2CpXjeBb{tCvGQ#ts!l84gdzxfZx?vZ`S*Z*C9q4o@M zN?Em0*6y0$r<||Wj)nr?1YW+sSQg0IkwBgAyn`HC2z&xbWoXKIEL+Ln2lBN|eHXVI zi&?u+<>{abOll7WJ~a)CDA>_e!y-ztWIM(wO#}5ZMelS91#>r`Yb^0+u(E+L7N15& z;$99ca%>$uJ#&U1C|SGe_45}a83_qX2?XmF$T$#KNe+&LBCiWD!?*n9mx4&uoiK9U zj~y$wAhi^TVn@(Y15qi)2R<->vUdLKQimA|Ni)R70g{$u5lGM+hK)+on{J?;BLmlQ;}{_BkW=F)sU}KrN#QDWr98A zre4D5s3b4$5 zn2OtIHi5NiV9-ZIm(F?5wjjHgG^cV5z6!XDJ}~bKvoZ~2RHS*9MZZU?USdFu&H{NFFht~ z;(+zP^aivrcR5l}cdXz$FQ$=fz^tzSm%Y4*EMP%SHG}mFb5Ws#!Gacso-bi3|D)YK zb(D3&JNbC{QmhSxxVvq=gBUniOecQ>b9Lo#+1UxZ54p%A3;miYl!ah;m=re!)ctQQ z7aR-I)k`vN+q<9n!zI3@Dqx~16yA<&7w<#kX!XBXJ>#4<{ARf>!r&%>;wkQ6LPxVK?m@{v`_;pqp_X* zCVVF^`>Q=VaoLDv0Bix z%-hTjsroP^ZvB1Wh;dN?fKyQO|5i#W9J>1&R6dJBNqlBV5#UjfsDjK>u^F!5(J4YR z!1r9pke3@(nb#4sD3o*>+=pfS(mX5<*nw(X$+N-qrHxAXG2{oZ`>*H$*8tf40)2I1 zSH7t9qhg-IkP_r7Hw+67W`*4Q-#7DQsU)hW4X_++1mMzlLT8>I9?5$Sa+J71Tu%p5 zXiVcxS(pEh%{-tU;Kdk~u)^iQ5j34N-8fUtL`D?O6nbd?Ug}b;Sj@1R57qt}espW6 zarg*^A!2TyL!*}?OB>)46f*Vf& zR&kSdRa~4os^js&?GiipJ;R@P1-Munb}^7XW0UruQ#_#Bk6X5y2e;wDqf3xkntWjI zkOn*iwbQ-{T=IVuahgF)UGQ}dNJAqspKYdtX;+5tAV>hS;ac$@*sCBn#Z?r%OHnsR zUc$@*IRM2Q%bh*0Y#rIywsc~sj1&F@gZ4_|p}x3Q$Y*LE=k)Cw*R;w~i=M|J5Qw@8 z3MW(eFypmrljXPhxWfb;MX1BD5qq=9>U|d%zl>?{k6;@7+7iMZHMEtFEE*~L0xk3? z*IV#eFzddQ?CJUdLej2}AT(i}`y#gL6*O9@w?$_)I?w9wDPR5DYEMO(db2>rVKeK=7ge4-{=?gsz zWJebmVR6J{k||Z{-v3stn8?X;fn@5wz6Pn{9nlhN!CUA@*jU_@GYU=d1jJ_xjeElN3p2da*!$0mZJS%7=oP7 zrcZQ7sG*rAV4e;>H#2`4If8++f>(M|tb$RaEAC6KQ$-Qs-dSd%Xa?x5b8*-s5LK=1 z19xza>BM;qkcTP|wXFNqreGemANTu_zx4tX)&vWz;{EQO%3vaeDe(WQw>vw9h1@iU zDiq?5;@pmk6GuA=cfHylzft%#w~h57v58WC*?!w|Pm%n_@gAQ`>Qnm~NFxWW&rsMB zNEdS7>g{S%rl|0dA!rK3WwhdLCEL7AcQ2HynAZl8vzDl-5mAq0Vh{@>2c3_V6NHgd zYn4b{T&Pz)ks+Ic>4Hn$sL4eyvW)?mOPG*ehV|j2dP`)aU{vZuGSWplDi4Qv90t!C z7-e(#0>vtp62255Gk|Ug`2I%bGYCLc%ngxu1j6_B(%Q16gzwiO&k%lc<`{5?s6T#u z*@#IycOu>Pno^$!bO3f)kf0j2YN;Ss&z|-7Zc8ynp7y|9JtKyqi?&$s6TjMW@z|Y$ zYoPps)!AH6Nc#OlIN>o`Qmt!u5N%!fDrD&cky+tUublfHH$SXkDdytEh*{b>+2$3M z%;4U6bMEp;ewV|zOJ9a#u0r9O2PiEZGGpL*U2yuAoHVJii^j1<%Szqw#sl|&%b@kQ z8y}|oHwA(Gh}YOB)IsN1L>l|&9Qp2@tz>cl@DaU+=TBXyIEw3NiK58W+8zB0PKM6O z_vmsKq^Aw?9huj^B)Yo?pDor>X{7AO$9eY!UZ?}6@G&tAJEU|HoXab6BUWq2ALpM! zESX2wyr&HElWC>r%1h54K5{I%3&p!M+@)G*qw(9^-5N}VEf9xNskeLeO6SsAzFXe~ zG*Saoxx(-T`N@Tu%MwoyOD;({@?t8tFhKBz5d=>ckaaY&e_aOUbrR5C7A!qzK~8M+ z#J2FTQm!#tBkgiV1+@OY)2I|3gqVHc$(m(vCf$54S}?R}_IzrVb)58HSHeIscGV#F zgy3E8B-S-8o!=rl5<2Kv+dWE2Z-@6OkW`2>XGrevKK@XM$oJf*>OFU_v+}7|)0*m4 z&-DER#HlzlvXdID)~Rj&-jcPcy>PfLukEk?&_E5BVzXqI5ry@;)i>*3^^M;Z9$&Qe zZPZ(^{^(YpjilqYff_VjH0b9`V-|I7TC;yE=4M}e2vT?aOXb16McSIE_PIK}+bdJ{ z9)ok;{lo9A0u@}0VwxHDzJ~WllJI6*nS@mR6KBR zh0fsdmax6?mb=_m-v6d@YlF(Rafv6<0`cF^ZU~Nt9;WcbuXFXc5r4FHm(y;HKZ>t> z&t1;z;CIG4d^lXOt%o-N&V;KhKKr$UQ%s<8Z13&|T>r-hPI--ZhetR|z zGoY~_MNp|@J1mf^%VejvI>eMXTG*Xuxb|7n%DcA4=bHER*QmU#F0M^V)!DM2f$BWB zYY0QOD9Kbi-F!SMyp> zZP*H16rZb--A^#A)BMh^cEe5}GFQOy;#NMUZ9!q9RCU^lt@UrXzQWn_FV%)w=W**C z?3FuN&NY{;4vqo)SGm}(x)=5E;7o`Z{F8-qBFawwm2R&rXXX!a8I{DKo>u?M*?Zo6 z@o24l@T|?pIZ&_FL#(c*&MNL@b<5;{=!AD-PT|Xv)#d+Eu~-CsoTQ#i-8yJ+4*z0| z7!Y8Ys58CIJA7r)_Q$+Dlo=|{5krOL-m8dwcw`eIADWbyPhpGbIFaY~*BCbzzvleW zVZLuVep1@EIr8{afUXm4O=23qSZ*$~e^h&pHgDR<+TfJMqvEOH$gFiw;69n>yq{kR z?=YFBxMSX7_j8`@=2L5Wk2^}QQ9Pa=#Q-xUWatLKMd9UvQ+g^7u68Cwl5ACfBsD7c zPA11IikjLzNuIgeD{Fme+t-MRsbp%$3SS-OcXonvuS{pK6-^wvP|ih)LQxcR?dz)pssDD`T9Xao ze!&sGT42%K#OMJ21828|L5C4{p2ODR4X&-W>o@GH*_8Mk9ZO;boI27XB5fr1_V#vzZDJC!x;0gGr&I3k z){0NLvCniHhvbp8AvKbB3&DMUN5Bt)YtBZs`yG!?rWnt88vir*O4syB%!I41P;tJ# zX|u3jnR@>l0(yF!qIQEQ65Un3)BI&vELraItQ`@^+QDbJxrI2=Y|!YdET^3mDW&zT zR)ZA;GV0InxO67BnCs=7li{0z)ZMWO;$?>p4Xkj<&lC15Vy&?|LX7mBRSL5Y%#{_9 zW%&8LbDO<#&-UX8?@1yUJdiBgd#VJE*Na+Lm+0@iyvA=2BCcE&|X`}}G3c);H zU|T_^2{fR2vwLCdp1TkqnJJgoyl!5~Ae*Pc)J}8Qa-KpR;T9+5X9YYf3 z9uN}OyS$CiGLmB>B#CDTMcqiP0GA+3#lWXZ^;G>wUmtH$ZRfXI6@AE+FAJy^KO_## zv7bvW8{hZlW=itNC!?sRXFBSXzaBGrpSGrLucfg7y$yamS5y)%zzEE~$tFAZJcewi z44UZgA~P;W#Y14uV#fQb1|mNh1p$7pY$NW~1j9YNk7g~u-S+t!LUip3y=Ezw)iGx~ zT9y6UUkS zy)mZxV$7ts3?*hV9`nq0Wt#-HR1ff#ycYG!))G5l@cLh>2Xd;s*6rJhM;Uw3W!;Gr z4`U3|S(5@XV)n)e{>OUlt?CVbufFFZ9j=+id(J1kygwXH!s$xcI0-m)L}hfs z>!FBO_^pT!%aRsvx_SIG60y}$FAj>7Y>4Y^TSW&}5Z-F*80fOeeGpH$x4Y_~-}XjUUk^0Ef(i9M3VblY0((6G z(qL$>WHYSGHoJ#Z|CSVBd?GJo6QOlWxl(|!xHm~LHm<5B{AR4(R5$~#K1}=eOj%yO z%i1t|kVx>Fl?cqdhd&k1(Lc!b>7#Z9hu1{ zPA671qgKo2r3uW#QIl{Cj|`#s)Kt>%^zj}R={UpV25D}C--r4jKT$_>n7ei86M?CB zLQdtE363$s~GLU1%Lr+XC>Ub{mZhXD^y* zm+}HhHT}`Otu5_H9~Ul+;i|MKEd`FNijyM+wwSs#3Cw@x-XIN{oHa*ktg~$hdi6Jp z?`Rr4YHJNF7Hf@v)NPq`bykLCKJ1jA{^{qCw}YVM!+sItI=Ohym8B=HKl#AO^PE=y zW9ap@kL+rD@drL*s6kf)+3k2*H8U9FUjp_^I#Rso++KM zR#u_o5tQT*>Gv|qPxOAEn z@9r#oUjz+w4mGAUOjA812%?$(tqigrFa+bwFH@e(VD4X&lyF_$oHxAHu=Mg7Q9V$^hYXI$L{rk$h_y;oLZSiax(W*5oi` z`m)&Wgy*hta*&Pz#JQ9YXbUfpAyLY--{>m7c)?fS>gYF9$Mpe>8XhTkr>ow%E% z(tSSvdxxThqSk2ADVEzpd2k#&$Vprs7Sns-68C4n@Sf`Gy{hZIXZfl&?^yGq^Xh2R z;X%gR8D48w;?H%4jr)~uc%kcP2V?|Kz_Ph)shD_f4AjJ+mBEMmLHJr4!lFZCMORvx zeqvkgYNX#zU<6>ug@5X&{_f@bEG+TYU+$-cTZGyC&oJ|h(5A(S499&O@|^Ce=WzRye+3KylDB}pwlM9#`R}61WSOBda%^+ ztZB!67WlKsL%RtVvRS4b%Wc}#rL-hZ>5kk6JO1{#^@bJs!_=R-iO+ghpQ%bA)ZR8U zGF_{nyZflgCrzJIZRSp1_tSLULN+)ETluNGm{QrDlx287bMQ^$tFpHeN6pQ$Y9scY z>ixC#cw~U=>CNQlhu9SQzTy&8tA|92zXwNQcEJ5+`}wfoKv{A)p)qBcxHM=}sMLYY zioea&c`)vsEI*V!^UPOvo4xTMT&?TjD>fP0U4AEB;aQ~u@0E56!xH|^ zk@=;ZAvB3<`+Au;`I^rg4Ycm3M%CCAjhVCtcG|!3Cx~RKK6lAzdj4&#h0d)ZN2eks zd?x61sqNG^dqr!m$S&!t;RT(wlGyZ75EcX&HZZbFqNAB1o6GJhamY>c{BU;x0F6%c z)5Q8HT!9~GF8C?GzsJCn6VwTIp^Pb8c*fh(OWkxBh6CMZ_i=f)$ZZN)bCcUhWl(}S z@@Vw4wsoy-2Kv|KvpkYp?yMa6rAqF&=ri+sD{{tiS^)%D5_y;Fff*VXH_dhb^;r%k9qUy|v0|8=BqrTswI@=p@|bH$LZ{ zjCDTDTmaISg8k>N4b)jl^vdodmbyvgtkwSIz*t@CGJfK|Cs)+1_8h^ypDz-b{FRzQ zqgN3bIK_^l+YE9{b*@@jzs)J0XCKqN`TZ)coPNGkISpY%;q?H>rsX#DJ*u^IjWIQ& zLQTU8>Ckwj-g|ZYCt$K83Vt)l%*3mTi zztK&8X(_#L_l4{;C3>lMd3P8z)9ona{mMkGXV_BKg9`oDz^BsU@UES5cxZg_&FflB zV$E|Y_u#j=r`;(KuJ}LHJ-YitoN^LNUru(3PDL9NK@W3@>EZCX$BUzlhbF-#90cnJ6H&HE>i$)t)ZY;8H+HsA0NB zR`g4qkvf*m)!9et+54QS@4jVXiq87*X$60ZJYF2;^H`zzN>#|~dW};H`4f=9D5-y7 z_A|;mItAN(luVS1#Ym*KVzzq-jIa`Qb6|BSv+;Ht=hTxYRm}NbHbNm3tG1 zEU$i96QDw^^8WJX%Uk39bTV4J=}3M@h*`m&?Q$DKSZ(A~UB=GXGzyhr!#cul|(fnmr-AK1uTmeX^^3;!n$> zt?oW5w|l?%9Ijg}_5Bjbu!X^0XR}cv$$glLRMn&_{PxxS=cFGGHoSS5Adw*!=%BQ| zEY1!uFo?y+xKT?%$QNe(m4^ZvaRB%>2FRx6%DHR%d_Sa7=r|xtliB3v3an{vncrq5 z(5CDDyu{SiK~|RTIscw?Lcgu?g#pIw(w$VP*GDox#H#3MrO4gYV93vLY2GX?8EYR_ z*vw35-ScD9=JOSV_q)gPChmXLxBbx1=A9k z?mCpGy}WTXdPZ_>)n&KxR@&c0HEc$7h^=PKxT$o?>D<3misvtv?cV3FK>tb8>X1u= zW!!$E<;NT^Hj$i29jgR%KG_I|dv5;>tMxTMJ>Am3zCUfk=TnrSQ!yNj}bi~@E@&k0laR>1S0^Ti-N;n$IFF||&+?oJ36FkT22s8WE&)r{>W;27xk zaNp)?xD7cXl|Oo?H6m@pZ(2-iyuLf2F;Zt>e2;Nm>4XZWvWJ3mNi}2q`u8uyID(D3 zK9R&`RGdBdhnvNYF3=!rn*wCpX}#<1~dtpjEk+*WOrvg zY`BSKJ0Ja>`U^bFpR9JI5xplIv#Uf*64gBAYA;<$3osHsG|#9i+j6Pk+ex!$SjXs? z<#N%p5WWf2p4JdF$bVFf?B9)$JAP8{k2)*xIQ^!xDkAE;N~^sh-4s6bsfo{&$>^Dx zc`O}jIQMQ+(6n;*l5smi&!ya8Ez#K|LDC&g(H!1Z=k4UM8%j8_*G^j#f5^e=JqJ_BB<7yEWp;9?dtS9w<;Bux#@QXkkim9imrEyPvaU)|WKg4NVHZ=HJ40i82=i7Wb9 zCQcA1OSnvr_My;!&~Vv33Rqnqzd&*xUPJoU?52>$CXxK4 z>J^=7UW!F?=El`#DO)-GG-S7v_}c{BD~_wVavgxvnZJMa+1qj-;C-3a#G*9Puy^W) zv?Tw5#(^)`S4C*x)_94^{OXQ?z(WHSfhc>kC|sTq++&SFAkLTt4D{;FkK$1#UeU5l zyv&eRNV@cXq{CS)B06h5tdgl6*>Jc#$){}h*k`848P}L|`&)LoXr~r_4}P5iZ$2g{ z$i_5n8K|t{<~P>&S-1O|t`1rqk$on{MQw-0xnibp**h6ly#{yD=$X(U;DX&;UxYWr z;BhJt=kOV2o#26)ZDGH)tnHvMshkb-80KCxD@+;)Be^uI59@y3G`t}&GifkbdY|6a zYQb|+>SipS+vHVNu|m69{m!Z|Kbxm2Q_einN=b{0y)s!bneFccuPI|r?Grh*oqPvQ zK)cA8Vxc5{5Dm$425Y#uY=OdA-H|Ne4#Wlj1>yqcE2VY>|JIjX|G_@Tg(QZ+fJ`9* zn$3Tp*>nz}G@Fj^UTM&@GH-KkZwigN-f8Z$Pxq+NLDkN|XZMW4bs$l*iCyJNeAK!eQ~2J&WC=gIdyRx zv?awUOQj@JnRaY*Z<34N4*&8K`}V*}PL(D@4>gm_N}y2QV`snE`h2p#=Vn4ljO$bR ztvk082BSZE(QLpDp8CsJ1y^U0$tDrNIGy@=iFuBDlKNn+Q79r7LYlj2xkJ}X;~DjbKLIQvbXTmIV>zt-h1 zo^ixrj)xtZVMcPhPGXUNon)NDL(@0m|mT{Dr9k8&*xNo$p-Qv zNSt@X)_`$cGg;!w{j_!TpD@w(cRcWZUO)K$Yu$t?4EJzVoCDUuEz`ciNU9bm3ShQA zINU^A0&}^UN}Xb}OPEILXVz7mliW9S_4?kD-lBE>st-s0&h82#4z+fFW>`;h>&=!U z!AY{#>qT-LJ+M>wCu}ZyXb8C; z{Pzo5&YN=2?yZ>TB{_(0(CxFC@TSVp%y3WSRMZyf?ca59%Z*@qm5%+hANWO%$4PAw zhbnSCNuBti&HiYfEN5~;1&dj|I!m&Bg@CrXn0^ zcQ&>y9iPw09x5`)AwJBX7avY>k+yHAP0dat25D*a)afa22x1+pKW1sXp}9#*ljoju ut=m!lJ?!uEtD;_~JUXMHbdKkB?0pZxh`;`=#1`6Au+;wl`9JD^YyS`A?k&>* literal 0 HcmV?d00001 diff --git a/cmd/jaeger/integration/kafka_test.go b/cmd/jaeger/integration/kafka_test.go new file mode 100644 index 00000000000..62d73c4b89d --- /dev/null +++ b/cmd/jaeger/integration/kafka_test.go @@ -0,0 +1,102 @@ +// Copyright (c) 2024 The Jaeger Authors. +// SPDX-License-Identifier: Apache-2.0 + +package integration + +import ( + "os" + "testing" + "time" + + "github.com/open-telemetry/opentelemetry-collector-contrib/testbed/testbed" + "github.com/stretchr/testify/require" + + "github.com/jaegertracing/jaeger/cmd/jaeger/integration/datareceivers" + "github.com/jaegertracing/jaeger/cmd/jaeger/internal" +) + +var correctnessResults testbed.TestResultsSummary = &testbed.CorrectnessResults{} + +type KafkaIntegration struct { + receiver testbed.DataReceiver + configFile string +} + +func TestKafkaStorage(t *testing.T) { + if os.Getenv("STORAGE") != "otel_kafka" { + t.Skip("Integration test against Jaeger v2 Kafka; set STORAGE env var to otel_kafka to run this") + } + + dataProvider := testbed.NewGoldenDataProvider( + "fixtures/generated_pict_pairs_traces.txt", + "fixtures/generated_pict_pairs_spans.txt", + "", + ) + sender := testbed.NewOTLPTraceDataSender(testbed.DefaultHost, 4317) + // LoadGenerator will be shared across testbed testcases + // since we will validate the same origin data provided and the received traces + loadGenerator, err := testbed.NewLoadGenerator(dataProvider, sender) + require.NoError(t, err, "Cannot create generator") + + tests := []KafkaIntegration{ + { + receiver: datareceivers.NewKafkaDataReceiver(9092), + configFile: "../collector-with-kafka.yaml", + }, + { + receiver: datareceivers.NewJaegerStorageDataReceiver(17271), + configFile: "../ingester-with-remote.yaml", + }, + } + + for i, test := range tests { + factories, err := internal.Components() + require.NoError(t, err, "default components resulted in: %v", err) + + runner := testbed.NewInProcessCollector(factories) + validator := testbed.NewCorrectTestValidator(sender.ProtocolName(), test.receiver.ProtocolName(), dataProvider) + + config, err := os.ReadFile(test.configFile) + if err != nil { + t.Fatal(err) + } + configCleanup, err := runner.PrepareConfig(string(config)) + require.NoError(t, err, "collector configuration resulted in: %v", err) + defer configCleanup() + + tc := testbed.NewTestCase( + t, + dataProvider, + sender, + test.receiver, + runner, + validator, + correctnessResults, + ) + tc.LoadGenerator = loadGenerator + defer tc.Stop() + + tc.EnableRecording() + tc.StartBackend() + tc.StartAgent() + + load := i == 0 + if load { + tc.StartLoad(testbed.LoadOptions{ + DataItemsPerSecond: 16, + ItemsPerBatch: 1, + }) + } + tc.Sleep(5 * time.Second) + if load { + tc.StopLoad() + } + + tc.WaitForN(func() bool { return tc.LoadGenerator.DataItemsSent() == tc.MockBackend.DataItemsReceived() }, + 10*time.Second, "all data items received") + + tc.StopBackend() + + tc.ValidateData() + } +} diff --git a/cmd/jaeger/integration/receivers/storagereceiver/.nocover b/cmd/jaeger/integration/receivers/storagereceiver/.nocover new file mode 100644 index 00000000000..4c28ea5d152 --- /dev/null +++ b/cmd/jaeger/integration/receivers/storagereceiver/.nocover @@ -0,0 +1 @@ +FIXME \ No newline at end of file diff --git a/cmd/jaeger/integration/receivers/storagereceiver/config.go b/cmd/jaeger/integration/receivers/storagereceiver/config.go new file mode 100644 index 00000000000..bd8a5225e9a --- /dev/null +++ b/cmd/jaeger/integration/receivers/storagereceiver/config.go @@ -0,0 +1,19 @@ +// Copyright (c) 2024 The Jaeger Authors. +// SPDX-License-Identifier: Apache-2.0 + +package storagereceiver + +import ( + "github.com/asaskevich/govalidator" + + grpcCfg "github.com/jaegertracing/jaeger/plugin/storage/grpc/config" +) + +type Config struct { + GRPC grpcCfg.Configuration `mapstructure:"grpc-plugin"` +} + +func (cfg *Config) Validate() error { + _, err := govalidator.ValidateStruct(cfg) + return err +} diff --git a/cmd/jaeger/integration/receivers/storagereceiver/factory.go b/cmd/jaeger/integration/receivers/storagereceiver/factory.go new file mode 100644 index 00000000000..c992f8aa11a --- /dev/null +++ b/cmd/jaeger/integration/receivers/storagereceiver/factory.go @@ -0,0 +1,33 @@ +// 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" +) + +// componentType is the name of this extension in configuration. +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) +} diff --git a/cmd/jaeger/integration/receivers/storagereceiver/receiver.go b/cmd/jaeger/integration/receivers/storagereceiver/receiver.go new file mode 100644 index 00000000000..903193ee01c --- /dev/null +++ b/cmd/jaeger/integration/receivers/storagereceiver/receiver.go @@ -0,0 +1,142 @@ +// 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/grpc" + "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 := grpc.NewFactoryWithConfig( + config.GRPC, + metrics.NullFactory, + otel.Logger, + ) + if err != nil { + return nil, fmt.Errorf("failed to init storage factory: %w", err) + } + // TODO add support for other backends + + 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 { + for { + services, err := r.spanReader.GetServices(ctx) + if err != nil { + r.logger.Error("Failed to get services from consumer", zap.Error(err)) + return err + } + + for _, svc := range services { + if err := r.consumeTraces(ctx, svc); err != nil { + r.logger.Error("Failed to consume traces 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 { + // Spans are consumed one at a time because we don't know whether all spans + // in a trace have been completely exported + 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 +} diff --git a/cmd/jaeger/internal/command.go b/cmd/jaeger/internal/command.go index 478e8ec327a..683ddadf886 100644 --- a/cmd/jaeger/internal/command.go +++ b/cmd/jaeger/internal/command.go @@ -29,7 +29,7 @@ func Command() *cobra.Command { settings := otelcol.CollectorSettings{ BuildInfo: info, - Factories: components, + Factories: Components, } cmd := otelcol.NewCommand(settings) diff --git a/cmd/jaeger/internal/components.go b/cmd/jaeger/internal/components.go index a93cc19f9b6..0e70fa0d090 100644 --- a/cmd/jaeger/internal/components.go +++ b/cmd/jaeger/internal/components.go @@ -30,7 +30,7 @@ import ( "github.com/jaegertracing/jaeger/cmd/jaeger/internal/extension/jaegerstorage" ) -func components() (otelcol.Factories, error) { +func Components() (otelcol.Factories, error) { var err error factories := otelcol.Factories{} diff --git a/cmd/jaeger/internal/extension/jaegerstorage/config.go b/cmd/jaeger/internal/extension/jaegerstorage/config.go index 69f339926ec..de69ef22eac 100644 --- a/cmd/jaeger/internal/extension/jaegerstorage/config.go +++ b/cmd/jaeger/internal/extension/jaegerstorage/config.go @@ -5,11 +5,13 @@ package jaegerstorage import ( memoryCfg "github.com/jaegertracing/jaeger/pkg/memory/config" + grpcCfg "github.com/jaegertracing/jaeger/plugin/storage/grpc/config" ) // Config has the configuration for jaeger-query, type Config struct { Memory map[string]memoryCfg.Configuration `mapstructure:"memory"` + GRPC map[string]grpcCfg.Configuration `mapstructure:"grpc"` // TODO add other storage types here // TODO how will this work with 3rd party storage implementations? // Option: instead of looking for specific name, check interface. diff --git a/cmd/jaeger/internal/extension/jaegerstorage/extension.go b/cmd/jaeger/internal/extension/jaegerstorage/extension.go index 60db1d9ec9e..0b9b7526f7d 100644 --- a/cmd/jaeger/internal/extension/jaegerstorage/extension.go +++ b/cmd/jaeger/internal/extension/jaegerstorage/extension.go @@ -14,6 +14,7 @@ import ( "go.uber.org/zap" "github.com/jaegertracing/jaeger/pkg/metrics" + "github.com/jaegertracing/jaeger/plugin/storage/grpc" "github.com/jaegertracing/jaeger/plugin/storage/memory" "github.com/jaegertracing/jaeger/storage" ) @@ -70,6 +71,20 @@ func (s *storageExt) Start(ctx context.Context, host component.Host) error { s.logger.With(zap.String("storage_name", name)), ) } + for name, g := range s.config.GRPC { + if _, ok := s.factories[name]; ok { + return fmt.Errorf("duplicate grpc storage name %s", name) + } + var err error + s.factories[name], err = grpc.NewFactoryWithConfig( + g, + metrics.NullFactory, + s.logger.With(zap.String("storage_name", name)), + ) + if err != nil { + return fmt.Errorf("failed to initialize grpc storage: %w", err) + } + } // TODO add support for other backends return nil } diff --git a/go.mod b/go.mod index c6ba0bad6cb..3644b938737 100644 --- a/go.mod +++ b/go.mod @@ -82,6 +82,27 @@ require ( gopkg.in/yaml.v2 v2.4.0 ) +require ( + github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect + github.com/expr-lang/expr v1.15.8 // indirect + github.com/influxdata/go-syslog/v3 v3.0.1-0.20230911200830-875f5bc594a4 // indirect + github.com/jpillora/backoff v1.0.0 // indirect + github.com/leodido/ragel-machinery v0.0.0-20181214104525-299bdde78165 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.92.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.92.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.92.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.92.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.92.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.92.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.92.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.92.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.92.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.92.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.92.0 // indirect + go.opentelemetry.io/collector/confmap v0.92.0 // indirect + go.opentelemetry.io/collector/service v0.92.0 // indirect +) + require ( contrib.go.opencensus.io/exporter/prometheus v0.4.2 // indirect github.com/IBM/sarama v1.42.1 // indirect @@ -99,10 +120,10 @@ require ( github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect github.com/eapache/queue v1.1.0 // indirect github.com/elastic/elastic-transport-go/v8 v8.3.0 // indirect - github.com/fatih/color v1.14.1 // indirect + github.com/fatih/color v1.15.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-kit/log v0.2.1 // indirect - github.com/go-logfmt/logfmt v0.5.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.3.0 // indirect github.com/go-logr/stdr v1.2.2 // indirect github.com/go-ole/go-ole v1.2.6 // indirect @@ -112,7 +133,7 @@ require ( github.com/golang/snappy v0.0.4 // indirect github.com/google/flatbuffers v1.12.1 // indirect github.com/google/uuid v1.5.0 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-multierror v1.1.1 // indirect @@ -136,11 +157,11 @@ require ( github.com/knadh/koanf/v2 v2.0.1 // indirect github.com/kr/text v0.2.0 // indirect github.com/lightstep/go-expohisto v1.0.0 // indirect - github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect + github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c // indirect github.com/magiconair/properties v1.8.7 // indirect github.com/mailru/easyjson v0.7.7 // indirect github.com/mattn/go-colorable v0.1.13 // indirect - github.com/mattn/go-isatty v0.0.17 // indirect + github.com/mattn/go-isatty v0.0.19 // indirect github.com/mitchellh/copystructure v1.2.0 // indirect github.com/mitchellh/go-testing-interface v1.0.0 // indirect github.com/mitchellh/mapstructure v1.5.1-0.20220423185008-bf980b35cac4 // indirect @@ -156,6 +177,7 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.92.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.92.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.92.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.92.0 github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/openzipkin/zipkin-go v0.4.2 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect @@ -163,7 +185,7 @@ require ( github.com/pierrec/lz4/v4 v4.1.18 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect - github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect + github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/prometheus/statsd_exporter v0.22.7 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect @@ -193,13 +215,10 @@ require ( go.opentelemetry.io/collector/config/configcompression v0.92.0 // indirect go.opentelemetry.io/collector/config/confignet v0.92.0 // indirect go.opentelemetry.io/collector/config/configopaque v0.92.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.92.0 // indirect go.opentelemetry.io/collector/config/internal v0.92.0 // indirect - go.opentelemetry.io/collector/confmap v0.92.0 // indirect go.opentelemetry.io/collector/extension/auth v0.92.0 // indirect go.opentelemetry.io/collector/featuregate v1.0.1 // indirect go.opentelemetry.io/collector/semconv v0.92.0 // indirect - go.opentelemetry.io/collector/service v0.92.0 // indirect go.opentelemetry.io/contrib/config v0.1.1 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.21.1 // indirect go.opentelemetry.io/contrib/zpages v0.46.1 // indirect @@ -216,8 +235,8 @@ require ( golang.org/x/exp v0.0.0-20240103183307-be819d1f06fc // indirect golang.org/x/text v0.14.0 // indirect gonum.org/v1/gonum v0.14.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 // indirect gopkg.in/inf.v0 v0.9.1 // indirect gopkg.in/ini.v1 v1.67.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect diff --git a/go.sum b/go.sum index 5bf8caf5f8d..73e1ba827f3 100644 --- a/go.sum +++ b/go.sum @@ -79,6 +79,8 @@ github.com/bufbuild/protocompile v0.4.0 h1:LbFKd2XowZvQ/kajzguUp2DC9UEIQhIq77fZZ github.com/cenkalti/backoff/v4 v4.2.1 h1:y4OZtCnogmCPw98Zjyt5a6+QwPLGkiQsYW5oUqylYbM= github.com/cenkalti/backoff/v4 v4.2.1/go.mod h1:Y3VNntkOUPxTVeUxJ/G5vcM//AlwfmyYozVcomhLiZE= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= +github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= +github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash v1.1.0 h1:a6HrQnmkObjyL+Gs60czilIUGqrzKutQD6XZog3p+ko= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= @@ -130,9 +132,11 @@ github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.m github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA= +github.com/expr-lang/expr v1.15.8 h1:FL8+d3rSSP4tmK9o+vKfSMqqpGL8n15pEPiHcnBpxoI= +github.com/expr-lang/expr v1.15.8/go.mod h1:uCkhfG+x7fcZ5A5sXHKuQ07jGZRl6J0FCAaf2k4PtVQ= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= -github.com/fatih/color v1.14.1 h1:qfhVLaG5s+nCROl1zJsZRxFeYrHLqWroPOQ8BWiNb4w= -github.com/fatih/color v1.14.1/go.mod h1:2oHN61fhTpgcxD3TSWCgKDiH1+x4OiDVVGH8WlgGZGg= +github.com/fatih/color v1.15.0 h1:kOqh6YHBtK8aywxGerMG2Eq3H6Qgoqeo13Bk2Mv/nBs= +github.com/fatih/color v1.15.0/go.mod h1:0h5ZqXfHYED7Bhv2ZJamyIOUej9KtShiJESRwBDUSsw= github.com/felixge/httpsnoop v1.0.1/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= @@ -159,8 +163,9 @@ github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBj github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= -github.com/go-logfmt/logfmt v0.5.1 h1:otpy5pqBCBZ1ng9RQ0dPu4PN7ba75Y/aA+UpowDyNVA= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= @@ -261,8 +266,8 @@ github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+ github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI= github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8= github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed/go.mod h1:tMWxXQ9wFIaZeTI9F+hmhFiGpFmhOHzyShyFUhRm0H4= github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4= @@ -292,6 +297,8 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= +github.com/influxdata/go-syslog/v3 v3.0.1-0.20230911200830-875f5bc594a4 h1:2r2WiFeAwiJ/uyx1qIKnV1L4C9w/2V8ehlbJY4gjFaM= +github.com/influxdata/go-syslog/v3 v3.0.1-0.20230911200830-875f5bc594a4/go.mod h1:1yEQhaLb/cETXCqQmdh7lDjupNAReO7c83AHyK2dJ48= github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8= github.com/jcmturner/aescts/v2 v2.0.0/go.mod h1:AiaICIRyfYg35RUkr8yESTqvSy7csK90qZ5xfvvsoNs= github.com/jcmturner/dnsutils/v2 v2.0.0 h1:lltnkeZGL0wILNvrNiVCR6Ro5PGU/SeBvVO/8c/iPbo= @@ -349,10 +356,13 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/leodido/ragel-machinery v0.0.0-20181214104525-299bdde78165 h1:bCiVCRCs1Heq84lurVinUPy19keqGEe4jh5vtK37jcg= +github.com/leodido/ragel-machinery v0.0.0-20181214104525-299bdde78165/go.mod h1:WZxr2/6a/Ar9bMDc2rN/LJrE/hF6bXE4LPyDSIxwAfg= github.com/lightstep/go-expohisto v1.0.0 h1:UPtTS1rGdtehbbAF7o/dhkWLTDI73UifG8LbfQI7cA4= github.com/lightstep/go-expohisto v1.0.0/go.mod h1:xDXD0++Mu2FOaItXtdDfksfgxfV0z1TMPa+e/EUd0cs= -github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 h1:6E+4a0GO5zZEnZ81pIr0yLvtUWk2if982qA3F3QD6H4= github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I= +github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c h1:VtwQ41oftZwlMnOEbMWQtSEUgU64U4s+GHk7hZK+jtY= +github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c/go.mod h1:JKx41uQRwqlTZabZc+kILPrO/3jlKnQ2Z8b7YiVw5cE= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY= github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0= @@ -365,8 +375,8 @@ github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovk github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU= github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= -github.com/mattn/go-isatty v0.0.17 h1:BTarxUcIeDqL27Mc+vyvdWYSL28zpIhv3RoTdsLMPng= -github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.19 h1:JITubQf0MOLdlGRuRq+jtsDlekdYPia9ZFsB8h/APPA= +github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw= github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s= @@ -409,28 +419,50 @@ github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsc github.com/open-telemetry/opentelemetry-collector-contrib/connector/spanmetricsconnector v0.92.0/go.mod h1:HZFroD0+JG9lAHputuwNMIIkMaR5WXUGKHleBEHGqsU= github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.92.0 h1:vypJ1w2sYTkDqEb9NaAYTorJNOiOqnLsJVJdnL++Kvs= github.com/open-telemetry/opentelemetry-collector-contrib/exporter/kafkaexporter v0.92.0/go.mod h1:KVYi2UE+EhFQeZivid+FBSvY2QAfdxRPGem25XtgL1s= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.92.0 h1:4LEJccNrcOLIituu6dJ2g+rXLjEMzFCzI3XQl2l8SS4= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.92.0/go.mod h1:XLdaaWSvNiebC29ApCvb5xGTTrB+uC1ei4ZowEK6Zbk= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.92.0 h1:2zyKXjTTenv6IsnAZeU23PA9KWxdW7RZHVgL5Ndti0c= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.92.0/go.mod h1:uBfTWo6DGEjJ0G1nNW6RwXt6Xvq5HUcAB97Lq3dLob4= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.92.0 h1:F50ZE5gxJuGyEYFM+fAqtqel/Mko+7aHFEGmI8vpwXg= +github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.92.0/go.mod h1:6zKAGHI+LWkOdI4U+kAR2T+vrrA/Ol7qECJFoNqkYMs= +github.com/open-telemetry/opentelemetry-collector-contrib/extension/storage v0.92.0 h1:0GynhCiPiT3qS8LDTr3vHV9UCCdlr9H1HHi610ISZyo= github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.92.0 h1:x36ZvOy+ad363p3viPF2FZnaxcM2yoUPQpg9VX89unw= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.92.0/go.mod h1:qELp3+4I6DZUAbv5S3oyzxKGZHhwC82A0oOutosMtYg= github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.92.0 h1:1UF2MF9boARNt/3L9SExlIMggp8htU4OiPz050CS6SM= github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.92.0/go.mod h1:MwTANoi8W1PxCOR3VcRNjPvoDpCLe98tzjFTU55jXhQ= github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.92.0 h1:+reS590liO2mZsL8OtE+CsBwIOKpyUCqoG9g1tDFZis= github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.92.0/go.mod h1:UbUsQ88oLJATyZbiykVNCwsCD03m2bwXkOr0Fj6lyR8= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.92.0 h1:jG9K/J2UtjlsTnQaQZHyDB2uOD1ZMhzf39Ko3fwHJsw= +github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.92.0/go.mod h1:OhiKMy/kHVp8Lfm6a75axDwtoU+1xEAWjT8qOxtuioM= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.92.0 h1:lBoVGB0sVvjBj18XToTW9tnSDuNrAOYaHADtRD7UpD4= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.92.0/go.mod h1:SBligCw07LKI9SJ705ejtUJVtHcptFjDYsEO/9X3Quk= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.92.0 h1:4lzyQkopk+TXphviuNbpLrwhOxa14Jw7i3SjzD2XjqQ= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.92.0/go.mod h1:LsOAEpDF3VbzNFJwp7CR4vFYJuulIPOSVSPe91huVKY= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.92.0 h1:2cjUFC0jNSqAYcO+ZWUQ8sqPZdAX03Bd90SpsGcnrNY= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.92.0 h1:sqs1y0Exyxons2mWMAmBSdcdl2UizUgOmoibEBRX/4I= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.92.0/go.mod h1:me0dUlXvkVpDA6bN2z+qAggsXqOBEcm/dFFPw2mp7n8= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.92.0 h1:HpZYkjb3z9DSF79iAw/NAa4/2H2qqWWqYudJ25P4A/g= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.92.0/go.mod h1:csRtnY1VNPVO82nxvGuH5s+4iVbxb9jLIuCSnUp5vwQ= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.92.0 h1:7stzUIPpzVz0VTepCAWQvMeLG3X0ezF9rn2FUiyp83E= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.92.0/go.mod h1:9cfU0XBb3/NheB14Ezl1V122dzm8yJsy79i4i566yZ4= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.92.0 h1:X5s2Cy39V7rdjYrWxfNOge9LDWxVu6HwoD44B1HqVVQ= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/jaeger v0.92.0/go.mod h1:rF+vojQKtz7bg9nCzDpV+XImtvZHqxaTBy8JXjU/IH0= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.92.0 h1:aI5qqOt+++NRnK+iOvnbjlegd3CKPHglzyHa3MLlFeA= +github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.92.0/go.mod h1:5UtZpyAxq77uPvrKFjiBLKCT85TrsVFr3Dqj++VWG6E= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.92.0 h1:qObOdcaEs9yRxkW2QHSsMKb6qYMJ+gd88YppJw/sLpo= github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.92.0/go.mod h1:9tCRwHiSc76vNIoeuuNXztg6piWCpe2C/nj9ZhSDn2k= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.92.0 h1:SHySze/nuqIPZjyfAPuI+KrLFIghNe9bIeVSxrHRI/I= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/jaegerreceiver v0.92.0/go.mod h1:JphNJTWzYtriw64tTKE2Q2uQN/Xsj8ANPoaqejnUbKI= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.92.0 h1:R70zfGSXfWm7c9y18Y2UaVOa5cs7q3VO8pDQ2unPjl0= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/kafkareceiver v0.92.0/go.mod h1:l+boX9hgx5ogP+XXvh4IJ/yD+USfFDcE/mgiVExGKuU= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.92.0 h1:YAG3fs/G2d0xtt5frnJk51ruRU2gjjQPXBGe/wCF/tw= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.92.0/go.mod h1:ioC4ye8va5F2dMR/L6WiHpvsa/0ipqvYp/dK3PFualQ= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.92.0 h1:/ZDqxn7MFhkAUTKz9kFi/XSBExWzGBMSFIVQNCBswDE= +github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.92.0/go.mod h1:19LUVIPeel8CWdvjwJaGQbRji3t8eJI094iXNZAtlr4= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.92.0 h1:Cr8xqFPjISAT7/6cUiuWhCm/EqY89wyithNB4tXdCSE= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.92.0/go.mod h1:CTw6yeJ4/yX/vtLaM73YqG7Kj1WsBEyjzFzlZo9ZTtA= +github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.92.0 h1:8SGx/xxo5q8porO1HiW9dmEINjcb5WDc5NRAEwzM5eo= +github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.92.0/go.mod h1:Ui5cQY2VtOA7BEpIpdJXyPtPbP7sK+ywIEo8H48odoQ= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= @@ -451,8 +483,9 @@ github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINE github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= -github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c h1:ncq/mPwQF4JjgDlrVEn3C11VoGHZN7m8qihwgMEtzYw= github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= +github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c h1:NRoLoZvkBTKvR5gQLgA3e0hqjkY9u1wm+iOL45VN/qI= +github.com/power-devops/perfstat v0.0.0-20220216144756-c35f1ee13d7c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE= github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= @@ -892,6 +925,7 @@ golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20221010170243-090e33056c14/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= @@ -1024,11 +1058,11 @@ google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7Fc google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= -google.golang.org/genproto v0.0.0-20231120223509-83a465c0220f h1:Vn+VyHU5guc9KjB5KrjI2q0wCOWEOIh0OEsleqakHJg= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17 h1:JpwMPBpFN3uKhdaekDpiNlImDdkUAyiJ6ez/uxGaUSo= -google.golang.org/genproto/googleapis/api v0.0.0-20231106174013-bbf56f31fb17/go.mod h1:0xJLfVdJqpAPl8tDg1ujOCGzx6LFLttXT5NhllGOXY4= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4 h1:DC7wcm+i+P1rN3Ff07vL+OndGg5OhNddHyTA+ocPqYE= -google.golang.org/genproto/googleapis/rpc v0.0.0-20231127180814-3a041ad873d4/go.mod h1:eJVxU6o+4G1PSczBr85xmyvSNYAKvAYgkub40YGomFM= +google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 h1:YJ5pD9rF8o9Qtta0Cmy9rdBwkSjrTCT6XTiUQVOtIos= +google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 h1:rcS6EyEaoCO52hQDupoSfrxI3R6C2Tq741is7X8OvnM= +google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 h1:6G8oQ016D88m1xAKljMlBOOGWDZkes4kMhgGFlf8WcQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38= google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM= diff --git a/idl b/idl index a97152c66d8..bdd5ab5514b 160000 --- a/idl +++ b/idl @@ -1 +1 @@ -Subproject commit a97152c66d8f1562fcdcbbb85600d5f12c8aab9e +Subproject commit bdd5ab5514b3dbb8d3924cf6bc1b28e356df6ae3 diff --git a/jaeger-ui b/jaeger-ui index 9bb97358c5f..53976a5e0c2 160000 --- a/jaeger-ui +++ b/jaeger-ui @@ -1 +1 @@ -Subproject commit 9bb97358c5f43740bc42c782ea5c38dedb5937f0 +Subproject commit 53976a5e0c2fb6de76ee78edd5f85a10b17612b2 diff --git a/plugin/storage/grpc/factory.go b/plugin/storage/grpc/factory.go index c4656c36ab4..41cdd64f200 100644 --- a/plugin/storage/grpc/factory.go +++ b/plugin/storage/grpc/factory.go @@ -60,6 +60,20 @@ func NewFactory() *Factory { return &Factory{} } +func NewFactoryWithConfig( + cfg config.Configuration, + metricsFactory metrics.Factory, + logger *zap.Logger, +) (*Factory, error) { + f := NewFactory() + f.InitFromOptions(Options{Configuration: cfg}) + err := f.Initialize(metricsFactory, logger) + if err != nil { + return nil, err + } + return f, nil +} + // AddFlags implements plugin.Configurable func (f *Factory) AddFlags(flagSet *flag.FlagSet) { f.options.AddFlags(flagSet) diff --git a/scripts/otel-kafka-integration-test.sh b/scripts/otel-kafka-integration-test.sh new file mode 100755 index 00000000000..eb2e8403046 --- /dev/null +++ b/scripts/otel-kafka-integration-test.sh @@ -0,0 +1,83 @@ +#!/bin/bash + +set -euxf -o pipefail + +bring_up_kafka() { + local tag=$1 + local image="bitnami/kafka" + + local cid + cid=$(docker run --detach \ + --publish 9092:9092 \ + --env KAFKA_CFG_NODE_ID=0 \ + --env KAFKA_CFG_PROCESS_ROLES=controller,broker \ + --env KAFKA_CFG_CONTROLLER_QUORUM_VOTERS=0@localhost:9093 \ + --env KAFKA_CFG_LISTENERS=PLAINTEXT://:9092,CONTROLLER://:9093 \ + --env KAFKA_CFG_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092 \ + --env KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \ + --env KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER \ + --env KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT \ + "${image}:${tag}") + + wait_for_storage "9092" "${cid}" + + echo "${cid}" +} + +bring_up_remote_storage() { + local tag=$1 + local image="jaegertracing/jaeger-remote-storage" + + local cid + cid=$(docker run --detach \ + --publish 17271:17271 \ + --publish 17270:17270 \ + --env SPAN_STORAGE_TYPE=memory \ + "${image}:${tag}") + + wait_for_storage "17271" "${cid}" + + echo "${cid}" +} + +teardown_storage() { + for cid in "$@" + do + docker kill "${cid}" + done +} + +wait_for_storage() { + local port=$1 + local cid=$2 + + local counter=0 + local max_counter=30 + local interval=10 + while [[ $(! nc -z localhost "${port}") && ${counter} -lt ${max_counter} ]]; do + docker inspect "${cid}" | jq '.[].State' + echo "waiting for localhost:${port} to be up..." + sleep "${interval}" + counter=$((counter+1)) + done + + if ! nc -z localhost "${port}"; then + docker inspect "${cid}" | jq '.[].State' + echo "timed out waiting storage to start" + exit 1 + fi +} + +main() { + local kafka_version="${1:-"latest"}" + local remote_storage_version="${2:-"latest"}" + + kafka_cid=$(bring_up_kafka "${kafka_version}") + remote_storage_cid=$(bring_up_remote_storage "${remote_storage_version}") + + trap 'teardown_storage "${kafka_cid}" "${remote_storage_cid}"' EXIT + + STORAGE="otel_kafka" make otel-integration-test +} + +main "$@" From 6165551e381e1687eedd69de80da701623960ee9 Mon Sep 17 00:00:00 2001 From: James Ryans Date: Thu, 18 Jan 2024 19:21:57 +0700 Subject: [PATCH 02/13] Revert jaeger-ui submodule Signed-off-by: James Ryans --- jaeger-ui | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/jaeger-ui b/jaeger-ui index 53976a5e0c2..9bb97358c5f 160000 --- a/jaeger-ui +++ b/jaeger-ui @@ -1 +1 @@ -Subproject commit 53976a5e0c2fb6de76ee78edd5f85a10b17612b2 +Subproject commit 9bb97358c5f43740bc42c782ea5c38dedb5937f0 From 5198ff73c5699408a8b85c9a2a55c9c7d150e782 Mon Sep 17 00:00:00 2001 From: James Ryans Date: Thu, 18 Jan 2024 19:39:52 +0700 Subject: [PATCH 03/13] Update testbed module to specific commit at 95e673e Signed-off-by: James Ryans --- Makefile | 2 - cmd/jaeger/integration/kafka_test.go | 6 +- go.mod | 68 +++++++------- go.sum | 136 +++++++++++++-------------- 4 files changed, 104 insertions(+), 108 deletions(-) diff --git a/Makefile b/Makefile index 1d6920ffe81..46642290ce2 100644 --- a/Makefile +++ b/Makefile @@ -142,9 +142,7 @@ index-rollover-integration-test: docker-images-elastic go clean -testcache bash -c "set -e; set -o pipefail; $(GOTEST) -tags index_rollover -coverpkg=./... -coverprofile cover-index-rollover.out $(STORAGE_PKGS) $(COLORIZE)" -# Don't detect data race because testbed has race condition issue .PHONY: otel-integration-test -otel-integration-test: GOTEST := GOCACHE=$(GOCACHE) $(GO) test -v otel-integration-test: # Expire tests results for storage integration tests since the environment might change # even though the code remains the same. diff --git a/cmd/jaeger/integration/kafka_test.go b/cmd/jaeger/integration/kafka_test.go index 62d73c4b89d..ebe1c5b494d 100644 --- a/cmd/jaeger/integration/kafka_test.go +++ b/cmd/jaeger/integration/kafka_test.go @@ -64,16 +64,14 @@ func TestKafkaStorage(t *testing.T) { require.NoError(t, err, "collector configuration resulted in: %v", err) defer configCleanup() - tc := testbed.NewTestCase( + tc := testbed.NewLoadGeneratorTestCase( t, - dataProvider, - sender, + loadGenerator, test.receiver, runner, validator, correctnessResults, ) - tc.LoadGenerator = loadGenerator defer tc.Stop() tc.EnableRecording() diff --git a/go.mod b/go.mod index 3644b938737..fbc54e999fc 100644 --- a/go.mod +++ b/go.mod @@ -40,28 +40,28 @@ require ( github.com/stretchr/testify v1.8.4 github.com/uber/jaeger-client-go v2.30.0+incompatible github.com/xdg-go/scram v1.1.2 - go.opentelemetry.io/collector/component v0.92.0 - go.opentelemetry.io/collector/config/configgrpc v0.92.0 - go.opentelemetry.io/collector/config/confighttp v0.92.0 - go.opentelemetry.io/collector/config/configretry v0.92.0 - go.opentelemetry.io/collector/config/configtls v0.92.0 - go.opentelemetry.io/collector/connector v0.92.0 + go.opentelemetry.io/collector/component v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/config/configgrpc v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/config/confighttp v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/config/configretry v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/config/configtls v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/connector v0.92.1-0.20240112172857-83d463ceba06 go.opentelemetry.io/collector/connector/forwardconnector v0.92.0 - go.opentelemetry.io/collector/consumer v0.92.0 - go.opentelemetry.io/collector/exporter v0.92.0 - go.opentelemetry.io/collector/exporter/loggingexporter v0.92.0 - go.opentelemetry.io/collector/exporter/otlpexporter v0.92.0 - go.opentelemetry.io/collector/exporter/otlphttpexporter v0.92.0 - go.opentelemetry.io/collector/extension v0.92.0 - go.opentelemetry.io/collector/extension/ballastextension v0.92.0 - go.opentelemetry.io/collector/extension/zpagesextension v0.92.0 - go.opentelemetry.io/collector/otelcol v0.92.0 - go.opentelemetry.io/collector/pdata v1.0.1 - go.opentelemetry.io/collector/processor v0.92.0 - go.opentelemetry.io/collector/processor/batchprocessor v0.92.0 - go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.92.0 - go.opentelemetry.io/collector/receiver v0.92.0 - go.opentelemetry.io/collector/receiver/otlpreceiver v0.92.0 + go.opentelemetry.io/collector/consumer v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/exporter v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/exporter/loggingexporter v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/exporter/otlpexporter v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/exporter/otlphttpexporter v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/extension v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/extension/ballastextension v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/extension/zpagesextension v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/otelcol v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/pdata v1.0.2-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/processor v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/processor/batchprocessor v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/receiver v0.92.1-0.20240112172857-83d463ceba06 + go.opentelemetry.io/collector/receiver/otlpreceiver v0.92.1-0.20240112172857-83d463ceba06 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 go.opentelemetry.io/otel v1.21.0 @@ -98,9 +98,9 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.92.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.92.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.92.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.92.0 // indirect - go.opentelemetry.io/collector/confmap v0.92.0 // indirect - go.opentelemetry.io/collector/service v0.92.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.92.1-0.20240112172857-83d463ceba06 // indirect + go.opentelemetry.io/collector/confmap v0.92.1-0.20240112172857-83d463ceba06 // indirect + go.opentelemetry.io/collector/service v0.92.1-0.20240112172857-83d463ceba06 // indirect ) require ( @@ -177,7 +177,7 @@ require ( github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.92.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.92.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.92.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.92.0 + github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.92.1-0.20240116155838-95e673e5064a github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/openzipkin/zipkin-go v0.4.2 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect @@ -210,15 +210,15 @@ require ( github.com/xdg-go/stringprep v1.0.4 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect go.opencensus.io v0.24.0 // indirect - go.opentelemetry.io/collector v0.92.0 // indirect - go.opentelemetry.io/collector/config/configauth v0.92.0 // indirect - go.opentelemetry.io/collector/config/configcompression v0.92.0 // indirect - go.opentelemetry.io/collector/config/confignet v0.92.0 // indirect - go.opentelemetry.io/collector/config/configopaque v0.92.0 // indirect - go.opentelemetry.io/collector/config/internal v0.92.0 // indirect - go.opentelemetry.io/collector/extension/auth v0.92.0 // indirect - go.opentelemetry.io/collector/featuregate v1.0.1 // indirect - go.opentelemetry.io/collector/semconv v0.92.0 // indirect + go.opentelemetry.io/collector v0.92.1-0.20240112172857-83d463ceba06 // indirect + go.opentelemetry.io/collector/config/configauth v0.92.1-0.20240112172857-83d463ceba06 // indirect + go.opentelemetry.io/collector/config/configcompression v0.92.1-0.20240112172857-83d463ceba06 // indirect + go.opentelemetry.io/collector/config/confignet v0.92.1-0.20240112172857-83d463ceba06 // indirect + go.opentelemetry.io/collector/config/configopaque v0.92.1-0.20240112172857-83d463ceba06 // indirect + go.opentelemetry.io/collector/config/internal v0.92.1-0.20240112172857-83d463ceba06 // indirect + go.opentelemetry.io/collector/extension/auth v0.92.1-0.20240112172857-83d463ceba06 // indirect + go.opentelemetry.io/collector/featuregate v1.0.2-0.20240112172857-83d463ceba06 // indirect + go.opentelemetry.io/collector/semconv v0.92.1-0.20240112172857-83d463ceba06 // indirect go.opentelemetry.io/contrib/config v0.1.1 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.21.1 // indirect go.opentelemetry.io/contrib/zpages v0.46.1 // indirect diff --git a/go.sum b/go.sum index 73e1ba827f3..a856181e3f8 100644 --- a/go.sum +++ b/go.sum @@ -461,8 +461,8 @@ github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceive github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.92.0/go.mod h1:19LUVIPeel8CWdvjwJaGQbRji3t8eJI094iXNZAtlr4= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.92.0 h1:Cr8xqFPjISAT7/6cUiuWhCm/EqY89wyithNB4tXdCSE= github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver v0.92.0/go.mod h1:CTw6yeJ4/yX/vtLaM73YqG7Kj1WsBEyjzFzlZo9ZTtA= -github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.92.0 h1:8SGx/xxo5q8porO1HiW9dmEINjcb5WDc5NRAEwzM5eo= -github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.92.0/go.mod h1:Ui5cQY2VtOA7BEpIpdJXyPtPbP7sK+ywIEo8H48odoQ= +github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.92.1-0.20240116155838-95e673e5064a h1:WA0uBuQDjZlLSbUQKLRTTe4Wtwy1pMA3yjB+uL+zoys= +github.com/open-telemetry/opentelemetry-collector-contrib/testbed v0.92.1-0.20240116155838-95e673e5064a/go.mod h1:p+IESc7CcX7aRC44pKMA8VS0gyoWCmnpMqDcBVi9N9w= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= @@ -630,74 +630,74 @@ go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= -go.opentelemetry.io/collector v0.92.0 h1:XiC0ptaT1EmOkK2RI0gt3n2tkzLAkNQGf0E7hrGdyeA= -go.opentelemetry.io/collector v0.92.0/go.mod h1:wbksjM63DTKA1BbdUVS7gAFzAngCZTWb46RBpKdtsPw= -go.opentelemetry.io/collector/component v0.92.0 h1:/tRgPT1hr4KNB8ABHa0oJsjJFRZ5oiCIYHcTpZGwm9s= -go.opentelemetry.io/collector/component v0.92.0/go.mod h1:C2JwPTjauu36UCAzwX71/glNnOc5BR18p8FVccCFsqc= -go.opentelemetry.io/collector/config/configauth v0.92.0 h1:m4O5QLerdsuWYEV8bZGZWDHnM8TtHkr52q9r6hAkasw= -go.opentelemetry.io/collector/config/configauth v0.92.0/go.mod h1:P3tCzSFgxxmBdELVA/h05fGjyYXOr6mCDG4995yPzqo= -go.opentelemetry.io/collector/config/configcompression v0.92.0 h1:LtHx4ZkW3BMxa4CfQGMOE7+ZhXvd4W10Pxa91Hr8IL0= -go.opentelemetry.io/collector/config/configcompression v0.92.0/go.mod h1:fA36AZC/Qcyl+HvMnvFZuV/iUWGQJrchimmk+qYWuMM= -go.opentelemetry.io/collector/config/configgrpc v0.92.0 h1:vXUlGdAfg8ZvzkCyYx5+eagbzj2cQK306C3tZpWb7hY= -go.opentelemetry.io/collector/config/configgrpc v0.92.0/go.mod h1:MOUXJ4rVhsYQ+1nv8AxuwuFNWeCWrWRnjo2aP+5zRh0= -go.opentelemetry.io/collector/config/confighttp v0.92.0 h1:O1iAgwVJBnHgLqzHMBBbI0pa0nBZHalTQrFQGwiEuiE= -go.opentelemetry.io/collector/config/confighttp v0.92.0/go.mod h1:ZnZz2+bIHk4PRnJMvSPjQWdTDkfoBb4cH2R2gQVf1V4= -go.opentelemetry.io/collector/config/confignet v0.92.0 h1:4B4Ir68P+ew3nVz2/9lBN+KGXtkETPqErM8nQCg8tFo= -go.opentelemetry.io/collector/config/confignet v0.92.0/go.mod h1:rraribsOoZsYZm51+3TXHavmXKJOC5a5/X20vfmNbdw= -go.opentelemetry.io/collector/config/configopaque v0.92.0 h1:YvUSVa3Vxt2gSl5SwEohtn9HG0+8bO4zuAOCVICBIVU= -go.opentelemetry.io/collector/config/configopaque v0.92.0/go.mod h1:dQK8eUXjIGKaw1RB7UIg2nqx56AueNxeKFCdB0P1ypg= -go.opentelemetry.io/collector/config/configretry v0.92.0 h1:3WUabmCRIBHSkOLGCHGieUGchlHkBw3Fa4Cj9Do5Xdw= -go.opentelemetry.io/collector/config/configretry v0.92.0/go.mod h1:gt1HRYyMxcMca9lbDLPbivQzsUCjVjkPAn/3S6fiD14= -go.opentelemetry.io/collector/config/configtelemetry v0.92.0 h1:iCfxJ2DhWVOAHpGgkWUZRfUvUPyWGhpVRCqjPQ2D87Y= -go.opentelemetry.io/collector/config/configtelemetry v0.92.0/go.mod h1:2XLhyR/GVpWeZ2K044vCmrvH/d4Ewt0aD/y46avZyMU= -go.opentelemetry.io/collector/config/configtls v0.92.0 h1:jJHZvRp8CZ76IYbhHdGgGosBMQ/EShQAc0NlE3/tlHk= -go.opentelemetry.io/collector/config/configtls v0.92.0/go.mod h1:rL9BH5Hyrkni4t+QOx/opuwD0CHq/ZIFTsh6QLLsbmA= -go.opentelemetry.io/collector/config/internal v0.92.0 h1:1GCj5swGzCZQphHqzt1OSsA/vOmAgFLoydY8bBqAhs4= -go.opentelemetry.io/collector/config/internal v0.92.0/go.mod h1:rPjglfSd4K/kNLfH7TJO8AsstHGMmWTdntOqH7WiFLg= -go.opentelemetry.io/collector/confmap v0.92.0 h1:xz20zNIvF9ZA1eWE+MZmZunmdXPIP/fr33ZvU0QUSxg= -go.opentelemetry.io/collector/confmap v0.92.0/go.mod h1:CmqTszB2uwiJ9ieEqISdecuoVuyt3jMnJ/9kD53GYHs= -go.opentelemetry.io/collector/connector v0.92.0 h1:RgQAU1QKATCVGVPsVfUYF/6CsAblV02hNWcIh/YEq7w= -go.opentelemetry.io/collector/connector v0.92.0/go.mod h1:aWfeV4mEpnmiJbpFOZP7nudATb9ypW74qTsltEdS9PQ= +go.opentelemetry.io/collector v0.92.1-0.20240112172857-83d463ceba06 h1:305NltdJC4lbVLpPhMsDHYyU3EOBis70/IPDhMInOOg= +go.opentelemetry.io/collector v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:3MM6b+3rjdLMf3grxk4l9Mu4udi4C2kObyaT+Z+KuoI= +go.opentelemetry.io/collector/component v0.92.1-0.20240112172857-83d463ceba06 h1:2bkhiQn7O1UGsXlgxPQ3zf2pX+A4AGCxWs0SjZk1BXE= +go.opentelemetry.io/collector/component v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:J5ZAcv/ONu5Cdid/UzqF2T87k8ui8Z+c6n8s+640Vc8= +go.opentelemetry.io/collector/config/configauth v0.92.1-0.20240112172857-83d463ceba06 h1:IY6/RT98EGtt8AgJY9VbMOy+p+aEKGqaUpGcAprVs1w= +go.opentelemetry.io/collector/config/configauth v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:PE7ow8gXjJK6ZhRBp0kMaUCfxCYludZ3wVnBokn+TYg= +go.opentelemetry.io/collector/config/configcompression v0.92.1-0.20240112172857-83d463ceba06 h1:x2+RG5QduatREUzqHXPwZELppErFRsHN7jgWFLZhXYY= +go.opentelemetry.io/collector/config/configcompression v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:fA36AZC/Qcyl+HvMnvFZuV/iUWGQJrchimmk+qYWuMM= +go.opentelemetry.io/collector/config/configgrpc v0.92.1-0.20240112172857-83d463ceba06 h1:1OGI9s1spN8yr/VT1I75BNu2qW6o9MVsoD7jnVsYREw= +go.opentelemetry.io/collector/config/configgrpc v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:u6sgnFAcvkLgEed/pPs1doaFQIsLMfYXN/7SzeRu17w= +go.opentelemetry.io/collector/config/confighttp v0.92.1-0.20240112172857-83d463ceba06 h1:TTzmgHYbjz0MnMoruyUP3mlROrd1XmBdmiRIdSrNAks= +go.opentelemetry.io/collector/config/confighttp v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:gCswakaD08gSFUOpNt0uECQLQC49oY2xsEAKn0HrsJM= +go.opentelemetry.io/collector/config/confignet v0.92.1-0.20240112172857-83d463ceba06 h1:AXot5n/hMbuxYo2hnnMm78g32JL0lcrd7Azi++UiKFY= +go.opentelemetry.io/collector/config/confignet v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:rraribsOoZsYZm51+3TXHavmXKJOC5a5/X20vfmNbdw= +go.opentelemetry.io/collector/config/configopaque v0.92.1-0.20240112172857-83d463ceba06 h1:M1FjOD4ms4Mpzg9/r6ryjxNDz6dVK/2Y2yPu5syGKZo= +go.opentelemetry.io/collector/config/configopaque v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:dQK8eUXjIGKaw1RB7UIg2nqx56AueNxeKFCdB0P1ypg= +go.opentelemetry.io/collector/config/configretry v0.92.1-0.20240112172857-83d463ceba06 h1:o56gyZ9o4lAbcd3jP7MC3DqhIYo11qyLL0w5KB949XY= +go.opentelemetry.io/collector/config/configretry v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:gt1HRYyMxcMca9lbDLPbivQzsUCjVjkPAn/3S6fiD14= +go.opentelemetry.io/collector/config/configtelemetry v0.92.1-0.20240112172857-83d463ceba06 h1:FqiK9txeD9sIn5edjyYXj/RB9/YVle10QR43PyhVt6o= +go.opentelemetry.io/collector/config/configtelemetry v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:2XLhyR/GVpWeZ2K044vCmrvH/d4Ewt0aD/y46avZyMU= +go.opentelemetry.io/collector/config/configtls v0.92.1-0.20240112172857-83d463ceba06 h1:zpAK69D5MTAOdQJYJubqfQij1HGErw4IMGCGNPG90rc= +go.opentelemetry.io/collector/config/configtls v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:rL9BH5Hyrkni4t+QOx/opuwD0CHq/ZIFTsh6QLLsbmA= +go.opentelemetry.io/collector/config/internal v0.92.1-0.20240112172857-83d463ceba06 h1:k4+ZmqPdm9CFJAo6h6QlesLRYrn30R30pYuXfzgWhuo= +go.opentelemetry.io/collector/config/internal v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:rPjglfSd4K/kNLfH7TJO8AsstHGMmWTdntOqH7WiFLg= +go.opentelemetry.io/collector/confmap v0.92.1-0.20240112172857-83d463ceba06 h1:iaWTo707WxoKhp5RUIJvNa/BjryEi+oU36eu0hy8Eg0= +go.opentelemetry.io/collector/confmap v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:CmqTszB2uwiJ9ieEqISdecuoVuyt3jMnJ/9kD53GYHs= +go.opentelemetry.io/collector/connector v0.92.1-0.20240112172857-83d463ceba06 h1:IzGsfU0+OENZjCeERWCWLtZWpY8yyYNlgYiza6oEiFk= +go.opentelemetry.io/collector/connector v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:SV/yY3pdGcig3TBJGuMunc8cBdLdwipOHanH5KWYDQI= go.opentelemetry.io/collector/connector/forwardconnector v0.92.0 h1:3FHksBkKMSjtTKjI7HULHILKZVK4gg/yqtred716+DA= go.opentelemetry.io/collector/connector/forwardconnector v0.92.0/go.mod h1:8fmcpVHiT37pDTKp/5PxULetXNLE1Hy8VZny7S+3SEg= -go.opentelemetry.io/collector/consumer v0.92.0 h1:twa8T0iR9KVglvRbwZ5OPKLXPCC2DO6gVhrgDZ47MPE= -go.opentelemetry.io/collector/consumer v0.92.0/go.mod h1:fBZqP7bou3I7pDhWjleBuzdaLfQgJBc92wPJVOcKaGU= -go.opentelemetry.io/collector/exporter v0.92.0 h1:z6u+/hswJUuZbuPYIF2gXMZsqjIDd/tJO60XjLM850U= -go.opentelemetry.io/collector/exporter v0.92.0/go.mod h1:54ODYn1weY/Wr0bdxESj4P1fgyX+zaUsnJJnafORqIY= -go.opentelemetry.io/collector/exporter/loggingexporter v0.92.0 h1:lkBp0003d9nAkpCeJuxdp1j6fSpaoO9Uyuao9bIMDRY= -go.opentelemetry.io/collector/exporter/loggingexporter v0.92.0/go.mod h1:7itwzzdxLHAmaDjxp0hiemDJF/mzdVpK7MlEeIoQ75Q= -go.opentelemetry.io/collector/exporter/otlpexporter v0.92.0 h1:t1Bw82ziGkilLdGFU7r7EeXrK+sH5V/iwafEeFD/kik= -go.opentelemetry.io/collector/exporter/otlpexporter v0.92.0/go.mod h1:zmZiMKuPrhPqcILsZbXg28V8biywyjzse5m3jjN6AB0= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.92.0 h1:dWlGND+W4j7yBX6j3um+Co9sfjq4aVitMO1SSUQkjrA= -go.opentelemetry.io/collector/exporter/otlphttpexporter v0.92.0/go.mod h1:9G/ehcPHLzZbQWp3GndZ6oQsMZEemZs3UYOsS6y2VnQ= -go.opentelemetry.io/collector/extension v0.92.0 h1:zaehgW+LXCMNEb1d6Af/VHWphh5ZwX9aZl+NuQLGhpQ= -go.opentelemetry.io/collector/extension v0.92.0/go.mod h1:5EYwiaGU6deSY8YWqT5gvlnD850yJXP3NqFRKVVbYLs= -go.opentelemetry.io/collector/extension/auth v0.92.0 h1:FlCObeiYXsVStltFivg+gD5PSFUM6dXHigkgkUMitv0= -go.opentelemetry.io/collector/extension/auth v0.92.0/go.mod h1:fqCblNQV8Iz5w7Nrp1B865EJzKlVWS0aRgrr/c2HDDg= -go.opentelemetry.io/collector/extension/ballastextension v0.92.0 h1:+dNXdBFtIoph9WNmxZeZpNtYa0VjiusZ6ezDHyNtOmo= -go.opentelemetry.io/collector/extension/ballastextension v0.92.0/go.mod h1:XGTyRgf9ddH1o4Ix33+4y082B4YrVPPUXOh0jFOpn/g= -go.opentelemetry.io/collector/extension/zpagesextension v0.92.0 h1:n2W8Lla4P22P88WJ+e1n/AtcAEO47WnSYXlUUideU8g= -go.opentelemetry.io/collector/extension/zpagesextension v0.92.0/go.mod h1:oZwtuGVYK8C3Uh4exR0v0KQSkIUkngA3h9qutnmn7Qo= -go.opentelemetry.io/collector/featuregate v1.0.1 h1:ok//hLSXttBbyu4sSV1pTx1nKdr5udSmrWy5sFMIIbM= -go.opentelemetry.io/collector/featuregate v1.0.1/go.mod h1:QQXjP4etmJQhkQ20j4P/rapWuItYxoFozg/iIwuKnYg= -go.opentelemetry.io/collector/otelcol v0.92.0 h1:F2plXKY8/ULnVOvQPHrSOEUE8OSGEcBhJIntzT+BRKI= -go.opentelemetry.io/collector/otelcol v0.92.0/go.mod h1:8UUTPe216UnLQ8LQJtTp+WZpyrUF/nLWoVpT73MGV/k= -go.opentelemetry.io/collector/pdata v1.0.1 h1:dGX2h7maA6zHbl5D3AsMnF1c3Nn+3EUftbVCLzeyNvA= -go.opentelemetry.io/collector/pdata v1.0.1/go.mod h1:jutXeu0QOXYY8wcZ/hege+YAnSBP3+jpTqYU1+JTI5Y= -go.opentelemetry.io/collector/processor v0.92.0 h1:fbtBPdtQbFZWOhPfgx6LXZM0fwQRHvjE3NeJS1d1GPg= -go.opentelemetry.io/collector/processor v0.92.0/go.mod h1:7UFWYbuXy/GC5eyUYsGPn2FpQzOY22sgW4QykXspAFE= -go.opentelemetry.io/collector/processor/batchprocessor v0.92.0 h1:dLcXaOQVpEhevZdPlfa3zWGbceMZxatTFcRi+XpRBnE= -go.opentelemetry.io/collector/processor/batchprocessor v0.92.0/go.mod h1:ecE0bXWi0OckZg98ElvBtXjPxpMw8quSE0FurbL2tsA= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.92.0 h1:BC2fE/gxjlw9oqxQmAU7taLAiiigFeJM6slSXQfXrlI= -go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.92.0/go.mod h1:m1XAO859A1wrKco8K5wmJhnaXzeQEPzu3jj4F3mqvUI= -go.opentelemetry.io/collector/receiver v0.92.0 h1:TRz4ufr5bFEszpAWgYVEx/b7VPZzEcECsyMzztf5PsQ= -go.opentelemetry.io/collector/receiver v0.92.0/go.mod h1:bYAAYbMuUVj3wx7ave2iyyJ+aGUpACliYOQ5xI92I7k= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.92.0 h1:77oFMYYJfRu4yqlRkExMHDieg9gPv38UsMtK/0cu5kU= -go.opentelemetry.io/collector/receiver/otlpreceiver v0.92.0/go.mod h1:eZIrA6CY6xcm9uu3hmycS+L9kmBzyXE66Ci8FwkJpmI= -go.opentelemetry.io/collector/semconv v0.92.0 h1:3+OGPPuVu4rtrz8qGbpbiw7eKKULj4iJaSDTV52HM40= -go.opentelemetry.io/collector/semconv v0.92.0/go.mod h1:gZ0uzkXsN+J5NpiRcdp9xOhNGQDDui8Y62p15sKrlzo= -go.opentelemetry.io/collector/service v0.92.0 h1:KhicjajrbhEpjzSYCHvVZBYW5Qvd/UXi88oCegSanZI= -go.opentelemetry.io/collector/service v0.92.0/go.mod h1:hlq/Vyj0un+HKx8nAI77eaK/mABNL8hhPH7rKh9SOu4= +go.opentelemetry.io/collector/consumer v0.92.1-0.20240112172857-83d463ceba06 h1:zf0Zy0DwiN9rBWyhg/WWrTJar3CULGziEUG6YTkCXOE= +go.opentelemetry.io/collector/consumer v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:KhNeje82anY3f123+R/RKtc2Q8/rdnYYi4tG2WSnxqk= +go.opentelemetry.io/collector/exporter v0.92.1-0.20240112172857-83d463ceba06 h1:lgxkcd3n4SpdROJ8q79SHrs4JQE+sUyyifvZVDXQL2k= +go.opentelemetry.io/collector/exporter v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:Jh2MlCTtulD4tGdkqTZMlRvGQ/W8610V6f/04Ph72V4= +go.opentelemetry.io/collector/exporter/loggingexporter v0.92.1-0.20240112172857-83d463ceba06 h1:OgizTnokf+Vl6Qx+UnUHeFj2tNIPhY6qN6KUYmigG7U= +go.opentelemetry.io/collector/exporter/loggingexporter v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:a6H+xV7Xe2VorErt/KCSZc3AwroFT6x3Qb7DtY7HznY= +go.opentelemetry.io/collector/exporter/otlpexporter v0.92.1-0.20240112172857-83d463ceba06 h1:89gVCDb6IAoDyNCm8ZVm5Q+OBOm4OVCGncJWXZp7J1I= +go.opentelemetry.io/collector/exporter/otlpexporter v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:nrRHMrpmrKEow+RSLgR//f7eS8G0mbFxz8qsJaQV3h8= +go.opentelemetry.io/collector/exporter/otlphttpexporter v0.92.1-0.20240112172857-83d463ceba06 h1:9QNZ/NdGt9FridmdLZ4dJ1XtZ0IJ2JwsQ0rEg9pU9LQ= +go.opentelemetry.io/collector/exporter/otlphttpexporter v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:M+Ve/gyDoVBIpCbhKaSO4NqFEeY3dhABlU9sAWxS2Bs= +go.opentelemetry.io/collector/extension v0.92.1-0.20240112172857-83d463ceba06 h1:Hbzik+qRPGEkT0MTMIu9HHokPUnQvh44yWyIVNLDpQ8= +go.opentelemetry.io/collector/extension v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:gCukg3D3VIzfp8NXAhuaPadDQhe2Hg3YGtsBuOr06+Q= +go.opentelemetry.io/collector/extension/auth v0.92.1-0.20240112172857-83d463ceba06 h1:Ft8Y2gWSnyuOpnGZh1IrY9K2a0Ou+tBTNWw8NsvHxX4= +go.opentelemetry.io/collector/extension/auth v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:ZlWPLN+c16L6O/DBl9OMTTq2JydNhA82UtSUize7TpM= +go.opentelemetry.io/collector/extension/ballastextension v0.92.1-0.20240112172857-83d463ceba06 h1:GITA07r4t+loFF3FM7x072AXhqbpYD9xVLGVwu560As= +go.opentelemetry.io/collector/extension/ballastextension v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:CXuDaWcXlJlIytZual0RP71cv/UbFxnSO8mR0I/4sZ0= +go.opentelemetry.io/collector/extension/zpagesextension v0.92.1-0.20240112172857-83d463ceba06 h1:l4apqYKGl4/YOh8r2h9qVbb33g50dMwMxIiLGpdlLqM= +go.opentelemetry.io/collector/extension/zpagesextension v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:P8Xmy1qdKmDHhD664QzOhl+7Q84PcjzACzqMhvb5en8= +go.opentelemetry.io/collector/featuregate v1.0.2-0.20240112172857-83d463ceba06 h1:LN4c/jJkIAOJYFRTapRigYDp3k+4BllH4Pqr7TT5b2w= +go.opentelemetry.io/collector/featuregate v1.0.2-0.20240112172857-83d463ceba06/go.mod h1:QQXjP4etmJQhkQ20j4P/rapWuItYxoFozg/iIwuKnYg= +go.opentelemetry.io/collector/otelcol v0.92.1-0.20240112172857-83d463ceba06 h1:qbJB8Ye/aOa1IX6bE6kP+1bbqfw+eyb8D/ogSYZXIbY= +go.opentelemetry.io/collector/otelcol v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:8UUTPe216UnLQ8LQJtTp+WZpyrUF/nLWoVpT73MGV/k= +go.opentelemetry.io/collector/pdata v1.0.2-0.20240112172857-83d463ceba06 h1:v2SnEUqor+9FuJK3pPRR6jd342lzzmicuafWCrfvQZ8= +go.opentelemetry.io/collector/pdata v1.0.2-0.20240112172857-83d463ceba06/go.mod h1:jutXeu0QOXYY8wcZ/hege+YAnSBP3+jpTqYU1+JTI5Y= +go.opentelemetry.io/collector/processor v0.92.1-0.20240112172857-83d463ceba06 h1:kRhvGvIFU1n70GS3NxTV+BjILewqycTqV2HnGYadOII= +go.opentelemetry.io/collector/processor v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:OpooyU01uc7s36rtRLSvrerR9pS04xARqqJrS/NcAmY= +go.opentelemetry.io/collector/processor/batchprocessor v0.92.1-0.20240112172857-83d463ceba06 h1:SXvSkKlc0yWBt/8fp5Xop4QWhYDwT4eNMA6lW48P9nk= +go.opentelemetry.io/collector/processor/batchprocessor v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:o/a4UAG+n3jhcNUmXKFrwjPotNh3VUiWWizKVj9lrc8= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.92.1-0.20240112172857-83d463ceba06 h1:yg8+HxIOKQNt48GSTpiQ9GXNBrumZtjwCe9EQ0uuxOQ= +go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:RfrZjccBXKFGRL61ja8w//4GsegZPkFeY9T2LDFVdi0= +go.opentelemetry.io/collector/receiver v0.92.1-0.20240112172857-83d463ceba06 h1:HBKo14vrNPVmq3mSd1IZC0CGhIQ95lVVoQ3zkySdryo= +go.opentelemetry.io/collector/receiver v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:mp3M+sEhBfOdWK5ric+yQsTSLy3c+i7HRqSVUmlKbQI= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.92.1-0.20240112172857-83d463ceba06 h1:naM0N+HDH6yce+vgoxvMiL8o+EMFPaku403LRQsBGkU= +go.opentelemetry.io/collector/receiver/otlpreceiver v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:eVp+KUsh7ZEkXQzla6gu+BEtMTahsv3T+7grb0VmvjU= +go.opentelemetry.io/collector/semconv v0.92.1-0.20240112172857-83d463ceba06 h1:mvTBCFPUxmbetGYchj3tTRx+T/3MGkAyZPvPFZ6d+Js= +go.opentelemetry.io/collector/semconv v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:gZ0uzkXsN+J5NpiRcdp9xOhNGQDDui8Y62p15sKrlzo= +go.opentelemetry.io/collector/service v0.92.1-0.20240112172857-83d463ceba06 h1:tPsq8BP9mxrAvWvFEeguBKvIFLQs68W3KyLYSA9m6qc= +go.opentelemetry.io/collector/service v0.92.1-0.20240112172857-83d463ceba06/go.mod h1:hlq/Vyj0un+HKx8nAI77eaK/mABNL8hhPH7rKh9SOu4= go.opentelemetry.io/contrib/config v0.1.1 h1:lIUTrMWkfDE0GvzBLhwv6ATDB1vntrnTsRvUMkZKnfQ= go.opentelemetry.io/contrib/config v0.1.1/go.mod h1:rDrK4+PS6Cs+WIphU/GO5Sk4TGV36lEQqk/Z1vZkaLI= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= From 8da322427091054b44e84447213d532f73171bae Mon Sep 17 00:00:00 2001 From: James Ryans Date: Fri, 19 Jan 2024 00:26:47 +0700 Subject: [PATCH 04/13] Add unit test to grpc storage extension and factory Signed-off-by: James Ryans --- .../extension/jaegerstorage/extension_test.go | 72 ++++++++++++++++--- plugin/storage/grpc/factory.go | 1 + plugin/storage/grpc/factory_test.go | 7 ++ 3 files changed, 72 insertions(+), 8 deletions(-) diff --git a/cmd/jaeger/internal/extension/jaegerstorage/extension_test.go b/cmd/jaeger/internal/extension/jaegerstorage/extension_test.go index e6a52ec1e7b..f3396983075 100644 --- a/cmd/jaeger/internal/extension/jaegerstorage/extension_test.go +++ b/cmd/jaeger/internal/extension/jaegerstorage/extension_test.go @@ -18,12 +18,17 @@ import ( memoryCfg "github.com/jaegertracing/jaeger/pkg/memory/config" "github.com/jaegertracing/jaeger/pkg/metrics" + grpcCfg "github.com/jaegertracing/jaeger/plugin/storage/grpc/config" + "github.com/jaegertracing/jaeger/plugin/storage/memory" "github.com/jaegertracing/jaeger/storage" "github.com/jaegertracing/jaeger/storage/dependencystore" "github.com/jaegertracing/jaeger/storage/spanstore" ) -const memstoreName = "memstore" +const ( + memstoreName = "memstore" + grpcstoreName = "grpcstore" +) type storageHost struct { t *testing.T @@ -78,15 +83,45 @@ func TestStorageExtensionConfigError(t *testing.T) { require.EqualError(t, err, fmt.Sprintf("%s: no storage type present in config", ID)) } -func TestStorageExtensionStartTwiceError(t *testing.T) { - ctx := context.Background() +func TestStorageExtensionDuplicateNameError(t *testing.T) { + tests := []struct { + name string + config *Config + }{ + { + name: "memory", + config: &Config{ + Memory: map[string]memoryCfg.Configuration{ + memstoreName: {}, + }, + }, + }, + { + name: "grpc", + config: &Config{ + GRPC: map[string]grpcCfg.Configuration{ + memstoreName: {}, + }, + }, + }, + } - storageExtension := makeStorageExtension(t, memstoreName) + ctx := context.Background() + ext := storageExt{ + factories: map[string]storage.Factory{ + memstoreName: memory.NewFactoryWithConfig(memoryCfg.Configuration{}, metrics.NullFactory, zap.NewNop()), + }, + } - host := componenttest.NewNopHost() - err := storageExtension.Start(ctx, host) - require.Error(t, err) - require.EqualError(t, err, fmt.Sprintf("duplicate memory storage name %s", memstoreName)) + for _, test := range tests { + t.Run(test.name, func(t *testing.T) { + ext.config = test.config + err := ext.Start(ctx, componenttest.NewNopHost()) + require.Error(t, err) + require.EqualError(t, err, fmt.Sprintf("duplicate %s storage name %s", test.name, memstoreName)) + }) + } + t.Cleanup(func() { require.NoError(t, ext.Shutdown(ctx)) }) } func TestStorageFactoryBadHostError(t *testing.T) { @@ -129,6 +164,27 @@ func TestStorageExtension(t *testing.T) { require.NoError(t, err) } +// This test is only to cover the grpc.NewFactoryWithConfig +// since it can't be mocked yet require external grpc connection +func TestGRPCStorageExtensionError(t *testing.T) { + ctx := context.Background() + ext := storageExt{ + config: &Config{ + GRPC: map[string]grpcCfg.Configuration{ + grpcstoreName: {}, + }, + }, + logger: zap.NewNop(), + factories: map[string]storage.Factory{ + memstoreName: memory.NewFactoryWithConfig(memoryCfg.Configuration{}, metrics.NullFactory, zap.NewNop()), + }, + } + + err := ext.Start(ctx, componenttest.NewNopHost()) + require.Error(t, err) + require.Contains(t, err.Error(), "failed to initialize grpc storage: grpc-plugin builder failed to create a store: error connecting to remote storage") +} + func makeStorageExtension(t *testing.T, memstoreName string) component.Component { extensionFactory := NewFactory() diff --git a/plugin/storage/grpc/factory.go b/plugin/storage/grpc/factory.go index 41cdd64f200..8a9d360018a 100644 --- a/plugin/storage/grpc/factory.go +++ b/plugin/storage/grpc/factory.go @@ -60,6 +60,7 @@ func NewFactory() *Factory { return &Factory{} } +// NewFactoryWithConfig is used from jaeger(v2). func NewFactoryWithConfig( cfg config.Configuration, metricsFactory metrics.Factory, diff --git a/plugin/storage/grpc/factory_test.go b/plugin/storage/grpc/factory_test.go index e9b4417383b..ed7fc05062c 100644 --- a/plugin/storage/grpc/factory_test.go +++ b/plugin/storage/grpc/factory_test.go @@ -143,6 +143,13 @@ func TestGRPCStorageFactory(t *testing.T) { assert.Equal(t, f.store.DependencyReader(), depReader) } +func TestGRPCStorageFactoryWithConfig(t *testing.T) { + cfg := grpcConfig.Configuration{} + _, err := NewFactoryWithConfig(cfg, metrics.NullFactory, zap.NewNop()) + require.Error(t, err) + assert.Contains(t, err.Error(), "grpc-plugin builder failed to create a store: error connecting to remote storage") +} + func TestGRPCStorageFactory_Capabilities(t *testing.T) { f := NewFactory() v := viper.New() From 5a811c08534f5ab67c53f79b79a7b9f911b6f699 Mon Sep 17 00:00:00 2001 From: James Ryans Date: Sat, 20 Jan 2024 10:06:24 +0700 Subject: [PATCH 05/13] Add v2 otel-kafka-integration-test.sh to Github CI Signed-off-by: James Ryans --- .github/workflows/ci-kafka.yml | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci-kafka.yml b/.github/workflows/ci-kafka.yml index 8c2ae7b8f40..d92c7408864 100644 --- a/.github/workflows/ci-kafka.yml +++ b/.github/workflows/ci-kafka.yml @@ -18,6 +18,10 @@ permissions: # added using https://github.com/step-security/secure-workflows jobs: kafka: runs-on: ubuntu-latest + strategy: + matrix: + name: [v1, v2] + steps: - name: Harden Runner uses: step-security/harden-runner@eb238b55efaa70779f274895e782ed17c84f2895 # v2.6.1 @@ -31,7 +35,15 @@ jobs: go-version: 1.21.x - name: Run kafka integration tests - run: bash scripts/kafka-integration-test.sh -k + run: | + case ${{ matrix.name }} in + v1) + bash scripts/kafka-integration-test.sh -k + ;; + v2) + bash scripts/otel-kafka-integration-test.sh 3.6 + ;; + esac - name: Output Kafka logs run: docker logs "${{ job.services.kafka.id }}" From 51b71d2e64c0b21ed0d66ca981c999109e993ea6 Mon Sep 17 00:00:00 2001 From: James Ryans Date: Sat, 20 Jan 2024 10:32:09 +0700 Subject: [PATCH 06/13] Change v2 component() to public function Signed-off-by: James Ryans --- cmd/jaeger/internal/components.go | 2 +- cmd/jaeger/internal/components_test.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/jaeger/internal/components.go b/cmd/jaeger/internal/components.go index 2b758a55990..d98582023ba 100644 --- a/cmd/jaeger/internal/components.go +++ b/cmd/jaeger/internal/components.go @@ -116,6 +116,6 @@ func (b builders) build() (otelcol.Factories, error) { return factories, nil } -func components() (otelcol.Factories, error) { +func Components() (otelcol.Factories, error) { return defaultBuilders().build() } diff --git a/cmd/jaeger/internal/components_test.go b/cmd/jaeger/internal/components_test.go index fed360d0bdd..fd333453691 100644 --- a/cmd/jaeger/internal/components_test.go +++ b/cmd/jaeger/internal/components_test.go @@ -29,7 +29,7 @@ import ( ) func TestComponents(t *testing.T) { - factories, err := components() + factories, err := Components() require.NoError(t, err) From 76073764ecdf09406f7a71f9a53e3edfe2a08fe9 Mon Sep 17 00:00:00 2001 From: James Ryans Date: Wed, 24 Jan 2024 12:35:06 +0700 Subject: [PATCH 07/13] Change jaegerstorage receiver grpc config mapstructure Signed-off-by: James Ryans --- cmd/jaeger/integration/datareceivers/jaegerstorage.go | 2 +- cmd/jaeger/integration/receivers/storagereceiver/config.go | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cmd/jaeger/integration/datareceivers/jaegerstorage.go b/cmd/jaeger/integration/datareceivers/jaegerstorage.go index 1d9cf40f9bf..f171584fbef 100644 --- a/cmd/jaeger/integration/datareceivers/jaegerstorage.go +++ b/cmd/jaeger/integration/datareceivers/jaegerstorage.go @@ -50,7 +50,7 @@ func (dr *jaegerStorageDataReceiver) Stop() error { func (dr *jaegerStorageDataReceiver) GenConfigYAMLStr() string { return fmt.Sprintf(` jaeger_storage_receiver: - grpc-plugin: + grpc: server: localhost:%d`, dr.Port) } diff --git a/cmd/jaeger/integration/receivers/storagereceiver/config.go b/cmd/jaeger/integration/receivers/storagereceiver/config.go index bd8a5225e9a..2e76d122c18 100644 --- a/cmd/jaeger/integration/receivers/storagereceiver/config.go +++ b/cmd/jaeger/integration/receivers/storagereceiver/config.go @@ -10,7 +10,7 @@ import ( ) type Config struct { - GRPC grpcCfg.Configuration `mapstructure:"grpc-plugin"` + GRPC grpcCfg.Configuration `mapstructure:"grpc"` } func (cfg *Config) Validate() error { From baa5eb87674bd699271637b121b7ae5a69584bd5 Mon Sep 17 00:00:00 2001 From: James Ryans Date: Wed, 24 Jan 2024 12:38:40 +0700 Subject: [PATCH 08/13] Ignore cmd/jaeger/integration directory from code coverage Signed-off-by: James Ryans --- .codecov.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.codecov.yml b/.codecov.yml index 58e1eb75695..f2e07efbbef 100644 --- a/.codecov.yml +++ b/.codecov.yml @@ -11,6 +11,7 @@ ignore: - "thrift-gen/*/*" - "**/thrift-0.9.2/*" - "**/main.go" + - "cmd/jaeger/integration" - "examples/hotrod" coverage: From 1b4980a63a632563f550b52de1648459f1663cff Mon Sep 17 00:00:00 2001 From: James Ryans Date: Wed, 24 Jan 2024 13:15:47 +0700 Subject: [PATCH 09/13] Set name to kafka docker in otel-kafka-integration-test.sh Signed-off-by: James Ryans --- scripts/otel-kafka-integration-test.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/otel-kafka-integration-test.sh b/scripts/otel-kafka-integration-test.sh index eb2e8403046..ecdcf310aa1 100755 --- a/scripts/otel-kafka-integration-test.sh +++ b/scripts/otel-kafka-integration-test.sh @@ -8,6 +8,7 @@ bring_up_kafka() { local cid cid=$(docker run --detach \ + --name kafka \ --publish 9092:9092 \ --env KAFKA_CFG_NODE_ID=0 \ --env KAFKA_CFG_PROCESS_ROLES=controller,broker \ From 52f95fb6889b1388e11bef6a83424a7aef2d1de9 Mon Sep 17 00:00:00 2001 From: James Ryans Date: Wed, 24 Jan 2024 19:03:10 +0700 Subject: [PATCH 10/13] Fix kafka message.max.bytes no longer optional Signed-off-by: James Ryans --- scripts/otel-kafka-integration-test.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/scripts/otel-kafka-integration-test.sh b/scripts/otel-kafka-integration-test.sh index ecdcf310aa1..3c8e21ad595 100755 --- a/scripts/otel-kafka-integration-test.sh +++ b/scripts/otel-kafka-integration-test.sh @@ -18,6 +18,7 @@ bring_up_kafka() { --env KAFKA_CFG_LISTENER_SECURITY_PROTOCOL_MAP=CONTROLLER:PLAINTEXT,PLAINTEXT:PLAINTEXT \ --env KAFKA_CFG_CONTROLLER_LISTENER_NAMES=CONTROLLER \ --env KAFKA_CFG_INTER_BROKER_LISTENER_NAME=PLAINTEXT \ + --env KAFKA_CFG_MESSAGE_MAX_BYTES=1048588 \ "${image}:${tag}") wait_for_storage "9092" "${cid}" From 7352bfc148323d4c74317475a444c99f8bd52a24 Mon Sep 17 00:00:00 2001 From: James Ryans Date: Thu, 25 Jan 2024 13:23:54 +0700 Subject: [PATCH 11/13] Refactor grpc/factory_test combine assert to require.ErrorContains() Signed-off-by: James Ryans --- plugin/storage/grpc/factory_test.go | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/plugin/storage/grpc/factory_test.go b/plugin/storage/grpc/factory_test.go index ed7fc05062c..a28553323fc 100644 --- a/plugin/storage/grpc/factory_test.go +++ b/plugin/storage/grpc/factory_test.go @@ -146,8 +146,7 @@ func TestGRPCStorageFactory(t *testing.T) { func TestGRPCStorageFactoryWithConfig(t *testing.T) { cfg := grpcConfig.Configuration{} _, err := NewFactoryWithConfig(cfg, metrics.NullFactory, zap.NewNop()) - require.Error(t, err) - assert.Contains(t, err.Error(), "grpc-plugin builder failed to create a store: error connecting to remote storage") + require.ErrorContains(t, err, "grpc-plugin builder failed to create a store: error connecting to remote storage") } func TestGRPCStorageFactory_Capabilities(t *testing.T) { From 657f1927ec3a9052bbd3a249c47d6cdcd4b4c993 Mon Sep 17 00:00:00 2001 From: Yuri Shkuro Date: Sat, 3 Feb 2024 15:54:54 -0500 Subject: [PATCH 12/13] update idl Signed-off-by: Yuri Shkuro --- idl | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/idl b/idl index bdd5ab5514b..a97152c66d8 160000 --- a/idl +++ b/idl @@ -1 +1 @@ -Subproject commit bdd5ab5514b3dbb8d3924cf6bc1b28e356df6ae3 +Subproject commit a97152c66d8f1562fcdcbbb85600d5f12c8aab9e From fb44ba5ed1ab09cde28882816a92fab1101eb0f7 Mon Sep 17 00:00:00 2001 From: Yuri Shkuro Date: Sat, 3 Feb 2024 15:56:33 -0500 Subject: [PATCH 13/13] tidy Signed-off-by: Yuri Shkuro --- go.mod | 39 ++++++++++++++++++--------------------- 1 file changed, 18 insertions(+), 21 deletions(-) diff --git a/go.mod b/go.mod index 8fa2f904812..099013602a2 100644 --- a/go.mod +++ b/go.mod @@ -83,27 +83,6 @@ require ( gopkg.in/yaml.v2 v2.4.0 ) -require ( - github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect - github.com/expr-lang/expr v1.15.8 // indirect - github.com/influxdata/go-syslog/v3 v3.0.1-0.20230911200830-875f5bc594a4 // indirect - github.com/jpillora/backoff v1.0.0 // indirect - github.com/leodido/ragel-machinery v0.0.0-20181214104525-299bdde78165 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.93.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.93.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.93.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.93.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.93.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.93.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.93.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.93.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.93.0 // indirect - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.93.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.93.0 // indirect - go.opentelemetry.io/collector/confmap v0.93.0 // indirect - go.opentelemetry.io/collector/service v0.93.0 // indirect -) - require ( contrib.go.opencensus.io/exporter/prometheus v0.4.2 // indirect github.com/IBM/sarama v1.42.1 // indirect @@ -111,6 +90,7 @@ require ( github.com/aws/aws-sdk-go v1.50.2 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/cenkalti/backoff/v4 v4.2.1 // indirect + github.com/census-instrumentation/opencensus-proto v0.4.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect @@ -121,6 +101,7 @@ require ( github.com/eapache/go-xerial-snappy v0.0.0-20230731223053-c322873962e3 // indirect github.com/eapache/queue v1.1.0 // indirect github.com/elastic/elastic-transport-go/v8 v8.4.0 // indirect + github.com/expr-lang/expr v1.15.8 // indirect github.com/fatih/color v1.15.0 // indirect github.com/felixge/httpsnoop v1.0.4 // indirect github.com/go-kit/log v0.2.1 // indirect @@ -144,6 +125,7 @@ require ( github.com/hashicorp/hcl v1.0.0 // indirect github.com/hashicorp/yamux v0.1.1 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect + github.com/influxdata/go-syslog/v3 v3.0.1-0.20230911200830-875f5bc594a4 // indirect github.com/jcmturner/aescts/v2 v2.0.0 // indirect github.com/jcmturner/dnsutils/v2 v2.0.0 // indirect github.com/jcmturner/gofork v1.7.6 // indirect @@ -151,12 +133,14 @@ require ( github.com/jcmturner/rpc/v2 v2.0.3 // indirect github.com/jmespath/go-jmespath v0.4.0 // indirect github.com/josharian/intern v1.0.0 // indirect + github.com/jpillora/backoff v1.0.0 // indirect github.com/json-iterator/go v1.1.12 // indirect github.com/klauspost/compress v1.17.4 // indirect github.com/knadh/koanf/maps v0.1.1 // indirect github.com/knadh/koanf/providers/confmap v0.1.0 // indirect github.com/knadh/koanf/v2 v2.0.1 // indirect github.com/kr/text v0.2.0 // indirect + github.com/leodido/ragel-machinery v0.0.0-20181214104525-299bdde78165 // indirect github.com/lightstep/go-expohisto v1.0.0 // indirect github.com/lufia/plan9stats v0.0.0-20220913051719-115f729f3c8c // indirect github.com/magiconair/properties v1.8.7 // indirect @@ -172,12 +156,22 @@ require ( github.com/mostynb/go-grpc-compression v1.2.2 // indirect github.com/oklog/run v1.1.0 // indirect github.com/onsi/ginkgo v1.16.5 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/opencensusexporter v0.93.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/syslogexporter v0.93.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/exporter/zipkinexporter v0.93.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.93.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.93.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/internal/kafka v0.93.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/internal/sharedcomponent v0.93.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchpersignal v0.93.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.93.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.93.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/stanza v0.93.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.93.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/opencensus v0.93.0 // indirect github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.93.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/opencensusreceiver v0.93.0 // indirect + github.com/open-telemetry/opentelemetry-collector-contrib/receiver/syslogreceiver v0.93.0 // indirect github.com/opentracing/opentracing-go v1.2.0 // indirect github.com/openzipkin/zipkin-go v0.4.2 // indirect github.com/pelletier/go-toml/v2 v2.1.0 // indirect @@ -216,10 +210,13 @@ require ( go.opentelemetry.io/collector/config/configcompression v0.93.0 // indirect go.opentelemetry.io/collector/config/confignet v0.93.0 // indirect go.opentelemetry.io/collector/config/configopaque v0.93.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.93.0 // indirect go.opentelemetry.io/collector/config/internal v0.93.0 // indirect + go.opentelemetry.io/collector/confmap v0.93.0 // indirect go.opentelemetry.io/collector/extension/auth v0.93.0 // indirect go.opentelemetry.io/collector/featuregate v1.0.1 // indirect go.opentelemetry.io/collector/semconv v0.93.0 // indirect + go.opentelemetry.io/collector/service v0.93.0 // indirect go.opentelemetry.io/contrib/config v0.2.0 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.22.0 // indirect go.opentelemetry.io/contrib/zpages v0.47.0 // indirect