Repository: jaegertracing/jaeger

Issue:
[Bug]: Operation based sampling strategies are not being returned for ratelimiting service strategies
Edit by @yurishkuro 

* [x] introduce new flag with correct behavior #5277
* [x] change that flag to be on by default (v2.2.0/v1.65.0) #6441
* [ ] remove the flag and the old code (circa March 2025) #6872
 
1. (bug) When service has rate limiting strategy at the service level, and defines no per-operation strategies, the global per-operation strategies were also ignored
2. (change) When service has probabilistic service-level strategy, and defines no per-operation strategies, the global per-operation strategies were used, but the default sampling rate was taken from global settings, whereas arguably service-level setting should take priority.

Example: given this config file where services A and B do not define their own per-operation strategies:

```json
{ 
      "service_strategies": [ 
        { 
          "service": "ServiceA", 
          "type": "probabilistic", 
          "param": 1.0 
        }, 
        { 
         "service": "ServiceB", 
         "type": "ratelimiting", 
         "param": 3 
       } 
      ], 
      "default_strategy": { 
        "type": "probabilistic", 
        "param": 0.2, 
        "operation_strategies": [ 
          { 
            "operation": "/health", 
            "type": "probabilistic", 
            "param": 0.1
          } 
        ] 
      } 
    } 
```

We expect ServiceA to have the following strategy:
  * it inherits per-operation strategies from global config
  * except for `defaultSamplingProbability` which is kept the same `1.0` as at the service-level
```json
{
  "probabilisticSampling": {
    "samplingRate": 1
  },
  "operationSampling": {
    "defaultSamplingProbability": 1,
    "perOperationStrategies": [
      {
        "operation": "/health",
        "probabilisticSampling": {
          "samplingRate": 0.1
        }
      }
    ]
  }
}
```
We expect ServiceB to have the following strategy:
  * it inherits per-operation strategies from global config as is
```json
{
  "strategyType": 1,
  "rateLimitingSampling": {
    "maxTracesPerSecond": 3
  },
  "operationSampling": {
    "defaultSamplingProbability": 0.2,
    "perOperationStrategies": [
      {
        "operation": "/health",
        "probabilisticSampling": {
          "samplingRate": 0.1
        }
      }
    ]
  }
}
```

Original ticket below:
---

### What happened?

While investigating https://github.com/open-telemetry/opentelemetry-java/issues/5504 I was not able to identify any issues with handling of the responses received from jaeger for sampling strategies related to a given service name. However - I found that if service sampling strategy is "ratelimiting" then default operation sampling strategies were not being returned.

### Steps to reproduce

1. Run plugin\sampling\strategystore\static\strategy_store_test.go\TestServiceNoPerOperationStrategies unit test after replacing its code with the snippet below.
4. The strategy store file used implies that ServiceB should have probablistic operation sampling of 0.0 for operation "/health", which is not the case, as there are no associated operation sampling strategies for ServiceB. 

### Expected behavior

As implied in https://www.jaegertracing.io/docs/1.28/sampling/#collector-sampling-configuration I would expect the following changes to plugin\sampling\strategystore\static\strategy_store_test.go\TestServiceNoPerOperationStrategies unit test case should result in a passing test:

```
func TestServiceNoPerOperationStrategies(t *testing.T) {
	store, err := NewStrategyStore(Options{StrategiesFile: "fixtures/service_no_per_operation.json"}, zap.NewNop())
	require.NoError(t, err)

	s, err := store.GetSamplingStrategy(context.Background(), "ServiceA")
	require.NoError(t, err)
	require.NotNil(t, s.OperationSampling)
	os := s.OperationSampling
	assert.EqualValues(t, 1, os.DefaultSamplingProbability)
	require.Len(t, os.PerOperationStrategies, 1)
	assert.Equal(t, "/health", os.PerOperationStrategies[0].Operation)
	assert.EqualValues(t, 0.0, os.PerOperationStrategies[0].ProbabilisticSampling.SamplingRate)
	expected := makeResponse(api_v2.SamplingStrategyType_PROBABILISTIC, 1.0)
	assert.Equal(t, *expected.ProbabilisticSampling, *s.ProbabilisticSampling)

	s, err = store.GetSamplingStrategy(context.Background(), "ServiceB")
	require.NoError(t, err)
	require.NotNil(t, s.OperationSampling)
	os = s.OperationSampling
	assert.EqualValues(t, 0.2, os.DefaultSamplingProbability)
	require.Len(t, os.PerOperationStrategies, 1)
	assert.Equal(t, "/health", os.PerOperationStrategies[0].Operation)
	assert.EqualValues(t, 0.0, os.PerOperationStrategies[0].ProbabilisticSampling.SamplingRate)
	expected = makeResponse(api_v2.SamplingStrategyType_RATE_LIMITING, 3)
	assert.Equal(t, *expected.RateLimitingSampling, *s.RateLimitingSampling)
}
```

### Relevant log output

```shell
N/A
```


### Screenshot

N/A

### Additional context

I believe this behaviour was introduced as part of https://github.com/jaegertracing/jaeger/pull/2230 as an outcome of https://github.com/jaegertracing/jaeger/issues/2171 discussion.
this issue is created as per contribution guidelines. 
I'm working on setting up a test to verify the fix I made (https://github.com/kuujis/jaeger/pull/1) with some basic service setup and work through other requirements (first time contributing). 

I would also appreciate feedback on the solution itself, since depending on how one looks at it - it might be considered breaking contract, especially since the code was not changed for a while. 
The alternative I was considering, but decided against was to call jaeger twice from OTEL library in order to get both "service" specific and the "default" configurations and then merge them, but it felt wrong, since I felt this is incorrect behavior on Jager side.

### Jaeger backend version

v1.35.0

### SDK

io.opentelemetry:opentelemetry-bom:1.35.0

### Pipeline

OTEL SDK -> Jaeger.GetSamplingStrategy -> exporter to console

### Stogage backend

_No response_

### Operating system

_No response_

### Deployment model

_No response_

### Deployment configs

_No response_

Discussion:
@yurishkuro: Sorry, I don't understand the issue, as you keep talking about unit tests. Please describe the use case, show configuration used, and explain what behavior you are expecting and getting instead.@kuujis: Sorry, I'll try to elaborate.

I originally wanted to solve an issue in OpenTelemetry SDK - https://github.com/open-telemetry/opentelemetry-java/issues/5504, which used the following strategies_sampling.json:
```
{
  "service_strategies": [
    {
      "service": "foobar",
      "type": "ratelimiting",
      "param": 2
    }
  ],
  "default_strategy": {
    "type": "probabilistic",
    "param": 0.2,
    "operation_strategies": [
      {
        "operation": "/metrics",
        "type": "probabilistic",
        "param": 0.0
      }
    ]
  }
}
```
I made a small java service and added OTEL tooling with all-in-one Jaeger backend and local console output for simplicity sake - https://github.com/kuujis/opentelemetry-java-5504. There are commands to build and run images, which should make the problem clear(er?) if someone feels like checking it out.

What I observed after some debugging is that [GetSamplingStrategy gRCP call from OTEL ](https://github.com/open-telemetry/opentelemetry-java/blob/7831f2ab2dcaea53fb40d727dc1a722e50ab491d/sdk-extensions/jaeger-remote-sampler/src/main/java/io/opentelemetry/sdk/extension/trace/jaeger/sampler/JaegerRemoteSamplerBuilder.java#L33) towards Jaeger all-in-one app does not return the default strategies, which should be applied to specific operation ("/metrics" in the example above) IF the service sampling strategy is "ratelimiting". The default operations level strategies are added as expected for "probablistic" service sampling strategies.

After investigating why that is so - I found [the part](https://github.com/kuujis/jaeger/blob/ccecb7fba19a589f23624464e0b7c3f3dd5bb1e9/plugin/sampling/strategystore/static/strategy_store.go#L233) which I believe is the cause of the problem, and since its much simpler to reproduce the issue via an updated [unit test](https://github.com/kuujis/jaeger/blob/ccecb7fba19a589f23624464e0b7c3f3dd5bb1e9/plugin/sampling/strategystore/static/strategy_store_test.go#L467)  which is covering that specific situation - I went with that in the bug description, instead of the whole repo and the whole story of how the issue was reproduced.

Hope this clarifies things.@yurishkuro: @kuujis I've been thinking how better to explain this issue. The way the Jaeger SDKs used to interpret a sampling configuration was like this:
  * if per-operation section is defined, it is used for everything. If the operation does not match any of the listed operations, then `defaultSamplingRate` is applied (along with lower/upper bounds).
  * otherwise, service-level strategy is applied to everything (also used in SDKs that do not support per-operation sampling)

So in your example when one of the services defines rate-limiting strategy, as soon as the per-operation sampling strategy is added the rate-limiting section becomes completely irrelevant, but only for the SDKs that actually support per-operation. This could be a big unexpected breaking change for some existing installations where if they are currently getting rate limiting on a service (but with SDK capable of per-operation) then after this change the whole service will switch to default per-operation strategy, which could mean much fewer or much more traces, no way to tell.@kuujis: I pretty much got similar impression, hence the comment in the original description on the possible "breaking of contract". The possibility of this having an unintended consequences is definitely worth considering. 
Maybe it would be a good idea to provide a temporary switch via env variable, which would disable the effects of the updated functionality, so that if there are issues - there would also be a quick "emergency" solution. 
The idea would be to make provide support for an upgrade flow which might look like this: 
- upgrade Jaeger to version n
- discover the change and its impact 
- disable it via the flag 
- work on a fix in configuration files (might take some time to do right) 
- deploy fixed configs 
- remove the flag

And then at the "n+1" version - flag is removed and the fix, even if it is a breaking change, becomes the new updated behavior. Not sure how much such an approach is worth it or would be welcome though.@yurishkuro: @kuujis I think we should follow our [CLI flags deprecation policy](https://github.com/jaegertracing/jaeger/blob/main/CONTRIBUTING.md#deprecating-cli-flags), which we can adapt as follows:
  1. in this PR introduce a new CLI flag `--sampling.strategies.bugfix-5270`, which if set to `true` would enable the new behavior (this means the unit tests will need to test both old and new ones. I would probably just clone the original function with toBeRemoved prefix). By default this flag should be `false`, but when `false` it should log a warning that this behavior will be changed in the future (see policy link above for examples).
  2. After 2 releases we can change the default of the flags to true, and change the warning that this flag will be deprecated altogether in another deprecation cycle
  3. Finally remove the flag and the old code / tests.
@kuujis: Looks like a good plan, I'll add these.@yurishkuro: tagging this as good first issue - to remove the flag/option and change the code to always do the new thing (and remove the old code).

Solution patch:
diff --git a/.github/workflows/ci-docker-all-in-one.yml b/.github/workflows/ci-docker-all-in-one.yml
index 145ec468..f3af41f5 100644
--- a/.github/workflows/ci-docker-all-in-one.yml
+++ b/.github/workflows/ci-docker-all-in-one.yml
@@ -48,10 +48,10 @@ jobs:
 
     - uses: docker/setup-qemu-action@29109295f81e9208d7d86ff1c6c12d2833863392 # v3.6.0
 
-    - name: Define BUILD_FLAGS var if running on a Pull Request
+    - name: Define BUILD_FLAGS var if running on a Pull Request or Merge Queue
       run: |
         case ${GITHUB_EVENT_NAME} in
-          pull_request)
+          pull_request|merge_group)
             echo "BUILD_FLAGS=-l -D -p linux/$(go env GOARCH)" >> ${GITHUB_ENV}
             ;;
           *)
diff --git a/.gitignore b/.gitignore
index 95bc230a..2c49f46a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -50,4 +50,4 @@ sha256sum.combined.txt
 resource.syso
 .gocache
 test-results.json
-.metrics/
\ No newline at end of file
+.metrics/
diff --git a/Makefile b/Makefile
index 658f969a..24efa17b 100644
--- a/Makefile
+++ b/Makefile
@@ -222,11 +222,11 @@ generate-mocks: $(MOCKERY)
 
 .PHONY: certs
 certs:
-	cd pkg/config/tlscfg/testdata && ./gen-certs.sh
+	cd internal/config/tlscfg/testdata && ./gen-certs.sh
 
 .PHONY: certs-dryrun
 certs-dryrun:
-	cd pkg/config/tlscfg/testdata && ./gen-certs.sh -d
+	cd internal/config/tlscfg/testdata && ./gen-certs.sh -d
 
 .PHONY: repro-check
 repro-check:
diff --git a/cmd/agent/Dockerfile b/cmd/agent/Dockerfile
deleted file mode 100644
index 59b6c3c3..00000000
--- a/cmd/agent/Dockerfile
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright (c) 2024 The Jaeger Authors.
-# SPDX-License-Identifier: Apache-2.0
-
-ARG base_image
-ARG debug_image
-
-FROM $base_image AS release
-ARG TARGETARCH
-ARG USER_UID=10001
-COPY agent-linux-$TARGETARCH /go/bin/agent-linux
-EXPOSE 5775/udp 6831/udp 6832/udp 5778/tcp
-ENTRYPOINT ["/go/bin/agent-linux"]
-USER ${USER_UID}
-
-FROM $debug_image AS debug
-ARG TARGETARCH=amd64
-ARG USER_UID=10001
-COPY agent-debug-linux-$TARGETARCH /go/bin/agent-linux
-EXPOSE 5775/udp 6831/udp 6832/udp 5778/tcp 12345/tcp
-ENTRYPOINT ["/go/bin/dlv", "exec", "/go/bin/agent-linux", "--headless", "--listen=:12345", "--api-version=2", "--accept-multiclient", "--log", "--"]
-USER ${USER_UID}
diff --git a/cmd/agent/README.md b/cmd/agent/README.md
deleted file mode 100644
index 38bdaf90..00000000
--- a/cmd/agent/README.md
+++ /dev/null
@@ -1,37 +0,0 @@
-# Jaeger Agent
-
-🛑🛑🛑 DEPRECATED 🛑🛑🛑 See [issues/4739](https://github.com/jaegertracing/jaeger/issues/4739).
-
-`jaeger-agent` is a daemon program that runs on every host and receives
-tracing information submitted by applications via Jaeger client 
-libraries.
-
-## Structure
-
-* Agent
-    * processor as ThriftProcessor
-        * server as TBufferedServer
-            * Thrift UDP Transport
-        * reporter as CollectorReporter
-    * sampling server
-        * sampling manager as sampling.CollectorProxy
-
-### UDP Server
-
-Listens on UDP transport, reads data as `[]byte` and forwards to
-`processor` over channel. Processor has N workers that read from
-the channel, convert to thrift-generated object model, and pass on
-to the Reporter. `CollectorReporter` submits the spans to remote
-`collector` service.
-
-### Sampling Server
-
-An HTTP server handling request in the form
-
-    http://localhost:port/sampling?service=xxxx`
-
-Delegates to `sampling.Manager` to get the sampling strategy.
-`sampling.CollectorProxy` implements `sampling.Manager` by querying
-remote `collector` service. Then the server converts
-thrift response from sampling manager into JSON and responds to clients.
-
diff --git a/cmd/agent/app/agent.go b/cmd/agent/app/agent.go
deleted file mode 100644
index 97f6408f..00000000
--- a/cmd/agent/app/agent.go
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package app
-
-import (
-	"context"
-	"net"
-	"net/http"
-	"sync"
-	"sync/atomic"
-	"time"
-
-	"github.com/gorilla/mux"
-	"go.uber.org/zap"
-
-	"github.com/jaegertracing/jaeger/cmd/agent/app/processors"
-)
-
-// Agent is a composition of all services / components
-type Agent struct {
-	processors []processors.Processor
-	httpServer *http.Server
-	httpAddr   atomic.Value // string, set once agent starts listening
-	logger     *zap.Logger
-	exitWG     sync.WaitGroup
-}
-
-// NewAgent creates the new Agent.
-func NewAgent(
-	procs []processors.Processor,
-	httpServer *http.Server,
-	logger *zap.Logger,
-) *Agent {
-	a := &Agent{
-		processors: procs,
-		httpServer: httpServer,
-		logger:     logger,
-	}
-	a.httpAddr.Store("")
-	return a
-}
-
-// GetHTTPRouter returns Gorilla HTTP router used by the agent's HTTP server.
-func (a *Agent) GetHTTPRouter() *mux.Router {
-	return a.httpServer.Handler.(*mux.Router)
-}
-
-// Run runs all of agent UDP and HTTP servers in separate go-routines.
-// It returns an error when it's immediately apparent on startup, but
-// any errors happening after starting the servers are only logged.
-func (a *Agent) Run() error {
-	listener, err := net.Listen("tcp", a.httpServer.Addr)
-	if err != nil {
-		return err
-	}
-	a.httpAddr.Store(listener.Addr().String())
-	a.exitWG.Add(1)
-	go func() {
-		a.logger.Info("Starting jaeger-agent HTTP server", zap.Int("http-port", listener.Addr().(*net.TCPAddr).Port))
-		if err := a.httpServer.Serve(listener); err != http.ErrServerClosed {
-			a.logger.Error("http server failure", zap.Error(err))
-		}
-		a.logger.Info("agent's http server exiting")
-		a.exitWG.Done()
-	}()
-	for _, processor := range a.processors {
-		go processor.Serve()
-	}
-	return nil
-}
-
-// HTTPAddr returns the address that HTTP server is listening on
-func (a *Agent) HTTPAddr() string {
-	return a.httpAddr.Load().(string)
-}
-
-// Stop forces all agent go routines to exit.
-func (a *Agent) Stop() {
-	// first, close the http server, so that we don't have any more inflight requests
-	a.logger.Info("shutting down agent's HTTP server", zap.String("addr", a.HTTPAddr()))
-	timeout, cancel := context.WithTimeout(context.Background(), 5*time.Second)
-	if err := a.httpServer.Shutdown(timeout); err != nil {
-		a.logger.Error("failed to close HTTP server", zap.Error(err))
-	}
-	cancel()
-
-	// then, close all processors that are called for the incoming http requests
-	for _, processor := range a.processors {
-		processor.Stop()
-	}
-	a.exitWG.Wait()
-}
diff --git a/cmd/agent/app/builder.go b/cmd/agent/app/builder.go
deleted file mode 100644
index 5cdbbf34..00000000
--- a/cmd/agent/app/builder.go
+++ /dev/null
@@ -1,240 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package app
-
-import (
-	"context"
-	"fmt"
-	"io"
-	"net/http"
-	"strconv"
-
-	"github.com/apache/thrift/lib/go/thrift"
-	"go.uber.org/zap"
-
-	agentThrift "github.com/jaegertracing/jaeger-idl/thrift-gen/agent"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/configmanager"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/httpserver"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/processors"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/reporter"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/servers"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/servers/thriftudp"
-	"github.com/jaegertracing/jaeger/internal/safeexpvar"
-	"github.com/jaegertracing/jaeger/pkg/metrics"
-)
-
-const (
-	defaultQueueSize     = 1000
-	defaultMaxPacketSize = 65000
-	defaultServerWorkers = 10
-
-	jaegerModel Model = "jaeger"
-	zipkinModel Model = "zipkin"
-
-	compactProtocol Protocol = "compact"
-	binaryProtocol  Protocol = "binary"
-)
-
-var defaultHTTPServerHostPort = ":" + strconv.Itoa(AgentConfigServerHTTP)
-
-// Model used to distinguish the data transfer model
-type Model string
-
-// Protocol used to distinguish the data transfer protocol
-type Protocol string
-
-var protocolFactoryMap = map[Protocol]thrift.TProtocolFactory{
-	compactProtocol: thrift.NewTCompactProtocolFactoryConf(&thrift.TConfiguration{}),
-	binaryProtocol:  thrift.NewTBinaryProtocolFactoryConf(&thrift.TConfiguration{}),
-}
-
-// CollectorProxy provides access to Reporter and ClientConfigManager
-type CollectorProxy interface {
-	GetReporter() reporter.Reporter
-	GetManager() configmanager.ClientConfigManager
-	io.Closer
-}
-
-// Builder Struct to hold configurations
-type Builder struct {
-	Processors []ProcessorConfiguration `yaml:"processors"`
-	HTTPServer HTTPServerConfiguration  `yaml:"httpServer"`
-
-	reporters []reporter.Reporter
-}
-
-// ProcessorConfiguration holds config for a processor that receives spans from Server
-type ProcessorConfiguration struct {
-	Workers  int                 `yaml:"workers"`
-	Model    Model               `yaml:"model"`
-	Protocol Protocol            `yaml:"protocol"`
-	Server   ServerConfiguration `yaml:"server"`
-}
-
-// ServerConfiguration holds config for a server that receives spans from the network
-type ServerConfiguration struct {
-	QueueSize        int    `yaml:"queueSize"`
-	MaxPacketSize    int    `yaml:"maxPacketSize"`
-	SocketBufferSize int    `yaml:"socketBufferSize"`
-	HostPort         string `yaml:"hostPort" validate:"nonzero"`
-}
-
-// HTTPServerConfiguration holds config for a server providing sampling strategies to clients
-type HTTPServerConfiguration struct {
-	HostPort string `yaml:"hostPort" validate:"nonzero"`
-}
-
-// WithReporter adds auxiliary reporters.
-func (b *Builder) WithReporter(r ...reporter.Reporter) *Builder {
-	b.reporters = append(b.reporters, r...)
-	return b
-}
-
-// CreateAgent creates the Agent
-func (b *Builder) CreateAgent(primaryProxy CollectorProxy, logger *zap.Logger, mFactory metrics.Factory) (*Agent, error) {
-	r := b.getReporter(primaryProxy)
-	procs, err := b.getProcessors(r, mFactory, logger)
-	if err != nil {
-		return nil, fmt.Errorf("cannot create processors: %w", err)
-	}
-	server := b.HTTPServer.getHTTPServer(primaryProxy.GetManager(), mFactory, logger)
-	b.publishOpts()
-
-	return NewAgent(procs, server, logger), nil
-}
-
-func (b *Builder) getReporter(primaryProxy CollectorProxy) reporter.Reporter {
-	if len(b.reporters) == 0 {
-		return primaryProxy.GetReporter()
-	}
-	rep := make([]reporter.Reporter, len(b.reporters)+1)
-	rep[0] = primaryProxy.GetReporter()
-	for i, r := range b.reporters {
-		rep[i+1] = r
-	}
-	return reporter.NewMultiReporter(rep...)
-}
-
-func (b *Builder) publishOpts() {
-	for _, p := range b.Processors {
-		prefix := fmt.Sprintf(processorPrefixFmt, p.Model, p.Protocol)
-		safeexpvar.SetInt(prefix+suffixServerMaxPacketSize, int64(p.Server.MaxPacketSize))
-		safeexpvar.SetInt(prefix+suffixServerQueueSize, int64(p.Server.QueueSize))
-		safeexpvar.SetInt(prefix+suffixWorkers, int64(p.Workers))
-	}
-}
-
-func (b *Builder) getProcessors(rep reporter.Reporter, mFactory metrics.Factory, logger *zap.Logger) ([]processors.Processor, error) {
-	retMe := make([]processors.Processor, len(b.Processors))
-	for idx, cfg := range b.Processors {
-		protoFactory, ok := protocolFactoryMap[cfg.Protocol]
-		if !ok {
-			return nil, fmt.Errorf("cannot find protocol factory for protocol %v", cfg.Protocol)
-		}
-		var handler processors.AgentProcessor
-		switch cfg.Model {
-		case jaegerModel, zipkinModel:
-			handler = agentThrift.NewAgentProcessor(rep)
-		default:
-			return nil, fmt.Errorf("cannot find agent processor for data model %v", cfg.Model)
-		}
-		metricsNamespace := mFactory.Namespace(metrics.NSOptions{Name: "", Tags: map[string]string{
-			"protocol": string(cfg.Protocol),
-			"model":    string(cfg.Model),
-		}})
-		processor, err := cfg.GetThriftProcessor(metricsNamespace, protoFactory, handler, logger)
-		if err != nil {
-			return nil, fmt.Errorf("cannot create Thrift Processor: %w", err)
-		}
-		retMe[idx] = processor
-	}
-	return retMe, nil
-}
-
-// GetHTTPServer creates an HTTP server that provides sampling strategies to client libraries.
-func (c HTTPServerConfiguration) getHTTPServer(manager configmanager.ClientConfigManager, mFactory metrics.Factory, logger *zap.Logger) *http.Server {
-	hostPort := c.HostPort
-	if hostPort == "" {
-		hostPort = defaultHTTPServerHostPort
-	}
-	return httpserver.NewHTTPServer(hostPort, manager, mFactory, logger)
-}
-
-// GetThriftProcessor gets a TBufferedServer backed Processor using the collector configuration
-func (c *ProcessorConfiguration) GetThriftProcessor(
-	mFactory metrics.Factory,
-	factory thrift.TProtocolFactory,
-	handler processors.AgentProcessor,
-	logger *zap.Logger,
-) (processors.Processor, error) {
-	c.applyDefaults()
-
-	server, err := c.Server.getUDPServer(mFactory)
-	if err != nil {
-		return nil, fmt.Errorf("cannot create UDP Server: %w", err)
-	}
-
-	return processors.NewThriftProcessor(server, c.Workers, mFactory, factory, handler, logger)
-}
-
-func (c *ProcessorConfiguration) applyDefaults() {
-	c.Workers = defaultInt(c.Workers, defaultServerWorkers)
-}
-
-func (c *ServerConfiguration) applyDefaults() {
-	c.QueueSize = defaultInt(c.QueueSize, defaultQueueSize)
-	c.MaxPacketSize = defaultInt(c.MaxPacketSize, defaultMaxPacketSize)
-	c.SocketBufferSize = defaultInt(c.SocketBufferSize, 0)
-}
-
-// getUDPServer gets a TBufferedServer backed server using the server configuration
-func (c *ServerConfiguration) getUDPServer(mFactory metrics.Factory) (*servers.UDPServer, error) {
-	c.applyDefaults()
-
-	if c.HostPort == "" {
-		return nil, fmt.Errorf("no host:port provided for udp server: %+v", *c)
-	}
-	transport, err := thriftudp.NewTUDPServerTransport(c.HostPort)
-	if err != nil {
-		return nil, fmt.Errorf("cannot create UDPServerTransport: %w", err)
-	}
-	if c.SocketBufferSize != 0 {
-		if err := transport.SetSocketBufferSize(c.SocketBufferSize); err != nil {
-			return nil, fmt.Errorf("cannot set UDP socket buffer size: %w", err)
-		}
-	}
-
-	return servers.NewUDPServer(transport, c.QueueSize, c.MaxPacketSize, mFactory)
-}
-
-func defaultInt(value int, defaultVal int) int {
-	if value == 0 {
-		value = defaultVal
-	}
-	return value
-}
-
-// ProxyBuilderOptions holds config for CollectorProxyBuilder
-type ProxyBuilderOptions struct {
-	reporter.Options
-	Logger  *zap.Logger
-	Metrics metrics.Factory
-}
-
-// CollectorProxyBuilder is a func which builds CollectorProxy.
-type CollectorProxyBuilder func(context.Context, ProxyBuilderOptions) (CollectorProxy, error)
-
-// CreateCollectorProxy creates collector proxy
-func CreateCollectorProxy(
-	ctx context.Context,
-	opts ProxyBuilderOptions,
-	builders map[reporter.Type]CollectorProxyBuilder,
-) (CollectorProxy, error) {
-	builder, ok := builders[opts.ReporterType]
-	if !ok {
-		return nil, fmt.Errorf("unknown reporter type %s", string(opts.ReporterType))
-	}
-	return builder(ctx, opts)
-}
diff --git a/cmd/agent/app/configmanager/grpc/manager.go b/cmd/agent/app/configmanager/grpc/manager.go
deleted file mode 100644
index c328c779..00000000
--- a/cmd/agent/app/configmanager/grpc/manager.go
+++ /dev/null
@@ -1,34 +0,0 @@
-// Copyright (c) 2018 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package grpc
-
-import (
-	"context"
-	"fmt"
-
-	"google.golang.org/grpc"
-
-	"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
-)
-
-// ConfigManagerProxy returns sampling decisions from collector over gRPC.
-type ConfigManagerProxy struct {
-	client api_v2.SamplingManagerClient
-}
-
-// NewConfigManager creates gRPC sampling manager.
-func NewConfigManager(conn *grpc.ClientConn) *ConfigManagerProxy {
-	return &ConfigManagerProxy{
-		client: api_v2.NewSamplingManagerClient(conn),
-	}
-}
-
-// GetSamplingStrategy returns sampling strategies from collector.
-func (s *ConfigManagerProxy) GetSamplingStrategy(ctx context.Context, serviceName string) (*api_v2.SamplingStrategyResponse, error) {
-	resp, err := s.client.GetSamplingStrategy(ctx, &api_v2.SamplingStrategyParameters{ServiceName: serviceName})
-	if err != nil {
-		return nil, fmt.Errorf("failed to get sampling strategy: %w", err)
-	}
-	return resp, nil
-}
diff --git a/cmd/agent/app/configmanager/manager.go b/cmd/agent/app/configmanager/manager.go
deleted file mode 100644
index 08299cea..00000000
--- a/cmd/agent/app/configmanager/manager.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package configmanager
-
-import (
-	"context"
-
-	"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
-)
-
-// TODO this interface could be moved to pkg/clientcfg, along with grpc proxy,
-// but not the metrics wrapper (because its metric names are specific to agent).
-
-// ClientConfigManager decides which sampling strategy a given service should be using.
-type ClientConfigManager interface {
-	GetSamplingStrategy(ctx context.Context, serviceName string) (*api_v2.SamplingStrategyResponse, error)
-}
diff --git a/cmd/agent/app/configmanager/metrics.go b/cmd/agent/app/configmanager/metrics.go
deleted file mode 100644
index a014315f..00000000
--- a/cmd/agent/app/configmanager/metrics.go
+++ /dev/null
@@ -1,44 +0,0 @@
-// Copyright (c) 2018 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package configmanager
-
-import (
-	"context"
-
-	"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
-	"github.com/jaegertracing/jaeger/pkg/metrics"
-)
-
-// configManagerMetrics holds metrics related to ClientConfigManager
-type configManagerMetrics struct {
-	// Number of successful sampling rate responses from collector
-	SamplingSuccess metrics.Counter `metric:"collector-proxy" tags:"result=ok,endpoint=sampling"`
-
-	// Number of failed sampling rate responses from collector
-	SamplingFailures metrics.Counter `metric:"collector-proxy" tags:"result=err,endpoint=sampling"`
-}
-
-// ManagerWithMetrics is manager with metrics integration.
-type ManagerWithMetrics struct {
-	wrapped ClientConfigManager
-	metrics configManagerMetrics
-}
-
-// WrapWithMetrics wraps ClientConfigManager and creates metrics for its invocations.
-func WrapWithMetrics(manager ClientConfigManager, mFactory metrics.Factory) *ManagerWithMetrics {
-	m := configManagerMetrics{}
-	metrics.Init(&m, mFactory, nil)
-	return &ManagerWithMetrics{wrapped: manager, metrics: m}
-}
-
-// GetSamplingStrategy returns sampling strategy from server.
-func (m *ManagerWithMetrics) GetSamplingStrategy(ctx context.Context, serviceName string) (*api_v2.SamplingStrategyResponse, error) {
-	r, err := m.wrapped.GetSamplingStrategy(ctx, serviceName)
-	if err != nil {
-		m.metrics.SamplingFailures.Inc(1)
-	} else {
-		m.metrics.SamplingSuccess.Inc(1)
-	}
-	return r, err
-}
diff --git a/cmd/agent/app/customtransport/buffered_read_transport.go b/cmd/agent/app/customtransport/buffered_read_transport.go
deleted file mode 100644
index 24058042..00000000
--- a/cmd/agent/app/customtransport/buffered_read_transport.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package customtransport
-
-import (
-	"bytes"
-	"context"
-
-	"github.com/apache/thrift/lib/go/thrift"
-)
-
-// TBufferedReadTransport is a thrift.TTransport that reads from a buffer
-type TBufferedReadTransport struct {
-	readBuf *bytes.Buffer
-}
-
-var _ thrift.TTransport = (*TBufferedReadTransport)(nil)
-
-// NewTBufferedReadTransport creates a buffer backed TTransport
-func NewTBufferedReadTransport(readBuf *bytes.Buffer) (*TBufferedReadTransport, error) {
-	return &TBufferedReadTransport{readBuf: readBuf}, nil
-}
-
-// IsOpen does nothing as transport is not maintaining the connection
-// Required to maintain thrift.TTransport interface
-func (*TBufferedReadTransport) IsOpen() bool {
-	return true
-}
-
-// Open does nothing as transport is not maintaining the connection
-// Required to maintain thrift.TTransport interface
-func (*TBufferedReadTransport) Open() error {
-	return nil
-}
-
-// Close does nothing as transport is not maintaining the connection
-// Required to maintain thrift.TTransport interface
-func (*TBufferedReadTransport) Close() error {
-	return nil
-}
-
-// Read reads bytes from the local buffer and puts them in the specified buf
-func (p *TBufferedReadTransport) Read(buf []byte) (int, error) {
-	in, err := p.readBuf.Read(buf)
-	return in, thrift.NewTTransportExceptionFromError(err)
-}
-
-// RemainingBytes returns the number of bytes left to be read from the readBuf
-func (p *TBufferedReadTransport) RemainingBytes() uint64 {
-	//nolint: gosec // G115
-	return uint64(p.readBuf.Len())
-}
-
-// Write writes bytes into the read buffer
-// Required to maintain thrift.TTransport interface
-func (p *TBufferedReadTransport) Write(buf []byte) (int, error) {
-	p.readBuf = bytes.NewBuffer(buf)
-	return len(buf), nil
-}
-
-// Flush does nothing as udp server does not write responses back
-// Required to maintain thrift.TTransport interface
-func (*TBufferedReadTransport) Flush(_ context.Context) error {
-	return nil
-}
diff --git a/cmd/agent/app/flags.go b/cmd/agent/app/flags.go
deleted file mode 100644
index 7109dd8c..00000000
--- a/cmd/agent/app/flags.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package app
-
-import (
-	"flag"
-	"fmt"
-	"strconv"
-
-	"github.com/spf13/viper"
-)
-
-const (
-	suffixWorkers                = "workers"
-	suffixServerQueueSize        = "server-queue-size"
-	suffixServerMaxPacketSize    = "server-max-packet-size"
-	suffixServerSocketBufferSize = "server-socket-buffer-size"
-	suffixServerHostPort         = "server-host-port"
-
-	processorPrefixFmt = "processor.%s-%s."
-	httpServerHostPort = "http-server.host-port"
-)
-
-var defaultProcessors = []struct {
-	model    Model
-	protocol Protocol
-	port     int
-}{
-	{model: "zipkin", protocol: "compact", port: AgentZipkinThriftCompactUDP},
-	{model: "jaeger", protocol: "compact", port: AgentJaegerThriftCompactUDP},
-	{model: "jaeger", protocol: "binary", port: AgentJaegerThriftBinaryUDP},
-}
-
-// AddFlags adds flags for Builder.
-func AddFlags(flags *flag.FlagSet) {
-	flags.String(
-		httpServerHostPort,
-		defaultHTTPServerHostPort,
-		"host:port of the http server (e.g. for /sampling endpoint)")
-
-	for _, p := range defaultProcessors {
-		prefix := fmt.Sprintf(processorPrefixFmt, p.model, p.protocol)
-		flags.Int(prefix+suffixWorkers, defaultServerWorkers, "how many workers the processor should run")
-		flags.Int(prefix+suffixServerQueueSize, defaultQueueSize, "length of the queue for the UDP server")
-		flags.Int(prefix+suffixServerMaxPacketSize, defaultMaxPacketSize, "max packet size for the UDP server")
-		flags.Int(prefix+suffixServerSocketBufferSize, 0, "socket buffer size for UDP packets in bytes")
-		flags.String(prefix+suffixServerHostPort, ":"+strconv.Itoa(p.port), "host:port for the UDP server")
-	}
-}
-
-// InitFromViper initializes Builder with properties retrieved from Viper.
-func (b *Builder) InitFromViper(v *viper.Viper) *Builder {
-	for _, processor := range defaultProcessors {
-		prefix := fmt.Sprintf(processorPrefixFmt, processor.model, processor.protocol)
-		p := &ProcessorConfiguration{Model: processor.model, Protocol: processor.protocol}
-		p.Workers = v.GetInt(prefix + suffixWorkers)
-		p.Server.QueueSize = v.GetInt(prefix + suffixServerQueueSize)
-		p.Server.MaxPacketSize = v.GetInt(prefix + suffixServerMaxPacketSize)
-		p.Server.SocketBufferSize = v.GetInt(prefix + suffixServerSocketBufferSize)
-		p.Server.HostPort = portNumToHostPort(v.GetString(prefix + suffixServerHostPort))
-		b.Processors = append(b.Processors, *p)
-	}
-
-	b.HTTPServer.HostPort = portNumToHostPort(v.GetString(httpServerHostPort))
-	return b
-}
-
-// portNumToHostPort checks if the value is a raw integer port number,
-// and converts it to ":{port}" host-port string, otherwise leaves it as is.
-func portNumToHostPort(v string) string {
-	if _, err := strconv.Atoi(v); err == nil {
-		return ":" + v
-	}
-	return v
-}
diff --git a/cmd/agent/app/httpserver/srv.go b/cmd/agent/app/httpserver/srv.go
deleted file mode 100644
index 3d281ef3..00000000
--- a/cmd/agent/app/httpserver/srv.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package httpserver
-
-import (
-	"net/http"
-	"time"
-
-	"github.com/gorilla/mux"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zapcore"
-
-	"github.com/jaegertracing/jaeger/cmd/agent/app/configmanager"
-	samplinghttp "github.com/jaegertracing/jaeger/internal/sampling/http"
-	"github.com/jaegertracing/jaeger/pkg/metrics"
-)
-
-// NewHTTPServer creates a new server that hosts an HTTP/JSON endpoint for clients
-// to query for sampling strategies.
-func NewHTTPServer(hostPort string, manager configmanager.ClientConfigManager, mFactory metrics.Factory, logger *zap.Logger) *http.Server {
-	handler := samplinghttp.NewHandler(samplinghttp.HandlerParams{
-		ConfigManager:          manager,
-		MetricsFactory:         mFactory,
-		LegacySamplingEndpoint: true,
-	})
-	r := mux.NewRouter()
-	handler.RegisterRoutes(r)
-	errorLog, _ := zap.NewStdLogAt(logger, zapcore.ErrorLevel)
-	return &http.Server{
-		Addr:              hostPort,
-		Handler:           r,
-		ErrorLog:          errorLog,
-		ReadHeaderTimeout: 2 * time.Second,
-	}
-}
diff --git a/cmd/agent/app/ports.go b/cmd/agent/app/ports.go
deleted file mode 100644
index 9304df85..00000000
--- a/cmd/agent/app/ports.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package app
-
-const (
-	// AgentJaegerThriftCompactUDP is the default port for receiving Jaeger Thrift over UDP in compact encoding
-	AgentJaegerThriftCompactUDP = 6831
-	// AgentJaegerThriftBinaryUDP is the default port for receiving Jaeger Thrift over UDP in binary encoding
-	AgentJaegerThriftBinaryUDP = 6832
-	// AgentZipkinThriftCompactUDP is the default port for receiving Zipkin Thrift over UDP in binary encoding
-	AgentZipkinThriftCompactUDP = 5775
-	// AgentConfigServerHTTP is the default port for the agent's HTTP config server (e.g. /sampling endpoint)
-	AgentConfigServerHTTP = 5778
-	// AgentAdminHTTP is the default admin HTTP port (health check, metrics, etc.)
-	AgentAdminHTTP = 14271
-)
diff --git a/cmd/agent/app/processors/processor.go b/cmd/agent/app/processors/processor.go
deleted file mode 100644
index 947ca423..00000000
--- a/cmd/agent/app/processors/processor.go
+++ /dev/null
@@ -1,11 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package processors
-
-// Processor processes metrics in multiple formats
-type Processor interface {
-	Serve()
-	Stop()
-}
diff --git a/cmd/agent/app/processors/thrift_processor.go b/cmd/agent/app/processors/thrift_processor.go
deleted file mode 100644
index fde978fe..00000000
--- a/cmd/agent/app/processors/thrift_processor.go
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package processors
-
-import (
-	"context"
-	"fmt"
-	"sync"
-
-	"github.com/apache/thrift/lib/go/thrift"
-	"go.uber.org/zap"
-
-	"github.com/jaegertracing/jaeger/cmd/agent/app/customtransport"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/servers"
-	"github.com/jaegertracing/jaeger/pkg/metrics"
-)
-
-// ThriftProcessor is a server that processes spans using a TBuffered Server
-type ThriftProcessor struct {
-	server        *servers.UDPServer
-	handler       AgentProcessor
-	protocolPool  *sync.Pool
-	numProcessors int
-	processing    sync.WaitGroup
-	logger        *zap.Logger
-	metrics       struct {
-		// Amount of time taken for processor to close
-		ProcessorCloseTimer metrics.Timer `metric:"thrift.udp.t-processor.close-time"`
-
-		// Number of failed buffer process operations
-		HandlerProcessError metrics.Counter `metric:"thrift.udp.t-processor.handler-errors"`
-	}
-}
-
-// AgentProcessor handler used by the processor to process thrift and call the reporter
-// with the deserialized struct. This interface is implemented directly by Thrift generated
-// code, e.g. jaegerThrift.NewAgentProcessor(handler), where handler implements the Agent
-// Thrift service interface, which is invoked with the deserialized struct.
-type AgentProcessor interface {
-	Process(ctx context.Context, iprot, oprot thrift.TProtocol) (success bool, err thrift.TException)
-}
-
-// NewThriftProcessor creates a TBufferedServer backed ThriftProcessor
-func NewThriftProcessor(
-	server *servers.UDPServer,
-	numProcessors int,
-	mFactory metrics.Factory,
-	factory thrift.TProtocolFactory,
-	handler AgentProcessor,
-	logger *zap.Logger,
-) (*ThriftProcessor, error) {
-	if numProcessors <= 0 {
-		return nil, fmt.Errorf(
-			"number of processors must be greater than 0, called with %d", numProcessors)
-	}
-	protocolPool := &sync.Pool{
-		New: func() any {
-			trans := &customtransport.TBufferedReadTransport{}
-			return factory.GetProtocol(trans)
-		},
-	}
-
-	res := &ThriftProcessor{
-		server:        server,
-		handler:       handler,
-		protocolPool:  protocolPool,
-		logger:        logger,
-		numProcessors: numProcessors,
-	}
-	metrics.Init(&res.metrics, mFactory, nil)
-	res.processing.Add(res.numProcessors)
-	for i := 0; i < res.numProcessors; i++ {
-		go func() {
-			res.processBuffer()
-			res.processing.Done()
-		}()
-	}
-	return res, nil
-}
-
-// Serve starts serving traffic
-func (s *ThriftProcessor) Serve() {
-	s.server.Serve()
-}
-
-// IsServing indicates whether the server is currently serving traffic
-func (s *ThriftProcessor) IsServing() bool {
-	return s.server.IsServing()
-}
-
-// Stop stops the serving of traffic and waits until the queue is
-// emptied by the readers
-func (s *ThriftProcessor) Stop() {
-	stopwatch := metrics.StartStopwatch(s.metrics.ProcessorCloseTimer)
-	s.server.Stop()
-	s.processing.Wait()
-	stopwatch.Stop()
-}
-
-// processBuffer reads data off the channel and puts it into a custom transport for
-// the processor to process
-func (s *ThriftProcessor) processBuffer() {
-	for buf := range s.server.DataChan() {
-		protocol := s.protocolPool.Get().(thrift.TProtocol)
-		buf.WriteTo(protocol.Transport())
-		s.logger.Debug("Span(s) received by the agent", zap.Int("bytes-received", buf.Len()))
-
-		// NB: oddly, thrift-gen/agent/agent.go:L156 does this: `return true, thrift.WrapTException(err2)`
-		// So we check for both OK and error.
-		if ok, err := s.handler.Process(context.Background(), protocol, protocol); !ok || err != nil {
-			s.logger.Error("Processor failed", zap.Error(err))
-			s.metrics.HandlerProcessError.Inc(1)
-		}
-		s.protocolPool.Put(protocol)
-		s.server.DataRecd(buf) // acknowledge receipt and release the buffer
-	}
-}
diff --git a/cmd/agent/app/proxy_builders.go b/cmd/agent/app/proxy_builders.go
deleted file mode 100644
index 63badb39..00000000
--- a/cmd/agent/app/proxy_builders.go
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2020 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package app
-
-import (
-	"context"
-
-	"github.com/jaegertracing/jaeger/cmd/agent/app/reporter/grpc"
-)
-
-// GRPCCollectorProxyBuilder creates CollectorProxyBuilder for GRPC reporter
-func GRPCCollectorProxyBuilder(builder *grpc.ConnBuilder) CollectorProxyBuilder {
-	return func(ctx context.Context, opts ProxyBuilderOptions) (proxy CollectorProxy, err error) {
-		return grpc.NewCollectorProxy(ctx, builder, opts.AgentTags, opts.Metrics, opts.Logger)
-	}
-}
diff --git a/cmd/agent/app/reporter/client_metrics.go b/cmd/agent/app/reporter/client_metrics.go
deleted file mode 100644
index b804cf34..00000000
--- a/cmd/agent/app/reporter/client_metrics.go
+++ /dev/null
@@ -1,225 +0,0 @@
-// Copyright (c) 2020 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package reporter
-
-import (
-	"context"
-	"sync"
-	"sync/atomic"
-	"time"
-
-	"go.uber.org/zap"
-
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/jaeger"
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-	"github.com/jaegertracing/jaeger/pkg/metrics"
-)
-
-const (
-	defaultExpireFrequency = 15 * time.Minute
-	defaultExpireTTL       = time.Hour
-)
-
-// clientMetrics are maintained only for data submitted in Jaeger Thrift format.
-type clientMetrics struct {
-	BatchesReceived  metrics.Counter `metric:"batches_received" help:"Total count of batches received from conforming clients"`
-	BatchesSent      metrics.Counter `metric:"batches_sent" help:"Total count of batches sent by clients"`
-	ConnectedClients metrics.Gauge   `metric:"connected_clients" help:"Total count of unique clients sending data to the agent"`
-
-	// NB: The following three metrics all have the same name, but different "cause" tags.
-	//     Only the first one is given a "help" struct tag, because Prometheus client combines
-	//     them into one help entry in the /metrics endpoint, e.g.
-	//
-	//       # HELP jaeger_agent_client_stats_spans_dropped_total Total count of spans dropped by clients
-	//       # TYPE jaeger_agent_client_stats_spans_dropped_total counter
-	//       jaeger_agent_client_stats_spans_dropped_total{cause="full-queue"} 0
-	//       jaeger_agent_client_stats_spans_dropped_total{cause="send-failure"} 0
-	//       jaeger_agent_client_stats_spans_dropped_total{cause="too-large"} 0
-
-	// Total count of spans dropped by clients because their internal queue were full.
-	FullQueueDroppedSpans metrics.Counter `metric:"spans_dropped" tags:"cause=full-queue" help:"Total count of spans dropped by clients"`
-
-	// Total count of spans dropped by clients because they were larger than max packet size.
-	TooLargeDroppedSpans metrics.Counter `metric:"spans_dropped" tags:"cause=too-large"`
-
-	// Total count of spans dropped by clients because they failed Thrift encoding or submission.
-	FailedToEmitSpans metrics.Counter `metric:"spans_dropped" tags:"cause=send-failure"`
-}
-
-type lastReceivedClientStats struct {
-	lock        sync.Mutex
-	lastUpdated time.Time
-
-	// Thrift stats are reported as signed i64, so keep the type to avoid multiple conversions back and forth.
-	batchSeqNo            int64
-	fullQueueDroppedSpans int64
-	tooLargeDroppedSpans  int64
-	failedToEmitSpans     int64
-}
-
-// ClientMetricsReporter is a decorator that emits data loss metrics on behalf of clients.
-// The clients must send a Process.Tag `client-uuid` with a unique string for each client instance.
-type ClientMetricsReporter struct {
-	params        ClientMetricsReporterParams
-	clientMetrics *clientMetrics
-	shutdown      chan struct{}
-	closed        atomic.Bool
-
-	// map from client-uuid to *lastReceivedClientStats
-	lastReceivedClientStats sync.Map
-}
-
-// ClientMetricsReporterParams is used as input to WrapWithClientMetrics.
-type ClientMetricsReporterParams struct {
-	Reporter        Reporter        // required
-	Logger          *zap.Logger     // required
-	MetricsFactory  metrics.Factory // required
-	ExpireFrequency time.Duration
-	ExpireTTL       time.Duration
-}
-
-// WrapWithClientMetrics creates ClientMetricsReporter.
-func WrapWithClientMetrics(params ClientMetricsReporterParams) *ClientMetricsReporter {
-	if params.ExpireFrequency == 0 {
-		params.ExpireFrequency = defaultExpireFrequency
-	}
-	if params.ExpireTTL == 0 {
-		params.ExpireTTL = defaultExpireTTL
-	}
-	cm := new(clientMetrics)
-	metrics.MustInit(cm, params.MetricsFactory.Namespace(metrics.NSOptions{Name: "client_stats"}), nil)
-	r := &ClientMetricsReporter{
-		params:        params,
-		clientMetrics: cm,
-		shutdown:      make(chan struct{}),
-	}
-	go r.expireClientMetricsLoop()
-	return r
-}
-
-// EmitZipkinBatch delegates to underlying Reporter.
-func (r *ClientMetricsReporter) EmitZipkinBatch(ctx context.Context, spans []*zipkincore.Span) error {
-	return r.params.Reporter.EmitZipkinBatch(ctx, spans)
-}
-
-// EmitBatch processes client data loss metrics and delegates to the underlying reporter.
-func (r *ClientMetricsReporter) EmitBatch(ctx context.Context, batch *jaeger.Batch) error {
-	r.updateClientMetrics(batch)
-	return r.params.Reporter.EmitBatch(ctx, batch)
-}
-
-// Close stops background gc goroutine for client stats map.
-func (r *ClientMetricsReporter) Close() error {
-	if r.closed.CompareAndSwap(false, true) {
-		close(r.shutdown)
-	}
-	return nil
-}
-
-func (r *ClientMetricsReporter) expireClientMetricsLoop() {
-	ticker := time.NewTicker(r.params.ExpireFrequency)
-	defer ticker.Stop()
-	for {
-		select {
-		case now := <-ticker.C:
-			r.expireClientMetrics(now)
-		case <-r.shutdown:
-			return
-		}
-	}
-}
-
-func (r *ClientMetricsReporter) expireClientMetrics(t time.Time) {
-	var size int64
-	r.lastReceivedClientStats.Range(func(k, v any) bool {
-		stats := v.(*lastReceivedClientStats)
-		stats.lock.Lock()
-		defer stats.lock.Unlock()
-
-		if !stats.lastUpdated.IsZero() && t.Sub(stats.lastUpdated) > r.params.ExpireTTL {
-			r.lastReceivedClientStats.Delete(k)
-			r.params.Logger.Debug("have not heard from a client for a while, freeing stats",
-				zap.Any("client-uuid", k),
-				zap.Time("last-message", stats.lastUpdated),
-			)
-		}
-		size++
-		return true // keep running through all values in the map
-	})
-	r.clientMetrics.ConnectedClients.Update(size)
-}
-
-func (r *ClientMetricsReporter) updateClientMetrics(batch *jaeger.Batch) {
-	clientUUID := clientUUID(batch)
-	if clientUUID == "" {
-		return
-	}
-	if batch.SeqNo == nil {
-		return
-	}
-	entry, found := r.lastReceivedClientStats.Load(clientUUID)
-	if !found {
-		ent, loaded := r.lastReceivedClientStats.LoadOrStore(clientUUID, &lastReceivedClientStats{})
-		if !loaded {
-			r.params.Logger.Debug("received batch from a new client, starting to keep stats",
-				zap.String("client-uuid", clientUUID),
-			)
-		}
-		entry = ent
-	}
-	clientStats := entry.(*lastReceivedClientStats)
-	clientStats.update(*batch.SeqNo, batch.Stats, r.clientMetrics)
-}
-
-func (s *lastReceivedClientStats) update(
-	batchSeqNo int64,
-	stats *jaeger.ClientStats,
-	cMetrics *clientMetrics,
-) {
-	s.lock.Lock()
-	defer s.lock.Unlock()
-
-	cMetrics.BatchesReceived.Inc(1)
-
-	if s.batchSeqNo >= batchSeqNo {
-		// Ignore out of order batches. Once we receive a batch with a larger-than-seen number,
-		// it will contain new cumulative counts, which we will use to update the metrics.
-		// That makes the metrics slightly off in time, but accurate in aggregate.
-		return
-	}
-	// do not update counters on the first batch, because it may cause a huge spike in totals
-	// if the client has been running for a while already, but the agent just started.
-	if s.batchSeqNo > 0 {
-		cMetrics.BatchesSent.Inc(batchSeqNo - s.batchSeqNo)
-		if stats != nil {
-			cMetrics.FailedToEmitSpans.Inc(stats.FailedToEmitSpans - s.failedToEmitSpans)
-			cMetrics.TooLargeDroppedSpans.Inc(stats.TooLargeDroppedSpans - s.tooLargeDroppedSpans)
-			cMetrics.FullQueueDroppedSpans.Inc(stats.FullQueueDroppedSpans - s.fullQueueDroppedSpans)
-		}
-	}
-
-	s.lastUpdated = time.Now()
-	s.batchSeqNo = batchSeqNo
-	if stats != nil {
-		s.failedToEmitSpans = stats.FailedToEmitSpans
-		s.tooLargeDroppedSpans = stats.TooLargeDroppedSpans
-		s.fullQueueDroppedSpans = stats.FullQueueDroppedSpans
-	}
-}
-
-func clientUUID(batch *jaeger.Batch) string {
-	if batch.Process == nil {
-		return ""
-	}
-	for _, tag := range batch.Process.Tags {
-		if tag.Key != "client-uuid" {
-			continue
-		}
-		if tag.VStr == nil {
-			return ""
-		}
-		return *tag.VStr
-	}
-	return ""
-}
diff --git a/cmd/agent/app/reporter/connect_metrics.go b/cmd/agent/app/reporter/connect_metrics.go
deleted file mode 100644
index d0f6f577..00000000
--- a/cmd/agent/app/reporter/connect_metrics.go
+++ /dev/null
@@ -1,60 +0,0 @@
-// Copyright (c) 2020 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package reporter
-
-import (
-	"expvar"
-	"sync"
-
-	"github.com/jaegertracing/jaeger/pkg/metrics"
-)
-
-type connectMetrics struct {
-	// used for reflect current connection stability
-	Reconnects metrics.Counter `metric:"collector_reconnects" help:"Number of successful connections (including reconnects) to the collector."`
-
-	// Connection status that jaeger-agent to jaeger-collector, 1 is connected, 0 is disconnected
-	Status metrics.Gauge `metric:"collector_connected" help:"Status of connection between the agent and the collector; 1 is connected, 0 is disconnected"`
-}
-
-// ConnectMetrics include connectMetrics necessary params if want to modify metrics of connectMetrics, must via ConnectMetrics API
-type ConnectMetrics struct {
-	metrics connectMetrics
-	target  *expvar.String
-}
-
-var (
-	gRPCTarget     *expvar.String
-	gRPCTargetOnce sync.Once
-)
-
-// NewConnectMetrics will be initialize ConnectMetrics
-func NewConnectMetrics(mf metrics.Factory) *ConnectMetrics {
-	cm := &ConnectMetrics{}
-	metrics.MustInit(&cm.metrics, mf.Namespace(metrics.NSOptions{Name: "connection_status"}), nil)
-
-	// expvar.String is not thread-safe, so we need to initialize it only once
-	gRPCTargetOnce.Do(func() {
-		gRPCTarget = expvar.NewString("gRPCTarget")
-	})
-	cm.target = gRPCTarget
-	return cm
-}
-
-// OnConnectionStatusChange used for pass the status parameter when connection is changed
-// 0 is disconnected, 1 is connected
-// For quick view status via use `sum(jaeger_agent_connection_status_collector_connected{}) by (instance) > bool 0`
-func (cm *ConnectMetrics) OnConnectionStatusChange(connected bool) {
-	if connected {
-		cm.metrics.Status.Update(1)
-		cm.metrics.Reconnects.Inc(1)
-	} else {
-		cm.metrics.Status.Update(0)
-	}
-}
-
-// RecordTarget writes the current connection target to an expvar field.
-func (cm *ConnectMetrics) RecordTarget(target string) {
-	cm.target.Set(target)
-}
diff --git a/cmd/agent/app/reporter/flags.go b/cmd/agent/app/reporter/flags.go
deleted file mode 100644
index 5dca6444..00000000
--- a/cmd/agent/app/reporter/flags.go
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2018 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package reporter
-
-import (
-	"flag"
-
-	"github.com/spf13/viper"
-	"go.uber.org/zap"
-
-	"github.com/jaegertracing/jaeger/cmd/all-in-one/setupcontext"
-	"github.com/jaegertracing/jaeger/cmd/internal/flags"
-)
-
-const (
-	// Reporter type
-	reporterType = "reporter.type"
-	// GRPC is name of gRPC reporter.
-	GRPC Type = "grpc"
-
-	agentTags = "agent.tags"
-)
-
-// Type defines type of reporter.
-type Type string
-
-// Options holds generic reporter configuration.
-type Options struct {
-	ReporterType Type
-	AgentTags    map[string]string
-}
-
-// AddFlags adds flags for Options.
-func AddFlags(flagSet *flag.FlagSet) {
-	flagSet.String(reporterType, string(GRPC), "Reporter type to use e.g. "+string(GRPC))
-	if !setupcontext.IsAllInOne() {
-		flagSet.String(agentTags, "", "One or more tags to be added to the Process tags of all spans passing through this agent. Ex: key1=value1,key2=${envVar:defaultValue}")
-	}
-}
-
-// InitFromViper initializes Options with properties retrieved from Viper.
-func (b *Options) InitFromViper(v *viper.Viper, _ *zap.Logger) *Options {
-	b.ReporterType = Type(v.GetString(reporterType))
-	if !setupcontext.IsAllInOne() {
-		if len(v.GetString(agentTags)) > 0 {
-			b.AgentTags = flags.ParseJaegerTags(v.GetString(agentTags))
-		}
-	}
-	return b
-}
diff --git a/cmd/agent/app/reporter/grpc/builder.go b/cmd/agent/app/reporter/grpc/builder.go
deleted file mode 100644
index 939b8215..00000000
--- a/cmd/agent/app/reporter/grpc/builder.go
+++ /dev/null
@@ -1,124 +0,0 @@
-// Copyright (c) 2018-2019 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package grpc
-
-import (
-	"context"
-	"errors"
-	"fmt"
-	"strings"
-
-	"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/retry"
-	"go.opentelemetry.io/collector/config/configtls"
-	"go.uber.org/zap"
-	"google.golang.org/grpc"
-	"google.golang.org/grpc/connectivity"
-	"google.golang.org/grpc/credentials"
-	"google.golang.org/grpc/credentials/insecure"
-	"google.golang.org/grpc/resolver"
-	"google.golang.org/grpc/resolver/manual"
-
-	"github.com/jaegertracing/jaeger/cmd/agent/app/reporter"
-	"github.com/jaegertracing/jaeger/pkg/discovery"
-	"github.com/jaegertracing/jaeger/pkg/discovery/grpcresolver"
-	"github.com/jaegertracing/jaeger/pkg/metrics"
-	"github.com/jaegertracing/jaeger/pkg/netutils"
-)
-
-// ConnBuilder Struct to hold configurations
-type ConnBuilder struct {
-	// CollectorHostPorts is list of host:port Jaeger Collectors.
-	CollectorHostPorts []string `yaml:"collectorHostPorts"`
-	TLS                *configtls.ClientConfig
-	MaxRetry           uint
-	DiscoveryMinPeers  int
-	Notifier           discovery.Notifier
-	Discoverer         discovery.Discoverer
-
-	AdditionalDialOptions []grpc.DialOption
-}
-
-// NewConnBuilder creates a new grpc connection builder.
-func NewConnBuilder() *ConnBuilder {
-	return &ConnBuilder{}
-}
-
-// CreateConnection creates the gRPC connection
-func (b *ConnBuilder) CreateConnection(ctx context.Context, logger *zap.Logger, mFactory metrics.Factory) (*grpc.ClientConn, error) {
-	var dialOptions []grpc.DialOption
-	var dialTarget string
-	if b.TLS != nil { // user requested a secure connection
-		logger.Info("Agent requested secure grpc connection to collector(s)")
-		tlsConf, err := b.TLS.LoadTLSConfig(ctx)
-		if err != nil {
-			return nil, fmt.Errorf("failed to load TLS config: %w", err)
-		}
-		creds := credentials.NewTLS(tlsConf)
-		dialOptions = append(dialOptions, grpc.WithTransportCredentials(creds))
-	} else { // insecure connection
-		logger.Info("Agent requested insecure grpc connection to collector(s)")
-		dialOptions = append(dialOptions, grpc.WithTransportCredentials(insecure.NewCredentials()))
-	}
-
-	if b.Notifier != nil && b.Discoverer != nil {
-		logger.Info("Using external discovery service with roundrobin load balancer")
-		grpcResolver := grpcresolver.New(b.Notifier, b.Discoverer, logger, b.DiscoveryMinPeers)
-		dialTarget = grpcResolver.Scheme() + ":///round_robin"
-	} else {
-		if b.CollectorHostPorts == nil {
-			return nil, errors.New("at least one collector hostPort address is required when resolver is not available")
-		}
-		b.CollectorHostPorts = netutils.FixLocalhost(b.CollectorHostPorts)
-		if len(b.CollectorHostPorts) > 1 {
-			r := manual.NewBuilderWithScheme("jaeger-manual")
-			dialOptions = append(dialOptions, grpc.WithResolvers(r))
-			var resolvedAddrs []resolver.Address
-			for _, addr := range b.CollectorHostPorts {
-				resolvedAddrs = append(resolvedAddrs, resolver.Address{Addr: addr})
-			}
-			r.InitialState(resolver.State{Addresses: resolvedAddrs})
-			dialTarget = r.Scheme() + ":///round_robin"
-			logger.Info("Agent is connecting to a static list of collectors", zap.String("dialTarget", dialTarget), zap.String("collector hosts", strings.Join(b.CollectorHostPorts, ",")))
-		} else {
-			dialTarget = b.CollectorHostPorts[0]
-		}
-	}
-	dialOptions = append(dialOptions, grpc.WithDefaultServiceConfig(grpcresolver.GRPCServiceConfig))
-	dialOptions = append(dialOptions, grpc.WithUnaryInterceptor(retry.UnaryClientInterceptor(retry.WithMax(b.MaxRetry))))
-	dialOptions = append(dialOptions, b.AdditionalDialOptions...)
-
-	conn, err := grpc.NewClient(dialTarget, dialOptions...)
-	if err != nil {
-		return nil, err
-	}
-
-	connectMetrics := reporter.NewConnectMetrics(
-		mFactory.Namespace(metrics.NSOptions{Tags: map[string]string{"protocol": "grpc"}}),
-	)
-
-	go func(cc *grpc.ClientConn, cm *reporter.ConnectMetrics) {
-		logger.Info("Checking connection to collector")
-
-		for {
-			select {
-			case <-ctx.Done():
-				logger.Info("Stopping connection")
-				return
-			default:
-				s := cc.GetState()
-				if s == connectivity.Ready {
-					cm.OnConnectionStatusChange(true)
-					cm.RecordTarget(cc.Target())
-				} else {
-					cm.OnConnectionStatusChange(false)
-				}
-
-				logger.Info("Agent collector connection state change", zap.String("dialTarget", dialTarget), zap.Stringer("status", s))
-				cc.WaitForStateChange(ctx, s)
-			}
-		}
-	}(conn, connectMetrics)
-
-	return conn, nil
-}
diff --git a/cmd/agent/app/reporter/grpc/collector_proxy.go b/cmd/agent/app/reporter/grpc/collector_proxy.go
deleted file mode 100644
index bb7b3ff6..00000000
--- a/cmd/agent/app/reporter/grpc/collector_proxy.go
+++ /dev/null
@@ -1,68 +0,0 @@
-// Copyright (c) 2018 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package grpc
-
-import (
-	"context"
-	"errors"
-
-	"go.uber.org/zap"
-	"google.golang.org/grpc"
-
-	"github.com/jaegertracing/jaeger/cmd/agent/app/configmanager"
-	grpcManager "github.com/jaegertracing/jaeger/cmd/agent/app/configmanager/grpc"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/reporter"
-	"github.com/jaegertracing/jaeger/pkg/metrics"
-)
-
-// ProxyBuilder holds objects communicating with collector
-type ProxyBuilder struct {
-	reporter *reporter.ClientMetricsReporter
-	manager  configmanager.ClientConfigManager
-	conn     *grpc.ClientConn
-}
-
-// NewCollectorProxy creates ProxyBuilder
-func NewCollectorProxy(ctx context.Context, builder *ConnBuilder, agentTags map[string]string, mFactory metrics.Factory, logger *zap.Logger) (*ProxyBuilder, error) {
-	conn, err := builder.CreateConnection(ctx, logger, mFactory)
-	if err != nil {
-		return nil, err
-	}
-	grpcMetrics := mFactory.Namespace(metrics.NSOptions{Name: "", Tags: map[string]string{"protocol": "grpc"}})
-	r1 := NewReporter(conn, agentTags, logger)
-	r2 := reporter.WrapWithMetrics(r1, grpcMetrics)
-	r3 := reporter.WrapWithClientMetrics(reporter.ClientMetricsReporterParams{
-		Reporter:       r2,
-		Logger:         logger,
-		MetricsFactory: mFactory,
-	})
-	return &ProxyBuilder{
-		conn:     conn,
-		reporter: r3,
-		manager:  configmanager.WrapWithMetrics(grpcManager.NewConfigManager(conn), grpcMetrics),
-	}, nil
-}
-
-// GetConn returns grpc conn
-func (b ProxyBuilder) GetConn() *grpc.ClientConn {
-	return b.conn
-}
-
-// GetReporter returns Reporter
-func (b ProxyBuilder) GetReporter() reporter.Reporter {
-	return b.reporter
-}
-
-// GetManager returns manager
-func (b ProxyBuilder) GetManager() configmanager.ClientConfigManager {
-	return b.manager
-}
-
-// Close closes connections used by proxy.
-func (b ProxyBuilder) Close() error {
-	return errors.Join(
-		b.reporter.Close(),
-		b.GetConn().Close(),
-	)
-}
diff --git a/cmd/agent/app/reporter/grpc/flags.go b/cmd/agent/app/reporter/grpc/flags.go
deleted file mode 100644
index a7eb79ac..00000000
--- a/cmd/agent/app/reporter/grpc/flags.go
+++ /dev/null
@@ -1,52 +0,0 @@
-// Copyright (c) 2018 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package grpc
-
-import (
-	"flag"
-	"fmt"
-	"strings"
-
-	"github.com/spf13/viper"
-
-	"github.com/jaegertracing/jaeger/pkg/config/tlscfg"
-)
-
-const (
-	gRPCPrefix        = "reporter.grpc"
-	collectorHostPort = gRPCPrefix + ".host-port"
-	retryFlag         = gRPCPrefix + ".retry.max"
-	defaultMaxRetry   = 3
-	discoveryMinPeers = gRPCPrefix + ".discovery.min-peers"
-)
-
-var tlsFlagsConfig = tlscfg.ClientFlagsConfig{
-	Prefix: gRPCPrefix,
-}
-
-// AddFlags adds flags for Options.
-func AddFlags(flags *flag.FlagSet) {
-	flags.Uint(retryFlag, defaultMaxRetry, "Sets the maximum number of retries for a call")
-	flags.Int(discoveryMinPeers, 3, "Max number of collectors to which the agent will try to connect at any given time")
-	flags.String(collectorHostPort, "", "Comma-separated string representing host:port of a static list of collectors to connect to directly")
-	tlsFlagsConfig.AddFlags(flags)
-}
-
-// InitFromViper initializes Options with properties retrieved from Viper.
-func (b *ConnBuilder) InitFromViper(v *viper.Viper) (*ConnBuilder, error) {
-	hostPorts := v.GetString(collectorHostPort)
-	if hostPorts != "" {
-		b.CollectorHostPorts = strings.Split(hostPorts, ",")
-	}
-	b.MaxRetry = v.GetUint(retryFlag)
-	tlsCfg, err := tlsFlagsConfig.InitFromViper(v)
-	if err != nil {
-		return b, fmt.Errorf("failed to process TLS options: %w", err)
-	}
-	if !tlsCfg.Insecure {
-		b.TLS = &tlsCfg
-	}
-	b.DiscoveryMinPeers = v.GetInt(discoveryMinPeers)
-	return b, nil
-}
diff --git a/cmd/agent/app/reporter/grpc/reporter.go b/cmd/agent/app/reporter/grpc/reporter.go
deleted file mode 100644
index 14446daa..00000000
--- a/cmd/agent/app/reporter/grpc/reporter.go
+++ /dev/null
@@ -1,101 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package grpc
-
-import (
-	"context"
-	"fmt"
-
-	"go.uber.org/zap"
-	"google.golang.org/grpc"
-	"google.golang.org/grpc/codes"
-	"google.golang.org/grpc/status"
-
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-	"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
-	thrift "github.com/jaegertracing/jaeger-idl/thrift-gen/jaeger"
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-	zipkin2 "github.com/jaegertracing/jaeger/cmd/collector/app/sanitizer/zipkin"
-	jConverter "github.com/jaegertracing/jaeger/model/converter/thrift/jaeger"
-	"github.com/jaegertracing/jaeger/model/converter/thrift/zipkin"
-)
-
-// Reporter reports data to collector over gRPC.
-type Reporter struct {
-	collector api_v2.CollectorServiceClient
-	agentTags []model.KeyValue
-	logger    *zap.Logger
-	sanitizer zipkin2.Sanitizer
-}
-
-// NewReporter creates gRPC reporter.
-func NewReporter(conn *grpc.ClientConn, agentTags map[string]string, logger *zap.Logger) *Reporter {
-	return &Reporter{
-		collector: api_v2.NewCollectorServiceClient(conn),
-		agentTags: makeModelKeyValue(agentTags),
-		logger:    logger,
-		sanitizer: zipkin2.NewChainedSanitizer(zipkin2.NewStandardSanitizers()...),
-	}
-}
-
-// EmitBatch implements EmitBatch() of Reporter
-func (r *Reporter) EmitBatch(ctx context.Context, b *thrift.Batch) error {
-	return r.send(ctx, jConverter.ToDomain(b.Spans, nil), jConverter.ToDomainProcess(b.Process))
-}
-
-// EmitZipkinBatch implements EmitZipkinBatch() of Reporter
-func (r *Reporter) EmitZipkinBatch(ctx context.Context, zSpans []*zipkincore.Span) error {
-	for i := range zSpans {
-		zSpans[i] = r.sanitizer.Sanitize(zSpans[i])
-	}
-	trace, err := zipkin.ToDomain(zSpans)
-	if err != nil {
-		return err
-	}
-	return r.send(ctx, trace.Spans, nil)
-}
-
-func (r *Reporter) send(ctx context.Context, spans []*model.Span, process *model.Process) error {
-	spans, process = addProcessTags(spans, process, r.agentTags)
-	batch := model.Batch{Spans: spans, Process: process}
-	req := &api_v2.PostSpansRequest{Batch: batch}
-	_, err := r.collector.PostSpans(ctx, req)
-	if err != nil {
-		stat, ok := status.FromError(err)
-		if ok && stat.Code() == codes.PermissionDenied && stat.Message() == "missing tenant header" {
-			r.logger.Debug("Could not report untenanted spans over gRPC", zap.Error(err))
-		} else {
-			r.logger.Error("Could not send spans over gRPC", zap.Error(err))
-		}
-		err = fmt.Errorf("failed to export spans: %w", err)
-	}
-	return err
-}
-
-// addProcessTags appends jaeger tags for the agent to every span it sends to the collector.
-func addProcessTags(spans []*model.Span, process *model.Process, agentTags []model.KeyValue) ([]*model.Span, *model.Process) {
-	if len(agentTags) == 0 {
-		return spans, process
-	}
-	if process != nil {
-		process.Tags = append(process.Tags, agentTags...)
-	}
-	for _, span := range spans {
-		if span.Process != nil {
-			span.Process.Tags = append(span.Process.Tags, agentTags...)
-		}
-	}
-	return spans, process
-}
-
-func makeModelKeyValue(agentTags map[string]string) []model.KeyValue {
-	tags := make([]model.KeyValue, 0, len(agentTags))
-	for k, v := range agentTags {
-		tag := model.String(k, v)
-		tags = append(tags, tag)
-	}
-
-	return tags
-}
diff --git a/cmd/agent/app/reporter/metrics.go b/cmd/agent/app/reporter/metrics.go
deleted file mode 100644
index 12145e78..00000000
--- a/cmd/agent/app/reporter/metrics.go
+++ /dev/null
@@ -1,87 +0,0 @@
-// Copyright (c) 2018 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package reporter
-
-import (
-	"context"
-
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/jaeger"
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-	"github.com/jaegertracing/jaeger/pkg/metrics"
-)
-
-const (
-	jaegerBatches = "jaeger"
-	zipkinBatches = "zipkin"
-)
-
-type batchMetrics struct {
-	// Number of successful batch submissions to collector
-	BatchesSubmitted metrics.Counter `metric:"batches.submitted"`
-
-	// Number of failed batch submissions to collector
-	BatchesFailures metrics.Counter `metric:"batches.failures"`
-
-	// Number of spans in a batch submitted to collector
-	BatchSize metrics.Gauge `metric:"batch_size"`
-
-	// Number of successful span submissions to collector
-	SpansSubmitted metrics.Counter `metric:"spans.submitted"`
-
-	// Number of failed span submissions to collector
-	SpansFailures metrics.Counter `metric:"spans.failures"`
-}
-
-// MetricsReporter is reporter with metrics integration.
-type MetricsReporter struct {
-	wrapped Reporter
-
-	// counters grouped by the type of data format (Jaeger or Zipkin).
-	metrics map[string]batchMetrics
-}
-
-// WrapWithMetrics wraps Reporter and creates metrics for its invocations.
-func WrapWithMetrics(reporter Reporter, mFactory metrics.Factory) *MetricsReporter {
-	batchesMetrics := map[string]batchMetrics{}
-	for _, s := range []string{zipkinBatches, jaegerBatches} {
-		bm := batchMetrics{}
-		metrics.MustInit(&bm,
-			mFactory.Namespace(metrics.NSOptions{
-				Name: "reporter",
-				Tags: map[string]string{"format": s},
-			}),
-			nil)
-		batchesMetrics[s] = bm
-	}
-	return &MetricsReporter{wrapped: reporter, metrics: batchesMetrics}
-}
-
-// EmitZipkinBatch emits batch to collector.
-func (r *MetricsReporter) EmitZipkinBatch(ctx context.Context, spans []*zipkincore.Span) error {
-	err := r.wrapped.EmitZipkinBatch(ctx, spans)
-	updateMetrics(r.metrics[zipkinBatches], int64(len(spans)), err)
-	return err
-}
-
-// EmitBatch emits batch to collector.
-func (r *MetricsReporter) EmitBatch(ctx context.Context, batch *jaeger.Batch) error {
-	size := int64(0)
-	if batch != nil {
-		size = int64(len(batch.GetSpans()))
-	}
-	err := r.wrapped.EmitBatch(ctx, batch)
-	updateMetrics(r.metrics[jaegerBatches], size, err)
-	return err
-}
-
-func updateMetrics(m batchMetrics, size int64, err error) {
-	if err != nil {
-		m.BatchesFailures.Inc(1)
-		m.SpansFailures.Inc(size)
-	} else {
-		m.BatchSize.Update(size)
-		m.BatchesSubmitted.Inc(1)
-		m.SpansSubmitted.Inc(size)
-	}
-}
diff --git a/cmd/agent/app/reporter/reporter.go b/cmd/agent/app/reporter/reporter.go
deleted file mode 100644
index 94b0fe88..00000000
--- a/cmd/agent/app/reporter/reporter.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package reporter
-
-import (
-	"context"
-	"errors"
-
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/jaeger"
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-)
-
-// Reporter handles spans received by Processor and forwards them to central
-// collectors.
-type Reporter interface {
-	EmitZipkinBatch(ctx context.Context, spans []*zipkincore.Span) (err error)
-	EmitBatch(ctx context.Context, batch *jaeger.Batch) (err error)
-}
-
-// MultiReporter provides serial span emission to one or more reporters.  If
-// more than one expensive reporter are needed, one or more of them should be
-// wrapped and hidden behind a channel.
-type MultiReporter []Reporter
-
-// NewMultiReporter creates a MultiReporter from the variadic list of passed
-// Reporters.
-func NewMultiReporter(reps ...Reporter) MultiReporter {
-	return reps
-}
-
-// EmitZipkinBatch calls each EmitZipkinBatch, returning the first error.
-func (mr MultiReporter) EmitZipkinBatch(ctx context.Context, spans []*zipkincore.Span) error {
-	var errs []error
-	for _, rep := range mr {
-		if err := rep.EmitZipkinBatch(ctx, spans); err != nil {
-			errs = append(errs, err)
-		}
-	}
-	return errors.Join(errs...)
-}
-
-// EmitBatch calls each EmitBatch, returning the first error.
-func (mr MultiReporter) EmitBatch(ctx context.Context, batch *jaeger.Batch) error {
-	var errs []error
-	for _, rep := range mr {
-		if err := rep.EmitBatch(ctx, batch); err != nil {
-			errs = append(errs, err)
-		}
-	}
-	return errors.Join(errs...)
-}
diff --git a/cmd/agent/app/servers/thriftudp/socket_buffer.go b/cmd/agent/app/servers/thriftudp/socket_buffer.go
deleted file mode 100644
index 7424686f..00000000
--- a/cmd/agent/app/servers/thriftudp/socket_buffer.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 2020 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-//go:build !windows
-
-package thriftudp
-
-import (
-	"fmt"
-	"net"
-	"syscall"
-)
-
-func setSocketBuffer(conn *net.UDPConn, bufferSize int) error {
-	rawConn, err := conn.SyscallConn()
-	if err != nil {
-		return fmt.Errorf("failed to get raw connection: %w", err)
-	}
-
-	var syscallErr error
-	controlErr := rawConn.Control(func(fd uintptr) {
-		syscallErr = syscall.SetsockoptInt(int(fd), syscall.SOL_SOCKET, syscall.SO_RCVBUF, bufferSize)
-	})
-	if controlErr != nil {
-		return fmt.Errorf("rawconn control failed: %w", controlErr)
-	}
-	if syscallErr != nil {
-		return fmt.Errorf("syscall failed: %w", syscallErr)
-	}
-
-	return nil
-}
diff --git a/cmd/agent/app/servers/thriftudp/socket_buffer_windows.go b/cmd/agent/app/servers/thriftudp/socket_buffer_windows.go
deleted file mode 100644
index b4ad3b06..00000000
--- a/cmd/agent/app/servers/thriftudp/socket_buffer_windows.go
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright (c) 2020 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package thriftudp
-
-import (
-	"net"
-)
-
-// Not supported on windows, so windows version just returns nil
-func setSocketBuffer(_ *net.UDPConn, _ int) error {
-	return nil
-}
diff --git a/cmd/agent/app/servers/thriftudp/transport.go b/cmd/agent/app/servers/thriftudp/transport.go
deleted file mode 100644
index 81db276f..00000000
--- a/cmd/agent/app/servers/thriftudp/transport.go
+++ /dev/null
@@ -1,154 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package thriftudp
-
-import (
-	"bytes"
-	"context"
-	"errors"
-	"net"
-	"sync/atomic"
-
-	"github.com/apache/thrift/lib/go/thrift"
-)
-
-// MaxLength of UDP packet
-const (
-	MaxLength = 65000
-)
-
-var errConnAlreadyClosed = errors.New("connection already closed")
-
-// TUDPTransport does UDP as a thrift.TTransport
-type TUDPTransport struct {
-	conn     *net.UDPConn
-	addr     net.Addr
-	writeBuf bytes.Buffer
-	closed   uint32 // atomic flag
-}
-
-var _ thrift.TTransport = (*TUDPTransport)(nil)
-
-// NewTUDPClientTransport creates a net.UDPConn-backed TTransport for Thrift clients
-// All writes are buffered and flushed in one UDP packet. If locHostPort is not "", it
-// will be used as the local address for the connection
-// Example:
-//
-//	trans, err := thriftudp.NewTUDPClientTransport("192.168.1.1:9090", "")
-func NewTUDPClientTransport(destHostPort string, locHostPort string) (*TUDPTransport, error) {
-	destAddr, err := net.ResolveUDPAddr("udp", destHostPort)
-	if err != nil {
-		return nil, thrift.NewTTransportException(thrift.NOT_OPEN, err.Error())
-	}
-
-	var locAddr *net.UDPAddr
-	if locHostPort != "" {
-		locAddr, err = net.ResolveUDPAddr("udp", locHostPort)
-		if err != nil {
-			return nil, thrift.NewTTransportException(thrift.NOT_OPEN, err.Error())
-		}
-	}
-
-	return createClient(destAddr, locAddr)
-}
-
-func createClient(destAddr, locAddr *net.UDPAddr) (*TUDPTransport, error) {
-	conn, err := net.DialUDP(destAddr.Network(), locAddr, destAddr)
-	if err != nil {
-		return nil, thrift.NewTTransportException(thrift.NOT_OPEN, err.Error())
-	}
-	return &TUDPTransport{addr: destAddr, conn: conn}, nil
-}
-
-// NewTUDPServerTransport creates a net.UDPConn-backed TTransport for Thrift servers
-// It will listen for incoming udp packets on the specified host/port
-// Example:
-//
-//	trans, err := thriftudp.NewTUDPClientTransport("localhost:9001")
-func NewTUDPServerTransport(hostPort string) (*TUDPTransport, error) {
-	addr, err := net.ResolveUDPAddr("udp", hostPort)
-	if err != nil {
-		return nil, thrift.NewTTransportException(thrift.NOT_OPEN, err.Error())
-	}
-	conn, err := net.ListenUDP(addr.Network(), addr)
-	if err != nil {
-		return nil, thrift.NewTTransportException(thrift.NOT_OPEN, err.Error())
-	}
-
-	return &TUDPTransport{addr: conn.LocalAddr(), conn: conn}, nil
-}
-
-// Open does nothing as connection is opened on creation
-// Required to maintain thrift.TTransport interface
-func (*TUDPTransport) Open() error {
-	return nil
-}
-
-// Conn retrieves the underlying net.UDPConn
-func (p *TUDPTransport) Conn() *net.UDPConn {
-	return p.conn
-}
-
-// IsOpen returns true if the connection is open
-func (p *TUDPTransport) IsOpen() bool {
-	return atomic.LoadUint32(&p.closed) == 0
-}
-
-// Close closes the connection
-func (p *TUDPTransport) Close() error {
-	if atomic.CompareAndSwapUint32(&p.closed, 0, 1) {
-		return p.conn.Close()
-	}
-	return errConnAlreadyClosed
-}
-
-// Addr returns the address that the transport is listening on or writing to
-func (p *TUDPTransport) Addr() net.Addr {
-	return p.addr
-}
-
-// Read reads one UDP packet and puts it in the specified buf
-func (p *TUDPTransport) Read(buf []byte) (int, error) {
-	if !p.IsOpen() {
-		return 0, thrift.NewTTransportException(thrift.NOT_OPEN, "Connection not open")
-	}
-	n, err := p.conn.Read(buf)
-	return n, thrift.NewTTransportExceptionFromError(err)
-}
-
-// RemainingBytes returns the max number of bytes (same as Thrift's StreamTransport) as we
-// do not know how many bytes we have left.
-func (*TUDPTransport) RemainingBytes() uint64 {
-	const maxSize = ^uint64(0)
-	return maxSize
-}
-
-// Write writes specified buf to the write buffer
-func (p *TUDPTransport) Write(buf []byte) (int, error) {
-	if !p.IsOpen() {
-		return 0, thrift.NewTTransportException(thrift.NOT_OPEN, "Connection not open")
-	}
-	if len(p.writeBuf.Bytes())+len(buf) > MaxLength {
-		return 0, thrift.NewTTransportException(thrift.INVALID_DATA, "Data does not fit within one UDP packet")
-	}
-	n, err := p.writeBuf.Write(buf)
-	return n, thrift.NewTTransportExceptionFromError(err)
-}
-
-// Flush flushes the write buffer as one udp packet
-func (p *TUDPTransport) Flush(_ context.Context) error {
-	if !p.IsOpen() {
-		return thrift.NewTTransportException(thrift.NOT_OPEN, "Connection not open")
-	}
-
-	_, err := p.conn.Write(p.writeBuf.Bytes())
-	p.writeBuf.Reset() // always reset the buffer, even in case of an error
-	return err
-}
-
-// SetSocketBufferSize sets udp buffer size
-func (p *TUDPTransport) SetSocketBufferSize(bufferSize int) error {
-	return setSocketBuffer(p.Conn(), bufferSize)
-}
diff --git a/cmd/agent/app/servers/udpserver.go b/cmd/agent/app/servers/udpserver.go
deleted file mode 100644
index f8fa61e6..00000000
--- a/cmd/agent/app/servers/udpserver.go
+++ /dev/null
@@ -1,183 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package servers
-
-import (
-	"bytes"
-	"io"
-	"sync"
-	"sync/atomic"
-
-	"github.com/jaegertracing/jaeger/pkg/metrics"
-)
-
-// TBufferedServer is an alias for UDPServer, for backwards compatibility.
-type TBufferedServer = UDPServer
-
-// NewTBufferedServer is an alias for NewUDPServer, for backwards compatibility.
-var NewTBufferedServer = NewUDPServer
-
-// UDPConn is a an abstraction of *net.UDPConn, for easier mocking.
-type UDPConn interface {
-	io.Reader
-	io.Closer
-}
-
-// UDPServer reads packets from a UDP connection into bytes.Buffer and places
-// each buffer into a bounded channel to be consumed by the receiver.
-// After consuming the buffer, the receiver SHOULD call DataRecd() to signal
-// that the buffer is no longer in use and to return it to the pool.
-type UDPServer struct {
-	// NB. queueLength HAS to be at the top of the struct or it will SIGSEV for certain architectures.
-	// See https://github.com/golang/go/issues/13868
-	queueSize     int64
-	dataChan      chan *bytes.Buffer
-	maxPacketSize int
-	maxQueueSize  int
-	serving       uint32
-	transport     UDPConn
-	readBufPool   sync.Pool
-	metrics       struct {
-		// Size of the current server queue
-		QueueSize metrics.Gauge `metric:"thrift.udp.server.queue_size"`
-
-		// Size (in bytes) of packets received by server
-		PacketSize metrics.Gauge `metric:"thrift.udp.server.packet_size"`
-
-		// Number of packets dropped by server
-		PacketsDropped metrics.Counter `metric:"thrift.udp.server.packets.dropped"`
-
-		// Number of packets processed by server
-		PacketsProcessed metrics.Counter `metric:"thrift.udp.server.packets.processed"`
-
-		// Number of malformed packets the server received
-		ReadError metrics.Counter `metric:"thrift.udp.server.read.errors"`
-	}
-}
-
-// state values for TBufferedServer.serving
-//
-// init -> serving -> stopped
-// init -> stopped (might happen in unit tests)
-const (
-	stateStopped = iota
-	stateServing
-	stateInit
-)
-
-// NewUDPServer creates a UDPServer
-func NewUDPServer(
-	transport UDPConn,
-	maxQueueSize int,
-	maxPacketSize int,
-	mFactory metrics.Factory,
-) (*UDPServer, error) {
-	srv := &UDPServer{
-		dataChan:      make(chan *bytes.Buffer, maxQueueSize),
-		transport:     transport,
-		maxQueueSize:  maxQueueSize,
-		maxPacketSize: maxPacketSize,
-		serving:       stateInit,
-		readBufPool: sync.Pool{
-			New: func() any {
-				return new(bytes.Buffer)
-			},
-		},
-	}
-
-	metrics.MustInit(&srv.metrics, mFactory, nil)
-	return srv, nil
-}
-
-// packetReader is a helper for reading a single packet no larger than maxPacketSize
-// from the underlying reader. Without it the ReadFrom() method of bytes.Buffer would
-// read multiple packets and won't even stop at maxPacketSize.
-type packetReader struct {
-	maxPacketSize int
-	reader        io.LimitedReader
-	attempt       int
-}
-
-func (r *packetReader) Read(p []byte) (int, error) {
-	if r.attempt > 0 {
-		return 0, io.EOF
-	}
-	r.attempt = 1
-	return r.reader.Read(p)
-}
-
-func (r *packetReader) readPacket(buf *bytes.Buffer) (int, error) {
-	// reset the readers since we're reusing them to avoid allocations
-	r.attempt = 0
-	r.reader.N = int64(r.maxPacketSize)
-	// prepare the buffer for expected packet size
-	buf.Grow(r.maxPacketSize)
-	buf.Reset()
-	// use Buffer's ReadFrom() as otherwise it's hard to get it into the right state
-	n, err := buf.ReadFrom(r)
-	return int(n), err
-}
-
-// Serve initiates the readers and starts serving traffic
-func (s *UDPServer) Serve() {
-	defer close(s.dataChan)
-	if !atomic.CompareAndSwapUint32(&s.serving, stateInit, stateServing) {
-		return // Stop already called
-	}
-
-	pr := &packetReader{
-		maxPacketSize: s.maxPacketSize,
-		reader: io.LimitedReader{
-			R: s.transport,
-		},
-	}
-
-	for s.IsServing() {
-		buf := s.readBufPool.Get().(*bytes.Buffer)
-		n, err := pr.readPacket(buf)
-		if err == nil {
-			s.metrics.PacketSize.Update(int64(n))
-			select {
-			case s.dataChan <- buf:
-				s.metrics.PacketsProcessed.Inc(1)
-				s.updateQueueSize(1)
-			default:
-				s.readBufPool.Put(buf)
-				s.metrics.PacketsDropped.Inc(1)
-			}
-		} else {
-			s.readBufPool.Put(buf)
-			s.metrics.ReadError.Inc(1)
-		}
-	}
-}
-
-func (s *UDPServer) updateQueueSize(delta int64) {
-	atomic.AddInt64(&s.queueSize, delta)
-	s.metrics.QueueSize.Update(atomic.LoadInt64(&s.queueSize))
-}
-
-// IsServing indicates whether the server is currently serving traffic
-func (s *UDPServer) IsServing() bool {
-	return atomic.LoadUint32(&s.serving) == stateServing
-}
-
-// Stop stops the serving of traffic and waits until the queue is
-// emptied by the readers
-func (s *UDPServer) Stop() {
-	atomic.StoreUint32(&s.serving, stateStopped)
-	_ = s.transport.Close()
-}
-
-// DataChan returns the data chan of the buffered server
-func (s *UDPServer) DataChan() chan *bytes.Buffer {
-	return s.dataChan
-}
-
-// DataRecd is called by the consumers every time they read a data item from DataChan
-func (s *UDPServer) DataRecd(buf *bytes.Buffer) {
-	s.updateQueueSize(-1)
-	s.readBufPool.Put(buf)
-}
diff --git a/cmd/agent/main.go b/cmd/agent/main.go
deleted file mode 100644
index 74b674a1..00000000
--- a/cmd/agent/main.go
+++ /dev/null
@@ -1,109 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package main
-
-import (
-	"context"
-	"fmt"
-	"os"
-
-	"github.com/spf13/cobra"
-	"github.com/spf13/viper"
-	_ "go.uber.org/automaxprocs"
-	"go.uber.org/zap"
-
-	"github.com/jaegertracing/jaeger/cmd/agent/app"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/reporter"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/reporter/grpc"
-	"github.com/jaegertracing/jaeger/cmd/internal/docs"
-	"github.com/jaegertracing/jaeger/cmd/internal/flags"
-	"github.com/jaegertracing/jaeger/cmd/internal/status"
-	"github.com/jaegertracing/jaeger/pkg/config"
-	"github.com/jaegertracing/jaeger/pkg/metrics"
-	"github.com/jaegertracing/jaeger/pkg/version"
-)
-
-func main() {
-	println("***************************************************************************************************")
-	println("*** WARNING jaeger-agent is deprecated. See https://github.com/jaegertracing/jaeger/issues/4739 ***")
-	println("***************************************************************************************************")
-
-	svc := flags.NewService(app.AgentAdminHTTP)
-	svc.NoStorage = true
-
-	v := viper.New()
-	command := &cobra.Command{
-		Use:   "jaeger-agent",
-		Short: "(deprecated) Jaeger agent is a local daemon program which collects tracing data.",
-		Long:  `(deprecated) Jaeger agent is a daemon program that runs on every host and receives tracing data submitted by Jaeger client libraries.`,
-		RunE: func(_ *cobra.Command, _ /* args */ []string) error {
-			if err := svc.Start(v); err != nil {
-				return err
-			}
-			logger := svc.Logger // shortcut
-
-			mFactory := svc.MetricsFactory.
-				Namespace(metrics.NSOptions{Name: "jaeger"}).
-				Namespace(metrics.NSOptions{Name: "agent"})
-			version.NewInfoMetrics(mFactory)
-
-			rOpts := new(reporter.Options).InitFromViper(v, logger)
-			grpcBuilder, err := grpc.NewConnBuilder().InitFromViper(v)
-			if err != nil {
-				logger.Fatal("Failed to configure gRPC connection", zap.Error(err))
-			}
-			builders := map[reporter.Type]app.CollectorProxyBuilder{
-				reporter.GRPC: app.GRPCCollectorProxyBuilder(grpcBuilder),
-			}
-			ctx, cancel := context.WithCancel(context.Background())
-			defer cancel()
-			cp, err := app.CreateCollectorProxy(ctx, app.ProxyBuilderOptions{
-				Options: *rOpts,
-				Logger:  logger,
-				Metrics: mFactory,
-			}, builders)
-			if err != nil {
-				logger.Fatal("Failed to create collector proxy", zap.Error(err))
-			}
-
-			// TODO illustrate discovery service wiring
-
-			builder := new(app.Builder).InitFromViper(v)
-			agent, err := builder.CreateAgent(cp, logger, mFactory)
-			if err != nil {
-				return fmt.Errorf("failed to initialize Jaeger Agent: %w", err)
-			}
-
-			logger.Info("Starting agent")
-			if err := agent.Run(); err != nil {
-				return fmt.Errorf("failed to run the agent: %w", err)
-			}
-
-			svc.RunAndThen(func() {
-				agent.Stop()
-				cp.Close()
-			})
-			return nil
-		},
-	}
-
-	command.AddCommand(version.Command())
-	command.AddCommand(docs.Command(v))
-	command.AddCommand(status.Command(v, app.AgentAdminHTTP))
-
-	config.AddFlags(
-		v,
-		command,
-		svc.AddFlags,
-		app.AddFlags,
-		reporter.AddFlags,
-		grpc.AddFlags,
-	)
-
-	if err := command.Execute(); err != nil {
-		fmt.Println(err.Error())
-		os.Exit(1)
-	}
-}
diff --git a/cmd/all-in-one/main.go b/cmd/all-in-one/main.go
index 2f1d623b..b9c9f96b 100644
--- a/cmd/all-in-one/main.go
+++ b/cmd/all-in-one/main.go
@@ -29,17 +29,17 @@ import (
 	queryApp "github.com/jaegertracing/jaeger/cmd/query/app"
 	"github.com/jaegertracing/jaeger/cmd/query/app/querysvc"
 	v2querysvc "github.com/jaegertracing/jaeger/cmd/query/app/querysvc/v2/querysvc"
+	"github.com/jaegertracing/jaeger/internal/config"
 	ss "github.com/jaegertracing/jaeger/internal/sampling/samplingstrategy/metafactory"
 	"github.com/jaegertracing/jaeger/internal/storage/metricstore"
 	storage "github.com/jaegertracing/jaeger/internal/storage/v1/factory"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/api/depstore"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/api/tracestore"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/v1adapter"
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/jtracer"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/version"
 	"github.com/jaegertracing/jaeger/ports"
 )
diff --git a/cmd/collector/app/collector.go b/cmd/collector/app/collector.go
index 27b378aa..78deeea4 100644
--- a/cmd/collector/app/collector.go
+++ b/cmd/collector/app/collector.go
@@ -18,12 +18,12 @@ import (
 	"github.com/jaegertracing/jaeger/cmd/collector/app/handler"
 	"github.com/jaegertracing/jaeger/cmd/collector/app/processor"
 	"github.com/jaegertracing/jaeger/cmd/collector/app/server"
+	"github.com/jaegertracing/jaeger/internal/healthcheck"
 	"github.com/jaegertracing/jaeger/internal/safeexpvar"
 	"github.com/jaegertracing/jaeger/internal/sampling/samplingstrategy"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/api/tracestore"
-	"github.com/jaegertracing/jaeger/pkg/healthcheck"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 )
 
 const (
diff --git a/cmd/collector/app/flags/flags.go b/cmd/collector/app/flags/flags.go
index 30af64b7..85ad873e 100644
--- a/cmd/collector/app/flags/flags.go
+++ b/cmd/collector/app/flags/flags.go
@@ -15,9 +15,9 @@ import (
 	"go.uber.org/zap"
 
 	"github.com/jaegertracing/jaeger/cmd/internal/flags"
-	"github.com/jaegertracing/jaeger/pkg/config/corscfg"
-	"github.com/jaegertracing/jaeger/pkg/config/tlscfg"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
+	"github.com/jaegertracing/jaeger/internal/config/corscfg"
+	"github.com/jaegertracing/jaeger/internal/config/tlscfg"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/ports"
 )
 
diff --git a/cmd/collector/app/handler/grpc_handler.go b/cmd/collector/app/handler/grpc_handler.go
index bbca9cbf..c1013521 100644
--- a/cmd/collector/app/handler/grpc_handler.go
+++ b/cmd/collector/app/handler/grpc_handler.go
@@ -15,7 +15,7 @@ import (
 	"github.com/jaegertracing/jaeger-idl/model/v1"
 	"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
 	"github.com/jaegertracing/jaeger/cmd/collector/app/processor"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 )
 
 // GRPCHandler implements gRPC CollectorService.
diff --git a/cmd/collector/app/handler/otlp_receiver.go b/cmd/collector/app/handler/otlp_receiver.go
index 87237385..1e027beb 100644
--- a/cmd/collector/app/handler/otlp_receiver.go
+++ b/cmd/collector/app/handler/otlp_receiver.go
@@ -21,7 +21,7 @@ import (
 
 	"github.com/jaegertracing/jaeger/cmd/collector/app/flags"
 	"github.com/jaegertracing/jaeger/cmd/collector/app/processor"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 )
 
 var (
diff --git a/cmd/collector/app/handler/thrift_span_handler.go b/cmd/collector/app/handler/thrift_span_handler.go
index 76b40fc5..978a0a5b 100644
--- a/cmd/collector/app/handler/thrift_span_handler.go
+++ b/cmd/collector/app/handler/thrift_span_handler.go
@@ -7,6 +7,7 @@ package handler
 import (
 	"context"
 
+	zipkin "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin/zipkinthriftconverter"
 	"go.uber.org/zap"
 
 	"github.com/jaegertracing/jaeger-idl/model/v1"
@@ -15,7 +16,6 @@ import (
 	"github.com/jaegertracing/jaeger/cmd/collector/app/processor"
 	zipkinS "github.com/jaegertracing/jaeger/cmd/collector/app/sanitizer/zipkin"
 	jConv "github.com/jaegertracing/jaeger/model/converter/thrift/jaeger"
-	"github.com/jaegertracing/jaeger/model/converter/thrift/zipkin"
 )
 
 // SubmitBatchOptions are passed to Submit methods of the handlers.
diff --git a/cmd/collector/app/handler/zipkin_receiver.go b/cmd/collector/app/handler/zipkin_receiver.go
index 6f47311b..c18dc9fc 100644
--- a/cmd/collector/app/handler/zipkin_receiver.go
+++ b/cmd/collector/app/handler/zipkin_receiver.go
@@ -17,7 +17,7 @@ import (
 
 	"github.com/jaegertracing/jaeger/cmd/collector/app/flags"
 	"github.com/jaegertracing/jaeger/cmd/collector/app/processor"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 )
 
 var (
diff --git a/cmd/collector/app/metrics.go b/cmd/collector/app/metrics.go
index a1cd6058..24da3be9 100644
--- a/cmd/collector/app/metrics.go
+++ b/cmd/collector/app/metrics.go
@@ -14,7 +14,6 @@ import (
 	"github.com/jaegertracing/jaeger-idl/model/v1"
 	"github.com/jaegertracing/jaeger/cmd/collector/app/processor"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
-	"github.com/jaegertracing/jaeger/pkg/normalizer"
 	"github.com/jaegertracing/jaeger/pkg/otelsemconv"
 )
 
@@ -281,7 +280,7 @@ func (m metricsBySvc) countTracesByServiceName(serviceName string, isDebug bool,
 // an alert should be raised to investigate what's causing so many unique
 // service names.
 func (m *traceCountsBySvc) countByServiceName(serviceName string, isDebug bool, samplerType model.SamplerType) {
-	serviceName = normalizer.ServiceName(serviceName)
+	serviceName = normalizeServiceName(serviceName)
 	counts := m.counts
 	if isDebug {
 		counts = m.debugCounts
@@ -312,6 +311,7 @@ func (m *traceCountsBySvc) countByServiceName(serviceName string, isDebug bool,
 		}
 		counter = counts[otherServicesSampler]
 	}
+
 	m.lock.Unlock()
 	counter.Inc(1)
 }
@@ -327,7 +327,7 @@ func (m *traceCountsBySvc) countByServiceName(serviceName string, isDebug bool,
 // an alert should be raised to investigate what's causing so many unique
 // service names.
 func (m *spanCountsBySvc) countByServiceName(serviceName string, isDebug bool) {
-	serviceName = normalizer.ServiceName(serviceName)
+	serviceName = normalizeServiceName(serviceName)
 	counts := m.counts
 	if isDebug {
 		counts = m.debugCounts
diff --git a/pkg/normalizer/service_name.go b/cmd/collector/app/normalize.go
similarity index 88%
rename from pkg/normalizer/service_name.go
rename to cmd/collector/app/normalize.go
index 8c246148..ac9a3fcb 100644
--- a/pkg/normalizer/service_name.go
+++ b/cmd/collector/app/normalize.go
@@ -2,14 +2,14 @@
 // Copyright (c) 2017 Uber Technologies, Inc.
 // SPDX-License-Identifier: Apache-2.0
 
-package normalizer
+package app
 
 import (
 	"strings"
 )
 
-// ServiceName converts service name to a lowercase string that is safe to use in metrics
-func ServiceName(serviceName string) string {
+// normalizeServiceName converts service name to a string that is safe to use in metrics
+func normalizeServiceName(serviceName string) string {
 	return serviceNameReplacer.Replace(serviceName)
 }
 
diff --git a/cmd/collector/app/server/http.go b/cmd/collector/app/server/http.go
index ed9ca155..936e2b92 100644
--- a/cmd/collector/app/server/http.go
+++ b/cmd/collector/app/server/http.go
@@ -13,12 +13,12 @@ import (
 	"go.uber.org/zap"
 
 	"github.com/jaegertracing/jaeger/cmd/collector/app/handler"
+	"github.com/jaegertracing/jaeger/internal/healthcheck"
+	"github.com/jaegertracing/jaeger/internal/recoveryhandler"
 	samplinghttp "github.com/jaegertracing/jaeger/internal/sampling/http"
 	"github.com/jaegertracing/jaeger/internal/sampling/samplingstrategy"
-	"github.com/jaegertracing/jaeger/pkg/healthcheck"
 	"github.com/jaegertracing/jaeger/pkg/httpmetrics"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
-	"github.com/jaegertracing/jaeger/pkg/recoveryhandler"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
 )
 
diff --git a/cmd/collector/app/span_handler_builder.go b/cmd/collector/app/span_handler_builder.go
index 6df5edb1..344d3932 100644
--- a/cmd/collector/app/span_handler_builder.go
+++ b/cmd/collector/app/span_handler_builder.go
@@ -15,8 +15,8 @@ import (
 	"github.com/jaegertracing/jaeger/cmd/collector/app/processor"
 	zs "github.com/jaegertracing/jaeger/cmd/collector/app/sanitizer/zipkin"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/api/tracestore"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 )
 
 // SpanHandlerBuilder holds configuration required for handlers
diff --git a/cmd/collector/app/span_processor.go b/cmd/collector/app/span_processor.go
index 3cfe529a..5a27a206 100644
--- a/cmd/collector/app/span_processor.go
+++ b/cmd/collector/app/span_processor.go
@@ -23,9 +23,9 @@ import (
 	"github.com/jaegertracing/jaeger/internal/jptrace"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/api/tracestore"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/v1adapter"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/queue"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 )
 
 const (
diff --git a/cmd/collector/main.go b/cmd/collector/main.go
index 55bde0ef..a329db08 100644
--- a/cmd/collector/main.go
+++ b/cmd/collector/main.go
@@ -23,13 +23,13 @@ import (
 	cmdFlags "github.com/jaegertracing/jaeger/cmd/internal/flags"
 	"github.com/jaegertracing/jaeger/cmd/internal/printconfig"
 	"github.com/jaegertracing/jaeger/cmd/internal/status"
+	"github.com/jaegertracing/jaeger/internal/config"
 	ss "github.com/jaegertracing/jaeger/internal/sampling/samplingstrategy/metafactory"
 	storage "github.com/jaegertracing/jaeger/internal/storage/v1/factory"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/v1adapter"
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/version"
 	"github.com/jaegertracing/jaeger/ports"
 )
diff --git a/cmd/es-index-cleaner/app/flags.go b/cmd/es-index-cleaner/app/flags.go
index 5bfc9053..23faa7c4 100644
--- a/cmd/es-index-cleaner/app/flags.go
+++ b/cmd/es-index-cleaner/app/flags.go
@@ -10,7 +10,7 @@ import (
 	"go.opentelemetry.io/collector/config/configtls"
 	"go.opentelemetry.io/collector/featuregate"
 
-	"github.com/jaegertracing/jaeger/pkg/config/tlscfg"
+	"github.com/jaegertracing/jaeger/internal/config/tlscfg"
 )
 
 const (
diff --git a/cmd/es-index-cleaner/main.go b/cmd/es-index-cleaner/main.go
index c1ad99bb..3fad57eb 100644
--- a/cmd/es-index-cleaner/main.go
+++ b/cmd/es-index-cleaner/main.go
@@ -20,7 +20,7 @@ import (
 	"go.uber.org/zap"
 
 	"github.com/jaegertracing/jaeger/cmd/es-index-cleaner/app"
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/pkg/es/client"
 )
 
diff --git a/cmd/es-rollover/app/flags.go b/cmd/es-rollover/app/flags.go
index d3c54080..7c0db6e3 100644
--- a/cmd/es-rollover/app/flags.go
+++ b/cmd/es-rollover/app/flags.go
@@ -9,7 +9,7 @@ import (
 	"github.com/spf13/viper"
 	"go.opentelemetry.io/collector/config/configtls"
 
-	"github.com/jaegertracing/jaeger/pkg/config/tlscfg"
+	"github.com/jaegertracing/jaeger/internal/config/tlscfg"
 )
 
 var tlsFlagsCfg = tlscfg.ClientFlagsConfig{Prefix: "es"}
diff --git a/cmd/es-rollover/main.go b/cmd/es-rollover/main.go
index 411d4596..42984a93 100644
--- a/cmd/es-rollover/main.go
+++ b/cmd/es-rollover/main.go
@@ -15,7 +15,7 @@ import (
 	initialize "github.com/jaegertracing/jaeger/cmd/es-rollover/app/init"
 	"github.com/jaegertracing/jaeger/cmd/es-rollover/app/lookback"
 	"github.com/jaegertracing/jaeger/cmd/es-rollover/app/rollover"
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/pkg/es/client"
 )
 
diff --git a/cmd/ingester/main.go b/cmd/ingester/main.go
index 03411f14..be93c11c 100644
--- a/cmd/ingester/main.go
+++ b/cmd/ingester/main.go
@@ -22,8 +22,8 @@ import (
 	"github.com/jaegertracing/jaeger/cmd/internal/flags"
 	"github.com/jaegertracing/jaeger/cmd/internal/printconfig"
 	"github.com/jaegertracing/jaeger/cmd/internal/status"
+	"github.com/jaegertracing/jaeger/internal/config"
 	storage "github.com/jaegertracing/jaeger/internal/storage/v1/factory"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
 	"github.com/jaegertracing/jaeger/pkg/version"
diff --git a/cmd/internal/flags/admin.go b/cmd/internal/flags/admin.go
index 4522fdbb..f68be536 100644
--- a/cmd/internal/flags/admin.go
+++ b/cmd/internal/flags/admin.go
@@ -18,9 +18,9 @@ import (
 	"go.uber.org/zap"
 	"go.uber.org/zap/zapcore"
 
-	"github.com/jaegertracing/jaeger/pkg/config/tlscfg"
-	"github.com/jaegertracing/jaeger/pkg/healthcheck"
-	"github.com/jaegertracing/jaeger/pkg/recoveryhandler"
+	"github.com/jaegertracing/jaeger/internal/config/tlscfg"
+	"github.com/jaegertracing/jaeger/internal/healthcheck"
+	"github.com/jaegertracing/jaeger/internal/recoveryhandler"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
 	"github.com/jaegertracing/jaeger/pkg/version"
 )
diff --git a/cmd/internal/flags/service.go b/cmd/internal/flags/service.go
index c0041cc2..5ab79d85 100644
--- a/cmd/internal/flags/service.go
+++ b/cmd/internal/flags/service.go
@@ -17,8 +17,8 @@ import (
 	"go.uber.org/zap/zapgrpc"
 	"google.golang.org/grpc/grpclog"
 
+	"github.com/jaegertracing/jaeger/internal/healthcheck"
 	"github.com/jaegertracing/jaeger/internal/metrics/metricsbuilder"
-	"github.com/jaegertracing/jaeger/pkg/healthcheck"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 	"github.com/jaegertracing/jaeger/ports"
 )
diff --git a/cmd/jaeger/internal/extension/jaegerquery/server.go b/cmd/jaeger/internal/extension/jaegerquery/server.go
index e4068d45..270c985b 100644
--- a/cmd/jaeger/internal/extension/jaegerquery/server.go
+++ b/cmd/jaeger/internal/extension/jaegerquery/server.go
@@ -23,10 +23,10 @@ import (
 	"github.com/jaegertracing/jaeger/internal/storage/v2/api/depstore"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/api/tracestore"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/v1adapter"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/jtracer"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 )
 
 var (
diff --git a/cmd/jaeger/internal/extension/remotesampling/config.go b/cmd/jaeger/internal/extension/remotesampling/config.go
index 086f2396..3cfeb712 100644
--- a/cmd/jaeger/internal/extension/remotesampling/config.go
+++ b/cmd/jaeger/internal/extension/remotesampling/config.go
@@ -29,9 +29,9 @@ var (
 	_ xconfmap.Validator  = (*Config)(nil)
 	_ confmap.Unmarshaler = (*Config)(nil)
 
-	includeDefaultOpStrategies = featuregate.GlobalRegistry().MustRegister(
+	_ = featuregate.GlobalRegistry().MustRegister(
 		"jaeger.sampling.includeDefaultOpStrategies",
-		featuregate.StageBeta, // enabed by default
+		featuregate.StageStable, // can only be ON
 		featuregate.WithRegisterFromVersion("v2.2.0"),
 		featuregate.WithRegisterToVersion("v2.5.0"),
 		featuregate.WithRegisterDescription("Forces service strategy to be merged with default strategy, including per-operation overrides."),
diff --git a/cmd/jaeger/internal/extension/remotesampling/extension.go b/cmd/jaeger/internal/extension/remotesampling/extension.go
index 10bdd83d..e366e567 100644
--- a/cmd/jaeger/internal/extension/remotesampling/extension.go
+++ b/cmd/jaeger/internal/extension/remotesampling/extension.go
@@ -166,7 +166,6 @@ func (ext *rsExtension) startFileBasedStrategyProvider(_ context.Context) error
 	opts := file.Options{
 		StrategiesFile:             ext.cfg.File.Path,
 		ReloadInterval:             ext.cfg.File.ReloadInterval,
-		IncludeDefaultOpStrategies: includeDefaultOpStrategies.IsEnabled(),
 		DefaultSamplingProbability: ext.cfg.File.DefaultSamplingProbability,
 	}
 
diff --git a/cmd/jaeger/main.go b/cmd/jaeger/main.go
index 0c9e8bcd..7d440627 100644
--- a/cmd/jaeger/main.go
+++ b/cmd/jaeger/main.go
@@ -10,8 +10,8 @@ import (
 
 	"github.com/jaegertracing/jaeger/cmd/internal/docs"
 	"github.com/jaegertracing/jaeger/cmd/jaeger/internal"
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/elasticsearch/mappings"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/version"
 )
 
diff --git a/cmd/query/app/flags.go b/cmd/query/app/flags.go
index 90c826e0..8207810e 100644
--- a/cmd/query/app/flags.go
+++ b/cmd/query/app/flags.go
@@ -24,11 +24,11 @@ import (
 
 	"github.com/jaegertracing/jaeger/cmd/query/app/querysvc"
 	v2querysvc "github.com/jaegertracing/jaeger/cmd/query/app/querysvc/v2/querysvc"
+	"github.com/jaegertracing/jaeger/internal/config"
+	"github.com/jaegertracing/jaeger/internal/config/tlscfg"
 	storage "github.com/jaegertracing/jaeger/internal/storage/v1/factory"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/v1adapter"
-	"github.com/jaegertracing/jaeger/pkg/config"
-	"github.com/jaegertracing/jaeger/pkg/config/tlscfg"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/ports"
 )
 
diff --git a/cmd/query/app/server.go b/cmd/query/app/server.go
index ca9bbe55..4348e989 100644
--- a/cmd/query/app/server.go
+++ b/cmd/query/app/server.go
@@ -30,11 +30,11 @@ import (
 	"github.com/jaegertracing/jaeger/cmd/query/app/querysvc"
 	v2querysvc "github.com/jaegertracing/jaeger/cmd/query/app/querysvc/v2/querysvc"
 	"github.com/jaegertracing/jaeger/internal/proto/api_v3"
+	"github.com/jaegertracing/jaeger/internal/recoveryhandler"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/bearertoken"
 	"github.com/jaegertracing/jaeger/pkg/netutils"
-	"github.com/jaegertracing/jaeger/pkg/recoveryhandler"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 )
 
 // Server runs HTTP, Mux and a grpc server
diff --git a/cmd/query/main.go b/cmd/query/main.go
index db7341b8..97934e8b 100644
--- a/cmd/query/main.go
+++ b/cmd/query/main.go
@@ -24,16 +24,16 @@ import (
 	"github.com/jaegertracing/jaeger/cmd/query/app"
 	"github.com/jaegertracing/jaeger/cmd/query/app/querysvc"
 	querysvcv2 "github.com/jaegertracing/jaeger/cmd/query/app/querysvc/v2/querysvc"
+	"github.com/jaegertracing/jaeger/internal/config"
 	metricsPlugin "github.com/jaegertracing/jaeger/internal/storage/metricstore"
 	storage "github.com/jaegertracing/jaeger/internal/storage/v1/factory"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/api/depstore"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/v1adapter"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/bearertoken"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/jtracer"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/version"
 	"github.com/jaegertracing/jaeger/ports"
 )
diff --git a/cmd/remote-storage/app/flags.go b/cmd/remote-storage/app/flags.go
index dd0d0ccc..c93d83bf 100644
--- a/cmd/remote-storage/app/flags.go
+++ b/cmd/remote-storage/app/flags.go
@@ -10,8 +10,8 @@ import (
 	"github.com/spf13/viper"
 	"go.opentelemetry.io/collector/config/configgrpc"
 
-	"github.com/jaegertracing/jaeger/pkg/config/tlscfg"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
+	"github.com/jaegertracing/jaeger/internal/config/tlscfg"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/ports"
 )
 
diff --git a/cmd/remote-storage/app/server.go b/cmd/remote-storage/app/server.go
index 72f6313b..431f8b5d 100644
--- a/cmd/remote-storage/app/server.go
+++ b/cmd/remote-storage/app/server.go
@@ -20,9 +20,9 @@ import (
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/dependencystore"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/grpc/shared"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/bearertoken"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 )
 
 // Server runs a gRPC server
diff --git a/cmd/remote-storage/main.go b/cmd/remote-storage/main.go
index 3f8387f1..9d56de2f 100644
--- a/cmd/remote-storage/main.go
+++ b/cmd/remote-storage/main.go
@@ -21,11 +21,11 @@ import (
 	"github.com/jaegertracing/jaeger/cmd/internal/printconfig"
 	"github.com/jaegertracing/jaeger/cmd/internal/status"
 	"github.com/jaegertracing/jaeger/cmd/remote-storage/app"
+	"github.com/jaegertracing/jaeger/internal/config"
 	storage "github.com/jaegertracing/jaeger/internal/storage/v1/factory"
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/version"
 	"github.com/jaegertracing/jaeger/ports"
 )
diff --git a/go.mod b/go.mod
index 3be1a101..44681c0c 100644
--- a/go.mod
+++ b/go.mod
@@ -19,7 +19,6 @@ require (
 	github.com/gogo/protobuf v1.3.2
 	github.com/gorilla/handlers v1.5.2
 	github.com/gorilla/mux v1.8.1
-	github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1
 	github.com/jaegertracing/jaeger-idl v0.5.0
 	github.com/kr/pretty v0.3.1
 	github.com/olivere/elastic v6.2.37+incompatible
@@ -43,43 +42,43 @@ require (
 	github.com/stretchr/testify v1.10.0
 	github.com/uber/jaeger-client-go v2.30.0+incompatible
 	github.com/xdg-go/scram v1.1.2
-	go.opentelemetry.io/collector/component v1.28.0
-	go.opentelemetry.io/collector/component/componentstatus v0.122.0
-	go.opentelemetry.io/collector/component/componenttest v0.122.0
-	go.opentelemetry.io/collector/config/configauth v0.122.0
-	go.opentelemetry.io/collector/config/configgrpc v0.122.0
-	go.opentelemetry.io/collector/config/confighttp v0.122.0
-	go.opentelemetry.io/collector/config/confighttp/xconfighttp v0.122.0
-	go.opentelemetry.io/collector/config/configretry v1.28.0
-	go.opentelemetry.io/collector/config/configtls v1.28.0
-	go.opentelemetry.io/collector/confmap v1.28.0
-	go.opentelemetry.io/collector/confmap/provider/envprovider v1.28.0
-	go.opentelemetry.io/collector/confmap/provider/fileprovider v1.28.0
-	go.opentelemetry.io/collector/confmap/provider/httpprovider v1.28.0
-	go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.28.0
-	go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.28.0
-	go.opentelemetry.io/collector/connector v0.122.0
-	go.opentelemetry.io/collector/connector/forwardconnector v0.122.0
-	go.opentelemetry.io/collector/consumer v1.28.0
-	go.opentelemetry.io/collector/consumer/consumertest v0.122.0
-	go.opentelemetry.io/collector/exporter v0.122.0
-	go.opentelemetry.io/collector/exporter/exportertest v0.122.0
-	go.opentelemetry.io/collector/exporter/nopexporter v0.122.0
-	go.opentelemetry.io/collector/exporter/otlpexporter v0.122.0
-	go.opentelemetry.io/collector/exporter/otlphttpexporter v0.122.0
-	go.opentelemetry.io/collector/extension v1.28.0
-	go.opentelemetry.io/collector/extension/zpagesextension v0.122.0
-	go.opentelemetry.io/collector/featuregate v1.28.0
-	go.opentelemetry.io/collector/otelcol v0.122.0
-	go.opentelemetry.io/collector/pdata v1.28.0
-	go.opentelemetry.io/collector/pipeline v0.122.0
-	go.opentelemetry.io/collector/processor v0.122.0
-	go.opentelemetry.io/collector/processor/batchprocessor v0.122.0
-	go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.122.0
-	go.opentelemetry.io/collector/processor/processortest v0.122.0
-	go.opentelemetry.io/collector/receiver v1.28.0
-	go.opentelemetry.io/collector/receiver/nopreceiver v0.122.0
-	go.opentelemetry.io/collector/receiver/otlpreceiver v0.122.0
+	go.opentelemetry.io/collector/component v1.28.1
+	go.opentelemetry.io/collector/component/componentstatus v0.122.1
+	go.opentelemetry.io/collector/component/componenttest v0.122.1
+	go.opentelemetry.io/collector/config/configauth v0.122.1
+	go.opentelemetry.io/collector/config/configgrpc v0.122.1
+	go.opentelemetry.io/collector/config/confighttp v0.122.1
+	go.opentelemetry.io/collector/config/confighttp/xconfighttp v0.122.1
+	go.opentelemetry.io/collector/config/configretry v1.28.1
+	go.opentelemetry.io/collector/config/configtls v1.28.1
+	go.opentelemetry.io/collector/confmap v1.28.1
+	go.opentelemetry.io/collector/confmap/provider/envprovider v1.28.1
+	go.opentelemetry.io/collector/confmap/provider/fileprovider v1.28.1
+	go.opentelemetry.io/collector/confmap/provider/httpprovider v1.28.1
+	go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.28.1
+	go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.28.1
+	go.opentelemetry.io/collector/connector v0.122.1
+	go.opentelemetry.io/collector/connector/forwardconnector v0.122.1
+	go.opentelemetry.io/collector/consumer v1.28.1
+	go.opentelemetry.io/collector/consumer/consumertest v0.122.1
+	go.opentelemetry.io/collector/exporter v0.122.1
+	go.opentelemetry.io/collector/exporter/exportertest v0.122.1
+	go.opentelemetry.io/collector/exporter/nopexporter v0.122.1
+	go.opentelemetry.io/collector/exporter/otlpexporter v0.122.1
+	go.opentelemetry.io/collector/exporter/otlphttpexporter v0.122.1
+	go.opentelemetry.io/collector/extension v1.28.1
+	go.opentelemetry.io/collector/extension/zpagesextension v0.122.1
+	go.opentelemetry.io/collector/featuregate v1.28.1
+	go.opentelemetry.io/collector/otelcol v0.122.1
+	go.opentelemetry.io/collector/pdata v1.28.1
+	go.opentelemetry.io/collector/pipeline v0.122.1
+	go.opentelemetry.io/collector/processor v0.122.1
+	go.opentelemetry.io/collector/processor/batchprocessor v0.122.1
+	go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.122.1
+	go.opentelemetry.io/collector/processor/processortest v0.122.1
+	go.opentelemetry.io/collector/receiver v1.28.1
+	go.opentelemetry.io/collector/receiver/nopreceiver v0.122.1
+	go.opentelemetry.io/collector/receiver/otlpreceiver v0.122.1
 	go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0
 	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0
 	go.opentelemetry.io/contrib/samplers/jaegerremote v0.29.0
@@ -107,11 +106,11 @@ require (
 	github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.3 // indirect
 	github.com/cenkalti/backoff/v5 v5.0.2 // indirect
 	github.com/twmb/murmur3 v1.1.8 // indirect
-	go.opentelemetry.io/collector/extension/extensionauth v0.122.0 // indirect
-	go.opentelemetry.io/collector/extension/extensiontest v0.122.0 // indirect
-	go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.122.0 // indirect
-	go.opentelemetry.io/collector/receiver/receiverhelper v0.122.0 // indirect
-	go.opentelemetry.io/collector/service/hostcapabilities v0.122.0 // indirect
+	go.opentelemetry.io/collector/extension/extensionauth v0.122.1 // indirect
+	go.opentelemetry.io/collector/extension/extensiontest v0.122.1 // indirect
+	go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.122.1 // indirect
+	go.opentelemetry.io/collector/receiver/receiverhelper v0.122.1 // indirect
+	go.opentelemetry.io/collector/service/hostcapabilities v0.122.1 // indirect
 	go.opentelemetry.io/contrib/otelconf v0.15.0 // indirect
 )
 
@@ -208,7 +207,7 @@ require (
 	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/status v0.122.0 // indirect
 	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/azure v0.122.0 // indirect
 	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/prometheus v0.122.0 // indirect
-	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.122.0 // indirect
+	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin v0.122.0
 	github.com/opentracing/opentracing-go v1.2.0 // indirect
 	github.com/openzipkin/zipkin-go v0.4.3 // indirect
 	github.com/pelletier/go-toml/v2 v2.2.3 // indirect
@@ -238,35 +237,35 @@ require (
 	github.com/xdg-go/stringprep v1.0.4 // indirect
 	github.com/yusufpapurcu/wmi v1.2.4 // indirect
 	go.opentelemetry.io/auto/sdk v1.1.0 // indirect
-	go.opentelemetry.io/collector v0.122.0 // indirect
-	go.opentelemetry.io/collector/client v1.28.0
-	go.opentelemetry.io/collector/config/configcompression v1.28.0 // indirect
-	go.opentelemetry.io/collector/config/confignet v1.28.0
-	go.opentelemetry.io/collector/config/configopaque v1.28.0
-	go.opentelemetry.io/collector/config/configtelemetry v0.122.0 // indirect
-	go.opentelemetry.io/collector/confmap/xconfmap v0.122.0
-	go.opentelemetry.io/collector/connector/connectortest v0.122.0 // indirect
-	go.opentelemetry.io/collector/connector/xconnector v0.122.0 // indirect
-	go.opentelemetry.io/collector/consumer/consumererror v0.122.0 // indirect
-	go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.122.0 // indirect
-	go.opentelemetry.io/collector/consumer/xconsumer v0.122.0 // indirect
-	go.opentelemetry.io/collector/exporter/debugexporter v0.122.0
-	go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.122.0 // indirect
-	go.opentelemetry.io/collector/exporter/xexporter v0.122.0 // indirect
-	go.opentelemetry.io/collector/extension/extensioncapabilities v0.122.0
-	go.opentelemetry.io/collector/extension/xextension v0.122.0 // indirect
-	go.opentelemetry.io/collector/internal/fanoutconsumer v0.122.0 // indirect
-	go.opentelemetry.io/collector/internal/memorylimiter v0.122.0 // indirect
-	go.opentelemetry.io/collector/internal/sharedcomponent v0.122.0 // indirect
-	go.opentelemetry.io/collector/internal/telemetry v0.122.0 // indirect
-	go.opentelemetry.io/collector/pdata/pprofile v0.122.0 // indirect
-	go.opentelemetry.io/collector/pdata/testdata v0.122.0 // indirect
-	go.opentelemetry.io/collector/pipeline/xpipeline v0.122.0 // indirect
-	go.opentelemetry.io/collector/processor/xprocessor v0.122.0 // indirect
-	go.opentelemetry.io/collector/receiver/receivertest v0.122.0 // indirect
-	go.opentelemetry.io/collector/receiver/xreceiver v0.122.0 // indirect
-	go.opentelemetry.io/collector/semconv v0.122.0 // indirect
-	go.opentelemetry.io/collector/service v0.122.0 // indirect
+	go.opentelemetry.io/collector v0.122.1 // indirect
+	go.opentelemetry.io/collector/client v1.28.1
+	go.opentelemetry.io/collector/config/configcompression v1.28.1 // indirect
+	go.opentelemetry.io/collector/config/confignet v1.28.1
+	go.opentelemetry.io/collector/config/configopaque v1.28.1
+	go.opentelemetry.io/collector/config/configtelemetry v0.122.1 // indirect
+	go.opentelemetry.io/collector/confmap/xconfmap v0.122.1
+	go.opentelemetry.io/collector/connector/connectortest v0.122.1 // indirect
+	go.opentelemetry.io/collector/connector/xconnector v0.122.1 // indirect
+	go.opentelemetry.io/collector/consumer/consumererror v0.122.1 // indirect
+	go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.122.1 // indirect
+	go.opentelemetry.io/collector/consumer/xconsumer v0.122.1 // indirect
+	go.opentelemetry.io/collector/exporter/debugexporter v0.122.1
+	go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.122.1 // indirect
+	go.opentelemetry.io/collector/exporter/xexporter v0.122.1 // indirect
+	go.opentelemetry.io/collector/extension/extensioncapabilities v0.122.1
+	go.opentelemetry.io/collector/extension/xextension v0.122.1 // indirect
+	go.opentelemetry.io/collector/internal/fanoutconsumer v0.122.1 // indirect
+	go.opentelemetry.io/collector/internal/memorylimiter v0.122.1 // indirect
+	go.opentelemetry.io/collector/internal/sharedcomponent v0.122.1 // indirect
+	go.opentelemetry.io/collector/internal/telemetry v0.122.1 // indirect
+	go.opentelemetry.io/collector/pdata/pprofile v0.122.1 // indirect
+	go.opentelemetry.io/collector/pdata/testdata v0.122.1 // indirect
+	go.opentelemetry.io/collector/pipeline/xpipeline v0.122.1 // indirect
+	go.opentelemetry.io/collector/processor/xprocessor v0.122.1 // indirect
+	go.opentelemetry.io/collector/receiver/receivertest v0.122.1 // indirect
+	go.opentelemetry.io/collector/receiver/xreceiver v0.122.1 // indirect
+	go.opentelemetry.io/collector/semconv v0.122.1 // indirect
+	go.opentelemetry.io/collector/service v0.122.1 // indirect
 	go.opentelemetry.io/contrib/bridges/otelzap v0.10.0 // indirect
 	go.opentelemetry.io/contrib/propagators/b3 v1.35.0 // indirect
 	go.opentelemetry.io/contrib/zpages v0.60.0 // indirect
diff --git a/go.sum b/go.sum
index a8512916..660792cc 100644
--- a/go.sum
+++ b/go.sum
@@ -284,8 +284,6 @@ github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWm
 github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
 github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc h1:GN2Lv3MGO7AS6PrRoT6yV5+wkrOpcszoIsO4+4ds248=
 github.com/grafana/regexp v0.0.0-20240518133315-a468a5bfb3bc/go.mod h1:+JKpmjMGhpgPL+rXZ5nsZieVzvarn86asRlBg4uNGnk=
-github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1 h1:KcFzXwzM/kGhIRHvc8jdixfIJjVzuUJdnv+5xsPutog=
-github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.1/go.mod h1:qOchhhIlmRcqk/O9uCo/puJlyo07YINaIqdZfZG3Jkc=
 github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1 h1:e9Rjr40Z98/clHv5Yg79Is0NtosR5LXRvdr7o/6NwbA=
 github.com/grpc-ecosystem/grpc-gateway/v2 v2.26.1/go.mod h1:tIxuGz/9mpox++sgp9fJjHO0+q1X9/UOWd798aAm22M=
 github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed h1:5upAirOpQc1Q53c0bnx2ufif5kANL7bfZWcc6VJWJd8=
@@ -637,150 +635,150 @@ go.mongodb.org/mongo-driver v1.14.0 h1:P98w8egYRjYe3XDjxhYJagTokP/H6HzlsnojRgZRd
 go.mongodb.org/mongo-driver v1.14.0/go.mod h1:Vzb0Mk/pa7e6cWw85R4F/endUC3u0U9jGcNU603k65c=
 go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJySYA=
 go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
-go.opentelemetry.io/collector v0.122.0 h1:eir4Fvv2tz5tUvPBTvFk8VmqeihYcTuYD6AXllvxxIg=
-go.opentelemetry.io/collector v0.122.0/go.mod h1:8t7TFg4nQHskvaOZrbfqAprB3r6+SZ2GQ2NYua0HEtg=
-go.opentelemetry.io/collector/client v1.28.0 h1:QKewiYc5Fc87pViqt8Lav/lQAybMUO4hf1ubV0gqRtg=
-go.opentelemetry.io/collector/client v1.28.0/go.mod h1:mopBD0EZwShVUMjet1ElpzIvOlmVxpJ1r7b7XSr9npg=
-go.opentelemetry.io/collector/component v1.28.0 h1:SQAGxxuyZ+d5tOsuEka8m9oE+wAroaYQpJ8NTIbl6Lk=
-go.opentelemetry.io/collector/component v1.28.0/go.mod h1:te8gbcKU6Mgu7ewo/2VYDSbCkLrhOYYy2llayXCF0bI=
-go.opentelemetry.io/collector/component/componentstatus v0.122.0 h1:gzqsfL8IN+bwlByl76MNFIDtq0jc9Y671NoZQGAiupg=
-go.opentelemetry.io/collector/component/componentstatus v0.122.0/go.mod h1:d4WiL3UHQFIh7WN4miV5aupTZK3kFRt4xfzhsyTEMN4=
-go.opentelemetry.io/collector/component/componenttest v0.122.0 h1:TxMm4nXB9iByQhDP0QFZwYxG+BFXEB6qUUwVh5YYW7g=
-go.opentelemetry.io/collector/component/componenttest v0.122.0/go.mod h1:zzRftQeGgVPxKzXkJEx3ghC4U3hgiDRuuNljsq3cLPI=
-go.opentelemetry.io/collector/config/configauth v0.122.0 h1:tJj+CLgFm6iXTQb9a+kHTM98dvgUMVbF6aT3PlAuZl0=
-go.opentelemetry.io/collector/config/configauth v0.122.0/go.mod h1:VnwnVs2XBIi5+WntVRAOiuqN4WMJmqQylIn4H/2UCFE=
-go.opentelemetry.io/collector/config/configcompression v1.28.0 h1:ygm3xa54z4LCoDw5xCuwuZq8Brcf3bEnE895KmO9KbE=
-go.opentelemetry.io/collector/config/configcompression v1.28.0/go.mod h1:QwbNpaOl6Me+wd0EdFuEJg0Cc+WR42HNjJtdq4TwE6w=
-go.opentelemetry.io/collector/config/configgrpc v0.122.0 h1:MNs6eI+8sgs5yHInpUs3+FeXgsN8IGyILw6ptYeJiD4=
-go.opentelemetry.io/collector/config/configgrpc v0.122.0/go.mod h1:bCCyn3A4K+cBZa75lXzdWLi8gwWjblTUQ4vHV4K2CGQ=
-go.opentelemetry.io/collector/config/confighttp v0.122.0 h1:wy2qdXmqOfE56gVaem0nuENAEEwv2Y1EODftGcd3RpQ=
-go.opentelemetry.io/collector/config/confighttp v0.122.0/go.mod h1:Gv+gFnkIy6/Mh8E5h/lFWHoekUc2hZPvIKu6hJkop2I=
-go.opentelemetry.io/collector/config/confighttp/xconfighttp v0.122.0 h1:SYzxPBd7gvKfaTHGIxrkDCJ13FZKvG5Uyz3j17ugI9k=
-go.opentelemetry.io/collector/config/confighttp/xconfighttp v0.122.0/go.mod h1:7M22+yqu9wCu4h6OpLp81RhJzbujLH7+dXp5Zj2eQ+0=
-go.opentelemetry.io/collector/config/confignet v1.28.0 h1:GZoEBKmc6hvK9QSOznbJXU6oiBGaQGOvDVo8QU0WPYk=
-go.opentelemetry.io/collector/config/confignet v1.28.0/go.mod h1:HgpLwdRLzPTwbjpUXR0Wdt6pAHuYzaIr8t4yECKrEvo=
-go.opentelemetry.io/collector/config/configopaque v1.28.0 h1:ZVK5sMs4h/4p9v5qCNCyQXDsOIrrYBgR9jRvP/iipRY=
-go.opentelemetry.io/collector/config/configopaque v1.28.0/go.mod h1:GYQiC8IejBcwE8z0O4DwbBR/Hf6U7d8DTf+cszyqwFs=
-go.opentelemetry.io/collector/config/configretry v1.28.0 h1:UqdSd+909bM9nC0eGcQvbTUdPQbEVJYDVjScFie5xFc=
-go.opentelemetry.io/collector/config/configretry v1.28.0/go.mod h1:QNnb+MCk7aS1k2EuGJMtlNCltzD7b8uC7Xel0Dxm1wQ=
-go.opentelemetry.io/collector/config/configtelemetry v0.122.0 h1:jBPdzU0CVrlxttnfKa0s2kyMVJeHY/faBht6/FUQcWI=
-go.opentelemetry.io/collector/config/configtelemetry v0.122.0/go.mod h1:WXmlNatI0vwjv7whh/qF1Xy+UufCZDk7VLtYqML7QmA=
-go.opentelemetry.io/collector/config/configtls v1.28.0 h1:as+2yV63pVcGSvpQnWa1heL63mvRV9DrVjIy9fZkGh4=
-go.opentelemetry.io/collector/config/configtls v1.28.0/go.mod h1:f3EpQn6FtqKJNfH6qKNAg/dsl9va70eak8TyW7/ySWo=
-go.opentelemetry.io/collector/confmap v1.28.0 h1:pUQh4eOW0YQ1GFWTDP5pw/ZMQuppkz6oSoDDloAH/Sc=
-go.opentelemetry.io/collector/confmap v1.28.0/go.mod h1:k/3fo+2RE6m+OKlJzx78Q8hstABYwYgvXO3u9zyTeHI=
-go.opentelemetry.io/collector/confmap/provider/envprovider v1.28.0 h1:FHYkRkdRqFBXI1kKT3oOxJBvh4bTEo8tJlKTI5+Yywc=
-go.opentelemetry.io/collector/confmap/provider/envprovider v1.28.0/go.mod h1:NYC/WqWjFhYtpM6vgwuk+IAtZsy7lyEOFlhARROb0RE=
-go.opentelemetry.io/collector/confmap/provider/fileprovider v1.28.0 h1:fUHB8JtK2AxhOrp8NlF4lAjmZxwzxPiw8cIqQoz313c=
-go.opentelemetry.io/collector/confmap/provider/fileprovider v1.28.0/go.mod h1:O0GKyr4jxDe8RVbpOLvTz1FgIk4IMOnC4YTA38Iz4Fo=
-go.opentelemetry.io/collector/confmap/provider/httpprovider v1.28.0 h1:XWbUtA26dhDx8s2+zdHXGo7Rdj+4mK3UgRHctQeW718=
-go.opentelemetry.io/collector/confmap/provider/httpprovider v1.28.0/go.mod h1:NKrAuoki1R5zUNOTaJY4ApIjschFCtU1Vl0zVvWO3uU=
-go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.28.0 h1:TLzEXs46G99xBZDLBpIHN8+uDFE4VGwAJbKCFIbo44I=
-go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.28.0/go.mod h1:ZMs14Qd+5GNyxDUZ1zDB5pK2bHn3DWfQrJtG8OQVLPg=
-go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.28.0 h1:W/3Uw2RfuWxfX78KsHOecckyWYwxWgYgI2RsxjHHEEk=
-go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.28.0/go.mod h1:8bObp2ah2C8AdZMb8O3Ek/TZm3wCh0Bs43n7RRom54E=
-go.opentelemetry.io/collector/confmap/xconfmap v0.122.0 h1:uRwR2/DEhLCwsdQyD5rTG/cAPUm5ixZb96y3rUaUo/g=
-go.opentelemetry.io/collector/confmap/xconfmap v0.122.0/go.mod h1:76K9ypccfRyorlYYit8O82mX4hseQP8VJ/TYqCKI4fA=
-go.opentelemetry.io/collector/connector v0.122.0 h1:VrILgvrE4PWuJzPfB2lj+wxqRK8+SnnFFB9Ft9G1Tok=
-go.opentelemetry.io/collector/connector v0.122.0/go.mod h1:ppWh+4gDym2C/zZ4ygID7DMZxVJyyvy1is415attDjA=
-go.opentelemetry.io/collector/connector/connectortest v0.122.0 h1:7kwexYryefADAP/eG9v3ycqIxgQh6qgmMlsjkgcBW34=
-go.opentelemetry.io/collector/connector/connectortest v0.122.0/go.mod h1:UxShMFmkmjwimWqlkRiDoVxyYMxk3ZQaoWsWb7Oe9is=
-go.opentelemetry.io/collector/connector/forwardconnector v0.122.0 h1:56mJ/2V2NXe5jT/LItXEq/XeJ8L0wYx8JAd3NGjWZNo=
-go.opentelemetry.io/collector/connector/forwardconnector v0.122.0/go.mod h1:rHswA7/rPu7p3ECw7Vw7M6W4JFM6Z3PGf1ziAxU9ZrQ=
-go.opentelemetry.io/collector/connector/xconnector v0.122.0 h1:D0e/ZbDhIJA8harTulMilhSG/yqQmi/k/yaLbGiPeH8=
-go.opentelemetry.io/collector/connector/xconnector v0.122.0/go.mod h1:gjFaSA5EZxOqzhoLrcf7Pj+U4sB60GcKIZYGaNvQ1jQ=
-go.opentelemetry.io/collector/consumer v1.28.0 h1:3JzDm7EFAF9ws4O3vVou5n8egdGZtrRN3xVw6AjNtqE=
-go.opentelemetry.io/collector/consumer v1.28.0/go.mod h1:Ge1HGm5aRYTW+SXggM+US9phb/BQR2of4FZ8r/3OH3Y=
-go.opentelemetry.io/collector/consumer/consumererror v0.122.0 h1:IoCEQE0xqNVsH7wOwmBBLR0W/+p8QFjYwNlZTrhztvM=
-go.opentelemetry.io/collector/consumer/consumererror v0.122.0/go.mod h1:8RPibMrh84PHzqGchjiKIRz4eqdylMg8boLwMJY3WjU=
-go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.122.0 h1:mZ7ppwAy60wKWHRkqiX9QJUGLJjNNiX2phHaJTCWbmI=
-go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.122.0/go.mod h1:bQ9PtJkMvj4swZpFjCeYX+J9RueUsxAPFCdf7qCSU6w=
-go.opentelemetry.io/collector/consumer/consumertest v0.122.0 h1:nV/qmUNRJZX+Eof963k+ShYy06DtQxMvP62nrXM8JJk=
-go.opentelemetry.io/collector/consumer/consumertest v0.122.0/go.mod h1:D7qDviTkrXfYigmSF4A8K7vQtb5ec/TVJsCNlVLIhxY=
-go.opentelemetry.io/collector/consumer/xconsumer v0.122.0 h1:7IyhI81BOf0YfsoI83/s7/muf7frkmgiX/FsFfZApq0=
-go.opentelemetry.io/collector/consumer/xconsumer v0.122.0/go.mod h1:+kN4ZwuJTLlLdtH+DkUyXqT/zQFMktbWFIdVqfmSWRY=
-go.opentelemetry.io/collector/exporter v0.122.0 h1:Y1ZigdLwHrN1/VA+P3lYrnM2gAmo/tQxHVxdfg+489U=
-go.opentelemetry.io/collector/exporter v0.122.0/go.mod h1:xtoCOeeGpZgcvMX8Od+HLBgDGqUstIii/NQXXjEkNR0=
-go.opentelemetry.io/collector/exporter/debugexporter v0.122.0 h1:vqMyeQIXNBzIdcykrgT4CnNMR3Un4Fi+KjMug1L8vhc=
-go.opentelemetry.io/collector/exporter/debugexporter v0.122.0/go.mod h1:H6UdnFk3KW+DCYIhePIcBnQOo6BYjzAt958oiwYckqk=
-go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.122.0 h1:PX4tYqe3Nr9i+gX7lkeDS8HYVsNeRc9hujBIHBHytp8=
-go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.122.0/go.mod h1:SoUtoUNOeBUBFgKCaF0Udy2IdqLksJ4yjOl0e23lIIc=
-go.opentelemetry.io/collector/exporter/exportertest v0.122.0 h1:NfhUI8OocfhLCpIuNlS9yx1Lt/Vmmn97Z8JnId+qVKw=
-go.opentelemetry.io/collector/exporter/exportertest v0.122.0/go.mod h1:1ntDyuDvpiqJH/YyQ4uvfePESaJm0g2D77syBkLAmmg=
-go.opentelemetry.io/collector/exporter/nopexporter v0.122.0 h1:N9cKHjzSfFRSdwr6cINa0yP22tDcI3gBy+SGWCD5CEo=
-go.opentelemetry.io/collector/exporter/nopexporter v0.122.0/go.mod h1:b6cQatmSyd4dQXVQ76k3tx7aMqp1IVqR9SZ5nAcP6ag=
-go.opentelemetry.io/collector/exporter/otlpexporter v0.122.0 h1:Lu6oDgvhyfgmJGKBFPvgt3FZdeuGwsvuC+mQjGHTFns=
-go.opentelemetry.io/collector/exporter/otlpexporter v0.122.0/go.mod h1:OC2gPe1V8cTeHglO4K2Ir2lFnjf5WZ58tPga61S5QOw=
-go.opentelemetry.io/collector/exporter/otlphttpexporter v0.122.0 h1:/svpo/L6jou5tvU0BP+NBwe+Ti4hSccMxbrdDZHrBkU=
-go.opentelemetry.io/collector/exporter/otlphttpexporter v0.122.0/go.mod h1:wKBp6LoUrTbImUVdY77Asmwqd9TXiNpxGmFBGyY5pXU=
-go.opentelemetry.io/collector/exporter/xexporter v0.122.0 h1:fd+IEFSNZoUa/3Z8eNLPKqOkeh7nEV6qTlqoFzt+uD0=
-go.opentelemetry.io/collector/exporter/xexporter v0.122.0/go.mod h1:pRqtMIBLcnUsyMwaIjUz//0fKWj+9VXOA+tUGnS9DDQ=
-go.opentelemetry.io/collector/extension v1.28.0 h1:E3j6/EtcahF2bX9DvRduLQ6tD7SuZdXM9DzAi7NSAeY=
-go.opentelemetry.io/collector/extension v1.28.0/go.mod h1:3MW9IGCNNgjG/ngkALVH5epwbCwYuoZMTbh4523aYv0=
-go.opentelemetry.io/collector/extension/extensionauth v0.122.0 h1:ypFO+JFrUsxWb2llD50Thyikrigzvac0cJeNh8nRT8M=
-go.opentelemetry.io/collector/extension/extensionauth v0.122.0/go.mod h1:EsGPuDcbOxwku0ebMmtVOm+j8FCdH6yd7lQ6JT/1TXc=
-go.opentelemetry.io/collector/extension/extensionauth/extensionauthtest v0.122.0 h1:W0vGOTWCXnNjhtoU4kRbd23gBBhyvqrIb0T2SzIhN7Y=
-go.opentelemetry.io/collector/extension/extensionauth/extensionauthtest v0.122.0/go.mod h1:vatawggvbtKt9mioGsjLquolLjuEL3PxnHDqkmukzBk=
-go.opentelemetry.io/collector/extension/extensioncapabilities v0.122.0 h1:ecxODEslQT87P82n1bWzVaVyj57OAwxh56RxLL1fyxc=
-go.opentelemetry.io/collector/extension/extensioncapabilities v0.122.0/go.mod h1:0Sl5KgS06MdhvFog9JOHLl8SnZLmDQwgcA0IhYoAuxo=
-go.opentelemetry.io/collector/extension/extensiontest v0.122.0 h1:daeCPXhb4HveyeYyX6G0IqjGuvWJprZeiq7pZiSdC+M=
-go.opentelemetry.io/collector/extension/extensiontest v0.122.0/go.mod h1:JXSONLbyuX+uOy1gcQ3Jcp/48pfkh0RiZPy7XkyCBdU=
-go.opentelemetry.io/collector/extension/xextension v0.122.0 h1:EoPcWm69j0OZCyKvZ0H0KfkLRKZyry678852ua7k+DI=
-go.opentelemetry.io/collector/extension/xextension v0.122.0/go.mod h1:hdkdi0cGk3X1+9M0IS1LJ8dhlnEKhqHd2HMdc2ata5A=
-go.opentelemetry.io/collector/extension/zpagesextension v0.122.0 h1:naCxcvZq9nEEINb1+dumkwF+HomgCv5Xevs6U6SKmLY=
-go.opentelemetry.io/collector/extension/zpagesextension v0.122.0/go.mod h1:gQICv0GEl9qCwIPbQGCDm1XbKUhv4IVdhU8FlVqSR+8=
-go.opentelemetry.io/collector/featuregate v1.28.0 h1:nkaMw0HyOSxojLwlezF2O/xJ9T/Jo1a0iEetesT9lr0=
-go.opentelemetry.io/collector/featuregate v1.28.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc=
-go.opentelemetry.io/collector/internal/fanoutconsumer v0.122.0 h1:Oup8r2FaIEi7si3Kz7ybSgeNh6TrQFNJ9I7bNNdgJ0o=
-go.opentelemetry.io/collector/internal/fanoutconsumer v0.122.0/go.mod h1:02AWRtzi/v9P2ldMdQq5+OKKoqIVPdqZQ/B3KKNu/So=
-go.opentelemetry.io/collector/internal/memorylimiter v0.122.0 h1:16eNhffpGzVxWsx7x2K47Hg0e46886kHd5P7Ht6Ra8U=
-go.opentelemetry.io/collector/internal/memorylimiter v0.122.0/go.mod h1:o0NNdP3ryvmA6tFcRQ2+hIVutndzFzey63AmD2HLZ9g=
-go.opentelemetry.io/collector/internal/sharedcomponent v0.122.0 h1:T9EWV/IBi1ETfj7GCS0Rs8Zxljl94bAbCaHBICMMTyA=
-go.opentelemetry.io/collector/internal/sharedcomponent v0.122.0/go.mod h1:C/n9QEK7OVxbEhyAj/2ma0IsKlGPv8pmscOVn8ZHte8=
-go.opentelemetry.io/collector/internal/telemetry v0.122.0 h1:5RCl/CdT3+VaduRI5IphoH3xS49sHZmEY/y3N3CEZjs=
-go.opentelemetry.io/collector/internal/telemetry v0.122.0/go.mod h1:FrmVXPmQMn3BuGIWg/pOdmHTMvXmlNzcbMusn8SSZn4=
-go.opentelemetry.io/collector/otelcol v0.122.0 h1:Uq8MKHHAAdgPs1VhHtoAYC6Wuxom1Dd8TaoOnIc7vWQ=
-go.opentelemetry.io/collector/otelcol v0.122.0/go.mod h1:/HAitWFSlD8dVwc9qekh+FcUfMyn/hT5p7+f3BfEqa8=
-go.opentelemetry.io/collector/pdata v1.28.0 h1:xSZyvTOOc2Wmz4PoxrVqeQfodLgs9k7gowLAnzZN0eU=
-go.opentelemetry.io/collector/pdata v1.28.0/go.mod h1:asKE8MD/4SOKz1mCrGdAz4VO2U2HUNg8A6094uK7pq0=
-go.opentelemetry.io/collector/pdata/pprofile v0.122.0 h1:JcmYBmNNOKRO7mIBxJ79YKgrTowILCCcpxKorDBfFOs=
-go.opentelemetry.io/collector/pdata/pprofile v0.122.0/go.mod h1:miIYvmTQov3C2/D7T0nRMndhavG4tPqz3llKMdLjSwg=
-go.opentelemetry.io/collector/pdata/testdata v0.122.0 h1:ANXZ+h9yAy1N37ot407qnMtISjZIgjYk10atzD7wSKI=
-go.opentelemetry.io/collector/pdata/testdata v0.122.0/go.mod h1:5WxeLDGisczRoS5lnxyt0PqGI3tr2QnhxUHupGrDY64=
-go.opentelemetry.io/collector/pipeline v0.122.0 h1:DmiNzhj2IPpL6JisPo0Hs8vyS5AsUz+GlPh5wblJmTk=
-go.opentelemetry.io/collector/pipeline v0.122.0/go.mod h1:TO02zju/K6E+oFIOdi372Wk0MXd+Szy72zcTsFQwXl4=
-go.opentelemetry.io/collector/pipeline/xpipeline v0.122.0 h1:Zu6zvO/6epvsjZ74t7qAiMowqhScxHZURlBzBaJ00iY=
-go.opentelemetry.io/collector/pipeline/xpipeline v0.122.0/go.mod h1:uBWsvO37xU8cPgG8znDMW7bIwzrwRQ0jQ0u05rFeB/g=
-go.opentelemetry.io/collector/processor v0.122.0 h1:elkgJhXhzwrvycbMGQzLOGNwGURaQZNAx1VB8lh9uq8=
-go.opentelemetry.io/collector/processor v0.122.0/go.mod h1:jWan7IwasdpUA9GQGyicw5MDJOfqoiTnez+xkT7GCu8=
-go.opentelemetry.io/collector/processor/batchprocessor v0.122.0 h1:0WcqoVFOpRypgGu0EMDfGwdlUz2x/pgKNn/kj1TG0Hw=
-go.opentelemetry.io/collector/processor/batchprocessor v0.122.0/go.mod h1:5WAE1ZTTH73bUq8Q8miTiyVdabuoAIy4kh7CqzG0rjU=
-go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.122.0 h1:SkfP/QjXhb4Xqp4nvFgTmZQPxvMMBt0RnR3mbpRfAK4=
-go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.122.0/go.mod h1:e3/v/aX7jWh+onQu65FkCu1M5q6zaZrZGvUMLBrTxoI=
-go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.122.0 h1:leSfTbLyiXX8QDvOigaEEntqKMmAOmY0k03Z0Z/DJs4=
-go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.122.0/go.mod h1:seSbHuLaYeojaYWqB1jLS3rW+0GCGZSeSkjnT6wuROw=
-go.opentelemetry.io/collector/processor/processortest v0.122.0 h1:UHJwvmIzGoi6U4p6UyaZUGOI3lx1seHh1b+ukVyZ3Wg=
-go.opentelemetry.io/collector/processor/processortest v0.122.0/go.mod h1:iK3qMnIkby7f0QCz0876mD7Wpuhxertg6zvZL5lRtdI=
-go.opentelemetry.io/collector/processor/xprocessor v0.122.0 h1:hXl4Ttp1Ycqf2rIDQnIW9bMmq01sF2Jb+aEWJ7rtaDU=
-go.opentelemetry.io/collector/processor/xprocessor v0.122.0/go.mod h1:Kh9zGutW9Smqsi+FWimlTmLl9czi6WgG7JclMB44sqA=
-go.opentelemetry.io/collector/receiver v1.28.0 h1:yvAUb+QTdkhIuUVY5wGUPyXqIylIttGpt+k+1b77jic=
-go.opentelemetry.io/collector/receiver v1.28.0/go.mod h1:ceNMHvsSkFOHK80UkQd5kdrU3Qq7NA+dS7oc6C4zLRc=
-go.opentelemetry.io/collector/receiver/nopreceiver v0.122.0 h1:VBfVAyi8PCPYGoPFdP2J83P79yB69HAA378HIXhvgN0=
-go.opentelemetry.io/collector/receiver/nopreceiver v0.122.0/go.mod h1:jDr6lJRwoTeeYzfSEu5nm1pNRzYO8JEhXIsmZBNx9gM=
-go.opentelemetry.io/collector/receiver/otlpreceiver v0.122.0 h1:MdFHT6skDRypRDs6OTvItNLvULD65H5py18JbaAHTEI=
-go.opentelemetry.io/collector/receiver/otlpreceiver v0.122.0/go.mod h1:xKn0pNpQanJlyzw8eMlHZnq+B2A6ks6Np0wILEYC43E=
-go.opentelemetry.io/collector/receiver/receiverhelper v0.122.0 h1:3WLq3KokGKoP9wCDTvOtVXBcL0N4wusfguhgj5vVvwY=
-go.opentelemetry.io/collector/receiver/receiverhelper v0.122.0/go.mod h1:OAB5yw8fjmrXpIurgUTVOinyvr9zxz3eglAZ6qqbDrM=
-go.opentelemetry.io/collector/receiver/receivertest v0.122.0 h1:qBy1XbddIQRvslmS1WXhTnjzOIwuLBTbp8CGN8atNKk=
-go.opentelemetry.io/collector/receiver/receivertest v0.122.0/go.mod h1:zuB9o86N1UFgauDS9cHT8vHWQVggNRcyinwRZZv5Z9A=
-go.opentelemetry.io/collector/receiver/xreceiver v0.122.0 h1:rAWEMR/TDu+a9ATGIec4m9swVT0KvimUQqZpOLgTCVM=
-go.opentelemetry.io/collector/receiver/xreceiver v0.122.0/go.mod h1:LLMY2gDtQCieYEOa5h6heHv+FMkC+b1u/yUXRJvwrEo=
-go.opentelemetry.io/collector/semconv v0.122.0 h1:MsPT+/vmQ1iVc4wEVgyRIxi4Pc0KUxc/mjoJsPrfH0k=
-go.opentelemetry.io/collector/semconv v0.122.0/go.mod h1:te6VQ4zZJO5Lp8dM2XIhDxDiL45mwX0YAQQWRQ0Qr9U=
-go.opentelemetry.io/collector/service v0.122.0 h1:OPDNiuGTHYj0B3ozeC5IV6wNDmgp0j2RlyEsPbSS0o0=
-go.opentelemetry.io/collector/service v0.122.0/go.mod h1:ffOT//Aa8i/cg3Vy//BeqKV9W7EYJ06n0MmrY2h/7C0=
-go.opentelemetry.io/collector/service/hostcapabilities v0.122.0 h1:JyhvWTg0sx8a8DFPoZjpdwQoJEvSiColvRnsBjhAoYA=
-go.opentelemetry.io/collector/service/hostcapabilities v0.122.0/go.mod h1:QsoygBvcIywthvZ9eUZ7TkzXNzfTKO1KMRzb/dkTYQE=
+go.opentelemetry.io/collector v0.122.1 h1:CfjBnpaaE261Y1IeE+71VuGKC/AGGRz2R9kum9DpY1I=
+go.opentelemetry.io/collector v0.122.1/go.mod h1:8t7TFg4nQHskvaOZrbfqAprB3r6+SZ2GQ2NYua0HEtg=
+go.opentelemetry.io/collector/client v1.28.1 h1:oJcEP9uALM5l7ohlue2m46URcsIvKPRRuLuLGCJKd2I=
+go.opentelemetry.io/collector/client v1.28.1/go.mod h1:7eo2Hb+njuNBYGymCIOROe7l6pxNQ9Ic2sA+ncWVTcY=
+go.opentelemetry.io/collector/component v1.28.1 h1:JjwfvLR0UdadRDAANAdM4mOSwGmfGO3va2X+fdk4YdA=
+go.opentelemetry.io/collector/component v1.28.1/go.mod h1:jwZRDML3tXo1whueZdRf+y6z3DeEYTLPBmb/O1ujB40=
+go.opentelemetry.io/collector/component/componentstatus v0.122.1 h1:zMQC0y8ZBITa87GOwEANdOoAox5I4UgaIHxY79nwCbk=
+go.opentelemetry.io/collector/component/componentstatus v0.122.1/go.mod h1:ZYwOgoXyPu4gGqfQ5DeaEpStpUCD/Clctz4rMd9qQYw=
+go.opentelemetry.io/collector/component/componenttest v0.122.1 h1:HE4oeLub2FWVTUzCQG6SWwfnJfcK1FMknXhGQ2gOxnY=
+go.opentelemetry.io/collector/component/componenttest v0.122.1/go.mod h1:o3Xq6z3C0aVhrd/fD56aKxShrILVnHnbgQVP5NoFuic=
+go.opentelemetry.io/collector/config/configauth v0.122.1 h1:5vGpJvRQY7gT5hxXixTwRAK6mlnWhh9wl59FE3ySEdU=
+go.opentelemetry.io/collector/config/configauth v0.122.1/go.mod h1:/wE9C37qZB1W3I5e+jD3QvRsRlzsbttqwWLW5x28mOo=
+go.opentelemetry.io/collector/config/configcompression v1.28.1 h1:xlJu6QW2fi5woD8DLS/9MC0yxco1pLDgfoN10g8Q+yo=
+go.opentelemetry.io/collector/config/configcompression v1.28.1/go.mod h1:QwbNpaOl6Me+wd0EdFuEJg0Cc+WR42HNjJtdq4TwE6w=
+go.opentelemetry.io/collector/config/configgrpc v0.122.1 h1:hg/hhsvM9qY0sibmhdGAueZumae5Lq4/K0+Q5+nPjzQ=
+go.opentelemetry.io/collector/config/configgrpc v0.122.1/go.mod h1:i01CjytTucZZrK5qlpSXR7fBom0+2iJaddlF3ISZG1E=
+go.opentelemetry.io/collector/config/confighttp v0.122.1 h1:5INLWaKJYSx24vy4PDKj/W2yC9+N6sJaHnQfBGD7aAk=
+go.opentelemetry.io/collector/config/confighttp v0.122.1/go.mod h1:uEupEInDUl8D2zP/cCm6rHm0/SbVvi98cy5OPUSezuE=
+go.opentelemetry.io/collector/config/confighttp/xconfighttp v0.122.1 h1:eH4PrzF2KVvHJpYcyeauJ6XsUtg5mjUSeQPHeU1v2jI=
+go.opentelemetry.io/collector/config/confighttp/xconfighttp v0.122.1/go.mod h1:vp6rHVNNrDkZ/InvLi+0y+KzLxWtzhHGxlt2iSd7PPk=
+go.opentelemetry.io/collector/config/confignet v1.28.1 h1:HbedU9QTPXCrxtZF5swdsww1thTSLj7qnWDvY2kupn8=
+go.opentelemetry.io/collector/config/confignet v1.28.1/go.mod h1:HgpLwdRLzPTwbjpUXR0Wdt6pAHuYzaIr8t4yECKrEvo=
+go.opentelemetry.io/collector/config/configopaque v1.28.1 h1:y7O89UgOeUjTRK5551B1m4y0JhiICAxCSiTFNDTsWq4=
+go.opentelemetry.io/collector/config/configopaque v1.28.1/go.mod h1:GYQiC8IejBcwE8z0O4DwbBR/Hf6U7d8DTf+cszyqwFs=
+go.opentelemetry.io/collector/config/configretry v1.28.1 h1:WVRw9neCAsWilZU9C4ZzXeQLw1L3dIRlCIqReqhzi70=
+go.opentelemetry.io/collector/config/configretry v1.28.1/go.mod h1:QNnb+MCk7aS1k2EuGJMtlNCltzD7b8uC7Xel0Dxm1wQ=
+go.opentelemetry.io/collector/config/configtelemetry v0.122.1 h1:WABfddVAhIn5ZrTdisn6fOBufyYT/xYhKg6U0yYWQLA=
+go.opentelemetry.io/collector/config/configtelemetry v0.122.1/go.mod h1:WXmlNatI0vwjv7whh/qF1Xy+UufCZDk7VLtYqML7QmA=
+go.opentelemetry.io/collector/config/configtls v1.28.1 h1:UTnB30vfXbnkm94754sd8apbFMrQzESYFxaWZsK6D6o=
+go.opentelemetry.io/collector/config/configtls v1.28.1/go.mod h1:aXztDbmrn/MGbvCNPEYu9KcX8lXFKHyh4x6OsvOfl2c=
+go.opentelemetry.io/collector/confmap v1.28.1 h1:/zUmvpnERhFXrxVCVgubjJRgeOwdPbhTfUILZPUBfyw=
+go.opentelemetry.io/collector/confmap v1.28.1/go.mod h1:2aJggo/KQl7uynFyMNNMbl7jvKkSD7CniOVEpCbjRng=
+go.opentelemetry.io/collector/confmap/provider/envprovider v1.28.1 h1:I3tlAxPcLsc4pofvb2gZesLZNX2GU0ntkLaSXbVmSzY=
+go.opentelemetry.io/collector/confmap/provider/envprovider v1.28.1/go.mod h1:4QJXQtevfza/P/ULp2EBcd0RYhOfY3SG4u1Mb7nrj1Q=
+go.opentelemetry.io/collector/confmap/provider/fileprovider v1.28.1 h1:myKnGJOg5xonFdv0r4ABctvmTCi9JdlItxZ8uueBKOY=
+go.opentelemetry.io/collector/confmap/provider/fileprovider v1.28.1/go.mod h1:KZzPTgshDTo/mIqDuc+4qmcb90dqmgdzVEwlsKxVZuU=
+go.opentelemetry.io/collector/confmap/provider/httpprovider v1.28.1 h1:xKtnF5FcHPwN/wdGgdyw6aA2pCfmje/4br4IADSsyVk=
+go.opentelemetry.io/collector/confmap/provider/httpprovider v1.28.1/go.mod h1:puyowf12EBO2lzGz25oLoxHHL8YJXrYge1Yn2RG5jIY=
+go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.28.1 h1:CpYoNbW5QGvGD6Ua8QV2zEct3HClERNFbpjsRUKk6tU=
+go.opentelemetry.io/collector/confmap/provider/httpsprovider v1.28.1/go.mod h1:u/YEWkVSnQY0xhgXndJ3zIvCeyUPzqNtAUJdoF7xLUE=
+go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.28.1 h1:PP5juX1pPCbo/Y35tOcFuChbHLa7A1/yoWDaGKwLPNc=
+go.opentelemetry.io/collector/confmap/provider/yamlprovider v1.28.1/go.mod h1:fUQ6nqIyVD7jjX5h+VFclVjJzHTg7Czozveph6ppFj4=
+go.opentelemetry.io/collector/confmap/xconfmap v0.122.1 h1:E8sdJens/sq+evv/VHzbDP3B28uZIAPkKjtB4mVVTso=
+go.opentelemetry.io/collector/confmap/xconfmap v0.122.1/go.mod h1:33HDN5uVKRihgLiShZZDzxN0qiTA1+t8hK41rrf1jls=
+go.opentelemetry.io/collector/connector v0.122.1 h1:E0qzq1YyT4gfUr961bPGZhYObvBTsWlgqY37XzDPRJo=
+go.opentelemetry.io/collector/connector v0.122.1/go.mod h1:ia6ams3PZGjAMXSXT0hm3cQb8MZ3x58zIR3+5eQhzs0=
+go.opentelemetry.io/collector/connector/connectortest v0.122.1 h1:RgSAFzR/Wh/QF8DG1r/9/N7g7OJlu8nba4DBRvvTr00=
+go.opentelemetry.io/collector/connector/connectortest v0.122.1/go.mod h1:IzWDkmJvf2HN3dmOR/g0xY5T8cmjB6KPLBCHx9sfVnw=
+go.opentelemetry.io/collector/connector/forwardconnector v0.122.1 h1:6QiDjSSF3fhnK34oWgtchfGVjAymFbzlVSjSiTHM47I=
+go.opentelemetry.io/collector/connector/forwardconnector v0.122.1/go.mod h1:2X6M9sTWkN5iFhDHOphjbN2J2xjWi30F8m8QhmnyOcY=
+go.opentelemetry.io/collector/connector/xconnector v0.122.1 h1:yhMXzvi0gd/kbq4gaG+0ozeRfIJCHVunKS/JW2a8j5c=
+go.opentelemetry.io/collector/connector/xconnector v0.122.1/go.mod h1:25VAcwl0MAAsKDcN3Xi7ZbLn9AVmX/zuWOSsxoqz1C0=
+go.opentelemetry.io/collector/consumer v1.28.1 h1:3lHW2e0i7kEkbDqK1vErA8illqPpwDxMzgc5OUDsJ0Y=
+go.opentelemetry.io/collector/consumer v1.28.1/go.mod h1:g0T16JPMYFN6T2noh+1YBxJSt5i5Zp+Y0Y6pvkMqsDQ=
+go.opentelemetry.io/collector/consumer/consumererror v0.122.1 h1:/eL7rtfnKUMgjtiD+NXm6hd3QQ+tjD1oGc+ImPxFdIg=
+go.opentelemetry.io/collector/consumer/consumererror v0.122.1/go.mod h1:sQ4liQ7KVpZAz0KXm7q1cCoeL6YY6C9Nxmut7Js42dY=
+go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.122.1 h1:hU7PmoWmsbntJeYO4/tCVG5k9SIKJTsz07Xm6KWK6xg=
+go.opentelemetry.io/collector/consumer/consumererror/xconsumererror v0.122.1/go.mod h1:apCcxzASYl1rS/yZTWO9KW4P0s6vt3SvpBZSax4D1JI=
+go.opentelemetry.io/collector/consumer/consumertest v0.122.1 h1:LKkLMdWwJCuOYyCMVzwc0OG9vncIqpl8Tp9+H8RikNg=
+go.opentelemetry.io/collector/consumer/consumertest v0.122.1/go.mod h1:pYqWgx62ou3uUn8nlt2ohRyKod+7xLTf/uA3YfRwVkA=
+go.opentelemetry.io/collector/consumer/xconsumer v0.122.1 h1:iK1hGbho/XICdBfGb4MnKwF9lnhLmv09yQ4YlVm+LGo=
+go.opentelemetry.io/collector/consumer/xconsumer v0.122.1/go.mod h1:xYbRPP1oWcYUUDQJTlv78M/rlYb+qE4weiv++ObZRSU=
+go.opentelemetry.io/collector/exporter v0.122.1 h1:Yr8gmIQWb9Zylr2Al69k0BhCNlWIae1xPZz01zDyAZM=
+go.opentelemetry.io/collector/exporter v0.122.1/go.mod h1:CiIgKR/LG7oq+bogywL2zKkGtikiGyo3zTQaMGZNqDI=
+go.opentelemetry.io/collector/exporter/debugexporter v0.122.1 h1:wQnF1gs7/8574zQ4Hobi6UXx12S7IvrPuk5E0JyL7FI=
+go.opentelemetry.io/collector/exporter/debugexporter v0.122.1/go.mod h1:eVoOQqSYxPda+opCyE9IvX7jWIlaZafgQQOdo0nFcDU=
+go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.122.1 h1:4O3guQ6TikdF1ZrfzL8b1d4cNa4EUS9hhHxJ6E8YGXs=
+go.opentelemetry.io/collector/exporter/exporterhelper/xexporterhelper v0.122.1/go.mod h1:PVHDyLjAvN3OqH4sEo3EBJDcZzoG5Vr04er/CUmNsfE=
+go.opentelemetry.io/collector/exporter/exportertest v0.122.1 h1:izA26/JnJ819BOws089MJjo7oQB+uuM07Htfo8uE+Q4=
+go.opentelemetry.io/collector/exporter/exportertest v0.122.1/go.mod h1:/usnN6Vl3jJL6Vo9U9x/FKmAv1l0DofnKIYAOzJmrVU=
+go.opentelemetry.io/collector/exporter/nopexporter v0.122.1 h1:oii03WRwmP1Z2WuQ1/Hy6WgUPSaZpsOPFcFFJNA80u8=
+go.opentelemetry.io/collector/exporter/nopexporter v0.122.1/go.mod h1:3rtcRJ+8/+JBhOuMfhrxbnaSbKjuzeN6ZvpqCS3sLaA=
+go.opentelemetry.io/collector/exporter/otlpexporter v0.122.1 h1:CozKDEtFy0Y4vAX4QAWKRGSCiFkFJL9dR6S0QKsXkXQ=
+go.opentelemetry.io/collector/exporter/otlpexporter v0.122.1/go.mod h1:/0W83nPpsYmHAWZXDnFz90NKqQOW3cZV4W6w6Z39t3A=
+go.opentelemetry.io/collector/exporter/otlphttpexporter v0.122.1 h1:1LoahrhlGvpGy9x1bMnSbk0FXVBZI6+amgQHSDcTV78=
+go.opentelemetry.io/collector/exporter/otlphttpexporter v0.122.1/go.mod h1:s8i6+DNMa++YUGV8349LkVcMOtutKDS3Z3+AgDLGML0=
+go.opentelemetry.io/collector/exporter/xexporter v0.122.1 h1:SJt9kiCEyXAxyGWA4tBt1hqydmqVco9KDg9SkH4p7/o=
+go.opentelemetry.io/collector/exporter/xexporter v0.122.1/go.mod h1:5cgaRnGaWp0VtPbrTIIU717Eu4rW7kj1L8KluFlPPp0=
+go.opentelemetry.io/collector/extension v1.28.1 h1:2qiX/nuihDzHMmOxrVKZ5SURFL/oJBMlL6+kPDvb0+I=
+go.opentelemetry.io/collector/extension v1.28.1/go.mod h1:IaovGuJib5XGgLejcBmpgwFS5/mCV4xnW/J2Towy5lM=
+go.opentelemetry.io/collector/extension/extensionauth v0.122.1 h1:rYzI7OpHVxtEftsBC++ob/mkZr03/xjUnzuzFje64tY=
+go.opentelemetry.io/collector/extension/extensionauth v0.122.1/go.mod h1:OMZA2hlWIL2uRvCLR954qKvDOjTB/tvHwdhPIkjro60=
+go.opentelemetry.io/collector/extension/extensionauth/extensionauthtest v0.122.1 h1:hbehPpzaY9GWCyQn6o3PYIfGhP4egF5RnACzwh9lZ3I=
+go.opentelemetry.io/collector/extension/extensionauth/extensionauthtest v0.122.1/go.mod h1:uikPmJmPd619tAUTNhcM/L1UhQc/UMrwCglaed0MEEo=
+go.opentelemetry.io/collector/extension/extensioncapabilities v0.122.1 h1:dl6IdeQ7kOCESkcidXL6mbsUm1JcHC+JepqdNoiWlDc=
+go.opentelemetry.io/collector/extension/extensioncapabilities v0.122.1/go.mod h1:BGX52Iu/y9Sunfm/7BTwPcgZiSO3N+4qRDKkFlcZXsw=
+go.opentelemetry.io/collector/extension/extensiontest v0.122.1 h1:Rc5XZSY8HEb0x3RDnnNKk2VuvYkmx209dahs0JGFMJY=
+go.opentelemetry.io/collector/extension/extensiontest v0.122.1/go.mod h1:fdsJ3X45rU5CeCWk8hscVrbr7u5MdO3DnnKCVWTMDEc=
+go.opentelemetry.io/collector/extension/xextension v0.122.1 h1:U7Ryv25DC+wzJq6xcveZFmWEnOwwFSJAcH2nr2tw3vI=
+go.opentelemetry.io/collector/extension/xextension v0.122.1/go.mod h1:gXcwe6qono7zK4/RyKn0j47qWz204IcRyMqa47GO360=
+go.opentelemetry.io/collector/extension/zpagesextension v0.122.1 h1:mDHQc0h/4EsMRu0W8TBoFLDjruBsggP+r5e6t/hha38=
+go.opentelemetry.io/collector/extension/zpagesextension v0.122.1/go.mod h1:iZe00R/+a46SBexrd5uWtcOdkYgvxRbfBpN1xdlKRjw=
+go.opentelemetry.io/collector/featuregate v1.28.1 h1:ZpvRAAFxxi4RLr1G0Fju28wA7NhTA20MNT60Ftv+ToY=
+go.opentelemetry.io/collector/featuregate v1.28.1/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc=
+go.opentelemetry.io/collector/internal/fanoutconsumer v0.122.1 h1:AphjgdUrg/SNIXAHJASVWFWQDYszn3zS9+P1tJHSdAU=
+go.opentelemetry.io/collector/internal/fanoutconsumer v0.122.1/go.mod h1:jfe5dOMrkoWOJK6D9yTQjDEaOhBOkjcy3sKX6KBBT9c=
+go.opentelemetry.io/collector/internal/memorylimiter v0.122.1 h1:0ylfxgAY1OH3mcrrA8zr0zrMLdDiUMPeflqy63MA7EI=
+go.opentelemetry.io/collector/internal/memorylimiter v0.122.1/go.mod h1:dsvOMZTG5e8NBR8JBcv+qbheA02aF9pb1nEe4PX6SUw=
+go.opentelemetry.io/collector/internal/sharedcomponent v0.122.1 h1:RcreNAhKNNyDaK24ww7i7dDjfcT4M8VlOcJHWYvT5Wk=
+go.opentelemetry.io/collector/internal/sharedcomponent v0.122.1/go.mod h1:Svuf+UPmEg4d83Txs+t3O0LM6VXp2cIwD23iu4rlSYE=
+go.opentelemetry.io/collector/internal/telemetry v0.122.1 h1:bB5yb/JECih7Nqrfu9+AtBasGioyiy3rBrAMLbcyaXQ=
+go.opentelemetry.io/collector/internal/telemetry v0.122.1/go.mod h1:Qor+QXnQN+UYUdD2qtglBdH3y0xoXlcONnx2FnvjAL0=
+go.opentelemetry.io/collector/otelcol v0.122.1 h1:I5EwWET4uPubLAXAjrUsmcwVGK2Smb0xqKwdxIfRHJ8=
+go.opentelemetry.io/collector/otelcol v0.122.1/go.mod h1:yvr1D7Ik2qx6uQELYS3tSzn3UWwikHxni8C+xbLlHtI=
+go.opentelemetry.io/collector/pdata v1.28.1 h1:ORl5WLpQJvjzBVpHu12lqKMdcf/qDBwRXMcUubhybiQ=
+go.opentelemetry.io/collector/pdata v1.28.1/go.mod h1:asKE8MD/4SOKz1mCrGdAz4VO2U2HUNg8A6094uK7pq0=
+go.opentelemetry.io/collector/pdata/pprofile v0.122.1 h1:25Fs0eL/J/M2ZEaVplesbI1H7pYx462zUUVxVOszpOg=
+go.opentelemetry.io/collector/pdata/pprofile v0.122.1/go.mod h1:+jSjgb4zRnNmr1R/zgVLVyTVSm9irfGrvGTrk3lDxSE=
+go.opentelemetry.io/collector/pdata/testdata v0.122.1 h1:9DO8nUUnPAGYMKmrep6wLAfOHprvKY4w/7LpE4jldPQ=
+go.opentelemetry.io/collector/pdata/testdata v0.122.1/go.mod h1:hYdNrn8KxFwq1nf44YYRgNhDjJTBzoyEr/Qa26pN0t4=
+go.opentelemetry.io/collector/pipeline v0.122.1 h1:f0uuiDmanVyKwfYo6cWveJsGbLXidV7i+Z7u8QJwWxI=
+go.opentelemetry.io/collector/pipeline v0.122.1/go.mod h1:TO02zju/K6E+oFIOdi372Wk0MXd+Szy72zcTsFQwXl4=
+go.opentelemetry.io/collector/pipeline/xpipeline v0.122.1 h1:WhMVlMRjQoiu2k9/Haudy7VoDT4gismQzl1ZDxwvHQY=
+go.opentelemetry.io/collector/pipeline/xpipeline v0.122.1/go.mod h1:arZHihE9qPJ4WVWPUsSqUovhQdWZtOGLg2E/QKxbz7M=
+go.opentelemetry.io/collector/processor v0.122.1 h1:AvZvEujq8+FYdJsm9lmAMwuuae5Y2/vKIkOJwsoxsxQ=
+go.opentelemetry.io/collector/processor v0.122.1/go.mod h1:nYKctftba7SbdLml6LxgIrnYRXCShDe2bnNWjTIpF7g=
+go.opentelemetry.io/collector/processor/batchprocessor v0.122.1 h1:TPhdDrLi3XPD/wF+ipVsENJIMmRbtwXWfok0y4vO/jE=
+go.opentelemetry.io/collector/processor/batchprocessor v0.122.1/go.mod h1:JwfZ4P6iW9dl+mnashEyLO8pMioflCN9+G6oAH97dNQ=
+go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.122.1 h1:uIiWbILZDN3yhItMLJWZfKD3kHS3+xjo4IFsMVUrqTA=
+go.opentelemetry.io/collector/processor/memorylimiterprocessor v0.122.1/go.mod h1:y6wv5v5Nt73iBPK2OpfIoOiNqfYx1CJpObQ4LTC8e/s=
+go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.122.1 h1:Zf8jVQHp61RNhSaqWdehR2JeW8u8DOqt/II/aJ5w9Oo=
+go.opentelemetry.io/collector/processor/processorhelper/xprocessorhelper v0.122.1/go.mod h1:wxBFuB3WbKI3hh1JhLET0Yzi7yIEOXHsPJ/DfZgr394=
+go.opentelemetry.io/collector/processor/processortest v0.122.1 h1:n4UOx1mq+kLaRiHGsu7vBLq+EGXfzWhSxyFweMjMl54=
+go.opentelemetry.io/collector/processor/processortest v0.122.1/go.mod h1:8/NRWx18tNJMBwCQ8/YPWr4qsFUrwk27qE7/dXoJb1M=
+go.opentelemetry.io/collector/processor/xprocessor v0.122.1 h1:Wfv4/7n4YK1HunAVTMS6yf0xmDjCkftJ6EECNcSwzfs=
+go.opentelemetry.io/collector/processor/xprocessor v0.122.1/go.mod h1:9zMW3NQ9+DzcJ1cUq5BhZg3ajoUEMGhNY0ZdYjpX+VI=
+go.opentelemetry.io/collector/receiver v1.28.1 h1:5Aw0qQVs+CcmY/YkiwPUq4+9BoLCMNv9GlL6uTOVIDw=
+go.opentelemetry.io/collector/receiver v1.28.1/go.mod h1:i2Wj7MDpFnBagjFrglUssY9+tFsIThlnmK+a9JN2dzY=
+go.opentelemetry.io/collector/receiver/nopreceiver v0.122.1 h1:/4e5d2FOokl4FOkSrx6Ee+c6z0xtUr0y+G4MQ1O+9pE=
+go.opentelemetry.io/collector/receiver/nopreceiver v0.122.1/go.mod h1:fO3m+h4HkHjAdxzqAmRtb29KA5DlGnDH/hwdnCkFyN8=
+go.opentelemetry.io/collector/receiver/otlpreceiver v0.122.1 h1:R/R28rViZ6SY/h8NUomX/TXlE1lcXUxGJ5Vs2PK3AMA=
+go.opentelemetry.io/collector/receiver/otlpreceiver v0.122.1/go.mod h1:KUPczF1CoEHup6ICBJUuNsC8VG0zpSPafQaWlmrxJ98=
+go.opentelemetry.io/collector/receiver/receiverhelper v0.122.1 h1:T9NNNGudpEwpMzy2NVNr7z7zvRG3DONLTfc4BWmNAO4=
+go.opentelemetry.io/collector/receiver/receiverhelper v0.122.1/go.mod h1:nCXXS8Vga1Rr5rFMdN7dqjC+R1WFoklCB8SQumwHQfo=
+go.opentelemetry.io/collector/receiver/receivertest v0.122.1 h1:QVkiAi7Pw+SrnY8zX+948W5TSsWLxuDvcuu7meOFbs4=
+go.opentelemetry.io/collector/receiver/receivertest v0.122.1/go.mod h1:r++3FwxXK2hkTNaNVIwLPJkHP3iZdz9+dFsuocGpaLc=
+go.opentelemetry.io/collector/receiver/xreceiver v0.122.1 h1:Mhh54HngMsJPg655MMsydJAt+rrmO3E/SIcaedP3ksQ=
+go.opentelemetry.io/collector/receiver/xreceiver v0.122.1/go.mod h1:DdY1kn+y755wtelfTwv4/7WVK5caHwoW+X4oQ/OyMXc=
+go.opentelemetry.io/collector/semconv v0.122.1 h1:WLzDi3QC4/+LpNMLY90zn5aMDJKyqg/ujW2O4T4sxHg=
+go.opentelemetry.io/collector/semconv v0.122.1/go.mod h1:te6VQ4zZJO5Lp8dM2XIhDxDiL45mwX0YAQQWRQ0Qr9U=
+go.opentelemetry.io/collector/service v0.122.1 h1:JmogPurZ93XZJGIaortQnHmdo0/o8u01UiCL4cjNkZw=
+go.opentelemetry.io/collector/service v0.122.1/go.mod h1:GwhQsH58lxxTCj8OUEIMruw6ACF5G8cs9CRl2l2nlz0=
+go.opentelemetry.io/collector/service/hostcapabilities v0.122.1 h1:tLwUxUhAlOnwArlpb7gLEQ4cEzie8fTKsursBJZI8aU=
+go.opentelemetry.io/collector/service/hostcapabilities v0.122.1/go.mod h1:/d1wJpyrWjUKLEUOvOskOpTXbPhnUVLz5M63bRmMEVs=
 go.opentelemetry.io/contrib/bridges/otelzap v0.10.0 h1:ojdSRDvjrnm30beHOmwsSvLpoRF40MlwNCA+Oo93kXU=
 go.opentelemetry.io/contrib/bridges/otelzap v0.10.0/go.mod h1:oTTm4g7NEtHSV2i/0FeVdPaPgUIZPfQkFbq0vbzqnv0=
 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.60.0 h1:x7wzEgXfnzJcHDwStJT+mxOz4etr2EcexjqhBvmoakw=
diff --git a/pkg/config/config.go b/internal/config/config.go
similarity index 100%
rename from pkg/config/config.go
rename to internal/config/config.go
diff --git a/pkg/config/corscfg/flags.go b/internal/config/corscfg/flags.go
similarity index 100%
rename from pkg/config/corscfg/flags.go
rename to internal/config/corscfg/flags.go
diff --git a/pkg/config/string_slice.go b/internal/config/string_slice.go
similarity index 100%
rename from pkg/config/string_slice.go
rename to internal/config/string_slice.go
diff --git a/pkg/config/tlscfg/flags.go b/internal/config/tlscfg/flags.go
similarity index 100%
rename from pkg/config/tlscfg/flags.go
rename to internal/config/tlscfg/flags.go
diff --git a/pkg/config/tlscfg/options.go b/internal/config/tlscfg/options.go
similarity index 100%
rename from pkg/config/tlscfg/options.go
rename to internal/config/tlscfg/options.go
diff --git a/pkg/healthcheck/handler.go b/internal/healthcheck/handler.go
similarity index 100%
rename from pkg/healthcheck/handler.go
rename to internal/healthcheck/handler.go
diff --git a/pkg/hostname/hostname.go b/internal/hostname/hostname.go
similarity index 100%
rename from pkg/hostname/hostname.go
rename to internal/hostname/hostname.go
diff --git a/pkg/recoveryhandler/zap.go b/internal/recoveryhandler/zap.go
similarity index 100%
rename from pkg/recoveryhandler/zap.go
rename to internal/recoveryhandler/zap.go
diff --git a/internal/sampling/samplingstrategy/adaptive/aggregator.go b/internal/sampling/samplingstrategy/adaptive/aggregator.go
index e5b147ae..c974e6cb 100644
--- a/internal/sampling/samplingstrategy/adaptive/aggregator.go
+++ b/internal/sampling/samplingstrategy/adaptive/aggregator.go
@@ -11,11 +11,11 @@ import (
 	"go.uber.org/zap"
 
 	span_model "github.com/jaegertracing/jaeger-idl/model/v1"
+	"github.com/jaegertracing/jaeger/internal/hostname"
 	"github.com/jaegertracing/jaeger/internal/leaderelection"
 	"github.com/jaegertracing/jaeger/internal/sampling/samplingstrategy"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/samplingstore"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/samplingstore/model"
-	"github.com/jaegertracing/jaeger/pkg/hostname"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 )
 
diff --git a/internal/sampling/samplingstrategy/file/options.go b/internal/sampling/samplingstrategy/file/options.go
index 0ec75adc..c2baaa6e 100644
--- a/internal/sampling/samplingstrategy/file/options.go
+++ b/internal/sampling/samplingstrategy/file/options.go
@@ -14,7 +14,6 @@ const (
 	// samplingStrategiesFile contains the name of CLI option for config file.
 	samplingStrategiesFile                       = "sampling.strategies-file"
 	samplingStrategiesReloadInterval             = "sampling.strategies-reload-interval"
-	samplingStrategiesBugfix5270                 = "sampling.strategies.bugfix-5270"
 	samplingStrategiesDefaultSamplingProbability = "sampling.default-sampling-probability"
 )
 
@@ -24,10 +23,6 @@ type Options struct {
 	StrategiesFile string
 	// ReloadInterval is the time interval to check and reload sampling strategies file
 	ReloadInterval time.Duration
-	// Flag for enabling possibly breaking change which includes default operations level
-	// strategies when calculating Ratelimiting type service level strategy
-	// more information https://github.com/jaegertracing/jaeger/issues/5270
-	IncludeDefaultOpStrategies bool
 	// DefaultSamplingProbability is the sampling probability used by the Strategy Store for static sampling
 	DefaultSamplingProbability float64
 }
@@ -36,7 +31,6 @@ type Options struct {
 func AddFlags(flagSet *flag.FlagSet) {
 	flagSet.Duration(samplingStrategiesReloadInterval, 0, "Reload interval to check and reload sampling strategies file. Zero value means no reloading")
 	flagSet.String(samplingStrategiesFile, "", "The path for the sampling strategies file in JSON format. See sampling documentation to see format of the file")
-	flagSet.Bool(samplingStrategiesBugfix5270, true, "Include default operation level strategies for Ratesampling type service level strategy. Cf. https://github.com/jaegertracing/jaeger/issues/5270")
 	flagSet.Float64(samplingStrategiesDefaultSamplingProbability, DefaultSamplingProbability, "Sampling probability used by the Strategy Store for static sampling. Value must be between 0 and 1.")
 }
 
@@ -44,7 +38,6 @@ func AddFlags(flagSet *flag.FlagSet) {
 func (opts *Options) InitFromViper(v *viper.Viper) *Options {
 	opts.StrategiesFile = v.GetString(samplingStrategiesFile)
 	opts.ReloadInterval = v.GetDuration(samplingStrategiesReloadInterval)
-	opts.IncludeDefaultOpStrategies = v.GetBool(samplingStrategiesBugfix5270)
 	opts.DefaultSamplingProbability = v.GetFloat64(samplingStrategiesDefaultSamplingProbability)
 	return opts
 }
diff --git a/internal/sampling/samplingstrategy/file/provider.go b/internal/sampling/samplingstrategy/file/provider.go
index 4f9875da..16cea316 100644
--- a/internal/sampling/samplingstrategy/file/provider.go
+++ b/internal/sampling/samplingstrategy/file/provider.go
@@ -66,16 +66,7 @@ func NewProvider(options Options, logger *zap.Logger) (samplingstrategy.Provider
 		h.logger.Info("No sampling strategies found or URL is unavailable, using defaults")
 		return h, nil
 	}
-
-	if !h.options.IncludeDefaultOpStrategies {
-		h.logger.Warn("Default operations level strategies will not be included for Ratelimiting service strategies." +
-			"This behavior will be changed in future releases. " +
-			"Cf. https://github.com/jaegertracing/jaeger/issues/5270")
-		h.parseStrategies_deprecated(strategies)
-	} else {
-		h.parseStrategies(strategies)
-	}
-
+	h.parseStrategies(strategies)
 	if options.ReloadInterval > 0 {
 		go h.autoUpdateStrategies(ctx, loadFn)
 	}
@@ -208,45 +199,6 @@ func loadStrategies(loadFn strategyLoader) (*strategies, error) {
 	return strategies, nil
 }
 
-func (h *samplingProvider) parseStrategies_deprecated(strategies *strategies) {
-	newStore := defaultStrategies(h.options.DefaultSamplingProbability)
-	if strategies.DefaultStrategy != nil {
-		newStore.defaultStrategy = h.parseServiceStrategies(strategies.DefaultStrategy)
-	}
-
-	merge := true
-	if newStore.defaultStrategy.OperationSampling == nil ||
-		newStore.defaultStrategy.OperationSampling.PerOperationStrategies == nil {
-		merge = false
-	}
-
-	for _, s := range strategies.ServiceStrategies {
-		newStore.serviceStrategies[s.Service] = h.parseServiceStrategies(s)
-
-		// Merge with the default operation strategies, because only merging with
-		// the default strategy has no effect on service strategies (the default strategy
-		// is not merged with and only used as a fallback).
-		opS := newStore.serviceStrategies[s.Service].OperationSampling
-		if opS == nil {
-			if newStore.defaultStrategy.OperationSampling == nil ||
-				newStore.serviceStrategies[s.Service].ProbabilisticSampling == nil {
-				continue
-			}
-			// Service has no per-operation strategies, so just reference the default settings and change default samplingRate.
-			newOpS := *newStore.defaultStrategy.OperationSampling
-			newOpS.DefaultSamplingProbability = newStore.serviceStrategies[s.Service].ProbabilisticSampling.SamplingRate
-			newStore.serviceStrategies[s.Service].OperationSampling = &newOpS
-			continue
-		}
-		if merge {
-			opS.PerOperationStrategies = mergePerOperationSamplingStrategies(
-				opS.PerOperationStrategies,
-				newStore.defaultStrategy.OperationSampling.PerOperationStrategies)
-		}
-	}
-	h.storedStrategies.Store(newStore)
-}
-
 func (h *samplingProvider) parseStrategies(strategies *strategies) {
 	newStore := defaultStrategies(h.options.DefaultSamplingProbability)
 	if strategies.DefaultStrategy != nil {
diff --git a/internal/storage/integration/remote_memory_storage.go b/internal/storage/integration/remote_memory_storage.go
index b699df8a..75a0e584 100644
--- a/internal/storage/integration/remote_memory_storage.go
+++ b/internal/storage/integration/remote_memory_storage.go
@@ -19,12 +19,12 @@ import (
 	"google.golang.org/grpc/health/grpc_health_v1"
 
 	"github.com/jaegertracing/jaeger/cmd/remote-storage/app"
+	"github.com/jaegertracing/jaeger/internal/config"
+	"github.com/jaegertracing/jaeger/internal/healthcheck"
 	storage "github.com/jaegertracing/jaeger/internal/storage/v1/factory"
-	"github.com/jaegertracing/jaeger/pkg/config"
-	"github.com/jaegertracing/jaeger/pkg/healthcheck"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 	"github.com/jaegertracing/jaeger/ports"
 )
 
diff --git a/internal/storage/metricstore/prometheus/options.go b/internal/storage/metricstore/prometheus/options.go
index de8ccab0..88e17474 100644
--- a/internal/storage/metricstore/prometheus/options.go
+++ b/internal/storage/metricstore/prometheus/options.go
@@ -11,7 +11,7 @@ import (
 
 	"github.com/spf13/viper"
 
-	"github.com/jaegertracing/jaeger/pkg/config/tlscfg"
+	"github.com/jaegertracing/jaeger/internal/config/tlscfg"
 	"github.com/jaegertracing/jaeger/pkg/prometheus/config"
 )
 
diff --git a/internal/storage/v1/cassandra/factory.go b/internal/storage/v1/cassandra/factory.go
index cc7b3a50..f63f8ddd 100644
--- a/internal/storage/v1/cassandra/factory.go
+++ b/internal/storage/v1/cassandra/factory.go
@@ -15,6 +15,7 @@ import (
 	"go.opentelemetry.io/otel/trace"
 	"go.uber.org/zap"
 
+	"github.com/jaegertracing/jaeger/internal/hostname"
 	cLock "github.com/jaegertracing/jaeger/internal/storage/distributedlock/cassandra"
 	"github.com/jaegertracing/jaeger/internal/storage/v1"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/dependencystore"
@@ -30,7 +31,6 @@ import (
 	"github.com/jaegertracing/jaeger/pkg/cassandra/config"
 	gocqlw "github.com/jaegertracing/jaeger/pkg/cassandra/gocql"
 	"github.com/jaegertracing/jaeger/pkg/distributedlock"
-	"github.com/jaegertracing/jaeger/pkg/hostname"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 )
 
diff --git a/internal/storage/v1/cassandra/options.go b/internal/storage/v1/cassandra/options.go
index 8745c4c8..718b098b 100644
--- a/internal/storage/v1/cassandra/options.go
+++ b/internal/storage/v1/cassandra/options.go
@@ -12,8 +12,8 @@ import (
 
 	"github.com/spf13/viper"
 
+	"github.com/jaegertracing/jaeger/internal/config/tlscfg"
 	"github.com/jaegertracing/jaeger/pkg/cassandra/config"
-	"github.com/jaegertracing/jaeger/pkg/config/tlscfg"
 )
 
 const (
diff --git a/internal/storage/v1/elasticsearch/options.go b/internal/storage/v1/elasticsearch/options.go
index 43c982e3..e0aaf082 100644
--- a/internal/storage/v1/elasticsearch/options.go
+++ b/internal/storage/v1/elasticsearch/options.go
@@ -12,8 +12,8 @@ import (
 
 	"github.com/spf13/viper"
 
+	"github.com/jaegertracing/jaeger/internal/config/tlscfg"
 	"github.com/jaegertracing/jaeger/pkg/bearertoken"
-	"github.com/jaegertracing/jaeger/pkg/config/tlscfg"
 	"github.com/jaegertracing/jaeger/pkg/es/config"
 )
 
diff --git a/internal/storage/v1/elasticsearch/spanstore/core_span_reader.go b/internal/storage/v1/elasticsearch/spanstore/core_span_reader.go
index 8d26e58e..74bf1a5b 100644
--- a/internal/storage/v1/elasticsearch/spanstore/core_span_reader.go
+++ b/internal/storage/v1/elasticsearch/spanstore/core_span_reader.go
@@ -12,13 +12,13 @@ import (
 // CoreSpanReader is a DB-Level abstraction which directly deals with database level operations
 type CoreSpanReader interface {
 	// FindTraceIDs retrieves traces IDs that match the traceQuery
-	FindTraceIDs(ctx context.Context, traceQuery *dbmodel.TraceQueryParameters) ([]dbmodel.TraceID, error)
+	FindTraceIDs(ctx context.Context, traceQuery dbmodel.TraceQueryParameters) ([]dbmodel.TraceID, error)
 	// FindTraces retrieves traces that match the traceQuery
-	FindTraces(ctx context.Context, traceQuery *dbmodel.TraceQueryParameters) ([]*dbmodel.Trace, error)
+	FindTraces(ctx context.Context, traceQuery dbmodel.TraceQueryParameters) ([]dbmodel.Trace, error)
 	// GetOperations returns all operations for a specific service traced by Jaeger
 	GetOperations(ctx context.Context, query dbmodel.OperationQueryParameters) ([]dbmodel.Operation, error)
 	// GetServices returns all services traced by Jaeger, ordered by frequency
 	GetServices(ctx context.Context) ([]string, error)
 	// GetTraces takes a traceID and returns a Trace associated with that traceID
-	GetTraces(ctx context.Context, query []dbmodel.TraceID) ([]*dbmodel.Trace, error)
+	GetTraces(ctx context.Context, query []dbmodel.TraceID) ([]dbmodel.Trace, error)
 }
diff --git a/internal/storage/v1/elasticsearch/spanstore/internal/dbmodel/model.go b/internal/storage/v1/elasticsearch/spanstore/internal/dbmodel/model.go
index ffaff22f..ded848dd 100644
--- a/internal/storage/v1/elasticsearch/spanstore/internal/dbmodel/model.go
+++ b/internal/storage/v1/elasticsearch/spanstore/internal/dbmodel/model.go
@@ -20,7 +20,7 @@ type ValueType string
 
 // Trace is the type of traces
 type Trace struct {
-	Spans []*Span
+	Spans []Span
 }
 
 const (
diff --git a/internal/storage/v1/elasticsearch/spanstore/mocks/CoreSpanReader.go b/internal/storage/v1/elasticsearch/spanstore/mocks/CoreSpanReader.go
index f2a6d187..74ac7e2c 100644
--- a/internal/storage/v1/elasticsearch/spanstore/mocks/CoreSpanReader.go
+++ b/internal/storage/v1/elasticsearch/spanstore/mocks/CoreSpanReader.go
@@ -20,7 +20,7 @@ type CoreSpanReader struct {
 }
 
 // FindTraceIDs provides a mock function with given fields: ctx, traceQuery
-func (_m *CoreSpanReader) FindTraceIDs(ctx context.Context, traceQuery *dbmodel.TraceQueryParameters) ([]dbmodel.TraceID, error) {
+func (_m *CoreSpanReader) FindTraceIDs(ctx context.Context, traceQuery dbmodel.TraceQueryParameters) ([]dbmodel.TraceID, error) {
 	ret := _m.Called(ctx, traceQuery)
 
 	if len(ret) == 0 {
@@ -29,10 +29,10 @@ func (_m *CoreSpanReader) FindTraceIDs(ctx context.Context, traceQuery *dbmodel.
 
 	var r0 []dbmodel.TraceID
 	var r1 error
-	if rf, ok := ret.Get(0).(func(context.Context, *dbmodel.TraceQueryParameters) ([]dbmodel.TraceID, error)); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, dbmodel.TraceQueryParameters) ([]dbmodel.TraceID, error)); ok {
 		return rf(ctx, traceQuery)
 	}
-	if rf, ok := ret.Get(0).(func(context.Context, *dbmodel.TraceQueryParameters) []dbmodel.TraceID); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, dbmodel.TraceQueryParameters) []dbmodel.TraceID); ok {
 		r0 = rf(ctx, traceQuery)
 	} else {
 		if ret.Get(0) != nil {
@@ -40,7 +40,7 @@ func (_m *CoreSpanReader) FindTraceIDs(ctx context.Context, traceQuery *dbmodel.
 		}
 	}
 
-	if rf, ok := ret.Get(1).(func(context.Context, *dbmodel.TraceQueryParameters) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, dbmodel.TraceQueryParameters) error); ok {
 		r1 = rf(ctx, traceQuery)
 	} else {
 		r1 = ret.Error(1)
@@ -50,27 +50,27 @@ func (_m *CoreSpanReader) FindTraceIDs(ctx context.Context, traceQuery *dbmodel.
 }
 
 // FindTraces provides a mock function with given fields: ctx, traceQuery
-func (_m *CoreSpanReader) FindTraces(ctx context.Context, traceQuery *dbmodel.TraceQueryParameters) ([]*dbmodel.Trace, error) {
+func (_m *CoreSpanReader) FindTraces(ctx context.Context, traceQuery dbmodel.TraceQueryParameters) ([]dbmodel.Trace, error) {
 	ret := _m.Called(ctx, traceQuery)
 
 	if len(ret) == 0 {
 		panic("no return value specified for FindTraces")
 	}
 
-	var r0 []*dbmodel.Trace
+	var r0 []dbmodel.Trace
 	var r1 error
-	if rf, ok := ret.Get(0).(func(context.Context, *dbmodel.TraceQueryParameters) ([]*dbmodel.Trace, error)); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, dbmodel.TraceQueryParameters) ([]dbmodel.Trace, error)); ok {
 		return rf(ctx, traceQuery)
 	}
-	if rf, ok := ret.Get(0).(func(context.Context, *dbmodel.TraceQueryParameters) []*dbmodel.Trace); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, dbmodel.TraceQueryParameters) []dbmodel.Trace); ok {
 		r0 = rf(ctx, traceQuery)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).([]*dbmodel.Trace)
+			r0 = ret.Get(0).([]dbmodel.Trace)
 		}
 	}
 
-	if rf, ok := ret.Get(1).(func(context.Context, *dbmodel.TraceQueryParameters) error); ok {
+	if rf, ok := ret.Get(1).(func(context.Context, dbmodel.TraceQueryParameters) error); ok {
 		r1 = rf(ctx, traceQuery)
 	} else {
 		r1 = ret.Error(1)
@@ -140,23 +140,23 @@ func (_m *CoreSpanReader) GetServices(ctx context.Context) ([]string, error) {
 }
 
 // GetTraces provides a mock function with given fields: ctx, query
-func (_m *CoreSpanReader) GetTraces(ctx context.Context, query []dbmodel.TraceID) ([]*dbmodel.Trace, error) {
+func (_m *CoreSpanReader) GetTraces(ctx context.Context, query []dbmodel.TraceID) ([]dbmodel.Trace, error) {
 	ret := _m.Called(ctx, query)
 
 	if len(ret) == 0 {
 		panic("no return value specified for GetTraces")
 	}
 
-	var r0 []*dbmodel.Trace
+	var r0 []dbmodel.Trace
 	var r1 error
-	if rf, ok := ret.Get(0).(func(context.Context, []dbmodel.TraceID) ([]*dbmodel.Trace, error)); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, []dbmodel.TraceID) ([]dbmodel.Trace, error)); ok {
 		return rf(ctx, query)
 	}
-	if rf, ok := ret.Get(0).(func(context.Context, []dbmodel.TraceID) []*dbmodel.Trace); ok {
+	if rf, ok := ret.Get(0).(func(context.Context, []dbmodel.TraceID) []dbmodel.Trace); ok {
 		r0 = rf(ctx, query)
 	} else {
 		if ret.Get(0) != nil {
-			r0 = ret.Get(0).([]*dbmodel.Trace)
+			r0 = ret.Get(0).([]dbmodel.Trace)
 		}
 	}
 
diff --git a/internal/storage/v1/elasticsearch/spanstore/reader.go b/internal/storage/v1/elasticsearch/spanstore/reader.go
index 86e2ccb4..09dbe46b 100644
--- a/internal/storage/v1/elasticsearch/spanstore/reader.go
+++ b/internal/storage/v1/elasticsearch/spanstore/reader.go
@@ -237,7 +237,7 @@ func timeRangeIndices(indexName, indexDateLayout string, startTime time.Time, en
 }
 
 // GetTraces takes a traceID and returns a Trace associated with that traceID
-func (s *SpanReader) GetTraces(ctx context.Context, query []dbmodel.TraceID) ([]*dbmodel.Trace, error) {
+func (s *SpanReader) GetTraces(ctx context.Context, query []dbmodel.TraceID) ([]dbmodel.Trace, error) {
 	ctx, span := s.tracer.Start(ctx, "GetTrace")
 	defer span.End()
 	currentTime := time.Now()
@@ -245,8 +245,8 @@ func (s *SpanReader) GetTraces(ctx context.Context, query []dbmodel.TraceID) ([]
 	return s.multiRead(ctx, query, currentTime.Add(-s.maxSpanAge), currentTime)
 }
 
-func (s *SpanReader) collectSpans(esSpansRaw []*elastic.SearchHit) ([]*dbmodel.Span, error) {
-	spans := make([]*dbmodel.Span, len(esSpansRaw))
+func (s *SpanReader) collectSpans(esSpansRaw []*elastic.SearchHit) ([]dbmodel.Span, error) {
+	spans := make([]dbmodel.Span, len(esSpansRaw))
 
 	for i, esSpanRaw := range esSpansRaw {
 		jsonSpan, err := s.unmarshalJSONSpan(esSpanRaw)
@@ -258,7 +258,7 @@ func (s *SpanReader) collectSpans(esSpansRaw []*elastic.SearchHit) ([]*dbmodel.S
 	return spans, nil
 }
 
-func (*SpanReader) unmarshalJSONSpan(esSpanRaw *elastic.SearchHit) (*dbmodel.Span, error) {
+func (*SpanReader) unmarshalJSONSpan(esSpanRaw *elastic.SearchHit) (dbmodel.Span, error) {
 	esSpanInByteArray := esSpanRaw.Source
 
 	var jsonSpan dbmodel.Span
@@ -266,9 +266,9 @@ func (*SpanReader) unmarshalJSONSpan(esSpanRaw *elastic.SearchHit) (*dbmodel.Spa
 	d := json.NewDecoder(bytes.NewReader(*esSpanInByteArray))
 	d.UseNumber()
 	if err := d.Decode(&jsonSpan); err != nil {
-		return nil, err
+		return dbmodel.Span{}, err
 	}
-	return &jsonSpan, nil
+	return jsonSpan, nil
 }
 
 // GetServices returns all services traced by Jaeger, ordered by frequency
@@ -330,7 +330,7 @@ func bucketToStringArray[T ~string](buckets []*elastic.AggregationBucketKeyItem)
 }
 
 // FindTraces retrieves traces that match the traceQuery
-func (s *SpanReader) FindTraces(ctx context.Context, traceQuery *dbmodel.TraceQueryParameters) ([]*dbmodel.Trace, error) {
+func (s *SpanReader) FindTraces(ctx context.Context, traceQuery dbmodel.TraceQueryParameters) ([]dbmodel.Trace, error) {
 	ctx, span := s.tracer.Start(ctx, "FindTraces")
 	defer span.End()
 
@@ -342,7 +342,7 @@ func (s *SpanReader) FindTraces(ctx context.Context, traceQuery *dbmodel.TraceQu
 }
 
 // FindTraceIDs retrieves traces IDs that match the traceQuery
-func (s *SpanReader) FindTraceIDs(ctx context.Context, traceQuery *dbmodel.TraceQueryParameters) ([]dbmodel.TraceID, error) {
+func (s *SpanReader) FindTraceIDs(ctx context.Context, traceQuery dbmodel.TraceQueryParameters) ([]dbmodel.TraceID, error) {
 	ctx, span := s.tracer.Start(ctx, "FindTraceIDs")
 	defer span.End()
 
@@ -361,7 +361,7 @@ func (s *SpanReader) FindTraceIDs(ctx context.Context, traceQuery *dbmodel.Trace
 	return esTraceIDs, nil
 }
 
-func (s *SpanReader) multiRead(ctx context.Context, traceIDs []dbmodel.TraceID, startTime, endTime time.Time) ([]*dbmodel.Trace, error) {
+func (s *SpanReader) multiRead(ctx context.Context, traceIDs []dbmodel.TraceID, startTime, endTime time.Time) ([]dbmodel.Trace, error) {
 	ctx, childSpan := s.tracer.Start(ctx, "multiRead")
 	defer childSpan.End()
 
@@ -373,8 +373,10 @@ func (s *SpanReader) multiRead(ctx context.Context, traceIDs []dbmodel.TraceID,
 		childSpan.SetAttributes(attribute.Key("trace_ids").StringSlice(tracesIDs))
 	}
 
+	traces := make([]dbmodel.Trace, 0, len(traceIDs))
+
 	if len(traceIDs) == 0 {
-		return []*dbmodel.Trace{}, nil
+		return traces, nil
 	}
 
 	// Add an hour in both directions so that traces that straddle two indexes are retrieved.
@@ -441,7 +443,8 @@ func (s *SpanReader) multiRead(ctx context.Context, traceIDs []dbmodel.TraceID,
 			if traceSpan, ok := tracesMap[lastSpan.TraceID]; ok {
 				traceSpan.Spans = append(traceSpan.Spans, spans...)
 			} else {
-				tracesMap[lastSpan.TraceID] = &dbmodel.Trace{Spans: spans}
+				traces = append(traces, dbmodel.Trace{Spans: spans})
+				tracesMap[lastSpan.TraceID] = &traces[len(traces)-1]
 			}
 
 			totalDocumentsFetched[lastSpan.TraceID] += len(result.Hits.Hits)
@@ -451,11 +454,6 @@ func (s *SpanReader) multiRead(ctx context.Context, traceIDs []dbmodel.TraceID,
 			}
 		}
 	}
-
-	var traces []*dbmodel.Trace
-	for _, t := range tracesMap {
-		traces = append(traces, t)
-	}
 	return traces, nil
 }
 
@@ -472,10 +470,7 @@ func buildTraceByIDQuery(traceID dbmodel.TraceID) elastic.Query {
 		elastic.NewTermQuery(traceIDField, legacyTraceID))
 }
 
-func validateQuery(p *dbmodel.TraceQueryParameters) error {
-	if p == nil {
-		return ErrMalformedRequestObject
-	}
+func validateQuery(p dbmodel.TraceQueryParameters) error {
 	if p.ServiceName == "" && len(p.Tags) > 0 {
 		return ErrServiceNameNotSet
 	}
@@ -491,7 +486,7 @@ func validateQuery(p *dbmodel.TraceQueryParameters) error {
 	return nil
 }
 
-func (s *SpanReader) findTraceIDs(ctx context.Context, traceQuery *dbmodel.TraceQueryParameters) ([]dbmodel.TraceID, error) {
+func (s *SpanReader) findTraceIDs(ctx context.Context, traceQuery dbmodel.TraceQueryParameters) ([]dbmodel.TraceID, error) {
 	ctx, childSpan := s.tracer.Start(ctx, "findTraceIDs")
 	defer childSpan.End()
 	//  Below is the JSON body to our HTTP GET request to ElasticSearch. This function creates this.
@@ -594,7 +589,7 @@ func (*SpanReader) buildTraceIDSubAggregation() elastic.Aggregation {
 		Field(startTimeField)
 }
 
-func (s *SpanReader) buildFindTraceIDsQuery(traceQuery *dbmodel.TraceQueryParameters) elastic.Query {
+func (s *SpanReader) buildFindTraceIDsQuery(traceQuery dbmodel.TraceQueryParameters) elastic.Query {
 	boolQuery := elastic.NewBoolQuery()
 
 	// add duration query
diff --git a/internal/storage/v1/elasticsearch/spanstore/readerv1.go b/internal/storage/v1/elasticsearch/spanstore/readerv1.go
index 1157a56d..289bf960 100644
--- a/internal/storage/v1/elasticsearch/spanstore/readerv1.go
+++ b/internal/storage/v1/elasticsearch/spanstore/readerv1.go
@@ -44,10 +44,10 @@ func (s *SpanReaderV1) GetTrace(ctx context.Context, query spanstore.GetTracePar
 	return &model.Trace{Spans: spans}, nil
 }
 
-func (s *SpanReaderV1) collectSpans(dbSpans []*dbmodel.Span) ([]*model.Span, error) {
+func (s *SpanReaderV1) collectSpans(dbSpans []dbmodel.Span) ([]*model.Span, error) {
 	spans := make([]*model.Span, len(dbSpans))
-	for i, jsonSpan := range dbSpans {
-		span, err := s.spanConverter.SpanToDomain(jsonSpan)
+	for i := range dbSpans {
+		span, err := s.spanConverter.SpanToDomain(&dbSpans[i])
 		if err != nil {
 			return nil, fmt.Errorf("converting ES dbSpan to domain Span failed: %w", err)
 		}
@@ -111,8 +111,8 @@ func (s *SpanReaderV1) FindTraceIDs(ctx context.Context, traceQuery *spanstore.T
 	return toModelTraceIDs(ids)
 }
 
-func toDbQueryParams(p *spanstore.TraceQueryParameters) *dbmodel.TraceQueryParameters {
-	return &dbmodel.TraceQueryParameters{
+func toDbQueryParams(p *spanstore.TraceQueryParameters) dbmodel.TraceQueryParameters {
+	return dbmodel.TraceQueryParameters{
 		ServiceName:   p.ServiceName,
 		OperationName: p.OperationName,
 		Tags:          p.Tags,
diff --git a/internal/storage/v1/grpc/config.go b/internal/storage/v1/grpc/config.go
index c98976d7..287bd138 100644
--- a/internal/storage/v1/grpc/config.go
+++ b/internal/storage/v1/grpc/config.go
@@ -8,7 +8,7 @@ import (
 	"go.opentelemetry.io/collector/exporter/exporterhelper"
 
 	"github.com/jaegertracing/jaeger/internal/storage/v1/grpc/shared"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 )
 
 // Config describes the options to customize the storage behavior
diff --git a/internal/storage/v1/grpc/factory.go b/internal/storage/v1/grpc/factory.go
index b699e772..88e2854f 100644
--- a/internal/storage/v1/grpc/factory.go
+++ b/internal/storage/v1/grpc/factory.go
@@ -26,10 +26,10 @@ import (
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore/spanstoremetrics"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/grpc/shared"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/bearertoken"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 )
 
 var ( // interface comformance checks
diff --git a/internal/storage/v1/grpc/options.go b/internal/storage/v1/grpc/options.go
index 747e4a92..201391a7 100644
--- a/internal/storage/v1/grpc/options.go
+++ b/internal/storage/v1/grpc/options.go
@@ -10,8 +10,8 @@ import (
 
 	"github.com/spf13/viper"
 
-	"github.com/jaegertracing/jaeger/pkg/config/tlscfg"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
+	"github.com/jaegertracing/jaeger/internal/config/tlscfg"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 )
 
 const (
diff --git a/internal/storage/v1/kafka/unmarshaller.go b/internal/storage/v1/kafka/unmarshaller.go
index 2f678bc2..022be041 100644
--- a/internal/storage/v1/kafka/unmarshaller.go
+++ b/internal/storage/v1/kafka/unmarshaller.go
@@ -9,9 +9,9 @@ import (
 
 	"github.com/gogo/protobuf/jsonpb"
 	"github.com/gogo/protobuf/proto"
+	zipkin "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin/zipkinthriftconverter"
 
 	"github.com/jaegertracing/jaeger-idl/model/v1"
-	"github.com/jaegertracing/jaeger/model/converter/thrift/zipkin"
 )
 
 // Unmarshaller decodes a byte array to a span
diff --git a/internal/storage/v1/memory/memory.go b/internal/storage/v1/memory/memory.go
index 53e2d042..93d468af 100644
--- a/internal/storage/v1/memory/memory.go
+++ b/internal/storage/v1/memory/memory.go
@@ -15,8 +15,8 @@ import (
 
 	"github.com/jaegertracing/jaeger-idl/model/v1"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/model/adjuster"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 )
 
 // Store is an in-memory store of traces
diff --git a/internal/storage/v2/api/tracestore/reader.go b/internal/storage/v2/api/tracestore/reader.go
index 8f0cdc54..070fb0c2 100644
--- a/internal/storage/v2/api/tracestore/reader.go
+++ b/internal/storage/v2/api/tracestore/reader.go
@@ -83,12 +83,13 @@ type GetTraceParams struct {
 type TraceQueryParams struct {
 	ServiceName   string
 	OperationName string
-	Attributes    pcommon.Map
-	StartTimeMin  time.Time
-	StartTimeMax  time.Time
-	DurationMin   time.Duration
-	DurationMax   time.Duration
-	SearchDepth   int
+	// Attributes must initialized with pcommon.NewMap() before use.
+	Attributes   pcommon.Map
+	StartTimeMin time.Time
+	StartTimeMax time.Time
+	DurationMin  time.Duration
+	DurationMax  time.Duration
+	SearchDepth  int
 }
 
 // FoundTraceID is a wrapper around trace ID returned from FindTraceIDs
diff --git a/internal/storage/v2/grpc/tracereader.go b/internal/storage/v2/grpc/tracereader.go
index 9673673d..92d460bc 100644
--- a/internal/storage/v2/grpc/tracereader.go
+++ b/internal/storage/v2/grpc/tracereader.go
@@ -8,6 +8,7 @@ import (
 	"fmt"
 	"iter"
 
+	"go.opentelemetry.io/collector/pdata/pcommon"
 	"go.opentelemetry.io/collector/pdata/ptrace"
 	"google.golang.org/grpc"
 
@@ -73,9 +74,114 @@ func (*TraceReader) FindTraces(
 	panic("not implemented")
 }
 
-func (*TraceReader) FindTraceIDs(
-	context.Context,
-	tracestore.TraceQueryParams,
+func (tr *TraceReader) FindTraceIDs(
+	ctx context.Context,
+	params tracestore.TraceQueryParams,
 ) iter.Seq2[[]tracestore.FoundTraceID, error] {
-	panic("not implemented")
+	return func(yield func([]tracestore.FoundTraceID, error) bool) {
+		resp, err := tr.client.FindTraceIDs(ctx, &storage.FindTracesRequest{
+			Query: toProtoQueryParameters(params),
+		})
+		if err != nil {
+			yield(nil, fmt.Errorf("failed to execute FindTraceIDs: %w", err))
+			return
+		}
+		foundTraceIDs := make([]tracestore.FoundTraceID, len(resp.TraceIds))
+		for i, foundTraceID := range resp.TraceIds {
+			var sizedTraceID [16]byte
+			copy(sizedTraceID[:], foundTraceID.TraceId)
+
+			foundTraceIDs[i] = tracestore.FoundTraceID{
+				TraceID: pcommon.TraceID(sizedTraceID),
+				Start:   foundTraceID.Start,
+				End:     foundTraceID.End,
+			}
+		}
+		yield(foundTraceIDs, nil)
+	}
+}
+
+func toProtoQueryParameters(t tracestore.TraceQueryParams) *storage.TraceQueryParameters {
+	return &storage.TraceQueryParameters{
+		ServiceName:   t.ServiceName,
+		OperationName: t.OperationName,
+		Attributes:    convertMapToKeyValueList(t.Attributes),
+		StartTimeMin:  t.StartTimeMin,
+		StartTimeMax:  t.StartTimeMax,
+		DurationMin:   t.DurationMin,
+		DurationMax:   t.DurationMax,
+		SearchDepth:   int32(t.SearchDepth), //nolint: gosec // G115
+	}
+}
+
+func convertMapToKeyValueList(m pcommon.Map) []*storage.KeyValue {
+	keyValues := make([]*storage.KeyValue, 0, m.Len())
+	m.Range(func(k string, v pcommon.Value) bool {
+		keyValues = append(keyValues, &storage.KeyValue{
+			Key:   k,
+			Value: convertValueToAnyValue(v),
+		})
+		return true
+	})
+	return keyValues
+}
+
+func convertValueToAnyValue(v pcommon.Value) *storage.AnyValue {
+	switch v.Type() {
+	case pcommon.ValueTypeStr:
+		return &storage.AnyValue{
+			Value: &storage.AnyValue_StringValue{
+				StringValue: v.Str(),
+			},
+		}
+	case pcommon.ValueTypeBool:
+		return &storage.AnyValue{
+			Value: &storage.AnyValue_BoolValue{
+				BoolValue: v.Bool(),
+			},
+		}
+	case pcommon.ValueTypeInt:
+		return &storage.AnyValue{
+			Value: &storage.AnyValue_IntValue{
+				IntValue: v.Int(),
+			},
+		}
+	case pcommon.ValueTypeDouble:
+		return &storage.AnyValue{
+			Value: &storage.AnyValue_DoubleValue{
+				DoubleValue: v.Double(),
+			},
+		}
+	case pcommon.ValueTypeBytes:
+		return &storage.AnyValue{
+			Value: &storage.AnyValue_BytesValue{
+				BytesValue: v.Bytes().AsRaw(),
+			},
+		}
+	case pcommon.ValueTypeSlice:
+		arr := v.Slice()
+		arrayValues := make([]*storage.AnyValue, 0, arr.Len())
+		for i := 0; i < arr.Len(); i++ {
+			arrayValues = append(arrayValues, convertValueToAnyValue(arr.At(i)))
+		}
+		return &storage.AnyValue{
+			Value: &storage.AnyValue_ArrayValue{
+				ArrayValue: &storage.ArrayValue{
+					Values: arrayValues,
+				},
+			},
+		}
+	case pcommon.ValueTypeMap:
+		kvList := &storage.KeyValueList{}
+		v.Map().Range(func(k string, val pcommon.Value) bool {
+			kvList.Values = append(kvList.Values, &storage.KeyValue{
+				Key:   k,
+				Value: convertValueToAnyValue(val),
+			})
+			return true
+		})
+		return &storage.AnyValue{Value: &storage.AnyValue_KvlistValue{KvlistValue: kvList}}
+	default:
+		return nil
+	}
 }
diff --git a/pkg/tenancy/context.go b/internal/tenancy/context.go
similarity index 100%
rename from pkg/tenancy/context.go
rename to internal/tenancy/context.go
diff --git a/pkg/tenancy/flags.go b/internal/tenancy/flags.go
similarity index 100%
rename from pkg/tenancy/flags.go
rename to internal/tenancy/flags.go
diff --git a/pkg/tenancy/grpc.go b/internal/tenancy/grpc.go
similarity index 100%
rename from pkg/tenancy/grpc.go
rename to internal/tenancy/grpc.go
diff --git a/pkg/tenancy/http.go b/internal/tenancy/http.go
similarity index 100%
rename from pkg/tenancy/http.go
rename to internal/tenancy/http.go
diff --git a/pkg/tenancy/manager.go b/internal/tenancy/manager.go
similarity index 100%
rename from pkg/tenancy/manager.go
rename to internal/tenancy/manager.go
diff --git a/model/converter/thrift/zipkin/deserialize.go b/model/converter/thrift/zipkin/deserialize.go
deleted file mode 100644
index 931bc314..00000000
--- a/model/converter/thrift/zipkin/deserialize.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2018 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package zipkin
-
-import (
-	"context"
-
-	"github.com/apache/thrift/lib/go/thrift"
-
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-)
-
-// SerializeThrift is only used in tests.
-func SerializeThrift(ctx context.Context, spans []*zipkincore.Span) []byte {
-	t := thrift.NewTMemoryBuffer()
-	p := thrift.NewTBinaryProtocolConf(t, &thrift.TConfiguration{})
-	p.WriteListBegin(ctx, thrift.STRUCT, len(spans))
-	for _, s := range spans {
-		s.Write(ctx, p)
-	}
-	p.WriteListEnd(ctx)
-	return t.Buffer.Bytes()
-}
-
-// DeserializeThrift decodes Thrift bytes to a list of spans.
-func DeserializeThrift(ctx context.Context, b []byte) ([]*zipkincore.Span, error) {
-	buffer := thrift.NewTMemoryBuffer()
-	buffer.Write(b)
-
-	transport := thrift.NewTBinaryProtocolConf(buffer, &thrift.TConfiguration{})
-	_, size, err := transport.ReadListBegin(ctx) // Ignore the returned element type
-	if err != nil {
-		return nil, err
-	}
-
-	// We don't depend on the size returned by ReadListBegin to preallocate the array because it
-	// sometimes returns a nil error on bad input and provides an unreasonably large int for size
-	var spans []*zipkincore.Span
-	for i := 0; i < size; i++ {
-		zs := &zipkincore.Span{}
-		if err = zs.Read(ctx, transport); err != nil {
-			return nil, err
-		}
-		spans = append(spans, zs)
-	}
-
-	return spans, nil
-}
diff --git a/model/converter/thrift/zipkin/doc.go b/model/converter/thrift/zipkin/doc.go
deleted file mode 100644
index 4f47098f..00000000
--- a/model/converter/thrift/zipkin/doc.go
+++ /dev/null
@@ -1,6 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-// Package zipkin allows converting model.Trace to/from zipkin.thrift model.
-package zipkin
diff --git a/model/converter/thrift/zipkin/fixtures/domain_01.json b/model/converter/thrift/zipkin/fixtures/domain_01.json
deleted file mode 100644
index 0efa12f2..00000000
--- a/model/converter/thrift/zipkin/fixtures/domain_01.json
+++ /dev/null
@@ -1,102 +0,0 @@
-{
-  "spans": [
-    {
-      "traceId": "AAAAAAAAAAAAAAAAAAAAAQ==",
-      "spanId": "AAAAAAAAAAI=",
-      "operationName": "test-general-conversion",
-      "startTime": "2017-01-26T16:46:31.639875-05:00",
-      "process": {
-        "serviceName": "service-x"
-      },
-      "logs": [
-        {
-          "timestamp": "1970-01-01T00:00:00-00:00",
-          "fields": [
-            {
-              "key": "event",
-              "vStr": "some-event"
-            }
-          ]
-        },
-        {
-          "timestamp": "2017-01-26T16:46:31.639875-05:00",
-          "fields": [
-            {
-              "key": "x",
-              "vStr": "y"
-            }
-          ]
-        }
-      ]
-    },
-    {
-      "traceId": "AAAAAAAAAAAAAAAAAAAAAQ==",
-      "spanId": "AAAAAAAAAAI=",
-      "operationName": "some-operation",
-      "startTime": "1970-01-01T00:00:00-00:00",
-      "tags": [
-        {
-          "key": "peer.service",
-          "vType": "STRING",
-          "vStr": "service-y"
-        },
-        {
-          "key": "peer.ipv4",
-          "vType": "INT64",
-          "vInt64": 23456
-        },
-        {
-          "key": "peer.port",
-          "vType": "INT64",
-          "vInt64": 80
-        },
-        {
-          "key": "span.kind",
-          "vType": "STRING",
-          "vStr": "client"
-        }
-      ],
-      "process": {
-        "serviceName": "service-x"
-      }
-    },
-    {
-      "traceId": "AAAAAAAAAAIAAAAAAAAAAQ==",
-      "spanId": "AAAAAAAAAAM=",
-      "operationName": "some-operation",
-      "references": [
-        {
-          "refType": "CHILD_OF",
-          "traceId": "AAAAAAAAAAIAAAAAAAAAAQ==",
-          "spanId": "AAAAAAAAAAI="
-        }
-      ],
-      "startTime": "1970-01-01T00:00:00-00:00",
-      "tags": [
-        {
-          "key": "peer.service",
-          "vType": "STRING",
-          "vStr": "service-x"
-        },
-        {
-          "key": "peer.ipv4",
-          "vType": "INT64",
-          "vInt64": 23456
-        },
-        {
-          "key": "peer.ipv6",
-          "vType": "BINARY",
-          "vBinary": "MjAwMTpkYjg6OmMwMDE="
-        },
-        {
-          "key": "span.kind",
-          "vType": "STRING",
-          "vStr": "server"
-        }
-      ],
-      "process": {
-        "serviceName": "service-y"
-      }
-    }
-  ]
-}
diff --git a/model/converter/thrift/zipkin/fixtures/domain_02.json b/model/converter/thrift/zipkin/fixtures/domain_02.json
deleted file mode 100644
index 2a20e96b..00000000
--- a/model/converter/thrift/zipkin/fixtures/domain_02.json
+++ /dev/null
@@ -1,34 +0,0 @@
-{
-  "spans": [
-    {
-      "traceId": "AAAAAAAAAAAAAAAAAAAAAQ==",
-      "spanId": "AAAAAAAAAAI=",
-      "operationName": "test-process-tags",
-      "startTime": "1970-01-01T00:00:00-00:00",
-      "process": {
-        "serviceName": "service-x",
-        "tags": [
-          {
-            "key": "hostname",
-            "vStr": "some-host.com"
-          },
-          {
-            "key": "ip",
-            "vType": "INT64",
-            "vInt64": 12345
-          },
-          {
-            "key": "jaeger.version",
-            "vStr": "Go-1.1"
-          }
-        ]
-      },
-      "tags": [
-        {
-          "key": "component",
-          "vStr": "some-component"
-        }
-      ]
-    }
-  ]
-}
diff --git a/model/converter/thrift/zipkin/fixtures/domain_03.json b/model/converter/thrift/zipkin/fixtures/domain_03.json
deleted file mode 100644
index 6a543ba6..00000000
--- a/model/converter/thrift/zipkin/fixtures/domain_03.json
+++ /dev/null
@@ -1,71 +0,0 @@
-{
-  "spans": [
-    {
-      "traceId": "AAAAAAAAAAAAAAAAAAAAAQ==",
-      "spanId": "AAAAAAAAAAI=",
-      "flags": 2,
-      "operationName": "test-custom-tags",
-      "startTime": "1970-01-01T00:00:00-00:00",
-      "duration": "5000ns",
-      "process": {
-        "serviceName": "service-x"
-      },
-      "tags": [
-          {
-            "key": "bool",
-            "vType": "BOOL",
-            "vBool": true
-          },
-          {
-            "key": "bytes",
-            "vType": "BINARY",
-            "vBinary": "c29tZS1ob3N0LmNvbQ=="
-          },
-          {
-            "key": "i16",
-            "vType": "INT64",
-            "vInt64": 12345
-          },
-          {
-            "key": "i16_bad_value",
-            "vStr": "Cannot parse Zipkin value AQ==: unexpected EOF"
-          },
-          {
-            "key": "i32",
-            "vType": "INT64",
-            "vInt64": 12345
-          },
-          {
-            "key": "i32_bad_value",
-            "vStr": "Cannot parse Zipkin value AQ==: unexpected EOF"
-          },
-          {
-            "key": "i64",
-            "vType": "INT64",
-            "vInt64": 12345
-          },
-          {
-            "key": "i64_bad_value",
-            "vStr": "Cannot parse Zipkin value AQ==: unexpected EOF"
-          },
-          {
-            "key": "double",
-            "vType": "FLOAT64",
-            "vFloat64": 12345
-          },
-          {
-            "key": "double_bad_value",
-            "vStr": "Cannot parse Zipkin value AQ==: unexpected EOF"
-          },
-          {
-            "key": "string",
-            "vStr": "some-host.com"
-          },
-          {
-            "key": "span.kind",
-            "vStr": "server"
-          }
-      ]
-    }
-  ]
-}
diff --git a/model/converter/thrift/zipkin/fixtures/zipkin_01.json b/model/converter/thrift/zipkin/fixtures/zipkin_01.json
deleted file mode 100644
index eb7fed78..00000000
--- a/model/converter/thrift/zipkin/fixtures/zipkin_01.json
+++ /dev/null
@@ -1,76 +0,0 @@
-[
-  {
-    "trace_id": 1,
-    "id": 2,
-    "name": "test-general-conversion",
-    "timestamp": 1485467191639875,
-    "annotations": [
-      {
-        "value": "some-event",
-        "host": {
-          "service_name": "service-x"
-        }
-      },
-      {
-        "value": ""
-      },
-      {
-        "timestamp": 1485467191639875,
-        "value": "{\"x\":\"y\"}"
-      }
-    ],
-    "binary_annotations": [
-        {
-            "key": "ca"
-        }
-    ]
-  },
-  {
-    "trace_id": 1,
-    "id": 2,
-    "name": "some-operation",
-    "annotations": [
-      {
-        "value": "cs",
-        "host": {
-          "service_name": "service-x"
-        }
-      }
-    ],
-    "binary_annotations": [
-        {
-            "key": "sa",
-            "host": {
-                "service_name": "service-y",
-                "ipv4": 23456,
-                "port": 80
-            }
-        }
-    ]
-  },
-  {
-    "trace_id": 1,
-    "id": 3,
-    "parent_id": 2,
-    "name": "some-operation",
-    "trace_id_high": 2,
-    "annotations": [
-      {
-        "value": "sr",
-        "host": {
-          "service_name": "service-y"
-        }
-      }
-    ],
-    "binary_annotations": [
-        {
-            "key": "ca",
-            "host": {
-                "service_name": "service-x",
-                "ipv4": 23456,
-                "ipv6": "MjAwMTpkYjg6OmMwMDE="
-            }
-        }
-    ]
-  }
-]
diff --git a/model/converter/thrift/zipkin/fixtures/zipkin_02.json b/model/converter/thrift/zipkin/fixtures/zipkin_02.json
deleted file mode 100644
index 56db82b9..00000000
--- a/model/converter/thrift/zipkin/fixtures/zipkin_02.json
+++ /dev/null
@@ -1,28 +0,0 @@
-[
-  {
-    "trace_id": 1,
-    "id": 2,
-    "name": "test-process-tags",
-    "binary_annotations": [
-      {
-        "key": "lc",
-        "value": "c29tZS1jb21wb25lbnQ=",
-        "annotation_type": "STRING",
-        "host": {
-          "service_name": "service-x",
-          "ipv4": 12345
-        }
-      },
-      {
-        "key": "jaegerClient",
-        "value": "R28tMS4x",
-        "annotation_type": "STRING"
-      },
-      {
-        "key": "jaeger.hostname",
-        "value": "c29tZS1ob3N0LmNvbQ==",
-        "annotation_type": "STRING"
-      }
-    ]
-  }
-]
diff --git a/model/converter/thrift/zipkin/fixtures/zipkin_03.json b/model/converter/thrift/zipkin/fixtures/zipkin_03.json
deleted file mode 100644
index 6aed61d2..00000000
--- a/model/converter/thrift/zipkin/fixtures/zipkin_03.json
+++ /dev/null
@@ -1,74 +0,0 @@
-[
-  {
-    "trace_id": 1,
-    "id": 2,
-    "debug": true,
-    "name": "test-custom-tags",
-    "duration": 5,
-    "annotations": [
-      {
-        "value": "sr",
-        "host": {
-          "service_name": "service-x"
-        }
-      }
-    ],
-    "binary_annotations": [
-      {
-        "key": "bool",
-        "value": "AQ==",
-        "annotation_type": "BOOL"
-      },
-      {
-        "key": "bytes",
-        "value": "c29tZS1ob3N0LmNvbQ==",
-        "annotation_type": "BYTES"
-      },
-      {
-        "key": "i16",
-        "value": "MDk=",
-        "annotation_type": "I16"
-      },
-      {
-        "key": "i16_bad_value",
-        "value": "AQ==",
-        "annotation_type": "I16"
-      },
-      {
-        "key": "i32",
-        "value": "AAAwOQ==",
-        "annotation_type": "I32"
-      },
-      {
-        "key": "i32_bad_value",
-        "value": "AQ==",
-        "annotation_type": "I32"
-      },
-      {
-        "key": "i64",
-        "value": "AAAAAAAAMDk=",
-        "annotation_type": "I64"
-      },
-      {
-        "key": "i64_bad_value",
-        "value": "AQ==",
-        "annotation_type": "I64"
-      },
-      {
-        "key": "double",
-        "value": "QMgcgAAAAAA=",
-        "annotation_type": "DOUBLE"
-      },
-      {
-        "key": "double_bad_value",
-        "value": "AQ==",
-        "annotation_type": "DOUBLE"
-      },
-      {
-        "key": "string",
-        "value": "c29tZS1ob3N0LmNvbQ==",
-        "annotation_type": "STRING"
-      }
-    ]
-  }
-]
diff --git a/model/converter/thrift/zipkin/process_hashtable.go b/model/converter/thrift/zipkin/process_hashtable.go
deleted file mode 100644
index 5de1a695..00000000
--- a/model/converter/thrift/zipkin/process_hashtable.go
+++ /dev/null
@@ -1,46 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package zipkin
-
-import (
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-type processHashtable struct {
-	processes map[uint64][]*model.Process
-	extHash   func(*model.Process) uint64
-}
-
-func newProcessHashtable() *processHashtable {
-	processes := make(map[uint64][]*model.Process)
-	return &processHashtable{processes: processes}
-}
-
-func (ph processHashtable) hash(process *model.Process) uint64 {
-	if ph.extHash != nil {
-		// for testing collisions
-		return ph.extHash(process)
-	}
-	hc, _ := model.HashCode(process)
-	return hc
-}
-
-// add checks if identical Process already exists in the hash table and returns it.
-// Otherwise it adds process to the table and returns it.
-func (ph processHashtable) add(process *model.Process) *model.Process {
-	hash := ph.hash(process)
-	if pp, ok := ph.processes[hash]; ok {
-		for _, p := range pp {
-			if p.Equal(process) {
-				return p // reuse existing Process object
-			}
-		}
-		pp = append(pp, process)
-		ph.processes[hash] = pp
-	} else {
-		ph.processes[hash] = []*model.Process{process}
-	}
-	return process
-}
diff --git a/model/converter/thrift/zipkin/to_domain.go b/model/converter/thrift/zipkin/to_domain.go
deleted file mode 100644
index 970f5732..00000000
--- a/model/converter/thrift/zipkin/to_domain.go
+++ /dev/null
@@ -1,422 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package zipkin
-
-import (
-	"bytes"
-	"encoding/base64"
-	"encoding/binary"
-	"encoding/json"
-	"errors"
-	"fmt"
-
-	"go.opentelemetry.io/otel/trace"
-
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-)
-
-const (
-	// UnknownServiceName is serviceName we give to model.Process if we cannot find it anywhere in a Zipkin span
-	UnknownServiceName = "unknown-service-name"
-	component          = "component"
-	peerservice        = "peer.service"
-	peerHostIPv4       = "peer.ipv4"
-	peerHostIPv6       = "peer.ipv6"
-	peerPort           = "peer.port"
-)
-
-var (
-	coreAnnotations = map[string]string{
-		zipkincore.SERVER_RECV: trace.SpanKindServer.String(),
-		zipkincore.SERVER_SEND: trace.SpanKindServer.String(),
-		zipkincore.CLIENT_RECV: trace.SpanKindClient.String(),
-		zipkincore.CLIENT_SEND: trace.SpanKindClient.String(),
-	}
-
-	// Some tags on Zipkin spans really describe the process emitting them rather than an individual span.
-	// Once all clients are upgraded to use native Jaeger model, this won't be happenning, but for now
-	// we remove these tags from the span and store them in the Process.
-	processTagAnnotations = map[string]string{
-		"jaegerClient":    "jaeger.version", // transform this tag name to client.version
-		"jaeger.hostname": "hostname",       // transform this tag name to hostname
-		"jaeger.version":  "jaeger.version", // keep this key as is
-	}
-
-	trueByteSlice = []byte{1}
-
-	// DefaultLogFieldKey is the log field key which translates directly into Zipkin's Annotation.Value,
-	// provided it's the only field in the log.
-	// In all other cases the fields are encoded into Annotation.Value as JSON string.
-	// TODO move to domain model
-	DefaultLogFieldKey = "event"
-
-	// IPTagName is the Jaeger tag name for an IPv4/IPv6 IP address.
-	// TODO move to domain model
-	IPTagName = "ip"
-)
-
-// ToDomain transforms a trace in zipkin.thrift format into model.Trace.
-// The transformation assumes that all spans have the same Trace ID.
-// A valid model.Trace is always returned, even when there are errors.
-// The errors are more of an "fyi", describing issues in the data.
-// TODO consider using different return type instead of `error`.
-func ToDomain(zSpans []*zipkincore.Span) (*model.Trace, error) {
-	return toDomain{}.ToDomain(zSpans)
-}
-
-// ToDomainSpan transforms a span in zipkin.thrift format into model.Span.
-// A valid model.Span is always returned, even when there are errors.
-// The errors are more of an "fyi", describing issues in the data.
-// TODO consider using different return type instead of `error`.
-func ToDomainSpan(zSpan *zipkincore.Span) ([]*model.Span, error) {
-	return toDomain{}.ToDomainSpans(zSpan)
-}
-
-type toDomain struct{}
-
-func (td toDomain) ToDomain(zSpans []*zipkincore.Span) (*model.Trace, error) {
-	var errs []error
-	processes := newProcessHashtable()
-	trc := &model.Trace{}
-	for _, zSpan := range zSpans {
-		jSpans, err := td.ToDomainSpans(zSpan)
-		if err != nil {
-			errs = append(errs, err)
-		}
-		for _, jSpan := range jSpans {
-			// remove duplicate Process instances
-			jSpan.Process = processes.add(jSpan.Process)
-			trc.Spans = append(trc.Spans, jSpan)
-		}
-	}
-	return trc, errors.Join(errs...)
-}
-
-func (td toDomain) ToDomainSpans(zSpan *zipkincore.Span) ([]*model.Span, error) {
-	jSpans := td.transformSpan(zSpan)
-	jProcess, err := td.generateProcess(zSpan)
-	for _, jSpan := range jSpans {
-		jSpan.Process = jProcess
-	}
-	return jSpans, err
-}
-
-func (toDomain) findAnnotation(zSpan *zipkincore.Span, value string) *zipkincore.Annotation {
-	for _, ann := range zSpan.Annotations {
-		if ann.Value == value {
-			return ann
-		}
-	}
-	return nil
-}
-
-// transformSpan transforms a zipkin span into a Jaeger span
-func (td toDomain) transformSpan(zSpan *zipkincore.Span) []*model.Span {
-	tags := td.getTags(zSpan.BinaryAnnotations, td.isSpanTag)
-	if spanKindTag, ok := td.getSpanKindTag(zSpan.Annotations); ok {
-		tags = append(tags, spanKindTag)
-	}
-	var traceIDHigh int64
-	if zSpan.TraceIDHigh != nil {
-		traceIDHigh = *zSpan.TraceIDHigh
-	}
-	//nolint: gosec // G115
-	traceID := model.NewTraceID(uint64(traceIDHigh), uint64(zSpan.TraceID))
-	var refs []model.SpanRef
-	if zSpan.ParentID != nil {
-		//nolint: gosec // G115
-		parentSpanID := model.NewSpanID(uint64(*zSpan.ParentID))
-		refs = model.MaybeAddParentSpanID(traceID, parentSpanID, refs)
-	}
-
-	flags := td.getFlags(zSpan)
-
-	startTime, duration := td.getStartTimeAndDuration(zSpan)
-
-	result := []*model.Span{{
-		TraceID: traceID,
-		//nolint: gosec // G115
-		SpanID:        model.NewSpanID(uint64(zSpan.ID)),
-		OperationName: zSpan.Name,
-		References:    refs,
-		Flags:         flags,
-		//nolint: gosec // G115
-		StartTime: model.EpochMicrosecondsAsTime(uint64(startTime)),
-		//nolint: gosec // G115
-		Duration: model.MicrosecondsAsDuration(uint64(duration)),
-		Tags:     tags,
-		Logs:     td.getLogs(zSpan.Annotations),
-	}}
-
-	cs := td.findAnnotation(zSpan, zipkincore.CLIENT_SEND)
-	sr := td.findAnnotation(zSpan, zipkincore.SERVER_RECV)
-	if cs != nil && sr != nil {
-		// if the span is client and server we split it into two separate spans
-		s := &model.Span{
-			TraceID: traceID,
-			//nolint: gosec // G115
-			SpanID:        model.NewSpanID(uint64(zSpan.ID)),
-			OperationName: zSpan.Name,
-			References:    refs,
-			Flags:         flags,
-		}
-		// if the first span is a client span we create server span and vice-versa.
-		if result[0].IsRPCClient() {
-			s.Tags = []model.KeyValue{model.SpanKindTag(model.SpanKindServer)}
-			//nolint: gosec // G115
-			s.StartTime = model.EpochMicrosecondsAsTime(uint64(sr.Timestamp))
-			if ss := td.findAnnotation(zSpan, zipkincore.SERVER_SEND); ss != nil {
-				//nolint: gosec // G115
-				s.Duration = model.MicrosecondsAsDuration(uint64(ss.Timestamp - sr.Timestamp))
-			}
-		} else {
-			s.Tags = []model.KeyValue{model.SpanKindTag(model.SpanKindClient)}
-			//nolint: gosec // G115
-			s.StartTime = model.EpochMicrosecondsAsTime(uint64(cs.Timestamp))
-			if cr := td.findAnnotation(zSpan, zipkincore.CLIENT_RECV); cr != nil {
-				//nolint: gosec // G115
-				s.Duration = model.MicrosecondsAsDuration(uint64(cr.Timestamp - cs.Timestamp))
-			}
-		}
-		result = append(result, s)
-	}
-	return result
-}
-
-// getFlags takes a Zipkin Span and deduces the proper flags settings
-func (toDomain) getFlags(zSpan *zipkincore.Span) model.Flags {
-	f := model.Flags(0)
-	if zSpan.Debug {
-		f.SetDebug()
-	}
-	return f
-}
-
-// Get a correct start time to use for the span if it's not set directly
-func (td toDomain) getStartTimeAndDuration(zSpan *zipkincore.Span) (timestamp, duration int64) {
-	timestamp = zSpan.GetTimestamp()
-	duration = zSpan.GetDuration()
-	if timestamp == 0 {
-		cs := td.findAnnotation(zSpan, zipkincore.CLIENT_SEND)
-		sr := td.findAnnotation(zSpan, zipkincore.SERVER_RECV)
-		if cs != nil {
-			timestamp = cs.Timestamp
-			cr := td.findAnnotation(zSpan, zipkincore.CLIENT_RECV)
-			if cr != nil && duration == 0 {
-				duration = cr.Timestamp - cs.Timestamp
-			}
-		} else if sr != nil {
-			timestamp = sr.Timestamp
-			ss := td.findAnnotation(zSpan, zipkincore.SERVER_SEND)
-			if ss != nil && duration == 0 {
-				duration = ss.Timestamp - sr.Timestamp
-			}
-		}
-	}
-	return timestamp, duration
-}
-
-// generateProcess takes a Zipkin Span and produces a model.Process.
-// An optional error may also be returned, but it is not fatal.
-func (td toDomain) generateProcess(zSpan *zipkincore.Span) (*model.Process, error) {
-	tags := td.getTags(zSpan.BinaryAnnotations, td.isProcessTag)
-	for i, tag := range tags {
-		tags[i].Key = processTagAnnotations[tag.Key]
-	}
-	serviceName, ipv4, err := td.findServiceNameAndIP(zSpan)
-	if ipv4 != 0 {
-		// If the ip process tag already exists, don't add it again
-		//nolint: gosec // G115
-		tags = append(tags, model.Int64(IPTagName, int64(uint64(ipv4))))
-	}
-	return model.NewProcess(serviceName, tags), err
-}
-
-func (td toDomain) findServiceNameAndIP(zSpan *zipkincore.Span) (string, int32, error) {
-	for _, a := range zSpan.Annotations {
-		if td.isCoreAnnotation(a) && a.Host != nil && a.Host.ServiceName != "" {
-			return a.Host.ServiceName, a.Host.Ipv4, nil
-		}
-	}
-	for _, a := range zSpan.BinaryAnnotations {
-		if a.Key == zipkincore.LOCAL_COMPONENT && a.Host != nil && a.Host.ServiceName != "" {
-			return a.Host.ServiceName, a.Host.Ipv4, nil
-		}
-	}
-	// If no core annotations exist, use the service name from any annotation
-	for _, a := range zSpan.Annotations {
-		if a.Host != nil && a.Host.ServiceName != "" {
-			return a.Host.ServiceName, a.Host.Ipv4, nil
-		}
-	}
-	// Tracer can also report a span with just binary annotation/s
-	for _, a := range zSpan.BinaryAnnotations {
-		if a.Host != nil && a.Host.ServiceName != "" {
-			return a.Host.ServiceName, a.Host.Ipv4, nil
-		}
-	}
-	err := fmt.Errorf(
-		"cannot find service name in Zipkin span [traceID=%x, spanID=%x]",
-		//nolint: gosec // G115
-		uint64(zSpan.TraceID), uint64(zSpan.ID))
-	return UnknownServiceName, 0, err
-}
-
-func (toDomain) isCoreAnnotation(annotation *zipkincore.Annotation) bool {
-	_, ok := coreAnnotations[annotation.Value]
-	return ok
-}
-
-func (toDomain) isProcessTag(binaryAnnotation *zipkincore.BinaryAnnotation) bool {
-	_, ok := processTagAnnotations[binaryAnnotation.Key]
-	return ok
-}
-
-func (td toDomain) isSpanTag(binaryAnnotation *zipkincore.BinaryAnnotation) bool {
-	return !td.isProcessTag(binaryAnnotation)
-}
-
-type tagPredicate func(*zipkincore.BinaryAnnotation) bool
-
-func (td toDomain) getTags(binAnnotations []*zipkincore.BinaryAnnotation, tagInclude tagPredicate) []model.KeyValue {
-	// this will be memory intensive due to how slices work, and it's specifically because we have to filter out
-	// some binary annotations. improvement here would be just collecting the indices in binAnnotations we want.
-	var retMe []model.KeyValue
-	for _, annotation := range binAnnotations {
-		if !tagInclude(annotation) {
-			continue
-		}
-		switch annotation.Key {
-		case zipkincore.LOCAL_COMPONENT:
-			value := string(annotation.Value)
-			tag := model.String(component, value)
-			retMe = append(retMe, tag)
-		case zipkincore.SERVER_ADDR, zipkincore.CLIENT_ADDR, zipkincore.MESSAGE_ADDR:
-			retMe = td.getPeerTags(annotation.Host, retMe)
-		default:
-			tag, err := td.transformBinaryAnnotation(annotation)
-			if err != nil {
-				encoded := base64.StdEncoding.EncodeToString(annotation.Value)
-				errMsg := fmt.Sprintf("Cannot parse Zipkin value %s: %v", encoded, err)
-				tag = model.String(annotation.Key, errMsg)
-			}
-			retMe = append(retMe, tag)
-		}
-	}
-	return retMe
-}
-
-func (toDomain) transformBinaryAnnotation(binaryAnnotation *zipkincore.BinaryAnnotation) (model.KeyValue, error) {
-	switch binaryAnnotation.AnnotationType {
-	case zipkincore.AnnotationType_BOOL:
-		vBool := bytes.Equal(binaryAnnotation.Value, trueByteSlice)
-		return model.Bool(binaryAnnotation.Key, vBool), nil
-	case zipkincore.AnnotationType_BYTES:
-		return model.Binary(binaryAnnotation.Key, binaryAnnotation.Value), nil
-	case zipkincore.AnnotationType_DOUBLE:
-		var d float64
-		if err := bytesToNumber(binaryAnnotation.Value, &d); err != nil {
-			return model.KeyValue{}, err
-		}
-		return model.Float64(binaryAnnotation.Key, d), nil
-	case zipkincore.AnnotationType_I16:
-		var i int16
-		if err := bytesToNumber(binaryAnnotation.Value, &i); err != nil {
-			return model.KeyValue{}, err
-		}
-		return model.Int64(binaryAnnotation.Key, int64(i)), nil
-	case zipkincore.AnnotationType_I32:
-		var i int32
-		if err := bytesToNumber(binaryAnnotation.Value, &i); err != nil {
-			return model.KeyValue{}, err
-		}
-		return model.Int64(binaryAnnotation.Key, int64(i)), nil
-	case zipkincore.AnnotationType_I64:
-		var i int64
-		if err := bytesToNumber(binaryAnnotation.Value, &i); err != nil {
-			return model.KeyValue{}, err
-		}
-		return model.Int64(binaryAnnotation.Key, int64(i)), nil
-	case zipkincore.AnnotationType_STRING:
-		return model.String(binaryAnnotation.Key, string(binaryAnnotation.Value)), nil
-	}
-	return model.KeyValue{}, fmt.Errorf("unknown zipkin annotation type: %d", binaryAnnotation.AnnotationType)
-}
-
-func bytesToNumber(b []byte, number any) error {
-	buf := bytes.NewReader(b)
-	return binary.Read(buf, binary.BigEndian, number)
-}
-
-func (td toDomain) getLogs(annotations []*zipkincore.Annotation) []model.Log {
-	var retMe []model.Log
-	for _, a := range annotations {
-		// If the annotation has no value, throw it out
-		if a.Value == "" {
-			continue
-		}
-		if _, ok := coreAnnotations[a.Value]; ok {
-			// skip core annotations
-			continue
-		}
-		logFields := td.getLogFields(a)
-		jLog := model.Log{
-			//nolint: gosec // G115
-			Timestamp: model.EpochMicrosecondsAsTime(uint64(a.Timestamp)),
-			Fields:    logFields,
-		}
-		retMe = append(retMe, jLog)
-	}
-	return retMe
-}
-
-func (toDomain) getLogFields(annotation *zipkincore.Annotation) []model.KeyValue {
-	var logFields map[string]string
-	// Since Zipkin format does not support kv-logging, some clients encode those Logs
-	// as annotations with JSON value. Therefore, we try JSON decoding first.
-	if err := json.Unmarshal([]byte(annotation.Value), &logFields); err == nil {
-		fields := make([]model.KeyValue, len(logFields))
-		i := 0
-		for k, v := range logFields {
-			fields[i] = model.String(k, v)
-			i++
-		}
-		return fields
-	}
-	return []model.KeyValue{model.String(DefaultLogFieldKey, annotation.Value)}
-}
-
-func (toDomain) getSpanKindTag(annotations []*zipkincore.Annotation) (model.KeyValue, bool) {
-	for _, a := range annotations {
-		if spanKind, ok := coreAnnotations[a.Value]; ok {
-			return model.SpanKindTag(model.SpanKind(spanKind)), true
-		}
-	}
-	return model.KeyValue{}, false
-}
-
-func (toDomain) getPeerTags(endpoint *zipkincore.Endpoint, tags []model.KeyValue) []model.KeyValue {
-	if endpoint == nil {
-		return tags
-	}
-	tags = append(tags, model.String(peerservice, endpoint.ServiceName))
-	if endpoint.Ipv4 != 0 {
-		//nolint: gosec // G115
-		ipv4 := int64(uint32(endpoint.Ipv4))
-		tags = append(tags, model.Int64(peerHostIPv4, ipv4))
-	}
-	if endpoint.Ipv6 != nil {
-		// Zipkin defines Ipv6 field as: "IPv6 host address packed into 16 bytes. Ex Inet6Address.getBytes()".
-		// https://github.com/openzipkin/zipkin-api/blob/master/thrift/zipkinCore.thrift#L305
-		tags = append(tags, model.Binary(peerHostIPv6, endpoint.Ipv6))
-	}
-	if endpoint.Port != 0 {
-		//nolint: gosec // G115
-		port := int64(uint16(endpoint.Port))
-		tags = append(tags, model.Int64(peerPort, port))
-	}
-	return tags
-}
diff --git a/model/dependencies.go b/model/dependencies.go
deleted file mode 100644
index 2252a25b..00000000
--- a/model/dependencies.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-const (
-	// JaegerDependencyLinkSource describes a dependency diagram that was generated from Jaeger traces.
-	JaegerDependencyLinkSource = modelv1.JaegerDependencyLinkSource
-)
diff --git a/model/flags.go b/model/flags.go
deleted file mode 100644
index 163c3967..00000000
--- a/model/flags.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-const (
-	// SampledFlag is the bit set in Flags in order to define a span as a sampled span
-	SampledFlag = modelv1.SampledFlag
-	// DebugFlag is the bit set in Flags in order to define a span as a debug span
-	DebugFlag = modelv1.SampledFlag
-	// FirehoseFlag is the bit in Flags in order to define a span as a firehose span
-	FirehoseFlag = modelv1.SampledFlag
-)
-
-// Flags is a bit map of flags for a span
-type Flags = modelv1.Flags
diff --git a/model/hash.go b/model/hash.go
deleted file mode 100644
index e59913d4..00000000
--- a/model/hash.go
+++ /dev/null
@@ -1,16 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-// Hashable interface is for type that can participate in a hash computation
-// by writing their data into io.Writer, which is usually an instance of hash.Hash.
-type Hashable = modelv1.Hashable
-
-// HashCode calculates a FNV-1a hash code for a Hashable object.
-var HashCode = modelv1.HashCode
diff --git a/model/ids.go b/model/ids.go
deleted file mode 100644
index 6a130249..00000000
--- a/model/ids.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2018 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-// TraceID is a random 128bit identifier for a trace
-type TraceID = modelv1.TraceID
-
-// SpanID is a random 64bit identifier for a span
-type SpanID = modelv1.SpanID
-
-// ------- TraceID -------
-
-// NewTraceID creates a new TraceID from two 64bit unsigned ints.
-var NewTraceID = modelv1.NewTraceID
-
-// TraceIDFromString creates a TraceID from a hexadecimal string
-var TraceIDFromString = modelv1.TraceIDFromString
-
-// TraceIDFromBytes creates a TraceID from list of bytes
-var TraceIDFromBytes = modelv1.TraceIDFromBytes
-
-// ------- SpanID -------
-
-// NewSpanID creates a new SpanID from a 64bit unsigned int.
-var NewSpanID = modelv1.NewSpanID
-
-// SpanIDFromString creates a SpanID from a hexadecimal string
-var SpanIDFromString = modelv1.SpanIDFromString
-
-// SpanIDFromBytes creates a SpandID from list of bytes
-var SpanIDFromBytes = modelv1.SpanIDFromBytes
diff --git a/model/keyvalue.go b/model/keyvalue.go
deleted file mode 100644
index 8694d117..00000000
--- a/model/keyvalue.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-// These constants are kept mostly for backwards compatibility.
-const (
-	StringType  = modelv1.StringType
-	BoolType    = modelv1.BoolType
-	Int64Type   = modelv1.Int64Type
-	Float64Type = modelv1.Float64Type
-	BinaryType  = modelv1.BinaryType
-
-	SpanKindKey     = modelv1.SpanKindKey
-	SamplerTypeKey  = modelv1.SamplerTypeKey
-	SamplerParamKey = modelv1.SamplerParamKey
-)
-
-type SpanKind = modelv1.SpanKind
-
-const (
-	SpanKindClient      SpanKind = modelv1.SpanKindClient
-	SpanKindServer      SpanKind = modelv1.SpanKindServer
-	SpanKindProducer    SpanKind = modelv1.SpanKindProducer
-	SpanKindConsumer    SpanKind = modelv1.SpanKindConsumer
-	SpanKindInternal    SpanKind = modelv1.SpanKindInternal
-	SpanKindUnspecified SpanKind = modelv1.SpanKindUnspecified
-)
-
-var SpanKindFromString = modelv1.SpanKindFromString
-
-// KeyValues is a type alias that exposes convenience functions like Sort, FindByKey.
-type KeyValues = modelv1.KeyValues
-
-// String creates a String-typed KeyValue
-var String = modelv1.String
-
-// Bool creates a Bool-typed KeyValue
-var Bool = modelv1.Bool
-
-// Int64 creates a Int64-typed KeyValue
-var Int64 = modelv1.Int64
-
-// Float64 creates a Float64-typed KeyValue
-var Float64 = modelv1.Float64
-
-// Binary creates a Binary-typed KeyValue
-var Binary = modelv1.Binary
diff --git a/model/model.go b/model/model.go
deleted file mode 100644
index 6eff2414..00000000
--- a/model/model.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2025 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package model
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-// This is a compile-time assertion to ensure that this generated file
-// is compatible with the proto package it is being compiled against.
-// A compilation error at this line likely means your copy of the
-// proto package needs to be updated.
-
-type ValueType = modelv1.ValueType
-
-const (
-	ValueType_STRING  ValueType = modelv1.ValueType_STRING
-	ValueType_BOOL    ValueType = modelv1.ValueType_BOOL
-	ValueType_INT64   ValueType = modelv1.ValueType_INT64
-	ValueType_FLOAT64 ValueType = modelv1.ValueType_FLOAT64
-	ValueType_BINARY  ValueType = modelv1.ValueType_BINARY
-)
-
-type SpanRefType = modelv1.SpanRefType
-
-const (
-	SpanRefType_CHILD_OF     SpanRefType = modelv1.SpanRefType_CHILD_OF
-	SpanRefType_FOLLOWS_FROM SpanRefType = modelv1.SpanRefType_FOLLOWS_FROM
-)
-
-type KeyValue = modelv1.KeyValue
-
-type Log = modelv1.Log
-
-type SpanRef = modelv1.SpanRef
-
-type Process = modelv1.Process
-
-type Span = modelv1.Span
-
-type Trace = modelv1.Trace
-
-type Trace_ProcessMapping = modelv1.Trace_ProcessMapping
-
-// Note that both Span and Batch may contain a Process.
-// This is different from the Thrift model which was only used
-// for transport, because Proto model is also used by the backend
-// as the domain model, where once a batch is received it is split
-// into individual spans which are all processed independently,
-// and therefore they all need a Process. As far as on-the-wire
-// semantics, both Batch and Spans in the same message may contain
-// their own instances of Process, with span.Process taking priority
-// over batch.Process.
-type Batch = modelv1.Batch
-
-type DependencyLink = modelv1.DependencyLink
diff --git a/model/process.go b/model/process.go
deleted file mode 100644
index 84ac2e36..00000000
--- a/model/process.go
+++ /dev/null
@@ -1,15 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-// NewProcess creates a new Process for given serviceName and tags.
-// The tags are sorted in place and kept in the same array/slice,
-// in order to store the Process in a canonical form that is relied
-// upon by the Equal and Hash functions.
-var NewProcess = modelv1.NewProcess
diff --git a/model/sort.go b/model/sort.go
deleted file mode 100644
index b58b4a35..00000000
--- a/model/sort.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-// SortTraceIDs sorts a list of TraceIDs
-var SortTraceIDs = modelv1.SortTraceIDs
-
-// SortTraces deep sorts a list of traces by TraceID.
-var SortTraces = modelv1.SortTraces
-
-// SortTrace deep sorts a trace's spans by SpanID.
-var SortTrace = modelv1.SortTrace
-
-// SortSpan deep sorts a span: this sorts its tags, logs by timestamp, tags in logs, and tags in process.
-var SortSpan = modelv1.SortSpan
diff --git a/model/span.go b/model/span.go
deleted file mode 100644
index 3cd31865..00000000
--- a/model/span.go
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-type SamplerType = modelv1.SamplerType
-
-const (
-	SamplerTypeUnrecognized  SamplerType = modelv1.SamplerTypeUnrecognized
-	SamplerTypeProbabilistic             = modelv1.SamplerTypeProbabilistic
-	SamplerTypeLowerBound                = modelv1.SamplerTypeLowerBound
-	SamplerTypeRateLimiting              = modelv1.SamplerTypeRateLimiting
-	SamplerTypeConst                     = modelv1.SamplerTypeConst
-)
-
-var SpanKindTag = modelv1.SpanKindTag
diff --git a/model/spanref.go b/model/spanref.go
deleted file mode 100644
index f846162e..00000000
--- a/model/spanref.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-const (
-	// ChildOf span reference type describes a reference to a parent span
-	// that depends on the response from the current (child) span
-	ChildOf = modelv1.ChildOf
-
-	// FollowsFrom span reference type describes a reference to a "parent" span
-	// that does not depend on the response from the current (child) span
-	FollowsFrom = modelv1.FollowsFrom
-)
-
-// MaybeAddParentSpanID adds non-zero parentSpanID to refs as a child-of reference.
-// We no longer store ParentSpanID in the domain model, but the data in the database
-// or other formats might still have these IDs without representing them in the References,
-// so this converts parent IDs to canonical reference format.
-var MaybeAddParentSpanID = modelv1.MaybeAddParentSpanID
-
-// NewChildOfRef creates a new child-of span reference.
-var NewChildOfRef = modelv1.NewChildOfRef
-
-// NewFollowsFromRef creates a new follows-from span reference.
-var NewFollowsFromRef = modelv1.NewFollowsFromRef
diff --git a/model/time.go b/model/time.go
deleted file mode 100644
index 9e022dff..00000000
--- a/model/time.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-// EpochMicrosecondsAsTime converts microseconds since epoch to time.Time value.
-var EpochMicrosecondsAsTime = modelv1.EpochMicrosecondsAsTime
-
-// TimeAsEpochMicroseconds converts time.Time to microseconds since epoch,
-// which is the format the StartTime field is stored in the Span.
-var TimeAsEpochMicroseconds = modelv1.TimeAsEpochMicroseconds
-
-// MicrosecondsAsDuration converts duration in microseconds to time.Duration value.
-var MicrosecondsAsDuration = modelv1.MicrosecondsAsDuration
-
-// DurationAsMicroseconds converts time.Duration to microseconds,
-// which is the format the Duration field is stored in the Span.
-var DurationAsMicroseconds = modelv1.DurationAsMicroseconds
diff --git a/pkg/kafka/auth/config.go b/pkg/kafka/auth/config.go
index 9b22c764..7fe5bbf2 100644
--- a/pkg/kafka/auth/config.go
+++ b/pkg/kafka/auth/config.go
@@ -12,7 +12,7 @@ import (
 	"go.opentelemetry.io/collector/config/configtls"
 	"go.uber.org/zap"
 
-	"github.com/jaegertracing/jaeger/pkg/config/tlscfg"
+	"github.com/jaegertracing/jaeger/internal/config/tlscfg"
 )
 
 const (
diff --git a/pkg/kafka/auth/options.go b/pkg/kafka/auth/options.go
index 41e15c74..5aebd8e7 100644
--- a/pkg/kafka/auth/options.go
+++ b/pkg/kafka/auth/options.go
@@ -7,7 +7,7 @@ import (
 	"flag"
 	"strings"
 
-	"github.com/jaegertracing/jaeger/pkg/config/tlscfg"
+	"github.com/jaegertracing/jaeger/internal/config/tlscfg"
 )
 
 const (
diff --git a/pkg/telemetry/settings.go b/pkg/telemetry/settings.go
index 5b58fd75..43c99594 100644
--- a/pkg/telemetry/settings.go
+++ b/pkg/telemetry/settings.go
@@ -13,8 +13,8 @@ import (
 	nooptrace "go.opentelemetry.io/otel/trace/noop"
 	"go.uber.org/zap"
 
+	"github.com/jaegertracing/jaeger/internal/healthcheck"
 	"github.com/jaegertracing/jaeger/internal/metrics/otelmetrics"
-	"github.com/jaegertracing/jaeger/pkg/healthcheck"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 )
 
diff --git a/proto-gen/api_v2/collector.go b/proto-gen/api_v2/collector.go
deleted file mode 100644
index 617edc23..00000000
--- a/proto-gen/api_v2/collector.go
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2025 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package api_v2
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
-)
-
-type PostSpansRequest = modelv1.PostSpansRequest
-
-type PostSpansResponse = modelv1.PostSpansResponse
-
-// CollectorServiceClient is the client API for CollectorService service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type CollectorServiceClient = modelv1.CollectorServiceClient
-
-var NewCollectorServiceClient = modelv1.NewCollectorServiceClient
-
-// CollectorServiceServer is the server API for CollectorService service.
-type CollectorServiceServer = modelv1.CollectorServiceServer
-
-// UnimplementedCollectorServiceServer can be embedded to have forward compatible implementations.
-type UnimplementedCollectorServiceServer = modelv1.UnimplementedCollectorServiceServer
-
-var RegisterCollectorServiceServer = modelv1.RegisterCollectorServiceServer
diff --git a/proto-gen/api_v2/query.go b/proto-gen/api_v2/query.go
deleted file mode 100644
index 77c257bd..00000000
--- a/proto-gen/api_v2/query.go
+++ /dev/null
@@ -1,57 +0,0 @@
-// Copyright (c) 2025 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package api_v2
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
-)
-
-type GetTraceRequest = modelv1.GetTraceRequest
-
-type SpansResponseChunk = modelv1.SpansResponseChunk
-
-type ArchiveTraceRequest = modelv1.ArchiveTraceRequest
-
-type ArchiveTraceResponse = modelv1.ArchiveTraceResponse
-
-type TraceQueryParameters = modelv1.TraceQueryParameters
-
-type FindTracesRequest = modelv1.FindTracesRequest
-
-type GetServicesRequest = modelv1.GetServicesRequest
-
-type GetServicesResponse = modelv1.GetServicesResponse
-
-type GetOperationsRequest = modelv1.GetOperationsRequest
-
-type Operation = modelv1.Operation
-
-type GetOperationsResponse = modelv1.GetOperationsResponse
-
-type GetDependenciesRequest = modelv1.GetDependenciesRequest
-
-type GetDependenciesResponse = modelv1.GetDependenciesResponse
-
-// QueryServiceClient is the client API for QueryService service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type QueryServiceClient = modelv1.QueryServiceClient
-
-var NewQueryServiceClient = modelv1.NewQueryServiceClient
-
-type QueryService_GetTraceClient = modelv1.QueryService_GetTraceClient
-
-type QueryService_FindTracesClient = modelv1.QueryService_FindTracesClient
-
-// QueryServiceServer is the server API for QueryService service.
-type QueryServiceServer = modelv1.QueryServiceServer
-
-// UnimplementedQueryServiceServer can be embedded to have forward compatible implementations.
-type UnimplementedQueryServiceServer = modelv1.UnimplementedQueryServiceServer
-
-var RegisterQueryServiceServer = modelv1.RegisterQueryServiceServer
-
-type QueryService_GetTraceServer = modelv1.QueryService_GetTraceServer
-
-type QueryService_FindTracesServer = modelv1.QueryService_FindTracesServer
diff --git a/proto-gen/api_v2/sampling.go b/proto-gen/api_v2/sampling.go
deleted file mode 100644
index 2797a331..00000000
--- a/proto-gen/api_v2/sampling.go
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2025 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package api_v2
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
-)
-
-// See description of the SamplingStrategyResponse.strategyType field.
-type SamplingStrategyType = modelv1.SamplingStrategyType
-
-const (
-	SamplingStrategyType_PROBABILISTIC SamplingStrategyType = modelv1.SamplingStrategyType_PROBABILISTIC
-	SamplingStrategyType_RATE_LIMITING SamplingStrategyType = modelv1.SamplingStrategyType_RATE_LIMITING
-)
-
-var SamplingStrategyType_name = modelv1.SamplingStrategyType_name
-
-var SamplingStrategyType_value = modelv1.SamplingStrategyType_value
-
-// ProbabilisticSamplingStrategy samples traces with a fixed probability.
-type ProbabilisticSamplingStrategy = modelv1.ProbabilisticSamplingStrategy
-
-// RateLimitingSamplingStrategy samples a fixed number of traces per time interval.
-// The typical implementations use the leaky bucket algorithm.
-type RateLimitingSamplingStrategy = modelv1.RateLimitingSamplingStrategy
-
-// OperationSamplingStrategy is a sampling strategy for a given operation
-// (aka endpoint, span name). Only probabilistic sampling is currently supported.
-type OperationSamplingStrategy = modelv1.OperationSamplingStrategy
-
-// PerOperationSamplingStrategies is a combination of strategies for different endpoints
-// as well as some service-wide defaults. It is particularly useful for services whose
-// endpoints receive vastly different traffic, so that any single rate of sampling would
-// result in either too much data for some endpoints or almost no data for other endpoints.
-type PerOperationSamplingStrategies = modelv1.PerOperationSamplingStrategies
-
-// SamplingStrategyResponse contains an overall sampling strategy for a given service.
-// This type should = modelv1.should as a union where only one of the strategy field is present.
-type SamplingStrategyResponse = modelv1.SamplingStrategyResponse
-
-// SamplingStrategyParameters defines request parameters for remote sampler.
-type SamplingStrategyParameters = modelv1.SamplingStrategyParameters
-
-// SamplingManagerClient is the client API for SamplingManager service.
-//
-// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
-type SamplingManagerClient = modelv1.SamplingManagerClient
-
-var NewSamplingManagerClient = modelv1.NewSamplingManagerClient
-
-// SamplingManagerServer is the server API for SamplingManager service.
-type SamplingManagerServer = modelv1.SamplingManagerServer
-
-// UnimplementedSamplingManagerServer can be embedded to have forward compatible implementations.
-type UnimplementedSamplingManagerServer = modelv1.UnimplementedSamplingManagerServer
-
-var RegisterSamplingManagerServer = modelv1.RegisterSamplingManagerServer
diff --git a/thrift-gen/agent/agent.go b/thrift-gen/agent/agent.go
deleted file mode 100644
index 794dc888..00000000
--- a/thrift-gen/agent/agent.go
+++ /dev/null
@@ -1,30 +0,0 @@
-// Copyright (c) 2025 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package agent
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/thrift-gen/agent"
-)
-
-type Agent = modelv1.Agent
-
-type AgentClient = modelv1.AgentClient
-
-var (
-	NewAgentClientFactory  = modelv1.NewAgentClientFactory
-	NewAgentClientProtocol = modelv1.NewAgentClientProtocol
-	NewAgentClient         = modelv1.NewAgentClient
-)
-
-type AgentProcessor = modelv1.AgentProcessor
-
-var NewAgentProcessor = modelv1.NewAgentProcessor
-
-type AgentEmitZipkinBatchArgs = modelv1.AgentEmitZipkinBatchArgs
-
-var NewAgentEmitZipkinBatchArgs = modelv1.NewAgentEmitZipkinBatchArgs
-
-type AgentEmitBatchArgs = modelv1.AgentEmitBatchArgs
-
-var NewAgentEmitBatchArgs = modelv1.NewAgentEmitBatchArgs
diff --git a/thrift-gen/jaeger/jaeger.go b/thrift-gen/jaeger/jaeger.go
deleted file mode 100644
index 322d25e5..00000000
--- a/thrift-gen/jaeger/jaeger.go
+++ /dev/null
@@ -1,72 +0,0 @@
-// Copyright (c) 2025 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package jaeger
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/thrift-gen/jaeger"
-)
-
-type TagType = modelv1.TagType
-
-const (
-	TagType_STRING = modelv1.TagType_STRING
-	TagType_DOUBLE = modelv1.TagType_DOUBLE
-	TagType_BOOL   = modelv1.TagType_BOOL
-	TagType_LONG   = modelv1.TagType_LONG
-	TagType_BINARY = modelv1.TagType_BINARY
-)
-
-type SpanRefType = modelv1.SpanRefType
-
-const (
-	SpanRefType_CHILD_OF     = modelv1.SpanRefType_CHILD_OF
-	SpanRefType_FOLLOWS_FROM = modelv1.SpanRefType_FOLLOWS_FROM
-)
-
-type Tag = modelv1.Tag
-
-var NewTag = modelv1.NewTag
-
-type Log = modelv1.Log
-
-var NewLog = modelv1.NewLog
-
-type SpanRef = modelv1.SpanRef
-
-var NewSpanRef = modelv1.NewSpanRef
-
-type Span = modelv1.Span
-
-var NewSpan = modelv1.NewSpan
-
-type Process = modelv1.Process
-
-var NewProcess = modelv1.NewProcess
-
-type Batch = modelv1.Batch
-
-var NewBatch = modelv1.NewBatch
-
-type BatchSubmitResponse = modelv1.BatchSubmitResponse
-
-var NewBatchSubmitResponse = modelv1.NewBatchSubmitResponse
-
-type ClientStats = modelv1.ClientStats
-
-var NewClientStats = modelv1.NewClientStats
-
-type (
-	Collector       = modelv1.Collector
-	CollectorClient = modelv1.CollectorClient
-)
-
-var (
-	NewCollectorClientFactory  = modelv1.NewCollectorClientFactory
-	NewCollectorClientProtocol = modelv1.NewCollectorClientProtocol
-	NewCollectorClient         = modelv1.NewCollectorClient
-)
-
-type CollectorProcessor = modelv1.CollectorProcessor
-
-var NewCollectorProcessor = modelv1.NewCollectorProcessor
diff --git a/thrift-gen/sampling/sampling.go b/thrift-gen/sampling/sampling.go
deleted file mode 100644
index 2a55bd55..00000000
--- a/thrift-gen/sampling/sampling.go
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) 2025 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package sampling
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/thrift-gen/sampling"
-)
-
-type SamplingStrategyType = modelv1.SamplingStrategyType
-
-const (
-	SamplingStrategyType_PROBABILISTIC SamplingStrategyType = modelv1.SamplingStrategyType_PROBABILISTIC
-	SamplingStrategyType_RATE_LIMITING SamplingStrategyType = modelv1.SamplingStrategyType_RATE_LIMITING
-)
-
-var SamplingStrategyTypeFromString = modelv1.SamplingStrategyTypeFromString
-
-var SamplingStrategyTypePtr = modelv1.SamplingStrategyTypePtr
-
-type ProbabilisticSamplingStrategy = modelv1.ProbabilisticSamplingStrategy
-
-var NewProbabilisticSamplingStrategy = modelv1.NewProbabilisticSamplingStrategy
-
-type RateLimitingSamplingStrategy = modelv1.RateLimitingSamplingStrategy
-
-var NewRateLimitingSamplingStrategy = modelv1.NewRateLimitingSamplingStrategy
-
-type OperationSamplingStrategy = modelv1.OperationSamplingStrategy
-
-var NewOperationSamplingStrategy = modelv1.NewOperationSamplingStrategy
-
-type PerOperationSamplingStrategies = modelv1.PerOperationSamplingStrategies
-
-var NewPerOperationSamplingStrategies = modelv1.NewPerOperationSamplingStrategies
-
-type SamplingStrategyResponse = modelv1.SamplingStrategyResponse
-
-var NewSamplingStrategyResponse = modelv1.NewSamplingStrategyResponse
-
-type SamplingManager = modelv1.SamplingManager
-
-type SamplingManagerClient = modelv1.SamplingManagerClient
-
-var NewSamplingManagerClientFactory = modelv1.NewSamplingManagerClientFactory
-
-var NewSamplingManagerClientProtocol = modelv1.NewSamplingManagerClientProtocol
-
-var NewSamplingManagerClient = modelv1.NewSamplingManagerClient
-
-type SamplingManagerProcessor = modelv1.SamplingManagerProcessor
-
-var NewSamplingManagerProcessor = modelv1.NewSamplingManagerProcessor
-
-type SamplingManagerGetSamplingStrategyArgs = modelv1.SamplingManagerGetSamplingStrategyArgs
-
-var NewSamplingManagerGetSamplingStrategyArgs = modelv1.NewSamplingManagerGetSamplingStrategyArgs
-
-type SamplingManagerGetSamplingStrategyResult = modelv1.SamplingManagerGetSamplingStrategyResult
-
-var NewSamplingManagerGetSamplingStrategyResult = modelv1.NewSamplingManagerGetSamplingStrategyResult
diff --git a/thrift-gen/zipkincore/zipkincore.go b/thrift-gen/zipkincore/zipkincore.go
deleted file mode 100644
index dd844fe2..00000000
--- a/thrift-gen/zipkincore/zipkincore.go
+++ /dev/null
@@ -1,74 +0,0 @@
-// Copyright (c) 2025 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package zipkincore
-
-import (
-	modelv1 "github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-)
-
-type AnnotationType = modelv1.AnnotationType
-
-const (
-	AnnotationType_BOOL   = modelv1.AnnotationType_BOOL
-	AnnotationType_BYTES  = modelv1.AnnotationType_BYTES
-	AnnotationType_I16    = modelv1.AnnotationType_I16
-	AnnotationType_I32    = modelv1.AnnotationType_I32
-	AnnotationType_I64    = modelv1.AnnotationType_I64
-	AnnotationType_DOUBLE = modelv1.AnnotationType_DOUBLE
-	AnnotationType_STRING = modelv1.AnnotationType_STRING
-)
-
-type Endpoint = modelv1.Endpoint
-
-var NewEndpoint = modelv1.NewEndpoint
-
-type Annotation = modelv1.Annotation
-
-var NewAnnotation = modelv1.NewAnnotation
-
-type BinaryAnnotation = modelv1.BinaryAnnotation
-
-var NewBinaryAnnotation = modelv1.NewBinaryAnnotation
-
-type Span = modelv1.Span
-
-var NewSpan = modelv1.NewSpan
-
-type Response = modelv1.Response
-
-var NewResponse = modelv1.NewResponse
-
-type (
-	ZipkinCollector       = modelv1.ZipkinCollector
-	ZipkinCollectorClient = modelv1.ZipkinCollectorClient
-)
-
-var (
-	NewZipkinCollectorClientFactory  = modelv1.NewZipkinCollectorClientFactory
-	NewZipkinCollectorClientProtocol = modelv1.NewZipkinCollectorClientProtocol
-	NewZipkinCollectorClient         = modelv1.NewZipkinCollectorClient
-)
-
-type ZipkinCollectorProcessor = modelv1.ZipkinCollectorProcessor
-
-var NewZipkinCollectorProcessor = modelv1.NewZipkinCollectorProcessor
-
-const (
-	CLIENT_SEND          = modelv1.CLIENT_SEND
-	CLIENT_RECV          = modelv1.CLIENT_RECV
-	SERVER_SEND          = modelv1.SERVER_SEND
-	SERVER_RECV          = modelv1.SERVER_RECV
-	MESSAGE_SEND         = modelv1.MESSAGE_SEND
-	MESSAGE_RECV         = modelv1.MESSAGE_RECV
-	WIRE_SEND            = modelv1.WIRE_SEND
-	WIRE_RECV            = modelv1.WIRE_RECV
-	CLIENT_SEND_FRAGMENT = modelv1.CLIENT_SEND_FRAGMENT
-	CLIENT_RECV_FRAGMENT = modelv1.CLIENT_RECV_FRAGMENT
-	SERVER_SEND_FRAGMENT = modelv1.SERVER_SEND_FRAGMENT
-	SERVER_RECV_FRAGMENT = modelv1.SERVER_RECV_FRAGMENT
-	LOCAL_COMPONENT      = modelv1.LOCAL_COMPONENT
-	CLIENT_ADDR          = modelv1.CLIENT_ADDR
-	SERVER_ADDR          = modelv1.SERVER_ADDR
-	MESSAGE_ADDR         = modelv1.MESSAGE_ADDR
-)



Test patch:
diff --git a/cmd/agent/app/agent_test.go b/cmd/agent/app/agent_test.go
deleted file mode 100644
index 6c167a3c..00000000
--- a/cmd/agent/app/agent_test.go
+++ /dev/null
@@ -1,202 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package app
-
-import (
-	"fmt"
-	"io"
-	"net/http"
-	"strings"
-	"testing"
-	"time"
-
-	"github.com/prometheus/client_golang/prometheus"
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-	"go.uber.org/zap"
-
-	"github.com/jaegertracing/jaeger/internal/metrics/metricsbuilder"
-	"github.com/jaegertracing/jaeger/internal/testutils"
-	"github.com/jaegertracing/jaeger/pkg/metrics"
-)
-
-func TestAgentStartError(t *testing.T) {
-	cfg := &Builder{}
-	agent, err := cfg.CreateAgent(fakeCollectorProxy{}, zap.NewNop(), metrics.NullFactory)
-	require.NoError(t, err)
-	agent.httpServer.Addr = "bad-address"
-	require.Error(t, agent.Run())
-}
-
-func TestAgentSamplingEndpoint(t *testing.T) {
-	withRunningAgent(t, func(httpAddr string, errorch chan error) {
-		url := fmt.Sprintf("http://%s/sampling?service=abc", httpAddr)
-		httpClient := &http.Client{
-			Timeout: 100 * time.Millisecond,
-		}
-	wait_loop:
-		for i := 0; i < 1000; i++ {
-			_, err := httpClient.Get(url)
-			if err == nil {
-				break
-			}
-			select {
-			case err := <-errorch:
-				require.NoError(t, err, "error from agent")
-				break wait_loop
-			default:
-				time.Sleep(time.Millisecond)
-			}
-		}
-		resp, err := http.Get(url)
-		require.NoError(t, err)
-		body, err := io.ReadAll(resp.Body)
-		require.NoError(t, err)
-		assert.Equal(t, "collector error: no peers available\n", string(body))
-	})
-}
-
-func TestAgentMetricsEndpoint(t *testing.T) {
-	withRunningAgent(t, func(httpAddr string, _ chan error) {
-		url := fmt.Sprintf("http://%s/metrics", httpAddr)
-		resp, err := http.Get(url)
-		require.NoError(t, err)
-		body, err := io.ReadAll(resp.Body)
-		require.NoError(t, err)
-		assert.Contains(t, string(body), "# HELP")
-	})
-}
-
-func withRunningAgent(t *testing.T, testcase func(string, chan error)) {
-	resetDefaultPrometheusRegistry()
-	cfg := Builder{
-		Processors: []ProcessorConfiguration{
-			{
-				Model:    jaegerModel,
-				Protocol: compactProtocol,
-				Server: ServerConfiguration{
-					HostPort: "127.0.0.1:0",
-				},
-			},
-		},
-		HTTPServer: HTTPServerConfiguration{
-			HostPort: "127.0.0.1:0",
-		},
-	}
-
-	logger, logBuf := testutils.NewLogger()
-	mBldr := &metricsbuilder.Builder{HTTPRoute: "/metrics", Backend: "prometheus"}
-	metricsFactory, err := mBldr.CreateMetricsFactory("jaeger")
-	require.NoError(t, err)
-	agent, err := cfg.CreateAgent(fakeCollectorProxy{}, logger, metricsFactory)
-	require.NoError(t, err)
-	if h := mBldr.Handler(); metricsFactory != nil && h != nil {
-		logger.Info("Registering metrics handler with HTTP server", zap.String("route", mBldr.HTTPRoute))
-		agent.GetHTTPRouter().Handle(mBldr.HTTPRoute, h).Methods(http.MethodGet)
-	}
-	ch := make(chan error, 2)
-	go func() {
-		if err := agent.Run(); err != nil {
-			t.Errorf("error from agent.Run(): %s", err)
-			ch <- err
-		}
-		close(ch)
-	}()
-
-	for i := 0; i < 1000; i++ {
-		if agent.HTTPAddr() != "" {
-			break
-		}
-		time.Sleep(time.Millisecond)
-	}
-
-	testcase(agent.HTTPAddr(), ch)
-
-	agent.Stop()
-	require.NoError(t, <-ch)
-
-	for i := 0; i < 1000; i++ {
-		if strings.Contains(logBuf.String(), "agent's http server exiting") {
-			return
-		}
-		time.Sleep(time.Millisecond)
-	}
-	t.Fatal("Expecting server exit log")
-}
-
-func TestStartStopRace(t *testing.T) {
-	resetDefaultPrometheusRegistry()
-	cfg := Builder{
-		Processors: []ProcessorConfiguration{
-			{
-				Model:    jaegerModel,
-				Protocol: compactProtocol,
-				Workers:  1,
-				Server: ServerConfiguration{
-					HostPort: "127.0.0.1:0",
-				},
-			},
-		},
-	}
-	logger, logBuf := testutils.NewEchoLogger(t)
-	mBldr := &metricsbuilder.Builder{HTTPRoute: "/metrics", Backend: "prometheus"}
-	metricsFactory, err := mBldr.CreateMetricsFactory("jaeger")
-	require.NoError(t, err)
-	agent, err := cfg.CreateAgent(fakeCollectorProxy{}, logger, metricsFactory)
-	require.NoError(t, err)
-
-	// This test attempts to hit the data race bug when Stop() is called
-	// immediately after Run(). We had a bug like that which is now fixed:
-	// https://github.com/jaegertracing/jaeger/issues/1624
-	// Before the bug was fixed this test was failing as expected when
-	// run with -race flag.
-
-	require.NoError(t, agent.Run())
-
-	t.Log("stopping agent")
-	agent.Stop()
-
-	for i := 0; i < 1000; i++ {
-		if strings.Contains(logBuf.String(), "agent's http server exiting") {
-			return
-		}
-		time.Sleep(time.Millisecond)
-	}
-	t.Fatal("Expecting server exit log")
-}
-
-func TestStartStopWithSocketBufferSet(t *testing.T) {
-	resetDefaultPrometheusRegistry()
-	cfg := Builder{
-		Processors: []ProcessorConfiguration{
-			{
-				Model:    jaegerModel,
-				Protocol: compactProtocol,
-				Workers:  1,
-				Server: ServerConfiguration{
-					HostPort:         "127.0.0.1:0",
-					SocketBufferSize: 10,
-				},
-			},
-		},
-	}
-	mBldr := &metricsbuilder.Builder{HTTPRoute: "/metrics", Backend: "prometheus"}
-	metricsFactory, err := mBldr.CreateMetricsFactory("jaeger")
-	require.NoError(t, err)
-	agent, err := cfg.CreateAgent(fakeCollectorProxy{}, zap.NewNop(), metricsFactory)
-	require.NoError(t, err)
-
-	require.NoError(t, agent.Run())
-
-	t.Log("stopping agent")
-	agent.Stop()
-}
-
-func resetDefaultPrometheusRegistry() {
-	// Create and assign a new Prometheus Registerer/Gatherer for each test
-	registry := prometheus.NewRegistry()
-	prometheus.DefaultRegisterer = registry
-	prometheus.DefaultGatherer = registry
-}
diff --git a/cmd/agent/app/builder_test.go b/cmd/agent/app/builder_test.go
deleted file mode 100644
index a4472374..00000000
--- a/cmd/agent/app/builder_test.go
+++ /dev/null
@@ -1,307 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package app
-
-import (
-	"context"
-	"errors"
-	"expvar"
-	"flag"
-	"fmt"
-	"testing"
-	"time"
-
-	"github.com/spf13/cobra"
-	"github.com/spf13/viper"
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-	"go.uber.org/zap"
-	yaml "gopkg.in/yaml.v3"
-
-	"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/jaeger"
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/configmanager"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/reporter"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/reporter/grpc"
-	"github.com/jaegertracing/jaeger/internal/metricstest"
-	"github.com/jaegertracing/jaeger/pkg/metrics"
-)
-
-var yamlConfig = `
-ignored: abcd
-
-processors:
-    - model: zipkin
-      protocol: compact
-      server:
-        hostPort: 1.1.1.1:5775
-    - model: jaeger
-      protocol: compact
-      server:
-        hostPort: 2.2.2.2:6831
-    - model: jaeger
-      protocol: compact
-      server:
-        hostPort: 3.3.3.3:6831
-        socketBufferSize: 16384
-    - model: jaeger
-      protocol: binary
-      workers: 20
-      server:
-        queueSize: 2000
-        maxPacketSize: 65001
-        hostPort: 3.3.3.3:6832
-
-httpServer:
-    hostPort: 4.4.4.4:5778
-`
-
-func TestBuilderFromConfig(t *testing.T) {
-	cfg := Builder{}
-	err := yaml.Unmarshal([]byte(yamlConfig), &cfg)
-	require.NoError(t, err)
-	assert.Len(t, cfg.Processors, 4)
-	for i := range cfg.Processors {
-		cfg.Processors[i].applyDefaults()
-		cfg.Processors[i].Server.applyDefaults()
-	}
-	assert.Equal(t, ProcessorConfiguration{
-		Model:    zipkinModel,
-		Protocol: compactProtocol,
-		Workers:  10,
-		Server: ServerConfiguration{
-			QueueSize:     1000,
-			MaxPacketSize: 65000,
-			HostPort:      "1.1.1.1:5775",
-		},
-	}, cfg.Processors[0])
-	assert.Equal(t, ProcessorConfiguration{
-		Model:    jaegerModel,
-		Protocol: compactProtocol,
-		Workers:  10,
-		Server: ServerConfiguration{
-			QueueSize:     1000,
-			MaxPacketSize: 65000,
-			HostPort:      "2.2.2.2:6831",
-		},
-	}, cfg.Processors[1])
-	assert.Equal(t, ProcessorConfiguration{
-		Model:    jaegerModel,
-		Protocol: compactProtocol,
-		Workers:  10,
-		Server: ServerConfiguration{
-			QueueSize:        1000,
-			MaxPacketSize:    65000,
-			HostPort:         "3.3.3.3:6831",
-			SocketBufferSize: 16384,
-		},
-	}, cfg.Processors[2])
-	assert.Equal(t, ProcessorConfiguration{
-		Model:    jaegerModel,
-		Protocol: binaryProtocol,
-		Workers:  20,
-		Server: ServerConfiguration{
-			QueueSize:     2000,
-			MaxPacketSize: 65001,
-			HostPort:      "3.3.3.3:6832",
-		},
-	}, cfg.Processors[3])
-	assert.Equal(t, "4.4.4.4:5778", cfg.HTTPServer.HostPort)
-}
-
-func TestBuilderWithExtraReporter(t *testing.T) {
-	cfg := &Builder{}
-	agent, err := cfg.CreateAgent(fakeCollectorProxy{}, zap.NewNop(), metrics.NullFactory)
-	require.NoError(t, err)
-	assert.NotNil(t, agent)
-}
-
-func TestBuilderWithProcessorErrors(t *testing.T) {
-	testCases := []struct {
-		model       Model
-		protocol    Protocol
-		hostPort    string
-		err         string
-		errContains string
-	}{
-		{protocol: Protocol("bad"), err: "cannot find protocol factory for protocol bad"},
-		{protocol: compactProtocol, model: Model("bad"), err: "cannot find agent processor for data model bad"},
-		{protocol: compactProtocol, model: jaegerModel, err: "no host:port provided for udp server: {QueueSize:1000 MaxPacketSize:65000 SocketBufferSize:0 HostPort:}"},
-		{protocol: compactProtocol, model: zipkinModel, hostPort: "bad-host-port", errContains: "bad-host-port"},
-	}
-	for _, tc := range testCases {
-		testCase := tc // capture loop var
-		cfg := &Builder{
-			Processors: []ProcessorConfiguration{
-				{
-					Model:    testCase.model,
-					Protocol: testCase.protocol,
-					Server: ServerConfiguration{
-						HostPort: testCase.hostPort,
-					},
-				},
-			},
-		}
-		_, err := cfg.CreateAgent(&fakeCollectorProxy{}, zap.NewNop(), metrics.NullFactory)
-		require.Error(t, err)
-		if testCase.err != "" {
-			assert.ErrorContains(t, err, testCase.err)
-		} else if testCase.errContains != "" {
-			assert.ErrorContains(t, err, testCase.errContains, "error must contain %s", testCase.errContains)
-		}
-	}
-}
-
-func TestMultipleCollectorProxies(t *testing.T) {
-	b := Builder{}
-	ra := fakeCollectorProxy{}
-	rb := fakeCollectorProxy{}
-	b.WithReporter(ra)
-	r := b.getReporter(rb)
-	mr, ok := r.(reporter.MultiReporter)
-	require.True(t, ok)
-	assert.Equal(t, rb, mr[0])
-	assert.Equal(t, ra, mr[1])
-}
-
-type fakeCollectorProxy struct{}
-
-func (fakeCollectorProxy) GetReporter() reporter.Reporter {
-	return fakeCollectorProxy{}
-}
-
-func (fakeCollectorProxy) GetManager() configmanager.ClientConfigManager {
-	return fakeCollectorProxy{}
-}
-
-func (fakeCollectorProxy) EmitZipkinBatch(_ context.Context, _ []*zipkincore.Span) (err error) {
-	return nil
-}
-
-func (fakeCollectorProxy) EmitBatch(_ context.Context, _ *jaeger.Batch) (err error) {
-	return nil
-}
-
-func (fakeCollectorProxy) Close() error {
-	return nil
-}
-
-func (fakeCollectorProxy) GetSamplingStrategy(_ context.Context, _ string) (*api_v2.SamplingStrategyResponse, error) {
-	return nil, errors.New("no peers available")
-}
-
-func TestCreateCollectorProxy(t *testing.T) {
-	tests := []struct {
-		flags  []string
-		err    string
-		metric metricstest.ExpectedMetric
-	}{
-		{
-			err: "at least one collector hostPort address is required when resolver is not available",
-		},
-		{
-			flags: []string{"--reporter.type=grpc"},
-			err:   "at least one collector hostPort address is required when resolver is not available",
-		},
-		{
-			flags:  []string{"--reporter.type=grpc", "--reporter.grpc.host-port=foo"},
-			metric: metricstest.ExpectedMetric{Name: "reporter.batches.failures", Tags: map[string]string{"protocol": "grpc", "format": "jaeger"}, Value: 1},
-		},
-		{
-			flags:  []string{"--reporter.type=grpc", "--reporter.grpc.host-port=foo"},
-			metric: metricstest.ExpectedMetric{Name: "reporter.batches.failures", Tags: map[string]string{"protocol": "grpc", "format": "jaeger"}, Value: 1},
-		},
-	}
-
-	for _, test := range tests {
-		t.Run("", func(t *testing.T) {
-			t.Parallel()
-			flags := &flag.FlagSet{}
-			grpc.AddFlags(flags)
-			reporter.AddFlags(flags)
-
-			command := cobra.Command{}
-			command.PersistentFlags().AddGoFlagSet(flags)
-			v := viper.New()
-			v.BindPFlags(command.PersistentFlags())
-
-			err := command.ParseFlags(test.flags)
-			require.NoError(t, err)
-
-			rOpts := new(reporter.Options).InitFromViper(v, zap.NewNop())
-			grpcBuilder, err := grpc.NewConnBuilder().InitFromViper(v)
-			require.NoError(t, err)
-			metricsFactory := metricstest.NewFactory(time.Microsecond)
-			defer metricsFactory.Stop()
-			builders := map[reporter.Type]CollectorProxyBuilder{
-				reporter.GRPC: GRPCCollectorProxyBuilder(grpcBuilder),
-			}
-			ctx, cancel := context.WithCancel(context.Background())
-			defer cancel()
-			proxy, err := CreateCollectorProxy(ctx, ProxyBuilderOptions{
-				Options: *rOpts,
-				Metrics: metricsFactory,
-				Logger:  zap.NewNop(),
-			}, builders)
-			if err == nil {
-				defer proxy.Close()
-			}
-			if test.err != "" {
-				require.EqualError(t, err, test.err)
-				assert.Nil(t, proxy)
-			} else {
-				require.NoError(t, err)
-				proxy.GetReporter().EmitBatch(context.Background(), jaeger.NewBatch())
-				metricsFactory.AssertCounterMetrics(t, test.metric)
-			}
-		})
-	}
-}
-
-func TestCreateCollectorProxy_UnknownReporter(t *testing.T) {
-	grpcBuilder := grpc.NewConnBuilder()
-	builders := map[reporter.Type]CollectorProxyBuilder{
-		reporter.GRPC: GRPCCollectorProxyBuilder(grpcBuilder),
-	}
-	ctx, cancel := context.WithCancel(context.Background())
-	defer cancel()
-	proxy, err := CreateCollectorProxy(ctx, ProxyBuilderOptions{}, builders)
-	assert.Nil(t, proxy)
-	require.EqualError(t, err, "unknown reporter type ")
-}
-
-func TestPublishOpts(t *testing.T) {
-	v := viper.New()
-	cfg := &Builder{}
-	command := cobra.Command{}
-	flags := &flag.FlagSet{}
-	AddFlags(flags)
-	command.PersistentFlags().AddGoFlagSet(flags)
-	v.BindPFlags(command.PersistentFlags())
-	err := command.ParseFlags([]string{
-		"--http-server.host-port=:8080",
-		"--processor.jaeger-binary.server-host-port=:1111",
-		"--processor.jaeger-binary.server-max-packet-size=4242",
-		"--processor.jaeger-binary.server-queue-size=24",
-		"--processor.jaeger-binary.workers=42",
-	})
-	require.NoError(t, err)
-	cfg.InitFromViper(v)
-
-	baseMetrics := metricstest.NewFactory(time.Second)
-	defer baseMetrics.Stop()
-	agent, err := cfg.CreateAgent(fakeCollectorProxy{}, zap.NewNop(), baseMetrics)
-	require.NoError(t, err)
-	assert.NotNil(t, agent)
-	require.NoError(t, agent.Run())
-	defer agent.Stop()
-
-	p := cfg.Processors[2]
-	prefix := fmt.Sprintf(processorPrefixFmt, p.Model, p.Protocol)
-	assert.EqualValues(t, 4242, expvar.Get(prefix+suffixServerMaxPacketSize).(*expvar.Int).Value())
-	assert.EqualValues(t, 24, expvar.Get(prefix+suffixServerQueueSize).(*expvar.Int).Value())
-	assert.EqualValues(t, 42, expvar.Get(prefix+suffixWorkers).(*expvar.Int).Value())
-}
diff --git a/cmd/agent/app/configmanager/grpc/manager_test.go b/cmd/agent/app/configmanager/grpc/manager_test.go
deleted file mode 100644
index 35049c42..00000000
--- a/cmd/agent/app/configmanager/grpc/manager_test.go
+++ /dev/null
@@ -1,64 +0,0 @@
-// Copyright (c) 2018 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package grpc
-
-import (
-	"context"
-	"net"
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-	"google.golang.org/grpc"
-	"google.golang.org/grpc/credentials/insecure"
-
-	"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
-	"github.com/jaegertracing/jaeger/internal/testutils"
-)
-
-func TestSamplingManager_GetSamplingStrategy(t *testing.T) {
-	s, addr := initializeGRPCTestServer(t, func(s *grpc.Server) {
-		api_v2.RegisterSamplingManagerServer(s, &mockSamplingHandler{})
-	})
-	conn, err := grpc.NewClient(addr.String(), grpc.WithTransportCredentials(insecure.NewCredentials()))
-	t.Cleanup(func() { require.NoError(t, conn.Close()) })
-	require.NoError(t, err)
-	defer s.GracefulStop()
-	manager := NewConfigManager(conn)
-	resp, err := manager.GetSamplingStrategy(context.Background(), "any")
-	require.NoError(t, err)
-	assert.Equal(t, &api_v2.SamplingStrategyResponse{StrategyType: api_v2.SamplingStrategyType_PROBABILISTIC}, resp)
-}
-
-func TestSamplingManager_GetSamplingStrategy_error(t *testing.T) {
-	conn, err := grpc.NewClient("foo", grpc.WithTransportCredentials(insecure.NewCredentials()))
-	t.Cleanup(func() { require.NoError(t, conn.Close()) })
-	require.NoError(t, err)
-	manager := NewConfigManager(conn)
-	resp, err := manager.GetSamplingStrategy(context.Background(), "any")
-	require.Nil(t, resp)
-	assert.ErrorContains(t, err, "failed to get sampling strategy")
-}
-
-type mockSamplingHandler struct{}
-
-func (*mockSamplingHandler) GetSamplingStrategy(context.Context, *api_v2.SamplingStrategyParameters) (*api_v2.SamplingStrategyResponse, error) {
-	return &api_v2.SamplingStrategyResponse{StrategyType: api_v2.SamplingStrategyType_PROBABILISTIC}, nil
-}
-
-func initializeGRPCTestServer(t *testing.T, beforeServe func(server *grpc.Server)) (*grpc.Server, net.Addr) {
-	server := grpc.NewServer()
-	lis, err := net.Listen("tcp", "localhost:0")
-	require.NoError(t, err)
-	beforeServe(server)
-	go func() {
-		err := server.Serve(lis)
-		assert.NoError(t, err)
-	}()
-	return server, lis.Addr()
-}
-
-func TestMain(m *testing.M) {
-	testutils.VerifyGoLeaks(m)
-}
diff --git a/cmd/agent/app/configmanager/metrics_test.go b/cmd/agent/app/configmanager/metrics_test.go
deleted file mode 100644
index 35978ce8..00000000
--- a/cmd/agent/app/configmanager/metrics_test.go
+++ /dev/null
@@ -1,65 +0,0 @@
-// Copyright (c) 2018 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package configmanager
-
-import (
-	"context"
-	"errors"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/require"
-
-	"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
-	"github.com/jaegertracing/jaeger/internal/metricstest"
-	"github.com/jaegertracing/jaeger/internal/testutils"
-)
-
-type noopManager struct{}
-
-func (noopManager) GetSamplingStrategy(_ context.Context, s string) (*api_v2.SamplingStrategyResponse, error) {
-	if s == "failed" {
-		return nil, errors.New("failed")
-	}
-	return &api_v2.SamplingStrategyResponse{StrategyType: api_v2.SamplingStrategyType_PROBABILISTIC}, nil
-}
-
-func TestMetrics(t *testing.T) {
-	tests := []struct {
-		expected []metricstest.ExpectedMetric
-		err      error
-	}{
-		{expected: []metricstest.ExpectedMetric{
-			{Name: "collector-proxy", Tags: map[string]string{"result": "ok", "endpoint": "sampling"}, Value: 1},
-			{Name: "collector-proxy", Tags: map[string]string{"result": "err", "endpoint": "sampling"}, Value: 0},
-		}},
-		{expected: []metricstest.ExpectedMetric{
-			{Name: "collector-proxy", Tags: map[string]string{"result": "ok", "endpoint": "sampling"}, Value: 0},
-			{Name: "collector-proxy", Tags: map[string]string{"result": "err", "endpoint": "sampling"}, Value: 1},
-		}, err: errors.New("failed")},
-	}
-
-	for _, test := range tests {
-		t.Run("", func(t *testing.T) {
-			metricsFactory := metricstest.NewFactory(time.Microsecond)
-			defer metricsFactory.Stop()
-			mgr := WrapWithMetrics(&noopManager{}, metricsFactory)
-
-			if test.err != nil {
-				s, err := mgr.GetSamplingStrategy(context.Background(), test.err.Error())
-				require.Nil(t, s)
-				require.EqualError(t, err, test.err.Error())
-			} else {
-				s, err := mgr.GetSamplingStrategy(context.Background(), "")
-				require.NoError(t, err)
-				require.NotNil(t, s)
-			}
-			metricsFactory.AssertCounterMetrics(t, test.expected...)
-		})
-	}
-}
-
-func TestMain(m *testing.M) {
-	testutils.VerifyGoLeaks(m)
-}
diff --git a/cmd/agent/app/customtransport/buffered_read_transport_test.go b/cmd/agent/app/customtransport/buffered_read_transport_test.go
deleted file mode 100644
index 42b46b37..00000000
--- a/cmd/agent/app/customtransport/buffered_read_transport_test.go
+++ /dev/null
@@ -1,66 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package customtransport
-
-import (
-	"bytes"
-	"context"
-	"testing"
-
-	"github.com/stretchr/testify/require"
-
-	"github.com/jaegertracing/jaeger/internal/testutils"
-)
-
-// TestTBufferedReadTransport tests the TBufferedReadTransport
-func TestTBufferedReadTransport(t *testing.T) {
-	buffer := bytes.NewBuffer([]byte("testString"))
-	trans, err := NewTBufferedReadTransport(buffer)
-	require.NotNil(t, trans)
-	require.NoError(t, err)
-	require.Equal(t, uint64(10), trans.RemainingBytes())
-
-	firstRead := make([]byte, 4)
-	n, err := trans.Read(firstRead)
-	require.NoError(t, err)
-	require.Equal(t, 4, n)
-	require.Equal(t, []byte("test"), firstRead)
-	require.Equal(t, uint64(6), trans.RemainingBytes())
-
-	secondRead := make([]byte, 7)
-	n, err = trans.Read(secondRead)
-	require.NoError(t, err)
-	require.Equal(t, 6, n)
-	require.Equal(t, []byte("String"), secondRead[0:6])
-	require.Equal(t, uint64(0), trans.RemainingBytes())
-}
-
-// TestTBufferedReadTransportEmptyFunctions tests the empty functions in TBufferedReadTransport
-func TestTBufferedReadTransportEmptyFunctions(t *testing.T) {
-	byteArr := make([]byte, 1)
-	trans, err := NewTBufferedReadTransport(bytes.NewBuffer(byteArr))
-	require.NotNil(t, trans)
-	require.NoError(t, err)
-
-	err = trans.Open()
-	require.NoError(t, err)
-
-	err = trans.Close()
-	require.NoError(t, err)
-
-	err = trans.Flush(context.Background())
-	require.NoError(t, err)
-
-	n, err := trans.Write(byteArr)
-	require.Equal(t, 1, n)
-	require.NoError(t, err)
-
-	isOpen := trans.IsOpen()
-	require.True(t, isOpen)
-}
-
-func TestMain(m *testing.M) {
-	testutils.VerifyGoLeaks(m)
-}
diff --git a/cmd/agent/app/flags_test.go b/cmd/agent/app/flags_test.go
deleted file mode 100644
index 93dc89c0..00000000
--- a/cmd/agent/app/flags_test.go
+++ /dev/null
@@ -1,42 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package app
-
-import (
-	"flag"
-	"testing"
-
-	"github.com/spf13/cobra"
-	"github.com/spf13/viper"
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-)
-
-func TestBindFlags(t *testing.T) {
-	v := viper.New()
-	b := &Builder{}
-	command := cobra.Command{}
-	flags := &flag.FlagSet{}
-	AddFlags(flags)
-	command.PersistentFlags().AddGoFlagSet(flags)
-	v.BindPFlags(command.PersistentFlags())
-
-	err := command.ParseFlags([]string{
-		"--http-server.host-port=:8080",
-		"--processor.jaeger-binary.server-host-port=:1111",
-		"--processor.jaeger-binary.server-max-packet-size=4242",
-		"--processor.jaeger-binary.server-queue-size=42",
-		"--processor.jaeger-binary.workers=42",
-	})
-	require.NoError(t, err)
-
-	b.InitFromViper(v)
-	assert.Len(t, b.Processors, 3)
-	assert.Equal(t, ":8080", b.HTTPServer.HostPort)
-	assert.Equal(t, ":1111", b.Processors[2].Server.HostPort)
-	assert.Equal(t, 4242, b.Processors[2].Server.MaxPacketSize)
-	assert.Equal(t, 42, b.Processors[2].Server.QueueSize)
-	assert.Equal(t, 42, b.Processors[2].Workers)
-}
diff --git a/cmd/agent/app/httpserver/srv_test.go b/cmd/agent/app/httpserver/srv_test.go
deleted file mode 100644
index ed503e3f..00000000
--- a/cmd/agent/app/httpserver/srv_test.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package httpserver
-
-import (
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-	"go.uber.org/zap"
-
-	"github.com/jaegertracing/jaeger/internal/testutils"
-)
-
-func TestHTTPServer(t *testing.T) {
-	s := NewHTTPServer(":1", nil, nil, zap.NewNop())
-	assert.NotNil(t, s)
-}
-
-func TestMain(m *testing.M) {
-	testutils.VerifyGoLeaks(m)
-}
diff --git a/cmd/agent/app/package_test.go b/cmd/agent/app/package_test.go
deleted file mode 100644
index 4a633786..00000000
--- a/cmd/agent/app/package_test.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2024 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package app
-
-import (
-	"testing"
-
-	"github.com/jaegertracing/jaeger/internal/testutils"
-)
-
-func TestMain(m *testing.M) {
-	testutils.VerifyGoLeaks(m)
-}
diff --git a/cmd/agent/app/processors/package_test.go b/cmd/agent/app/processors/package_test.go
deleted file mode 100644
index 364512b7..00000000
--- a/cmd/agent/app/processors/package_test.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2024 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package processors
-
-import (
-	"testing"
-
-	"github.com/jaegertracing/jaeger/internal/testutils"
-)
-
-func TestMain(m *testing.M) {
-	testutils.VerifyGoLeaks(m)
-}
diff --git a/cmd/agent/app/processors/thrift_processor_test.go b/cmd/agent/app/processors/thrift_processor_test.go
deleted file mode 100644
index 52330ed6..00000000
--- a/cmd/agent/app/processors/thrift_processor_test.go
+++ /dev/null
@@ -1,235 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package processors
-
-import (
-	"context"
-	"errors"
-	"testing"
-	"time"
-
-	"github.com/apache/thrift/lib/go/thrift"
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-	"go.uber.org/zap/zaptest"
-	"google.golang.org/grpc"
-	"google.golang.org/grpc/credentials/insecure"
-
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/agent"
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/jaeger"
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/reporter"
-	grpcrep "github.com/jaegertracing/jaeger/cmd/agent/app/reporter/grpc"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/servers"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/servers/thriftudp"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/testutils"
-	"github.com/jaegertracing/jaeger/internal/metricstest"
-	"github.com/jaegertracing/jaeger/pkg/metrics"
-)
-
-// TODO make these tests faster, they take almost 4 seconds
-
-var (
-	compactFactory = thrift.NewTCompactProtocolFactoryConf(&thrift.TConfiguration{})
-	binaryFactory  = thrift.NewTBinaryProtocolFactoryConf(&thrift.TConfiguration{})
-
-	testSpanName = "span1"
-
-	batch = &jaeger.Batch{
-		Process: jaeger.NewProcess(),
-		Spans:   []*jaeger.Span{{OperationName: testSpanName}},
-	}
-)
-
-func createProcessor(t *testing.T, mFactory metrics.Factory, tFactory thrift.TProtocolFactory, handler AgentProcessor) (string, Processor) {
-	transport, err := thriftudp.NewTUDPServerTransport("127.0.0.1:0")
-	require.NoError(t, err)
-
-	queueSize := 10
-	maxPacketSize := 65000
-	server, err := servers.NewUDPServer(transport, queueSize, maxPacketSize, mFactory)
-	require.NoError(t, err)
-
-	numProcessors := 1
-	processor, err := NewThriftProcessor(server, numProcessors, mFactory, tFactory, handler, zaptest.NewLogger(t))
-	require.NoError(t, err)
-
-	go processor.Serve()
-	for i := 0; i < 1000; i++ {
-		if processor.IsServing() {
-			break
-		}
-		time.Sleep(10 * time.Microsecond)
-	}
-	require.True(t, processor.IsServing(), "processor must be serving")
-
-	return transport.Addr().String(), processor
-}
-
-// revive:disable-next-line function-result-limit
-func initCollectorAndReporter(t *testing.T) (*metricstest.Factory, *testutils.GrpcCollector, reporter.Reporter, *grpc.ClientConn) {
-	grpcCollector := testutils.StartGRPCCollector(t)
-	conn, err := grpc.NewClient(grpcCollector.Listener().Addr().String(), grpc.WithTransportCredentials(insecure.NewCredentials()))
-	require.NoError(t, err)
-	rep := grpcrep.NewReporter(conn, map[string]string{}, zaptest.NewLogger(t))
-	metricsFactory := metricstest.NewFactory(0)
-	metricsReporter := reporter.WrapWithMetrics(rep, metricsFactory)
-	return metricsFactory, grpcCollector, metricsReporter, conn
-}
-
-func TestNewThriftProcessor_ZeroCount(t *testing.T) {
-	_, err := NewThriftProcessor(nil, 0, nil, nil, nil, zaptest.NewLogger(t))
-	require.EqualError(t, err, "number of processors must be greater than 0, called with 0")
-}
-
-func TestProcessorWithCompactZipkin(t *testing.T) {
-	metricsFactory, collector, metricsReporter, conn := initCollectorAndReporter(t)
-	defer conn.Close()
-	defer collector.Close()
-
-	hostPort, processor := createProcessor(t, metricsFactory, compactFactory, agent.NewAgentProcessor(metricsReporter))
-	defer processor.Stop()
-
-	client, clientCloser, err := testutils.NewZipkinThriftUDPClient(hostPort)
-	require.NoError(t, err)
-	defer clientCloser.Close()
-
-	span := zipkincore.NewSpan()
-	span.Name = testSpanName
-	span.Annotations = []*zipkincore.Annotation{{Value: zipkincore.CLIENT_SEND, Host: &zipkincore.Endpoint{ServiceName: "foo"}}}
-
-	err = client.EmitZipkinBatch(context.Background(), []*zipkincore.Span{span})
-	require.NoError(t, err)
-
-	assertZipkinProcessorCorrectness(t, collector, metricsFactory)
-}
-
-type failingHandler struct {
-	err error
-}
-
-func (h failingHandler) Process(context.Context, thrift.TProtocol /* iprot */, thrift.TProtocol /* oprot */) (success bool, err thrift.TException) {
-	return false, thrift.NewTApplicationException(0, h.err.Error())
-}
-
-func TestProcessor_HandlerError(t *testing.T) {
-	metricsFactory := metricstest.NewFactory(0)
-
-	handler := failingHandler{err: errors.New("doh")}
-
-	hostPort, processor := createProcessor(t, metricsFactory, compactFactory, handler)
-	defer processor.Stop()
-
-	client, clientCloser, err := testutils.NewZipkinThriftUDPClient(hostPort)
-	require.NoError(t, err)
-	defer clientCloser.Close()
-
-	err = client.EmitZipkinBatch(context.Background(), []*zipkincore.Span{{Name: testSpanName}})
-	require.NoError(t, err)
-
-	for i := 0; i < 10; i++ {
-		c, _ := metricsFactory.Snapshot()
-		if _, ok := c["thrift.udp.t-processor.handler-errors"]; ok {
-			break
-		}
-		time.Sleep(time.Millisecond)
-	}
-
-	metricsFactory.AssertCounterMetrics(t,
-		metricstest.ExpectedMetric{Name: "thrift.udp.t-processor.handler-errors", Value: 1},
-		metricstest.ExpectedMetric{Name: "thrift.udp.server.packets.processed", Value: 1},
-	)
-}
-
-// TestJaegerProcessor instantiates a real UDP receiver and a real gRPC collector
-// and executes end-to-end batch submission.
-func TestJaegerProcessor(t *testing.T) {
-	tests := []struct {
-		factory thrift.TProtocolFactory
-		name    string
-	}{
-		{compactFactory, "compact"},
-		{binaryFactory, "binary"},
-	}
-
-	for _, test := range tests {
-		t.Run(test.name, func(t *testing.T) {
-			metricsFactory, collector, reporter, conn := initCollectorAndReporter(t)
-
-			hostPort, processor := createProcessor(t, metricsFactory, test.factory, agent.NewAgentProcessor(reporter))
-
-			client, clientCloser, err := testutils.NewJaegerThriftUDPClient(hostPort, test.factory)
-			require.NoError(t, err)
-
-			err = client.EmitBatch(context.Background(), batch)
-			require.NoError(t, err)
-
-			assertJaegerProcessorCorrectness(t, collector, metricsFactory)
-
-			processor.Stop()
-			clientCloser.Close()
-			conn.Close()
-			collector.Close()
-		})
-	}
-}
-
-func assertJaegerProcessorCorrectness(t *testing.T, collector *testutils.GrpcCollector, metricsFactory *metricstest.Factory) {
-	sizeF := func() int {
-		return len(collector.GetJaegerBatches())
-	}
-	nameF := func() string {
-		return collector.GetJaegerBatches()[0].Spans[0].OperationName
-	}
-	assertCollectorReceivedData(t, metricsFactory, sizeF, nameF, "jaeger")
-}
-
-func assertZipkinProcessorCorrectness(t *testing.T, collector *testutils.GrpcCollector, metricsFactory *metricstest.Factory) {
-	sizeF := func() int {
-		return len(collector.GetJaegerBatches())
-	}
-	nameF := func() string {
-		return collector.GetJaegerBatches()[0].Spans[0].OperationName
-	}
-	assertCollectorReceivedData(t, metricsFactory, sizeF, nameF, "zipkin")
-}
-
-// assertCollectorReceivedData verifies that collector received the data
-// and that agent reporter emitted corresponding metrics.
-func assertCollectorReceivedData(
-	t *testing.T,
-	metricsFactory *metricstest.Factory,
-	sizeF func() int,
-	nameF func() string,
-	format string,
-) {
-	require.Eventually(t,
-		func() bool { return sizeF() == 1 },
-		5*time.Second,
-		time.Millisecond,
-		"server should have received spans")
-	assert.Equal(t, testSpanName, nameF())
-
-	key := "reporter.spans.submitted|format=" + format
-	ok := assert.Eventuallyf(t,
-		func() bool {
-			c, _ := metricsFactory.Snapshot()
-			_, ok := c[key]
-			return ok
-		},
-		5*time.Second,
-		time.Millisecond,
-		"reporter should have emitted metric %s", key)
-	if !ok {
-		c, _ := metricsFactory.Snapshot()
-		t.Log("all metrics", c)
-	}
-
-	metricsFactory.AssertCounterMetrics(t, []metricstest.ExpectedMetric{
-		{Name: "reporter.batches.submitted", Tags: map[string]string{"format": format}, Value: 1},
-		{Name: "reporter.spans.submitted", Tags: map[string]string{"format": format}, Value: 1},
-		{Name: "thrift.udp.server.packets.processed", Value: 1},
-	}...)
-}
diff --git a/cmd/agent/app/reporter/client_metrics_test.go b/cmd/agent/app/reporter/client_metrics_test.go
deleted file mode 100644
index 667de0ea..00000000
--- a/cmd/agent/app/reporter/client_metrics_test.go
+++ /dev/null
@@ -1,274 +0,0 @@
-// Copyright (c) 2020 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package reporter
-
-import (
-	"context"
-	"fmt"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-	"go.uber.org/zap"
-	"go.uber.org/zap/zaptest/observer"
-
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/jaeger"
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/testutils"
-	"github.com/jaegertracing/jaeger/internal/metricstest"
-)
-
-type clientMetricsTest struct {
-	mr   *testutils.InMemoryReporter
-	r    *ClientMetricsReporter
-	logs *observer.ObservedLogs
-	mb   *metricstest.Factory
-}
-
-func (tr *clientMetricsTest) assertLog(t *testing.T, msg, clientUUID string) {
-	logs := tr.logs.FilterMessageSnippet(msg)
-	if clientUUID == "" {
-		assert.Equal(t, 0, logs.Len(), "not expecting log '%s", msg)
-	} else if assert.Equal(t, 1, logs.Len(), "expecting one log '%s'", msg) {
-		field := logs.All()[0].ContextMap()["client-uuid"]
-		assert.Equal(t, clientUUID, field, "client-uuid should be logged")
-	}
-}
-
-func testClientMetrics(fn func(tr *clientMetricsTest)) {
-	testClientMetricsWithParams(ClientMetricsReporterParams{}, fn)
-}
-
-func testClientMetricsWithParams(params ClientMetricsReporterParams, fn func(tr *clientMetricsTest)) {
-	r1 := testutils.NewInMemoryReporter()
-	zapCore, logs := observer.New(zap.DebugLevel)
-	mb := metricstest.NewFactory(time.Hour)
-	defer mb.Stop()
-
-	params.Reporter = r1
-	params.Logger = zap.New(zapCore)
-	params.MetricsFactory = mb
-
-	r := WrapWithClientMetrics(params)
-	defer r.Close()
-
-	tr := &clientMetricsTest{
-		mr:   r1,
-		r:    r,
-		logs: logs,
-		mb:   mb,
-	}
-	fn(tr)
-}
-
-func TestClientMetricsReporter_Zipkin(t *testing.T) {
-	testClientMetrics(func(tr *clientMetricsTest) {
-		require.NoError(t, tr.r.EmitZipkinBatch(context.Background(), []*zipkincore.Span{{}}))
-		assert.Len(t, tr.mr.ZipkinSpans(), 1)
-	})
-}
-
-func TestClientMetricsReporter_Jaeger(t *testing.T) {
-	testClientMetrics(func(tr *clientMetricsTest) {
-		blank := ""
-		clientUUID := "foobar"
-		nPtr := func(v int64) *int64 { return &v }
-		const prefix = "client_stats."
-		tag := func(name, value string) map[string]string { return map[string]string{name: value} }
-
-		tests := []struct {
-			clientUUID  *string
-			seqNo       *int64
-			stats       *jaeger.ClientStats
-			runExpire   bool // invoke expireClientMetrics to update the gauge
-			expLog      string
-			expCounters []metricstest.ExpectedMetric
-			expGauges   []metricstest.ExpectedMetric
-		}{
-			{},
-			{clientUUID: &blank},
-			{clientUUID: &clientUUID},
-			{
-				clientUUID: &clientUUID,
-				seqNo:      nPtr(100),
-				expLog:     clientUUID,
-				stats: &jaeger.ClientStats{
-					FullQueueDroppedSpans: 10,
-					TooLargeDroppedSpans:  10,
-					FailedToEmitSpans:     10,
-				},
-				runExpire: true,
-				// first batch cannot increment counters, only capture the baseline
-				expCounters: []metricstest.ExpectedMetric{
-					{Name: prefix + "batches_received", Value: 1},
-					{Name: prefix + "batches_sent", Value: 0},
-					{Name: prefix + "spans_dropped", Tags: tag("cause", "full-queue"), Value: 0},
-					{Name: prefix + "spans_dropped", Tags: tag("cause", "too-large"), Value: 0},
-					{Name: prefix + "spans_dropped", Tags: tag("cause", "send-failure"), Value: 0},
-				},
-				expGauges: []metricstest.ExpectedMetric{
-					{Name: prefix + "connected_clients", Value: 1},
-				},
-			},
-			{
-				clientUUID: &clientUUID,
-				seqNo:      nPtr(105),
-				stats: &jaeger.ClientStats{
-					FullQueueDroppedSpans: 15,
-					TooLargeDroppedSpans:  15,
-					FailedToEmitSpans:     15,
-				},
-				expCounters: []metricstest.ExpectedMetric{
-					{Name: prefix + "batches_received", Value: 2},
-					{Name: prefix + "batches_sent", Value: 5},
-					{Name: prefix + "spans_dropped", Tags: tag("cause", "full-queue"), Value: 5},
-					{Name: prefix + "spans_dropped", Tags: tag("cause", "too-large"), Value: 5},
-					{Name: prefix + "spans_dropped", Tags: tag("cause", "send-failure"), Value: 5},
-				},
-			},
-			{
-				clientUUID: &clientUUID,
-				seqNo:      nPtr(90), // out of order batch will be ignored
-				expCounters: []metricstest.ExpectedMetric{
-					{Name: prefix + "batches_received", Value: 3},
-					{Name: prefix + "batches_sent", Value: 5}, // unchanged!
-				},
-			},
-			{
-				clientUUID: &clientUUID,
-				seqNo:      nPtr(110),
-				// use different stats values to test the correct assignments
-				stats: &jaeger.ClientStats{
-					FullQueueDroppedSpans: 17,
-					TooLargeDroppedSpans:  18,
-					FailedToEmitSpans:     19,
-				}, expCounters: []metricstest.ExpectedMetric{
-					{Name: prefix + "batches_received", Value: 4},
-					{Name: prefix + "batches_sent", Value: 10},
-					{Name: prefix + "spans_dropped", Tags: tag("cause", "full-queue"), Value: 7},
-					{Name: prefix + "spans_dropped", Tags: tag("cause", "too-large"), Value: 8},
-					{Name: prefix + "spans_dropped", Tags: tag("cause", "send-failure"), Value: 9},
-				},
-			},
-		}
-
-		for i, test := range tests {
-			t.Run(fmt.Sprintf("iter%d", i), func(t *testing.T) {
-				tr.logs.TakeAll()
-
-				batch := &jaeger.Batch{
-					Spans: []*jaeger.Span{{}},
-					Process: &jaeger.Process{
-						ServiceName: "blah",
-					},
-					SeqNo: test.seqNo,
-					Stats: test.stats,
-				}
-				if test.clientUUID != nil {
-					batch.Process.Tags = []*jaeger.Tag{{Key: "client-uuid", VStr: test.clientUUID}}
-				}
-
-				err := tr.r.EmitBatch(context.Background(), batch)
-				require.NoError(t, err)
-				assert.Len(t, tr.mr.Spans(), i+1)
-
-				tr.assertLog(t, "new client", test.expLog)
-
-				if test.runExpire {
-					tr.r.expireClientMetrics(time.Now())
-				}
-
-				if m := test.expCounters; len(m) > 0 {
-					tr.mb.AssertCounterMetrics(t, m...)
-				}
-				if m := test.expGauges; len(m) > 0 {
-					tr.mb.AssertGaugeMetrics(t, m...)
-				}
-			})
-		}
-	})
-}
-
-func TestClientMetricsReporter_ClientUUID(t *testing.T) {
-	id := "my-client-id"
-	tests := []struct {
-		process    *jaeger.Process
-		clientUUID string
-	}{
-		{process: nil, clientUUID: ""},
-		{process: &jaeger.Process{}, clientUUID: ""},
-		{process: &jaeger.Process{Tags: []*jaeger.Tag{}}, clientUUID: ""},
-		{process: &jaeger.Process{Tags: []*jaeger.Tag{{Key: "blah"}}}, clientUUID: ""},
-		{process: &jaeger.Process{Tags: []*jaeger.Tag{{Key: "client-uuid"}}}, clientUUID: ""},
-		{process: &jaeger.Process{Tags: []*jaeger.Tag{{Key: "client-uuid", VStr: &id}}}, clientUUID: id},
-	}
-	for i, test := range tests {
-		t.Run(fmt.Sprintf("iter%d", i), func(t *testing.T) {
-			assert.Equal(t, test.clientUUID, clientUUID(&jaeger.Batch{Process: test.process}))
-		})
-	}
-}
-
-func TestClientMetricsReporter_Expire(t *testing.T) {
-	const expireTTL = 50 * time.Millisecond
-	params := ClientMetricsReporterParams{
-		ExpireFrequency: 1 * time.Millisecond,
-		ExpireTTL:       expireTTL,
-	}
-	testClientMetricsWithParams(params, func(tr *clientMetricsTest) {
-		nPtr := func(v int64) *int64 { return &v }
-		clientUUID := "blah"
-		batch := &jaeger.Batch{
-			Spans: []*jaeger.Span{{}},
-			Process: &jaeger.Process{
-				ServiceName: "blah",
-				Tags:        []*jaeger.Tag{{Key: "client-uuid", VStr: &clientUUID}},
-			},
-			SeqNo: nPtr(1),
-		}
-
-		getGauge := func() int64 {
-			_, gauges := tr.mb.Snapshot()
-			return gauges["client_stats.connected_clients"]
-		}
-
-		t.Run("detect new client", func(t *testing.T) {
-			assert.EqualValues(t, 0, getGauge(), "start with gauge=0")
-
-			err := tr.r.EmitBatch(context.Background(), batch)
-			require.NoError(t, err)
-			assert.Len(t, tr.mr.Spans(), 1)
-
-			// we want this test to pass asap, but need to account for possible CPU contention in the CI
-			var gauge int64
-			for i := 0; i < 1000; i++ {
-				time.Sleep(1 * time.Millisecond)
-				if gauge = getGauge(); gauge == 1 {
-					t.Logf("gauge=1 detected on iteration %d", i)
-					tr.assertLog(t, "new client", clientUUID)
-					return
-				}
-			}
-			require.EqualValues(t, 1, gauge)
-		})
-
-		t.Run("detect stale client", func(t *testing.T) {
-			assert.EqualValues(t, 1, getGauge(), "start with gauge=1")
-
-			time.Sleep(expireTTL)
-
-			var gauge int64
-			for i := 0; i < 1000; i++ {
-				time.Sleep(1 * time.Millisecond)
-				if gauge = getGauge(); gauge == 0 {
-					t.Logf("gauge=0 detected on iteration %d", i)
-					tr.assertLog(t, "freeing stats", clientUUID)
-					return
-				}
-			}
-			require.EqualValues(t, 0, gauge)
-		})
-	})
-}
diff --git a/cmd/agent/app/reporter/connect_metrics_test.go b/cmd/agent/app/reporter/connect_metrics_test.go
deleted file mode 100644
index beeb7d28..00000000
--- a/cmd/agent/app/reporter/connect_metrics_test.go
+++ /dev/null
@@ -1,51 +0,0 @@
-// Copyright (c) 2020 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package reporter
-
-import (
-	"expvar"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-
-	"github.com/jaegertracing/jaeger/internal/metricstest"
-)
-
-func TestConnectMetrics(t *testing.T) {
-	mf := metricstest.NewFactory(time.Hour)
-	defer mf.Stop()
-	cm := NewConnectMetrics(mf)
-
-	getGauge := func() map[string]int64 {
-		_, gauges := mf.Snapshot()
-		return gauges
-	}
-
-	getCount := func() map[string]int64 {
-		counts, _ := mf.Snapshot()
-		return counts
-	}
-
-	// no connection
-	cm.OnConnectionStatusChange(false)
-	assert.EqualValues(t, 0, getGauge()["connection_status.collector_connected"])
-
-	// first connection
-	cm.OnConnectionStatusChange(true)
-	assert.EqualValues(t, 1, getGauge()["connection_status.collector_connected"])
-	assert.EqualValues(t, 1, getCount()["connection_status.collector_reconnects"])
-
-	// reconnect
-	cm.OnConnectionStatusChange(false)
-	cm.OnConnectionStatusChange(true)
-	assert.EqualValues(t, 2, getCount()["connection_status.collector_reconnects"])
-
-	cm.RecordTarget("collector-host")
-	assert.Equal(t, `"collector-host"`, expvar.Get("gRPCTarget").String())
-
-	// since expvars are singletons, the second constructor should grab the same var
-	cm2 := NewConnectMetrics(mf)
-	assert.Same(t, cm.target, cm2.target)
-}
diff --git a/cmd/agent/app/reporter/flags_test.go b/cmd/agent/app/reporter/flags_test.go
deleted file mode 100644
index 500efe38..00000000
--- a/cmd/agent/app/reporter/flags_test.go
+++ /dev/null
@@ -1,105 +0,0 @@
-// Copyright (c) 2018 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package reporter
-
-import (
-	"flag"
-	"fmt"
-	"testing"
-
-	"github.com/spf13/cobra"
-	"github.com/spf13/viper"
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-	"go.uber.org/zap"
-
-	"github.com/jaegertracing/jaeger/cmd/all-in-one/setupcontext"
-)
-
-func TestBindFlags_NoJaegerTags(t *testing.T) {
-	v := viper.New()
-	command := cobra.Command{}
-	flags := &flag.FlagSet{}
-	AddFlags(flags)
-	command.PersistentFlags().AddGoFlagSet(flags)
-	v.BindPFlags(command.PersistentFlags())
-
-	err := command.ParseFlags([]string{
-		"--reporter.type=grpc",
-	})
-	require.NoError(t, err)
-
-	b := &Options{}
-	b.InitFromViper(v, zap.NewNop())
-	assert.Equal(t, Type("grpc"), b.ReporterType)
-	assert.Empty(t, b.AgentTags)
-}
-
-func TestBindFlags(t *testing.T) {
-	v := viper.New()
-	command := cobra.Command{}
-	flags := &flag.FlagSet{}
-	AddFlags(flags)
-	command.PersistentFlags().AddGoFlagSet(flags)
-	v.BindPFlags(command.PersistentFlags())
-
-	agentTags := fmt.Sprintf("%s,%s,%s,%s,%s,%s",
-		"key=value",
-		"envVar1=${envKey1:defaultVal1}",
-		"envVar2=${envKey2:defaultVal2}",
-		"envVar3=${envKey3}",
-		"envVar4=${envKey4}",
-		"envVar5=${envVar5:}",
-	)
-
-	err := command.ParseFlags([]string{
-		"--reporter.type=grpc",
-		"--agent.tags=" + agentTags,
-	})
-	require.NoError(t, err)
-
-	b := &Options{}
-	t.Setenv("envKey1", "envVal1")
-	t.Setenv("envKey4", "envVal4")
-
-	b.InitFromViper(v, zap.NewNop())
-
-	expectedTags := map[string]string{
-		"key":     "value",
-		"envVar1": "envVal1",
-		"envVar2": "defaultVal2",
-		"envVar4": "envVal4",
-		"envVar5": "",
-	}
-
-	assert.Equal(t, Type("grpc"), b.ReporterType)
-	assert.Equal(t, expectedTags, b.AgentTags)
-}
-
-func TestBindFlagsAllInOne(t *testing.T) {
-	setupcontext.SetAllInOne()
-	defer setupcontext.UnsetAllInOne()
-
-	v := viper.New()
-	command := cobra.Command{}
-	flags := &flag.FlagSet{}
-	AddFlags(flags)
-	command.PersistentFlags().AddGoFlagSet(flags)
-	v.BindPFlags(command.PersistentFlags())
-
-	agentTags := fmt.Sprintf("%s,%s,%s,%s,%s,%s",
-		"key=value",
-		"envVar1=${envKey1:defaultVal1}",
-		"envVar2=${envKey2:defaultVal2}",
-		"envVar3=${envKey3}",
-		"envVar4=${envKey4}",
-		"envVar5=${envVar5:}",
-	)
-
-	err := command.ParseFlags([]string{
-		"--reporter.type=grpc",
-		"--agent.tags=" + agentTags,
-	})
-	require.Error(t, err)
-}
diff --git a/cmd/agent/app/reporter/grpc/builder_test.go b/cmd/agent/app/reporter/grpc/builder_test.go
deleted file mode 100644
index 1e730ec4..00000000
--- a/cmd/agent/app/reporter/grpc/builder_test.go
+++ /dev/null
@@ -1,402 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package grpc
-
-import (
-	"context"
-	"net"
-	"strings"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-	"go.opentelemetry.io/collector/config/configtls"
-	"go.uber.org/zap"
-	"google.golang.org/grpc"
-	"google.golang.org/grpc/credentials"
-	yaml "gopkg.in/yaml.v3"
-
-	"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/jaeger"
-	"github.com/jaegertracing/jaeger/internal/metricstest"
-	"github.com/jaegertracing/jaeger/pkg/discovery"
-	"github.com/jaegertracing/jaeger/pkg/metrics"
-)
-
-var yamlConfig = `
-collectorHostPorts:
-    - 127.0.0.1:14268
-    - 127.0.0.1:14269
-`
-
-var testCertKeyLocation = "../../../../../pkg/config/tlscfg/testdata/"
-
-type noopNotifier struct{}
-
-func (noopNotifier) Register(chan<- []string) {}
-
-func (noopNotifier) Unregister(chan<- []string) {}
-
-func TestBuilderFromConfig(t *testing.T) {
-	cfg := ConnBuilder{}
-	err := yaml.Unmarshal([]byte(yamlConfig), &cfg)
-	require.NoError(t, err)
-
-	assert.Equal(
-		t,
-		[]string{"127.0.0.1:14268", "127.0.0.1:14269"},
-		cfg.CollectorHostPorts)
-	ctx, cancel := context.WithCancel(context.Background())
-	defer cancel()
-	r, err := cfg.CreateConnection(ctx, zap.NewNop(), metrics.NullFactory)
-	require.NoError(t, err)
-	defer r.Close()
-	assert.NotNil(t, r)
-}
-
-func TestBuilderWithCollectors(t *testing.T) {
-	spanHandler1 := &mockSpanHandler{}
-	s1, _ := initializeGRPCTestServer(t, func(s *grpc.Server) {
-		api_v2.RegisterCollectorServiceServer(s, spanHandler1)
-	})
-	defer s1.Stop()
-
-	tests := []struct {
-		target          string
-		name            string
-		hostPorts       []string
-		checkSuffixOnly bool
-		notifier        discovery.Notifier
-		discoverer      discovery.Discoverer
-		expectedError   string
-	}{
-		{
-			target:          "///round_robin",
-			name:            "with roundrobin schema",
-			hostPorts:       []string{"127.0.0.1:9876", "127.0.0.1:9877", "127.0.0.1:9878"},
-			checkSuffixOnly: true,
-			notifier:        nil,
-			discoverer:      nil,
-		},
-		{
-			target:          "127.0.0.1:9876",
-			name:            "with single host",
-			hostPorts:       []string{"127.0.0.1:9876"},
-			checkSuffixOnly: false,
-			notifier:        nil,
-			discoverer:      nil,
-		},
-		{
-			target:          "///round_robin",
-			name:            "with custom resolver and fixed discoverer",
-			hostPorts:       []string{"dns://random_stuff"},
-			checkSuffixOnly: true,
-			notifier:        noopNotifier{},
-			discoverer:      discovery.FixedDiscoverer{},
-		},
-		{
-			target:          "",
-			name:            "without collectorPorts and resolver",
-			hostPorts:       nil,
-			checkSuffixOnly: false,
-			notifier:        nil,
-			discoverer:      nil,
-			expectedError:   "at least one collector hostPort address is required when resolver is not available",
-		},
-	}
-
-	for _, test := range tests {
-		t.Run(test.name, func(t *testing.T) {
-			// Use NewBuilder for code coverage consideration
-			cfg := NewConnBuilder()
-			cfg.CollectorHostPorts = test.hostPorts
-			cfg.Notifier = test.notifier
-			cfg.Discoverer = test.discoverer
-
-			ctx, cancel := context.WithCancel(context.Background())
-			defer cancel()
-			conn, err := cfg.CreateConnection(ctx, zap.NewNop(), metrics.NullFactory)
-			if test.expectedError == "" {
-				require.NoError(t, err)
-				defer conn.Close()
-				require.NotNil(t, conn)
-				if test.checkSuffixOnly {
-					assert.True(t, strings.HasSuffix(conn.Target(), test.target))
-				} else {
-					assert.Equal(t, conn.Target(), test.target)
-				}
-			} else {
-				assert.ErrorContains(t, err, test.expectedError)
-			}
-		})
-	}
-}
-
-func TestProxyBuilder(t *testing.T) {
-	tests := []struct {
-		name        string
-		grpcBuilder *ConnBuilder
-		expectError bool
-	}{
-		{
-			name: "should pass with insecure grpc connection",
-			grpcBuilder: &ConnBuilder{
-				CollectorHostPorts: []string{"localhost:0000"},
-			},
-			expectError: false,
-		},
-		{
-			name: "should fail with secure grpc connection and a CA file which does not exist",
-			grpcBuilder: &ConnBuilder{
-				CollectorHostPorts: []string{"localhost:0000"},
-				TLS: &configtls.ClientConfig{
-					Config: configtls.Config{
-						CAFile: testCertKeyLocation + "/not/valid",
-					},
-				},
-			},
-			expectError: true,
-		},
-		{
-			name: "should pass with secure grpc connection and valid TLS Client settings",
-			grpcBuilder: &ConnBuilder{
-				CollectorHostPorts: []string{"localhost:0000"},
-				TLS: &configtls.ClientConfig{
-					Config: configtls.Config{
-						CAFile:   testCertKeyLocation + "/wrong-CA-cert.pem",
-						CertFile: testCertKeyLocation + "/example-client-cert.pem",
-						KeyFile:  testCertKeyLocation + "/example-client-key.pem",
-					},
-				},
-			},
-			expectError: false,
-		},
-	}
-	ctx, cancel := context.WithCancel(context.Background())
-	defer cancel()
-	for _, test := range tests {
-		t.Run(test.name, func(t *testing.T) {
-			proxy, err := NewCollectorProxy(ctx, test.grpcBuilder, nil, metrics.NullFactory, zap.NewNop())
-
-			if test.expectError {
-				require.Error(t, err)
-			} else {
-				require.NoError(t, err)
-				require.NotNil(t, proxy)
-
-				assert.NotNil(t, proxy.GetReporter())
-				assert.NotNil(t, proxy.GetManager())
-
-				require.NoError(t, proxy.Close())
-				require.EqualError(t, proxy.Close(), "rpc error: code = Canceled desc = grpc: the client connection is closing")
-			}
-		})
-	}
-}
-
-func TestProxyClientTLS(t *testing.T) {
-	tests := []struct {
-		name        string
-		clientTLS   *configtls.ClientConfig
-		serverTLS   configtls.ServerConfig
-		expectError bool
-	}{
-		{
-			name:        "should pass with insecure grpc connection",
-			expectError: false,
-		},
-		{
-			name:        "should fail with TLS client to non-TLS server",
-			clientTLS:   &configtls.ClientConfig{},
-			expectError: true,
-		},
-		{
-			name: "should fail with TLS client to untrusted TLS server",
-			serverTLS: configtls.ServerConfig{
-				Config: configtls.Config{
-					CertFile: testCertKeyLocation + "/example-server-cert.pem",
-					KeyFile:  testCertKeyLocation + "/example-server-key.pem",
-				},
-			},
-			clientTLS: &configtls.ClientConfig{
-				ServerName: "example.com",
-			},
-			expectError: true,
-		},
-		{
-			name: "should fail with TLS client to trusted TLS server with incorrect hostname",
-			serverTLS: configtls.ServerConfig{
-				Config: configtls.Config{
-					CertFile: testCertKeyLocation + "/example-server-cert.pem",
-					KeyFile:  testCertKeyLocation + "/example-server-key.pem",
-				},
-			},
-			clientTLS: &configtls.ClientConfig{
-				Config: configtls.Config{
-					CAFile: testCertKeyLocation + "/example-CA-cert.pem",
-				},
-			},
-			expectError: true,
-		},
-		{
-			name: "should pass with TLS client to trusted TLS server with correct hostname",
-			serverTLS: configtls.ServerConfig{
-				Config: configtls.Config{
-					CertFile: testCertKeyLocation + "/example-server-cert.pem",
-					KeyFile:  testCertKeyLocation + "/example-server-key.pem",
-				},
-			},
-			clientTLS: &configtls.ClientConfig{
-				Config: configtls.Config{
-					CAFile: testCertKeyLocation + "/example-CA-cert.pem",
-				},
-				ServerName: "example.com",
-			},
-			expectError: false,
-		},
-		{
-			name: "should fail with TLS client without cert to trusted TLS server requiring cert",
-			serverTLS: configtls.ServerConfig{
-				ClientCAFile: testCertKeyLocation + "/example-CA-cert.pem",
-				Config: configtls.Config{
-					CertFile: testCertKeyLocation + "/example-server-cert.pem",
-					KeyFile:  testCertKeyLocation + "/example-server-key.pem",
-				},
-			},
-			clientTLS: &configtls.ClientConfig{
-				Config: configtls.Config{
-					CAFile: testCertKeyLocation + "/example-CA-cert.pem",
-				},
-				ServerName: "example.com",
-			},
-			expectError: true,
-		},
-		{
-			name: "should fail with TLS client without cert to trusted TLS server requiring cert from a different CA",
-			serverTLS: configtls.ServerConfig{
-				ClientCAFile: testCertKeyLocation + "/wrong-CA-cert.pem", // NB: wrong CA
-				Config: configtls.Config{
-					CertFile: testCertKeyLocation + "/example-server-cert.pem",
-					KeyFile:  testCertKeyLocation + "/example-server-key.pem",
-				},
-			},
-			clientTLS: &configtls.ClientConfig{
-				Config: configtls.Config{
-					CAFile:   testCertKeyLocation + "/example-CA-cert.pem",
-					CertFile: testCertKeyLocation + "/example-client-cert.pem",
-					KeyFile:  testCertKeyLocation + "/example-client-key.pem",
-				},
-				ServerName: "example.com",
-			},
-			expectError: true,
-		},
-		{
-			name: "should pass with TLS client with cert to trusted TLS server requiring cert",
-			serverTLS: configtls.ServerConfig{
-				ClientCAFile: testCertKeyLocation + "/example-CA-cert.pem",
-				Config: configtls.Config{
-					CertFile: testCertKeyLocation + "/example-server-cert.pem",
-					KeyFile:  testCertKeyLocation + "/example-server-key.pem",
-				},
-			},
-			clientTLS: &configtls.ClientConfig{
-				Config: configtls.Config{
-					CAFile:   testCertKeyLocation + "/example-CA-cert.pem",
-					CertFile: testCertKeyLocation + "/example-client-cert.pem",
-					KeyFile:  testCertKeyLocation + "/example-client-key.pem",
-				},
-				ServerName: "example.com",
-			},
-			expectError: false,
-		},
-	}
-
-	for _, test := range tests {
-		t.Run(test.name, func(t *testing.T) {
-			t.Parallel()
-			ctx, cancel := context.WithCancel(context.Background())
-			defer cancel()
-			var opts []grpc.ServerOption
-
-			if test.serverTLS.CertFile != "" && test.serverTLS.KeyFile != "" {
-				tlsCfg, err := test.serverTLS.LoadTLSConfig(ctx)
-				require.NoError(t, err)
-				opts = []grpc.ServerOption{grpc.Creds(credentials.NewTLS(tlsCfg))}
-			}
-
-			spanHandler := &mockSpanHandler{}
-			s, addr := initializeGRPCTestServer(t, func(s *grpc.Server) {
-				api_v2.RegisterCollectorServiceServer(s, spanHandler)
-			}, opts...)
-			defer s.Stop()
-
-			mFactory := metricstest.NewFactory(time.Microsecond)
-			defer mFactory.Stop()
-			_, port, _ := net.SplitHostPort(addr.String())
-
-			grpcBuilder := &ConnBuilder{
-				CollectorHostPorts: []string{net.JoinHostPort("localhost", port)},
-				TLS:                test.clientTLS,
-			}
-			proxy, err := NewCollectorProxy(
-				ctx,
-				grpcBuilder,
-				nil,
-				mFactory,
-				zap.NewNop())
-
-			require.NoError(t, err)
-			require.NotNil(t, proxy)
-			assert.NotNil(t, proxy.GetReporter())
-			assert.NotNil(t, proxy.GetManager())
-			assert.NotNil(t, proxy.GetConn())
-
-			r := proxy.GetReporter()
-
-			err = r.EmitBatch(ctx, &jaeger.Batch{Spans: []*jaeger.Span{{OperationName: "op"}}, Process: &jaeger.Process{ServiceName: "service"}})
-
-			if test.expectError {
-				require.Error(t, err)
-			} else {
-				require.NoError(t, err)
-			}
-
-			require.NoError(t, proxy.Close())
-		})
-	}
-}
-
-type fakeInterceptor struct {
-	isCalled bool
-}
-
-func (f *fakeInterceptor) intercept(ctx context.Context, method string, req, reply any, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
-	f.isCalled = true
-	return invoker(ctx, method, req, reply, cc, opts...)
-}
-
-func (f *fakeInterceptor) assertCalled(t *testing.T) {
-	assert.True(t, f.isCalled)
-}
-
-func TestBuilderWithAdditionalDialOptions(t *testing.T) {
-	fi := fakeInterceptor{}
-	defer fi.assertCalled(t)
-
-	cb := ConnBuilder{
-		CollectorHostPorts:    []string{"127.0.0.1:14268"},
-		AdditionalDialOptions: []grpc.DialOption{grpc.WithUnaryInterceptor(fi.intercept)},
-	}
-
-	ctx, cancel := context.WithCancel(context.Background())
-	defer cancel()
-	r, err := cb.CreateConnection(ctx, zap.NewNop(), metrics.NullFactory)
-	require.NoError(t, err)
-	defer r.Close()
-	assert.NotNil(t, r)
-
-	err = r.Invoke(context.Background(), "test", map[string]string{}, map[string]string{}, []grpc.CallOption{}...)
-	require.Error(t, err, "should error because no server is running")
-}
diff --git a/cmd/agent/app/reporter/grpc/collector_proxy_test.go b/cmd/agent/app/reporter/grpc/collector_proxy_test.go
deleted file mode 100644
index 8c844786..00000000
--- a/cmd/agent/app/reporter/grpc/collector_proxy_test.go
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright (c) 2018 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package grpc
-
-import (
-	"context"
-	"io"
-	"net"
-	"sync"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-	"go.uber.org/zap"
-	"google.golang.org/grpc"
-
-	"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/jaeger"
-	"github.com/jaegertracing/jaeger/internal/metricstest"
-)
-
-var _ io.Closer = (*ProxyBuilder)(nil)
-
-func TestMultipleCollectors(t *testing.T) {
-	spanHandler1 := &mockSpanHandler{}
-	_, addr1 := initializeGRPCTestServer(t, func(s *grpc.Server) {
-		api_v2.RegisterCollectorServiceServer(s, spanHandler1)
-	})
-	spanHandler2 := &mockSpanHandler{}
-	_, addr2 := initializeGRPCTestServer(t, func(s *grpc.Server) {
-		api_v2.RegisterCollectorServiceServer(s, spanHandler2)
-	})
-
-	mFactory := metricstest.NewFactory(time.Microsecond)
-	defer mFactory.Stop()
-	ctx, cancel := context.WithCancel(context.Background())
-	cancel()
-	proxy, err := NewCollectorProxy(ctx, &ConnBuilder{CollectorHostPorts: []string{addr1.String(), addr2.String()}}, nil, mFactory, zap.NewNop())
-	require.NoError(t, err)
-	require.NotNil(t, proxy)
-	assert.NotNil(t, proxy.GetReporter())
-	assert.NotNil(t, proxy.GetManager())
-	assert.NotNil(t, proxy.GetConn())
-
-	bothServers := false
-	r := proxy.GetReporter()
-	// TODO do not iterate, just create two batches
-	for i := 0; i < 100; i++ {
-		err := r.EmitBatch(context.Background(), &jaeger.Batch{Spans: []*jaeger.Span{{OperationName: "op"}}, Process: &jaeger.Process{ServiceName: "service"}})
-		require.NoError(t, err)
-		if len(spanHandler1.getRequests()) > 0 && len(spanHandler2.getRequests()) > 0 {
-			bothServers = true
-			break
-		}
-	}
-	c, g := mFactory.Snapshot()
-	assert.NotEmpty(t, g)
-	assert.NotEmpty(t, c)
-	assert.True(t, bothServers)
-	require.NoError(t, proxy.Close())
-}
-
-func initializeGRPCTestServer(t *testing.T, beforeServe func(server *grpc.Server), opts ...grpc.ServerOption) (*grpc.Server, net.Addr) {
-	server := grpc.NewServer(opts...)
-	lis, err := net.Listen("tcp", "localhost:0")
-	require.NoError(t, err)
-	beforeServe(server)
-	var wg sync.WaitGroup
-	wg.Add(1)
-	go func() {
-		assert.NoError(t, server.Serve(lis))
-		wg.Done()
-	}()
-	t.Cleanup(func() {
-		server.Stop()
-		wg.Wait()
-	})
-	return server, lis.Addr()
-}
diff --git a/cmd/agent/app/reporter/grpc/flags_test.go b/cmd/agent/app/reporter/grpc/flags_test.go
deleted file mode 100644
index a06e3e0e..00000000
--- a/cmd/agent/app/reporter/grpc/flags_test.go
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright (c) 2018 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package grpc
-
-import (
-	"flag"
-	"testing"
-
-	"github.com/spf13/cobra"
-	"github.com/spf13/viper"
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-	"go.opentelemetry.io/collector/config/configtls"
-
-	"github.com/jaegertracing/jaeger/pkg/config"
-)
-
-func TestBindFlags(t *testing.T) {
-	tests := []struct {
-		cOpts    []string
-		expected *ConnBuilder
-	}{
-		{
-			cOpts:    []string{"--reporter.grpc.host-port=localhost:1111", "--reporter.grpc.retry.max=15"},
-			expected: &ConnBuilder{CollectorHostPorts: []string{"localhost:1111"}, MaxRetry: 15, DiscoveryMinPeers: 3},
-		},
-		{
-			cOpts:    []string{"--reporter.grpc.host-port=localhost:1111,localhost:2222"},
-			expected: &ConnBuilder{CollectorHostPorts: []string{"localhost:1111", "localhost:2222"}, MaxRetry: defaultMaxRetry, DiscoveryMinPeers: 3},
-		},
-		{
-			cOpts:    []string{"--reporter.grpc.host-port=localhost:1111,localhost:2222", "--reporter.grpc.discovery.min-peers=5"},
-			expected: &ConnBuilder{CollectorHostPorts: []string{"localhost:1111", "localhost:2222"}, MaxRetry: defaultMaxRetry, DiscoveryMinPeers: 5},
-		},
-		{
-			cOpts: []string{"--reporter.grpc.tls.enabled=true"},
-			expected: &ConnBuilder{
-				TLS: &configtls.ClientConfig{
-					Config: configtls.Config{
-						IncludeSystemCACertsPool: true,
-					},
-				},
-				MaxRetry: defaultMaxRetry, DiscoveryMinPeers: 3,
-			},
-		},
-	}
-	for _, test := range tests {
-		v := viper.New()
-		command := cobra.Command{}
-		flags := &flag.FlagSet{}
-		AddFlags(flags)
-		command.PersistentFlags().AddGoFlagSet(flags)
-		v.BindPFlags(command.PersistentFlags())
-
-		err := command.ParseFlags(test.cOpts)
-		require.NoError(t, err)
-		b, err := new(ConnBuilder).InitFromViper(v)
-		require.NoError(t, err)
-		assert.Equal(t, test.expected, b)
-	}
-}
-
-func TestBindTLSFlagFailure(t *testing.T) {
-	v, command := config.Viperize(AddFlags)
-	err := command.ParseFlags([]string{
-		"--reporter.grpc.tls.enabled=false",
-		"--reporter.grpc.tls.cert=blah", // invalid unless tls.enabled
-	})
-	require.NoError(t, err)
-	_, err = new(ConnBuilder).InitFromViper(v)
-	assert.ErrorContains(t, err, "failed to process TLS options")
-}
diff --git a/cmd/agent/app/reporter/grpc/package_test.go b/cmd/agent/app/reporter/grpc/package_test.go
deleted file mode 100644
index 05c61c87..00000000
--- a/cmd/agent/app/reporter/grpc/package_test.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2024 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package grpc
-
-import (
-	"testing"
-
-	"github.com/jaegertracing/jaeger/internal/testutils"
-)
-
-func TestMain(m *testing.M) {
-	testutils.VerifyGoLeaks(m)
-}
diff --git a/cmd/agent/app/reporter/grpc/reporter_test.go b/cmd/agent/app/reporter/grpc/reporter_test.go
deleted file mode 100644
index 983083bb..00000000
--- a/cmd/agent/app/reporter/grpc/reporter_test.go
+++ /dev/null
@@ -1,215 +0,0 @@
-// Copyright (c) 2018 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package grpc
-
-import (
-	"context"
-	"sync"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-	"go.uber.org/zap"
-	"google.golang.org/grpc"
-	"google.golang.org/grpc/codes"
-	"google.golang.org/grpc/credentials/insecure"
-	"google.golang.org/grpc/metadata"
-	"google.golang.org/grpc/status"
-
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-	"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
-	jThrift "github.com/jaegertracing/jaeger-idl/thrift-gen/jaeger"
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-)
-
-type mockSpanHandler struct {
-	mux      sync.Mutex
-	requests []*api_v2.PostSpansRequest
-}
-
-func (h *mockSpanHandler) getRequests() []*api_v2.PostSpansRequest {
-	h.mux.Lock()
-	defer h.mux.Unlock()
-	return h.requests
-}
-
-func (h *mockSpanHandler) PostSpans(_ context.Context, r *api_v2.PostSpansRequest) (*api_v2.PostSpansResponse, error) {
-	h.mux.Lock()
-	defer h.mux.Unlock()
-	h.requests = append(h.requests, r)
-	return &api_v2.PostSpansResponse{}, nil
-}
-
-func TestReporter_EmitZipkinBatch(t *testing.T) {
-	handler := &mockSpanHandler{}
-	s, addr := initializeGRPCTestServer(t, func(s *grpc.Server) {
-		api_v2.RegisterCollectorServiceServer(s, handler)
-	})
-	defer s.Stop()
-	conn, err := grpc.NewClient(addr.String(), grpc.WithTransportCredentials(insecure.NewCredentials()))
-	require.NoError(t, err)
-	defer conn.Close()
-
-	rep := NewReporter(conn, nil, zap.NewNop())
-
-	tm := time.Unix(158, 0)
-	a := tm.Unix() * 1000 * 1000
-	tests := []struct {
-		in       *zipkincore.Span
-		expected model.Batch
-		err      string
-	}{
-		{in: &zipkincore.Span{}, err: "cannot find service name in Zipkin span [traceID=0, spanID=0]"},
-		{
-			in: &zipkincore.Span{Name: "jonatan", TraceID: 1, ID: 2, Timestamp: &a, Annotations: []*zipkincore.Annotation{{Value: zipkincore.CLIENT_SEND, Host: &zipkincore.Endpoint{ServiceName: "spring"}}}},
-			expected: model.Batch{
-				Spans: []*model.Span{{
-					TraceID: model.NewTraceID(0, 1), SpanID: model.NewSpanID(2), OperationName: "jonatan", Duration: time.Microsecond * 1,
-					Tags:    model.KeyValues{model.SpanKindTag(model.SpanKindClient)},
-					Process: &model.Process{ServiceName: "spring"}, StartTime: tm.UTC(),
-				}},
-			},
-		},
-	}
-	for _, test := range tests {
-		err = rep.EmitZipkinBatch(context.Background(), []*zipkincore.Span{test.in})
-		if test.err != "" {
-			require.EqualError(t, err, test.err)
-		} else {
-			assert.Len(t, handler.requests, 1)
-			assert.Equal(t, test.expected, handler.requests[0].GetBatch())
-		}
-	}
-}
-
-func TestReporter_EmitBatch(t *testing.T) {
-	handler := &mockSpanHandler{}
-	s, addr := initializeGRPCTestServer(t, func(s *grpc.Server) {
-		api_v2.RegisterCollectorServiceServer(s, handler)
-	})
-	defer s.Stop()
-	conn, err := grpc.NewClient(addr.String(), grpc.WithTransportCredentials(insecure.NewCredentials()))
-	require.NoError(t, err)
-	defer conn.Close()
-	rep := NewReporter(conn, nil, zap.NewNop())
-
-	tm := time.Unix(158, 0)
-	tests := []struct {
-		in       *jThrift.Batch
-		expected model.Batch
-		err      string
-	}{
-		{
-			in:       &jThrift.Batch{Process: &jThrift.Process{ServiceName: "node"}, Spans: []*jThrift.Span{{OperationName: "foo", StartTime: int64(model.TimeAsEpochMicroseconds(tm))}}},
-			expected: model.Batch{Process: &model.Process{ServiceName: "node"}, Spans: []*model.Span{{OperationName: "foo", StartTime: tm.UTC()}}},
-		},
-	}
-	for _, test := range tests {
-		err = rep.EmitBatch(context.Background(), test.in)
-		if test.err != "" {
-			require.EqualError(t, err, test.err)
-		} else {
-			assert.Len(t, handler.requests, 1)
-			assert.Equal(t, test.expected, handler.requests[0].GetBatch())
-		}
-	}
-}
-
-func TestReporter_SendFailure(t *testing.T) {
-	conn, err := grpc.NewClient("invalid-host-name-blah:12345", grpc.WithTransportCredentials(insecure.NewCredentials()))
-	require.NoError(t, err)
-	defer conn.Close()
-	rep := NewReporter(conn, nil, zap.NewNop())
-	err = rep.send(context.Background(), nil, nil)
-	assert.ErrorContains(t, err, "failed to export spans:")
-}
-
-func TestReporter_AddProcessTags_EmptyTags(t *testing.T) {
-	tags := map[string]string{}
-	spans := []*model.Span{{TraceID: model.NewTraceID(0, 1), SpanID: model.NewSpanID(2), OperationName: "jonatan"}}
-	actualSpans, _ := addProcessTags(spans, nil, makeModelKeyValue(tags))
-	assert.Equal(t, spans, actualSpans)
-}
-
-func TestReporter_AddProcessTags_ZipkinBatch(t *testing.T) {
-	tags := map[string]string{"key": "value"}
-	spans := []*model.Span{{TraceID: model.NewTraceID(0, 1), SpanID: model.NewSpanID(2), OperationName: "jonatan", Process: &model.Process{ServiceName: "spring"}}}
-
-	expectedSpans := []*model.Span{
-		{
-			TraceID:       model.NewTraceID(0, 1),
-			SpanID:        model.NewSpanID(2),
-			OperationName: "jonatan",
-			Process:       &model.Process{ServiceName: "spring", Tags: []model.KeyValue{model.String("key", "value")}},
-		},
-	}
-	actualSpans, _ := addProcessTags(spans, nil, makeModelKeyValue(tags))
-
-	assert.Equal(t, expectedSpans, actualSpans)
-}
-
-func TestReporter_AddProcessTags_JaegerBatch(t *testing.T) {
-	tags := map[string]string{"key": "value"}
-	spans := []*model.Span{{TraceID: model.NewTraceID(0, 1), SpanID: model.NewSpanID(2), OperationName: "jonatan"}}
-	process := &model.Process{ServiceName: "spring"}
-
-	expectedProcess := &model.Process{ServiceName: "spring", Tags: []model.KeyValue{model.String("key", "value")}}
-	_, actualProcess := addProcessTags(spans, process, makeModelKeyValue(tags))
-
-	assert.Equal(t, expectedProcess, actualProcess)
-}
-
-func TestReporter_MakeModelKeyValue(t *testing.T) {
-	expectedTags := []model.KeyValue{model.String("key", "value")}
-	stringTags := map[string]string{"key": "value"}
-	actualTags := makeModelKeyValue(stringTags)
-
-	assert.Equal(t, expectedTags, actualTags)
-}
-
-type mockMultitenantSpanHandler struct{}
-
-func (*mockMultitenantSpanHandler) PostSpans(ctx context.Context, _ *api_v2.PostSpansRequest) (*api_v2.PostSpansResponse, error) {
-	md, ok := metadata.FromIncomingContext(ctx)
-	if !ok {
-		return &api_v2.PostSpansResponse{}, status.Errorf(codes.PermissionDenied, "missing tenant header")
-	}
-
-	tenants := md["x-tenant"]
-	if len(tenants) < 1 {
-		return &api_v2.PostSpansResponse{}, status.Errorf(codes.PermissionDenied, "missing tenant header")
-	} else if len(tenants) > 1 {
-		return &api_v2.PostSpansResponse{}, status.Errorf(codes.PermissionDenied, "extra tenant header")
-	}
-
-	return &api_v2.PostSpansResponse{}, nil
-}
-
-func TestReporter_MultitenantEmitBatch(t *testing.T) {
-	handler := &mockMultitenantSpanHandler{}
-	s, addr := initializeGRPCTestServer(t, func(s *grpc.Server) {
-		api_v2.RegisterCollectorServiceServer(s, handler)
-	})
-	defer s.Stop()
-	conn, err := grpc.NewClient(addr.String(), grpc.WithTransportCredentials(insecure.NewCredentials()))
-	require.NoError(t, err)
-	defer func() { require.NoError(t, conn.Close()) }()
-	rep := NewReporter(conn, nil, zap.NewNop())
-
-	tm := time.Now()
-	tests := []struct {
-		in  *jThrift.Batch
-		err string
-	}{
-		{
-			in:  &jThrift.Batch{Process: &jThrift.Process{ServiceName: "node"}, Spans: []*jThrift.Span{{OperationName: "foo", StartTime: int64(model.TimeAsEpochMicroseconds(tm))}}},
-			err: "missing tenant header",
-		},
-	}
-	for _, test := range tests {
-		err = rep.EmitBatch(context.Background(), test.in)
-		assert.ErrorContains(t, err, test.err)
-	}
-}
diff --git a/cmd/agent/app/reporter/metrics_test.go b/cmd/agent/app/reporter/metrics_test.go
deleted file mode 100644
index 1043708e..00000000
--- a/cmd/agent/app/reporter/metrics_test.go
+++ /dev/null
@@ -1,102 +0,0 @@
-// Copyright (c) 2018 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package reporter
-
-import (
-	"context"
-	"errors"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/require"
-
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/jaeger"
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-	"github.com/jaegertracing/jaeger/internal/metricstest"
-)
-
-func TestMetricsReporter(t *testing.T) {
-	tests := []struct {
-		expectedCounters []metricstest.ExpectedMetric
-		expectedGauges   []metricstest.ExpectedMetric
-		action           func(reporter Reporter)
-		rep              *mockReporter
-	}{
-		{expectedCounters: []metricstest.ExpectedMetric{
-			{Name: "reporter.batches.submitted", Tags: map[string]string{"format": "jaeger"}, Value: 1},
-			{Name: "reporter.batches.failures", Tags: map[string]string{"format": "jaeger"}, Value: 0},
-			{Name: "reporter.spans.submitted", Tags: map[string]string{"format": "jaeger"}, Value: 0},
-			{Name: "reporter.spans.failures", Tags: map[string]string{"format": "jaeger"}, Value: 0},
-		}, expectedGauges: []metricstest.ExpectedMetric{
-			{Name: "reporter.batch_size", Tags: map[string]string{"format": "jaeger"}, Value: 0},
-		}, action: func(reporter Reporter) {
-			err := reporter.EmitBatch(context.Background(), nil)
-			require.NoError(t, err)
-		}, rep: &mockReporter{}},
-		{expectedCounters: []metricstest.ExpectedMetric{
-			{Name: "reporter.batches.submitted", Tags: map[string]string{"format": "jaeger"}, Value: 1},
-			{Name: "reporter.batches.failures", Tags: map[string]string{"format": "jaeger"}, Value: 0},
-			{Name: "reporter.spans.submitted", Tags: map[string]string{"format": "jaeger"}, Value: 1},
-			{Name: "reporter.spans.failures", Tags: map[string]string{"format": "jaeger"}, Value: 0},
-		}, expectedGauges: []metricstest.ExpectedMetric{
-			{Name: "reporter.batch_size", Tags: map[string]string{"format": "jaeger"}, Value: 1},
-		}, action: func(reporter Reporter) {
-			err := reporter.EmitBatch(context.Background(), &jaeger.Batch{Spans: []*jaeger.Span{{}}})
-			require.NoError(t, err)
-		}, rep: &mockReporter{}},
-		{expectedCounters: []metricstest.ExpectedMetric{
-			{Name: "reporter.batches.submitted", Tags: map[string]string{"format": "zipkin"}, Value: 1},
-			{Name: "reporter.batches.failures", Tags: map[string]string{"format": "zipkin"}, Value: 0},
-			{Name: "reporter.spans.submitted", Tags: map[string]string{"format": "zipkin"}, Value: 0},
-			{Name: "reporter.spans.failures", Tags: map[string]string{"format": "zipkin"}, Value: 0},
-		}, expectedGauges: []metricstest.ExpectedMetric{
-			{Name: "reporter.batch_size", Tags: map[string]string{"format": "zipkin"}, Value: 0},
-		}, action: func(reporter Reporter) {
-			err := reporter.EmitZipkinBatch(context.Background(), nil)
-			require.NoError(t, err)
-		}, rep: &mockReporter{}},
-		{expectedCounters: []metricstest.ExpectedMetric{
-			{Name: "reporter.batches.submitted", Tags: map[string]string{"format": "zipkin"}, Value: 1},
-			{Name: "reporter.batches.failures", Tags: map[string]string{"format": "zipkin"}, Value: 0},
-			{Name: "reporter.spans.submitted", Tags: map[string]string{"format": "zipkin"}, Value: 1},
-			{Name: "reporter.spans.failures", Tags: map[string]string{"format": "zipkin"}, Value: 0},
-		}, expectedGauges: []metricstest.ExpectedMetric{
-			{Name: "reporter.batch_size", Tags: map[string]string{"format": "zipkin"}, Value: 1},
-		}, action: func(reporter Reporter) {
-			err := reporter.EmitZipkinBatch(context.Background(), []*zipkincore.Span{{}})
-			require.NoError(t, err)
-		}, rep: &mockReporter{}},
-		{expectedCounters: []metricstest.ExpectedMetric{
-			{Name: "reporter.batches.submitted", Tags: map[string]string{"format": "jaeger"}, Value: 0},
-			{Name: "reporter.batches.failures", Tags: map[string]string{"format": "jaeger"}, Value: 1},
-			{Name: "reporter.spans.submitted", Tags: map[string]string{"format": "jaeger"}, Value: 0},
-			{Name: "reporter.spans.failures", Tags: map[string]string{"format": "jaeger"}, Value: 1},
-		}, expectedGauges: []metricstest.ExpectedMetric{
-			{Name: "reporter.batch_size", Tags: map[string]string{"format": "jaeger"}, Value: 0},
-		}, action: func(reporter Reporter) {
-			err := reporter.EmitBatch(context.Background(), &jaeger.Batch{Spans: []*jaeger.Span{{}}})
-			require.Error(t, err)
-		}, rep: &mockReporter{err: errors.New("foo")}},
-		{expectedCounters: []metricstest.ExpectedMetric{
-			{Name: "reporter.batches.failures", Tags: map[string]string{"format": "zipkin"}, Value: 1},
-			{Name: "reporter.spans.failures", Tags: map[string]string{"format": "zipkin"}, Value: 2},
-		}, expectedGauges: []metricstest.ExpectedMetric{
-			{Name: "reporter.batch_size", Tags: map[string]string{"format": "zipkin"}, Value: 0},
-		}, action: func(reporter Reporter) {
-			err := reporter.EmitZipkinBatch(context.Background(), []*zipkincore.Span{{}, {}})
-			require.Error(t, err)
-		}, rep: &mockReporter{errors.New("foo")}},
-	}
-
-	for _, test := range tests {
-		t.Run("", func(t *testing.T) {
-			metricsFactory := metricstest.NewFactory(time.Microsecond)
-			defer metricsFactory.Stop()
-			r := WrapWithMetrics(test.rep, metricsFactory)
-			test.action(r)
-			metricsFactory.AssertCounterMetrics(t, test.expectedCounters...)
-			metricsFactory.AssertGaugeMetrics(t, test.expectedGauges...)
-		})
-	}
-}
diff --git a/cmd/agent/app/reporter/package_test.go b/cmd/agent/app/reporter/package_test.go
deleted file mode 100644
index 6f55d1d0..00000000
--- a/cmd/agent/app/reporter/package_test.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2023 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package reporter
-
-import (
-	"testing"
-
-	"github.com/jaegertracing/jaeger/internal/testutils"
-)
-
-func TestMain(m *testing.M) {
-	testutils.VerifyGoLeaks(m)
-}
diff --git a/cmd/agent/app/reporter/reporter_test.go b/cmd/agent/app/reporter/reporter_test.go
deleted file mode 100644
index c424574f..00000000
--- a/cmd/agent/app/reporter/reporter_test.go
+++ /dev/null
@@ -1,67 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package reporter
-
-import (
-	"context"
-	"errors"
-	"fmt"
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/jaeger"
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/testutils"
-)
-
-func TestMultiReporter(t *testing.T) {
-	r1, r2 := testutils.NewInMemoryReporter(), testutils.NewInMemoryReporter()
-	r := NewMultiReporter(r1, r2)
-	e1 := r.EmitZipkinBatch(context.Background(), []*zipkincore.Span{
-		{},
-	})
-	e2 := r.EmitBatch(context.Background(), &jaeger.Batch{
-		Spans: []*jaeger.Span{
-			{},
-		},
-	})
-	require.NoError(t, e1)
-	require.NoError(t, e2)
-	assert.Len(t, r1.ZipkinSpans(), 1)
-	assert.Len(t, r1.Spans(), 1)
-	assert.Len(t, r2.ZipkinSpans(), 1)
-	assert.Len(t, r2.Spans(), 1)
-}
-
-func TestMultiReporterErrors(t *testing.T) {
-	errMsg := "doh!"
-	err := errors.New(errMsg)
-	r1, r2 := mockReporter{err: err}, mockReporter{err: err}
-	r := NewMultiReporter(r1, r2)
-	e1 := r.EmitZipkinBatch(context.Background(), []*zipkincore.Span{
-		{},
-	})
-	e2 := r.EmitBatch(context.Background(), &jaeger.Batch{
-		Spans: []*jaeger.Span{
-			{},
-		},
-	})
-	require.EqualError(t, e1, fmt.Sprintf("%s\n%s", errMsg, errMsg))
-	require.EqualError(t, e2, fmt.Sprintf("%s\n%s", errMsg, errMsg))
-}
-
-type mockReporter struct {
-	err error
-}
-
-func (r mockReporter) EmitZipkinBatch(_ context.Context, _ []*zipkincore.Span) error {
-	return r.err
-}
-
-func (r mockReporter) EmitBatch(_ context.Context, _ *jaeger.Batch) error {
-	return r.err
-}
diff --git a/cmd/agent/app/servers/package_test.go b/cmd/agent/app/servers/package_test.go
deleted file mode 100644
index 3356e98e..00000000
--- a/cmd/agent/app/servers/package_test.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2025 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package servers
-
-import (
-	"testing"
-
-	"github.com/jaegertracing/jaeger/internal/testutils"
-)
-
-func TestMain(m *testing.M) {
-	testutils.VerifyGoLeaks(m)
-}
diff --git a/cmd/agent/app/servers/thriftudp/transport_test.go b/cmd/agent/app/servers/thriftudp/transport_test.go
deleted file mode 100644
index afc48357..00000000
--- a/cmd/agent/app/servers/thriftudp/transport_test.go
+++ /dev/null
@@ -1,251 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package thriftudp
-
-import (
-	"context"
-	"net"
-	"strings"
-	"sync"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-
-	"github.com/jaegertracing/jaeger/internal/testutils"
-)
-
-var localListenAddr = &net.UDPAddr{IP: net.IPv4(127, 0, 0, 1)}
-
-func TestNewTUDPClientTransport(t *testing.T) {
-	_, err := NewTUDPClientTransport("fakeAddressAndPort", "")
-	require.Error(t, err)
-
-	_, err = NewTUDPClientTransport("localhost:9090", "fakeaddressandport")
-	require.Error(t, err)
-
-	withLocalServer(t, func(addr string) {
-		trans, err := NewTUDPClientTransport(addr, "")
-		require.NoError(t, err)
-		require.True(t, trans.IsOpen())
-		require.NotNil(t, trans.Addr())
-
-		// Check address
-		assert.True(t, strings.HasPrefix(trans.Addr().String(), "127.0.0.1:"), "address check")
-		require.Equal(t, "udp", trans.Addr().Network())
-
-		err = trans.Open()
-		require.NoError(t, err)
-
-		err = trans.Close()
-		require.NoError(t, err)
-		require.False(t, trans.IsOpen())
-	})
-}
-
-func TestNewTUDPServerTransport(t *testing.T) {
-	_, err := NewTUDPServerTransport("fakeAddressAndPort")
-	require.Error(t, err)
-
-	trans, err := NewTUDPServerTransport(localListenAddr.String())
-	require.NoError(t, err)
-	require.True(t, trans.IsOpen())
-	require.Equal(t, ^uint64(0), trans.RemainingBytes())
-
-	// Ensure a second server can't be created on the same address
-	trans2, err := NewTUDPServerTransport(trans.Addr().String())
-	if trans2 != nil {
-		// close the second server if one got created
-		trans2.Close()
-	}
-	require.Error(t, err)
-
-	err = trans.Close()
-	require.NoError(t, err)
-	require.False(t, trans.IsOpen())
-}
-
-func TestSetSocketBufferSize(t *testing.T) {
-	trans, err := NewTUDPServerTransport(localListenAddr.String())
-	require.NoError(t, err)
-	require.True(t, trans.IsOpen())
-	require.Equal(t, ^uint64(0), trans.RemainingBytes())
-
-	err = trans.SetSocketBufferSize(1024)
-	require.NoError(t, err)
-
-	err = trans.Close()
-	require.NoError(t, err)
-	require.False(t, trans.IsOpen())
-}
-
-func TestTUDPServerTransportIsOpen(t *testing.T) {
-	_, err := NewTUDPServerTransport("fakeAddressAndPort")
-	require.Error(t, err)
-
-	trans, err := NewTUDPServerTransport(localListenAddr.String())
-	require.NoError(t, err)
-	require.True(t, trans.IsOpen())
-	require.Equal(t, ^uint64(0), trans.RemainingBytes())
-
-	wg := sync.WaitGroup{}
-	wg.Add(2)
-	go func() {
-		time.Sleep(2 * time.Millisecond)
-		err = trans.Close()
-		assert.NoError(t, err)
-		wg.Done()
-	}()
-
-	go func() {
-		for i := 0; i < 4; i++ {
-			time.Sleep(1 * time.Millisecond)
-			trans.IsOpen()
-		}
-		wg.Done()
-	}()
-
-	wg.Wait()
-	require.False(t, trans.IsOpen())
-}
-
-func TestWriteRead(t *testing.T) {
-	server, err := NewTUDPServerTransport(localListenAddr.String())
-	require.NoError(t, err)
-	defer server.Close()
-
-	client, err := NewTUDPClientTransport(server.Addr().String(), "")
-	require.NoError(t, err)
-	defer client.Close()
-
-	// client makes two writes and one flush, resulting in one packet
-	n, err := client.Write([]byte("test"))
-	require.NoError(t, err)
-	require.Equal(t, 4, n)
-	n, err = client.Write([]byte("string1"))
-	require.NoError(t, err)
-	require.Equal(t, 7, n)
-	require.NoError(t, client.Flush(context.Background()))
-
-	// another packet
-	n, err = client.Write([]byte("test"))
-	require.NoError(t, err)
-	require.Equal(t, 4, n)
-	n, err = client.Write([]byte("string2"))
-	require.NoError(t, err)
-	require.Equal(t, 7, n)
-	require.NoError(t, client.Flush(context.Background()))
-
-	expected := "teststring1"
-	readBuf := make([]byte, 20)
-	n, err = server.Read(readBuf)
-	require.NoError(t, err)
-	assert.Len(t, expected, n)
-	assert.Equal(t, expected, string(readBuf[0:n]))
-
-	expected = "teststring2"
-	n, err = server.Read(readBuf)
-	require.NoError(t, err)
-	assert.Len(t, expected, n)
-	assert.Equal(t, expected, string(readBuf[0:n]))
-}
-
-func TestDoubleCloseError(t *testing.T) {
-	trans, err := NewTUDPServerTransport(localListenAddr.String())
-	require.NoError(t, err)
-	require.True(t, trans.IsOpen())
-
-	// Close connection object directly
-	conn := trans.Conn()
-	require.NotNil(t, conn)
-	conn.Close()
-
-	err = trans.Close()
-	require.Error(t, err, "must return error when underlying connection is closed")
-
-	assert.Equal(t, errConnAlreadyClosed, trans.Close(), "second Close() returns an error")
-}
-
-func TestConnClosedReadWrite(t *testing.T) {
-	trans, err := NewTUDPServerTransport(localListenAddr.String())
-	require.NoError(t, err)
-	require.True(t, trans.IsOpen())
-	require.NoError(t, trans.Close())
-	require.False(t, trans.IsOpen())
-
-	_, err = trans.Read(make([]byte, 1))
-	require.Error(t, err)
-	_, err = trans.Write([]byte("test"))
-	require.Error(t, err)
-}
-
-func TestHugeWrite(t *testing.T) {
-	withLocalServer(t, func(addr string) {
-		trans, err := NewTUDPClientTransport(addr, "")
-		require.NoError(t, err)
-
-		hugeMessage := make([]byte, 40000)
-		_, err = trans.Write(hugeMessage)
-		require.NoError(t, err)
-
-		// expect buffer to exceed max
-		_, err = trans.Write(hugeMessage)
-		require.Error(t, err)
-	})
-}
-
-func TestFlushErrors(t *testing.T) {
-	withLocalServer(t, func(addr string) {
-		trans, err := NewTUDPClientTransport(addr, "")
-		require.NoError(t, err)
-
-		// flushing closed transport
-		trans.Close()
-		err = trans.Flush(context.Background())
-		require.Error(t, err)
-
-		// error when trying to write in flush
-		trans, err = NewTUDPClientTransport(addr, "")
-		require.NoError(t, err)
-		trans.conn.Close()
-
-		trans.Write([]byte{1, 2, 3, 4})
-		err = trans.Flush(context.Background())
-		require.Error(t, err, "Flush with data should fail")
-	})
-}
-
-func TestResetInFlush(t *testing.T) {
-	conn, err := net.ListenUDP(localListenAddr.Network(), localListenAddr)
-	require.NoError(t, err, "ListenUDP failed")
-
-	trans, err := NewTUDPClientTransport(conn.LocalAddr().String(), "")
-	require.NoError(t, err)
-
-	trans.Write([]byte("some nonsense"))
-	trans.conn.Close() // close the transport's connection via back door
-
-	err = trans.Flush(context.Background())
-	require.Error(t, err, "should fail to write to closed connection")
-	assert.Equal(t, 0, trans.writeBuf.Len(), "should reset the buffer")
-}
-
-func withLocalServer(t *testing.T, f func(addr string)) {
-	conn, err := net.ListenUDP(localListenAddr.Network(), localListenAddr)
-	require.NoError(t, err, "ListenUDP failed")
-
-	f(conn.LocalAddr().String())
-	require.NoError(t, conn.Close(), "Close failed")
-}
-
-func TestCreateClient(t *testing.T) {
-	_, err := createClient(nil, nil)
-	require.EqualError(t, err, "dial udp: missing address")
-}
-
-func TestMain(m *testing.M) {
-	testutils.VerifyGoLeaks(m)
-}
diff --git a/cmd/agent/app/servers/udpserver_test.go b/cmd/agent/app/servers/udpserver_test.go
deleted file mode 100644
index e59f65bd..00000000
--- a/cmd/agent/app/servers/udpserver_test.go
+++ /dev/null
@@ -1,145 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package servers
-
-import (
-	"bytes"
-	"context"
-	"io"
-	"sync"
-	"sync/atomic"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-
-	"github.com/jaegertracing/jaeger/cmd/agent/app/servers/thriftudp"
-	"github.com/jaegertracing/jaeger/internal/metricstest"
-)
-
-func TestTBufferedServerSendReceive(t *testing.T) {
-	metricsFactory := metricstest.NewFactory(0)
-
-	transport, err := thriftudp.NewTUDPServerTransport("127.0.0.1:0")
-	require.NoError(t, err)
-
-	const maxPacketSize = 65000
-	const maxQueueSize = 100
-	server, err := NewUDPServer(transport, maxQueueSize, maxPacketSize, metricsFactory)
-	require.NoError(t, err)
-	go server.Serve()
-	defer server.Stop()
-
-	client, err := thriftudp.NewTUDPClientTransport(transport.Addr().String(), "")
-	require.NoError(t, err)
-	defer client.Close()
-
-	// keep sending packets until the server receives one
-	for range 1000 {
-		n, err := client.Write([]byte("span1"))
-		require.NoError(t, err)
-		require.Equal(t, 5, n)
-		require.NoError(t, client.Flush(context.Background()))
-
-		select {
-		case buf := <-server.DataChan():
-			assert.Positive(t, buf.Len())
-			assert.Equal(t, "span1", buf.String())
-			return // exit test on successful receipt
-		default:
-			time.Sleep(10 * time.Millisecond)
-		}
-	}
-	t.Fatal("server did not receive packets")
-}
-
-// The fakeTransport allows the server to read two packets, one filled with 1's, another with 2's,
-// then returns an error, and then blocks on the semaphore. The semaphore is only released when
-// the test is exiting.
-type fakeTransport struct {
-	packet atomic.Int64
-	wg     sync.WaitGroup
-}
-
-// Read simulates three packets received, then blocks until semaphore is released at the end of the test.
-// First packet is returned as normal.
-// Second packet is simulated as error.
-// Third packet is returned as normal, but will be dropped as overflow by the server whose queue size = 1.
-func (t *fakeTransport) Read(p []byte) (n int, err error) {
-	packet := t.packet.Add(1)
-	if packet == 2 {
-		// return some error packet, followed by valid one
-		return 0, io.ErrNoProgress
-	}
-	if packet > 3 {
-		// block after 3 packets until the server is shutdown and semaphore released
-		t.wg.Wait()
-		return 0, io.EOF
-	}
-	for i := range p {
-		p[i] = byte(packet)
-	}
-	return len(p), nil
-}
-
-func (*fakeTransport) Close() error {
-	return nil
-}
-
-func TestTBufferedServerMetrics(t *testing.T) {
-	metricsFactory := metricstest.NewFactory(0)
-
-	transport := new(fakeTransport)
-	transport.wg.Add(1)
-	defer transport.wg.Done()
-
-	const maxPacketSize = 65000
-	const maxQueueSize = 1
-	server, err := NewUDPServer(transport, maxQueueSize, maxPacketSize, metricsFactory)
-	require.NoError(t, err)
-	go server.Serve()
-	defer server.Stop()
-
-	// The fakeTransport will allow the server to read exactly two packets and one error in between.
-	// Since we use the server with queue size == 1, the first packet will be
-	// sent to channel, the error will increment the metric, and the second valid packet dropped.
-
-	packetDropped := false
-	for i := 0; i < 5000; i++ {
-		c, _ := metricsFactory.Snapshot()
-		if c["thrift.udp.server.packets.dropped"] == 1 {
-			packetDropped = true
-			break
-		}
-		time.Sleep(time.Millisecond)
-	}
-	require.True(t, packetDropped, "packetDropped")
-
-	var readBuf *bytes.Buffer
-	select {
-	case readBuf = <-server.DataChan():
-		b := readBuf.Bytes()
-		assert.Len(t, b, 65000)
-		assert.EqualValues(t, 1, b[0], "first packet must be all 0x01's")
-	default:
-		t.Fatal("expecting a packet in the channel")
-	}
-
-	metricsFactory.AssertCounterMetrics(t,
-		metricstest.ExpectedMetric{Name: "thrift.udp.server.packets.processed", Value: 1},
-		metricstest.ExpectedMetric{Name: "thrift.udp.server.packets.dropped", Value: 1},
-		metricstest.ExpectedMetric{Name: "thrift.udp.server.read.errors", Value: 1},
-	)
-	metricsFactory.AssertGaugeMetrics(t,
-		metricstest.ExpectedMetric{Name: "thrift.udp.server.packet_size", Value: 65000},
-		metricstest.ExpectedMetric{Name: "thrift.udp.server.queue_size", Value: 1},
-	)
-
-	server.DataRecd(readBuf)
-	metricsFactory.AssertGaugeMetrics(t,
-		metricstest.ExpectedMetric{Name: "thrift.udp.server.queue_size", Value: 0},
-	)
-}
diff --git a/cmd/agent/app/testutils/in_memory_reporter.go b/cmd/agent/app/testutils/in_memory_reporter.go
deleted file mode 100644
index 04404317..00000000
--- a/cmd/agent/app/testutils/in_memory_reporter.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package testutils
-
-import (
-	"context"
-	"sync"
-
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/jaeger"
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-)
-
-// InMemoryReporter collects spans in memory
-type InMemoryReporter struct {
-	zSpans []*zipkincore.Span
-	jSpans []*jaeger.Span
-	mutex  sync.Mutex
-}
-
-// NewInMemoryReporter creates new InMemoryReporter
-func NewInMemoryReporter() *InMemoryReporter {
-	return &InMemoryReporter{
-		zSpans: make([]*zipkincore.Span, 0, 10),
-		jSpans: make([]*jaeger.Span, 0, 10),
-	}
-}
-
-// EmitZipkinBatch implements the corresponding method of the Reporter interface
-func (i *InMemoryReporter) EmitZipkinBatch(_ context.Context, spans []*zipkincore.Span) error {
-	i.mutex.Lock()
-	defer i.mutex.Unlock()
-	i.zSpans = append(i.zSpans, spans...)
-	return nil
-}
-
-// EmitBatch implements the corresponding method of the Reporter interface
-func (i *InMemoryReporter) EmitBatch(_ context.Context, batch *jaeger.Batch) (err error) {
-	i.mutex.Lock()
-	defer i.mutex.Unlock()
-	i.jSpans = append(i.jSpans, batch.Spans...)
-	return nil
-}
-
-// ZipkinSpans returns accumulated Zipkin spans as a copied slice
-func (i *InMemoryReporter) ZipkinSpans() []*zipkincore.Span {
-	i.mutex.Lock()
-	defer i.mutex.Unlock()
-	return i.zSpans
-}
-
-// Spans returns accumulated spans as a copied slice
-func (i *InMemoryReporter) Spans() []*jaeger.Span {
-	i.mutex.Lock()
-	defer i.mutex.Unlock()
-	return i.jSpans
-}
diff --git a/cmd/agent/app/testutils/in_memory_reporter_test.go b/cmd/agent/app/testutils/in_memory_reporter_test.go
deleted file mode 100644
index 21a47ae6..00000000
--- a/cmd/agent/app/testutils/in_memory_reporter_test.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package testutils
-
-import (
-	"context"
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/jaeger"
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-)
-
-func TestInMemoryReporter(t *testing.T) {
-	r := NewInMemoryReporter()
-	e1 := r.EmitZipkinBatch(context.Background(), []*zipkincore.Span{
-		{},
-	})
-	e2 := r.EmitBatch(context.Background(), &jaeger.Batch{
-		Spans: []*jaeger.Span{
-			{},
-		},
-	})
-	require.NoError(t, e1)
-	require.NoError(t, e2)
-	assert.Len(t, r.ZipkinSpans(), 1)
-	assert.Len(t, r.Spans(), 1)
-}
diff --git a/cmd/agent/app/testutils/mock_grpc_collector.go b/cmd/agent/app/testutils/mock_grpc_collector.go
deleted file mode 100644
index 7a7c1928..00000000
--- a/cmd/agent/app/testutils/mock_grpc_collector.go
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2020 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package testutils
-
-import (
-	"context"
-	"net"
-	"sync"
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-	"google.golang.org/grpc"
-
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-	"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
-)
-
-// GrpcCollector is a mock collector for tests
-type GrpcCollector struct {
-	listener net.Listener
-	*mockSpanHandler
-	server *grpc.Server
-}
-
-var _ api_v2.CollectorServiceServer = (*GrpcCollector)(nil)
-
-// StartGRPCCollector starts GRPC collector on a random port
-func StartGRPCCollector(t *testing.T) *GrpcCollector {
-	server := grpc.NewServer()
-	lis, err := net.Listen("tcp", "localhost:0")
-	require.NoError(t, err)
-	handler := &mockSpanHandler{t: t}
-	api_v2.RegisterCollectorServiceServer(server, handler)
-	go func() {
-		assert.NoError(t, server.Serve(lis))
-	}()
-	return &GrpcCollector{
-		mockSpanHandler: handler,
-		listener:        lis,
-		server:          server,
-	}
-}
-
-// Listener returns server's listener
-func (c *GrpcCollector) Listener() net.Listener {
-	return c.listener
-}
-
-// Close closes the server
-func (c *GrpcCollector) Close() error {
-	c.server.GracefulStop()
-	return c.listener.Close()
-}
-
-type mockSpanHandler struct {
-	t        *testing.T
-	mux      sync.Mutex
-	requests []*api_v2.PostSpansRequest
-}
-
-// GetJaegerBatches returns accumulated Jaeger batches
-func (h *mockSpanHandler) GetJaegerBatches() []model.Batch {
-	h.mux.Lock()
-	defer h.mux.Unlock()
-	var batches []model.Batch
-	for _, r := range h.requests {
-		batches = append(batches, r.Batch)
-	}
-	return batches
-}
-
-func (h *mockSpanHandler) PostSpans(_ context.Context, r *api_v2.PostSpansRequest) (*api_v2.PostSpansResponse, error) {
-	h.t.Logf("mockSpanHandler received %d spans", len(r.Batch.Spans))
-	h.mux.Lock()
-	defer h.mux.Unlock()
-	h.requests = append(h.requests, r)
-	return &api_v2.PostSpansResponse{}, nil
-}
diff --git a/cmd/agent/app/testutils/package_test.go b/cmd/agent/app/testutils/package_test.go
deleted file mode 100644
index 719954d5..00000000
--- a/cmd/agent/app/testutils/package_test.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2023 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package testutils
-
-import (
-	"testing"
-
-	"github.com/jaegertracing/jaeger/internal/testutils"
-)
-
-func TestMain(m *testing.M) {
-	testutils.VerifyGoLeaks(m)
-}
diff --git a/cmd/agent/app/testutils/thriftudp_client.go b/cmd/agent/app/testutils/thriftudp_client.go
deleted file mode 100644
index 199d4386..00000000
--- a/cmd/agent/app/testutils/thriftudp_client.go
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package testutils
-
-import (
-	"io"
-
-	"github.com/apache/thrift/lib/go/thrift"
-
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/agent"
-	"github.com/jaegertracing/jaeger/cmd/agent/app/servers/thriftudp"
-)
-
-// NewZipkinThriftUDPClient creates a new zipking agent client that works like Jaeger client
-func NewZipkinThriftUDPClient(hostPort string) (*agent.AgentClient, io.Closer, error) {
-	clientTransport, err := thriftudp.NewTUDPClientTransport(hostPort, "")
-	if err != nil {
-		return nil, nil, err
-	}
-
-	protocolFactory := thrift.NewTCompactProtocolFactoryConf(&thrift.TConfiguration{})
-	client := agent.NewAgentClientFactory(clientTransport, protocolFactory)
-	return client, clientTransport, nil
-}
-
-// NewJaegerThriftUDPClient creates a new jaeger agent client that works like Jaeger client
-func NewJaegerThriftUDPClient(hostPort string, protocolFactory thrift.TProtocolFactory) (*agent.AgentClient, io.Closer, error) {
-	clientTransport, err := thriftudp.NewTUDPClientTransport(hostPort, "")
-	if err != nil {
-		return nil, nil, err
-	}
-
-	client := agent.NewAgentClientFactory(clientTransport, protocolFactory)
-	return client, clientTransport, nil
-}
diff --git a/cmd/agent/app/testutils/thriftudp_client_test.go b/cmd/agent/app/testutils/thriftudp_client_test.go
deleted file mode 100644
index c4abcfb5..00000000
--- a/cmd/agent/app/testutils/thriftudp_client_test.go
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package testutils
-
-import (
-	"testing"
-
-	"github.com/apache/thrift/lib/go/thrift"
-	"github.com/stretchr/testify/require"
-)
-
-func TestNewZipkinThriftUDPClient(t *testing.T) {
-	_, _, err := NewZipkinThriftUDPClient("256.2.3:0")
-	require.Error(t, err)
-
-	_, cl, err := NewZipkinThriftUDPClient("127.0.0.1:12345")
-	require.NoError(t, err)
-	cl.Close()
-}
-
-func TestNewJaegerThriftUDPClient(t *testing.T) {
-	compactFactory := thrift.NewTCompactProtocolFactoryConf(&thrift.TConfiguration{})
-
-	_, _, err := NewJaegerThriftUDPClient("256.2.3:0", compactFactory)
-	require.Error(t, err)
-
-	_, cl, err := NewJaegerThriftUDPClient("127.0.0.1:12345", compactFactory)
-	require.NoError(t, err)
-	cl.Close()
-}
diff --git a/cmd/collector/app/collector_test.go b/cmd/collector/app/collector_test.go
index 25ec6ef6..f347a6d5 100644
--- a/cmd/collector/app/collector_test.go
+++ b/cmd/collector/app/collector_test.go
@@ -23,10 +23,10 @@ import (
 	"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
 	"github.com/jaegertracing/jaeger/cmd/collector/app/flags"
 	"github.com/jaegertracing/jaeger/cmd/collector/app/processor"
+	"github.com/jaegertracing/jaeger/internal/healthcheck"
 	"github.com/jaegertracing/jaeger/internal/metricstest"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/v1adapter"
-	"github.com/jaegertracing/jaeger/pkg/healthcheck"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 )
 
 var _ (io.Closer) = (*Collector)(nil)
diff --git a/cmd/collector/app/flags/flags_test.go b/cmd/collector/app/flags/flags_test.go
index ea9b3fa9..da55c5e4 100644
--- a/cmd/collector/app/flags/flags_test.go
+++ b/cmd/collector/app/flags/flags_test.go
@@ -11,8 +11,8 @@ import (
 	"github.com/stretchr/testify/require"
 	"go.uber.org/zap"
 
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/testutils"
-	"github.com/jaegertracing/jaeger/pkg/config"
 )
 
 func TestCollectorOptionsWithFlags_CheckHostPort(t *testing.T) {
diff --git a/cmd/collector/app/handler/grpc_handler_test.go b/cmd/collector/app/handler/grpc_handler_test.go
index 64b6240d..f6d83f77 100644
--- a/cmd/collector/app/handler/grpc_handler_test.go
+++ b/cmd/collector/app/handler/grpc_handler_test.go
@@ -21,8 +21,8 @@ import (
 	"github.com/jaegertracing/jaeger-idl/model/v1"
 	"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
 	"github.com/jaegertracing/jaeger/cmd/collector/app/processor"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/internal/testutils"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 )
 
 var _ processor.SpanProcessor = (*mockSpanProcessor)(nil)
diff --git a/cmd/collector/app/handler/otlp_receiver_test.go b/cmd/collector/app/handler/otlp_receiver_test.go
index 9aad915a..e19be76b 100644
--- a/cmd/collector/app/handler/otlp_receiver_test.go
+++ b/cmd/collector/app/handler/otlp_receiver_test.go
@@ -24,8 +24,8 @@ import (
 
 	"github.com/jaegertracing/jaeger/cmd/collector/app/flags"
 	"github.com/jaegertracing/jaeger/cmd/collector/app/processor"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/internal/testutils"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 )
 
 func optionsWithPorts(port string) *flags.CollectorOptions {
diff --git a/cmd/collector/app/handler/zipkin_receiver_test.go b/cmd/collector/app/handler/zipkin_receiver_test.go
index fd19e5f6..01785cee 100644
--- a/cmd/collector/app/handler/zipkin_receiver_test.go
+++ b/cmd/collector/app/handler/zipkin_receiver_test.go
@@ -15,6 +15,7 @@ import (
 
 	gogojsonpb "github.com/gogo/protobuf/jsonpb"
 	gogoproto "github.com/gogo/protobuf/proto"
+	zipkinthrift "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin/zipkinthriftconverter"
 	"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
@@ -25,9 +26,8 @@ import (
 	"github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
 	"github.com/jaegertracing/jaeger/cmd/collector/app/flags"
 	"github.com/jaegertracing/jaeger/cmd/collector/app/processor"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/internal/testutils"
-	zipkinthrift "github.com/jaegertracing/jaeger/model/converter/thrift/zipkin"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 	zipkin_proto3 "github.com/jaegertracing/jaeger/proto-gen/zipkin"
 )
 
@@ -54,7 +54,9 @@ func TestZipkinReceiver(t *testing.T) {
 	makeThrift := func(data []byte) []byte {
 		var spans []*zipkincore.Span
 		require.NoError(t, json.Unmarshal(data, &spans))
-		return zipkinthrift.SerializeThrift(context.Background(), spans)
+		out, err := zipkinthrift.SerializeThrift(context.Background(), spans)
+		require.NoError(t, err)
+		return out
 	}
 
 	makeProto := func(data []byte) []byte {
diff --git a/cmd/collector/app/handler/zipkin_receiver_tls_test.go b/cmd/collector/app/handler/zipkin_receiver_tls_test.go
index 61d0b40f..2a8ef2e9 100644
--- a/cmd/collector/app/handler/zipkin_receiver_tls_test.go
+++ b/cmd/collector/app/handler/zipkin_receiver_tls_test.go
@@ -16,13 +16,13 @@ import (
 	"go.opentelemetry.io/collector/config/configtls"
 
 	"github.com/jaegertracing/jaeger/cmd/collector/app/flags"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/internal/testutils"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 	"github.com/jaegertracing/jaeger/ports"
 )
 
 func TestSpanCollectorZipkinTLS(t *testing.T) {
-	const testCertKeyLocation = "../../../../pkg/config/tlscfg/testdata"
+	const testCertKeyLocation = "../../../../internal/config/tlscfg/testdata"
 	testCases := []struct {
 		name                  string
 		serverTLS             configtls.ServerConfig
diff --git a/cmd/collector/app/normalize_test.go b/cmd/collector/app/normalize_test.go
new file mode 100644
index 00000000..01726c99
--- /dev/null
+++ b/cmd/collector/app/normalize_test.go
@@ -0,0 +1,16 @@
+// Copyright (c) 2025 The Jaeger Authors.
+// SPDX-License-Identifier: Apache-2.0
+
+package app
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+)
+
+func TestNormalizeServiceName(t *testing.T) {
+	assert.Equal(t, "abc", normalizeServiceName("ABC"), "lower case conversion")
+	assert.Equal(t, "a_b_c__", normalizeServiceName("a&b%c/:"), "disallowed runes to underscore")
+	assert.Equal(t, "a_z_0123456789.", normalizeServiceName("A_Z_0123456789."), "allowed runes")
+}
diff --git a/cmd/collector/app/server/grpc_test.go b/cmd/collector/app/server/grpc_test.go
index 792c9850..fa2c9c12 100644
--- a/cmd/collector/app/server/grpc_test.go
+++ b/cmd/collector/app/server/grpc_test.go
@@ -23,7 +23,7 @@ import (
 	"github.com/jaegertracing/jaeger-idl/proto-gen/api_v2"
 	"github.com/jaegertracing/jaeger/cmd/collector/app/handler"
 	"github.com/jaegertracing/jaeger/internal/grpctest"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 )
 
 // test wrong port number
diff --git a/cmd/collector/app/server/http_test.go b/cmd/collector/app/server/http_test.go
index 8c949f61..74457fb1 100644
--- a/cmd/collector/app/server/http_test.go
+++ b/cmd/collector/app/server/http_test.go
@@ -21,12 +21,12 @@ import (
 	"go.uber.org/zap"
 
 	"github.com/jaegertracing/jaeger/cmd/collector/app/handler"
+	"github.com/jaegertracing/jaeger/internal/healthcheck"
 	"github.com/jaegertracing/jaeger/internal/metricstest"
-	"github.com/jaegertracing/jaeger/pkg/healthcheck"
 	"github.com/jaegertracing/jaeger/ports"
 )
 
-var testCertKeyLocation = "../../../../pkg/config/tlscfg/testdata"
+var testCertKeyLocation = "../../../../internal/config/tlscfg/testdata"
 
 // test wrong port number
 func TestFailToListenHTTP(t *testing.T) {
diff --git a/cmd/collector/app/span_handler_builder_test.go b/cmd/collector/app/span_handler_builder_test.go
index f846f5a9..d070a23e 100644
--- a/cmd/collector/app/span_handler_builder_test.go
+++ b/cmd/collector/app/span_handler_builder_test.go
@@ -13,11 +13,11 @@ import (
 
 	"github.com/jaegertracing/jaeger/cmd/collector/app/flags"
 	cmdFlags "github.com/jaegertracing/jaeger/cmd/internal/flags"
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/memory"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/v1adapter"
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 )
 
 func TestNewSpanHandlerBuilder(t *testing.T) {
diff --git a/cmd/collector/app/span_processor_test.go b/cmd/collector/app/span_processor_test.go
index d53092a7..d31ab825 100644
--- a/cmd/collector/app/span_processor_test.go
+++ b/cmd/collector/app/span_processor_test.go
@@ -45,9 +45,9 @@ import (
 	"github.com/jaegertracing/jaeger/internal/metricstest"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/api/tracestore/mocks"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/v1adapter"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/internal/testutils"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 )
 
 var (
diff --git a/cmd/es-rollover/app/actions_test.go b/cmd/es-rollover/app/actions_test.go
index bc78ef11..b5de762c 100644
--- a/cmd/es-rollover/app/actions_test.go
+++ b/cmd/es-rollover/app/actions_test.go
@@ -12,7 +12,7 @@ import (
 	"github.com/stretchr/testify/require"
 	"go.uber.org/zap"
 
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/pkg/es/client"
 )
 
diff --git a/cmd/ingester/app/flags_test.go b/cmd/ingester/app/flags_test.go
index 4b684cb0..f0e65e69 100644
--- a/cmd/ingester/app/flags_test.go
+++ b/cmd/ingester/app/flags_test.go
@@ -12,9 +12,9 @@ import (
 	"github.com/stretchr/testify/require"
 	"go.opentelemetry.io/collector/config/configtls"
 
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/kafka"
 	"github.com/jaegertracing/jaeger/internal/testutils"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/kafka/auth"
 )
 
diff --git a/cmd/internal/flags/admin_test.go b/cmd/internal/flags/admin_test.go
index bd8d4ede..b6428f5a 100644
--- a/cmd/internal/flags/admin_test.go
+++ b/cmd/internal/flags/admin_test.go
@@ -21,12 +21,12 @@ import (
 	"go.uber.org/zap/zaptest"
 	"go.uber.org/zap/zaptest/observer"
 
-	"github.com/jaegertracing/jaeger/pkg/config"
-	"github.com/jaegertracing/jaeger/pkg/healthcheck"
+	"github.com/jaegertracing/jaeger/internal/config"
+	"github.com/jaegertracing/jaeger/internal/healthcheck"
 	"github.com/jaegertracing/jaeger/ports"
 )
 
-var testCertKeyLocation = "../../../pkg/config/tlscfg/testdata"
+var testCertKeyLocation = "../../../internal/config/tlscfg/testdata"
 
 func TestAdminServerHandlesPortZero(t *testing.T) {
 	adminServer := NewAdminServer(":0")
diff --git a/cmd/internal/flags/service_test.go b/cmd/internal/flags/service_test.go
index 4157b1c7..8ed278ef 100644
--- a/cmd/internal/flags/service_test.go
+++ b/cmd/internal/flags/service_test.go
@@ -14,8 +14,8 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 
-	"github.com/jaegertracing/jaeger/pkg/config"
-	"github.com/jaegertracing/jaeger/pkg/healthcheck"
+	"github.com/jaegertracing/jaeger/internal/config"
+	"github.com/jaegertracing/jaeger/internal/healthcheck"
 )
 
 func TestAddFlags(*testing.T) {
diff --git a/cmd/internal/printconfig/command_test.go b/cmd/internal/printconfig/command_test.go
index 85273f54..fb900422 100644
--- a/cmd/internal/printconfig/command_test.go
+++ b/cmd/internal/printconfig/command_test.go
@@ -24,10 +24,10 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 
+	"github.com/jaegertracing/jaeger/internal/config"
+	"github.com/jaegertracing/jaeger/internal/config/tlscfg"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/internal/testutils"
-	"github.com/jaegertracing/jaeger/pkg/config"
-	"github.com/jaegertracing/jaeger/pkg/config/tlscfg"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 )
 
 const (
diff --git a/cmd/query/app/flags_test.go b/cmd/query/app/flags_test.go
index 2957dac9..5237ce68 100644
--- a/cmd/query/app/flags_test.go
+++ b/cmd/query/app/flags_test.go
@@ -14,10 +14,10 @@ import (
 	"go.opentelemetry.io/collector/config/configopaque"
 	"go.uber.org/zap"
 
+	"github.com/jaegertracing/jaeger/internal/config"
 	spanstoremocks "github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore/mocks"
 	storage "github.com/jaegertracing/jaeger/internal/storage/v1/factory"
 	"github.com/jaegertracing/jaeger/internal/testutils"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/ports"
 )
 
diff --git a/cmd/query/app/grpc_handler_test.go b/cmd/query/app/grpc_handler_test.go
index 2d8b9739..b51117c0 100644
--- a/cmd/query/app/grpc_handler_test.go
+++ b/cmd/query/app/grpc_handler_test.go
@@ -29,8 +29,8 @@ import (
 	"github.com/jaegertracing/jaeger/internal/storage/v2/api/depstore"
 	depsmocks "github.com/jaegertracing/jaeger/internal/storage/v2/api/depstore/mocks"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/v1adapter"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/jtracer"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 )
 
 var (
diff --git a/cmd/query/app/http_handler_test.go b/cmd/query/app/http_handler_test.go
index f574b0f5..6c5becad 100644
--- a/cmd/query/app/http_handler_test.go
+++ b/cmd/query/app/http_handler_test.go
@@ -39,9 +39,9 @@ import (
 	spanstoremocks "github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore/mocks"
 	depsmocks "github.com/jaegertracing/jaeger/internal/storage/v2/api/depstore/mocks"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/v1adapter"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	ui "github.com/jaegertracing/jaeger/model/json"
 	"github.com/jaegertracing/jaeger/pkg/jtracer"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 	"github.com/jaegertracing/jaeger/proto-gen/api_v2/metrics"
 )
 
diff --git a/cmd/query/app/server_test.go b/cmd/query/app/server_test.go
index caa2193c..8b284078 100644
--- a/cmd/query/app/server_test.go
+++ b/cmd/query/app/server_test.go
@@ -35,18 +35,18 @@ import (
 	"github.com/jaegertracing/jaeger/cmd/query/app/querysvc"
 	v2querysvc "github.com/jaegertracing/jaeger/cmd/query/app/querysvc/v2/querysvc"
 	"github.com/jaegertracing/jaeger/internal/grpctest"
+	"github.com/jaegertracing/jaeger/internal/healthcheck"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore"
 	spanstoremocks "github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore/mocks"
 	depsmocks "github.com/jaegertracing/jaeger/internal/storage/v2/api/depstore/mocks"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/v1adapter"
-	"github.com/jaegertracing/jaeger/pkg/healthcheck"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/jtracer"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 	"github.com/jaegertracing/jaeger/ports"
 )
 
-var testCertKeyLocation = "../../../pkg/config/tlscfg/testdata"
+var testCertKeyLocation = "../../../internal/config/tlscfg/testdata"
 
 func initTelSet(logger *zap.Logger, tracerProvider *jtracer.JTracer, hc *healthcheck.HealthCheck) telemetry.Settings {
 	telset := telemetry.NoopSettings()
diff --git a/cmd/query/app/token_propagation_test.go b/cmd/query/app/token_propagation_test.go
index 5f2d9ba6..f31d8883 100644
--- a/cmd/query/app/token_propagation_test.go
+++ b/cmd/query/app/token_propagation_test.go
@@ -22,12 +22,12 @@ import (
 	"github.com/jaegertracing/jaeger/cmd/internal/flags"
 	"github.com/jaegertracing/jaeger/cmd/query/app/querysvc"
 	v2querysvc "github.com/jaegertracing/jaeger/cmd/query/app/querysvc/v2/querysvc"
+	"github.com/jaegertracing/jaeger/internal/config"
 	es "github.com/jaegertracing/jaeger/internal/storage/v1/elasticsearch"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/v1adapter"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/bearertoken"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 	"github.com/jaegertracing/jaeger/ports"
 )
 
diff --git a/cmd/remote-storage/app/flags_test.go b/cmd/remote-storage/app/flags_test.go
index 239ebe18..f1afaa26 100644
--- a/cmd/remote-storage/app/flags_test.go
+++ b/cmd/remote-storage/app/flags_test.go
@@ -9,7 +9,7 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/config"
 )
 
 func TestFlags(t *testing.T) {
diff --git a/cmd/remote-storage/app/server_test.go b/cmd/remote-storage/app/server_test.go
index a1d57af3..6eb52b15 100644
--- a/cmd/remote-storage/app/server_test.go
+++ b/cmd/remote-storage/app/server_test.go
@@ -23,18 +23,18 @@ import (
 
 	"github.com/jaegertracing/jaeger/cmd/internal/flags"
 	"github.com/jaegertracing/jaeger/internal/grpctest"
+	"github.com/jaegertracing/jaeger/internal/healthcheck"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/dependencystore"
 	depStoreMocks "github.com/jaegertracing/jaeger/internal/storage/v1/api/dependencystore/mocks"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore"
 	spanStoreMocks "github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore/mocks"
-	"github.com/jaegertracing/jaeger/pkg/healthcheck"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 	"github.com/jaegertracing/jaeger/ports"
 	"github.com/jaegertracing/jaeger/proto-gen/storage_v1"
 )
 
-var testCertKeyLocation = "../../../pkg/config/tlscfg/testdata"
+var testCertKeyLocation = "../../../internal/config/tlscfg/testdata"
 
 func TestNewServer_CreateStorageErrors(t *testing.T) {
 	createServer := func(factory *fakeFactory) (*Server, error) {
diff --git a/pkg/config/config_test.go b/internal/config/config_test.go
similarity index 100%
rename from pkg/config/config_test.go
rename to internal/config/config_test.go
diff --git a/pkg/config/corscfg/flags_test.go b/internal/config/corscfg/flags_test.go
similarity index 95%
rename from pkg/config/corscfg/flags_test.go
rename to internal/config/corscfg/flags_test.go
index b09e0b35..05b2b765 100644
--- a/pkg/config/corscfg/flags_test.go
+++ b/internal/config/corscfg/flags_test.go
@@ -11,8 +11,8 @@ import (
 	"github.com/stretchr/testify/require"
 	"go.opentelemetry.io/collector/config/confighttp"
 
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/testutils"
-	"github.com/jaegertracing/jaeger/pkg/config"
 )
 
 func TestCORSFlags(t *testing.T) {
diff --git a/pkg/config/package_test.go b/internal/config/package_test.go
similarity index 100%
rename from pkg/config/package_test.go
rename to internal/config/package_test.go
diff --git a/pkg/config/string_slice_test.go b/internal/config/string_slice_test.go
similarity index 100%
rename from pkg/config/string_slice_test.go
rename to internal/config/string_slice_test.go
diff --git a/pkg/config/tlscfg/flags_test.go b/internal/config/tlscfg/flags_test.go
similarity index 99%
rename from pkg/config/tlscfg/flags_test.go
rename to internal/config/tlscfg/flags_test.go
index 6b1ddbce..d376bd62 100644
--- a/pkg/config/tlscfg/flags_test.go
+++ b/internal/config/tlscfg/flags_test.go
@@ -14,7 +14,7 @@ import (
 	"github.com/stretchr/testify/require"
 	"go.opentelemetry.io/collector/config/configtls"
 
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/config"
 )
 
 func TestClientFlags(t *testing.T) {
diff --git a/pkg/config/tlscfg/options_test.go b/internal/config/tlscfg/options_test.go
similarity index 100%
rename from pkg/config/tlscfg/options_test.go
rename to internal/config/tlscfg/options_test.go
diff --git a/pkg/config/tlscfg/package_test.go b/internal/config/tlscfg/package_test.go
similarity index 100%
rename from pkg/config/tlscfg/package_test.go
rename to internal/config/tlscfg/package_test.go
diff --git a/pkg/config/tlscfg/testdata/README.md b/internal/config/tlscfg/testdata/README.md
similarity index 100%
rename from pkg/config/tlscfg/testdata/README.md
rename to internal/config/tlscfg/testdata/README.md
diff --git a/pkg/config/tlscfg/testdata/bad-CA-cert.txt b/internal/config/tlscfg/testdata/bad-CA-cert.txt
similarity index 100%
rename from pkg/config/tlscfg/testdata/bad-CA-cert.txt
rename to internal/config/tlscfg/testdata/bad-CA-cert.txt
diff --git a/pkg/config/tlscfg/testdata/example-CA-cert.pem b/internal/config/tlscfg/testdata/example-CA-cert.pem
similarity index 100%
rename from pkg/config/tlscfg/testdata/example-CA-cert.pem
rename to internal/config/tlscfg/testdata/example-CA-cert.pem
diff --git a/pkg/config/tlscfg/testdata/example-client-cert.pem b/internal/config/tlscfg/testdata/example-client-cert.pem
similarity index 100%
rename from pkg/config/tlscfg/testdata/example-client-cert.pem
rename to internal/config/tlscfg/testdata/example-client-cert.pem
diff --git a/pkg/config/tlscfg/testdata/example-client-key.pem b/internal/config/tlscfg/testdata/example-client-key.pem
similarity index 100%
rename from pkg/config/tlscfg/testdata/example-client-key.pem
rename to internal/config/tlscfg/testdata/example-client-key.pem
diff --git a/pkg/config/tlscfg/testdata/example-server-cert.pem b/internal/config/tlscfg/testdata/example-server-cert.pem
similarity index 100%
rename from pkg/config/tlscfg/testdata/example-server-cert.pem
rename to internal/config/tlscfg/testdata/example-server-cert.pem
diff --git a/pkg/config/tlscfg/testdata/example-server-key.pem b/internal/config/tlscfg/testdata/example-server-key.pem
similarity index 100%
rename from pkg/config/tlscfg/testdata/example-server-key.pem
rename to internal/config/tlscfg/testdata/example-server-key.pem
diff --git a/pkg/config/tlscfg/testdata/gen-certs.sh b/internal/config/tlscfg/testdata/gen-certs.sh
old mode 100755
new mode 100644
similarity index 100%
rename from pkg/config/tlscfg/testdata/gen-certs.sh
rename to internal/config/tlscfg/testdata/gen-certs.sh
diff --git a/pkg/config/tlscfg/testdata/wrong-CA-cert.pem b/internal/config/tlscfg/testdata/wrong-CA-cert.pem
similarity index 100%
rename from pkg/config/tlscfg/testdata/wrong-CA-cert.pem
rename to internal/config/tlscfg/testdata/wrong-CA-cert.pem
diff --git a/pkg/healthcheck/handler_test.go b/internal/healthcheck/handler_test.go
similarity index 95%
rename from pkg/healthcheck/handler_test.go
rename to internal/healthcheck/handler_test.go
index 8c791e99..0c6c065b 100644
--- a/pkg/healthcheck/handler_test.go
+++ b/internal/healthcheck/handler_test.go
@@ -11,8 +11,8 @@ import (
 
 	"github.com/stretchr/testify/assert"
 
+	"github.com/jaegertracing/jaeger/internal/healthcheck"
 	"github.com/jaegertracing/jaeger/internal/testutils"
-	"github.com/jaegertracing/jaeger/pkg/healthcheck"
 )
 
 func TestStatusString(t *testing.T) {
diff --git a/pkg/healthcheck/internal_test.go b/internal/healthcheck/internal_test.go
similarity index 100%
rename from pkg/healthcheck/internal_test.go
rename to internal/healthcheck/internal_test.go
diff --git a/pkg/healthcheck/package_test.go b/internal/healthcheck/package_test.go
similarity index 100%
rename from pkg/healthcheck/package_test.go
rename to internal/healthcheck/package_test.go
diff --git a/pkg/hostname/hostname_test.go b/internal/hostname/hostname_test.go
similarity index 100%
rename from pkg/hostname/hostname_test.go
rename to internal/hostname/hostname_test.go
diff --git a/pkg/recoveryhandler/zap_test.go b/internal/recoveryhandler/zap_test.go
similarity index 100%
rename from pkg/recoveryhandler/zap_test.go
rename to internal/recoveryhandler/zap_test.go
diff --git a/internal/sampling/samplingstrategy/adaptive/factory_test.go b/internal/sampling/samplingstrategy/adaptive/factory_test.go
index e74fd5d9..f23f2d4f 100644
--- a/internal/sampling/samplingstrategy/adaptive/factory_test.go
+++ b/internal/sampling/samplingstrategy/adaptive/factory_test.go
@@ -13,12 +13,12 @@ import (
 	"github.com/stretchr/testify/require"
 	"go.uber.org/zap"
 
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/sampling/samplingstrategy"
 	"github.com/jaegertracing/jaeger/internal/storage/v1"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/samplingstore"
 	smocks "github.com/jaegertracing/jaeger/internal/storage/v1/api/samplingstore/mocks"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/samplingstore/model"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/distributedlock"
 	lmocks "github.com/jaegertracing/jaeger/pkg/distributedlock/mocks"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
diff --git a/internal/sampling/samplingstrategy/adaptive/options_test.go b/internal/sampling/samplingstrategy/adaptive/options_test.go
index edf3d4aa..67950a0f 100644
--- a/internal/sampling/samplingstrategy/adaptive/options_test.go
+++ b/internal/sampling/samplingstrategy/adaptive/options_test.go
@@ -9,7 +9,7 @@ import (
 
 	"github.com/stretchr/testify/assert"
 
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/config"
 )
 
 func TestOptionsWithFlags(t *testing.T) {
diff --git a/internal/sampling/samplingstrategy/file/factory_test.go b/internal/sampling/samplingstrategy/file/factory_test.go
index ad8230be..1bb9e917 100644
--- a/internal/sampling/samplingstrategy/file/factory_test.go
+++ b/internal/sampling/samplingstrategy/file/factory_test.go
@@ -9,9 +9,9 @@ import (
 	"github.com/stretchr/testify/require"
 	"go.uber.org/zap"
 
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/sampling/samplingstrategy"
 	"github.com/jaegertracing/jaeger/internal/storage/v1"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 )
 
diff --git a/internal/sampling/samplingstrategy/file/provider_test.go b/internal/sampling/samplingstrategy/file/provider_test.go
index d2860988..cc86de85 100644
--- a/internal/sampling/samplingstrategy/file/provider_test.go
+++ b/internal/sampling/samplingstrategy/file/provider_test.go
@@ -154,10 +154,8 @@ func TestPerOperationSamplingStrategies(t *testing.T) {
 	tests := []struct {
 		options Options
 	}{
-		{Options{StrategiesFile: "fixtures/operation_strategies.json", DefaultSamplingProbability: DefaultSamplingProbability}},
 		{Options{
 			StrategiesFile:             "fixtures/operation_strategies.json",
-			IncludeDefaultOpStrategies: true,
 			DefaultSamplingProbability: DefaultSamplingProbability,
 		}},
 	}
@@ -479,39 +477,6 @@ func TestAutoUpdateStrategyErrors(t *testing.T) {
 func TestServiceNoPerOperationStrategies(t *testing.T) {
 	// given setup of strategy provider with no specific per operation sampling strategies
 	// and option "sampling.strategies.bugfix-5270=true"
-	provider, err := NewProvider(Options{
-		StrategiesFile:             "fixtures/service_no_per_operation.json",
-		IncludeDefaultOpStrategies: true,
-	}, zap.NewNop())
-	require.NoError(t, err)
-
-	for _, service := range []string{"ServiceA", "ServiceB"} {
-		t.Run(service, func(t *testing.T) {
-			strategy, err := provider.GetSamplingStrategy(context.Background(), service)
-			require.NoError(t, err)
-			strategyJson, err := json.MarshalIndent(strategy, "", "  ")
-			require.NoError(t, err)
-
-			testName := strings.ReplaceAll(t.Name(), "/", "_")
-			snapshotFile := filepath.Join(snapshotLocation, testName+".json")
-			expectedServiceResponse, err := os.ReadFile(snapshotFile)
-			require.NoError(t, err)
-
-			assert.JSONEq(t, string(expectedServiceResponse), string(strategyJson),
-				"comparing against stored snapshot. Use REGENERATE_SNAPSHOTS=true to rebuild snapshots.")
-
-			if regenerateSnapshots {
-				os.WriteFile(snapshotFile, strategyJson, 0o644)
-			}
-		})
-	}
-}
-
-func TestServiceNoPerOperationStrategiesDeprecatedBehavior(t *testing.T) {
-	// test case to be removed along with removal of strategy_store.parseStrategies_deprecated,
-	// see https://github.com/jaegertracing/jaeger/issues/5270 for more details
-
-	// given setup of strategy provider with no specific per operation sampling strategies
 	provider, err := NewProvider(Options{
 		StrategiesFile: "fixtures/service_no_per_operation.json",
 	}, zap.NewNop())
diff --git a/internal/storage/integration/cassandra_test.go b/internal/storage/integration/cassandra_test.go
index 4663e9f9..ecefbdb8 100644
--- a/internal/storage/integration/cassandra_test.go
+++ b/internal/storage/integration/cassandra_test.go
@@ -14,11 +14,11 @@ import (
 	"go.uber.org/zap"
 	"go.uber.org/zap/zaptest"
 
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/dependencystore"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/cassandra"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/v1adapter"
 	"github.com/jaegertracing/jaeger/internal/testutils"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 )
 
diff --git a/internal/storage/integration/elasticsearch_test.go b/internal/storage/integration/elasticsearch_test.go
index 1aa04bb6..baa87d3e 100644
--- a/internal/storage/integration/elasticsearch_test.go
+++ b/internal/storage/integration/elasticsearch_test.go
@@ -22,12 +22,12 @@ import (
 	"go.uber.org/zap/zaptest"
 
 	"github.com/jaegertracing/jaeger-idl/model/v1"
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/dependencystore"
 	es "github.com/jaegertracing/jaeger/internal/storage/v1/elasticsearch"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/api/tracestore"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/v1adapter"
 	"github.com/jaegertracing/jaeger/internal/testutils"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 )
 
diff --git a/internal/storage/integration/grpc_test.go b/internal/storage/integration/grpc_test.go
index 8a5b31e9..d33b4cf2 100644
--- a/internal/storage/integration/grpc_test.go
+++ b/internal/storage/integration/grpc_test.go
@@ -11,10 +11,10 @@ import (
 	"go.uber.org/zap"
 	"go.uber.org/zap/zaptest"
 
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/grpc"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/v1adapter"
 	"github.com/jaegertracing/jaeger/internal/testutils"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 	"github.com/jaegertracing/jaeger/ports"
 )
diff --git a/internal/storage/integration/kafka_test.go b/internal/storage/integration/kafka_test.go
index a0be1db6..a2ec4cbb 100644
--- a/internal/storage/integration/kafka_test.go
+++ b/internal/storage/integration/kafka_test.go
@@ -18,12 +18,12 @@ import (
 	"github.com/jaegertracing/jaeger-idl/model/v1"
 	"github.com/jaegertracing/jaeger/cmd/ingester/app"
 	"github.com/jaegertracing/jaeger/cmd/ingester/app/builder"
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/kafka"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/memory"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/v1adapter"
 	"github.com/jaegertracing/jaeger/internal/testutils"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/kafka/consumer"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 )
diff --git a/internal/storage/metricstore/prometheus/factory_test.go b/internal/storage/metricstore/prometheus/factory_test.go
index d3f4ac7e..32ae4d40 100644
--- a/internal/storage/metricstore/prometheus/factory_test.go
+++ b/internal/storage/metricstore/prometheus/factory_test.go
@@ -12,9 +12,9 @@ import (
 	"github.com/stretchr/testify/require"
 	"go.uber.org/zap"
 
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/storage/v1"
 	"github.com/jaegertracing/jaeger/internal/testutils"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	promCfg "github.com/jaegertracing/jaeger/pkg/prometheus/config"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
 )
diff --git a/internal/storage/v1/badger/dependencystore/storage_test.go b/internal/storage/v1/badger/dependencystore/storage_test.go
index 0a5869aa..7b11444b 100644
--- a/internal/storage/v1/badger/dependencystore/storage_test.go
+++ b/internal/storage/v1/badger/dependencystore/storage_test.go
@@ -14,10 +14,10 @@ import (
 	"go.uber.org/zap"
 
 	"github.com/jaegertracing/jaeger-idl/model/v1"
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/dependencystore"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/badger"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 )
 
diff --git a/internal/storage/v1/badger/factory_test.go b/internal/storage/v1/badger/factory_test.go
index 9e979487..32011ad7 100644
--- a/internal/storage/v1/badger/factory_test.go
+++ b/internal/storage/v1/badger/factory_test.go
@@ -14,8 +14,8 @@ import (
 	"github.com/stretchr/testify/require"
 	"go.uber.org/zap"
 
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/metricstest"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 )
 
diff --git a/internal/storage/v1/badger/options_test.go b/internal/storage/v1/badger/options_test.go
index 8f1a0510..66e1d0bf 100644
--- a/internal/storage/v1/badger/options_test.go
+++ b/internal/storage/v1/badger/options_test.go
@@ -10,7 +10,7 @@ import (
 	"github.com/stretchr/testify/assert"
 	"go.uber.org/zap"
 
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/config"
 )
 
 func TestDefaultConfigParsing(t *testing.T) {
diff --git a/internal/storage/v1/badger/spanstore/read_write_test.go b/internal/storage/v1/badger/spanstore/read_write_test.go
index 0b0b4419..a1546773 100644
--- a/internal/storage/v1/badger/spanstore/read_write_test.go
+++ b/internal/storage/v1/badger/spanstore/read_write_test.go
@@ -19,9 +19,9 @@ import (
 	"go.uber.org/zap"
 
 	"github.com/jaegertracing/jaeger-idl/model/v1"
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/badger"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 )
 
diff --git a/internal/storage/v1/badger/stats_linux_test.go b/internal/storage/v1/badger/stats_linux_test.go
index d8af2aa4..4657a55f 100644
--- a/internal/storage/v1/badger/stats_linux_test.go
+++ b/internal/storage/v1/badger/stats_linux_test.go
@@ -10,8 +10,8 @@ import (
 	"github.com/stretchr/testify/require"
 	"go.uber.org/zap"
 
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/metricstest"
-	"github.com/jaegertracing/jaeger/pkg/config"
 )
 
 func TestDiskStatisticsUpdate(t *testing.T) {
diff --git a/internal/storage/v1/badger/stats_test.go b/internal/storage/v1/badger/stats_test.go
index 75e663b6..1fe9fc8e 100644
--- a/internal/storage/v1/badger/stats_test.go
+++ b/internal/storage/v1/badger/stats_test.go
@@ -11,7 +11,7 @@ import (
 	"github.com/stretchr/testify/require"
 	"go.uber.org/zap"
 
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 )
 
diff --git a/internal/storage/v1/cassandra/factory_test.go b/internal/storage/v1/cassandra/factory_test.go
index 5b70e1d2..bcde5db4 100644
--- a/internal/storage/v1/cassandra/factory_test.go
+++ b/internal/storage/v1/cassandra/factory_test.go
@@ -15,11 +15,11 @@ import (
 	"go.opentelemetry.io/collector/config/configtls"
 	"go.uber.org/zap"
 
+	viperize "github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/testutils"
 	"github.com/jaegertracing/jaeger/pkg/cassandra"
 	"github.com/jaegertracing/jaeger/pkg/cassandra/config"
 	"github.com/jaegertracing/jaeger/pkg/cassandra/mocks"
-	viperize "github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 )
 
diff --git a/internal/storage/v1/cassandra/options_test.go b/internal/storage/v1/cassandra/options_test.go
index 35976ebe..bc7b567e 100644
--- a/internal/storage/v1/cassandra/options_test.go
+++ b/internal/storage/v1/cassandra/options_test.go
@@ -9,7 +9,7 @@ import (
 
 	"github.com/stretchr/testify/assert"
 
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/config"
 )
 
 func TestOptions(t *testing.T) {
diff --git a/internal/storage/v1/elasticsearch/factory_test.go b/internal/storage/v1/elasticsearch/factory_test.go
index 2f85b067..669c5a5d 100644
--- a/internal/storage/v1/elasticsearch/factory_test.go
+++ b/internal/storage/v1/elasticsearch/factory_test.go
@@ -24,9 +24,9 @@ import (
 	"go.uber.org/zap/zaptest"
 
 	"github.com/jaegertracing/jaeger-idl/model/v1"
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore"
 	"github.com/jaegertracing/jaeger/internal/testutils"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/es"
 	escfg "github.com/jaegertracing/jaeger/pkg/es/config"
 	"github.com/jaegertracing/jaeger/pkg/es/mocks"
diff --git a/internal/storage/v1/elasticsearch/options_test.go b/internal/storage/v1/elasticsearch/options_test.go
index 70811400..63335aac 100644
--- a/internal/storage/v1/elasticsearch/options_test.go
+++ b/internal/storage/v1/elasticsearch/options_test.go
@@ -11,7 +11,7 @@ import (
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/config"
 	escfg "github.com/jaegertracing/jaeger/pkg/es/config"
 )
 
diff --git a/internal/storage/v1/elasticsearch/spanstore/reader_test.go b/internal/storage/v1/elasticsearch/spanstore/reader_test.go
index cfdf50f4..80209d72 100644
--- a/internal/storage/v1/elasticsearch/spanstore/reader_test.go
+++ b/internal/storage/v1/elasticsearch/spanstore/reader_test.go
@@ -395,7 +395,7 @@ func TestSpanReader_multiRead_followUp_query(t *testing.T) {
 		require.NotNil(t, traces)
 		require.Len(t, traces, 2)
 
-		for _, s := range []*dbmodel.Span{&spanID1, &spanID2} {
+		for _, s := range []dbmodel.Span{spanID1, spanID2} {
 			found := reflect.DeepEqual(traces[0].Spans[0], s) || reflect.DeepEqual(traces[1].Spans[0], s)
 			assert.True(t, found, "span was expected to be within one of the traces but was not: %v", s)
 		}
@@ -509,7 +509,7 @@ func TestSpanReader_esJSONtoJSONSpanModel(t *testing.T) {
 
 		var expectedSpan dbmodel.Span
 		require.NoError(t, json.Unmarshal(exampleESSpan, &expectedSpan))
-		assert.EqualValues(t, &expectedSpan, span)
+		assert.EqualValues(t, expectedSpan, span)
 	})
 }
 
@@ -522,9 +522,8 @@ func TestSpanReader_esJSONtoJSONSpanModelError(t *testing.T) {
 			Source: jsonPayload,
 		}
 
-		span, err := r.reader.unmarshalJSONSpan(esSpanRaw)
+		_, err := r.reader.unmarshalJSONSpan(esSpanRaw)
 		require.Error(t, err)
-		assert.Nil(t, span)
 	})
 }
 
@@ -655,7 +654,7 @@ func returnSearchFunc(typ string, r *spanReaderTest) (any, error) {
 			dbmodel.OperationQueryParameters{ServiceName: "someService"},
 		)
 	case traceIDAggregation:
-		return r.reader.findTraceIDs(context.Background(), &dbmodel.TraceQueryParameters{})
+		return r.reader.findTraceIDs(context.Background(), dbmodel.TraceQueryParameters{})
 	}
 	return nil, errors.New("Specify services, operations, traceIDs only")
 }
@@ -710,7 +709,7 @@ func TestSpanReader_FindTraces(t *testing.T) {
 				},
 			}, nil)
 
-		traceQuery := &dbmodel.TraceQueryParameters{
+		traceQuery := dbmodel.TraceQueryParameters{
 			ServiceName: serviceName,
 			Tags: map[string]string{
 				"hello": "world",
@@ -756,7 +755,7 @@ func TestSpanReader_FindTracesInvalidQuery(t *testing.T) {
 				},
 			}, nil)
 
-		traceQuery := &dbmodel.TraceQueryParameters{
+		traceQuery := dbmodel.TraceQueryParameters{
 			ServiceName: "",
 			Tags: map[string]string{
 				"hello": "world",
@@ -789,7 +788,7 @@ func TestSpanReader_FindTracesAggregationFailure(t *testing.T) {
 				Responses: []*elastic.SearchResult{},
 			}, nil)
 
-		traceQuery := &dbmodel.TraceQueryParameters{
+		traceQuery := dbmodel.TraceQueryParameters{
 			ServiceName: serviceName,
 			Tags: map[string]string{
 				"hello": "world",
@@ -824,7 +823,7 @@ func TestSpanReader_FindTracesNoTraceIDs(t *testing.T) {
 				Responses: []*elastic.SearchResult{},
 			}, nil)
 
-		traceQuery := &dbmodel.TraceQueryParameters{
+		traceQuery := dbmodel.TraceQueryParameters{
 			ServiceName: serviceName,
 			Tags: map[string]string{
 				"hello": "world",
@@ -858,7 +857,7 @@ func TestSpanReader_FindTracesReadTraceFailure(t *testing.T) {
 		mockMultiSearchService(r).
 			Return(nil, errors.New("read error"))
 
-		traceQuery := &dbmodel.TraceQueryParameters{
+		traceQuery := dbmodel.TraceQueryParameters{
 			ServiceName: serviceName,
 			Tags: map[string]string{
 				"hello": "world",
@@ -897,7 +896,7 @@ func TestSpanReader_FindTracesSpanCollectionFailure(t *testing.T) {
 				},
 			}, nil)
 
-		traceQuery := &dbmodel.TraceQueryParameters{
+		traceQuery := dbmodel.TraceQueryParameters{
 			ServiceName: serviceName,
 			Tags: map[string]string{
 				"hello": "world",
@@ -968,17 +967,13 @@ func mockSearchService(r *spanReaderTest) *mock.Call {
 }
 
 func TestTraceQueryParameterValidation(t *testing.T) {
-	var malformedtqp *dbmodel.TraceQueryParameters
-	err := validateQuery(malformedtqp)
-	require.EqualError(t, err, ErrMalformedRequestObject.Error())
-
-	tqp := &dbmodel.TraceQueryParameters{
+	tqp := dbmodel.TraceQueryParameters{
 		ServiceName: "",
 		Tags: map[string]string{
 			"hello": "world",
 		},
 	}
-	err = validateQuery(tqp)
+	err := validateQuery(tqp)
 	require.EqualError(t, err, ErrServiceNameNotSet.Error())
 
 	tqp.ServiceName = serviceName
@@ -1030,7 +1025,7 @@ func TestSpanReader_buildTraceIDAggregation(t *testing.T) {
 
 func TestSpanReader_buildFindTraceIDsQuery(t *testing.T) {
 	withSpanReader(t, func(r *spanReaderTest) {
-		traceQuery := &dbmodel.TraceQueryParameters{
+		traceQuery := dbmodel.TraceQueryParameters{
 			DurationMin:   time.Second,
 			DurationMax:   time.Second * 2,
 			StartTimeMin:  time.Time{},
@@ -1191,7 +1186,7 @@ func TestSpanReader_GetEmptyIndex(t *testing.T) {
 				Responses: []*elastic.SearchResult{},
 			}, nil)
 
-		traceQuery := &dbmodel.TraceQueryParameters{
+		traceQuery := dbmodel.TraceQueryParameters{
 			ServiceName: serviceName,
 			Tags: map[string]string{
 				"hello": "world",
diff --git a/internal/storage/v1/elasticsearch/spanstore/readerv1_test.go b/internal/storage/v1/elasticsearch/spanstore/readerv1_test.go
index 88a18d66..8d4c9279 100644
--- a/internal/storage/v1/elasticsearch/spanstore/readerv1_test.go
+++ b/internal/storage/v1/elasticsearch/spanstore/readerv1_test.go
@@ -26,8 +26,8 @@ func withSpanReaderV1(fn func(r *SpanReaderV1, m *mocks.CoreSpanReader)) {
 	fn(r, spanReader)
 }
 
-func getTestingTrace(traceID model.TraceID, spanId model.SpanID) *dbmodel.Trace {
-	return &dbmodel.Trace{Spans: []*dbmodel.Span{{
+func getTestingTrace(traceID model.TraceID, spanId model.SpanID) dbmodel.Trace {
+	return dbmodel.Trace{Spans: []dbmodel.Span{{
 		TraceID: dbmodel.TraceID(traceID.String()),
 		SpanID:  dbmodel.SpanID(spanId.String()),
 	}}}
@@ -38,7 +38,7 @@ func TestSpanReaderV1_GetTrace(t *testing.T) {
 		traceID1 := model.NewTraceID(0, 1)
 		spanID1 := model.NewSpanID(1)
 		trace := getTestingTrace(traceID1, spanID1)
-		m.On("GetTraces", mock.Anything, mock.Anything).Return([]*dbmodel.Trace{trace}, nil)
+		m.On("GetTraces", mock.Anything, mock.Anything).Return([]dbmodel.Trace{trace}, nil)
 		actual, err := r.GetTrace(context.Background(), spanstore.GetTraceParameters{})
 		require.NoError(t, err)
 		assert.Len(t, actual.Spans, 1)
@@ -54,8 +54,8 @@ func TestSpanReaderV1_FindTraces(t *testing.T) {
 		spanID2 := model.NewSpanID(2)
 		trace1 := getTestingTrace(traceID1, spanID1)
 		trace2 := getTestingTrace(traceID2, spanID2)
-		traces := []*dbmodel.Trace{trace1, trace2}
-		m.On("FindTraces", mock.Anything, mock.AnythingOfType("*dbmodel.TraceQueryParameters")).Return(traces, nil)
+		traces := []dbmodel.Trace{trace1, trace2}
+		m.On("FindTraces", mock.Anything, mock.Anything).Return(traces, nil)
 		actual, err := r.FindTraces(context.Background(), &spanstore.TraceQueryParameters{})
 		require.NoError(t, err)
 		assert.Len(t, actual, 2)
@@ -73,7 +73,7 @@ func TestSpanReaderV1_FindTraceIDs(t *testing.T) {
 		traceId1 := dbmodel.TraceID(traceId1Model.String())
 		traceId2 := dbmodel.TraceID(traceId2Model.String())
 		traceIds := []dbmodel.TraceID{traceId1, traceId2}
-		m.On("FindTraceIDs", mock.Anything, mock.AnythingOfType("*dbmodel.TraceQueryParameters")).Return(traceIds, nil)
+		m.On("FindTraceIDs", mock.Anything, mock.Anything).Return(traceIds, nil)
 		actual, err := r.FindTraceIDs(context.Background(), &spanstore.TraceQueryParameters{})
 		require.NoError(t, err)
 		expected := []model.TraceID{traceId1Model, traceId2Model}
@@ -102,7 +102,7 @@ func TestSpanReaderV1_FindTraceIDs_Errors(t *testing.T) {
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			withSpanReaderV1(func(r *SpanReaderV1, m *mocks.CoreSpanReader) {
-				m.On("FindTraceIDs", mock.Anything, mock.AnythingOfType("*dbmodel.TraceQueryParameters")).Return(tt.returningTraceIDs, tt.returningErr)
+				m.On("FindTraceIDs", mock.Anything, mock.Anything).Return(tt.returningTraceIDs, tt.returningErr)
 				actual, err := r.FindTraceIDs(context.Background(), &spanstore.TraceQueryParameters{})
 				assert.Nil(t, actual)
 				assert.ErrorContains(t, err, tt.expectedError)
@@ -148,7 +148,7 @@ type traceError struct {
 	name            string
 	returningErr    error
 	expectedError   string
-	returningTraces []*dbmodel.Trace
+	returningTraces []dbmodel.Trace
 }
 
 func getTraceErrTests(includeTraceNotFound bool) []traceError {
@@ -156,7 +156,7 @@ func getTraceErrTests(includeTraceNotFound bool) []traceError {
 		{
 			name:            "conversion error",
 			expectedError:   "converting ES dbSpan to domain Span failed: strconv.ParseUint: parsing \"\": invalid syntax",
-			returningTraces: []*dbmodel.Trace{getBadTrace()},
+			returningTraces: []dbmodel.Trace{getBadTrace()},
 		},
 		{
 			name:          "generic error",
@@ -167,7 +167,7 @@ func getTraceErrTests(includeTraceNotFound bool) []traceError {
 	if includeTraceNotFound {
 		tests = append(tests, traceError{
 			name:            "trace not found",
-			returningTraces: []*dbmodel.Trace{},
+			returningTraces: []dbmodel.Trace{},
 			expectedError:   "trace not found",
 		})
 	}
@@ -194,7 +194,7 @@ func TestSpanReaderV1_FindTracesError(t *testing.T) {
 	for _, tt := range tests {
 		t.Run(tt.name, func(t *testing.T) {
 			withSpanReaderV1(func(r *SpanReaderV1, m *mocks.CoreSpanReader) {
-				m.On("FindTraces", mock.Anything, mock.AnythingOfType("*dbmodel.TraceQueryParameters")).Return(tt.returningTraces, tt.returningErr)
+				m.On("FindTraces", mock.Anything, mock.Anything).Return(tt.returningTraces, tt.returningErr)
 				query := &spanstore.TraceQueryParameters{}
 				trace, err := r.FindTraces(context.Background(), query)
 				require.Error(t, err, tt.expectedError)
@@ -204,9 +204,9 @@ func TestSpanReaderV1_FindTracesError(t *testing.T) {
 	}
 }
 
-func getBadTrace() *dbmodel.Trace {
-	return &dbmodel.Trace{
-		Spans: []*dbmodel.Span{
+func getBadTrace() dbmodel.Trace {
+	return dbmodel.Trace{
+		Spans: []dbmodel.Span{
 			{
 				OperationName: "testing-operation",
 			},
diff --git a/internal/storage/v1/factory/factory_test.go b/internal/storage/v1/factory/factory_test.go
index 81930969..cb9c52ad 100644
--- a/internal/storage/v1/factory/factory_test.go
+++ b/internal/storage/v1/factory/factory_test.go
@@ -18,13 +18,13 @@ import (
 	"github.com/stretchr/testify/require"
 	"go.uber.org/zap"
 
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/storage/v1"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/dependencystore"
 	depStoreMocks "github.com/jaegertracing/jaeger/internal/storage/v1/api/dependencystore/mocks"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore"
 	spanStoreMocks "github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore/mocks"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/mocks"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 )
 
diff --git a/internal/storage/v1/grpc/factory_test.go b/internal/storage/v1/grpc/factory_test.go
index 55c6b08e..ceaaf430 100644
--- a/internal/storage/v1/grpc/factory_test.go
+++ b/internal/storage/v1/grpc/factory_test.go
@@ -22,16 +22,16 @@ import (
 	"go.uber.org/zap"
 	"google.golang.org/grpc"
 
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/dependencystore"
 	dependencyStoreMocks "github.com/jaegertracing/jaeger/internal/storage/v1/api/dependencystore/mocks"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore"
 	spanStoreMocks "github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore/mocks"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/grpc/shared"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/grpc/shared/mocks"
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
 )
 
 type store struct {
diff --git a/internal/storage/v1/grpc/options_test.go b/internal/storage/v1/grpc/options_test.go
index dc715e41..f765d263 100644
--- a/internal/storage/v1/grpc/options_test.go
+++ b/internal/storage/v1/grpc/options_test.go
@@ -13,8 +13,8 @@ import (
 	"go.uber.org/zap/zapcore"
 	"go.uber.org/zap/zaptest/observer"
 
-	"github.com/jaegertracing/jaeger/pkg/config"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
+	"github.com/jaegertracing/jaeger/internal/config"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 )
 
 func TestOptionsWithFlags(t *testing.T) {
diff --git a/internal/storage/v1/kafka/factory_test.go b/internal/storage/v1/kafka/factory_test.go
index 10fa1df8..d439d738 100644
--- a/internal/storage/v1/kafka/factory_test.go
+++ b/internal/storage/v1/kafka/factory_test.go
@@ -15,7 +15,7 @@ import (
 	"go.uber.org/zap"
 	"go.uber.org/zap/zapcore"
 
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/config"
 	kafkaConfig "github.com/jaegertracing/jaeger/pkg/kafka/producer"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 )
diff --git a/internal/storage/v1/kafka/marshalling_test.go b/internal/storage/v1/kafka/marshalling_test.go
index 7ea7b90c..dd684ad4 100644
--- a/internal/storage/v1/kafka/marshalling_test.go
+++ b/internal/storage/v1/kafka/marshalling_test.go
@@ -7,11 +7,11 @@ import (
 	"context"
 	"testing"
 
+	zipkin "github.com/open-telemetry/opentelemetry-collector-contrib/pkg/translator/zipkin/zipkinthriftconverter"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
 
 	"github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-	"github.com/jaegertracing/jaeger/model/converter/thrift/zipkin"
 )
 
 func TestProtobufMarshallerAndUnmarshaller(t *testing.T) {
@@ -36,7 +36,7 @@ func testMarshallerAndUnmarshaller(t *testing.T, marshaller Marshaller, unmarsha
 
 func TestZipkinThriftUnmarshaller(t *testing.T) {
 	operationName := "foo"
-	bytes := zipkin.SerializeThrift(context.Background(), []*zipkincore.Span{
+	bytes, err := zipkin.SerializeThrift(context.Background(), []*zipkincore.Span{
 		{
 			ID:   12345,
 			Name: operationName,
@@ -45,6 +45,7 @@ func TestZipkinThriftUnmarshaller(t *testing.T) {
 			},
 		},
 	})
+	require.NoError(t, err)
 	unmarshaller := NewZipkinThriftUnmarshaller()
 	resultSpan, err := unmarshaller.Unmarshal(bytes)
 
@@ -53,14 +54,15 @@ func TestZipkinThriftUnmarshaller(t *testing.T) {
 }
 
 func TestZipkinThriftUnmarshallerErrorNoService(t *testing.T) {
-	bytes := zipkin.SerializeThrift(context.Background(), []*zipkincore.Span{
+	bytes, err := zipkin.SerializeThrift(context.Background(), []*zipkincore.Span{
 		{
 			ID:   12345,
 			Name: "foo",
 		},
 	})
+	require.NoError(t, err)
 	unmarshaller := NewZipkinThriftUnmarshaller()
-	_, err := unmarshaller.Unmarshal(bytes)
+	_, err = unmarshaller.Unmarshal(bytes)
 	require.Error(t, err)
 }
 
diff --git a/internal/storage/v1/kafka/options_test.go b/internal/storage/v1/kafka/options_test.go
index fd35b4a9..5b79b0d2 100644
--- a/internal/storage/v1/kafka/options_test.go
+++ b/internal/storage/v1/kafka/options_test.go
@@ -13,7 +13,7 @@ import (
 	"github.com/stretchr/testify/require"
 	"go.opentelemetry.io/collector/config/configtls"
 
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/pkg/kafka/auth"
 )
 
diff --git a/internal/storage/v1/memory/factory_test.go b/internal/storage/v1/memory/factory_test.go
index 1212f4c3..090eb4fe 100644
--- a/internal/storage/v1/memory/factory_test.go
+++ b/internal/storage/v1/memory/factory_test.go
@@ -12,8 +12,8 @@ import (
 	"github.com/stretchr/testify/require"
 	"go.uber.org/zap"
 
+	"github.com/jaegertracing/jaeger/internal/config"
 	"github.com/jaegertracing/jaeger/internal/storage/v1"
-	"github.com/jaegertracing/jaeger/pkg/config"
 	"github.com/jaegertracing/jaeger/pkg/metrics"
 )
 
diff --git a/internal/storage/v1/memory/memory_test.go b/internal/storage/v1/memory/memory_test.go
index 35c6257d..a5dbc852 100644
--- a/internal/storage/v1/memory/memory_test.go
+++ b/internal/storage/v1/memory/memory_test.go
@@ -14,7 +14,7 @@ import (
 
 	"github.com/jaegertracing/jaeger-idl/model/v1"
 	"github.com/jaegertracing/jaeger/internal/storage/v1/api/spanstore"
-	"github.com/jaegertracing/jaeger/pkg/tenancy"
+	"github.com/jaegertracing/jaeger/internal/tenancy"
 )
 
 var (
diff --git a/internal/storage/v1/memory/options_test.go b/internal/storage/v1/memory/options_test.go
index 20d141ae..6ae37f53 100644
--- a/internal/storage/v1/memory/options_test.go
+++ b/internal/storage/v1/memory/options_test.go
@@ -8,7 +8,7 @@ import (
 
 	"github.com/stretchr/testify/assert"
 
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/config"
 )
 
 func TestOptionsWithFlags(t *testing.T) {
diff --git a/internal/storage/v2/grpc/tracereader_test.go b/internal/storage/v2/grpc/tracereader_test.go
index e0855bc7..2e108013 100644
--- a/internal/storage/v2/grpc/tracereader_test.go
+++ b/internal/storage/v2/grpc/tracereader_test.go
@@ -7,12 +7,15 @@ import (
 	"context"
 	"net"
 	"testing"
+	"time"
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+	"go.opentelemetry.io/collector/pdata/pcommon"
 	"google.golang.org/grpc"
 	"google.golang.org/grpc/credentials/insecure"
 
+	"github.com/jaegertracing/jaeger/internal/jiter"
 	"github.com/jaegertracing/jaeger/internal/storage/v2/api/tracestore"
 	"github.com/jaegertracing/jaeger/proto-gen/storage/v2"
 )
@@ -24,6 +27,7 @@ type testServer struct {
 
 	services   []string
 	operations []*storage.Operation
+	traceIDs   []*storage.FoundTraceID
 	err        error
 }
 
@@ -45,6 +49,15 @@ func (s *testServer) GetOperations(
 	}, s.err
 }
 
+func (s *testServer) FindTraceIDs(
+	context.Context,
+	*storage.FindTracesRequest,
+) (*storage.FindTraceIDsResponse, error) {
+	return &storage.FindTraceIDsResponse{
+		TraceIds: s.traceIDs,
+	}, s.err
+}
+
 func startTestServer(t *testing.T, testServer *testServer) *grpc.ClientConn {
 	listener, err := net.Listen("tcp", ":0")
 	require.NoError(t, err)
@@ -177,9 +190,268 @@ func TestTraceReader_FindTraces(t *testing.T) {
 }
 
 func TestTraceReader_FindTraceIDs(t *testing.T) {
-	tr := &TraceReader{}
+	queryParams := tracestore.TraceQueryParams{
+		ServiceName:   "service-a",
+		OperationName: "operation-a",
+		Attributes:    pcommon.NewMap(),
+	}
+	now := time.Now().UTC()
+	tests := []struct {
+		name          string
+		testServer    *testServer
+		queryParams   tracestore.TraceQueryParams
+		expectedIDs   []tracestore.FoundTraceID
+		expectedError string
+	}{
+		{
+			name: "success",
+			testServer: &testServer{
+				traceIDs: []*storage.FoundTraceID{
+					{
+						TraceId: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16},
+						Start:   now,
+						End:     now.Add(1 * time.Second),
+					},
+					{
+						TraceId: []byte{2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16},
+						Start:   now,
+						End:     now.Add(1 * time.Minute),
+					},
+				},
+			},
+			queryParams: queryParams,
+			expectedIDs: []tracestore.FoundTraceID{
+				{
+					TraceID: pcommon.TraceID([16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}),
+					Start:   now,
+					End:     now.Add(1 * time.Second),
+				},
+				{
+					TraceID: pcommon.TraceID([16]byte{2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}),
+					Start:   now,
+					End:     now.Add(1 * time.Minute),
+				},
+			},
+		},
+		{
+			name: "trace ID with less than 16 bytes",
+			testServer: &testServer{
+				traceIDs: []*storage.FoundTraceID{
+					{
+						TraceId: []byte{1, 2, 3, 4, 5, 6, 7, 8},
+						Start:   now,
+						End:     now.Add(1 * time.Second),
+					},
+				},
+			},
+			queryParams: queryParams,
+			expectedIDs: []tracestore.FoundTraceID{
+				{
+					TraceID: pcommon.TraceID([16]byte{1, 2, 3, 4, 5, 6, 7, 8}),
+					Start:   now,
+					End:     now.Add(1 * time.Second),
+				},
+			},
+		},
+		{
+			name: "trace ID with more than 16 bytes",
+			testServer: &testServer{
+				traceIDs: []*storage.FoundTraceID{
+					{
+						TraceId: []byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17},
+						Start:   now,
+						End:     now.Add(1 * time.Second),
+					},
+				},
+			},
+			queryParams: queryParams,
+			expectedIDs: []tracestore.FoundTraceID{
+				{
+					TraceID: pcommon.TraceID([16]byte{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16}),
+					Start:   now,
+					End:     now.Add(1 * time.Second),
+				},
+			},
+		},
+		{
+			name: "error",
+			testServer: &testServer{
+				err: assert.AnError,
+			},
+			queryParams:   queryParams,
+			expectedError: "failed to execute FindTraceIDs",
+		},
+	}
 
-	require.Panics(t, func() {
-		tr.FindTraceIDs(context.Background(), tracestore.TraceQueryParams{})
-	})
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			conn := startTestServer(t, test.testServer)
+
+			reader := NewTraceReader(conn)
+
+			foundIDsIter := reader.FindTraceIDs(context.Background(), test.queryParams)
+			foundIDs, err := jiter.FlattenWithErrors(foundIDsIter)
+
+			if test.expectedError != "" {
+				require.ErrorContains(t, err, test.expectedError)
+			} else {
+				require.NoError(t, err)
+				require.Equal(t, test.expectedIDs, foundIDs)
+			}
+		})
+	}
+}
+
+func TestConvertMapToKeyValueList(t *testing.T) {
+	tests := []struct {
+		name       string
+		attributes pcommon.Map
+		expected   []*storage.KeyValue
+	}{
+		{
+			name:       "empty map",
+			attributes: pcommon.NewMap(),
+			expected:   []*storage.KeyValue{},
+		},
+		{
+			name: "empty value",
+			attributes: func() pcommon.Map {
+				m := pcommon.NewMap()
+				m.PutEmpty("key1")
+				return m
+			}(),
+			expected: []*storage.KeyValue{
+				{
+					Key:   "key1",
+					Value: nil,
+				},
+			},
+		},
+		{
+			name: "primitive types",
+			attributes: func() pcommon.Map {
+				m := pcommon.NewMap()
+				m.PutStr("key1", "value1")
+				m.PutInt("key2", 42)
+				m.PutDouble("key3", 3.14)
+				m.PutBool("key4", true)
+				m.PutEmptyBytes("key5").Append(1, 2)
+				return m
+			}(),
+			expected: []*storage.KeyValue{
+				{
+					Key: "key1",
+					Value: &storage.AnyValue{
+						Value: &storage.AnyValue_StringValue{
+							StringValue: "value1",
+						},
+					},
+				},
+				{
+					Key: "key2",
+					Value: &storage.AnyValue{
+						Value: &storage.AnyValue_IntValue{
+							IntValue: 42,
+						},
+					},
+				},
+				{
+					Key: "key3",
+					Value: &storage.AnyValue{
+						Value: &storage.AnyValue_DoubleValue{
+							DoubleValue: 3.14,
+						},
+					},
+				},
+				{
+					Key: "key4",
+					Value: &storage.AnyValue{
+						Value: &storage.AnyValue_BoolValue{
+							BoolValue: true,
+						},
+					},
+				},
+				{
+					Key: "key5",
+					Value: &storage.AnyValue{
+						Value: &storage.AnyValue_BytesValue{
+							BytesValue: []byte{1, 2},
+						},
+					},
+				},
+			},
+		},
+		{
+			name: "nested map",
+			attributes: func() pcommon.Map {
+				m := pcommon.NewMap()
+				nested := pcommon.NewMap()
+				nested.PutStr("nestedKey", "nestedValue")
+				nested.CopyTo(m.PutEmptyMap("key1"))
+				return m
+			}(),
+			expected: []*storage.KeyValue{
+				{
+					Key: "key1",
+					Value: &storage.AnyValue{
+						Value: &storage.AnyValue_KvlistValue{
+							KvlistValue: &storage.KeyValueList{
+								Values: []*storage.KeyValue{
+									{
+										Key: "nestedKey",
+										Value: &storage.AnyValue{
+											Value: &storage.AnyValue_StringValue{
+												StringValue: "nestedValue",
+											},
+										},
+									},
+								},
+							},
+						},
+					},
+				},
+			},
+		},
+		{
+			name: "array attribute",
+			attributes: func() pcommon.Map {
+				m := pcommon.NewMap()
+				arr := pcommon.NewValueSlice()
+				arr.Slice().AppendEmpty().SetStr("value1")
+				arr.Slice().AppendEmpty().SetInt(42)
+				arr.Slice().CopyTo(m.PutEmptySlice("key1"))
+				return m
+			}(),
+			expected: []*storage.KeyValue{
+				{
+					Key: "key1",
+					Value: &storage.AnyValue{
+						Value: &storage.AnyValue_ArrayValue{
+							ArrayValue: &storage.ArrayValue{
+								Values: []*storage.AnyValue{
+									{
+										Value: &storage.AnyValue_StringValue{
+											StringValue: "value1",
+										},
+									},
+									{
+										Value: &storage.AnyValue_IntValue{
+											IntValue: 42,
+										},
+									},
+								},
+							},
+						},
+					},
+				},
+			},
+		},
+	}
+
+	for _, test := range tests {
+		t.Run(test.name, func(t *testing.T) {
+			result := convertMapToKeyValueList(test.attributes)
+			require.Equal(t, test.expected, result)
+		})
+	}
 }
diff --git a/pkg/tenancy/context_test.go b/internal/tenancy/context_test.go
similarity index 100%
rename from pkg/tenancy/context_test.go
rename to internal/tenancy/context_test.go
diff --git a/pkg/tenancy/flags_test.go b/internal/tenancy/flags_test.go
similarity index 100%
rename from pkg/tenancy/flags_test.go
rename to internal/tenancy/flags_test.go
diff --git a/pkg/tenancy/grpc_test.go b/internal/tenancy/grpc_test.go
similarity index 100%
rename from pkg/tenancy/grpc_test.go
rename to internal/tenancy/grpc_test.go
diff --git a/pkg/tenancy/http_test.go b/internal/tenancy/http_test.go
similarity index 100%
rename from pkg/tenancy/http_test.go
rename to internal/tenancy/http_test.go
diff --git a/pkg/tenancy/manage_test.go b/internal/tenancy/manage_test.go
similarity index 100%
rename from pkg/tenancy/manage_test.go
rename to internal/tenancy/manage_test.go
diff --git a/pkg/tenancy/package_test.go b/internal/tenancy/package_test.go
similarity index 100%
rename from pkg/tenancy/package_test.go
rename to internal/tenancy/package_test.go
diff --git a/model/converter/thrift/zipkin/deserialize_test.go b/model/converter/thrift/zipkin/deserialize_test.go
deleted file mode 100644
index 2e09d01f..00000000
--- a/model/converter/thrift/zipkin/deserialize_test.go
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2018 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package zipkin
-
-import (
-	"context"
-	"testing"
-
-	"github.com/stretchr/testify/require"
-
-	"github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-)
-
-func TestDeserializeWithBadListStart(t *testing.T) {
-	ctx := context.Background()
-	spanBytes := SerializeThrift(ctx, []*zipkincore.Span{{}})
-	_, err := DeserializeThrift(ctx, append([]byte{0, 255, 255}, spanBytes...))
-	require.Error(t, err)
-}
-
-func TestDeserializeWithCorruptedList(t *testing.T) {
-	ctx := context.Background()
-	spanBytes := SerializeThrift(ctx, []*zipkincore.Span{{}})
-	spanBytes[2] = 255
-	_, err := DeserializeThrift(ctx, spanBytes)
-	require.Error(t, err)
-}
-
-func TestDeserialize(t *testing.T) {
-	ctx := context.Background()
-	spanBytes := SerializeThrift(ctx, []*zipkincore.Span{{}})
-	_, err := DeserializeThrift(ctx, spanBytes)
-	require.NoError(t, err)
-}
diff --git a/model/converter/thrift/zipkin/package_test.go b/model/converter/thrift/zipkin/package_test.go
deleted file mode 100644
index 84896032..00000000
--- a/model/converter/thrift/zipkin/package_test.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2023 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package zipkin
-
-import (
-	"testing"
-
-	"github.com/jaegertracing/jaeger/internal/testutils"
-)
-
-func TestMain(m *testing.M) {
-	testutils.VerifyGoLeaks(m)
-}
diff --git a/model/converter/thrift/zipkin/process_hashtable_test.go b/model/converter/thrift/zipkin/process_hashtable_test.go
deleted file mode 100644
index c9af03e2..00000000
--- a/model/converter/thrift/zipkin/process_hashtable_test.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package zipkin
-
-import (
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-func TestProcessHashtable(t *testing.T) {
-	p1 := model.NewProcess("s1", []model.KeyValue{
-		model.String("host", "google.com"),
-	})
-	p1dup := model.NewProcess("s1", []model.KeyValue{
-		model.String("host", "google.com"),
-	})
-	p2 := model.NewProcess("s2", []model.KeyValue{
-		model.String("host", "facebook.com"),
-	})
-	ht := newProcessHashtable()
-	assert.Equal(t, p1, ht.add(p1))
-	assert.Equal(t, p2, ht.add(p2))
-	assert.Equal(t, p1, ht.add(p1))
-	assert.Equal(t, p2, ht.add(p2))
-	assert.Equal(t, p1, ht.add(p1dup))
-}
-
-func TestProcessHashtableCollision(t *testing.T) {
-	ht := newProcessHashtable()
-	// hash all processes to the same number
-	ht.extHash = func(*model.Process) uint64 {
-		return 42
-	}
-
-	p1 := model.NewProcess("s1", []model.KeyValue{
-		model.String("host", "google.com"),
-	})
-	p2 := model.NewProcess("s2", []model.KeyValue{
-		model.String("host", "facebook.com"),
-	})
-	assert.Equal(t, p1, ht.add(p1))
-	assert.Equal(t, p2, ht.add(p2))
-	assert.Equal(t, p1, ht.add(p1))
-	assert.Equal(t, p2, ht.add(p2))
-}
diff --git a/model/converter/thrift/zipkin/to_domain_test.go b/model/converter/thrift/zipkin/to_domain_test.go
deleted file mode 100644
index 3189fc61..00000000
--- a/model/converter/thrift/zipkin/to_domain_test.go
+++ /dev/null
@@ -1,206 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package zipkin
-
-import (
-	"bytes"
-	"encoding/base64"
-	"encoding/binary"
-	"encoding/json"
-	"fmt"
-	"math"
-	"os"
-	"testing"
-	"time"
-
-	"github.com/gogo/protobuf/jsonpb"
-	"github.com/gogo/protobuf/proto"
-	"github.com/kr/pretty"
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-	z "github.com/jaegertracing/jaeger-idl/thrift-gen/zipkincore"
-)
-
-const NumberOfFixtures = 3
-
-func TestToDomain(t *testing.T) {
-	for i := 1; i <= NumberOfFixtures; i++ {
-		in := fmt.Sprintf("fixtures/zipkin_%02d.json", i)
-		out := fmt.Sprintf("fixtures/domain_%02d.json", i)
-		zSpans := loadZipkinSpans(t, in)
-		expectedTrace := loadJaegerTrace(t, out)
-		expectedTrace.NormalizeTimestamps()
-		name := in + " -> " + out + " : " + zSpans[0].Name
-		t.Run(name, func(t *testing.T) {
-			trace, err := ToDomain(zSpans)
-			require.NoError(t, err)
-			trace.NormalizeTimestamps()
-			if !assert.Equal(t, expectedTrace, trace) {
-				for _, err := range pretty.Diff(expectedTrace, trace) {
-					t.Log(err)
-				}
-				out, err := json.Marshal(trace)
-				require.NoError(t, err)
-				t.Logf("Actual trace: %s", string(out))
-			}
-		})
-		if i == 1 {
-			t.Run("ToDomainSpans", func(t *testing.T) {
-				zSpan := zSpans[0]
-				jSpans, err := ToDomainSpan(zSpan)
-				require.NoError(t, err)
-				for _, jSpan := range jSpans {
-					jSpan.NormalizeTimestamps()
-					assert.Equal(t, expectedTrace.Spans[0], jSpan)
-				}
-			})
-		}
-	}
-}
-
-func TestToDomainNoServiceNameError(t *testing.T) {
-	zSpans := getZipkinSpans(t, `[{ "trace_id": -1, "id": 31 }]`)
-	trc, err := ToDomain(zSpans)
-	require.EqualError(t, err, "cannot find service name in Zipkin span [traceID=ffffffffffffffff, spanID=1f]")
-	assert.Len(t, trc.Spans, 1)
-	assert.Equal(t, "unknown-service-name", trc.Spans[0].Process.ServiceName)
-}
-
-func TestToDomainServiceNameInBinAnnotation(t *testing.T) {
-	zSpans := getZipkinSpans(t, `[{ "trace_id": -1, "id": 31,
-	"binary_annotations": [{"key": "foo", "host": {"service_name": "bar", "ipv4": 23456}}] }]`)
-	trc, err := ToDomain(zSpans)
-	require.NoError(t, err)
-	assert.Len(t, trc.Spans, 1)
-	assert.Equal(t, "bar", trc.Spans[0].Process.ServiceName)
-}
-
-func TestToDomainWithDurationFromServerAnnotations(t *testing.T) {
-	zSpans := getZipkinSpans(t, `[{ "trace_id": -1, "id": 31, "annotations": [
-	{"value": "sr", "timestamp": 1, "host": {"service_name": "bar", "ipv4": 23456}},
-	{"value": "ss", "timestamp": 10, "host": {"service_name": "bar", "ipv4": 23456}}
-	]}]`)
-	trc, err := ToDomain(zSpans)
-	require.NoError(t, err)
-	assert.Equal(t, 1000, int(trc.Spans[0].StartTime.Nanosecond()))
-	assert.Equal(t, 9000, int(trc.Spans[0].Duration))
-}
-
-func TestToDomainWithDurationFromClientAnnotations(t *testing.T) {
-	zSpans := getZipkinSpans(t, `[{ "trace_id": -1, "id": 31, "annotations": [
-	{"value": "cs", "timestamp": 1, "host": {"service_name": "bar", "ipv4": 23456}},
-	{"value": "cr", "timestamp": 10, "host": {"service_name": "bar", "ipv4": 23456}}
-	]}]`)
-	trc, err := ToDomain(zSpans)
-	require.NoError(t, err)
-	assert.Equal(t, 1000, int(trc.Spans[0].StartTime.Nanosecond()))
-	assert.Equal(t, 9000, int(trc.Spans[0].Duration))
-}
-
-func TestToDomainMultipleSpanKinds(t *testing.T) {
-	tests := []struct {
-		json         string
-		tagFirstKey  string
-		tagSecondKey string
-		tagFirstVal  model.SpanKind
-		tagSecondVal model.SpanKind
-	}{
-		{
-			json: `[{ "trace_id": -1, "id": 31, "annotations": [
-		{"value": "cs", "host": {"service_name": "bar", "ipv4": 23456}},
-		{"value": "sr", "timestamp": 1, "host": {"service_name": "bar", "ipv4": 23456}},
-		{"value": "ss", "timestamp": 2, "host": {"service_name": "bar", "ipv4": 23456}}
-		]}]`,
-			tagFirstKey:  model.SpanKindKey,
-			tagSecondKey: model.SpanKindKey,
-			tagFirstVal:  model.SpanKindClient,
-			tagSecondVal: model.SpanKindServer,
-		},
-		{
-			json: `[{ "trace_id": -1, "id": 31, "annotations": [
-		{"value": "sr", "host": {"service_name": "bar", "ipv4": 23456}},
-		{"value": "cs", "timestamp": 1, "host": {"service_name": "bar", "ipv4": 23456}},
-		{"value": "cr", "timestamp": 2, "host": {"service_name": "bar", "ipv4": 23456}}
-		]}]`,
-			tagFirstKey:  model.SpanKindKey,
-			tagSecondKey: model.SpanKindKey,
-			tagFirstVal:  model.SpanKindServer,
-			tagSecondVal: model.SpanKindClient,
-		},
-	}
-
-	for _, test := range tests {
-		trc, err := ToDomain(getZipkinSpans(t, test.json))
-		require.NoError(t, err)
-
-		assert.Len(t, trc.Spans, 2)
-		assert.Len(t, trc.Spans[0].Tags, 1)
-		assert.Equal(t, test.tagFirstKey, trc.Spans[0].Tags[0].Key)
-		assert.EqualValues(t, test.tagFirstVal, trc.Spans[0].Tags[0].VStr)
-
-		assert.Len(t, trc.Spans[1].Tags, 1)
-		assert.Equal(t, test.tagSecondKey, trc.Spans[1].Tags[0].Key)
-		assert.Equal(t, time.Duration(1000), trc.Spans[1].Duration)
-		assert.EqualValues(t, test.tagSecondVal, trc.Spans[1].Tags[0].VStr)
-	}
-}
-
-func TestInvalidAnnotationTypeError(t *testing.T) {
-	_, err := toDomain{}.transformBinaryAnnotation(&z.BinaryAnnotation{
-		AnnotationType: -1,
-	})
-	require.EqualError(t, err, "unknown zipkin annotation type: -1")
-}
-
-// TestZipkinEncoding is just for reference to explain the base64 strings
-// used in zipkin_03.json and jaeger_03.json fixtures
-func TestValidateBase64Values(t *testing.T) {
-	numberToBase64 := func(num any) string {
-		buf := &bytes.Buffer{}
-		binary.Write(buf, binary.BigEndian, num)
-		encoded := base64.StdEncoding.EncodeToString(buf.Bytes())
-		return encoded
-	}
-
-	assert.Equal(t, "MDk=", numberToBase64(int16(12345)))
-	assert.Equal(t, "AAAwOQ==", numberToBase64(int32(12345)))
-	assert.Equal(t, "AAAAAAAAMDk=", numberToBase64(int64(12345)))
-	assert.Equal(t, "QMgcgAAAAAA=", numberToBase64(int64(math.Float64bits(12345))))
-	assert.Equal(t, int64(4668012349850910720), int64(math.Float64bits(12345)), "sanity check")
-}
-
-func loadZipkinSpans(t *testing.T, file string) []*z.Span {
-	var zSpans []*z.Span
-	loadJSON(t, file, &zSpans)
-	return zSpans
-}
-
-func loadJaegerTrace(t *testing.T, file string) *model.Trace {
-	var trc model.Trace
-	loadJSONPB(t, file, &trc)
-	return &trc
-}
-
-func loadJSONPB(t *testing.T, fileName string, obj proto.Message) {
-	jsonFile, err := os.Open(fileName)
-	require.NoError(t, err, "Failed to open json fixture file %s", fileName)
-	require.NoError(t, jsonpb.Unmarshal(jsonFile, obj), fileName)
-}
-
-func getZipkinSpans(t *testing.T, s string) []*z.Span {
-	var zSpans []*z.Span
-	require.NoError(t, json.Unmarshal([]byte(s), &zSpans))
-	return zSpans
-}
-
-func loadJSON(t *testing.T, fileName string, i any) {
-	jsonFile, err := os.Open(fileName)
-	require.NoError(t, err, "Failed to load json fixture file %s", fileName)
-	jsonParser := json.NewDecoder(jsonFile)
-	err = jsonParser.Decode(i)
-	require.NoError(t, err, "Failed to parse json fixture file %s", fileName)
-}
diff --git a/model/dependencies_test.go b/model/dependencies_test.go
deleted file mode 100644
index 9c25bfbb..00000000
--- a/model/dependencies_test.go
+++ /dev/null
@@ -1,19 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package model
-
-import (
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-)
-
-func TestDependencyLinkApplyDefaults(t *testing.T) {
-	dl := DependencyLink{}.ApplyDefaults()
-	assert.Equal(t, JaegerDependencyLinkSource, dl.Source)
-
-	networkSource := "network"
-	dl = DependencyLink{Source: networkSource}.ApplyDefaults()
-	assert.Equal(t, networkSource, dl.Source)
-}
diff --git a/model/flags_test.go b/model/flags_test.go
deleted file mode 100644
index b4e532de..00000000
--- a/model/flags_test.go
+++ /dev/null
@@ -1,48 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model_test
-
-import (
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-func TestIsDebug(t *testing.T) {
-	flags := model.Flags(0)
-	flags.SetDebug()
-	assert.True(t, flags.IsDebug())
-	flags = model.Flags(0)
-	assert.False(t, flags.IsDebug())
-
-	flags = model.Flags(32)
-	assert.False(t, flags.IsDebug())
-	flags.SetDebug()
-	assert.True(t, flags.IsDebug())
-}
-
-func TestIsFirehoseEnabled(t *testing.T) {
-	flags := model.Flags(0)
-	assert.False(t, flags.IsFirehoseEnabled())
-	flags.SetDebug()
-	flags.SetSampled()
-	assert.False(t, flags.IsFirehoseEnabled())
-	flags.SetFirehose()
-	assert.True(t, flags.IsFirehoseEnabled())
-
-	flags = model.Flags(8)
-	assert.True(t, flags.IsFirehoseEnabled())
-}
-
-func TestIsSampled(t *testing.T) {
-	flags := model.Flags(0)
-	flags.SetSampled()
-	assert.True(t, flags.IsSampled())
-	flags = model.Flags(0)
-	flags.SetDebug()
-	assert.False(t, flags.IsSampled())
-}
diff --git a/model/hash_test.go b/model/hash_test.go
deleted file mode 100644
index 615d6cff..00000000
--- a/model/hash_test.go
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model_test
-
-import (
-	"errors"
-	"fmt"
-	"io"
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-type mockHashWwiterAnswer struct {
-	n   int
-	err error
-}
-
-type mockHashWwiter struct {
-	answers []mockHashWwiterAnswer
-}
-
-func (w *mockHashWwiter) Write(data []byte) (int, error) {
-	if len(w.answers) == 0 {
-		return 0, fmt.Errorf("no answer registered for call with data=%+v", data)
-	}
-	answer := w.answers[0]
-	w.answers = w.answers[1:]
-	return answer.n, answer.err
-}
-
-type errHashable struct {
-	err error
-}
-
-func (e *errHashable) Hash(io.Writer) error {
-	return e.err
-}
-
-func TestHasCodeError(t *testing.T) {
-	someErr := errors.New("some error")
-	h := &errHashable{err: someErr}
-	n, err := model.HashCode(h)
-	assert.Equal(t, uint64(0), n)
-	assert.Equal(t, someErr, err)
-}
diff --git a/model/ids_proto_test.go b/model/ids_proto_test.go
deleted file mode 100644
index 7210075e..00000000
--- a/model/ids_proto_test.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2018 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model_test
-
-import (
-	"bytes"
-	"testing"
-
-	"github.com/gogo/protobuf/jsonpb"
-	"github.com/gogo/protobuf/proto"
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-	"github.com/jaegertracing/jaeger/model/prototest"
-)
-
-// TraceID/SpanID fields are defined as bytes in proto, backed by custom types in Go.
-// Unfortunately, that means they require manual implementations of proto & json serialization.
-// To ensure that it's the same as the default protobuf serialization, file jaeger_test.proto
-// contains a copy of SpanRef message without any gogo options. This test file is compiled with
-// plain protoc -go_out (without gogo). This test performs proto and JSON marshaling/unmarshaling
-// to ensure that the outputs of manual and standard serialization are identical.
-func TestTraceSpanIDMarshalProto(t *testing.T) {
-	testCases := []struct {
-		name      string
-		marshal   func(proto.Message) ([]byte, error)
-		unmarshal func([]byte, proto.Message) error
-		expected  string
-	}{
-		{
-			name:      "protobuf",
-			marshal:   proto.Marshal,
-			unmarshal: proto.Unmarshal,
-		},
-		{
-			name: "JSON",
-			marshal: func(m proto.Message) ([]byte, error) {
-				out := new(bytes.Buffer)
-				err := new(jsonpb.Marshaler).Marshal(out, m)
-				if err != nil {
-					return nil, err
-				}
-				return out.Bytes(), nil
-			},
-			unmarshal: func(in []byte, m proto.Message) error {
-				return jsonpb.Unmarshal(bytes.NewReader(in), m)
-			},
-			expected: `{"traceId":"AAAAAAAAAAIAAAAAAAAAAw==","spanId":"AAAAAAAAAAs="}`,
-		},
-	}
-	for _, testCase := range testCases {
-		t.Run(testCase.name, func(t *testing.T) {
-			ref1 := model.SpanRef{TraceID: model.NewTraceID(2, 3), SpanID: model.NewSpanID(11)}
-			ref2 := prototest.SpanRef{
-				// TODO: would be cool to fuzz that test
-				TraceId: []byte{0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3},
-				SpanId:  []byte{0, 0, 0, 0, 0, 0, 0, 11},
-			}
-			d1, err := testCase.marshal(&ref1)
-			require.NoError(t, err)
-			d2, err := testCase.marshal(&ref2)
-			require.NoError(t, err)
-			assert.Equal(t, d2, d1)
-			if testCase.expected != "" {
-				assert.Equal(t, testCase.expected, string(d1))
-			}
-			// test unmarshal
-			var ref1u model.SpanRef
-			err = testCase.unmarshal(d2, &ref1u)
-			require.NoError(t, err)
-			assert.Equal(t, ref1, ref1u)
-		})
-	}
-}
diff --git a/model/ids_test.go b/model/ids_test.go
deleted file mode 100644
index e5aefa7d..00000000
--- a/model/ids_test.go
+++ /dev/null
@@ -1,56 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2018 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model_test
-
-import (
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-func TestSpanIDFromBytes(t *testing.T) {
-	errTests := [][]byte{
-		{0, 0, 0, 0},
-		{0, 0, 0, 0, 0, 0, 0, 13, 0},
-	}
-	for _, data := range errTests {
-		_, err := model.SpanIDFromBytes(data)
-		require.Error(t, err)
-		require.EqualError(t, err, "invalid length for SpanID")
-	}
-
-	spanID, err := model.SpanIDFromBytes([]byte{0, 0, 0, 0, 0, 0, 0, 13})
-	require.NoError(t, err)
-	assert.Equal(t, spanID, model.NewSpanID(13))
-}
-
-func TestTraceIDFromBytes(t *testing.T) {
-	errTests := [][]byte{
-		{0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 0, 0, 13},
-		{0, 0, 0, 0, 0, 0, 0, 13, 0, 0, 0, 0, 0, 0, 13},
-		{0, 0, 0, 0, 0, 0, 13},
-	}
-	for _, data := range errTests {
-		_, err := model.TraceIDFromBytes(data)
-		require.Error(t, err)
-		assert.Equal(t, "invalid length for TraceID", err.Error())
-	}
-
-	tests := []struct {
-		data     []byte
-		expected model.TraceID
-	}{
-		{data: []byte{0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 3}, expected: model.NewTraceID(2, 3)},
-		{data: []byte{0, 0, 0, 0, 0, 0, 0, 2}, expected: model.NewTraceID(0, 2)},
-	}
-	for _, test := range tests {
-		traceID, err := model.TraceIDFromBytes(test.data)
-		require.NoError(t, err)
-		assert.Equal(t, test.expected, traceID)
-	}
-}
diff --git a/model/keyvalue_test.go b/model/keyvalue_test.go
deleted file mode 100644
index d1cb239e..00000000
--- a/model/keyvalue_test.go
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model_test
-
-import (
-	"bytes"
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-func TestKeyValueString(t *testing.T) {
-	kv := model.String("x", "y")
-	assert.Equal(t, "x", kv.Key)
-	assert.Equal(t, model.StringType, kv.VType)
-	assert.Equal(t, "y", kv.VStr)
-	assert.False(t, kv.Bool())
-	assert.Equal(t, int64(0), kv.Int64())
-	assert.InDelta(t, float64(0), kv.Float64(), 0.01)
-	assert.Nil(t, kv.Binary())
-}
-
-func TestKeyValueBool(t *testing.T) {
-	kv := model.Bool("x", true)
-	assert.Equal(t, "x", kv.Key)
-	assert.Equal(t, model.BoolType, kv.VType)
-	assert.True(t, kv.Bool())
-}
-
-func TestKeyValueInt64(t *testing.T) {
-	kv := model.Int64("x", 123)
-	assert.Equal(t, "x", kv.Key)
-	assert.Equal(t, model.Int64Type, kv.VType)
-	assert.Equal(t, int64(123), kv.Int64())
-}
-
-func TestKeyValueFloat64(t *testing.T) {
-	kv := model.Float64("x", 123.345)
-	assert.Equal(t, "x", kv.Key)
-	assert.Equal(t, model.Float64Type, kv.VType)
-	assert.InDelta(t, 123.345, kv.Float64(), 1e-4)
-}
-
-func TestKeyValueBinary(t *testing.T) {
-	kv := model.Binary("x", []byte{123, 45})
-	assert.Equal(t, "x", kv.Key)
-	assert.Equal(t, model.BinaryType, kv.VType)
-	assert.Equal(t, []byte{123, 45}, kv.Binary())
-}
-
-func TestKeyValueIsLessAndEqual(t *testing.T) {
-	testCases := []struct {
-		name  string
-		kv1   model.KeyValue
-		kv2   model.KeyValue
-		equal bool
-	}{
-		{name: "different keys", kv1: model.String("x", "123"), kv2: model.String("y", "123")},
-		{name: "same key different types", kv1: model.String("x", "123"), kv2: model.Int64("x", 123)},
-		{name: "different string values", kv1: model.String("x", "123"), kv2: model.String("x", "567")},
-		{name: "different bool values", kv1: model.Bool("x", false), kv2: model.Bool("x", true)},
-		{name: "different int64 values", kv1: model.Int64("x", 123), kv2: model.Int64("x", 567)},
-		{name: "different float64 values", kv1: model.Float64("x", 123), kv2: model.Float64("x", 567)},
-		{name: "different blob length", kv1: model.Binary("x", []byte{1, 2}), kv2: model.Binary("x", []byte{1, 2, 3})},
-		{name: "different blob values", kv1: model.Binary("x", []byte{1, 2, 3}), kv2: model.Binary("x", []byte{1, 2, 4})},
-		{name: "empty blob", kv1: model.Binary("x", nil), kv2: model.Binary("x", nil), equal: true},
-		{name: "identical blob", kv1: model.Binary("x", []byte{1, 2, 3}), kv2: model.Binary("x", []byte{1, 2, 3}), equal: true},
-	}
-	for _, tt := range testCases {
-		testCase := tt // capture loop var
-		t.Run(testCase.name, func(t *testing.T) {
-			if testCase.equal {
-				assert.False(t, testCase.kv1.IsLess(&testCase.kv2))
-				assert.True(t, testCase.kv1.Equal(&testCase.kv2))
-				assert.True(t, testCase.kv2.Equal(&testCase.kv1))
-			} else {
-				assert.True(t, testCase.kv1.IsLess(&testCase.kv2))
-				assert.False(t, testCase.kv1.Equal(&testCase.kv2))
-				assert.False(t, testCase.kv2.Equal(&testCase.kv1))
-			}
-			assert.False(t, testCase.kv2.IsLess(&testCase.kv1))
-		})
-	}
-	t.Run("invalid type", func(t *testing.T) {
-		v1 := model.KeyValue{Key: "x", VType: model.ValueType(-1)}
-		v2 := model.KeyValue{Key: "x", VType: model.ValueType(-2)}
-		assert.False(t, v1.IsLess(&v2))
-		assert.True(t, v2.IsLess(&v1))
-		assert.False(t, v1.Equal(&v2))
-		assert.False(t, v2.Equal(&v1))
-	})
-}
-
-func TestKeyValueAsStringAndValue(t *testing.T) {
-	longString := `Bender Bending Rodrigues Bender Bending Rodrigues Bender Bending Rodrigues Bender Bending Rodrigues
-	Bender Bending Rodrigues Bender Bending Rodrigues Bender Bending Rodrigues Bender Bending Rodrigues Bender Bending Rodrigues
-	Bender Bending Rodrigues Bender Bending Rodrigues Bender Bending Rodrigues Bender Bending Rodrigues Bender Bending Rodrigues
-	Bender Bending Rodrigues Bender Bending Rodrigues Bender Bending Rodrigues Bender Bending Rodrigues Bender Bending Rodrigues
-	Bender Bending Rodrigues Bender Bending Rodrigues Bender Bending Rodrigues Bender Bending Rodrigues Bender Bending Rodrigues `
-	expectedBinaryStr := `42656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565730a0942656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565730a0942656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565730a0942656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565730a0942656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f6472696775657320`
-	expectedBinaryStrLossy := `42656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565730a0942656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565732042656e6465722042656e64696e6720526f647269677565730a0942656e6465722042656e64696e6720526f647269677565732042656e64...`
-	testCases := []struct {
-		name     string
-		kv       model.KeyValue
-		str      string
-		strLossy string
-		val      any
-	}{
-		{name: "Bender is great!", kv: model.String("x", "Bender is great!"), str: "Bender is great!", val: "Bender is great!"},
-		{name: "false", kv: model.Bool("x", false), str: "false", val: false},
-		{name: "true", kv: model.Bool("x", true), str: "true", val: true},
-		{name: "3000", kv: model.Int64("x", 3000), str: "3000", val: int64(3000)},
-		{name: "-1947", kv: model.Int64("x", -1947), str: "-1947", val: int64(-1947)},
-		{name: "3.141592654", kv: model.Float64("x", 3.14159265359), str: "3.141592654", val: float64(3.14159265359)},
-		{name: "42656e646572", kv: model.Binary("x", []byte("Bender")), str: "42656e646572", val: []byte("Bender")},
-		{name: "binary string", kv: model.Binary("x", []byte(longString)), str: expectedBinaryStr, val: []byte(longString)},
-		{name: "binary string (lossy)", kv: model.Binary("x", []byte(longString)), strLossy: expectedBinaryStrLossy, val: []byte(longString)},
-	}
-	for _, tt := range testCases {
-		testCase := tt // capture loop var
-		t.Run(testCase.name, func(t *testing.T) {
-			if testCase.strLossy != "" {
-				assert.Equal(t, testCase.strLossy, testCase.kv.AsStringLossy())
-			} else {
-				assert.Equal(t, testCase.str, testCase.kv.AsString())
-			}
-			assert.Equal(t, testCase.val, testCase.kv.Value())
-		})
-	}
-	t.Run("invalid type", func(t *testing.T) {
-		kv := model.KeyValue{Key: "x", VType: model.ValueType(-1)}
-		assert.Equal(t, "unknown type -1", kv.AsString())
-		require.EqualError(t, kv.Value().(error), "unknown type -1")
-	})
-}
-
-func TestKeyValueHash(t *testing.T) {
-	testCases := []struct {
-		kv model.KeyValue
-	}{
-		{kv: model.String("x", "Bender is great!")},
-		{kv: model.Bool("x", true)},
-		{kv: model.Int64("x", 3000)},
-		{kv: model.Float64("x", 3.14159265359)},
-		{kv: model.Binary("x", []byte("Bender"))},
-	}
-	for _, tt := range testCases {
-		testCase := tt // capture loop var
-		t.Run(testCase.kv.String(), func(t *testing.T) {
-			out := new(bytes.Buffer)
-			require.NoError(t, testCase.kv.Hash(out))
-		})
-	}
-}
diff --git a/model/keyvalues_test.go b/model/keyvalues_test.go
deleted file mode 100644
index e241b4bb..00000000
--- a/model/keyvalues_test.go
+++ /dev/null
@@ -1,159 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model_test
-
-import (
-	"errors"
-	"fmt"
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-func TestKeyValuesSort(t *testing.T) {
-	input := model.KeyValues{
-		model.String("x", "z"),
-		model.String("x", "y"),
-		model.Int64("a", 2),
-		model.Int64("a", 1),
-		model.Float64("x", 2),
-		model.Float64("x", 1),
-		model.Bool("x", true),
-		model.Bool("x", false),
-	}
-	expected := model.KeyValues{
-		model.Int64("a", 1),
-		model.Int64("a", 2),
-		model.String("x", "y"),
-		model.String("x", "z"),
-		model.Bool("x", false),
-		model.Bool("x", true),
-		model.Float64("x", 1),
-		model.Float64("x", 2),
-	}
-	input.Sort()
-	assert.Equal(t, expected, input)
-}
-
-func TestSpanKindFromString(t *testing.T) {
-	testCases := []struct {
-		input  string
-		output model.SpanKind
-		err    string
-	}{
-		{input: "client", output: model.SpanKindClient},
-		{input: "", output: model.SpanKindUnspecified},
-		{input: "foobar", output: model.SpanKindUnspecified, err: "unknown span kind"},
-	}
-	for _, test := range testCases {
-		t.Run(fmt.Sprintf("%+v", test), func(t *testing.T) {
-			v, err := model.SpanKindFromString(test.input)
-			if test.err != "" {
-				require.ErrorContains(t, err, test.err)
-			} else {
-				require.NoError(t, err)
-			}
-			assert.Equal(t, test.output, v)
-		})
-	}
-}
-
-func TestKeyValuesFindByKey(t *testing.T) {
-	input := model.KeyValues{
-		model.String("x", "z"),
-		model.String("x", "y"),
-		model.Int64("a", 2),
-	}
-
-	testCases := []struct {
-		key   string
-		found bool
-		kv    model.KeyValue
-	}{
-		{"b", false, model.KeyValue{}},
-		{"a", true, model.Int64("a", 2)},
-		{"x", true, model.String("x", "z")},
-	}
-
-	for _, test := range testCases {
-		t.Run(fmt.Sprintf("%+v", test), func(t *testing.T) {
-			kv, found := input.FindByKey(test.key)
-			assert.Equal(t, test.found, found)
-			assert.Equal(t, test.kv, kv)
-		})
-	}
-}
-
-func TestKeyValuesEqual(t *testing.T) {
-	kv1 := model.String("s", "abc")
-	kv2 := model.Int64("i", 123)
-	kv3 := model.Float64("f", 123.4)
-	assert.True(t, model.KeyValues{}.Equal(model.KeyValues{}))
-	assert.True(t, model.KeyValues{kv1}.Equal(model.KeyValues{kv1}))
-	assert.True(t, model.KeyValues{kv1, kv2}.Equal(model.KeyValues{kv1, kv2}))
-	assert.False(t, model.KeyValues{kv1, kv2}.Equal(model.KeyValues{kv2, kv1}))
-	assert.False(t, model.KeyValues{kv1, kv2}.Equal(model.KeyValues{kv1, kv3}))
-	assert.False(t, model.KeyValues{kv1, kv2}.Equal(model.KeyValues{kv1, kv2, kv3}))
-}
-
-func TestKeyValuesHashErrors(t *testing.T) {
-	kvs := model.KeyValues{
-		model.String("x", "y"),
-	}
-	someErr := errors.New("some error")
-	for i := 0; i < 3; i++ {
-		// mock writer with i-1 successful answers, and one failed answer
-		w := &mockHashWwiter{
-			answers: make([]mockHashWwiterAnswer, i+1),
-		}
-		w.answers[i] = mockHashWwiterAnswer{1, someErr}
-		assert.Equal(t, someErr, kvs.Hash(w))
-	}
-	kvs[0].VType = model.ValueType(-1)
-	w := &mockHashWwiter{
-		answers: make([]mockHashWwiterAnswer, 3),
-	}
-	require.EqualError(t, kvs.Hash(w), "unknown type -1")
-}
-
-// No memory allocations for IsLess and Equal
-// 18.6 ns/op	       0 B/op	       0 allocs/op
-func BenchmarkKeyValueIsLessAndEquals(b *testing.B) {
-	kv1 := model.KeyValue{Key: "x", VType: model.ValueType(-1)}
-	kv2 := model.KeyValue{Key: "x", VType: model.ValueType(-1)}
-	for i := 0; i < b.N; i++ {
-		kv1.IsLess(&kv2)
-		kv2.IsLess(&kv1)
-		kv1.Equal(&kv2)
-		kv2.Equal(&kv1)
-	}
-}
-
-// No memory allocations for Sort (1 alloc comes from the algorithm, not from comparisons)
-// 107 ns/op	      32 B/op	       1 allocs/op
-func BenchmarkKeyValuesSort(b *testing.B) {
-	kv1 := model.KeyValue{Key: "x", VType: model.ValueType(-1)}
-	kv2 := model.KeyValue{Key: "x", VType: model.ValueType(-1)}
-	list := model.KeyValues(make([]model.KeyValue, 5))
-	for i := 0; i < b.N; i++ {
-		list[0], list[1], list[2], list[3], list[4] = kv2, kv1, kv2, kv1, kv2
-		list.Sort()
-	}
-}
-
-// No memory allocations from wrapping sliceinto model.KeyValues()
-// 0.53 ns/op	       0 B/op	       0 allocs/op
-func BenchmarkKeyValuesWrapping(b *testing.B) {
-	kv := []model.KeyValue{
-		model.String("x", "y"),
-		model.Int64("n", 42),
-	}
-	for i := 0; i < b.N; i++ {
-		model.KeyValues(kv).Len()
-	}
-}
diff --git a/model/package_test.go b/model/package_test.go
deleted file mode 100644
index 99ed14e9..00000000
--- a/model/package_test.go
+++ /dev/null
@@ -1,14 +0,0 @@
-// Copyright (c) 2023 The Jaeger Authors.
-// SPDX-License-Identifier: Apache-2.0
-
-package model
-
-import (
-	"testing"
-
-	"github.com/jaegertracing/jaeger/internal/testutils"
-)
-
-func TestMain(m *testing.M) {
-	testutils.VerifyGoLeaks(m)
-}
diff --git a/model/process_test.go b/model/process_test.go
deleted file mode 100644
index 445e8a2a..00000000
--- a/model/process_test.go
+++ /dev/null
@@ -1,94 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model_test
-
-import (
-	"errors"
-	"hash/fnv"
-	"io"
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-func TestProcessEqual(t *testing.T) {
-	p1 := model.NewProcess("s1", []model.KeyValue{
-		model.String("x", "y"),
-		model.Int64("a", 1),
-	})
-	p2 := model.NewProcess("s1", []model.KeyValue{
-		model.Int64("a", 1),
-		model.String("x", "y"),
-	})
-	p3 := model.NewProcess("S2", []model.KeyValue{
-		model.Int64("a", 1),
-		model.String("x", "y"),
-	})
-	p4 := model.NewProcess("s1", []model.KeyValue{
-		model.Int64("a", 1),
-		model.Float64("a", 1.1),
-		model.String("x", "y"),
-	})
-	p5 := model.NewProcess("s1", []model.KeyValue{
-		model.Float64("a", 1.1),
-		model.String("x", "y"),
-	})
-	assert.Equal(t, p1, p2)
-	assert.True(t, p1.Equal(p2))
-	assert.False(t, p1.Equal(p3))
-	assert.False(t, p1.Equal(p4))
-	assert.False(t, p1.Equal(p5))
-}
-
-func Hash(w io.Writer) {
-	w.Write([]byte("hello"))
-}
-
-func TestX(*testing.T) {
-	h := fnv.New64a()
-	Hash(h)
-}
-
-func TestProcessHash(t *testing.T) {
-	p1 := model.NewProcess("s1", []model.KeyValue{
-		model.String("x", "y"),
-		model.Int64("y", 1),
-		model.Binary("z", []byte{1}),
-	})
-	p1copy := model.NewProcess("s1", []model.KeyValue{
-		model.String("x", "y"),
-		model.Int64("y", 1),
-		model.Binary("z", []byte{1}),
-	})
-	p2 := model.NewProcess("s2", []model.KeyValue{
-		model.String("x", "y"),
-		model.Int64("y", 1),
-		model.Binary("z", []byte{1}),
-	})
-	p1h, err := model.HashCode(p1)
-	require.NoError(t, err)
-	p1ch, err := model.HashCode(p1copy)
-	require.NoError(t, err)
-	p2h, err := model.HashCode(p2)
-	require.NoError(t, err)
-	assert.Equal(t, p1h, p1ch)
-	assert.NotEqual(t, p1h, p2h)
-}
-
-func TestProcessHashError(t *testing.T) {
-	p1 := model.NewProcess("s1", []model.KeyValue{
-		model.String("x", "y"),
-	})
-	someErr := errors.New("some error")
-	w := &mockHashWwiter{
-		answers: []mockHashWwiterAnswer{
-			{1, someErr},
-		},
-	}
-	assert.Equal(t, someErr, p1.Hash(w))
-}
diff --git a/model/sort_test.go b/model/sort_test.go
deleted file mode 100644
index f845557c..00000000
--- a/model/sort_test.go
+++ /dev/null
@@ -1,129 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model
-
-import (
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-)
-
-var currTime = time.Now()
-
-func TestSortTraces(t *testing.T) {
-	t1 := &Trace{
-		Spans: []*Span{
-			{
-				TraceID: TraceID{Low: 1},
-				SpanID:  SpanID(2),
-				Tags:    []KeyValue{{Key: "world"}, {Key: "hello"}},
-				Process: &Process{
-					ServiceName: "hello",
-					Tags:        []KeyValue{{Key: "hello"}, {Key: "world"}},
-				},
-			},
-			{
-				TraceID: TraceID{Low: 1},
-				SpanID:  SpanID(1),
-				Logs: []Log{
-					{
-						Timestamp: currTime,
-						Fields:    []KeyValue{{Key: "world"}, {Key: "hello"}},
-					},
-					{
-						Timestamp: currTime.Add(-time.Hour),
-						Fields:    []KeyValue{{Key: "hello"}, {Key: "world"}},
-					},
-				},
-			},
-		},
-	}
-	t2 := &Trace{
-		Spans: []*Span{
-			{
-				TraceID: TraceID{Low: 1},
-				SpanID:  SpanID(2),
-				Tags:    []KeyValue{{Key: "world"}, {Key: "hello"}},
-				Process: &Process{
-					ServiceName: "hello",
-					Tags:        []KeyValue{{Key: "hello"}, {Key: "world"}},
-				},
-			},
-			{
-				TraceID: TraceID{Low: 1},
-				SpanID:  SpanID(1),
-				Logs: []Log{
-					{
-						Timestamp: currTime.Add(-time.Hour),
-						Fields:    []KeyValue{{Key: "world"}, {Key: "hello"}},
-					},
-					{
-						Timestamp: currTime,
-						Fields:    []KeyValue{{Key: "hello"}, {Key: "world"}},
-					},
-				},
-			},
-		},
-	}
-	SortTrace(t1)
-	SortTrace(t2)
-	assert.EqualValues(t, t1, t2)
-}
-
-func TestSortListOfTraces(t *testing.T) {
-	t1 := &Trace{
-		Spans: []*Span{
-			{
-				TraceID: TraceID{Low: 1},
-			},
-			{
-				TraceID: TraceID{Low: 1},
-			},
-		},
-	}
-	t2 := &Trace{
-		Spans: []*Span{
-			{
-				TraceID: TraceID{Low: 2},
-			},
-		},
-	}
-	t3 := &Trace{
-		Spans: []*Span{
-			{
-				TraceID: TraceID{Low: 3},
-			},
-		},
-	}
-	t4 := &Trace{}
-
-	list1 := []*Trace{t1, t4, t2, t3}
-	list2 := []*Trace{t4, t2, t1, t3}
-	SortTraces(list1)
-	SortTraces(list2)
-	assert.EqualValues(t, list1, list2)
-}
-
-func TestSortByTraceID(t *testing.T) {
-	traceID := &TraceID{
-		High: uint64(1),
-		Low:  uint64(1),
-	}
-	traceID2 := &TraceID{
-		High: uint64(2),
-		Low:  uint64(0),
-	}
-	traceID3 := &TraceID{
-		High: uint64(1),
-		Low:  uint64(0),
-	}
-
-	traces := []*TraceID{traceID, traceID2, traceID3}
-	// Expect ascending order
-	tracesExpected := []*TraceID{traceID3, traceID, traceID2}
-	SortTraceIDs(traces)
-	assert.EqualValues(t, tracesExpected, traces)
-}
diff --git a/model/span_test.go b/model/span_test.go
deleted file mode 100644
index 5d61e934..00000000
--- a/model/span_test.go
+++ /dev/null
@@ -1,334 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model_test
-
-import (
-	"bytes"
-	"fmt"
-	"testing"
-	"time"
-
-	"github.com/gogo/protobuf/jsonpb"
-	"github.com/gogo/protobuf/proto"
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-// Verify: https://cryptii.com/base64-to-hex
-var testCasesTraceID = []struct {
-	hi, lo uint64
-	hex    string
-	b64    string
-}{
-	{lo: 1, hex: "0000000000000001", b64: "AAAAAAAAAAAAAAAAAAAAAQ=="},
-	{lo: 15, hex: "000000000000000f", b64: "AAAAAAAAAAAAAAAAAAAADw=="},
-	{lo: 31, hex: "000000000000001f", b64: "AAAAAAAAAAAAAAAAAAAAHw=="},
-	{lo: 257, hex: "0000000000000101", b64: "AAAAAAAAAAAAAAAAAAABAQ=="},
-	{hi: 1, lo: 1, hex: "00000000000000010000000000000001", b64: "AAAAAAAAAAEAAAAAAAAAAQ=="},
-	{hi: 257, lo: 1, hex: "00000000000001010000000000000001", b64: "AAAAAAAAAQEAAAAAAAAAAQ=="},
-}
-
-func TestTraceIDMarshalJSONPB(t *testing.T) {
-	for _, testCase := range testCasesTraceID {
-		t.Run(testCase.hex, func(t *testing.T) {
-			expected := fmt.Sprintf(`{"traceId":"%s"}`, testCase.b64)
-
-			ref := model.SpanRef{TraceID: model.NewTraceID(testCase.hi, testCase.lo)}
-			out := new(bytes.Buffer)
-			err := new(jsonpb.Marshaler).Marshal(out, &ref)
-			require.NoError(t, err)
-			assert.Equal(t, expected, out.String())
-			assert.Equal(t, testCase.hex, ref.TraceID.String())
-
-			ref = model.SpanRef{}
-			err = jsonpb.Unmarshal(bytes.NewReader([]byte(expected)), &ref)
-			require.NoError(t, err)
-			assert.Equal(t, testCase.hi, ref.TraceID.High)
-			assert.Equal(t, testCase.lo, ref.TraceID.Low)
-			traceID, err := model.TraceIDFromString(testCase.hex)
-			require.NoError(t, err)
-			assert.Equal(t, ref.TraceID, traceID)
-		})
-	}
-}
-
-func TestTraceIDUnmarshalJSONPBErrors(t *testing.T) {
-	testCases := []struct {
-		in string
-	}{
-		{in: ""},
-		{in: "x"},
-		{in: "x0000000000000001"},
-		{in: "1x000000000000001"},
-		{in: "10123456789abcdef0123456789abcdef"},
-		{in: "AAAAAAE="},
-	}
-	for _, testCase := range testCases {
-		t.Run(testCase.in, func(t *testing.T) {
-			var ref model.SpanRef
-			json := fmt.Sprintf(`{"traceId":"%s"}`, testCase.in)
-			err := jsonpb.Unmarshal(bytes.NewReader([]byte(json)), &ref)
-			require.Error(t, err)
-
-			_, err = model.TraceIDFromString(testCase.in)
-			require.Error(t, err)
-		})
-	}
-	// for code coverage
-	var id model.TraceID
-	_, err := id.MarshalText()
-	require.ErrorContains(t, err, "unsupported method")
-	err = id.UnmarshalText(nil)
-	require.ErrorContains(t, err, "unsupported method")
-	_, err = id.MarshalTo(make([]byte, 1))
-	assert.ErrorContains(t, err, "buffer is too short")
-}
-
-var (
-	maxSpanID       = int64(-1)
-	testCasesSpanID = []struct {
-		id  uint64
-		hex string
-		b64 string
-	}{
-		{id: 1, hex: "0000000000000001", b64: "AAAAAAAAAAE="},
-		{id: 15, hex: "000000000000000f", b64: "AAAAAAAAAA8="},
-		{id: 31, hex: "000000000000001f", b64: "AAAAAAAAAB8="},
-		{id: 257, hex: "0000000000000101", b64: "AAAAAAAAAQE="},
-		{id: uint64(maxSpanID), hex: "ffffffffffffffff", b64: "//////////8="},
-	}
-)
-
-func TestSpanIDMarshalJSON(t *testing.T) {
-	for _, testCase := range testCasesSpanID {
-		expected := fmt.Sprintf(`{"traceId":"AAAAAAAAAAAAAAAAAAAAAA==","spanId":"%s"}`, testCase.b64)
-		t.Run(testCase.hex, func(t *testing.T) {
-			ref := model.SpanRef{SpanID: model.SpanID(testCase.id)}
-			out := new(bytes.Buffer)
-			err := new(jsonpb.Marshaler).Marshal(out, &ref)
-			require.NoError(t, err)
-			assert.Equal(t, expected, out.String())
-			assert.Equal(t, testCase.hex, ref.SpanID.String())
-
-			ref = model.SpanRef{}
-			err = jsonpb.Unmarshal(bytes.NewReader([]byte(expected)), &ref)
-			require.NoError(t, err)
-			assert.Equal(t, model.NewSpanID(testCase.id), ref.SpanID)
-			spanID, err := model.SpanIDFromString(testCase.hex)
-			require.NoError(t, err)
-			assert.Equal(t, model.NewSpanID(testCase.id), spanID)
-		})
-	}
-}
-
-func TestSpanIDUnmarshalJSONErrors(t *testing.T) {
-	testCases := []struct {
-		in  string
-		err bool
-	}{
-		{err: true, in: ""},
-		{err: true, in: "x"},
-		{err: true, in: "x123"},
-		{err: true, in: "10123456789abcdef"},
-	}
-	for _, testCase := range testCases {
-		in := fmt.Sprintf(`{"traceId":"0","spanId":"%s"}`, testCase.in)
-		t.Run(in, func(t *testing.T) {
-			var ref model.SpanRef
-			err := jsonpb.Unmarshal(bytes.NewReader([]byte(in)), &ref)
-			require.Error(t, err)
-
-			_, err = model.SpanIDFromString(testCase.in)
-			require.Error(t, err)
-		})
-	}
-	// for code coverage
-	var id model.SpanID
-	_, err := id.MarshalText()
-	require.ErrorContains(t, err, "unsupported method")
-	err = id.UnmarshalText(nil)
-	require.ErrorContains(t, err, "unsupported method")
-
-	err = id.UnmarshalJSONPB(nil, []byte(""))
-	require.ErrorContains(t, err, "invalid length for SpanID")
-	err = id.UnmarshalJSONPB(nil, []byte("123"))
-	assert.ErrorContains(t, err, "illegal base64 data")
-}
-
-func TestIsRPCClientServer(t *testing.T) {
-	span1 := &model.Span{
-		Tags: model.KeyValues{
-			model.String(model.SpanKindKey, "client"),
-		},
-	}
-	assert.True(t, span1.IsRPCClient())
-	assert.False(t, span1.IsRPCServer())
-	span2 := &model.Span{}
-	assert.False(t, span2.IsRPCClient())
-	assert.False(t, span2.IsRPCServer())
-}
-
-func TestGetSpanKind(t *testing.T) {
-	span := makeSpan(model.String("sampler.type", "lowerbound"))
-	spanKind, found := span.GetSpanKind()
-	assert.Equal(t, model.SpanKindUnspecified, spanKind)
-	assert.False(t, found)
-
-	span = makeSpan(model.SpanKindTag("client"))
-	spanKind, found = span.GetSpanKind()
-	assert.Equal(t, model.SpanKindClient, spanKind)
-	assert.True(t, found)
-}
-
-func TestSamplerType(t *testing.T) {
-	span := makeSpan(model.String("sampler.type", "lowerbound"))
-	assert.Equal(t, model.SamplerTypeLowerBound, span.GetSamplerType())
-	span = makeSpan(model.String("sampler.type", ""))
-	assert.Equal(t, model.SamplerTypeUnrecognized, span.GetSamplerType())
-	span = makeSpan(model.String("sampler.type", "probabilistic"))
-	assert.Equal(t, model.SamplerTypeProbabilistic, span.GetSamplerType())
-	span = makeSpan(model.KeyValue{})
-	assert.Equal(t, model.SamplerTypeUnrecognized, span.GetSamplerType())
-}
-
-func TestSpanHash(t *testing.T) {
-	kvs := model.KeyValues{
-		model.String("x", "y"),
-		model.String("x", "y"),
-		model.String("x", "z"),
-	}
-	spans := make([]*model.Span, len(kvs))
-	codes := make([]uint64, len(kvs))
-	// create 3 spans that are only different in some KeyValues
-	for i := range kvs {
-		spans[i] = makeSpan(kvs[i])
-		hc, err := model.HashCode(spans[i])
-		require.NoError(t, err)
-		codes[i] = hc
-	}
-	assert.Equal(t, codes[0], codes[1])
-	assert.NotEqual(t, codes[0], codes[2])
-}
-
-func TestParentSpanID(t *testing.T) {
-	span := makeSpan(model.String("k", "v"))
-	assert.Equal(t, model.NewSpanID(123), span.ParentSpanID())
-
-	span.References = []model.SpanRef{
-		model.NewFollowsFromRef(span.TraceID, model.NewSpanID(777)),
-	}
-	assert.Equal(t, model.NewSpanID(777), span.ParentSpanID())
-
-	span.References = []model.SpanRef{
-		model.NewFollowsFromRef(span.TraceID, model.NewSpanID(777)),
-		model.NewChildOfRef(span.TraceID, model.NewSpanID(888)),
-	}
-	assert.Equal(t, model.NewSpanID(888), span.ParentSpanID())
-
-	span.References = []model.SpanRef{
-		model.NewChildOfRef(model.NewTraceID(321, 0), model.NewSpanID(999)),
-	}
-	assert.Equal(t, model.NewSpanID(0), span.ParentSpanID())
-}
-
-func TestReplaceParentSpanID(t *testing.T) {
-	span := makeSpan(model.String("k", "v"))
-	assert.Equal(t, model.NewSpanID(123), span.ParentSpanID())
-
-	span.ReplaceParentID(789)
-	assert.Equal(t, model.NewSpanID(789), span.ParentSpanID())
-
-	span.References = []model.SpanRef{
-		model.NewChildOfRef(model.NewTraceID(321, 0), model.NewSpanID(999)),
-	}
-	span.ReplaceParentID(789)
-	assert.Equal(t, model.NewSpanID(789), span.ParentSpanID())
-}
-
-func makeSpan(someKV model.KeyValue) *model.Span {
-	traceID := model.NewTraceID(0, 123)
-	return &model.Span{
-		TraceID:       traceID,
-		SpanID:        model.NewSpanID(567),
-		OperationName: "hi",
-		References:    []model.SpanRef{model.NewChildOfRef(traceID, model.NewSpanID(123))},
-		StartTime:     time.Unix(0, 1000),
-		Duration:      5000,
-		Tags:          model.KeyValues{someKV},
-		Logs: []model.Log{
-			{
-				Timestamp: time.Unix(0, 1000),
-				Fields:    model.KeyValues{someKV},
-			},
-		},
-		Process: &model.Process{
-			ServiceName: "xyz",
-			Tags:        model.KeyValues{someKV},
-		},
-	}
-}
-
-// BenchmarkSpanHash-8   	   50000	     26977 ns/op	    2203 B/op	      68 allocs/op
-func BenchmarkSpanHash(b *testing.B) {
-	span := makeSpan(model.String("x", "y"))
-	buf := &bytes.Buffer{}
-	for i := 0; i < b.N; i++ {
-		buf.Reset()
-		span.Hash(buf)
-	}
-}
-
-func BenchmarkBatchSerialization(b *testing.B) {
-	batch := &model.Batch{
-		Spans: []*model.Span{
-			{
-				TraceID:       model.NewTraceID(154, 1879),
-				SpanID:        model.NewSpanID(66974),
-				OperationName: "test_op",
-				References: []model.SpanRef{
-					{
-						TraceID: model.NewTraceID(45, 12),
-						SpanID:  model.NewSpanID(789),
-						RefType: model.SpanRefType_CHILD_OF,
-					},
-				},
-				Flags:     0,
-				StartTime: time.Now(),
-				Duration:  time.Second,
-				Tags: []model.KeyValue{
-					model.String("foo", "bar"), model.Bool("haha", true),
-				},
-				Logs: []model.Log{
-					{
-						Timestamp: time.Now(),
-						Fields: []model.KeyValue{
-							model.String("foo", "bar"), model.Int64("bar", 156),
-						},
-					},
-				},
-				Process:   model.NewProcess("process1", []model.KeyValue{model.String("aaa", "bbb")}),
-				ProcessID: "156",
-			},
-		},
-		Process: nil,
-	}
-
-	b.Run("marshal", func(b *testing.B) {
-		for i := 0; i < b.N; i++ {
-			proto.Marshal(batch)
-		}
-	})
-
-	data, err := proto.Marshal(batch)
-	require.NoError(b, err)
-	b.Run("unmarshal", func(b *testing.B) {
-		for i := 0; i < b.N; i++ {
-			var batch2 model.Batch
-			proto.Unmarshal(data, &batch2)
-		}
-	})
-}
diff --git a/model/spanref_test.go b/model/spanref_test.go
deleted file mode 100644
index 8c8d17d3..00000000
--- a/model/spanref_test.go
+++ /dev/null
@@ -1,55 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model_test
-
-import (
-	"bytes"
-	"testing"
-
-	"github.com/gogo/protobuf/jsonpb"
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-func TestSpanRefTypeToFromJSON(t *testing.T) {
-	// base64(0x42, 16 bytes) == AAAAAAAAAAAAAAAAAAAAQg==
-	// base64(0x43, 8 bytes) == AAAAAAAAAEM=
-	// Verify: https://cryptii.com/pipes/base64-to-hex
-	sr := model.SpanRef{
-		TraceID: model.NewTraceID(0, 0x42),
-		SpanID:  model.NewSpanID(0x43),
-		RefType: model.FollowsFrom,
-	}
-	out := new(bytes.Buffer)
-	err := new(jsonpb.Marshaler).Marshal(out, &sr)
-	require.NoError(t, err)
-	assert.JSONEq(t, `{"traceId":"AAAAAAAAAAAAAAAAAAAAQg==","spanId":"AAAAAAAAAEM=","refType":"FOLLOWS_FROM"}`, out.String())
-	var sr2 model.SpanRef
-	require.NoError(t, jsonpb.Unmarshal(out, &sr2))
-	assert.Equal(t, sr, sr2)
-	var sr3 model.SpanRef
-	err = jsonpb.Unmarshal(bytes.NewReader([]byte(`{"refType":"BAD"}`)), &sr3)
-	assert.ErrorContains(t, err, "unknown value")
-}
-
-func TestMaybeAddParentSpanID(t *testing.T) {
-	span := makeSpan(model.String("k", "v"))
-	assert.Equal(t, model.NewSpanID(123), span.ParentSpanID())
-
-	span.References = model.MaybeAddParentSpanID(span.TraceID, model.NewSpanID(0), span.References)
-	assert.Equal(t, model.NewSpanID(123), span.ParentSpanID())
-
-	span.References = model.MaybeAddParentSpanID(span.TraceID, model.NewSpanID(123), span.References)
-	assert.Equal(t, model.NewSpanID(123), span.ParentSpanID())
-
-	span.References = model.MaybeAddParentSpanID(span.TraceID, model.NewSpanID(123), []model.SpanRef{})
-	assert.Equal(t, model.NewSpanID(123), span.ParentSpanID())
-
-	span.References = []model.SpanRef{model.NewChildOfRef(model.NewTraceID(42, 0), model.NewSpanID(789))}
-	span.References = model.MaybeAddParentSpanID(span.TraceID, model.NewSpanID(123), span.References)
-	assert.Equal(t, model.NewSpanID(123), span.References[0].SpanID, "parent added as first reference")
-}
diff --git a/model/time_test.go b/model/time_test.go
deleted file mode 100644
index 24598597..00000000
--- a/model/time_test.go
+++ /dev/null
@@ -1,31 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model_test
-
-import (
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-func TestTimeConversion(t *testing.T) {
-	s := model.TimeAsEpochMicroseconds(time.Unix(100, 2000))
-	assert.Equal(t, uint64(100000002), s)
-	assert.True(t, time.Unix(100, 2000).Equal(model.EpochMicrosecondsAsTime(s)))
-}
-
-func TestDurationConversion(t *testing.T) {
-	d := model.DurationAsMicroseconds(12345 * time.Microsecond)
-	assert.Equal(t, 12345*time.Microsecond, model.MicrosecondsAsDuration(d))
-	assert.Equal(t, uint64(12345), d)
-}
-
-func TestTimeZoneUTC(t *testing.T) {
-	ts := model.EpochMicrosecondsAsTime(10000100)
-	assert.Equal(t, time.UTC, ts.Location())
-}
diff --git a/model/trace_test.go b/model/trace_test.go
deleted file mode 100644
index e721ecaf..00000000
--- a/model/trace_test.go
+++ /dev/null
@@ -1,58 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package model_test
-
-import (
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-
-	"github.com/jaegertracing/jaeger-idl/model/v1"
-)
-
-func TestTraceFindSpanByID(t *testing.T) {
-	trace := &model.Trace{
-		Spans: []*model.Span{
-			{SpanID: model.NewSpanID(1), OperationName: "x"},
-			{SpanID: model.NewSpanID(2), OperationName: "y"},
-			{SpanID: model.NewSpanID(1), OperationName: "z"}, // same span ID
-		},
-	}
-	s1 := trace.FindSpanByID(model.NewSpanID(1))
-	assert.NotNil(t, s1)
-	assert.Equal(t, "x", s1.OperationName)
-	s2 := trace.FindSpanByID(model.NewSpanID(2))
-	assert.NotNil(t, s2)
-	assert.Equal(t, "y", s2.OperationName)
-	s3 := trace.FindSpanByID(model.NewSpanID(3))
-	assert.Nil(t, s3)
-}
-
-func TestTraceNormalizeTimestamps(t *testing.T) {
-	s1 := "2017-01-26T16:46:31.639875-05:00"
-	s2 := "2017-01-26T21:46:31.639875-04:00"
-	var tt1, tt2 time.Time
-	require.NoError(t, tt1.UnmarshalText([]byte(s1)))
-	require.NoError(t, tt2.UnmarshalText([]byte(s2)))
-
-	trace := &model.Trace{
-		Spans: []*model.Span{
-			{
-				StartTime: tt1,
-				Logs: []model.Log{
-					{
-						Timestamp: tt2,
-					},
-				},
-			},
-		},
-	}
-	trace.NormalizeTimestamps()
-	span := trace.Spans[0]
-	assert.Equal(t, span.StartTime, tt1.UTC())
-	assert.Equal(t, span.Logs[0].Timestamp, tt2.UTC())
-}
diff --git a/pkg/es/config/config_test.go b/pkg/es/config/config_test.go
index 944abef2..e06baa65 100644
--- a/pkg/es/config/config_test.go
+++ b/pkg/es/config/config_test.go
@@ -75,7 +75,7 @@ func TestNewClient(t *testing.T) {
 	const (
 		pwd1       = "password"
 		token      = "token"
-		serverCert = "../../config/tlscfg/testdata/example-server-cert.pem"
+		serverCert = "../../../internal/config/tlscfg/testdata/example-server-cert.pem"
 	)
 	pwdFile := filepath.Join(t.TempDir(), "pwd")
 	require.NoError(t, os.WriteFile(pwdFile, []byte(pwd1), 0o600))
diff --git a/pkg/kafka/auth/config_test.go b/pkg/kafka/auth/config_test.go
index d9e2e575..59f4b1e0 100644
--- a/pkg/kafka/auth/config_test.go
+++ b/pkg/kafka/auth/config_test.go
@@ -15,7 +15,7 @@ import (
 	"go.uber.org/zap"
 	"go.uber.org/zap/zaptest"
 
-	"github.com/jaegertracing/jaeger/pkg/config"
+	"github.com/jaegertracing/jaeger/internal/config"
 )
 
 func addFlags(flags *flag.FlagSet) {
diff --git a/pkg/normalizer/service_name_test.go b/pkg/normalizer/service_name_test.go
deleted file mode 100644
index 63e8e2bc..00000000
--- a/pkg/normalizer/service_name_test.go
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2019 The Jaeger Authors.
-// Copyright (c) 2017 Uber Technologies, Inc.
-// SPDX-License-Identifier: Apache-2.0
-
-package normalizer
-
-import (
-	"testing"
-
-	"github.com/stretchr/testify/assert"
-
-	"github.com/jaegertracing/jaeger/internal/testutils"
-)
-
-func TestServiceNameReplacer(t *testing.T) {
-	assert.Equal(t, "abc", ServiceName("ABC"), "lower case conversion")
-	assert.Equal(t, "a_b_c__", ServiceName("a&b%c/:"), "disallowed runes to underscore")
-	assert.Equal(t, "a_z_0123456789.", ServiceName("A_Z_0123456789."), "allowed runes")
-}
-
-func TestMain(m *testing.M) {
-	testutils.VerifyGoLeaks(m)
-}
diff --git a/pkg/telemetry/settings_test.go b/pkg/telemetry/settings_test.go
index ddd560ea..033eced6 100644
--- a/pkg/telemetry/settings_test.go
+++ b/pkg/telemetry/settings_test.go
@@ -15,8 +15,8 @@ import (
 	nooptrace "go.opentelemetry.io/otel/trace/noop"
 	"go.uber.org/zap"
 
+	"github.com/jaegertracing/jaeger/internal/healthcheck"
 	"github.com/jaegertracing/jaeger/internal/testutils"
-	"github.com/jaegertracing/jaeger/pkg/healthcheck"
 	"github.com/jaegertracing/jaeger/pkg/telemetry"
 )