From e0f4bc5c42e2d09d52ee69ddd5f6c955ec804eeb Mon Sep 17 00:00:00 2001 From: Irina Marchuk Date: Tue, 11 Feb 2025 16:59:09 +0000 Subject: [PATCH] naming changes to make components compatible with ocb --- pkg/exporter/{faro => faroexporter}/README.md | 0 pkg/exporter/{faro => faroexporter}/config.go | 2 +- .../{faro => faroexporter}/exporter.go | 4 +- .../{faro => faroexporter}/exporter_test.go | 4 +- .../{faro => faroexporter}/factory.go | 4 +- pkg/exporter/{faro => faroexporter}/go.mod | 2 +- pkg/exporter/{faro => faroexporter}/go.sum | 0 .../internal/httphelper/helper.go | 0 .../faroexporter}/internal/metadata/status.go | 4 +- pkg/receiver/{faro => faroreceiver}/README.md | 0 pkg/receiver/{faro => faroreceiver}/config.go | 2 +- .../{faro => faroreceiver}/config_test.go | 0 .../{faro => faroreceiver}/encoder.go | 2 +- .../{faro => faroreceiver}/factory.go | 32 ++- pkg/receiver/{faro => faroreceiver}/go.mod | 32 +-- pkg/receiver/{faro => faroreceiver}/go.sum | 52 ++--- .../internal/httphelper/helper.go | 0 .../faroreceiver}/internal/metadata/status.go | 4 +- .../internal/sharedcomponent/package_test.go | 14 ++ .../sharedcomponent/sharedcomponent.go | 168 ++++++++++++++ .../sharedcomponent/sharedcomponent_test.go | 215 ++++++++++++++++++ .../{faro => faroreceiver}/receiver.go | 4 +- .../{faro => faroreceiver}/receiver_test.go | 4 +- .../testdata/config.yaml | 0 .../testdata/default.yaml | 0 .../testdata/empty.json | 0 .../testdata/minimal-traces-only.json | 0 27 files changed, 484 insertions(+), 65 deletions(-) rename pkg/exporter/{faro => faroexporter}/README.md (100%) rename pkg/exporter/{faro => faroexporter}/config.go (98%) rename pkg/exporter/{faro => faroexporter}/exporter.go (97%) rename pkg/exporter/{faro => faroexporter}/exporter_test.go (97%) rename pkg/exporter/{faro => faroexporter}/factory.go (96%) rename pkg/exporter/{faro => faroexporter}/go.mod (98%) rename pkg/exporter/{faro => faroexporter}/go.sum (100%) rename pkg/exporter/{faro => faroexporter}/internal/httphelper/helper.go (100%) rename pkg/{receiver/faro => exporter/faroexporter}/internal/metadata/status.go (70%) rename pkg/receiver/{faro => faroreceiver}/README.md (100%) rename pkg/receiver/{faro => faroreceiver}/config.go (97%) rename pkg/receiver/{faro => faroreceiver}/config_test.go (100%) rename pkg/receiver/{faro => faroreceiver}/encoder.go (99%) rename pkg/receiver/{faro => faroreceiver}/factory.go (56%) rename pkg/receiver/{faro => faroreceiver}/go.mod (77%) rename pkg/receiver/{faro => faroreceiver}/go.sum (87%) rename pkg/receiver/{faro => faroreceiver}/internal/httphelper/helper.go (100%) rename pkg/{exporter/faro => receiver/faroreceiver}/internal/metadata/status.go (70%) create mode 100644 pkg/receiver/faroreceiver/internal/sharedcomponent/package_test.go create mode 100644 pkg/receiver/faroreceiver/internal/sharedcomponent/sharedcomponent.go create mode 100644 pkg/receiver/faroreceiver/internal/sharedcomponent/sharedcomponent_test.go rename pkg/receiver/{faro => faroreceiver}/receiver.go (98%) rename pkg/receiver/{faro => faroreceiver}/receiver_test.go (95%) rename pkg/receiver/{faro => faroreceiver}/testdata/config.yaml (100%) rename pkg/receiver/{faro => faroreceiver}/testdata/default.yaml (100%) rename pkg/receiver/{faro => faroreceiver}/testdata/empty.json (100%) rename pkg/receiver/{faro => faroreceiver}/testdata/minimal-traces-only.json (100%) diff --git a/pkg/exporter/faro/README.md b/pkg/exporter/faroexporter/README.md similarity index 100% rename from pkg/exporter/faro/README.md rename to pkg/exporter/faroexporter/README.md diff --git a/pkg/exporter/faro/config.go b/pkg/exporter/faroexporter/config.go similarity index 98% rename from pkg/exporter/faro/config.go rename to pkg/exporter/faroexporter/config.go index 9a7dac3..e6ea662 100644 --- a/pkg/exporter/faro/config.go +++ b/pkg/exporter/faroexporter/config.go @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 -package faroexporter // import "github.com/grafana/faro/pkg/exporter/faro" +package faroexporter // import "github.com/grafana/faro/pkg/exporter/faroexporter" import ( "errors" diff --git a/pkg/exporter/faro/exporter.go b/pkg/exporter/faroexporter/exporter.go similarity index 97% rename from pkg/exporter/faro/exporter.go rename to pkg/exporter/faroexporter/exporter.go index 00ca6c6..f26a623 100644 --- a/pkg/exporter/faro/exporter.go +++ b/pkg/exporter/faroexporter/exporter.go @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 -package faroexporter // import "github.com/grafana/faro/pkg/exporter/faro" +package faroexporter // import "github.com/grafana/faro/pkg/exporter/faroexporter" import ( "bytes" @@ -14,7 +14,7 @@ import ( "strconv" "time" - httpHelper "github.com/grafana/faro/pkg/exporter/faro/internal/httphelper" + httpHelper "github.com/grafana/faro/pkg/exporter/faroexporter/internal/httphelper" faro "github.com/grafana/faro/pkg/go" farotranslator "github.com/grafana/faro/pkg/translator/faro" "go.opentelemetry.io/collector/component" diff --git a/pkg/exporter/faro/exporter_test.go b/pkg/exporter/faroexporter/exporter_test.go similarity index 97% rename from pkg/exporter/faro/exporter_test.go rename to pkg/exporter/faroexporter/exporter_test.go index 4f3c9dd..9ad3a5a 100644 --- a/pkg/exporter/faro/exporter_test.go +++ b/pkg/exporter/faroexporter/exporter_test.go @@ -1,4 +1,6 @@ -package faroexporter // import "github.com/grafana/faro/pkg/exporter/faro" +// SPDX-License-Identifier: Apache-2.0 + +package faroexporter // import "github.com/grafana/faro/pkg/exporter/faroexporter" import ( "context" diff --git a/pkg/exporter/faro/factory.go b/pkg/exporter/faroexporter/factory.go similarity index 96% rename from pkg/exporter/faro/factory.go rename to pkg/exporter/faroexporter/factory.go index 0235f4e..e5fe984 100644 --- a/pkg/exporter/faro/factory.go +++ b/pkg/exporter/faroexporter/factory.go @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 -package faroexporter // import "github.com/grafana/faro/pkg/exporter/faro" +package faroexporter // import "github.com/grafana/faro/pkg/exporter/faroexporter" import ( "context" @@ -13,7 +13,7 @@ import ( "go.opentelemetry.io/collector/exporter" "go.opentelemetry.io/collector/exporter/exporterhelper" - "github.com/grafana/faro/pkg/exporter/faro/internal/metadata" + "github.com/grafana/faro/pkg/exporter/faroexporter/internal/metadata" ) // NewFactory creates a factory for Faro exporter. diff --git a/pkg/exporter/faro/go.mod b/pkg/exporter/faroexporter/go.mod similarity index 98% rename from pkg/exporter/faro/go.mod rename to pkg/exporter/faroexporter/go.mod index 5b584f5..d312276 100644 --- a/pkg/exporter/faro/go.mod +++ b/pkg/exporter/faroexporter/go.mod @@ -1,4 +1,4 @@ -module github.com/grafana/faro/pkg/exporter/faro +module github.com/grafana/faro/pkg/exporter/faroexporter go 1.23.3 diff --git a/pkg/exporter/faro/go.sum b/pkg/exporter/faroexporter/go.sum similarity index 100% rename from pkg/exporter/faro/go.sum rename to pkg/exporter/faroexporter/go.sum diff --git a/pkg/exporter/faro/internal/httphelper/helper.go b/pkg/exporter/faroexporter/internal/httphelper/helper.go similarity index 100% rename from pkg/exporter/faro/internal/httphelper/helper.go rename to pkg/exporter/faroexporter/internal/httphelper/helper.go diff --git a/pkg/receiver/faro/internal/metadata/status.go b/pkg/exporter/faroexporter/internal/metadata/status.go similarity index 70% rename from pkg/receiver/faro/internal/metadata/status.go rename to pkg/exporter/faroexporter/internal/metadata/status.go index 81913b2..bca5330 100644 --- a/pkg/receiver/faro/internal/metadata/status.go +++ b/pkg/exporter/faroexporter/internal/metadata/status.go @@ -5,8 +5,8 @@ import ( ) var ( - Type = component.MustNewType("faroreceiver") - ScopeName = "github.com/grafana/faro/pkg/receiver/faro" + Type = component.MustNewType("faro") + ScopeName = "github.com/grafana/faro/pkg/exporter/faroexporter" ) const ( diff --git a/pkg/receiver/faro/README.md b/pkg/receiver/faroreceiver/README.md similarity index 100% rename from pkg/receiver/faro/README.md rename to pkg/receiver/faroreceiver/README.md diff --git a/pkg/receiver/faro/config.go b/pkg/receiver/faroreceiver/config.go similarity index 97% rename from pkg/receiver/faro/config.go rename to pkg/receiver/faroreceiver/config.go index e439e39..e445fd9 100644 --- a/pkg/receiver/faro/config.go +++ b/pkg/receiver/faroreceiver/config.go @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 -package faroreceiver // import "github.com/grafana/faro/pkg/receiver/faro" +package faroreceiver // import "github.com/grafana/faro/pkg/receiver/faroreceiver" import ( "errors" diff --git a/pkg/receiver/faro/config_test.go b/pkg/receiver/faroreceiver/config_test.go similarity index 100% rename from pkg/receiver/faro/config_test.go rename to pkg/receiver/faroreceiver/config_test.go diff --git a/pkg/receiver/faro/encoder.go b/pkg/receiver/faroreceiver/encoder.go similarity index 99% rename from pkg/receiver/faro/encoder.go rename to pkg/receiver/faroreceiver/encoder.go index 182cecc..ece3ea9 100644 --- a/pkg/receiver/faro/encoder.go +++ b/pkg/receiver/faroreceiver/encoder.go @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 -package faroreceiver // import "github.com/grafana/faro/pkg/receiver/faro" +package faroreceiver // import "github.com/grafana/faro/pkg/receiver/faroreceiver" import ( "bytes" diff --git a/pkg/receiver/faro/factory.go b/pkg/receiver/faroreceiver/factory.go similarity index 56% rename from pkg/receiver/faro/factory.go rename to pkg/receiver/faroreceiver/factory.go index 57124b0..b74b0f6 100644 --- a/pkg/receiver/faro/factory.go +++ b/pkg/receiver/faroreceiver/factory.go @@ -1,12 +1,13 @@ // SPDX-License-Identifier: Apache-2.0 -package faroreceiver // import "github.com/grafana/faro/pkg/receiver/faro" +package faroreceiver // import "github.com/grafana/faro/pkg/receiver/faroreceiver" import ( "context" "fmt" - "github.com/grafana/faro/pkg/receiver/faro/internal/metadata" + "github.com/grafana/faro/pkg/receiver/faroreceiver/internal/metadata" + "github.com/grafana/faro/pkg/receiver/faroreceiver/internal/sharedcomponent" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/confighttp" "go.opentelemetry.io/collector/consumer" @@ -44,12 +45,17 @@ func createFaroReceiverTraces( return nil, fmt.Errorf("invalid configuration: %T", cfg) } - receiver, err := newFaroReceiver(fCfg, &set) + receiver, err := receivers.LoadOrStore( + fCfg, + func() (*faroReceiver, error) { + return newFaroReceiver(fCfg, &set) + }, + ) if err != nil { return nil, err } - receiver.RegisterTracesConsumer(nextTraces) + receiver.Unwrap().RegisterTracesConsumer(nextTraces) return receiver, nil } @@ -64,13 +70,25 @@ func createFaroReceiverLogs( if !ok { return nil, fmt.Errorf("invalid configuration: %T", cfg) } - - receiver, err := newFaroReceiver(fCfg, &set) + receiver, err := receivers.LoadOrStore( + fCfg, + func() (*faroReceiver, error) { + return newFaroReceiver(fCfg, &set) + }, + ) if err != nil { return nil, err } - receiver.RegisterLogsConsumer(nextLogs) + receiver.Unwrap().RegisterLogsConsumer(nextLogs) return receiver, nil } + +// This is the map of already created Faro receivers for particular configurations. +// We maintain this map because the receiver.Factory is asked trace and metric receivers separately +// when it gets createFaroReceiverTraces() and createFaroReceiverLogs() but they must not +// create separate objects, they must use one faroReceiver object per configuration. +// When the receiver is shutdown it should be removed from this map so the same configuration +// can be recreated successfully. +var receivers = sharedcomponent.NewMap[*Config, *faroReceiver]() diff --git a/pkg/receiver/faro/go.mod b/pkg/receiver/faroreceiver/go.mod similarity index 77% rename from pkg/receiver/faro/go.mod rename to pkg/receiver/faroreceiver/go.mod index 1090021..18b38eb 100644 --- a/pkg/receiver/faro/go.mod +++ b/pkg/receiver/faroreceiver/go.mod @@ -1,4 +1,4 @@ -module github.com/grafana/faro/pkg/receiver/faro +module github.com/grafana/faro/pkg/receiver/faroreceiver go 1.23.3 @@ -30,10 +30,10 @@ require ( github.com/zeebo/xxh3 v1.0.2 // indirect go.opentelemetry.io/auto/sdk v1.1.0 // indirect go.opentelemetry.io/collector/consumer/consumererror v0.118.0 // indirect - go.opentelemetry.io/collector/pipeline v0.118.0 // indirect + go.opentelemetry.io/collector/pipeline v0.119.0 // indirect go.opentelemetry.io/collector/receiver/xreceiver v0.118.0 // indirect - go.opentelemetry.io/otel/sdk v1.32.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.32.0 // indirect + go.opentelemetry.io/otel/sdk v1.34.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect ) @@ -49,33 +49,33 @@ require ( github.com/rs/cors v1.11.1 // indirect github.com/stretchr/testify v1.10.0 go.opentelemetry.io/collector/client v1.24.0 // indirect - go.opentelemetry.io/collector/component v0.118.0 - go.opentelemetry.io/collector/component/componentstatus v0.118.0 - go.opentelemetry.io/collector/component/componenttest v0.118.0 - go.opentelemetry.io/collector/config/configauth v0.118.0 // indirect + go.opentelemetry.io/collector/component v0.119.0 + go.opentelemetry.io/collector/component/componentstatus v0.119.0 + go.opentelemetry.io/collector/component/componenttest v0.119.0 + go.opentelemetry.io/collector/config/configauth v0.118.0 go.opentelemetry.io/collector/config/configcompression v1.24.0 // indirect go.opentelemetry.io/collector/config/configopaque v1.24.0 // indirect - go.opentelemetry.io/collector/config/configtelemetry v0.118.0 // indirect - go.opentelemetry.io/collector/config/configtls v1.24.0 // indirect + go.opentelemetry.io/collector/config/configtelemetry v0.119.0 // indirect + go.opentelemetry.io/collector/config/configtls v1.24.0 go.opentelemetry.io/collector/confmap v1.24.0 go.opentelemetry.io/collector/consumer v1.24.0 go.opentelemetry.io/collector/consumer/consumertest v0.118.0 go.opentelemetry.io/collector/consumer/xconsumer v0.118.0 // indirect go.opentelemetry.io/collector/extension v0.118.0 // indirect go.opentelemetry.io/collector/extension/auth v0.118.0 // indirect - go.opentelemetry.io/collector/pdata v1.24.0 + go.opentelemetry.io/collector/pdata v1.25.0 go.opentelemetry.io/collector/receiver v0.118.0 go.opentelemetry.io/collector/receiver/receivertest v0.118.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 // indirect - go.opentelemetry.io/otel v1.33.0 // indirect - go.opentelemetry.io/otel/metric v1.33.0 // indirect - go.opentelemetry.io/otel/trace v1.33.0 // indirect + go.opentelemetry.io/otel v1.34.0 // indirect + go.opentelemetry.io/otel/metric v1.34.0 // indirect + go.opentelemetry.io/otel/trace v1.34.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 golang.org/x/net v0.34.0 // indirect golang.org/x/sys v0.29.0 // indirect golang.org/x/text v0.21.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f - google.golang.org/grpc v1.69.4 - google.golang.org/protobuf v1.36.3 // indirect + google.golang.org/grpc v1.70.0 + google.golang.org/protobuf v1.36.5 // indirect ) diff --git a/pkg/receiver/faro/go.sum b/pkg/receiver/faroreceiver/go.sum similarity index 87% rename from pkg/receiver/faro/go.sum rename to pkg/receiver/faroreceiver/go.sum index d5caabc..98dda66 100644 --- a/pkg/receiver/faro/go.sum +++ b/pkg/receiver/faroreceiver/go.sum @@ -95,12 +95,12 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A= go.opentelemetry.io/collector/client v1.24.0 h1:eH7ctqDnRWNH5QVVbAvdYYdkvr8QWLkEm8FUPaaYbWE= go.opentelemetry.io/collector/client v1.24.0/go.mod h1:C/38SYPa0tTL6ikPz/glYz6f3GVzEuT4nlEml6IBDMw= -go.opentelemetry.io/collector/component v0.118.0 h1:sSO/ObxJ+yH77Z4DmT1mlSuxhbgUmY1ztt7xCA1F/8w= -go.opentelemetry.io/collector/component v0.118.0/go.mod h1:LUJ3AL2b+tmFr3hZol3hzKzCMvNdqNq0M5CF3SWdv4M= -go.opentelemetry.io/collector/component/componentstatus v0.118.0 h1:1aCIdUjqz0noKNQr1v04P+lwF89Lkua5U7BhH9IAxkE= -go.opentelemetry.io/collector/component/componentstatus v0.118.0/go.mod h1:ynO1Nyj0t1h6x/djIMJy35bhnnWEc2mlQaFgDNUO504= -go.opentelemetry.io/collector/component/componenttest v0.118.0 h1:knEHckoiL2fEWSIc0iehg39zP4IXzi9sHa45O+oxKo8= -go.opentelemetry.io/collector/component/componenttest v0.118.0/go.mod h1:aHc7t7zVwCpbhrWIWY+GMuaMxMCUP8C8P7pJOt8r/vU= +go.opentelemetry.io/collector/component v0.119.0 h1:ZVp9myF1Bc4BLa1V4C15Jy/VpqKPPhvbxpe9pP1mPMc= +go.opentelemetry.io/collector/component v0.119.0/go.mod h1:wtuWxFl+Ky9E/5+t2FwHoLyADDiBFFDdx8fN3fEs0n8= +go.opentelemetry.io/collector/component/componentstatus v0.119.0 h1:H8isEInGaWhnDfuG1Ax663dlsPgF4aM20sgraM6HmSI= +go.opentelemetry.io/collector/component/componentstatus v0.119.0/go.mod h1:Hr7scHUFPhyT32IkzKq06cdhRH9jMKvnKbDVYRUEnqE= +go.opentelemetry.io/collector/component/componenttest v0.119.0 h1:nVlBmKSu56zO/qCcNgDYCQsRoWAL+NPkrkIPAbapdQM= +go.opentelemetry.io/collector/component/componenttest v0.119.0/go.mod h1:H6KVzLkNhB/deEijLcq91Kjgs9Oshx2ZsFAwaMcuTLs= go.opentelemetry.io/collector/config/configauth v0.118.0 h1:uBH/s9kRw/m7VWuibrkCzbXSCVLf9ElKq9NuKb0wAwk= go.opentelemetry.io/collector/config/configauth v0.118.0/go.mod h1:uAmSGkihIENoIah6mEQ8S/HX4oiFOHZu3EoZLZwi9OI= go.opentelemetry.io/collector/config/configcompression v1.24.0 h1:jyM6BX7wYcrh+eVSC0FMbWgy/zb9iP58SerOrvisccE= @@ -109,8 +109,8 @@ go.opentelemetry.io/collector/config/confighttp v0.118.0 h1:ey50dfySOCPgUPJ1x8Kq go.opentelemetry.io/collector/config/confighttp v0.118.0/go.mod h1:4frheVFiIfKUHuD/KAPn+u+d+EUx5GlQTNmoI1ftReA= go.opentelemetry.io/collector/config/configopaque v1.24.0 h1:EPOprMDreZPKyIgT0/eVBvEGQVvq7ncvBCBVnWerj54= go.opentelemetry.io/collector/config/configopaque v1.24.0/go.mod h1:sW0t0iI/VfRL9VYX7Ik6XzVgPcR+Y5kejTLsYcMyDWs= -go.opentelemetry.io/collector/config/configtelemetry v0.118.0 h1:UlN46EViG2X42odWtXgWaqY7Y01ZKpsnswSwXTWx5mM= -go.opentelemetry.io/collector/config/configtelemetry v0.118.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= +go.opentelemetry.io/collector/config/configtelemetry v0.119.0 h1:gAgMUEVXZKgpASxOrhS55DyA/aYatq0U6gitZI8MLXw= +go.opentelemetry.io/collector/config/configtelemetry v0.119.0/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE= go.opentelemetry.io/collector/config/configtls v1.24.0 h1:rOhl8qjIlUVVRHnwQj6/vZe6cuCYImyx7aVDBR35bqI= go.opentelemetry.io/collector/config/configtls v1.24.0/go.mod h1:d0OdfkbuYEMYDBJLSbpH0wPI29lmSiFT3geqh/ygF2k= go.opentelemetry.io/collector/confmap v1.24.0 h1:UUHVhkDCsVw14jPOarug9PDQE2vaB2ELPWMr7ARFBCA= @@ -129,14 +129,14 @@ go.opentelemetry.io/collector/extension/auth v0.118.0 h1:+eMNUBUK1JK9A3mr95BasbW go.opentelemetry.io/collector/extension/auth v0.118.0/go.mod h1:MJpYcRGSERkgOhczqTKoAhkHmcugr+YTlRhc/SpYYYI= go.opentelemetry.io/collector/extension/auth/authtest v0.118.0 h1:KIORXNc71vfpQrrZOntiZesRCZtQ8alrASWVT/zZkyo= go.opentelemetry.io/collector/extension/auth/authtest v0.118.0/go.mod h1:0ZlSP9NPAfTRQd6Tx4mOH0IWrp6ufHaVN//L9Mb87gM= -go.opentelemetry.io/collector/pdata v1.24.0 h1:D6j92eAzmAbQgivNBUnt8r9juOl8ugb+ihYynoFZIEg= -go.opentelemetry.io/collector/pdata v1.24.0/go.mod h1:cf3/W9E/uIvPS4MR26SnMFJhraUCattzzM6qusuONuc= +go.opentelemetry.io/collector/pdata v1.25.0 h1:AmgBklQfbfy0lT8qsoJtRuYMZ7ZV3VZvkvhjSDentrg= +go.opentelemetry.io/collector/pdata v1.25.0/go.mod h1:Zs7D4RXOGS7E2faGc/jfWdbmhoiHBxA7QbpuJOioxq8= go.opentelemetry.io/collector/pdata/pprofile v0.118.0 h1:VK/fr65VFOwEhsSGRPj5c3lCv0yIK1Kt0sZxv9WZBb8= go.opentelemetry.io/collector/pdata/pprofile v0.118.0/go.mod h1:eJyP/vBm179EghV3dPSnamGAWQwLyd+4z/3yG54YFoQ= go.opentelemetry.io/collector/pdata/testdata v0.118.0 h1:5N0w1SX9KIRkwvtkrpzQgXy9eGk3vfNG0ds6mhEPMIM= go.opentelemetry.io/collector/pdata/testdata v0.118.0/go.mod h1:UY+GHV5bOC1BnFburOZ0wiHReJj1XbW12mi2Ogbc5Lw= -go.opentelemetry.io/collector/pipeline v0.118.0 h1:RI1DMe7L0+5hGkx0EDGxG00TaJoh96MEQppgOlGx1Oc= -go.opentelemetry.io/collector/pipeline v0.118.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= +go.opentelemetry.io/collector/pipeline v0.119.0 h1:NebdPIOBIzU7CdOE36hNrCrUML+XOTR9Zsoy43E7MVk= +go.opentelemetry.io/collector/pipeline v0.119.0/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74= go.opentelemetry.io/collector/receiver v0.118.0 h1:X4mspHmbbtwdCQZ7o370kNmdWfxRnK1FrsvEShCCKEc= go.opentelemetry.io/collector/receiver v0.118.0/go.mod h1:wFyfu6sgrkDPLQoGOGMuChGZzkZnYcI/tPJWV4CRTzs= go.opentelemetry.io/collector/receiver/receivertest v0.118.0 h1:XlMr2mPsyXJsMUOqCpEoY3uCPsLZQbNA5fmVNDGB7Bw= @@ -145,16 +145,16 @@ go.opentelemetry.io/collector/receiver/xreceiver v0.118.0 h1:dzECve9e0H3ot0JWnWP go.opentelemetry.io/collector/receiver/xreceiver v0.118.0/go.mod h1:Lv1nD/mSYSP64iV8k+C+mWWZZOMLRubv9d1SUory3/E= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0 h1:UP6IpuHFkUgOQL9FFQFrZ+5LiwhhYRbi7VZSIx6Nj5s= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.56.0/go.mod h1:qxuZLtbq5QDtdeSHsS7bcf6EH6uO6jUAgk764zd3rhM= -go.opentelemetry.io/otel v1.33.0 h1:/FerN9bax5LoK51X/sI0SVYrjSE0/yUL7DpxW4K3FWw= -go.opentelemetry.io/otel v1.33.0/go.mod h1:SUUkR6csvUQl+yjReHu5uM3EtVV7MBm5FHKRlNx4I8I= -go.opentelemetry.io/otel/metric v1.33.0 h1:r+JOocAyeRVXD8lZpjdQjzMadVZp2M4WmQ+5WtEnklQ= -go.opentelemetry.io/otel/metric v1.33.0/go.mod h1:L9+Fyctbp6HFTddIxClbQkjtubW6O9QS3Ann/M82u6M= -go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= -go.opentelemetry.io/otel/sdk v1.32.0/go.mod h1:LqgegDBjKMmb2GC6/PrTnteJG39I8/vJCAP9LlJXEjU= -go.opentelemetry.io/otel/sdk/metric v1.32.0 h1:rZvFnvmvawYb0alrYkjraqJq0Z4ZUJAiyYCU9snn1CU= -go.opentelemetry.io/otel/sdk/metric v1.32.0/go.mod h1:PWeZlq0zt9YkYAp3gjKZ0eicRYvOh1Gd+X99x6GHpCQ= -go.opentelemetry.io/otel/trace v1.33.0 h1:cCJuF7LRjUFso9LPnEAHJDB2pqzp+hbO8eu1qqW2d/s= -go.opentelemetry.io/otel/trace v1.33.0/go.mod h1:uIcdVUZMpTAmz0tI1z04GoVSezK37CbGV4fr1f2nBck= +go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY= +go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= +go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ= +go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= +go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A= +go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= +go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk= +go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= +go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k= +go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto= go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE= go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0= @@ -194,10 +194,10 @@ golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8T golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f h1:OxYkA3wjPsZyBylwymxSHa7ViiW1Sml4ToBrncvFehI= google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= -google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A= -google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= -google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= -google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ= +google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw= +google.golang.org/protobuf v1.36.5 h1:tPhr+woSbjfYvY6/GPufUoYizxw1cF/yFoxJ2fmpwlM= +google.golang.org/protobuf v1.36.5/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= diff --git a/pkg/receiver/faro/internal/httphelper/helper.go b/pkg/receiver/faroreceiver/internal/httphelper/helper.go similarity index 100% rename from pkg/receiver/faro/internal/httphelper/helper.go rename to pkg/receiver/faroreceiver/internal/httphelper/helper.go diff --git a/pkg/exporter/faro/internal/metadata/status.go b/pkg/receiver/faroreceiver/internal/metadata/status.go similarity index 70% rename from pkg/exporter/faro/internal/metadata/status.go rename to pkg/receiver/faroreceiver/internal/metadata/status.go index b3347ec..5f326f4 100644 --- a/pkg/exporter/faro/internal/metadata/status.go +++ b/pkg/receiver/faroreceiver/internal/metadata/status.go @@ -5,8 +5,8 @@ import ( ) var ( - Type = component.MustNewType("faroexporter") - ScopeName = "github.com/grafana/faro/pkg/exporter/faro" + Type = component.MustNewType("faro") + ScopeName = "github.com/grafana/faro/pkg/receiver/faroreceiver" ) const ( diff --git a/pkg/receiver/faroreceiver/internal/sharedcomponent/package_test.go b/pkg/receiver/faroreceiver/internal/sharedcomponent/package_test.go new file mode 100644 index 0000000..424f48b --- /dev/null +++ b/pkg/receiver/faroreceiver/internal/sharedcomponent/package_test.go @@ -0,0 +1,14 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package sharedcomponent + +import ( + "testing" + + "go.uber.org/goleak" +) + +func TestMain(m *testing.M) { + goleak.VerifyTestMain(m) +} diff --git a/pkg/receiver/faroreceiver/internal/sharedcomponent/sharedcomponent.go b/pkg/receiver/faroreceiver/internal/sharedcomponent/sharedcomponent.go new file mode 100644 index 0000000..2b225df --- /dev/null +++ b/pkg/receiver/faroreceiver/internal/sharedcomponent/sharedcomponent.go @@ -0,0 +1,168 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package sharedcomponent exposes functionality for components +// to register against a shared key, such as a configuration object, in order to be reused across signal types. +// This is particularly useful when the component relies on a shared resource such as os.File or http.Server. +// It is a copy of https://github.com/open-telemetry/opentelemetry-collector/tree/main/internal/sharedcomponent +package sharedcomponent + +import ( + "container/ring" + "context" + "sync" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" +) + +func NewMap[K comparable, V component.Component]() *Map[K, V] { + return &Map[K, V]{ + components: map[K]*Component[V]{}, + } +} + +// Map keeps reference of all created instances for a given shared key such as a component configuration. +type Map[K comparable, V component.Component] struct { + lock sync.Mutex + components map[K]*Component[V] +} + +// LoadOrStore returns the already created instance if exists, otherwise creates a new instance +// and adds it to the map of references. +func (m *Map[K, V]) LoadOrStore(key K, create func() (V, error)) (*Component[V], error) { + m.lock.Lock() + defer m.lock.Unlock() + if c, ok := m.components[key]; ok { + return c, nil + } + comp, err := create() + if err != nil { + return nil, err + } + + newComp := &Component[V]{ + component: comp, + removeFunc: func() { + m.lock.Lock() + defer m.lock.Unlock() + delete(m.components, key) + }, + } + m.components[key] = newComp + return newComp, nil +} + +// Component ensures that the wrapped component is started and stopped only once. +// When stopped it is removed from the Map. +type Component[V component.Component] struct { + component V + + startOnce sync.Once + stopOnce sync.Once + removeFunc func() + + hostWrapper *hostWrapper +} + +// Unwrap returns the original component. +func (c *Component[V]) Unwrap() V { + return c.component +} + +// Start starts the underlying component if it never started before. +func (c *Component[V]) Start(ctx context.Context, host component.Host) error { + if c.hostWrapper == nil { + var err error + c.startOnce.Do(func() { + c.hostWrapper = &hostWrapper{ + host: host, + sources: make([]componentstatus.Reporter, 0), + previousEvents: ring.New(5), + } + statusReporter, isStatusReporter := host.(componentstatus.Reporter) + if isStatusReporter { + c.hostWrapper.addSource(statusReporter) + } + + // It's important that status for a shared component is reported through its + // telemetry settings to keep status in sync and avoid race conditions. This logic duplicates + // and takes priority over the automated status reporting that happens in graph, making the + // status reporting in graph a no-op. + c.hostWrapper.Report(componentstatus.NewEvent(componentstatus.StatusStarting)) + if err = c.component.Start(ctx, c.hostWrapper); err != nil { + c.hostWrapper.Report(componentstatus.NewPermanentErrorEvent(err)) + } + }) + return err + } + statusReporter, isStatusReporter := host.(componentstatus.Reporter) + if isStatusReporter { + c.hostWrapper.addSource(statusReporter) + } + return nil +} + +var ( + _ component.Host = (*hostWrapper)(nil) + _ componentstatus.Reporter = (*hostWrapper)(nil) +) + +type hostWrapper struct { + host component.Host + sources []componentstatus.Reporter + previousEvents *ring.Ring + lock sync.Mutex +} + +func (h *hostWrapper) GetExtensions() map[component.ID]component.Component { + return h.host.GetExtensions() +} + +func (h *hostWrapper) Report(e *componentstatus.Event) { + // Only remember an event if it will be emitted and it has not been sent already. + h.lock.Lock() + defer h.lock.Unlock() + if len(h.sources) > 0 { + h.previousEvents.Value = e + h.previousEvents = h.previousEvents.Next() + } + for _, s := range h.sources { + s.Report(e) + } +} + +func (h *hostWrapper) addSource(s componentstatus.Reporter) { + h.lock.Lock() + defer h.lock.Unlock() + h.previousEvents.Do(func(a any) { + if e, ok := a.(*componentstatus.Event); ok { + s.Report(e) + } + }) + h.sources = append(h.sources, s) +} + +// Shutdown shuts down the underlying component. +func (c *Component[V]) Shutdown(ctx context.Context) error { + var err error + c.stopOnce.Do(func() { + // It's important that status for a shared component is reported through its + // telemetry settings to keep status in sync and avoid race conditions. This logic duplicates + // and takes priority over the automated status reporting that happens in graph, making the + // status reporting in graph a no-op. + if c.hostWrapper != nil { + c.hostWrapper.Report(componentstatus.NewEvent(componentstatus.StatusStopping)) + } + err = c.component.Shutdown(ctx) + if c.hostWrapper != nil { + if err != nil { + c.hostWrapper.Report(componentstatus.NewPermanentErrorEvent(err)) + } else { + c.hostWrapper.Report(componentstatus.NewEvent(componentstatus.StatusStopped)) + } + } + c.removeFunc() + }) + return err +} diff --git a/pkg/receiver/faroreceiver/internal/sharedcomponent/sharedcomponent_test.go b/pkg/receiver/faroreceiver/internal/sharedcomponent/sharedcomponent_test.go new file mode 100644 index 0000000..bb4d1e8 --- /dev/null +++ b/pkg/receiver/faroreceiver/internal/sharedcomponent/sharedcomponent_test.go @@ -0,0 +1,215 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package sharedcomponent + +import ( + "context" + "errors" + "testing" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "go.opentelemetry.io/collector/component" + "go.opentelemetry.io/collector/component/componentstatus" + "go.opentelemetry.io/collector/component/componenttest" +) + +var id = component.MustNewID("test") + +type baseComponent struct { + component.StartFunc + component.ShutdownFunc +} + +func TestNewMap(t *testing.T) { + comps := NewMap[component.ID, *baseComponent]() + assert.Empty(t, comps.components) +} + +func TestNewSharedComponentsCreateError(t *testing.T) { + comps := NewMap[component.ID, *baseComponent]() + assert.Empty(t, comps.components) + myErr := errors.New("my error") + _, err := comps.LoadOrStore( + id, + func() (*baseComponent, error) { return nil, myErr }, + ) + require.ErrorIs(t, err, myErr) + assert.Empty(t, comps.components) +} + +func TestSharedComponentsLoadOrStore(t *testing.T) { + nop := &baseComponent{} + + comps := NewMap[component.ID, *baseComponent]() + got, err := comps.LoadOrStore( + id, + func() (*baseComponent, error) { return nop, nil }, + ) + require.NoError(t, err) + assert.Len(t, comps.components, 1) + assert.Same(t, nop, got.Unwrap()) + gotSecond, err := comps.LoadOrStore( + id, + func() (*baseComponent, error) { panic("should not be called") }, + ) + + require.NoError(t, err) + assert.Same(t, got, gotSecond) + + // Shutdown nop will remove + require.NoError(t, got.Shutdown(context.Background())) + assert.Empty(t, comps.components) + gotThird, err := comps.LoadOrStore( + id, + func() (*baseComponent, error) { return nop, nil }, + ) + require.NoError(t, err) + assert.NotSame(t, got, gotThird) +} + +func TestSharedComponent(t *testing.T) { + wantErr := errors.New("my error") + calledStart := 0 + calledStop := 0 + comp := &baseComponent{ + StartFunc: func(context.Context, component.Host) error { + calledStart++ + return wantErr + }, + ShutdownFunc: func(context.Context) error { + calledStop++ + return wantErr + }, + } + + comps := NewMap[component.ID, *baseComponent]() + got, err := comps.LoadOrStore( + id, + func() (*baseComponent, error) { return comp, nil }, + ) + require.NoError(t, err) + assert.Equal(t, wantErr, got.Start(context.Background(), componenttest.NewNopHost())) + assert.Equal(t, 1, calledStart) + // Second time is not called anymore. + require.NoError(t, got.Start(context.Background(), componenttest.NewNopHost())) + assert.Equal(t, 1, calledStart) + // first time, shutdown is called. + assert.Equal(t, wantErr, got.Shutdown(context.Background())) + assert.Equal(t, 1, calledStop) + // Second time is not called anymore. + require.NoError(t, got.Shutdown(context.Background())) + assert.Equal(t, 1, calledStop) +} + +func TestReportStatusOnStartShutdown(t *testing.T) { + for _, tc := range []struct { + name string + startErr error + shutdownErr error + expectedStatuses []componentstatus.Status + expectedNumReporterInstances int + }{ + { + name: "successful start/stop", + startErr: nil, + shutdownErr: nil, + expectedStatuses: []componentstatus.Status{ + componentstatus.StatusStarting, + componentstatus.StatusOK, + componentstatus.StatusStopping, + componentstatus.StatusStopped, + }, + expectedNumReporterInstances: 3, + }, + { + name: "start error", + startErr: assert.AnError, + shutdownErr: nil, + expectedStatuses: []componentstatus.Status{ + componentstatus.StatusStarting, + componentstatus.StatusPermanentError, + }, + expectedNumReporterInstances: 1, + }, + { + name: "shutdown error", + shutdownErr: assert.AnError, + expectedStatuses: []componentstatus.Status{ + componentstatus.StatusStarting, + componentstatus.StatusOK, + componentstatus.StatusStopping, + componentstatus.StatusPermanentError, + }, + expectedNumReporterInstances: 3, + }, + } { + t.Run(tc.name, func(t *testing.T) { + reportedStatuses := make(map[*componentstatus.InstanceID][]componentstatus.Status) + newStatusFunc := func(id *componentstatus.InstanceID, ev *componentstatus.Event) { + reportedStatuses[id] = append(reportedStatuses[id], ev.Status()) + } + base := &baseComponent{} + if tc.startErr != nil { + base.StartFunc = func(context.Context, component.Host) error { + return tc.startErr + } + } + if tc.shutdownErr != nil { + base.ShutdownFunc = func(context.Context) error { + return tc.shutdownErr + } + } + comps := NewMap[component.ID, *baseComponent]() + var comp *Component[*baseComponent] + var err error + for i := 0; i < 3; i++ { + comp, err = comps.LoadOrStore( + id, + func() (*baseComponent, error) { return base, nil }, + ) + require.NoError(t, err) + } + + baseHost := componenttest.NewNopHost() + for i := 0; i < 3; i++ { + err = comp.Start(context.Background(), &testHost{Host: baseHost, InstanceID: &componentstatus.InstanceID{}, newStatusFunc: newStatusFunc}) + if err != nil { + break + } + } + + require.Equal(t, tc.startErr, err) + + if tc.startErr == nil { + comp.hostWrapper.Report(componentstatus.NewEvent(componentstatus.StatusOK)) + + err = comp.Shutdown(context.Background()) + require.Equal(t, tc.shutdownErr, err) + } + + require.Len(t, reportedStatuses, tc.expectedNumReporterInstances) + + for _, actualStatuses := range reportedStatuses { + require.Equal(t, tc.expectedStatuses, actualStatuses) + } + }) + } +} + +var ( + _ component.Host = (*testHost)(nil) + _ componentstatus.Reporter = (*testHost)(nil) +) + +type testHost struct { + component.Host + *componentstatus.InstanceID + newStatusFunc func(id *componentstatus.InstanceID, ev *componentstatus.Event) +} + +func (h *testHost) Report(e *componentstatus.Event) { + h.newStatusFunc(h.InstanceID, e) +} diff --git a/pkg/receiver/faro/receiver.go b/pkg/receiver/faroreceiver/receiver.go similarity index 98% rename from pkg/receiver/faro/receiver.go rename to pkg/receiver/faroreceiver/receiver.go index 05af10c..30cfd2d 100644 --- a/pkg/receiver/faro/receiver.go +++ b/pkg/receiver/faroreceiver/receiver.go @@ -1,6 +1,6 @@ // SPDX-License-Identifier: Apache-2.0 -package faroreceiver // import "github.com/grafana/faro/pkg/receiver/faro" +package faroreceiver // import "github.com/grafana/faro/pkg/receiver/faroreceiver" import ( "context" @@ -12,7 +12,7 @@ import ( "strings" faro "github.com/grafana/faro/pkg/go" - httpHelper "github.com/grafana/faro/pkg/receiver/faro/internal/httphelper" + httpHelper "github.com/grafana/faro/pkg/receiver/faroreceiver/internal/httphelper" farotranslator "github.com/grafana/faro/pkg/translator/faro" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/component/componentstatus" diff --git a/pkg/receiver/faro/receiver_test.go b/pkg/receiver/faroreceiver/receiver_test.go similarity index 95% rename from pkg/receiver/faro/receiver_test.go rename to pkg/receiver/faroreceiver/receiver_test.go index ac23edd..78f9f21 100644 --- a/pkg/receiver/faro/receiver_test.go +++ b/pkg/receiver/faroreceiver/receiver_test.go @@ -1,4 +1,6 @@ -package faroreceiver +// SPDX-License-Identifier: Apache-2.0 + +package faroreceiver // import "github.com/grafana/faro/pkg/receiver/faroreceiver" import ( "bytes" diff --git a/pkg/receiver/faro/testdata/config.yaml b/pkg/receiver/faroreceiver/testdata/config.yaml similarity index 100% rename from pkg/receiver/faro/testdata/config.yaml rename to pkg/receiver/faroreceiver/testdata/config.yaml diff --git a/pkg/receiver/faro/testdata/default.yaml b/pkg/receiver/faroreceiver/testdata/default.yaml similarity index 100% rename from pkg/receiver/faro/testdata/default.yaml rename to pkg/receiver/faroreceiver/testdata/default.yaml diff --git a/pkg/receiver/faro/testdata/empty.json b/pkg/receiver/faroreceiver/testdata/empty.json similarity index 100% rename from pkg/receiver/faro/testdata/empty.json rename to pkg/receiver/faroreceiver/testdata/empty.json diff --git a/pkg/receiver/faro/testdata/minimal-traces-only.json b/pkg/receiver/faroreceiver/testdata/minimal-traces-only.json similarity index 100% rename from pkg/receiver/faro/testdata/minimal-traces-only.json rename to pkg/receiver/faroreceiver/testdata/minimal-traces-only.json