Repository: open-telemetry/opentelemetry-operator
Pull request #3633 (2025-01-20 00:52:09)

[chore] move controllers under internal
**Description:**
Move controllers under internal so their API is not exported.

swiatekm: This placement of `controllers` is a kubebuilder standard. I'm not sure how much that matters to us at this point, but it would certainly make the migration to kubebuilder v4 more difficult. WDYT @open-telemetry/operator-approvers ?
atoulme: I don't see an issue for moving to kubebuilder 4, is it ok to open one? Is anyone working on it?
frzifus: I dont see a huge downside of exposing it or benefit of moving it into internal here. Thats why I would prefer to  just follow whatever kubebuilder standard is.
atoulme: The problem is that you're currently exposing incomplete APIs. It is possible other downstream projects may start to depend on it and bind you to a specific go API, which doesn't seem to be the intent of this project. See 
https://pkg.go.dev/github.com/open-telemetry/opentelemetry-operator@v0.116.0/controllers
swiatekm: It used to be at top level in v2: https://book-v2.book.kubebuilder.io/cronjob-tutorial/controller-implementation.

I guess if it's under internal in subsequent versions, then moving it right now won't really make the migration any more difficult.
atoulme: Rebased.
atoulme: Rebased.

Patch:
diff --git a/.chloggen/fix_ta-cmdline-values.yaml b/.chloggen/fix_ta-cmdline-values.yaml
new file mode 100755
index 00000000..9734ece9
--- /dev/null
+++ b/.chloggen/fix_ta-cmdline-values.yaml
@@ -0,0 +1,16 @@
+# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
+change_type: bug_fix
+
+# The name of the component, or a single word describing the area of concern, (e.g. collector, target allocator, auto-instrumentation, opamp, github action)
+component: target allocator
+
+# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
+note: Fix config loading priority
+
+# One or more tracking issues related to the change
+issues: [3928]
+
+# (Optional) One or more lines of additional information to render under the primary note.
+# These lines will be padded with 2 spaces and then inserted directly into the document.
+# Use pipe (|) for multiline entries.
+subtext:
\ No newline at end of file
diff --git a/.github/workflows/continuous-integration.yaml b/.github/workflows/continuous-integration.yaml
index 64a2c01c..29f30293 100644
--- a/.github/workflows/continuous-integration.yaml
+++ b/.github/workflows/continuous-integration.yaml
@@ -82,15 +82,15 @@ jobs:
         go-version: "~1.24.2"
 
     - name: Initialize CodeQL
-      uses: github/codeql-action/init@28deaeda66b76a05916b6923827895f2b14ab387 # v3.28.16
+      uses: github/codeql-action/init@60168efe1c415ce0f5521ea06d5c2062adbeed1b # v3.28.17
       with:
         languages: go
 
     - name: Autobuild
-      uses: github/codeql-action/autobuild@28deaeda66b76a05916b6923827895f2b14ab387 # v3.28.16
+      uses: github/codeql-action/autobuild@60168efe1c415ce0f5521ea06d5c2062adbeed1b # v3.28.17
 
     - name: Perform CodeQL Analysis
-      uses: github/codeql-action/analyze@28deaeda66b76a05916b6923827895f2b14ab387 # v3.28.16
+      uses: github/codeql-action/analyze@60168efe1c415ce0f5521ea06d5c2062adbeed1b # v3.28.17
 
     - name: Govulncheck
       uses: golang/govulncheck-action@b625fbe08f3bccbe446d94fbf87fcc875a4f50ee # v1.0.4
diff --git a/.github/workflows/ossf-scorecard.yml b/.github/workflows/ossf-scorecard.yml
index 45677ee4..6de662ec 100644
--- a/.github/workflows/ossf-scorecard.yml
+++ b/.github/workflows/ossf-scorecard.yml
@@ -42,6 +42,6 @@ jobs:
       # Upload the results to GitHub's code scanning dashboard (optional).
       # Commenting out will disable upload of results to your repo's Code Scanning dashboard
       - name: "Upload to code-scanning"
-        uses: github/codeql-action/upload-sarif@28deaeda66b76a05916b6923827895f2b14ab387 # v3.28.16
+        uses: github/codeql-action/upload-sarif@60168efe1c415ce0f5521ea06d5c2062adbeed1b # v3.28.17
         with:
           sarif_file: results.sarif
diff --git a/Makefile b/Makefile
index 59741a6b..7a59b5ad 100644
--- a/Makefile
+++ b/Makefile
@@ -506,7 +506,7 @@ KUSTOMIZE_VERSION ?= v5.6.0
 # renovate: datasource=go depName=sigs.k8s.io/controller-tools/cmd/controller-gen
 CONTROLLER_TOOLS_VERSION ?= v0.17.1
 # renovate: datasource=github-releases depName=golangci/golangci-lint
-GOLANGCI_LINT_VERSION ?= v2.1.5
+GOLANGCI_LINT_VERSION ?= v2.1.6
 # renovate: datasource=go depName=sigs.k8s.io/kind
 KIND_VERSION ?= v0.27.0
 # renovate: datasource=go depName=github.com/kyverno/chainsaw
diff --git a/cmd/otel-allocator/internal/config/config.go b/cmd/otel-allocator/internal/config/config.go
index f118fc33..bc51a1d6 100644
--- a/cmd/otel-allocator/internal/config/config.go
+++ b/cmd/otel-allocator/internal/config/config.go
@@ -12,6 +12,7 @@ import (
 	"log/slog"
 	"math"
 	"os"
+	"path/filepath"
 	"reflect"
 	"time"
 
@@ -26,12 +27,15 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 	"k8s.io/client-go/rest"
 	"k8s.io/client-go/tools/clientcmd"
+	"k8s.io/client-go/util/homedir"
 	"k8s.io/klog/v2"
 	ctrl "sigs.k8s.io/controller-runtime"
 	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 )
 
 const (
+	DefaultListenAddr                                  = ":8080"
+	DefaultHttpsListenAddr                             = ":8443"
 	DefaultResyncTime                                  = 5 * time.Minute
 	DefaultConfigFilePath               string         = "/conf/targetallocator.yaml"
 	DefaultCRScrapeInterval             model.Duration = model.Duration(time.Second * 30)
@@ -40,6 +44,10 @@ const (
 	DefaultCollectorNotReadyGracePeriod                = 0 * time.Second
 )
 
+var (
+	DefaultKubeConfigFilePath string = filepath.Join(homedir.HomeDir(), ".kube", "config")
+)
+
 // By default, scrape protocols include PrometheusText1_0_0, which only Prometheus >=3.0 supports.
 // Manually exclude this protocol until several versions of the Otel Collector support it.
 var DefaultScrapeProtocols = []promconfig.ScrapeProtocol{
@@ -227,9 +235,10 @@ func LoadFromCLI(target *Config, flagSet *pflag.FlagSet) error {
 	klog.SetLogger(target.RootLogger)
 	ctrl.SetLogger(target.RootLogger)
 
-	target.KubeConfigFilePath, err = getKubeConfigFilePath(flagSet)
-	if err != nil {
-		return err
+	if kubeConfigFilePath, changed, flagErr := getKubeConfigFilePath(flagSet); flagErr != nil {
+		return flagErr
+	} else if changed {
+		target.KubeConfigFilePath = kubeConfigFilePath
 	}
 	clusterConfig, err := clientcmd.BuildConfigFromFlags("", target.KubeConfigFilePath)
 	if err != nil {
@@ -245,9 +254,10 @@ func LoadFromCLI(target *Config, flagSet *pflag.FlagSet) error {
 	}
 	target.ClusterConfig = clusterConfig
 
-	target.ListenAddr, err = getListenAddr(flagSet)
-	if err != nil {
-		return err
+	if listenAddr, changed, flagErr := getListenAddr(flagSet); flagErr != nil {
+		return flagErr
+	} else if changed {
+		target.ListenAddr = listenAddr
 	}
 
 	if prometheusCREnabled, changed, flagErr := getPrometheusCREnabled(flagSet); flagErr != nil {
@@ -335,6 +345,11 @@ func unmarshal(cfg *Config, configFile string) error {
 
 func CreateDefaultConfig() Config {
 	return Config{
+		ListenAddr:         DefaultListenAddr,
+		KubeConfigFilePath: DefaultKubeConfigFilePath,
+		HTTPS: HTTPSServerConfig{
+			ListenAddr: DefaultHttpsListenAddr,
+		},
 		AllocationStrategy:         DefaultAllocationStrategy,
 		AllocationFallbackStrategy: "",
 		FilterStrategy:             DefaultFilterStrategy,
@@ -349,11 +364,11 @@ func CreateDefaultConfig() Config {
 	}
 }
 
-func Load() (*Config, error) {
+func Load(args []string) (*Config, error) {
 	var err error
 
 	flagSet := getFlagSet(pflag.ExitOnError)
-	err = flagSet.Parse(os.Args)
+	err = flagSet.Parse(args)
 	if err != nil {
 		return nil, err
 	}
diff --git a/cmd/otel-allocator/internal/config/flags.go b/cmd/otel-allocator/internal/config/flags.go
index 5c812e8f..ae156ff8 100644
--- a/cmd/otel-allocator/internal/config/flags.go
+++ b/cmd/otel-allocator/internal/config/flags.go
@@ -5,10 +5,8 @@ package config
 
 import (
 	"flag"
-	"path/filepath"
 
 	"github.com/spf13/pflag"
-	"k8s.io/client-go/util/homedir"
 	"sigs.k8s.io/controller-runtime/pkg/log/zap"
 )
 
@@ -32,11 +30,11 @@ var zapCmdLineOpts zap.Options
 func getFlagSet(errorHandling pflag.ErrorHandling) *pflag.FlagSet {
 	flagSet := pflag.NewFlagSet(targetAllocatorName, errorHandling)
 	flagSet.String(configFilePathFlagName, DefaultConfigFilePath, "The path to the config file.")
-	flagSet.String(listenAddrFlagName, ":8080", "The address where this service serves.")
+	flagSet.String(listenAddrFlagName, DefaultListenAddr, "The address where this service serves.")
 	flagSet.Bool(prometheusCREnabledFlagName, false, "Enable Prometheus CRs as target sources")
-	flagSet.String(kubeConfigPathFlagName, filepath.Join(homedir.HomeDir(), ".kube", "config"), "absolute path to the KubeconfigPath file")
+	flagSet.String(kubeConfigPathFlagName, DefaultKubeConfigFilePath, "absolute path to the KubeconfigPath file")
 	flagSet.Bool(httpsEnabledFlagName, false, "Enable HTTPS additional server")
-	flagSet.String(listenAddrHttpsFlagName, ":8443", "The address where this service serves over HTTPS.")
+	flagSet.String(listenAddrHttpsFlagName, DefaultHttpsListenAddr, "The address where this service serves over HTTPS.")
 	flagSet.String(httpsCAFilePathFlagName, "", "The path to the HTTPS server TLS CA file.")
 	flagSet.String(httpsTLSCertFilePathFlagName, "", "The path to the HTTPS server TLS certificate file.")
 	flagSet.String(httpsTLSKeyFilePathFlagName, "", "The path to the HTTPS server TLS key file.")
@@ -50,64 +48,54 @@ func getConfigFilePath(flagSet *pflag.FlagSet) (string, error) {
 	return flagSet.GetString(configFilePathFlagName)
 }
 
-func getKubeConfigFilePath(flagSet *pflag.FlagSet) (string, error) {
-	return flagSet.GetString(kubeConfigPathFlagName)
+func getKubeConfigFilePath(flagSet *pflag.FlagSet) (value string, changed bool, err error) {
+	return getFlagValueAndChangedString(flagSet, kubeConfigPathFlagName)
 }
 
-func getListenAddr(flagSet *pflag.FlagSet) (string, error) {
-	return flagSet.GetString(listenAddrFlagName)
+func getListenAddr(flagSet *pflag.FlagSet) (value string, changed bool, err error) {
+	return getFlagValueAndChangedString(flagSet, listenAddrFlagName)
 }
 
 func getPrometheusCREnabled(flagSet *pflag.FlagSet) (value bool, changed bool, err error) {
-	if changed = flagSet.Changed(prometheusCREnabledFlagName); !changed {
-		value, err = false, nil
-		return
-	}
-	value, err = flagSet.GetBool(prometheusCREnabledFlagName)
-	return
+	return getFlagValueAndChangedBool(flagSet, prometheusCREnabledFlagName)
 }
 
 func getHttpsListenAddr(flagSet *pflag.FlagSet) (value string, changed bool, err error) {
-	if changed = flagSet.Changed(listenAddrHttpsFlagName); !changed {
-		value, err = ":8443", nil
-		return
-	}
-	value, err = flagSet.GetString(listenAddrHttpsFlagName)
-	return
+	return getFlagValueAndChangedString(flagSet, listenAddrHttpsFlagName)
 }
 
 func getHttpsEnabled(flagSet *pflag.FlagSet) (value bool, changed bool, err error) {
-	if changed = flagSet.Changed(httpsEnabledFlagName); !changed {
-		value, err = false, nil
-		return
-	}
-	value, err = flagSet.GetBool(httpsEnabledFlagName)
-	return
+	return getFlagValueAndChangedBool(flagSet, httpsEnabledFlagName)
 }
 
 func getHttpsCAFilePath(flagSet *pflag.FlagSet) (value string, changed bool, err error) {
-	if changed = flagSet.Changed(httpsCAFilePathFlagName); !changed {
-		value, err = "", nil
-		return
-	}
-	value, err = flagSet.GetString(httpsCAFilePathFlagName)
-	return
+	return getFlagValueAndChangedString(flagSet, httpsCAFilePathFlagName)
 }
 
 func getHttpsTLSCertFilePath(flagSet *pflag.FlagSet) (value string, changed bool, err error) {
-	if changed = flagSet.Changed(httpsTLSCertFilePathFlagName); !changed {
+	return getFlagValueAndChangedString(flagSet, httpsTLSCertFilePathFlagName)
+}
+
+func getHttpsTLSKeyFilePath(flagSet *pflag.FlagSet) (value string, changed bool, err error) {
+	return getFlagValueAndChangedString(flagSet, httpsTLSKeyFilePathFlagName)
+}
+
+// getFlagValueAndChanged returns the given flag's string value and whether it was changed.
+func getFlagValueAndChangedString(flagSet *pflag.FlagSet, flagName string) (value string, changed bool, err error) {
+	if changed = flagSet.Changed(flagName); !changed {
 		value, err = "", nil
 		return
 	}
-	value, err = flagSet.GetString(httpsTLSCertFilePathFlagName)
+	value, err = flagSet.GetString(flagName)
 	return
 }
 
-func getHttpsTLSKeyFilePath(flagSet *pflag.FlagSet) (value string, changed bool, err error) {
-	if changed = flagSet.Changed(httpsTLSKeyFilePathFlagName); !changed {
-		value, err = "", nil
+// getFlagValueAndChanged returns the given flag's string value and whether it was changed.
+func getFlagValueAndChangedBool(flagSet *pflag.FlagSet, flagName string) (value bool, changed bool, err error) {
+	if changed = flagSet.Changed(flagName); !changed {
+		value, err = false, nil
 		return
 	}
-	value, err = flagSet.GetString(httpsTLSKeyFilePathFlagName)
+	value, err = flagSet.GetBool(flagName)
 	return
 }
diff --git a/cmd/otel-allocator/main.go b/cmd/otel-allocator/main.go
index 1b387585..6035080f 100644
--- a/cmd/otel-allocator/main.go
+++ b/cmd/otel-allocator/main.go
@@ -52,7 +52,7 @@ func main() {
 		interrupts      = make(chan os.Signal, 1)
 		errChan         = make(chan error)
 	)
-	cfg, err := config.Load()
+	cfg, err := config.Load(os.Args)
 	if err != nil {
 		fmt.Printf("Failed to load config: %v", err)
 		os.Exit(1)
diff --git a/go.mod b/go.mod
index e0e36b3a..09cb4edd 100644
--- a/go.mod
+++ b/go.mod
@@ -34,7 +34,7 @@ require (
 	github.com/shirou/gopsutil v3.21.11+incompatible
 	github.com/spf13/pflag v1.0.6
 	github.com/stretchr/testify v1.10.0
-	go.opentelemetry.io/collector/featuregate v1.30.0
+	go.opentelemetry.io/collector/featuregate v1.31.0
 	go.opentelemetry.io/otel v1.35.0
 	go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.35.0
 	go.opentelemetry.io/otel/exporters/prometheus v0.57.0
diff --git a/go.sum b/go.sum
index 37002e8b..dd98468e 100644
--- a/go.sum
+++ b/go.sum
@@ -533,8 +533,8 @@ go.mongodb.org/mongo-driver v1.17.2 h1:gvZyk8352qSfzyZ2UMWcpDpMSGEr1eqE4T793Sqyh
 go.mongodb.org/mongo-driver v1.17.2/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ=
 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/featuregate v1.30.0 h1:mx7+iP/FQnY7KO8qw/xE3Qd1MQkWcU8VgcqLNrJ8EU8=
-go.opentelemetry.io/collector/featuregate v1.30.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc=
+go.opentelemetry.io/collector/featuregate v1.31.0 h1:20q7plPQZwmAiaYAa6l1m/i2qDITZuWlhjr4EkmeQls=
+go.opentelemetry.io/collector/featuregate v1.31.0/go.mod h1:Y/KsHbvREENKvvN9RlpiWk/IGBK+CATBYzIIpU7nccc=
 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0 h1:sbiXRNDSWJOTobXh5HyQKjq6wUC5tNybqjIqDpAY4CU=
 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.60.0/go.mod h1:69uWxva0WgAA/4bu2Yy70SLDBwZXuQ6PbBpbsa5iZrQ=
 go.opentelemetry.io/contrib/otelconf v0.15.0 h1:BLNiIUsrNcqhSKpsa6CnhE6LdrpY1A8X0szMVsu99eo=
diff --git a/internal/autodetect/main.go b/internal/autodetect/main.go
index 60e6cc55..adc9770b 100644
--- a/internal/autodetect/main.go
+++ b/internal/autodetect/main.go
@@ -150,7 +150,7 @@ func (a *autoDetect) CertManagerAvailability(ctx context.Context) (certmanager.A
 	return certmanager.Available, nil
 }
 
-// TargetAllocatorAvailability checks if OpenShift Route are available.
+// TargetAllocatorAvailability checks if TargetAllocator CR are available.
 func (a *autoDetect) TargetAllocatorAvailability() (targetallocator.Availability, error) {
 	apiList, err := a.dcl.ServerGroups()
 	if err != nil {
diff --git a/internal/autodetect/targetallocator/operator.go b/internal/autodetect/targetallocator/operator.go
index 5990ccd3..3a511dc4 100644
--- a/internal/autodetect/targetallocator/operator.go
+++ b/internal/autodetect/targetallocator/operator.go
@@ -7,7 +7,7 @@ package targetallocator
 type Availability int
 
 const (
-	// NotAvailable TargetAllocator CR is available in the cluster.
+	// NotAvailable TargetAllocator CR is not available in the cluster.
 	NotAvailable Availability = iota
 
 	// Available TargetAllocator CR is available in the cluster.
diff --git a/controllers/targetallocator_reconciler_test.go b/internal/controllers/targetallocator_reconciler_test.go
similarity index 100%
rename from controllers/targetallocator_reconciler_test.go
rename to internal/controllers/targetallocator_reconciler_test.go
diff --git a/controllers/testdata/ingress_testdata.yaml b/internal/controllers/testdata/ingress_testdata.yaml
similarity index 100%
rename from controllers/testdata/ingress_testdata.yaml
rename to internal/controllers/testdata/ingress_testdata.yaml
diff --git a/controllers/testdata/otlp_test.yaml b/internal/controllers/testdata/otlp_test.yaml
similarity index 100%
rename from controllers/testdata/otlp_test.yaml
rename to internal/controllers/testdata/otlp_test.yaml
diff --git a/controllers/testdata/test.yaml b/internal/controllers/testdata/test.yaml
similarity index 100%
rename from controllers/testdata/test.yaml
rename to internal/controllers/testdata/test.yaml
diff --git a/controllers/testdata/test_ta_update.yaml b/internal/controllers/testdata/test_ta_update.yaml
similarity index 100%
rename from controllers/testdata/test_ta_update.yaml
rename to internal/controllers/testdata/test_ta_update.yaml
diff --git a/main.go b/main.go
index abd92128..87befab1 100644
--- a/main.go
+++ b/main.go
@@ -37,13 +37,13 @@ import (
 
 	otelv1alpha1 "github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
 	otelv1beta1 "github.com/open-telemetry/opentelemetry-operator/apis/v1beta1"
-	"github.com/open-telemetry/opentelemetry-operator/controllers"
 	"github.com/open-telemetry/opentelemetry-operator/internal/autodetect"
 	"github.com/open-telemetry/opentelemetry-operator/internal/autodetect/certmanager"
 	"github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift"
 	"github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus"
 	"github.com/open-telemetry/opentelemetry-operator/internal/autodetect/targetallocator"
 	"github.com/open-telemetry/opentelemetry-operator/internal/config"
+	"github.com/open-telemetry/opentelemetry-operator/internal/controllers"
 	"github.com/open-telemetry/opentelemetry-operator/internal/fips"
 	collectorManifests "github.com/open-telemetry/opentelemetry-operator/internal/manifests/collector"
 	openshiftDashboards "github.com/open-telemetry/opentelemetry-operator/internal/openshift/dashboards"


Test patch:
diff --git a/cmd/otel-allocator/internal/config/config_test.go b/cmd/otel-allocator/internal/config/config_test.go
index 9df390f4..7593681e 100644
--- a/cmd/otel-allocator/internal/config/config_test.go
+++ b/cmd/otel-allocator/internal/config/config_test.go
@@ -6,6 +6,7 @@ package config
 import (
 	"fmt"
 	"os"
+	"path/filepath"
 	"testing"
 	"time"
 
@@ -20,7 +21,7 @@ import (
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
 )
 
-func TestLoad(t *testing.T) {
+func TestLoadFromFile(t *testing.T) {
 	type args struct {
 		file string
 	}
@@ -36,6 +37,8 @@ func TestLoad(t *testing.T) {
 				file: "./testdata/config_test.yaml",
 			},
 			want: Config{
+				ListenAddr:         DefaultListenAddr,
+				KubeConfigFilePath: DefaultKubeConfigFilePath,
 				AllocationStrategy: DefaultAllocationStrategy,
 				CollectorNamespace: "default",
 				CollectorSelector: &metav1.LabelSelector{
@@ -122,6 +125,8 @@ func TestLoad(t *testing.T) {
 				file: "./testdata/pod_service_selector_test.yaml",
 			},
 			want: Config{
+				ListenAddr:         DefaultListenAddr,
+				KubeConfigFilePath: DefaultKubeConfigFilePath,
 				AllocationStrategy: DefaultAllocationStrategy,
 				CollectorNamespace: "default",
 				CollectorSelector: &metav1.LabelSelector{
@@ -148,6 +153,9 @@ func TestLoad(t *testing.T) {
 					ProbeNamespaceSelector:          &metav1.LabelSelector{},
 					ScrapeInterval:                  DefaultCRScrapeInterval,
 				},
+				HTTPS: HTTPSServerConfig{
+					ListenAddr: ":8443",
+				},
 				PromConfig: &promconfig.Config{
 					GlobalConfig: promconfig.GlobalConfig{
 						ScrapeInterval:     model.Duration(60 * time.Second),
@@ -197,6 +205,8 @@ func TestLoad(t *testing.T) {
 				file: "./testdata/pod_service_selector_camelcase_test.yaml",
 			},
 			want: Config{
+				ListenAddr:         DefaultListenAddr,
+				KubeConfigFilePath: DefaultKubeConfigFilePath,
 				AllocationStrategy: DefaultAllocationStrategy,
 				CollectorNamespace: "default",
 				CollectorSelector: &metav1.LabelSelector{
@@ -223,6 +233,9 @@ func TestLoad(t *testing.T) {
 					ProbeNamespaceSelector:          &metav1.LabelSelector{},
 					ScrapeInterval:                  DefaultCRScrapeInterval,
 				},
+				HTTPS: HTTPSServerConfig{
+					ListenAddr: ":8443",
+				},
 				PromConfig: &promconfig.Config{
 					GlobalConfig: promconfig.GlobalConfig{
 						ScrapeInterval:     model.Duration(60 * time.Second),
@@ -272,6 +285,8 @@ func TestLoad(t *testing.T) {
 				file: "./testdata/pod_service_selector_expressions_test.yaml",
 			},
 			want: Config{
+				ListenAddr:         DefaultListenAddr,
+				KubeConfigFilePath: DefaultKubeConfigFilePath,
 				AllocationStrategy: DefaultAllocationStrategy,
 				CollectorNamespace: "default",
 				CollectorSelector: &metav1.LabelSelector{
@@ -322,6 +337,9 @@ func TestLoad(t *testing.T) {
 					ProbeNamespaceSelector:          &metav1.LabelSelector{},
 					ScrapeInterval:                  DefaultCRScrapeInterval,
 				},
+				HTTPS: HTTPSServerConfig{
+					ListenAddr: ":8443",
+				},
 				PromConfig: &promconfig.Config{
 					GlobalConfig: promconfig.GlobalConfig{
 						ScrapeInterval:     model.Duration(60 * time.Second),
@@ -371,6 +389,8 @@ func TestLoad(t *testing.T) {
 				file: "./testdata/pod_service_selector_camelcase_expressions_test.yaml",
 			},
 			want: Config{
+				ListenAddr:         DefaultListenAddr,
+				KubeConfigFilePath: DefaultKubeConfigFilePath,
 				AllocationStrategy: DefaultAllocationStrategy,
 				CollectorNamespace: "default",
 				CollectorSelector: &metav1.LabelSelector{
@@ -421,6 +441,9 @@ func TestLoad(t *testing.T) {
 					ProbeNamespaceSelector:          &metav1.LabelSelector{},
 					ScrapeInterval:                  DefaultCRScrapeInterval,
 				},
+				HTTPS: HTTPSServerConfig{
+					ListenAddr: ":8443",
+				},
 				PromConfig: &promconfig.Config{
 					GlobalConfig: promconfig.GlobalConfig{
 						ScrapeInterval:     model.Duration(60 * time.Second),
@@ -599,3 +622,259 @@ func TestGetAllowDenyLists(t *testing.T) {
 		})
 	}
 }
+
+func TestConfigLoadPriority(t *testing.T) {
+	// Helper function to create a dummy kube config for tests
+	createDummyKubeConfig := func(t *testing.T, dir string) string {
+		kubeConfigPath := filepath.Join(dir, "kube.config")
+		kubeConfigContent := `
+apiVersion: v1
+kind: Config
+clusters:
+- cluster:
+    server: https://example.com
+  name: test-cluster
+contexts:
+- context:
+    cluster: test-cluster
+    user: test-user
+  name: test-context
+current-context: test-context
+users:
+- name: test-user
+  user:
+    token: dummy-token
+`
+		err := os.WriteFile(kubeConfigPath, []byte(kubeConfigContent), 0600)
+		require.NoError(t, err)
+		return kubeConfigPath
+	}
+
+	t.Run("default values when nothing is set", func(t *testing.T) {
+		// Setup: create empty config file and dummy kube config
+		tempDir := t.TempDir()
+		emptyConfigPath := filepath.Join(tempDir, "empty.yaml")
+		err := os.WriteFile(emptyConfigPath, []byte("{}"), 0600)
+		require.NoError(t, err)
+
+		kubeConfigPath := createDummyKubeConfig(t, tempDir)
+
+		// Prepare args for Load function
+		args := []string{
+			"--" + configFilePathFlagName + "=" + emptyConfigPath,
+			"--" + kubeConfigPathFlagName + "=" + kubeConfigPath,
+		}
+
+		// Load config using the full Load function
+		config, err := Load(args)
+		require.NoError(t, err)
+
+		// Assert defaults are used
+		assert.Equal(t, DefaultListenAddr, config.ListenAddr)
+		assert.Equal(t, kubeConfigPath, config.KubeConfigFilePath)
+		assert.Equal(t, DefaultHttpsListenAddr, config.HTTPS.ListenAddr)
+		assert.Equal(t, DefaultAllocationStrategy, config.AllocationStrategy)
+		assert.Equal(t, DefaultFilterStrategy, config.FilterStrategy)
+		assert.False(t, config.PrometheusCR.Enabled)
+		assert.False(t, config.HTTPS.Enabled)
+	})
+
+	t.Run("command-line has priority over config file for boolean values", func(t *testing.T) {
+		// Setup: create config file with values and dummy kube config
+		tempDir := t.TempDir()
+		configContent := `
+prometheus_cr:
+  enabled: false
+https:
+  enabled: false
+`
+		configPath := filepath.Join(tempDir, "config.yaml")
+		err := os.WriteFile(configPath, []byte(configContent), 0600)
+		require.NoError(t, err)
+
+		kubeConfigPath := createDummyKubeConfig(t, tempDir)
+
+		// Prepare args for Load function that override config file
+		args := []string{
+			"--" + configFilePathFlagName + "=" + configPath,
+			"--" + prometheusCREnabledFlagName + "=true",
+			"--" + httpsEnabledFlagName + "=true",
+			"--" + kubeConfigPathFlagName + "=" + kubeConfigPath,
+		}
+
+		// Load config using the full Load function
+		config, err := Load(args)
+		require.NoError(t, err)
+
+		// Assert CLI values override config file
+		assert.True(t, config.PrometheusCR.Enabled, "CLI should override config file for prometheus CR enabled")
+		assert.True(t, config.HTTPS.Enabled, "CLI should override config file for HTTPS enabled")
+	})
+
+	t.Run("command-line has priority over config file for string values", func(t *testing.T) {
+		// Setup: create config file with values and dummy kube config
+		tempDir := t.TempDir()
+		configContent := `
+listen_addr: ":9090"
+https:
+  listen_addr: ":9443"
+  ca_file_path: "/config/ca.pem"
+  tls_cert_file_path: "/config/cert.pem"
+  tls_key_file_path: "/config/key.pem"
+kube_config_file_path: "/config/kube.config"
+`
+		configPath := filepath.Join(tempDir, "config.yaml")
+		err := os.WriteFile(configPath, []byte(configContent), 0600)
+		require.NoError(t, err)
+
+		kubeConfigPath := createDummyKubeConfig(t, tempDir)
+
+		// CLI values different from config file
+		cliListenAddr := ":8888"
+		cliHttpsListenAddr := ":8443"
+		cliCAPath := "/cli/ca.pem"
+		cliCertPath := "/cli/cert.pem"
+		cliKeyPath := "/cli/key.pem"
+
+		// Prepare args for Load function that override config file
+		args := []string{
+			"--" + configFilePathFlagName + "=" + configPath,
+			"--" + listenAddrFlagName + "=" + cliListenAddr,
+			"--" + listenAddrHttpsFlagName + "=" + cliHttpsListenAddr,
+			"--" + httpsCAFilePathFlagName + "=" + cliCAPath,
+			"--" + httpsTLSCertFilePathFlagName + "=" + cliCertPath,
+			"--" + httpsTLSKeyFilePathFlagName + "=" + cliKeyPath,
+			"--" + kubeConfigPathFlagName + "=" + kubeConfigPath,
+		}
+
+		// Load config using the full Load function
+		config, err := Load(args)
+		require.NoError(t, err)
+
+		// Assert CLI values override config file
+		assert.Equal(t, cliListenAddr, config.ListenAddr, "CLI should override config file for listen address")
+		assert.Equal(t, cliHttpsListenAddr, config.HTTPS.ListenAddr, "CLI should override config file for HTTPS listen address")
+		assert.Equal(t, cliCAPath, config.HTTPS.CAFilePath, "CLI should override config file for CA file path")
+		assert.Equal(t, cliCertPath, config.HTTPS.TLSCertFilePath, "CLI should override config file for TLS cert file path")
+		assert.Equal(t, cliKeyPath, config.HTTPS.TLSKeyFilePath, "CLI should override config file for TLS key file path")
+		assert.Equal(t, kubeConfigPath, config.KubeConfigFilePath, "CLI should override config file for kube config path")
+	})
+
+	t.Run("config file overrides defaults when CLI not specified", func(t *testing.T) {
+		// Setup: create config file with values and dummy kube config
+		tempDir := t.TempDir()
+		configListenAddr := ":7070"
+		kubeConfigPath := createDummyKubeConfig(t, tempDir)
+
+		configContent := `
+listen_addr: "` + configListenAddr + `"
+prometheus_cr:
+  enabled: true
+https:
+  enabled: true
+  listen_addr: ":7443"
+kube_config_file_path: "` + kubeConfigPath + `"
+`
+		configPath := filepath.Join(tempDir, "config.yaml")
+		err := os.WriteFile(configPath, []byte(configContent), 0600)
+		require.NoError(t, err)
+
+		// Prepare args for Load function with only config file path
+		args := []string{
+			"--" + configFilePathFlagName + "=" + configPath,
+		}
+
+		// Load config using the full Load function
+		config, err := Load(args)
+		require.NoError(t, err)
+
+		// Assert config file values override defaults
+		assert.Equal(t, configListenAddr, config.ListenAddr, "Config file should override defaults for listen address")
+		assert.True(t, config.PrometheusCR.Enabled, "Config file should override defaults for prometheus CR enabled")
+		assert.True(t, config.HTTPS.Enabled, "Config file should override defaults for HTTPS enabled")
+		assert.Equal(t, ":7443", config.HTTPS.ListenAddr, "Config file should override defaults for HTTPS listen address")
+		assert.Equal(t, kubeConfigPath, config.KubeConfigFilePath, "Config file should set kube config path")
+	})
+
+	t.Run("environment variables are applied", func(t *testing.T) {
+		// Setup: create empty config file and dummy kube config
+		tempDir := t.TempDir()
+		emptyConfigPath := filepath.Join(tempDir, "empty.yaml")
+		err := os.WriteFile(emptyConfigPath, []byte("{}"), 0600)
+		require.NoError(t, err)
+
+		kubeConfigPath := createDummyKubeConfig(t, tempDir)
+
+		// Save original env var value and restore after test
+		originalNamespace := os.Getenv("OTELCOL_NAMESPACE")
+		defer func() {
+			envErr := os.Setenv("OTELCOL_NAMESPACE", originalNamespace)
+			assert.NoError(t, envErr)
+		}()
+
+		// Set environment variable
+		testNamespace := "test-namespace"
+		err = os.Setenv("OTELCOL_NAMESPACE", testNamespace)
+		require.NoError(t, err)
+
+		// Prepare args for Load function
+		args := []string{
+			"--" + configFilePathFlagName + "=" + emptyConfigPath,
+			"--" + kubeConfigPathFlagName + "=" + kubeConfigPath,
+		}
+
+		// Load config using the full Load function
+		config, err := Load(args)
+		require.NoError(t, err)
+
+		// Assert environment variable is applied
+		assert.Equal(t, testNamespace, config.CollectorNamespace, "Environment variable should be applied")
+	})
+
+	t.Run("loading priority order: defaults <- config file <- env vars <- CLI", func(t *testing.T) {
+		// Setup: create config file with values and dummy kube config
+		tempDir := t.TempDir()
+		kubeConfigPath := createDummyKubeConfig(t, tempDir)
+
+		// Config file sets values
+		configContent := `
+collector_namespace: "config-file-namespace"
+listen_addr: ":9090"
+prometheus_cr:
+  enabled: false
+kube_config_file_path: "` + kubeConfigPath + `"
+`
+		configPath := filepath.Join(tempDir, "config.yaml")
+		err := os.WriteFile(configPath, []byte(configContent), 0600)
+		require.NoError(t, err)
+
+		// Save original env var value and restore after test
+		originalNamespace := os.Getenv("OTELCOL_NAMESPACE")
+		defer func() {
+			envErr := os.Setenv("OTELCOL_NAMESPACE", originalNamespace)
+			assert.NoError(t, envErr)
+		}()
+
+		// Environment variable sets value
+		testNamespace := "env-var-namespace"
+		err = os.Setenv("OTELCOL_NAMESPACE", testNamespace)
+		require.NoError(t, err)
+
+		// Prepare args for Load function with CLI values
+		cliListenAddr := ":8888"
+		args := []string{
+			"--" + configFilePathFlagName + "=" + configPath,
+			"--" + listenAddrFlagName + "=" + cliListenAddr,
+			"--" + prometheusCREnabledFlagName + "=true",
+		}
+
+		// Load config using the full Load function
+		config, err := Load(args)
+		require.NoError(t, err)
+
+		// Assert correct priority: CLI over env vars over config file over defaults
+		assert.Equal(t, testNamespace, config.CollectorNamespace, "Env var should override config file for namespace")
+		assert.Equal(t, cliListenAddr, config.ListenAddr, "CLI should override config file for listen address")
+		assert.True(t, config.PrometheusCR.Enabled, "CLI should override config file for prometheus CR enabled")
+	})
+}
diff --git a/cmd/otel-allocator/internal/config/flags_test.go b/cmd/otel-allocator/internal/config/flags_test.go
index f1ea0de2..5c76da9a 100644
--- a/cmd/otel-allocator/internal/config/flags_test.go
+++ b/cmd/otel-allocator/internal/config/flags_test.go
@@ -39,20 +39,26 @@ func TestFlagGetters(t *testing.T) {
 			name:          "GetKubeConfigFilePath",
 			flagArgs:      []string{"--" + kubeConfigPathFlagName, filepath.Join("~", ".kube", "config")},
 			expectedValue: filepath.Join("~", ".kube", "config"),
-			getterFunc:    func(fs *pflag.FlagSet) (interface{}, error) { return getKubeConfigFilePath(fs) },
+			getterFunc: func(fs *pflag.FlagSet) (interface{}, error) {
+				value, _, err := getKubeConfigFilePath(fs)
+				return value, err
+			},
 		},
 		{
 			name:          "GetListenAddr",
 			flagArgs:      []string{"--" + listenAddrFlagName, ":8081"},
 			expectedValue: ":8081",
-			getterFunc:    func(fs *pflag.FlagSet) (interface{}, error) { return getListenAddr(fs) },
+			getterFunc: func(fs *pflag.FlagSet) (interface{}, error) {
+				value, _, err := getListenAddr(fs)
+				return value, err
+			},
 		},
 		{
 			name:          "GetPrometheusCREnabled",
 			flagArgs:      []string{"--" + prometheusCREnabledFlagName, "true"},
 			expectedValue: true,
 			getterFunc: func(fs *pflag.FlagSet) (interface{}, error) {
-				_, value, err := getPrometheusCREnabled(fs)
+				value, _, err := getPrometheusCREnabled(fs)
 				return value, err
 			},
 		},
diff --git a/controllers/builder_test.go b/internal/controllers/builder_test.go
similarity index 100%
rename from controllers/builder_test.go
rename to internal/controllers/builder_test.go
diff --git a/controllers/common.go b/internal/controllers/common.go
similarity index 100%
rename from controllers/common.go
rename to internal/controllers/common.go
diff --git a/controllers/opampbridge_controller.go b/internal/controllers/opampbridge_controller.go
similarity index 100%
rename from controllers/opampbridge_controller.go
rename to internal/controllers/opampbridge_controller.go
diff --git a/controllers/opampbridge_controller_test.go b/internal/controllers/opampbridge_controller_test.go
similarity index 98%
rename from controllers/opampbridge_controller_test.go
rename to internal/controllers/opampbridge_controller_test.go
index 61874685..0d2e1b2d 100644
--- a/controllers/opampbridge_controller_test.go
+++ b/internal/controllers/opampbridge_controller_test.go
@@ -23,11 +23,11 @@ import (
 	k8sreconcile "sigs.k8s.io/controller-runtime/pkg/reconcile"
 
 	"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
-	"github.com/open-telemetry/opentelemetry-operator/controllers"
 	"github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift"
 	"github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus"
 	"github.com/open-telemetry/opentelemetry-operator/internal/autodetect/rbac"
 	"github.com/open-telemetry/opentelemetry-operator/internal/config"
+	"github.com/open-telemetry/opentelemetry-operator/internal/controllers"
 )
 
 var opampBridgeLogger = logf.Log.WithName("opamp-bridge-controller-unit-tests")
diff --git a/controllers/opentelemetrycollector_controller.go b/internal/controllers/opentelemetrycollector_controller.go
similarity index 100%
rename from controllers/opentelemetrycollector_controller.go
rename to internal/controllers/opentelemetrycollector_controller.go
diff --git a/controllers/opentelemetrycollector_reconciler_test.go b/internal/controllers/opentelemetrycollector_reconciler_test.go
similarity index 100%
rename from controllers/opentelemetrycollector_reconciler_test.go
rename to internal/controllers/opentelemetrycollector_reconciler_test.go
diff --git a/controllers/reconcile_test.go b/internal/controllers/reconcile_test.go
similarity index 99%
rename from controllers/reconcile_test.go
rename to internal/controllers/reconcile_test.go
index 39167131..7251b9a6 100644
--- a/controllers/reconcile_test.go
+++ b/internal/controllers/reconcile_test.go
@@ -38,11 +38,11 @@ import (
 
 	"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
 	"github.com/open-telemetry/opentelemetry-operator/apis/v1beta1"
-	"github.com/open-telemetry/opentelemetry-operator/controllers"
 	"github.com/open-telemetry/opentelemetry-operator/internal/autodetect/openshift"
 	"github.com/open-telemetry/opentelemetry-operator/internal/autodetect/prometheus"
 	autoRBAC "github.com/open-telemetry/opentelemetry-operator/internal/autodetect/rbac"
 	"github.com/open-telemetry/opentelemetry-operator/internal/config"
+	"github.com/open-telemetry/opentelemetry-operator/internal/controllers"
 	"github.com/open-telemetry/opentelemetry-operator/internal/manifests"
 	"github.com/open-telemetry/opentelemetry-operator/internal/naming"
 	"github.com/open-telemetry/opentelemetry-operator/internal/version"
diff --git a/controllers/suite_test.go b/internal/controllers/suite_test.go
similarity index 99%
rename from controllers/suite_test.go
rename to internal/controllers/suite_test.go
index 65e06add..6c4dade2 100644
--- a/controllers/suite_test.go
+++ b/internal/controllers/suite_test.go
@@ -149,10 +149,10 @@ func TestMain(m *testing.M) {
 	utilruntime.Must(v1beta1.AddToScheme(testScheme))
 
 	testEnv = &envtest.Environment{
-		CRDDirectoryPaths: []string{filepath.Join("..", "config", "crd", "bases")},
+		CRDDirectoryPaths: []string{filepath.Join("..", "..", "config", "crd", "bases")},
 		CRDs:              []*apiextensionsv1.CustomResourceDefinition{testdata.OpenShiftRouteCRD, testdata.ServiceMonitorCRD, testdata.PodMonitorCRD},
 		WebhookInstallOptions: envtest.WebhookInstallOptions{
-			Paths: []string{filepath.Join("..", "config", "webhook")},
+			Paths: []string{filepath.Join("..", "..", "config", "webhook")},
 		},
 	}
 	restCfg, err = testEnv.Start()
diff --git a/controllers/targetallocator_controller.go b/internal/controllers/targetallocator_controller.go
similarity index 100%
rename from controllers/targetallocator_controller.go
rename to internal/controllers/targetallocator_controller.go
diff --git a/controllers/targetallocator_controller_test.go b/internal/controllers/targetallocator_controller_test.go
similarity index 98%
rename from controllers/targetallocator_controller_test.go
rename to internal/controllers/targetallocator_controller_test.go
index cf8f7ac1..dd3229c6 100644
--- a/controllers/targetallocator_controller_test.go
+++ b/internal/controllers/targetallocator_controller_test.go
@@ -21,8 +21,8 @@ import (
 
 	"github.com/open-telemetry/opentelemetry-operator/apis/v1alpha1"
 	"github.com/open-telemetry/opentelemetry-operator/apis/v1beta1"
-	"github.com/open-telemetry/opentelemetry-operator/controllers"
 	"github.com/open-telemetry/opentelemetry-operator/internal/config"
+	"github.com/open-telemetry/opentelemetry-operator/internal/controllers"
 )
 
 var testLogger = logf.Log.WithName("opamp-bridge-controller-unit-tests")
diff --git a/tests/e2e-instrumentation/instrumentation-apache-httpd/00-install-collector.yaml b/tests/e2e-instrumentation/instrumentation-apache-httpd/00-install-collector.yaml
index b07909ca..9d860dc3 100644
--- a/tests/e2e-instrumentation/instrumentation-apache-httpd/00-install-collector.yaml
+++ b/tests/e2e-instrumentation/instrumentation-apache-httpd/00-install-collector.yaml
@@ -1,17 +1,21 @@
-apiVersion: opentelemetry.io/v1alpha1
+apiVersion: opentelemetry.io/v1beta1
 kind: OpenTelemetryCollector
 metadata:
   name: sidecar
 spec:
-  config: |
+  config:
     receivers:
       otlp:
         protocols:
-          grpc:
-          http:
-    processors:
+          grpc: {}
+          http: {}
+    
+    processors: {}
+
     exporters:
       debug:
+        verbosity: detailed
+
     service:
       pipelines:
         traces:
diff --git a/tests/e2e-instrumentation/instrumentation-apache-httpd/00-install-instrumentation.yaml b/tests/e2e-instrumentation/instrumentation-apache-httpd/00-install-instrumentation.yaml
index 26bcbaf9..051bef39 100644
--- a/tests/e2e-instrumentation/instrumentation-apache-httpd/00-install-instrumentation.yaml
+++ b/tests/e2e-instrumentation/instrumentation-apache-httpd/00-install-instrumentation.yaml
@@ -3,14 +3,22 @@ kind: Instrumentation
 metadata:
   name: apache
 spec:
+  env:
+    - name: OTEL_TRACES_EXPORTER
+      value: otlp
+    - name: OTEL_EXPORTER_OTLP_ENDPOINT
+      value: http://localhost:4317
+    - name: OTEL_EXPORTER_OTLP_TIMEOUT
+      value: "20000"
+    - name: OTEL_TRACES_SAMPLER
+      value: always_on
+    - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
+      value: "true"
   exporter:
     endpoint: http://localhost:4317
   propagators:
     - jaeger
     - b3
-  sampler:
-    type: parentbased_traceidratio
-    argument: "0.25"
   apacheHttpd:
     attrs:
     - name: ApacheModuleOtelMaxQueueSize
diff --git a/tests/e2e-instrumentation/instrumentation-apache-httpd/01-assert.yaml b/tests/e2e-instrumentation/instrumentation-apache-httpd/01-assert.yaml
index 6eacda12..b851de7d 100644
--- a/tests/e2e-instrumentation/instrumentation-apache-httpd/01-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-apache-httpd/01-assert.yaml
@@ -2,8 +2,8 @@ apiVersion: v1
 kind: Pod
 metadata:
   annotations:
-    instrumentation.opentelemetry.io/inject-apache-httpd: 'true'
-    sidecar.opentelemetry.io/inject: 'true'
+    instrumentation.opentelemetry.io/inject-apache-httpd: "true"
+    sidecar.opentelemetry.io/inject: "true"
   labels:
     app: my-apache
 spec:
@@ -12,15 +12,25 @@ spec:
     - name: OTEL_NODE_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.hostIP
     - name: OTEL_POD_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.podIP
-    - name: OTEL_SERVICE_NAME
-      value: my-apache
+    - name: OTEL_TRACES_EXPORTER
+      value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
       value: http://localhost:4317
+    - name: OTEL_EXPORTER_OTLP_TIMEOUT
+      value: "20000"
+    - name: OTEL_TRACES_SAMPLER
+      value: always_on
+    - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
+      value: "true"
+    - name: OTEL_SERVICE_NAME
+      value: my-apache
     - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME
       valueFrom:
         fieldRef:
@@ -33,18 +43,35 @@ spec:
           fieldPath: spec.nodeName
     - name: OTEL_PROPAGATORS
       value: jaeger,b3
-    - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: '0.25'
     - name: OTEL_RESOURCE_ATTRIBUTES
+    lifecycle:
+      postStart:
+        exec:
+          command:
+          - /bin/sh
+          - -c
+          - echo Hello from the postStart handler
     name: myapp
+    ports:
+    - containerPort: 8080
+      protocol: TCP
+    readinessProbe:
+      failureThreshold: 3
+      httpGet:
+        path: /
+        port: 8080
+        scheme: HTTP
+      initialDelaySeconds: 5
+      periodSeconds: 15
+      successThreshold: 1
+      timeoutSeconds: 2
     volumeMounts:
     - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
-    - name: otel-apache-agent
-      mountPath: /opt/opentelemetry-webserver/agent
-    - name: otel-apache-conf-dir
-      mountPath: /usr/local/apache2/conf
+      readOnly: true
+    - mountPath: /opt/opentelemetry-webserver/agent
+      name: otel-apache-agent
+    - mountPath: /usr/local/apache2/conf
+      name: otel-apache-conf-dir
   - args:
     - --config=env:OTEL_CONFIG
     name: otc-container
diff --git a/tests/e2e-instrumentation/instrumentation-apache-httpd/01-install-app.yaml b/tests/e2e-instrumentation/instrumentation-apache-httpd/01-install-app.yaml
index dbdb2dee..4d47ac4d 100644
--- a/tests/e2e-instrumentation/instrumentation-apache-httpd/01-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-apache-httpd/01-install-app.yaml
@@ -33,6 +33,15 @@ spec:
               command: [ "/bin/sh", "-c", "echo Hello from the postStart handler" ]
         ports:
         - containerPort: 8080
+        readinessProbe:
+          httpGet:
+            path: /
+            port: 8080
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
         resources:
           limits:
             cpu: "1"
diff --git a/tests/e2e-instrumentation/instrumentation-apache-httpd/chainsaw-test.yaml b/tests/e2e-instrumentation/instrumentation-apache-httpd/chainsaw-test.yaml
index 93fdcd50..952030b8 100755
--- a/tests/e2e-instrumentation/instrumentation-apache-httpd/chainsaw-test.yaml
+++ b/tests/e2e-instrumentation/instrumentation-apache-httpd/chainsaw-test.yaml
@@ -37,3 +37,80 @@ spec:
     catch:
       - podLogs:
           selector: app=my-apache
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-apache
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "8080"
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-apache"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              k8s.container.name: Str(myapp)
+              k8s.deployment.name: Str(my-apache)
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-apache
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
+    catch:
+      - podLogs:
+          selector: app=my-apache
+          container: otc-container
diff --git a/tests/e2e-instrumentation/instrumentation-apache-multicontainer/00-install-collector.yaml b/tests/e2e-instrumentation/instrumentation-apache-multicontainer/00-install-collector.yaml
index 3246238e..9d860dc3 100644
--- a/tests/e2e-instrumentation/instrumentation-apache-multicontainer/00-install-collector.yaml
+++ b/tests/e2e-instrumentation/instrumentation-apache-multicontainer/00-install-collector.yaml
@@ -1,21 +1,24 @@
-# skipping test, see https://github.com/open-telemetry/opentelemetry-operator/issues/1936
-apiVersion: opentelemetry.io/v1alpha1
+apiVersion: opentelemetry.io/v1beta1
 kind: OpenTelemetryCollector
 metadata:
   name: sidecar
 spec:
-  mode: sidecar
-  config: |
+  config:
     receivers:
       otlp:
         protocols:
-          grpc:
-          http:
-    processors:
+          grpc: {}
+          http: {}
+    
+    processors: {}
+
     exporters:
       debug:
+        verbosity: detailed
+
     service:
       pipelines:
         traces:
           receivers: [otlp]
           exporters: [debug]
+  mode: sidecar
diff --git a/tests/e2e-instrumentation/instrumentation-apache-multicontainer/00-install-instrumentation.yaml b/tests/e2e-instrumentation/instrumentation-apache-multicontainer/00-install-instrumentation.yaml
index d778d467..1c6b9eea 100644
--- a/tests/e2e-instrumentation/instrumentation-apache-multicontainer/00-install-instrumentation.yaml
+++ b/tests/e2e-instrumentation/instrumentation-apache-multicontainer/00-install-instrumentation.yaml
@@ -4,14 +4,22 @@ kind: Instrumentation
 metadata:
   name: apache
 spec:
+  env:
+    - name: OTEL_TRACES_EXPORTER
+      value: otlp
+    - name: OTEL_EXPORTER_OTLP_ENDPOINT
+      value: http://localhost:4317
+    - name: OTEL_EXPORTER_OTLP_TIMEOUT
+      value: "20000"
+    - name: OTEL_TRACES_SAMPLER
+      value: always_on
+    - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
+      value: "true"
   exporter:
     endpoint: http://localhost:4317
   propagators:
     - jaeger
     - b3
-  sampler:
-    type: parentbased_traceidratio
-    argument: "0.25"
   apacheHttpd:
     attrs:
       - name: ApacheModuleOtelMaxQueueSize
diff --git a/tests/e2e-instrumentation/instrumentation-apache-multicontainer/01-assert.yaml b/tests/e2e-instrumentation/instrumentation-apache-multicontainer/01-assert.yaml
index 04243da4..2b1be18e 100644
--- a/tests/e2e-instrumentation/instrumentation-apache-multicontainer/01-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-apache-multicontainer/01-assert.yaml
@@ -20,10 +20,18 @@ spec:
         fieldRef:
           apiVersion: v1
           fieldPath: status.podIP
-    - name: OTEL_SERVICE_NAME
-      value: my-apache-multi
+    - name: OTEL_TRACES_EXPORTER
+      value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
       value: http://localhost:4317
+    - name: OTEL_EXPORTER_OTLP_TIMEOUT
+      value: "20000"
+    - name: OTEL_TRACES_SAMPLER
+      value: always_on
+    - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
+      value: "true"
+    - name: OTEL_SERVICE_NAME
+      value: my-apache-multi
     - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME
       valueFrom:
         fieldRef:
@@ -36,12 +44,21 @@ spec:
           fieldPath: spec.nodeName
     - name: OTEL_PROPAGATORS
       value: jaeger,b3
-    - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.25"
     - name: OTEL_RESOURCE_ATTRIBUTES
     name: myapp
+    ports:
+    - containerPort: 8080
+      protocol: TCP
+    readinessProbe:
+      failureThreshold: 3
+      httpGet:
+        path: /
+        port: 8080
+        scheme: HTTP
+      initialDelaySeconds: 5
+      periodSeconds: 15
+      successThreshold: 1
+      timeoutSeconds: 2
   - env:
     - name: OTEL_NODE_IP
       valueFrom:
@@ -53,10 +70,18 @@ spec:
         fieldRef:
           apiVersion: v1
           fieldPath: status.podIP
-    - name: OTEL_SERVICE_NAME
-      value: my-apache-multi
+    - name: OTEL_TRACES_EXPORTER
+      value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
       value: http://localhost:4317
+    - name: OTEL_EXPORTER_OTLP_TIMEOUT
+      value: "20000"
+    - name: OTEL_TRACES_SAMPLER
+      value: always_on
+    - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
+      value: "true"
+    - name: OTEL_SERVICE_NAME
+      value: my-apache-multi
     - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME
       valueFrom:
         fieldRef:
@@ -69,10 +94,6 @@ spec:
           fieldPath: spec.nodeName
     - name: OTEL_PROPAGATORS
       value: jaeger,b3
-    - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.25"
     - name: OTEL_RESOURCE_ATTRIBUTES
     name: myrabbit
   - args:
diff --git a/tests/e2e-instrumentation/instrumentation-apache-multicontainer/01-install-app.yaml b/tests/e2e-instrumentation/instrumentation-apache-multicontainer/01-install-app.yaml
index 242cef77..99fd44c5 100644
--- a/tests/e2e-instrumentation/instrumentation-apache-multicontainer/01-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-apache-multicontainer/01-install-app.yaml
@@ -26,6 +26,15 @@ spec:
           imagePullPolicy: Always
           ports:
             - containerPort: 8080
+          readinessProbe:
+            httpGet:
+              path: /
+              port: 8080
+              scheme: HTTP
+            initialDelaySeconds: 5
+            periodSeconds: 15
+            timeoutSeconds: 2
+            failureThreshold: 3
           resources:
             limits:
               cpu: "1"
diff --git a/tests/e2e-instrumentation/instrumentation-apache-multicontainer/02-assert.yaml b/tests/e2e-instrumentation/instrumentation-apache-multicontainer/02-assert.yaml
index fe1c599b..d9f52e77 100644
--- a/tests/e2e-instrumentation/instrumentation-apache-multicontainer/02-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-apache-multicontainer/02-assert.yaml
@@ -31,10 +31,18 @@ spec:
         fieldRef:
           apiVersion: v1
           fieldPath: status.podIP
-    - name: OTEL_SERVICE_NAME
-      value: my-apache-multi
+    - name: OTEL_TRACES_EXPORTER
+      value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
       value: http://localhost:4317
+    - name: OTEL_EXPORTER_OTLP_TIMEOUT
+      value: "20000"
+    - name: OTEL_TRACES_SAMPLER
+      value: always_on
+    - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
+      value: "true"
+    - name: OTEL_SERVICE_NAME
+      value: my-apache-multi
     - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME
       valueFrom:
         fieldRef:
@@ -47,12 +55,21 @@ spec:
           fieldPath: spec.nodeName
     - name: OTEL_PROPAGATORS
       value: jaeger,b3
-    - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.25"
     - name: OTEL_RESOURCE_ATTRIBUTES
     name: myapp
+    ports:
+    - containerPort: 8080
+      protocol: TCP
+    readinessProbe:
+      failureThreshold: 3
+      httpGet:
+        path: /
+        port: 8080
+        scheme: HTTP
+      initialDelaySeconds: 5
+      periodSeconds: 15
+      successThreshold: 1
+      timeoutSeconds: 2
   - image: rabbitmq
     name: myrabbit
   - args:
diff --git a/tests/e2e-instrumentation/instrumentation-apache-multicontainer/02-install-app.yaml b/tests/e2e-instrumentation/instrumentation-apache-multicontainer/02-install-app.yaml
index 19fe1a4b..45d384c8 100644
--- a/tests/e2e-instrumentation/instrumentation-apache-multicontainer/02-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-apache-multicontainer/02-install-app.yaml
@@ -26,6 +26,15 @@ spec:
           imagePullPolicy: Always
           ports:
             - containerPort: 8080
+          readinessProbe:
+            httpGet:
+              path: /
+              port: 8080
+              scheme: HTTP
+            initialDelaySeconds: 5
+            periodSeconds: 15
+            timeoutSeconds: 2
+            failureThreshold: 3
           resources:
             limits:
               cpu: "1"
diff --git a/tests/e2e-instrumentation/instrumentation-apache-multicontainer/chainsaw-test.yaml b/tests/e2e-instrumentation/instrumentation-apache-multicontainer/chainsaw-test.yaml
index f0d25348..e99a849d 100755
--- a/tests/e2e-instrumentation/instrumentation-apache-multicontainer/chainsaw-test.yaml
+++ b/tests/e2e-instrumentation/instrumentation-apache-multicontainer/chainsaw-test.yaml
@@ -40,12 +40,191 @@ spec:
     catch:
       - podLogs:
           selector: app=my-apache-multi
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-apache-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "8080"
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-apache-multi"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              k8s.container.name: Str(myapp)
+              k8s.deployment.name: Str(my-apache-multi)
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-apache-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
+    catch:
+      - podLogs:
+          selector: app=my-apache-multi
+          container: otc-container
   - name: step-03
     try:
+      - command:
+          env:
+          - name: appnamespace
+            value: ($namespace)
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - $appnamespace
+            - -l
+            - app=my-apache-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
       - apply:
           file: 02-install-app.yaml
       - assert:
           file: 02-assert.yaml
+      - wait:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ($namespace)
+          timeout: 1m
+          for:
+            deletion: {}
+    catch:
+      - podLogs:
+          selector: app=my-apache-multi
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-apache-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "8080"
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-apache-multi"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              k8s.container.name: Str(myapp)
+              k8s.deployment.name: Str(my-apache-multi)
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-apache-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
     catch:
       - podLogs:
           selector: app=my-apache-multi
+          container: otc-container
diff --git a/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/00-install-collector.yaml b/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/00-install-collector.yaml
index 5db3bc0a..35568d28 100644
--- a/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/00-install-collector.yaml
+++ b/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/00-install-collector.yaml
@@ -1,22 +1,27 @@
-apiVersion: opentelemetry.io/v1alpha1
+apiVersion: opentelemetry.io/v1beta1
 kind: OpenTelemetryCollector
 metadata:
   name: sidecar
 spec:
   mode: sidecar
-  config: |
+  config:
     receivers:
       otlp:
         protocols:
-          grpc:
-          http:
-    processors:
+          grpc: {}
+          http: {}
+
+    processors: {}
 
     exporters:
       debug:
+        verbosity: detailed
 
     service:
       pipelines:
         traces:
           receivers: [otlp]
           exporters: [debug]
+        metrics:
+          receivers: [otlp]
+          exporters: [debug]
diff --git a/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/00-install-instrumentation.yaml b/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/00-install-instrumentation.yaml
index 71351ee4..312606fe 100644
--- a/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/00-install-instrumentation.yaml
+++ b/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/00-install-instrumentation.yaml
@@ -7,24 +7,15 @@ spec:
     - name: OTEL_TRACES_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
+      value: http://localhost:4318
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
   exporter:
-    endpoint: http://localhost:4317
+    endpoint: http://localhost:4318
   propagators:
     - jaeger
     - b3multi
-  sampler:
-    type: parentbased_traceidratio
-    argument: "0.25"
-  dotnet:
-    env:
-      - name: OTEL_LOG_LEVEL
-        value: "debug"
\ No newline at end of file
diff --git a/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/01-assert.yaml b/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/01-assert.yaml
index 91ecb811..5ea35016 100644
--- a/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/01-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/01-assert.yaml
@@ -13,15 +13,15 @@ spec:
     - name: OTEL_NODE_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.hostIP
     - name: OTEL_POD_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.podIP
     - name: ASPNETCORE_URLS
       value: http://+:8080
-    - name: OTEL_LOG_LEVEL
-      value: debug
     - name: CORECLR_ENABLE_PROFILING
       value: "1"
     - name: CORECLR_PROFILER
@@ -39,13 +39,11 @@ spec:
     - name: OTEL_TRACES_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
+      value: http://localhost:4318
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
     - name: OTEL_SERVICE_NAME
@@ -64,6 +62,9 @@ spec:
       value: jaeger,b3multi
     - name: OTEL_RESOURCE_ATTRIBUTES
     name: myapp
+    ports:
+    - containerPort: 8080
+      protocol: TCP
     volumeMounts:
     - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
       readOnly: true
@@ -73,13 +74,13 @@ spec:
     - name: OTEL_NODE_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.hostIP
     - name: OTEL_POD_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.podIP
-    - name: OTEL_LOG_LEVEL
-      value: debug
     - name: CORECLR_ENABLE_PROFILING
       value: "1"
     - name: CORECLR_PROFILER
@@ -97,13 +98,11 @@ spec:
     - name: OTEL_TRACES_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
+      value: http://localhost:4318
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
     - name: OTEL_SERVICE_NAME
diff --git a/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/01-install-app.yaml b/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/01-install-app.yaml
index 65681d5b..86407fcd 100644
--- a/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/01-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/01-install-app.yaml
@@ -22,6 +22,8 @@ spec:
         fsGroup: 3000
       containers:
       - name: myapp
+        ports:
+        - containerPort: 8080
         image: ghcr.io/open-telemetry/opentelemetry-operator/e2e-test-app-dotnet:main
         securityContext:
           allowPrivilegeEscalation: false
@@ -30,6 +32,15 @@ spec:
         env:
         - name: ASPNETCORE_URLS
           value: "http://+:8080"
+        readinessProbe:
+          httpGet:
+            path: /rolldice
+            port: 8080
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
       - name: myrabbit
         image: rabbitmq:3
         securityContext:
diff --git a/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/02-assert.yaml b/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/02-assert.yaml
index dfda2367..339fdb6a 100644
--- a/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/02-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/02-assert.yaml
@@ -24,15 +24,15 @@ spec:
     - name: OTEL_NODE_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.hostIP
     - name: OTEL_POD_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.podIP
     - name: ASPNETCORE_URLS
       value: http://+:8080
-    - name: OTEL_LOG_LEVEL
-      value: debug
     - name: CORECLR_ENABLE_PROFILING
       value: "1"
     - name: CORECLR_PROFILER
@@ -50,13 +50,11 @@ spec:
     - name: OTEL_TRACES_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
+      value: http://localhost:4318
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
     - name: OTEL_SERVICE_NAME
@@ -74,6 +72,10 @@ spec:
     - name: OTEL_PROPAGATORS
       value: jaeger,b3multi
     - name: OTEL_RESOURCE_ATTRIBUTES
+    name: myapp
+    ports:
+    - containerPort: 8080
+      protocol: TCP
     volumeMounts:
     - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
       readOnly: true
diff --git a/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/02-install-app.yaml b/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/02-install-app.yaml
index d6bea125..fdef18c0 100644
--- a/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/02-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/02-install-app.yaml
@@ -22,6 +22,8 @@ spec:
         fsGroup: 3000
       containers:
       - name: myapp
+        ports:
+        - containerPort: 8080
         image: ghcr.io/open-telemetry/opentelemetry-operator/e2e-test-app-dotnet:main
         securityContext:
           allowPrivilegeEscalation: false
@@ -30,6 +32,15 @@ spec:
         env:
         - name: ASPNETCORE_URLS
           value: "http://+:8080"
+        readinessProbe:
+          httpGet:
+            path: /rolldice
+            port: 8080
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
       - name: myrabbit
         image: rabbitmq:3
         securityContext:
diff --git a/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/chainsaw-test.yaml b/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/chainsaw-test.yaml
index 13ff6abb..1c8e9250 100755
--- a/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/chainsaw-test.yaml
+++ b/tests/e2e-instrumentation/instrumentation-dotnet-multicontainer/chainsaw-test.yaml
@@ -40,12 +40,197 @@ spec:
     catch:
       - podLogs:
           selector: app=my-dotnet-multi
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-dotnet-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "8080"
+          path: /rolldice
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-dotnet-multi"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              Name: process.runtime.dotnet.gc.collections.count
+              Description: Number of garbage collections that have occurred since process start
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-dotnet-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_metric_points_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_metric_points_total'].value | [0] > `1`): true
+    catch:
+      - podLogs:
+          selector: app=my-dotnet-multi
+          container: otc-container
   - name: step-03
     try:
+    - command:
+        env:
+        - name: appnamespace
+          value: ($namespace)
+        entrypoint: kubectl
+        args:
+          - get
+          - pod
+          - -n
+          - $appnamespace
+          - -l
+          - app=my-dotnet-multi
+          - -o
+          - jsonpath={.items[0].metadata.name}
+        outputs:
+        - name: podName
+          value: ($stdout)
     - apply:
         file: 02-install-app.yaml
     - assert:
         file: 02-assert.yaml
+    - wait:
+        apiVersion: v1
+        kind: Pod
+        name: ($podName)
+        namespace: ($namespace)
+        timeout: 1m
+        for:
+          deletion: {}
+    catch:
+      - podLogs:
+          selector: app=my-dotnet-multi
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-dotnet-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "8080"
+          path: /rolldice
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-dotnet-multi"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              Name: process.runtime.dotnet.gc.collections.count
+              Description: Number of garbage collections that have occurred since process start
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-dotnet-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_metric_points_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_metric_points_total'].value | [0] > `1`): true
     catch:
       - podLogs:
           selector: app=my-dotnet-multi
+          container: otc-container
diff --git a/tests/e2e-instrumentation/instrumentation-dotnet-musl/00-install-collector.yaml b/tests/e2e-instrumentation/instrumentation-dotnet-musl/00-install-collector.yaml
index 34a26ebb..e32ff2b4 100644
--- a/tests/e2e-instrumentation/instrumentation-dotnet-musl/00-install-collector.yaml
+++ b/tests/e2e-instrumentation/instrumentation-dotnet-musl/00-install-collector.yaml
@@ -1,22 +1,27 @@
-apiVersion: opentelemetry.io/v1alpha1
+apiVersion: opentelemetry.io/v1beta1
 kind: OpenTelemetryCollector
 metadata:
   name: sidecar
 spec:
-  config: |
+  config:
     receivers:
       otlp:
         protocols:
-          grpc:
-          http:
-    processors:
+          grpc: {}
+          http: {}
+
+    processors: {}
 
     exporters:
       debug:
+        verbosity: detailed
 
     service:
       pipelines:
         traces:
           receivers: [otlp]
           exporters: [debug]
+        metrics:
+          receivers: [otlp]
+          exporters: [debug]
   mode: sidecar
diff --git a/tests/e2e-instrumentation/instrumentation-dotnet-musl/00-install-instrumentation.yaml b/tests/e2e-instrumentation/instrumentation-dotnet-musl/00-install-instrumentation.yaml
index 80ca25ca..312606fe 100644
--- a/tests/e2e-instrumentation/instrumentation-dotnet-musl/00-install-instrumentation.yaml
+++ b/tests/e2e-instrumentation/instrumentation-dotnet-musl/00-install-instrumentation.yaml
@@ -7,20 +7,15 @@ spec:
     - name: OTEL_TRACES_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
+      value: http://localhost:4318
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
   exporter:
-    endpoint: http://localhost:4317
+    endpoint: http://localhost:4318
   propagators:
     - jaeger
     - b3multi
-  sampler:
-    type: parentbased_traceidratio
-    argument: "0.25"
diff --git a/tests/e2e-instrumentation/instrumentation-dotnet-musl/01-assert.yaml b/tests/e2e-instrumentation/instrumentation-dotnet-musl/01-assert.yaml
index 08afb751..b564520e 100644
--- a/tests/e2e-instrumentation/instrumentation-dotnet-musl/01-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-dotnet-musl/01-assert.yaml
@@ -3,7 +3,7 @@ kind: Pod
 metadata:
   annotations:
     instrumentation.opentelemetry.io/inject-dotnet: "true"
-    sidecar.opentelemetry.io/inject: "true"
+    instrumentation.opentelemetry.io/otel-dotnet-auto-runtime: linux-musl-x64
   labels:
     app: my-dotnet-musl
 spec:
@@ -12,10 +12,12 @@ spec:
     - name: OTEL_NODE_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.hostIP
     - name: OTEL_POD_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.podIP
     - name: ASPNETCORE_URLS
       value: http://+:8080
@@ -36,13 +38,11 @@ spec:
     - name: OTEL_TRACES_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
+      value: http://localhost:4318
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
     - name: OTEL_SERVICE_NAME
@@ -61,6 +61,9 @@ spec:
       value: jaeger,b3multi
     - name: OTEL_RESOURCE_ATTRIBUTES
     name: myapp
+    ports:
+    - containerPort: 8080
+      protocol: TCP
     volumeMounts:
     - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
       readOnly: true
diff --git a/tests/e2e-instrumentation/instrumentation-dotnet-musl/01-install-app.yaml b/tests/e2e-instrumentation/instrumentation-dotnet-musl/01-install-app.yaml
index b69d2fb3..589346e7 100644
--- a/tests/e2e-instrumentation/instrumentation-dotnet-musl/01-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-dotnet-musl/01-install-app.yaml
@@ -22,6 +22,8 @@ spec:
         fsGroup: 3000
       containers:
       - name: myapp
+        ports:
+        - containerPort: 8080
         image: ghcr.io/open-telemetry/opentelemetry-operator/e2e-test-app-dotnet:main
         securityContext:
           allowPrivilegeEscalation: false
@@ -30,3 +32,12 @@ spec:
         env:
         - name: ASPNETCORE_URLS
           value: "http://+:8080"
+        readinessProbe:
+          httpGet:
+            path: /rolldice
+            port: 8080
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
diff --git a/tests/e2e-instrumentation/instrumentation-dotnet/00-install-collector.yaml b/tests/e2e-instrumentation/instrumentation-dotnet/00-install-collector.yaml
index 34a26ebb..e32ff2b4 100644
--- a/tests/e2e-instrumentation/instrumentation-dotnet/00-install-collector.yaml
+++ b/tests/e2e-instrumentation/instrumentation-dotnet/00-install-collector.yaml
@@ -1,22 +1,27 @@
-apiVersion: opentelemetry.io/v1alpha1
+apiVersion: opentelemetry.io/v1beta1
 kind: OpenTelemetryCollector
 metadata:
   name: sidecar
 spec:
-  config: |
+  config:
     receivers:
       otlp:
         protocols:
-          grpc:
-          http:
-    processors:
+          grpc: {}
+          http: {}
+
+    processors: {}
 
     exporters:
       debug:
+        verbosity: detailed
 
     service:
       pipelines:
         traces:
           receivers: [otlp]
           exporters: [debug]
+        metrics:
+          receivers: [otlp]
+          exporters: [debug]
   mode: sidecar
diff --git a/tests/e2e-instrumentation/instrumentation-dotnet/00-install-instrumentation.yaml b/tests/e2e-instrumentation/instrumentation-dotnet/00-install-instrumentation.yaml
index 80ca25ca..312606fe 100644
--- a/tests/e2e-instrumentation/instrumentation-dotnet/00-install-instrumentation.yaml
+++ b/tests/e2e-instrumentation/instrumentation-dotnet/00-install-instrumentation.yaml
@@ -7,20 +7,15 @@ spec:
     - name: OTEL_TRACES_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
+      value: http://localhost:4318
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
   exporter:
-    endpoint: http://localhost:4317
+    endpoint: http://localhost:4318
   propagators:
     - jaeger
     - b3multi
-  sampler:
-    type: parentbased_traceidratio
-    argument: "0.25"
diff --git a/tests/e2e-instrumentation/instrumentation-dotnet/01-assert.yaml b/tests/e2e-instrumentation/instrumentation-dotnet/01-assert.yaml
index 1318ded2..c0e3b79f 100644
--- a/tests/e2e-instrumentation/instrumentation-dotnet/01-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-dotnet/01-assert.yaml
@@ -12,10 +12,12 @@ spec:
     - name: OTEL_NODE_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.hostIP
     - name: OTEL_POD_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.podIP
     - name: ASPNETCORE_URLS
       value: http://+:8080
@@ -36,13 +38,11 @@ spec:
     - name: OTEL_TRACES_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
+      value: http://localhost:4318
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
     - name: OTEL_SERVICE_NAME
@@ -61,6 +61,9 @@ spec:
       value: jaeger,b3multi
     - name: OTEL_RESOURCE_ATTRIBUTES
     name: myapp
+    ports:
+    - containerPort: 8080
+      protocol: TCP
     volumeMounts:
     - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
       readOnly: true
diff --git a/tests/e2e-instrumentation/instrumentation-dotnet/01-install-app.yaml b/tests/e2e-instrumentation/instrumentation-dotnet/01-install-app.yaml
index 4a80480f..33fead0a 100644
--- a/tests/e2e-instrumentation/instrumentation-dotnet/01-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-dotnet/01-install-app.yaml
@@ -21,6 +21,8 @@ spec:
         fsGroup: 3000
       containers:
       - name: myapp
+        ports:
+        - containerPort: 8080
         image: ghcr.io/open-telemetry/opentelemetry-operator/e2e-test-app-dotnet:main
         securityContext:
           allowPrivilegeEscalation: false
@@ -29,3 +31,12 @@ spec:
         env:
         - name: ASPNETCORE_URLS
           value: "http://+:8080"
+        readinessProbe:
+          httpGet:
+            path: /rolldice
+            port: 8080
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
diff --git a/tests/e2e-instrumentation/instrumentation-dotnet/chainsaw-test.yaml b/tests/e2e-instrumentation/instrumentation-dotnet/chainsaw-test.yaml
index bdd2fd9a..84c02ae8 100755
--- a/tests/e2e-instrumentation/instrumentation-dotnet/chainsaw-test.yaml
+++ b/tests/e2e-instrumentation/instrumentation-dotnet/chainsaw-test.yaml
@@ -38,3 +38,83 @@ spec:
     catch:
       - podLogs:
           selector: app=my-dotnet
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-dotnet
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "8080"
+          path: /rolldice
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-dotnet"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              Name: process.runtime.dotnet.gc.collections.count
+              Description: Number of garbage collections that have occurred since process start
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-dotnet
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_metric_points_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_metric_points_total'].value | [0] > `1`): true
+    catch:
+      - podLogs:
+          selector: app=my-dotnet
+          container: otc-container
diff --git a/tests/e2e-instrumentation/instrumentation-go/00-install-collector.yaml b/tests/e2e-instrumentation/instrumentation-go/00-install-collector.yaml
index 5db3bc0a..2a3be7a0 100644
--- a/tests/e2e-instrumentation/instrumentation-go/00-install-collector.yaml
+++ b/tests/e2e-instrumentation/instrumentation-go/00-install-collector.yaml
@@ -1,19 +1,21 @@
-apiVersion: opentelemetry.io/v1alpha1
+apiVersion: opentelemetry.io/v1beta1
 kind: OpenTelemetryCollector
 metadata:
   name: sidecar
 spec:
   mode: sidecar
-  config: |
+  config:
     receivers:
       otlp:
         protocols:
-          grpc:
-          http:
-    processors:
+          grpc: {}
+          http: {}
+
+    processors: {}
 
     exporters:
       debug:
+        verbosity: detailed
 
     service:
       pipelines:
diff --git a/tests/e2e-instrumentation/instrumentation-go/00-install-instrumentation.yaml b/tests/e2e-instrumentation/instrumentation-go/00-install-instrumentation.yaml
index f5f640db..e02e432f 100644
--- a/tests/e2e-instrumentation/instrumentation-go/00-install-instrumentation.yaml
+++ b/tests/e2e-instrumentation/instrumentation-go/00-install-instrumentation.yaml
@@ -7,20 +7,15 @@ spec:
     - name: OTEL_TRACES_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
+      value: http://localhost:4318
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
   exporter:
-    endpoint: http://localhost:4317
+    endpoint: http://localhost:4318
   propagators:
     - jaeger
     - b3
-  sampler:
-    type: parentbased_traceidratio
-    argument: "0.25"
diff --git a/tests/e2e-instrumentation/instrumentation-go/02-assert.yaml b/tests/e2e-instrumentation/instrumentation-go/02-assert.yaml
index cec1654c..93a7b02e 100644
--- a/tests/e2e-instrumentation/instrumentation-go/02-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-go/02-assert.yaml
@@ -3,13 +3,26 @@ kind: Pod
 metadata:
   annotations:
     instrumentation.opentelemetry.io/inject-go: "true"
-    instrumentation.opentelemetry.io/otel-go-auto-target-exe: /usr/src/app/productcatalogservice
+    instrumentation.opentelemetry.io/otel-go-auto-target-exe: /rolldice
     sidecar.opentelemetry.io/inject: "true"
   labels:
     app: my-golang
 spec:
   containers:
-  - name: productcatalogservice
+  - name: myapp
+    ports:
+    - containerPort: 8095
+      protocol: TCP
+    readinessProbe:
+      failureThreshold: 3
+      httpGet:
+        path: /rolldice
+        port: 8095
+        scheme: HTTP
+      initialDelaySeconds: 5
+      periodSeconds: 15
+      successThreshold: 1
+      timeoutSeconds: 2
   - args:
     - --config=env:OTEL_CONFIG
     name: otc-container
@@ -17,23 +30,23 @@ spec:
     - name: OTEL_NODE_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.hostIP
     - name: OTEL_POD_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.podIP
     - name: OTEL_GO_AUTO_TARGET_EXE
-      value: /usr/src/app/productcatalogservice
+      value: /rolldice
     - name: OTEL_TRACES_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
+      value: http://localhost:4318
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
     - name: OTEL_SERVICE_NAME
@@ -59,13 +72,13 @@ spec:
       readOnly: true
 status:
   containerStatuses:
-  - name: opentelemetry-auto-instrumentation
+  - name: myapp
     ready: true
     started: true
-  - name: otc-container
+  - name: opentelemetry-auto-instrumentation
     ready: true
     started: true
-  - name: productcatalogservice
+  - name: otc-container
     ready: true
     started: true
   phase: Running
diff --git a/tests/e2e-instrumentation/instrumentation-go/02-install-app.yaml b/tests/e2e-instrumentation/instrumentation-go/02-install-app.yaml
index af82d845..0550d394 100644
--- a/tests/e2e-instrumentation/instrumentation-go/02-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-go/02-install-app.yaml
@@ -14,7 +14,7 @@ spec:
       annotations:
         sidecar.opentelemetry.io/inject: "true"
         instrumentation.opentelemetry.io/inject-go: "true"
-        instrumentation.opentelemetry.io/otel-go-auto-target-exe: /usr/src/app/productcatalogservice
+        instrumentation.opentelemetry.io/otel-go-auto-target-exe: /rolldice
     spec:
       serviceAccountName: otel-instrumentation-go
       securityContext:
@@ -22,5 +22,16 @@ spec:
         runAsGroup: 3000
         fsGroup: 3000
       containers:
-      - name: productcatalogservice
+      - name: myapp
+        ports:
+        - containerPort: 8095
         image: ghcr.io/open-telemetry/opentelemetry-operator/e2e-test-app-golang:main
+        readinessProbe:
+          httpGet:
+            path: /rolldice
+            port: 8095
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
diff --git a/tests/e2e-instrumentation/instrumentation-go/chainsaw-test.yaml b/tests/e2e-instrumentation/instrumentation-go/chainsaw-test.yaml
index 6149ecf3..ffe4f394 100755
--- a/tests/e2e-instrumentation/instrumentation-go/chainsaw-test.yaml
+++ b/tests/e2e-instrumentation/instrumentation-go/chainsaw-test.yaml
@@ -44,3 +44,81 @@ spec:
     catch:
       - podLogs:
           selector: app=my-golang
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-golang
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "8095"
+          path: /rolldice
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-golang"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              k8s.container.name: Str(myapp)
+              k8s.deployment.name: Str(my-golang)
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-golang
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `0`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `0`): true
+    catch:
+      - podLogs:
+          selector: app=my-golang
+          container: otc-container
\ No newline at end of file
diff --git a/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/00-install-collector.yaml b/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/00-install-collector.yaml
index b07909ca..008be928 100644
--- a/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/00-install-collector.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/00-install-collector.yaml
@@ -1,17 +1,21 @@
-apiVersion: opentelemetry.io/v1alpha1
+apiVersion: opentelemetry.io/v1beta1
 kind: OpenTelemetryCollector
 metadata:
   name: sidecar
 spec:
-  config: |
+  config:
     receivers:
       otlp:
         protocols:
-          grpc:
-          http:
-    processors:
+          grpc: {}
+          http: {}
+
+    processors: {}
+
     exporters:
       debug:
+        verbosity: detailed
+
     service:
       pipelines:
         traces:
diff --git a/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/00-install-instrumentation.yaml b/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/00-install-instrumentation.yaml
index 9c8297f8..fef3bbaa 100644
--- a/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/00-install-instrumentation.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/00-install-instrumentation.yaml
@@ -3,14 +3,22 @@ kind: Instrumentation
 metadata:
   name: nginx
 spec:
+  env:
+    - name: OTEL_TRACES_EXPORTER
+      value: otlp
+    - name: OTEL_EXPORTER_OTLP_ENDPOINT
+      value: http://localhost:4317
+    - name: OTEL_EXPORTER_OTLP_TIMEOUT
+      value: "20000"
+    - name: OTEL_TRACES_SAMPLER
+      value: always_on
+    - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
+      value: "true"
   exporter:
     endpoint: http://localhost:4317
   propagators:
     - jaeger
     - b3
-  sampler:
-    type: parentbased_traceidratio
-    argument: "0.25"
   nginx:
     attrs:
     - name: NginxModuleOtelMaxQueueSize
diff --git a/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/01-assert.yaml b/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/01-assert.yaml
index 01b5a1cf..2eabd491 100644
--- a/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/01-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/01-assert.yaml
@@ -12,17 +12,27 @@ spec:
     - name: OTEL_NODE_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.hostIP
     - name: OTEL_POD_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.podIP
     - name: LD_LIBRARY_PATH
       value: /opt:/opt/opentelemetry-webserver/agent/sdk_lib/lib
-    - name: OTEL_SERVICE_NAME
-      value: my-nginx-contnr-secctx
+    - name: OTEL_TRACES_EXPORTER
+      value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
       value: http://localhost:4317
+    - name: OTEL_EXPORTER_OTLP_TIMEOUT
+      value: "20000"
+    - name: OTEL_TRACES_SAMPLER
+      value: always_on
+    - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
+      value: "true"
+    - name: OTEL_SERVICE_NAME
+      value: my-nginx-contnr-secctx
     - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME
       valueFrom:
         fieldRef:
@@ -35,12 +45,21 @@ spec:
           fieldPath: spec.nodeName
     - name: OTEL_PROPAGATORS
       value: jaeger,b3
-    - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.25"
     - name: OTEL_RESOURCE_ATTRIBUTES
     name: myapp
+    ports:
+    - containerPort: 8765
+      protocol: TCP
+    readinessProbe:
+      failureThreshold: 3
+      httpGet:
+        path: /
+        port: 8765
+        scheme: HTTP
+      initialDelaySeconds: 5
+      periodSeconds: 15
+      successThreshold: 1
+      timeoutSeconds: 2
     volumeMounts:
     - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
       readOnly: true
diff --git a/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/01-install-app.yaml b/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/01-install-app.yaml
index d1ae0e23..d7e3004f 100644
--- a/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/01-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/01-install-app.yaml
@@ -24,6 +24,15 @@ spec:
           runAsGroup: 3000
         ports:
         - containerPort: 8765
+        readinessProbe:
+          httpGet:
+            path: /
+            port: 8765
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
         env:
         - name: LD_LIBRARY_PATH
           value: /opt
@@ -83,11 +92,6 @@ data:
           proxy_pass http://localhost:8383/api/vendor/;
         }
 
-        location /seznam {
-          proxy_pass http://www.seznam.cz/;
-        }
       }
 
     }
-
----
diff --git a/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/chainsaw-test.yaml b/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/chainsaw-test.yaml
index 0975c5ec..3e3f2c7a 100755
--- a/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/chainsaw-test.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nginx-contnr-secctx/chainsaw-test.yaml
@@ -38,3 +38,80 @@ spec:
     catch:
       - podLogs:
           selector: app=my-nginx-contnr-secctx
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-nginx-contnr-secctx
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "8765"
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-nginx-contnr-secctx"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              k8s.container.name: Str(myapp)
+              k8s.deployment.name: Str(my-nginx-contnr-secctx)
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-nginx-contnr-secctx
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
+    catch:
+      - podLogs:
+          selector: app=my-nginx-contnr-secctx
+          container: otc-container
diff --git a/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/00-install-collector.yaml b/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/00-install-collector.yaml
index b07909ca..008be928 100644
--- a/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/00-install-collector.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/00-install-collector.yaml
@@ -1,17 +1,21 @@
-apiVersion: opentelemetry.io/v1alpha1
+apiVersion: opentelemetry.io/v1beta1
 kind: OpenTelemetryCollector
 metadata:
   name: sidecar
 spec:
-  config: |
+  config:
     receivers:
       otlp:
         protocols:
-          grpc:
-          http:
-    processors:
+          grpc: {}
+          http: {}
+
+    processors: {}
+
     exporters:
       debug:
+        verbosity: detailed
+
     service:
       pipelines:
         traces:
diff --git a/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/00-install-instrumentation.yaml b/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/00-install-instrumentation.yaml
index 1f5296bc..fef3bbaa 100644
--- a/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/00-install-instrumentation.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/00-install-instrumentation.yaml
@@ -1,19 +1,25 @@
-# skipping test, see https://github.com/open-telemetry/opentelemetry-operator/issues/1936
 apiVersion: opentelemetry.io/v1alpha1
 kind: Instrumentation
 metadata:
   name: nginx
 spec:
+  env:
+    - name: OTEL_TRACES_EXPORTER
+      value: otlp
+    - name: OTEL_EXPORTER_OTLP_ENDPOINT
+      value: http://localhost:4317
+    - name: OTEL_EXPORTER_OTLP_TIMEOUT
+      value: "20000"
+    - name: OTEL_TRACES_SAMPLER
+      value: always_on
+    - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
+      value: "true"
   exporter:
     endpoint: http://localhost:4317
   propagators:
     - jaeger
     - b3
-  sampler:
-    type: parentbased_traceidratio
-    argument: "0.25"
   nginx:
     attrs:
     - name: NginxModuleOtelMaxQueueSize
       value: "4096"
-
diff --git a/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/01-assert.yaml b/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/01-assert.yaml
index bb25e80b..d73441fe 100644
--- a/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/01-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/01-assert.yaml
@@ -22,10 +22,18 @@ spec:
           fieldPath: status.podIP
     - name: LD_LIBRARY_PATH
       value: /opt:/opt/opentelemetry-webserver/agent/sdk_lib/lib
-    - name: OTEL_SERVICE_NAME
-      value: my-nginx-multi
+    - name: OTEL_TRACES_EXPORTER
+      value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
       value: http://localhost:4317
+    - name: OTEL_EXPORTER_OTLP_TIMEOUT
+      value: "20000"
+    - name: OTEL_TRACES_SAMPLER
+      value: always_on
+    - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
+      value: "true"
+    - name: OTEL_SERVICE_NAME
+      value: my-nginx-multi
     - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME
       valueFrom:
         fieldRef:
@@ -38,12 +46,21 @@ spec:
           fieldPath: spec.nodeName
     - name: OTEL_PROPAGATORS
       value: jaeger,b3
-    - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.25"
     - name: OTEL_RESOURCE_ATTRIBUTES
     name: myapp
+    ports:
+    - containerPort: 8765
+      protocol: TCP
+    readinessProbe:
+      failureThreshold: 3
+      httpGet:
+        path: /
+        port: 8765
+        scheme: HTTP
+      initialDelaySeconds: 5
+      periodSeconds: 15
+      successThreshold: 1
+      timeoutSeconds: 2
     volumeMounts:
     - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
       readOnly: true
@@ -62,10 +79,18 @@ spec:
         fieldRef:
           apiVersion: v1
           fieldPath: status.podIP
-    - name: OTEL_SERVICE_NAME
-      value: my-nginx-multi
+    - name: OTEL_TRACES_EXPORTER
+      value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
       value: http://localhost:4317
+    - name: OTEL_EXPORTER_OTLP_TIMEOUT
+      value: "20000"
+    - name: OTEL_TRACES_SAMPLER
+      value: always_on
+    - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
+      value: "true"
+    - name: OTEL_SERVICE_NAME
+      value: my-nginx-multi
     - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME
       valueFrom:
         fieldRef:
@@ -78,10 +103,6 @@ spec:
           fieldPath: spec.nodeName
     - name: OTEL_PROPAGATORS
       value: jaeger,b3
-    - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.25"
     - name: OTEL_RESOURCE_ATTRIBUTES
     image: rabbitmq
     name: myrabbit
diff --git a/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/01-install-app.yaml b/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/01-install-app.yaml
index 3a50ecd5..5027bf08 100644
--- a/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/01-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/01-install-app.yaml
@@ -36,6 +36,15 @@ spec:
             drop: ["ALL"]
         ports:
         - containerPort: 8765
+        readinessProbe:
+          httpGet:
+            path: /
+            port: 8765
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
         env:
         - name: LD_LIBRARY_PATH
           value: /opt
@@ -106,11 +115,6 @@ data:
           proxy_pass http://localhost:8383/api/vendor/;
         }
 
-        location /seznam {
-          proxy_pass http://www.seznam.cz/;
-        }
       }
 
     }
-
----
diff --git a/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/02-assert.yaml b/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/02-assert.yaml
index 29a8ccc9..aa00bd53 100644
--- a/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/02-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/02-assert.yaml
@@ -33,10 +33,18 @@ spec:
           fieldPath: status.podIP
     - name: LD_LIBRARY_PATH
       value: /opt:/opt/opentelemetry-webserver/agent/sdk_lib/lib
-    - name: OTEL_SERVICE_NAME
-      value: my-nginx-multi
+    - name: OTEL_TRACES_EXPORTER
+      value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
       value: http://localhost:4317
+    - name: OTEL_EXPORTER_OTLP_TIMEOUT
+      value: "20000"
+    - name: OTEL_TRACES_SAMPLER
+      value: always_on
+    - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
+      value: "true"
+    - name: OTEL_SERVICE_NAME
+      value: my-nginx-multi
     - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME
       valueFrom:
         fieldRef:
@@ -49,12 +57,21 @@ spec:
           fieldPath: spec.nodeName
     - name: OTEL_PROPAGATORS
       value: jaeger,b3
-    - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.25"
     - name: OTEL_RESOURCE_ATTRIBUTES
     name: myapp
+    ports:
+    - containerPort: 8765
+      protocol: TCP
+    readinessProbe:
+      failureThreshold: 3
+      httpGet:
+        path: /
+        port: 8765
+        scheme: HTTP
+      initialDelaySeconds: 5
+      periodSeconds: 15
+      successThreshold: 1
+      timeoutSeconds: 2
     volumeMounts:
     - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
       readOnly: true
diff --git a/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/02-install-app.yaml b/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/02-install-app.yaml
index 0f2b3a82..fa6814e4 100644
--- a/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/02-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/02-install-app.yaml
@@ -36,6 +36,15 @@ spec:
             drop: ["ALL"]
         ports:
         - containerPort: 8765
+        readinessProbe:
+          httpGet:
+            path: /
+            port: 8765
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
         env:
         - name: LD_LIBRARY_PATH
           value: /opt
@@ -105,11 +114,6 @@ data:
           proxy_pass http://localhost:8383/api/vendor/;
         }
 
-        location /seznam {
-          proxy_pass http://www.seznam.cz/;
-        }
       }
 
     }
-
----
diff --git a/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/chainsaw-test.yaml b/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/chainsaw-test.yaml
index 14e2221d..12bbf077 100755
--- a/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/chainsaw-test.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nginx-multicontainer/chainsaw-test.yaml
@@ -38,12 +38,188 @@ spec:
     catch:
       - podLogs:
           selector: app=my-nginx-multi
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-nginx-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "8765"
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-nginx-multi"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              k8s.container.name: Str(myapp)
+              k8s.deployment.name: Str(my-nginx-multi)
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-nginx-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
+    catch:
+      - podLogs:
+          selector: app=my-nginx-multi
+          container: otc-container
   - name: step-02
     try:
+    - command:
+        entrypoint: kubectl
+        args:
+          - get
+          - pod
+          - -n
+          - ${NAMESPACE}
+          - -l
+          - app=my-nginx-multi
+          - -o
+          - jsonpath={.items[0].metadata.name}
+        outputs:
+        - name: podName
+          value: ($stdout)
     - apply:
         file: 02-install-app.yaml
     - assert:
         file: 02-assert.yaml
+    - wait:
+        apiVersion: v1
+        kind: Pod
+        name: ($podName)
+        namespace: ($namespace)
+        timeout: 1m
+        for:
+          deletion: {}
+    catch:
+      - podLogs:
+          selector: app=my-nginx-multi
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-nginx-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "8765"
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-nginx-multi"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              k8s.container.name: Str(myapp)
+              k8s.deployment.name: Str(my-nginx-multi)
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-nginx-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
     catch:
       - podLogs:
-          selector: app=my-nginx-multi
\ No newline at end of file
+          selector: app=my-nginx-multi
+          container: otc-container
diff --git a/tests/e2e-instrumentation/instrumentation-nginx/00-install-collector.yaml b/tests/e2e-instrumentation/instrumentation-nginx/00-install-collector.yaml
index b07909ca..008be928 100644
--- a/tests/e2e-instrumentation/instrumentation-nginx/00-install-collector.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nginx/00-install-collector.yaml
@@ -1,17 +1,21 @@
-apiVersion: opentelemetry.io/v1alpha1
+apiVersion: opentelemetry.io/v1beta1
 kind: OpenTelemetryCollector
 metadata:
   name: sidecar
 spec:
-  config: |
+  config:
     receivers:
       otlp:
         protocols:
-          grpc:
-          http:
-    processors:
+          grpc: {}
+          http: {}
+
+    processors: {}
+
     exporters:
       debug:
+        verbosity: detailed
+
     service:
       pipelines:
         traces:
diff --git a/tests/e2e-instrumentation/instrumentation-nginx/00-install-instrumentation.yaml b/tests/e2e-instrumentation/instrumentation-nginx/00-install-instrumentation.yaml
index 9c8297f8..fef3bbaa 100644
--- a/tests/e2e-instrumentation/instrumentation-nginx/00-install-instrumentation.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nginx/00-install-instrumentation.yaml
@@ -3,14 +3,22 @@ kind: Instrumentation
 metadata:
   name: nginx
 spec:
+  env:
+    - name: OTEL_TRACES_EXPORTER
+      value: otlp
+    - name: OTEL_EXPORTER_OTLP_ENDPOINT
+      value: http://localhost:4317
+    - name: OTEL_EXPORTER_OTLP_TIMEOUT
+      value: "20000"
+    - name: OTEL_TRACES_SAMPLER
+      value: always_on
+    - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
+      value: "true"
   exporter:
     endpoint: http://localhost:4317
   propagators:
     - jaeger
     - b3
-  sampler:
-    type: parentbased_traceidratio
-    argument: "0.25"
   nginx:
     attrs:
     - name: NginxModuleOtelMaxQueueSize
diff --git a/tests/e2e-instrumentation/instrumentation-nginx/01-assert.yaml b/tests/e2e-instrumentation/instrumentation-nginx/01-assert.yaml
index c5484ac5..86267b6d 100644
--- a/tests/e2e-instrumentation/instrumentation-nginx/01-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nginx/01-assert.yaml
@@ -12,17 +12,27 @@ spec:
     - name: OTEL_NODE_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.hostIP
     - name: OTEL_POD_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.podIP
     - name: LD_LIBRARY_PATH
       value: /opt:/opt/opentelemetry-webserver/agent/sdk_lib/lib
-    - name: OTEL_SERVICE_NAME
-      value: my-nginx
+    - name: OTEL_TRACES_EXPORTER
+      value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
       value: http://localhost:4317
+    - name: OTEL_EXPORTER_OTLP_TIMEOUT
+      value: "20000"
+    - name: OTEL_TRACES_SAMPLER
+      value: always_on
+    - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
+      value: "true"
+    - name: OTEL_SERVICE_NAME
+      value: my-nginx
     - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME
       valueFrom:
         fieldRef:
@@ -35,10 +45,6 @@ spec:
           fieldPath: spec.nodeName
     - name: OTEL_PROPAGATORS
       value: jaeger,b3
-    - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.25"
     - name: OTEL_RESOURCE_ATTRIBUTES
     lifecycle:
       postStart:
@@ -48,6 +54,19 @@ spec:
           - -c
           - echo Hello from the postStart handler
     name: myapp
+    ports:
+    - containerPort: 8765
+      protocol: TCP
+    readinessProbe:
+      failureThreshold: 3
+      httpGet:
+        path: /
+        port: 8765
+        scheme: HTTP
+      initialDelaySeconds: 5
+      periodSeconds: 15
+      successThreshold: 1
+      timeoutSeconds: 2
     volumeMounts:
     - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
       readOnly: true
diff --git a/tests/e2e-instrumentation/instrumentation-nginx/01-install-app.yaml b/tests/e2e-instrumentation/instrumentation-nginx/01-install-app.yaml
index 3ca305fa..45e533c1 100644
--- a/tests/e2e-instrumentation/instrumentation-nginx/01-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nginx/01-install-app.yaml
@@ -34,6 +34,15 @@ spec:
               command: ["/bin/sh", "-c", "echo Hello from the postStart handler"]
         ports:
         - containerPort: 8765
+        readinessProbe:
+          httpGet:
+            path: /
+            port: 8765
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
         env:
         - name: LD_LIBRARY_PATH
           value: /opt
@@ -93,11 +102,6 @@ data:
           proxy_pass http://localhost:8383/api/vendor/;
         }
 
-        location /seznam {
-          proxy_pass http://www.seznam.cz/;
-        }
       }
 
     }
-
----
diff --git a/tests/e2e-instrumentation/instrumentation-nginx/chainsaw-test.yaml b/tests/e2e-instrumentation/instrumentation-nginx/chainsaw-test.yaml
index 74095537..a2f12929 100755
--- a/tests/e2e-instrumentation/instrumentation-nginx/chainsaw-test.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nginx/chainsaw-test.yaml
@@ -38,3 +38,80 @@ spec:
     catch:
       - podLogs:
           selector: app=my-nginx
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-nginx
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "8765"
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-nginx"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              k8s.container.name: Str(myapp)
+              k8s.deployment.name: Str(my-nginx)
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-nginx
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
+    catch:
+      - podLogs:
+          selector: app=my-nginx
+          container: otc-container
diff --git a/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/00-install-collector.yaml b/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/00-install-collector.yaml
index 5db3bc0a..35568d28 100644
--- a/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/00-install-collector.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/00-install-collector.yaml
@@ -1,22 +1,27 @@
-apiVersion: opentelemetry.io/v1alpha1
+apiVersion: opentelemetry.io/v1beta1
 kind: OpenTelemetryCollector
 metadata:
   name: sidecar
 spec:
   mode: sidecar
-  config: |
+  config:
     receivers:
       otlp:
         protocols:
-          grpc:
-          http:
-    processors:
+          grpc: {}
+          http: {}
+
+    processors: {}
 
     exporters:
       debug:
+        verbosity: detailed
 
     service:
       pipelines:
         traces:
           receivers: [otlp]
           exporters: [debug]
+        metrics:
+          receivers: [otlp]
+          exporters: [debug]
diff --git a/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/00-install-instrumentation.yaml b/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/00-install-instrumentation.yaml
index f77a3f83..8b3b5a5b 100644
--- a/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/00-install-instrumentation.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/00-install-instrumentation.yaml
@@ -7,23 +7,20 @@ spec:
     - name: OTEL_TRACES_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
+      value: http://localhost:4318
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
+    - name: OTEL_METRICS_EXPORTER
+      value: otlp
   exporter:
-    endpoint: http://localhost:4317
+    endpoint: http://localhost:4318
   propagators:
     - jaeger
     - b3
-  sampler:
-    type: parentbased_traceidratio
-    argument: "0.25"
   java:
     env:
     - name: OTEL_JAVAAGENT_DEBUG
diff --git a/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/01-assert.yaml b/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/01-assert.yaml
index 7da5c156..83980a9c 100644
--- a/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/01-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/01-assert.yaml
@@ -13,10 +13,12 @@ spec:
     - name: OTEL_NODE_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.hostIP
     - name: OTEL_POD_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.podIP
     - name: NODE_PATH
       value: /usr/local/lib/node_modules
@@ -25,15 +27,15 @@ spec:
     - name: OTEL_TRACES_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
+      value: http://localhost:4318
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
+    - name: OTEL_METRICS_EXPORTER
+      value: otlp
     - name: OTEL_SERVICE_NAME
       value: my-nodejs-multi
     - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME
@@ -50,6 +52,9 @@ spec:
       value: jaeger,b3
     - name: OTEL_RESOURCE_ATTRIBUTES
     name: myapp
+    ports:
+    - containerPort: 3000
+      protocol: TCP
     volumeMounts:
     - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
       readOnly: true
@@ -59,25 +64,27 @@ spec:
     - name: OTEL_NODE_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.hostIP
     - name: OTEL_POD_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.podIP
     - name: NODE_OPTIONS
       value: ' --require /otel-auto-instrumentation-nodejs/autoinstrumentation.js'
     - name: OTEL_TRACES_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
+      value: http://localhost:4318
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
+    - name: OTEL_METRICS_EXPORTER
+      value: otlp
     - name: OTEL_SERVICE_NAME
       value: my-nodejs-multi
     - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME
diff --git a/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/01-install-app.yaml b/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/01-install-app.yaml
index ff12f3ec..850c5b17 100644
--- a/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/01-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/01-install-app.yaml
@@ -22,6 +22,8 @@ spec:
         fsGroup: 3000
       containers:
       - name: myapp
+        ports:
+        - containerPort: 3000
         image: ghcr.io/open-telemetry/opentelemetry-operator/e2e-test-app-nodejs:main
         securityContext:
           allowPrivilegeEscalation: false
@@ -30,6 +32,15 @@ spec:
         env:
         - name: NODE_PATH
           value: /usr/local/lib/node_modules
+        readinessProbe:
+          httpGet:
+            path: /rolldice
+            port: 3000
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
       - name: myrabbit
         image: rabbitmq:3
         securityContext:
diff --git a/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/02-assert.yaml b/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/02-assert.yaml
index 0738786a..36e73290 100644
--- a/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/02-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/02-assert.yaml
@@ -24,10 +24,12 @@ spec:
     - name: OTEL_NODE_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.hostIP
     - name: OTEL_POD_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.podIP
     - name: NODE_PATH
       value: /usr/local/lib/node_modules
@@ -36,15 +38,15 @@ spec:
     - name: OTEL_TRACES_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
+      value: http://localhost:4318
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
+    - name: OTEL_METRICS_EXPORTER
+      value: otlp
     - name: OTEL_SERVICE_NAME
       value: my-nodejs-multi
     - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME
@@ -61,6 +63,9 @@ spec:
       value: jaeger,b3
     - name: OTEL_RESOURCE_ATTRIBUTES
     name: myapp
+    ports:
+    - containerPort: 3000
+      protocol: TCP
     volumeMounts:
     - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
       readOnly: true
diff --git a/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/02-install-app.yaml b/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/02-install-app.yaml
index 64384984..44494b2a 100644
--- a/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/02-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/02-install-app.yaml
@@ -22,6 +22,8 @@ spec:
         fsGroup: 3000
       containers:
       - name: myapp
+        ports:
+        - containerPort: 3000
         image: ghcr.io/open-telemetry/opentelemetry-operator/e2e-test-app-nodejs:main
         securityContext:
           allowPrivilegeEscalation: false
@@ -30,6 +32,15 @@ spec:
         env:
         - name: NODE_PATH
           value: /usr/local/lib/node_modules
+        readinessProbe:
+          httpGet:
+            path: /rolldice
+            port: 3000
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
       - name: myrabbit
         image: rabbitmq:3
         securityContext:
diff --git a/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/chainsaw-test.yaml b/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/chainsaw-test.yaml
index 6fa16cf1..c2dac193 100755
--- a/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/chainsaw-test.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nodejs-multicontainer/chainsaw-test.yaml
@@ -40,12 +40,197 @@ spec:
     catch:
       - podLogs:
           selector: app=my-nodejs-multi
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-nodejs-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "3000"
+          path: /rolldice
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-nodejs-multi"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              Name: http.server.duration
+              Description: Measures the duration of inbound HTTP requests
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-nodejs-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_metric_points_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_metric_points_total'].value | [0] > `1`): true
+    catch:
+      - podLogs:
+          selector: app=my-nodejs-multi
+          container: otc-container
   - name: step-02
     try:
+    - command:
+        env:
+        - name: appnamespace
+          value: ($namespace)
+        entrypoint: kubectl
+        args:
+          - get
+          - pod
+          - -n
+          - $appnamespace
+          - -l
+          - app=my-nodejs-multi
+          - -o
+          - jsonpath={.items[0].metadata.name}
+        outputs:
+        - name: podName
+          value: ($stdout)
     - apply:
         file: 02-install-app.yaml
     - assert:
         file: 02-assert.yaml
+    - wait:
+        apiVersion: v1
+        kind: Pod
+        name: ($podName)
+        namespace: ($namespace)
+        timeout: 1m
+        for:
+          deletion: {}
+    catch:
+      - podLogs:
+          selector: app=my-nodejs-multi
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-nodejs-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "3000"
+          path: /rolldice
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-nodejs-multi"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              Name: http.server.duration
+              Description: Measures the duration of inbound HTTP requests
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-nodejs-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_metric_points_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_metric_points_total'].value | [0] > `1`): true
     catch:
       - podLogs:
           selector: app=my-nodejs-multi
+          container: otc-container
diff --git a/tests/e2e-instrumentation/instrumentation-nodejs-volume/00-install-collector.yaml b/tests/e2e-instrumentation/instrumentation-nodejs-volume/00-install-collector.yaml
index 34a26ebb..e32ff2b4 100644
--- a/tests/e2e-instrumentation/instrumentation-nodejs-volume/00-install-collector.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nodejs-volume/00-install-collector.yaml
@@ -1,22 +1,27 @@
-apiVersion: opentelemetry.io/v1alpha1
+apiVersion: opentelemetry.io/v1beta1
 kind: OpenTelemetryCollector
 metadata:
   name: sidecar
 spec:
-  config: |
+  config:
     receivers:
       otlp:
         protocols:
-          grpc:
-          http:
-    processors:
+          grpc: {}
+          http: {}
+
+    processors: {}
 
     exporters:
       debug:
+        verbosity: detailed
 
     service:
       pipelines:
         traces:
           receivers: [otlp]
           exporters: [debug]
+        metrics:
+          receivers: [otlp]
+          exporters: [debug]
   mode: sidecar
diff --git a/tests/e2e-instrumentation/instrumentation-nodejs-volume/00-install-instrumentation.yaml b/tests/e2e-instrumentation/instrumentation-nodejs-volume/00-install-instrumentation.yaml
index 06c5c8dd..58a57648 100644
--- a/tests/e2e-instrumentation/instrumentation-nodejs-volume/00-install-instrumentation.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nodejs-volume/00-install-instrumentation.yaml
@@ -7,25 +7,20 @@ spec:
     - name: OTEL_TRACES_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
+      value: http://localhost:4318
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
     - name: OTEL_METRICS_EXPORTER
-      value: prometheus
+      value: otlp
   exporter:
-    endpoint: http://localhost:4317
+    endpoint: http://localhost:4318
   propagators:
     - jaeger
     - b3
-  sampler:
-    type: parentbased_traceidratio
-    argument: "0.25"
   nodejs:
     env:
       - name: OTEL_NODEJS_DEBUG
diff --git a/tests/e2e-instrumentation/instrumentation-nodejs-volume/01-assert.yaml b/tests/e2e-instrumentation/instrumentation-nodejs-volume/01-assert.yaml
index 83e32efc..7c841a05 100644
--- a/tests/e2e-instrumentation/instrumentation-nodejs-volume/01-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nodejs-volume/01-assert.yaml
@@ -8,57 +8,58 @@ metadata:
     app: my-nodejs
 spec:
   containers:
-    - env:
-        - name: OTEL_NODE_IP
-          valueFrom:
-            fieldRef:
-              fieldPath: status.hostIP
-        - name: OTEL_POD_IP
-          valueFrom:
-            fieldRef:
-              fieldPath: status.podIP
-        - name: NODE_PATH
-          value: /usr/local/lib/node_modules
-        - name: OTEL_NODEJS_DEBUG
-          value: "true"
-        - name: NODE_OPTIONS
-          value: " --require /otel-auto-instrumentation-nodejs/autoinstrumentation.js"
-        - name: OTEL_TRACES_EXPORTER
-          value: otlp
-        - name: OTEL_EXPORTER_OTLP_ENDPOINT
-          value: http://localhost:4317
-        - name: OTEL_EXPORTER_OTLP_TIMEOUT
-          value: "20"
-        - name: OTEL_TRACES_SAMPLER
-          value: parentbased_traceidratio
-        - name: OTEL_TRACES_SAMPLER_ARG
-          value: "0.85"
-        - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
-          value: "true"
-        - name: OTEL_METRICS_EXPORTER
-          value: prometheus
-        - name: OTEL_SERVICE_NAME
-          value: my-nodejs
-        - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME
-          valueFrom:
-            fieldRef:
-              apiVersion: v1
-              fieldPath: metadata.name
-        - name: OTEL_RESOURCE_ATTRIBUTES_NODE_NAME
-          valueFrom:
-            fieldRef:
-              apiVersion: v1
-              fieldPath: spec.nodeName
-        - name: OTEL_PROPAGATORS
-          value: jaeger,b3
-        - name: OTEL_RESOURCE_ATTRIBUTES
-      name: myapp
-      volumeMounts:
-        - mountPath: /otel-auto-instrumentation-nodejs
-          name: opentelemetry-auto-instrumentation-nodejs
-    - args:
-        - --config=env:OTEL_CONFIG
-      name: otc-container
+  - env:
+      - name: OTEL_NODE_IP
+        valueFrom:
+          fieldRef:
+            fieldPath: status.hostIP
+      - name: OTEL_POD_IP
+        valueFrom:
+          fieldRef:
+            fieldPath: status.podIP
+      - name: NODE_PATH
+        value: /usr/local/lib/node_modules
+      - name: OTEL_NODEJS_DEBUG
+        value: "true"
+      - name: NODE_OPTIONS
+        value: " --require /otel-auto-instrumentation-nodejs/autoinstrumentation.js"
+      - name: OTEL_TRACES_EXPORTER
+        value: otlp
+      - name: OTEL_EXPORTER_OTLP_ENDPOINT
+        value: http://localhost:4318
+      - name: OTEL_EXPORTER_OTLP_TIMEOUT
+        value: "20000"
+      - name: OTEL_TRACES_SAMPLER
+        value: always_on
+      - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
+        value: "true"
+      - name: OTEL_METRICS_EXPORTER
+        value: otlp
+      - name: OTEL_SERVICE_NAME
+        value: my-nodejs
+      - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME
+        valueFrom:
+          fieldRef:
+            apiVersion: v1
+            fieldPath: metadata.name
+      - name: OTEL_RESOURCE_ATTRIBUTES_NODE_NAME
+        valueFrom:
+          fieldRef:
+            apiVersion: v1
+            fieldPath: spec.nodeName
+      - name: OTEL_PROPAGATORS
+        value: jaeger,b3
+      - name: OTEL_RESOURCE_ATTRIBUTES
+    name: myapp
+    ports:
+    - containerPort: 3000
+      protocol: TCP
+    volumeMounts:
+      - mountPath: /otel-auto-instrumentation-nodejs
+        name: opentelemetry-auto-instrumentation-nodejs
+  - args:
+      - --config=env:OTEL_CONFIG
+    name: otc-container
   initContainers:
     - name: opentelemetry-auto-instrumentation-nodejs
   volumes:
diff --git a/tests/e2e-instrumentation/instrumentation-nodejs-volume/01-install-app.yaml b/tests/e2e-instrumentation/instrumentation-nodejs-volume/01-install-app.yaml
index b219006d..9865bff9 100644
--- a/tests/e2e-instrumentation/instrumentation-nodejs-volume/01-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nodejs-volume/01-install-app.yaml
@@ -21,11 +21,22 @@ spec:
         fsGroup: 3000
       containers:
       - name: myapp
+        ports:
+        - containerPort: 3000
         image: ghcr.io/open-telemetry/opentelemetry-operator/e2e-test-app-nodejs:main
         securityContext:
           allowPrivilegeEscalation: false
           capabilities:
             drop: ["ALL"]
+        readinessProbe:
+          httpGet:
+            path: /rolldice
+            port: 3000
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
         env:
         - name: NODE_PATH
           value: /usr/local/lib/node_modules
diff --git a/tests/e2e-instrumentation/instrumentation-nodejs-volume/chainsaw-test.yaml b/tests/e2e-instrumentation/instrumentation-nodejs-volume/chainsaw-test.yaml
index 7156d05d..88a67991 100755
--- a/tests/e2e-instrumentation/instrumentation-nodejs-volume/chainsaw-test.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nodejs-volume/chainsaw-test.yaml
@@ -38,3 +38,83 @@ spec:
     catch:
       - podLogs:
           selector: app=my-nodejs
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-nodejs
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "3000"
+          path: /rolldice
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-nodejs"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              Name: http.server.duration
+              Description: Measures the duration of inbound HTTP requests
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-nodejs
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_metric_points_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_metric_points_total'].value | [0] > `1`): true
+    catch:
+      - podLogs:
+          selector: app=my-nodejs
+          container: otc-container
diff --git a/tests/e2e-instrumentation/instrumentation-nodejs/00-install-collector.yaml b/tests/e2e-instrumentation/instrumentation-nodejs/00-install-collector.yaml
index 34a26ebb..e32ff2b4 100644
--- a/tests/e2e-instrumentation/instrumentation-nodejs/00-install-collector.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nodejs/00-install-collector.yaml
@@ -1,22 +1,27 @@
-apiVersion: opentelemetry.io/v1alpha1
+apiVersion: opentelemetry.io/v1beta1
 kind: OpenTelemetryCollector
 metadata:
   name: sidecar
 spec:
-  config: |
+  config:
     receivers:
       otlp:
         protocols:
-          grpc:
-          http:
-    processors:
+          grpc: {}
+          http: {}
+
+    processors: {}
 
     exporters:
       debug:
+        verbosity: detailed
 
     service:
       pipelines:
         traces:
           receivers: [otlp]
           exporters: [debug]
+        metrics:
+          receivers: [otlp]
+          exporters: [debug]
   mode: sidecar
diff --git a/tests/e2e-instrumentation/instrumentation-nodejs/00-install-instrumentation.yaml b/tests/e2e-instrumentation/instrumentation-nodejs/00-install-instrumentation.yaml
index a87939b6..2ee50bc7 100644
--- a/tests/e2e-instrumentation/instrumentation-nodejs/00-install-instrumentation.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nodejs/00-install-instrumentation.yaml
@@ -7,27 +7,21 @@ spec:
     - name: OTEL_TRACES_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
+      value: http://localhost:4318
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
     - name: OTEL_METRICS_EXPORTER
-      value: prometheus
+      value: otlp
   exporter:
-    endpoint: http://localhost:4317
+    endpoint: http://localhost:4318
   propagators:
     - jaeger
     - b3
-  sampler:
-    type: parentbased_traceidratio
-    argument: "0.25"
   nodejs:
     env:
       - name: OTEL_NODEJS_DEBUG
         value: "true"
-
diff --git a/tests/e2e-instrumentation/instrumentation-nodejs/01-assert.yaml b/tests/e2e-instrumentation/instrumentation-nodejs/01-assert.yaml
index 719727ca..88bf5294 100644
--- a/tests/e2e-instrumentation/instrumentation-nodejs/01-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nodejs/01-assert.yaml
@@ -26,17 +26,15 @@ spec:
     - name: OTEL_TRACES_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
+      value: http://localhost:4318
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
     - name: OTEL_METRICS_EXPORTER
-      value: prometheus
+      value: otlp
     - name: OTEL_SERVICE_NAME
       value: my-nodejs
     - name: OTEL_RESOURCE_ATTRIBUTES_POD_NAME
@@ -53,6 +51,9 @@ spec:
       value: jaeger,b3
     - name: OTEL_RESOURCE_ATTRIBUTES
     name: myapp
+    ports:
+    - containerPort: 3000
+      protocol: TCP
     volumeMounts:
     - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
       readOnly: true
diff --git a/tests/e2e-instrumentation/instrumentation-nodejs/01-install-app.yaml b/tests/e2e-instrumentation/instrumentation-nodejs/01-install-app.yaml
index 45de0d5f..7efff21d 100644
--- a/tests/e2e-instrumentation/instrumentation-nodejs/01-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nodejs/01-install-app.yaml
@@ -21,6 +21,8 @@ spec:
         fsGroup: 3000
       containers:
       - name: myapp
+        ports:
+        - containerPort: 3000
         image: ghcr.io/open-telemetry/opentelemetry-operator/e2e-test-app-nodejs:main
         securityContext:
           allowPrivilegeEscalation: false
@@ -29,3 +31,12 @@ spec:
         env:
         - name: NODE_PATH
           value: /usr/local/lib/node_modules
+        readinessProbe:
+          httpGet:
+            path: /rolldice
+            port: 3000
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
\ No newline at end of file
diff --git a/tests/e2e-instrumentation/instrumentation-nodejs/chainsaw-test.yaml b/tests/e2e-instrumentation/instrumentation-nodejs/chainsaw-test.yaml
index 1ea41762..9e5a20cc 100755
--- a/tests/e2e-instrumentation/instrumentation-nodejs/chainsaw-test.yaml
+++ b/tests/e2e-instrumentation/instrumentation-nodejs/chainsaw-test.yaml
@@ -38,3 +38,83 @@ spec:
     catch:
       - podLogs:
           selector: app=my-nodejs
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-nodejs
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "3000"
+          path: /rolldice
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-nodejs"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              Name: http.server.duration
+              Description: Measures the duration of inbound HTTP requests
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-nodejs
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_metric_points_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_metric_points_total'].value | [0] > `1`): true
+    catch:
+      - podLogs:
+          selector: app=my-nodejs
+          container: otc-container
\ No newline at end of file
diff --git a/tests/e2e-instrumentation/instrumentation-python-multicontainer/00-install-collector.yaml b/tests/e2e-instrumentation/instrumentation-python-multicontainer/00-install-collector.yaml
index 964ffb04..35568d28 100644
--- a/tests/e2e-instrumentation/instrumentation-python-multicontainer/00-install-collector.yaml
+++ b/tests/e2e-instrumentation/instrumentation-python-multicontainer/00-install-collector.yaml
@@ -1,24 +1,27 @@
-apiVersion: opentelemetry.io/v1alpha1
+apiVersion: opentelemetry.io/v1beta1
 kind: OpenTelemetryCollector
 metadata:
   name: sidecar
 spec:
   mode: sidecar
-  config: |
+  config:
     receivers:
       otlp:
         protocols:
-          grpc:
-            endpoint: 0.0.0.0:4317
-          http:
-            endpoint: 0.0.0.0:4318
-    processors:
+          grpc: {}
+          http: {}
+
+    processors: {}
 
     exporters:
       debug:
+        verbosity: detailed
 
     service:
       pipelines:
         traces:
           receivers: [otlp]
           exporters: [debug]
+        metrics:
+          receivers: [otlp]
+          exporters: [debug]
diff --git a/tests/e2e-instrumentation/instrumentation-python-multicontainer/00-install-instrumentation.yaml b/tests/e2e-instrumentation/instrumentation-python-multicontainer/00-install-instrumentation.yaml
index f77a3f83..a38f3bfe 100644
--- a/tests/e2e-instrumentation/instrumentation-python-multicontainer/00-install-instrumentation.yaml
+++ b/tests/e2e-instrumentation/instrumentation-python-multicontainer/00-install-instrumentation.yaml
@@ -1,19 +1,13 @@
 apiVersion: opentelemetry.io/v1alpha1
 kind: Instrumentation
 metadata:
-  name: java
+  name: python-multi
 spec:
   env:
-    - name: OTEL_TRACES_EXPORTER
-      value: otlp
-    - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
   exporter:
@@ -24,11 +18,11 @@ spec:
   sampler:
     type: parentbased_traceidratio
     argument: "0.25"
-  java:
+  python:
     env:
-    - name: OTEL_JAVAAGENT_DEBUG
-      value: "true"
-    - name: OTEL_INSTRUMENTATION_JDBC_ENABLED
-      value: "false"
-    - name: SPLUNK_PROFILER_ENABLED
-      value: "false"
+      - name: OTEL_LOG_LEVEL
+        value: "debug"
+      - name: OTEL_TRACES_EXPORTER
+        value: otlp
+      - name: OTEL_EXPORTER_OTLP_ENDPOINT
+        value: http://localhost:4318
diff --git a/tests/e2e-instrumentation/instrumentation-python-multicontainer/01-assert.yaml b/tests/e2e-instrumentation/instrumentation-python-multicontainer/01-assert.yaml
index 72f6e7e7..035efb39 100644
--- a/tests/e2e-instrumentation/instrumentation-python-multicontainer/01-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-python-multicontainer/01-assert.yaml
@@ -4,38 +4,38 @@ metadata:
   annotations:
     instrumentation.opentelemetry.io/container-names: myapp,myrabbit
     instrumentation.opentelemetry.io/inject-python: "true"
-    sidecar.opentelemetry.io/inject: "true"
-  labels:
-    app: my-python-multi
+    instrumentation.opentelemetry.io/otel-python-platform: musl
 spec:
   containers:
   - env:
     - name: OTEL_NODE_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.hostIP
     - name: OTEL_POD_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.podIP
+    - name: OTEL_LOG_LEVEL
+      value: debug
+    - name: OTEL_TRACES_EXPORTER
+      value: otlp
+    - name: OTEL_EXPORTER_OTLP_ENDPOINT
+      value: http://localhost:4318
     - name: PYTHONPATH
       value: /otel-auto-instrumentation-python/opentelemetry/instrumentation/auto_instrumentation:/otel-auto-instrumentation-python
     - name: OTEL_EXPORTER_OTLP_PROTOCOL
       value: http/protobuf
-    - name: OTEL_TRACES_EXPORTER
-      value: otlp
     - name: OTEL_METRICS_EXPORTER
       value: otlp
     - name: OTEL_LOGS_EXPORTER
       value: otlp
-    - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
     - name: OTEL_SERVICE_NAME
@@ -54,6 +54,9 @@ spec:
       value: jaeger,b3
     - name: OTEL_RESOURCE_ATTRIBUTES
     name: myapp
+    ports:
+    - containerPort: 8080
+      protocol: TCP
     volumeMounts:
     - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
       readOnly: true
@@ -63,29 +66,31 @@ spec:
     - name: OTEL_NODE_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.hostIP
     - name: OTEL_POD_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.podIP
+    - name: OTEL_LOG_LEVEL
+      value: debug
+    - name: OTEL_TRACES_EXPORTER
+      value: otlp
+    - name: OTEL_EXPORTER_OTLP_ENDPOINT
+      value: http://localhost:4318
     - name: PYTHONPATH
       value: /otel-auto-instrumentation-python/opentelemetry/instrumentation/auto_instrumentation:/otel-auto-instrumentation-python
     - name: OTEL_EXPORTER_OTLP_PROTOCOL
       value: http/protobuf
-    - name: OTEL_TRACES_EXPORTER
-      value: otlp
     - name: OTEL_METRICS_EXPORTER
       value: otlp
     - name: OTEL_LOGS_EXPORTER
       value: otlp
-    - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
     - name: OTEL_SERVICE_NAME
diff --git a/tests/e2e-instrumentation/instrumentation-python-multicontainer/01-install-app.yaml b/tests/e2e-instrumentation/instrumentation-python-multicontainer/01-install-app.yaml
index 02979df3..6824f218 100644
--- a/tests/e2e-instrumentation/instrumentation-python-multicontainer/01-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-python-multicontainer/01-install-app.yaml
@@ -15,6 +15,7 @@ spec:
         sidecar.opentelemetry.io/inject: "true"
         instrumentation.opentelemetry.io/inject-python: "true"
         instrumentation.opentelemetry.io/container-names: "myapp,myrabbit"
+        instrumentation.opentelemetry.io/otel-python-platform: "musl"
     spec:
       securityContext:
         runAsUser: 1000
@@ -22,11 +23,22 @@ spec:
         fsGroup: 3000
       containers:
       - name: myapp
+        ports:
+        - containerPort: 8080
         image: ghcr.io/open-telemetry/opentelemetry-operator/e2e-test-app-python:main
         securityContext:
           allowPrivilegeEscalation: false
           capabilities:
             drop: ["ALL"]
+        readinessProbe:
+          httpGet:
+            path: /
+            port: 8080
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
       - name: myrabbit
         image: rabbitmq:3
         securityContext:
diff --git a/tests/e2e-instrumentation/instrumentation-python-multicontainer/02-assert.yaml b/tests/e2e-instrumentation/instrumentation-python-multicontainer/02-assert.yaml
index 5e2cbf06..0932fa12 100644
--- a/tests/e2e-instrumentation/instrumentation-python-multicontainer/02-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-python-multicontainer/02-assert.yaml
@@ -15,6 +15,7 @@ metadata:
   annotations:
     instrumentation.opentelemetry.io/container-names: myapp
     instrumentation.opentelemetry.io/inject-python: "true"
+    instrumentation.opentelemetry.io/otel-python-platform: musl
     sidecar.opentelemetry.io/inject: "true"
   labels:
     app: my-python-multi
@@ -24,29 +25,31 @@ spec:
     - name: OTEL_NODE_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.hostIP
     - name: OTEL_POD_IP
       valueFrom:
         fieldRef:
+          apiVersion: v1
           fieldPath: status.podIP
+    - name: OTEL_LOG_LEVEL
+      value: debug
+    - name: OTEL_TRACES_EXPORTER
+      value: otlp
+    - name: OTEL_EXPORTER_OTLP_ENDPOINT
+      value: http://localhost:4318
     - name: PYTHONPATH
       value: /otel-auto-instrumentation-python/opentelemetry/instrumentation/auto_instrumentation:/otel-auto-instrumentation-python
     - name: OTEL_EXPORTER_OTLP_PROTOCOL
       value: http/protobuf
-    - name: OTEL_TRACES_EXPORTER
-      value: otlp
     - name: OTEL_METRICS_EXPORTER
       value: otlp
     - name: OTEL_LOGS_EXPORTER
       value: otlp
-    - name: OTEL_EXPORTER_OTLP_ENDPOINT
-      value: http://localhost:4317
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
     - name: OTEL_SERVICE_NAME
@@ -65,6 +68,9 @@ spec:
       value: jaeger,b3
     - name: OTEL_RESOURCE_ATTRIBUTES
     name: myapp
+    ports:
+    - containerPort: 8080
+      protocol: TCP
     volumeMounts:
     - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
       readOnly: true
diff --git a/tests/e2e-instrumentation/instrumentation-python-multicontainer/02-install-app.yaml b/tests/e2e-instrumentation/instrumentation-python-multicontainer/02-install-app.yaml
index b8f58b7e..6da9a0f9 100644
--- a/tests/e2e-instrumentation/instrumentation-python-multicontainer/02-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-python-multicontainer/02-install-app.yaml
@@ -15,6 +15,7 @@ spec:
         sidecar.opentelemetry.io/inject: "true"
         instrumentation.opentelemetry.io/inject-python: "true"
         instrumentation.opentelemetry.io/container-names: "myapp"
+        instrumentation.opentelemetry.io/otel-python-platform: "musl"
     spec:
       securityContext:
         runAsUser: 1000
@@ -22,11 +23,22 @@ spec:
         fsGroup: 3000
       containers:
       - name: myapp
+        ports:
+        - containerPort: 8080
         image: ghcr.io/open-telemetry/opentelemetry-operator/e2e-test-app-python:main
         securityContext:
           allowPrivilegeEscalation: false
           capabilities:
             drop: ["ALL"]
+        readinessProbe:
+          httpGet:
+            path: /
+            port: 8080
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
       - name: myrabbit
         image: rabbitmq:3
         securityContext:
diff --git a/tests/e2e-instrumentation/instrumentation-python-multicontainer/chainsaw-test.yaml b/tests/e2e-instrumentation/instrumentation-python-multicontainer/chainsaw-test.yaml
index 830f8e82..f6d9efcd 100755
--- a/tests/e2e-instrumentation/instrumentation-python-multicontainer/chainsaw-test.yaml
+++ b/tests/e2e-instrumentation/instrumentation-python-multicontainer/chainsaw-test.yaml
@@ -40,12 +40,192 @@ spec:
     catch:
       - podLogs:
           selector: app=my-python-multi
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-python-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "8080"
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-python-multi"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              Name: system.memory.usage
+              Description: System memory usage
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-python-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_metric_points_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_metric_points_total'].value | [0] > `1`): true
+    catch:
+      - podLogs:
+          selector: app=my-python-multi
+          container: otc-container
   - name: step-02
     try:
+    - command:
+        entrypoint: kubectl
+        args:
+          - get
+          - pod
+          - -n
+          - ${NAMESPACE}
+          - -l
+          - app=my-python-multi
+          - -o
+          - jsonpath={.items[0].metadata.name}
+        outputs:
+        - name: podName
+          value: ($stdout)
     - apply:
         file: 02-install-app.yaml
     - assert:
         file: 02-assert.yaml
+    - wait:
+        apiVersion: v1
+        kind: Pod
+        name: ($podName)
+        namespace: ($namespace)
+        timeout: 1m
+        for:
+          deletion: {}
+    catch:
+      - podLogs:
+          selector: app=my-python-multi
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-python-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "8080"
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-python-multi"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              Name: system.memory.usage
+              Description: System memory usage
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-python-multi
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_metric_points_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_metric_points_total'].value | [0] > `1`): true
     catch:
       - podLogs:
           selector: app=my-python-multi
+          container: otc-container
diff --git a/tests/e2e-instrumentation/instrumentation-python-musl/00-install-collector.yaml b/tests/e2e-instrumentation/instrumentation-python-musl/00-install-collector.yaml
index 34a26ebb..e32ff2b4 100644
--- a/tests/e2e-instrumentation/instrumentation-python-musl/00-install-collector.yaml
+++ b/tests/e2e-instrumentation/instrumentation-python-musl/00-install-collector.yaml
@@ -1,22 +1,27 @@
-apiVersion: opentelemetry.io/v1alpha1
+apiVersion: opentelemetry.io/v1beta1
 kind: OpenTelemetryCollector
 metadata:
   name: sidecar
 spec:
-  config: |
+  config:
     receivers:
       otlp:
         protocols:
-          grpc:
-          http:
-    processors:
+          grpc: {}
+          http: {}
+
+    processors: {}
 
     exporters:
       debug:
+        verbosity: detailed
 
     service:
       pipelines:
         traces:
           receivers: [otlp]
           exporters: [debug]
+        metrics:
+          receivers: [otlp]
+          exporters: [debug]
   mode: sidecar
diff --git a/tests/e2e-instrumentation/instrumentation-python-musl/00-install-instrumentation.yaml b/tests/e2e-instrumentation/instrumentation-python-musl/00-install-instrumentation.yaml
index 987cddac..623c2ec0 100644
--- a/tests/e2e-instrumentation/instrumentation-python-musl/00-install-instrumentation.yaml
+++ b/tests/e2e-instrumentation/instrumentation-python-musl/00-install-instrumentation.yaml
@@ -5,11 +5,9 @@ metadata:
 spec:
   env:
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
   exporter:
diff --git a/tests/e2e-instrumentation/instrumentation-python-musl/01-assert.yaml b/tests/e2e-instrumentation/instrumentation-python-musl/01-assert.yaml
index 2485a7e6..1e35e0c6 100644
--- a/tests/e2e-instrumentation/instrumentation-python-musl/01-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-python-musl/01-assert.yaml
@@ -33,11 +33,9 @@ spec:
     - name: OTEL_LOGS_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
     - name: OTEL_SERVICE_NAME
@@ -56,6 +54,9 @@ spec:
       value: jaeger,b3
     - name: OTEL_RESOURCE_ATTRIBUTES
     name: myapp
+    ports:
+    - containerPort: 8080
+      protocol: TCP
     volumeMounts:
     - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
       readOnly: true
diff --git a/tests/e2e-instrumentation/instrumentation-python-musl/01-install-app.yaml b/tests/e2e-instrumentation/instrumentation-python-musl/01-install-app.yaml
index 3dbca9a6..df929729 100644
--- a/tests/e2e-instrumentation/instrumentation-python-musl/01-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-python-musl/01-install-app.yaml
@@ -22,8 +22,19 @@ spec:
         fsGroup: 3000
       containers:
       - name: myapp
+        ports:
+        - containerPort: 8080
         image: ghcr.io/open-telemetry/opentelemetry-operator/e2e-test-app-python:main
         securityContext:
           allowPrivilegeEscalation: false
           capabilities:
             drop: ["ALL"]
+        readinessProbe:
+          httpGet:
+            path: /
+            port: 8080
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
\ No newline at end of file
diff --git a/tests/e2e-instrumentation/instrumentation-python-musl/chainsaw-test.yaml b/tests/e2e-instrumentation/instrumentation-python-musl/chainsaw-test.yaml
index 89799f23..5743a8bc 100755
--- a/tests/e2e-instrumentation/instrumentation-python-musl/chainsaw-test.yaml
+++ b/tests/e2e-instrumentation/instrumentation-python-musl/chainsaw-test.yaml
@@ -38,3 +38,82 @@ spec:
     catch:
       - podLogs:
           selector: app=my-python-musl
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-python-musl
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "8080"
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-python-musl"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              Name: system.memory.usage
+              Description: System memory usage
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-python-musl
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_metric_points_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_metric_points_total'].value | [0] > `1`): true
+    catch:
+      - podLogs:
+          selector: app=my-python-musl
+          container: otc-container
diff --git a/tests/e2e-instrumentation/instrumentation-python/00-install-collector.yaml b/tests/e2e-instrumentation/instrumentation-python/00-install-collector.yaml
index 34a26ebb..008be928 100644
--- a/tests/e2e-instrumentation/instrumentation-python/00-install-collector.yaml
+++ b/tests/e2e-instrumentation/instrumentation-python/00-install-collector.yaml
@@ -1,18 +1,20 @@
-apiVersion: opentelemetry.io/v1alpha1
+apiVersion: opentelemetry.io/v1beta1
 kind: OpenTelemetryCollector
 metadata:
   name: sidecar
 spec:
-  config: |
+  config:
     receivers:
       otlp:
         protocols:
-          grpc:
-          http:
-    processors:
+          grpc: {}
+          http: {}
+
+    processors: {}
 
     exporters:
       debug:
+        verbosity: detailed
 
     service:
       pipelines:
diff --git a/tests/e2e-instrumentation/instrumentation-python/00-install-instrumentation.yaml b/tests/e2e-instrumentation/instrumentation-python/00-install-instrumentation.yaml
index a2b7d65a..9dd8091d 100644
--- a/tests/e2e-instrumentation/instrumentation-python/00-install-instrumentation.yaml
+++ b/tests/e2e-instrumentation/instrumentation-python/00-install-instrumentation.yaml
@@ -5,11 +5,9 @@ metadata:
 spec:
   env:
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
   exporter:
@@ -28,3 +26,7 @@ spec:
         value: otlp
       - name: OTEL_EXPORTER_OTLP_ENDPOINT
         value: http://localhost:4318
+      # Disabling system_metrics instrumenation as the test app is built using Alpine
+      # Instrumentation with metrics is tested in test instrumenation-python-musl
+      - name: OTEL_PYTHON_DISABLED_INSTRUMENTATIONS
+        value: "system_metrics"
diff --git a/tests/e2e-instrumentation/instrumentation-python/01-assert.yaml b/tests/e2e-instrumentation/instrumentation-python/01-assert.yaml
index 94ff9058..e3743ee0 100644
--- a/tests/e2e-instrumentation/instrumentation-python/01-assert.yaml
+++ b/tests/e2e-instrumentation/instrumentation-python/01-assert.yaml
@@ -23,6 +23,8 @@ spec:
       value: otlp
     - name: OTEL_EXPORTER_OTLP_ENDPOINT
       value: http://localhost:4318
+    - name: OTEL_PYTHON_DISABLED_INSTRUMENTATIONS
+      value: system_metrics
     - name: PYTHONPATH
       value: /otel-auto-instrumentation-python/opentelemetry/instrumentation/auto_instrumentation:/otel-auto-instrumentation-python
     - name: OTEL_EXPORTER_OTLP_PROTOCOL
@@ -32,11 +34,9 @@ spec:
     - name: OTEL_LOGS_EXPORTER
       value: otlp
     - name: OTEL_EXPORTER_OTLP_TIMEOUT
-      value: "20"
+      value: "20000"
     - name: OTEL_TRACES_SAMPLER
-      value: parentbased_traceidratio
-    - name: OTEL_TRACES_SAMPLER_ARG
-      value: "0.85"
+      value: always_on
     - name: SPLUNK_TRACE_RESPONSE_HEADER_ENABLED
       value: "true"
     - name: OTEL_SERVICE_NAME
@@ -55,6 +55,9 @@ spec:
       value: jaeger,b3
     - name: OTEL_RESOURCE_ATTRIBUTES
     name: myapp
+    ports:
+    - containerPort: 8080
+      protocol: TCP
     volumeMounts:
     - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
       readOnly: true
diff --git a/tests/e2e-instrumentation/instrumentation-python/01-install-app.yaml b/tests/e2e-instrumentation/instrumentation-python/01-install-app.yaml
index 8d18152c..9685a653 100644
--- a/tests/e2e-instrumentation/instrumentation-python/01-install-app.yaml
+++ b/tests/e2e-instrumentation/instrumentation-python/01-install-app.yaml
@@ -21,8 +21,19 @@ spec:
         fsGroup: 3000
       containers:
       - name: myapp
+        ports:
+        - containerPort: 8080
         image: ghcr.io/open-telemetry/opentelemetry-operator/e2e-test-app-python:main
         securityContext:
           allowPrivilegeEscalation: false
           capabilities:
             drop: ["ALL"]
+        readinessProbe:
+          httpGet:
+            path: /
+            port: 8080
+            scheme: HTTP
+          initialDelaySeconds: 5
+          periodSeconds: 15
+          timeoutSeconds: 2
+          failureThreshold: 3
diff --git a/tests/e2e-instrumentation/instrumentation-python/chainsaw-test.yaml b/tests/e2e-instrumentation/instrumentation-python/chainsaw-test.yaml
index 0aa00edd..398f1f41 100755
--- a/tests/e2e-instrumentation/instrumentation-python/chainsaw-test.yaml
+++ b/tests/e2e-instrumentation/instrumentation-python/chainsaw-test.yaml
@@ -38,3 +38,80 @@ spec:
     catch:
       - podLogs:
           selector: app=my-python
+  - name: Make a request to the app
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-python
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - proxy:
+          apiVersion: v1
+          kind: Pod
+          name: ($podName)
+          namespace: ${NAMESPACE}
+          port: "8080"
+  - name: Wait for telemetry data
+    try:
+    - script:
+        env:
+          - name: LABEL_SELECTOR
+            value: "app=my-python"
+          - name: CONTAINER_NAME
+            value: "otc-container" 
+          - name: RETRY_TIMEOUT
+            value: "120"
+          - name: RETRY_SLEEP
+            value: "5"
+          - name: SEARCH_STRINGS_ENV
+            value: |
+              http.method: Str(GET)
+              k8s.container.name: Str(myapp)
+        timeout: 2m
+        content: ../../test-e2e-apps/scripts/check_pod_logs.sh
+  - name: Check the instrumented app has sent the telemetry data successfully
+    try:
+      - command:
+          entrypoint: kubectl
+          args:
+            - get
+            - pod
+            - -n
+            - ${NAMESPACE}
+            - -l
+            - app=my-python
+            - -o
+            - jsonpath={.items[0].metadata.name}
+          outputs:
+          - name: podName
+            value: ($stdout)
+      - script:
+          env:
+          - name: podName
+            value: ($podName)
+          content: |
+            #!/bin/bash
+            # set -ex
+            kubectl get --raw /api/v1/namespaces/$NAMESPACE/pods/${podName}:8888/proxy/metrics
+          outputs:
+          - name: metrics
+            value: (x_metrics_decode($stdout))
+          check:
+            ($error == null): true
+      - assert:
+          resource:
+            ($metrics[?as_string(metric."__name__") == 'otelcol_exporter_sent_spans_total'].value | [0] > `1`): true
+            ($metrics[?as_string(metric."__name__") == 'otelcol_receiver_accepted_spans_total'].value | [0] > `1`): true
+    catch:
+      - podLogs:
+          selector: app=my-python
+          container: otc-container
\ No newline at end of file
diff --git a/tests/e2e-openshift/Dockerfile b/tests/e2e-openshift/Dockerfile
index cc70c05d..4a5b7e0e 100644
--- a/tests/e2e-openshift/Dockerfile
+++ b/tests/e2e-openshift/Dockerfile
@@ -21,11 +21,6 @@ RUN mkdir -p /tmp/go/bin $GOCACHE \
 # Install dependencies required by test cases and debugging
 RUN apt-get update && apt-get install -y jq vim libreadline-dev unzip
 
-# Install kuttl e2e
-RUN curl -LO https://github.com/kudobuilder/kuttl/releases/download/v0.15.0/kubectl-kuttl_0.15.0_linux_x86_64 \
-    && chmod +x kubectl-kuttl_0.15.0_linux_x86_64 \
-    && mv kubectl-kuttl_0.15.0_linux_x86_64 /usr/local/bin/kuttl
-
 # Install chainsaw
 RUN curl -L -o chainsaw.tar.gz https://github.com/kyverno/chainsaw/releases/download/${CHAINSAW_VERSION}/chainsaw_linux_amd64.tar.gz \
     && tar -xvzf chainsaw.tar.gz \
@@ -44,5 +39,10 @@ RUN curl -LO https://github.com/grafana/loki/releases/latest/download/logcli-lin
     && chmod +x logcli-linux-amd64 \
     && mv logcli-linux-amd64 /usr/local/bin/logcli
 
+# Install AWS CLI
+RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" \
+    && unzip awscliv2.zip \
+    && ./aws/install
+
 # Set the working directory
 WORKDIR /tmp/opentelemetry-operator
\ No newline at end of file
diff --git a/tests/e2e-openshift/export-to-cluster-logging-lokistack/chainsaw-test.yaml b/tests/e2e-openshift/export-to-cluster-logging-lokistack/chainsaw-test.yaml
index 2678477a..d8644fad 100644
--- a/tests/e2e-openshift/export-to-cluster-logging-lokistack/chainsaw-test.yaml
+++ b/tests/e2e-openshift/export-to-cluster-logging-lokistack/chainsaw-test.yaml
@@ -41,6 +41,19 @@ spec:
         content: kubectl get --namespace openshift-logging lokistacks logging-loki -o jsonpath='{.status.conditions[?(@.type=="Ready")].status}'
   - name: Enable Logging UI. Not needed by test but can be used for debugging
     try:
+    - command:
+        entrypoint: oc
+        args:
+        - get
+        - pods
+        - -A
+        - -l app.kubernetes.io/component=operator
+        - -l app.kubernetes.io/name=observability-operator
+        - -o 
+        - jsonpath={.items[0].metadata.namespace}
+        outputs:
+        - name: COO_NAMESPACE
+          value: ($stdout)
     - apply:
         file: logging-uiplugin.yaml
     - assert:
diff --git a/tests/e2e-openshift/export-to-cluster-logging-lokistack/generate-logs.yaml b/tests/e2e-openshift/export-to-cluster-logging-lokistack/generate-logs.yaml
index b8784724..ee66b4c0 100644
--- a/tests/e2e-openshift/export-to-cluster-logging-lokistack/generate-logs.yaml
+++ b/tests/e2e-openshift/export-to-cluster-logging-lokistack/generate-logs.yaml
@@ -8,7 +8,7 @@ spec:
     spec:
       containers:
         - name: telemetrygen
-          image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:v0.106.1
+          image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:v0.124.1
           args:
             - logs
             - --otlp-endpoint=otel-collector.openshift-logging.svc.cluster.local:4317
diff --git a/tests/e2e-openshift/export-to-cluster-logging-lokistack/logging-uiplugin-assert.yaml b/tests/e2e-openshift/export-to-cluster-logging-lokistack/logging-uiplugin-assert.yaml
index 23ebfb57..0434775c 100644
--- a/tests/e2e-openshift/export-to-cluster-logging-lokistack/logging-uiplugin-assert.yaml
+++ b/tests/e2e-openshift/export-to-cluster-logging-lokistack/logging-uiplugin-assert.yaml
@@ -2,7 +2,7 @@ apiVersion: apps/v1
 kind: Deployment
 metadata:
   name: logging
-  namespace: openshift-operators
+  namespace: ($COO_NAMESPACE)
 status:
   availableReplicas: 1
   readyReplicas: 1
diff --git a/tests/e2e-openshift/export-to-cluster-logging-lokistack/logging-uiplugin.yaml b/tests/e2e-openshift/export-to-cluster-logging-lokistack/logging-uiplugin.yaml
index 90772c3d..f0899195 100644
--- a/tests/e2e-openshift/export-to-cluster-logging-lokistack/logging-uiplugin.yaml
+++ b/tests/e2e-openshift/export-to-cluster-logging-lokistack/logging-uiplugin.yaml
@@ -2,6 +2,7 @@ apiVersion: observability.openshift.io/v1alpha1
 kind: UIPlugin
 metadata:
   name: logging
+  namespace: ($COO_NAMESPACE)
 spec:
   logging:
     logsLimit: 20
diff --git a/tests/e2e-openshift/kafka/04-generate-traces.yaml b/tests/e2e-openshift/kafka/04-generate-traces.yaml
index 355e4c92..ae8dc64c 100644
--- a/tests/e2e-openshift/kafka/04-generate-traces.yaml
+++ b/tests/e2e-openshift/kafka/04-generate-traces.yaml
@@ -12,7 +12,7 @@ spec:
     spec:
       containers:
         - name: telemetrygen-traces
-          image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:v0.92.0
+          image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:v0.124.1
           command: ["./telemetrygen"]
           args:
             - "--otlp-endpoint=kafka-exporter-collector-headless.chainsaw-kafka.svc:4317"
diff --git a/tests/e2e-openshift/monitoring/01-otel-collector.yaml b/tests/e2e-openshift/monitoring/01-otel-collector.yaml
index 4eadf515..e3130526 100644
--- a/tests/e2e-openshift/monitoring/01-otel-collector.yaml
+++ b/tests/e2e-openshift/monitoring/01-otel-collector.yaml
@@ -1,4 +1,4 @@
-apiVersion: opentelemetry.io/v1alpha1
+apiVersion: opentelemetry.io/v1beta1
 kind: OpenTelemetryCollector
 metadata:
   name: cluster-collector
@@ -7,17 +7,28 @@ spec:
   observability:
     metrics:
       enableMetrics: true
-  config: |
+  config:
     receivers:
       otlp:
         protocols:
-          grpc:
-          http:
+          grpc: {}
+          http: {}
     processors:
+      memory_limiter:
+        check_interval: 1
+        limit_percentage: 75
+        spike_limit_percentage: 15
     exporters:
       debug:
+        verbosity: detailed
     service:
       pipelines:
         traces:
           receivers: [otlp]
           exporters: [debug]
+        logs:
+          receivers: [otlp]
+          exporters: [debug]
+        metrics:
+          receivers: [otlp]
+          exporters: [debug]
diff --git a/tests/e2e-openshift/monitoring/02-assert.yaml b/tests/e2e-openshift/monitoring/02-assert.yaml
index 701adbdf..232d9f11 100644
--- a/tests/e2e-openshift/monitoring/02-assert.yaml
+++ b/tests/e2e-openshift/monitoring/02-assert.yaml
@@ -4,3 +4,19 @@ metadata:
   name: telemetrygen-traces
 status:
   active: 1
+
+---
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: telemetrygen-metrics
+status:
+  active: 1
+
+---
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: telemetrygen-logs
+status:
+  active: 1
diff --git a/tests/e2e-openshift/monitoring/02-generate-telemetry.yaml b/tests/e2e-openshift/monitoring/02-generate-telemetry.yaml
new file mode 100644
index 00000000..71c530a8
--- /dev/null
+++ b/tests/e2e-openshift/monitoring/02-generate-telemetry.yaml
@@ -0,0 +1,83 @@
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: telemetrygen-traces
+spec:
+  completions: 1
+  parallelism: 1
+  template:
+    metadata:
+      labels:
+        app: telemetrygen-traces
+    spec:
+      containers:
+        - name: telemetrygen-traces
+          image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:v0.124.1
+          command: ["./telemetrygen"]
+          args:
+            - "--otlp-endpoint=cluster-collector-collector-headless:4317"
+            - "--otlp-insecure=true"
+            - "--rate=1"
+            - "--duration=3m"
+            - "--otlp-attributes=telemetrygen=\"traces\""
+            - "--otlp-header=telemetrygen=\"traces\""
+            - "--span-duration=1s"
+            - "--workers=1"
+            - "traces"
+      restartPolicy: Never
+
+---
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: telemetrygen-metrics
+spec:
+  completions: 1
+  parallelism: 1
+  template:
+    metadata:
+      labels:
+        app: telemetrygen-metrics
+    spec:
+      containers:
+        - name: telemetrygen-traces
+          image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:v0.124.1
+          command: ["./telemetrygen"]
+          args:
+            - "--otlp-endpoint=cluster-collector-collector-headless:4317"
+            - "--otlp-insecure=true"
+            - "--rate=1"
+            - "--duration=3m"
+            - "--otlp-attributes=telemetrygen=\"metrics\""
+            - "--otlp-header=telemetrygen=\"metrics\""
+            - "--workers=1"
+            - "metrics"
+      restartPolicy: Never
+
+---
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: telemetrygen-logs
+spec:
+  completions: 1
+  parallelism: 1
+  template:
+    metadata:
+      labels:
+        app: telemetrygen-logs
+    spec:
+      containers:
+        - name: telemetrygen-traces
+          image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:v0.124.1
+          command: ["./telemetrygen"]
+          args:
+            - "--otlp-endpoint=cluster-collector-collector-headless:4317"
+            - "--otlp-insecure=true"
+            - "--rate=1"
+            - "--duration=3m"
+            - "--otlp-attributes=telemetrygen=\"metrics\""
+            - "--otlp-header=telemetrygen=\"metrics\""
+            - "--workers=1"
+            - "logs"
+      restartPolicy: Never
diff --git a/tests/e2e-openshift/monitoring/02-generate-traces.yaml b/tests/e2e-openshift/monitoring/02-generate-traces.yaml
deleted file mode 100644
index 798db5db..00000000
--- a/tests/e2e-openshift/monitoring/02-generate-traces.yaml
+++ /dev/null
@@ -1,27 +0,0 @@
-apiVersion: batch/v1
-kind: Job
-metadata:
-  name: telemetrygen-traces
-spec:
-  completions: 1
-  parallelism: 1
-  template:
-    metadata:
-      labels:
-        app: telemetrygen-traces
-    spec:
-      containers:
-        - name: telemetrygen-traces
-          image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:v0.92.0
-          command: ["./telemetrygen"]
-          args:
-            - "--otlp-endpoint=cluster-collector-collector-headless:4317"
-            - "--otlp-insecure=true"
-            - "--rate=1"
-            - "--duration=3m"
-            - "--otlp-attributes=telemetrygen=\"traces\""
-            - "--otlp-header=telemetrygen=\"traces\""
-            - "--span-duration=1s"
-            - "--workers=1"
-            - "traces"
-      restartPolicy: Never
diff --git a/tests/e2e-openshift/monitoring/chainsaw-test.yaml b/tests/e2e-openshift/monitoring/chainsaw-test.yaml
index 4752e8cc..de0bf501 100755
--- a/tests/e2e-openshift/monitoring/chainsaw-test.yaml
+++ b/tests/e2e-openshift/monitoring/chainsaw-test.yaml
@@ -47,7 +47,7 @@ spec:
   - name: step-02
     try:
     - apply:
-        file: 02-generate-traces.yaml
+        file: 02-generate-telemetry.yaml
     - assert:
         file: 02-assert.yaml
   - name: step-03
diff --git a/tests/e2e-openshift/monitoring/check_metrics.sh b/tests/e2e-openshift/monitoring/check_metrics.sh
index ad8843ae..af9aebf9 100755
--- a/tests/e2e-openshift/monitoring/check_metrics.sh
+++ b/tests/e2e-openshift/monitoring/check_metrics.sh
@@ -4,7 +4,7 @@ TOKEN=$(oc create token prometheus-user-workload -n openshift-user-workload-moni
 THANOS_QUERIER_HOST=$(oc get route thanos-querier -n openshift-monitoring -o json | jq -r '.spec.host')
 
 # Check metrics for OpenTelemetry collector instance.
-metrics="otelcol_process_uptime otelcol_process_runtime_total_sys_memory_bytes otelcol_process_memory_rss otelcol_exporter_sent_spans otelcol_process_cpu_seconds otelcol_process_memory_rss otelcol_process_runtime_heap_alloc_bytes otelcol_process_runtime_total_alloc_bytes otelcol_process_runtime_total_sys_memory_bytes otelcol_process_uptime otelcol_receiver_accepted_spans otelcol_receiver_refused_spans controller_runtime_reconcile_time_seconds_count{controller=\"opentelemetrycollector\"} controller_runtime_reconcile_total{controller=\"opentelemetrycollector\",result=\"success\"} workqueue_work_duration_seconds_count{controller=\"opentelemetrycollector\",name=\"opentelemetrycollector\"}"
+metrics="otelcol_process_uptime_seconds_total otelcol_process_runtime_total_sys_memory_bytes otelcol_process_memory_rss_bytes otelcol_exporter_sent_spans_total otelcol_process_cpu_seconds_total otelcol_process_memory_rss_bytes otelcol_process_runtime_heap_alloc_bytes otelcol_process_runtime_total_alloc_bytes_total otelcol_process_runtime_total_sys_memory_bytes otelcol_process_uptime_seconds_total otelcol_receiver_accepted_spans_total otelcol_receiver_refused_spans_total otelcol_receiver_refused_log_records_total otelcol_receiver_accepted_log_records_total otelcol_exporter_sent_log_records_total otelcol_receiver_refused_metric_points_total otelcol_receiver_accepted_metric_points_total otelcol_exporter_sent_metric_points_total controller_runtime_reconcile_time_seconds_count{controller=\"opentelemetrycollector\"} controller_runtime_reconcile_total{controller=\"opentelemetrycollector\",result=\"success\"} workqueue_work_duration_seconds_count{controller=\"opentelemetrycollector\",name=\"opentelemetrycollector\"}"
 
 for metric in $metrics; do
   query="$metric"
diff --git a/tests/e2e-openshift/multi-cluster/01-assert.yaml b/tests/e2e-openshift/multi-cluster/01-assert.yaml
index 8e281105..a54adb65 100644
--- a/tests/e2e-openshift/multi-cluster/01-assert.yaml
+++ b/tests/e2e-openshift/multi-cluster/01-assert.yaml
@@ -1,126 +1,9 @@
 apiVersion: apps/v1
-kind: Deployment
+kind: StatefulSet
 metadata:
-  labels:
-    app: jaeger
-    app.kubernetes.io/component: all-in-one
-    app.kubernetes.io/instance: jaeger-allinone
-    app.kubernetes.io/managed-by: jaeger-operator
-    app.kubernetes.io/name: jaeger-allinone
-    app.kubernetes.io/part-of: jaeger
-  name: jaeger-allinone
+  name: tempo-multicluster
   namespace: chainsaw-multi-cluster-receive
 status:
   availableReplicas: 1
   readyReplicas: 1
-  replicas: 1
-
----
-apiVersion: v1
-kind: Service
-metadata:
-  labels:
-    app: jaeger
-    app.kubernetes.io/component: service-collector
-    app.kubernetes.io/instance: jaeger-allinone
-    app.kubernetes.io/managed-by: jaeger-operator
-    app.kubernetes.io/name: jaeger-allinone-collector
-    app.kubernetes.io/part-of: jaeger
-  name: jaeger-allinone-collector
-  namespace: chainsaw-multi-cluster-receive
-spec:
-  ports:
-  - name: http-zipkin
-    port: 9411
-    protocol: TCP
-    targetPort: 9411
-  - name: tls-grpc-jaeger
-    port: 14250
-    protocol: TCP
-    targetPort: 14250
-  - name: http-c-tchan-trft
-    port: 14267
-    protocol: TCP
-    targetPort: 14267
-  - name: http-c-binary-trft
-    port: 14268
-    protocol: TCP
-    targetPort: 14268
-  - name: admin-http
-    port: 14269
-    protocol: TCP
-    targetPort: 14269
-  - name: grpc-otlp
-    port: 4317
-    protocol: TCP
-    targetPort: 4317
-  - name: http-otlp
-    port: 4318
-    protocol: TCP
-    targetPort: 4318
-  selector:
-    app: jaeger
-    app.kubernetes.io/component: all-in-one
-    app.kubernetes.io/instance: jaeger-allinone
-    app.kubernetes.io/managed-by: jaeger-operator
-    app.kubernetes.io/name: jaeger-allinone
-    app.kubernetes.io/part-of: jaeger
-  type: ClusterIP
-
----
-apiVersion: v1
-kind: Service
-metadata:
-  labels:
-    app: jaeger
-    app.kubernetes.io/component: service-query
-    app.kubernetes.io/instance: jaeger-allinone
-    app.kubernetes.io/managed-by: jaeger-operator
-    app.kubernetes.io/name: jaeger-allinone-query
-    app.kubernetes.io/part-of: jaeger
-  name: jaeger-allinone-query
-  namespace: chainsaw-multi-cluster-receive
-spec:
-  ports:
-  - name: http-query
-    port: 16686
-    protocol: TCP
-    targetPort: 16686
-  - name: grpc-query
-    port: 16685
-    protocol: TCP
-    targetPort: 16685
-  - name: admin-http
-    port: 16687
-    protocol: TCP
-    targetPort: 16687
-  selector:
-    app: jaeger
-    app.kubernetes.io/component: all-in-one
-    app.kubernetes.io/instance: jaeger-allinone
-    app.kubernetes.io/managed-by: jaeger-operator
-    app.kubernetes.io/name: jaeger-allinone
-    app.kubernetes.io/part-of: jaeger
-  type: ClusterIP
-
----
-apiVersion: route.openshift.io/v1
-kind: Route
-metadata:
-  labels:
-    app: jaeger
-    app.kubernetes.io/component: query-route
-    app.kubernetes.io/instance: jaeger-allinone
-    app.kubernetes.io/managed-by: jaeger-operator
-    app.kubernetes.io/name: jaeger-allinone
-    app.kubernetes.io/part-of: jaeger
-  name: jaeger-allinone
-  namespace: chainsaw-multi-cluster-receive
-spec:
-  port:
-    targetPort: http-query
-  tls:
-    termination: edge
-  to:
-    kind: Service
-    name: jaeger-allinone-query
+  replicas: 1
\ No newline at end of file
diff --git a/tests/e2e-openshift/multi-cluster/01-create-jaeger.yaml b/tests/e2e-openshift/multi-cluster/01-create-jaeger.yaml
deleted file mode 100644
index b02785b5..00000000
--- a/tests/e2e-openshift/multi-cluster/01-create-jaeger.yaml
+++ /dev/null
@@ -1,9 +0,0 @@
-apiVersion: jaegertracing.io/v1
-kind: Jaeger
-metadata:
-  name: jaeger-allinone
-  namespace: chainsaw-multi-cluster-receive
-spec:
-  strategy: allinone
-  ingress:
-    security: none
diff --git a/tests/e2e-openshift/multi-cluster/01-create-tempo.yaml b/tests/e2e-openshift/multi-cluster/01-create-tempo.yaml
new file mode 100644
index 00000000..ec5a48cd
--- /dev/null
+++ b/tests/e2e-openshift/multi-cluster/01-create-tempo.yaml
@@ -0,0 +1,6 @@
+apiVersion: tempo.grafana.com/v1alpha1
+kind: TempoMonolithic
+metadata:
+  name: multicluster
+  namespace: chainsaw-multi-cluster-receive
+spec: {}
diff --git a/tests/e2e-openshift/multi-cluster/02-otlp-receiver.yaml b/tests/e2e-openshift/multi-cluster/02-otlp-receiver.yaml
index 732fb94f..191e1d1c 100644
--- a/tests/e2e-openshift/multi-cluster/02-otlp-receiver.yaml
+++ b/tests/e2e-openshift/multi-cluster/02-otlp-receiver.yaml
@@ -20,7 +20,7 @@ spec:
               client_ca_file: /certs/ca.crt
     exporters:
       otlp:
-        endpoint: "jaeger-allinone-collector.chainsaw-multi-cluster-receive.svc:4317"
+        endpoint: "tempo-multicluster.chainsaw-multi-cluster-receive.svc:4317"
         tls:
           insecure: true
     service:
diff --git a/tests/e2e-openshift/multi-cluster/04-generate-traces.yaml b/tests/e2e-openshift/multi-cluster/04-generate-traces.yaml
index b3018c7d..0866620c 100644
--- a/tests/e2e-openshift/multi-cluster/04-generate-traces.yaml
+++ b/tests/e2e-openshift/multi-cluster/04-generate-traces.yaml
@@ -8,7 +8,7 @@ spec:
     spec:
       containers:
       - name: telemetrygen
-        image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:v0.92.0
+        image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:v0.124.1
         args:
         - traces
         - --otlp-endpoint=otel-sender-collector:4318
@@ -30,7 +30,7 @@ spec:
     spec:
       containers:
       - name: telemetrygen
-        image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:v0.92.0
+        image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:v0.124.1
         args:
         - traces
         - --otlp-endpoint=otel-sender-collector:4317
diff --git a/tests/e2e-openshift/multi-cluster/assert-verify-traces.yaml b/tests/e2e-openshift/multi-cluster/assert-verify-traces.yaml
new file mode 100644
index 00000000..7efb6325
--- /dev/null
+++ b/tests/e2e-openshift/multi-cluster/assert-verify-traces.yaml
@@ -0,0 +1,14 @@
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: verify-traces-http
+status:
+  succeeded: 1
+
+---
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: verify-traces-grpc
+status:
+  succeeded: 1
\ No newline at end of file
diff --git a/tests/e2e-openshift/multi-cluster/chainsaw-test.yaml b/tests/e2e-openshift/multi-cluster/chainsaw-test.yaml
index ad5c1d3b..4c2fc85e 100755
--- a/tests/e2e-openshift/multi-cluster/chainsaw-test.yaml
+++ b/tests/e2e-openshift/multi-cluster/chainsaw-test.yaml
@@ -15,7 +15,7 @@ spec:
   - name: step-01
     try:
     - apply:
-        file: 01-create-jaeger.yaml
+        file: 01-create-tempo.yaml
     - assert:
         file: 01-assert.yaml
   - name: step-02
@@ -43,6 +43,7 @@ spec:
         file: 04-assert.yaml
   - name: step-05
     try:
-    - script:
-        timeout: 5m
-        content: ./check_traces.sh
+    - apply:
+        file: verify-traces.yaml
+    - assert:
+        file: assert-verify-traces.yaml
diff --git a/tests/e2e-openshift/multi-cluster/check_traces.sh b/tests/e2e-openshift/multi-cluster/check_traces.sh
deleted file mode 100755
index 430a9683..00000000
--- a/tests/e2e-openshift/multi-cluster/check_traces.sh
+++ /dev/null
@@ -1,33 +0,0 @@
-#!/bin/bash
-
-# Define an array of service names
-SERVICE_NAMES=("telemetrygen-http" "telemetrygen-grpc")
-
-# Get the Jaeger URL
-JAEGER_URL=$(oc -n chainsaw-multi-cluster-receive get route jaeger-allinone -o json | jq '.spec.host' -r)
-
-# Initialize a flag to check if traces exist for all services
-all_traces_exist=false
-
-# Keep checking until traces exist for all services
-while [[ $all_traces_exist == false ]]; do
-  all_traces_exist=true
-
-  # Loop through each service name
-  for SERVICE_NAME in "${SERVICE_NAMES[@]}"; do
-    trace_count=$(curl -ksSL "https://$JAEGER_URL/api/traces?service=$SERVICE_NAME&limit=1" | jq -r '.data | length')
-    if [[ $trace_count -gt 0 ]]; then
-      echo "Traces for $SERVICE_NAME exist in Jaeger."
-    else
-      echo "Trace for $SERVICE_NAME does not exist in Jaeger."
-      all_traces_exist=false
-    fi
-  done
-
-  # If traces do not exist for all services, sleep for a while before the next check
-  if [[ $all_traces_exist == false ]]; then
-    sleep 10
-  fi
-done
-
-echo "Traces exist for all service names."
diff --git a/tests/e2e-openshift/multi-cluster/verify-traces.yaml b/tests/e2e-openshift/multi-cluster/verify-traces.yaml
new file mode 100644
index 00000000..f4c0d2c7
--- /dev/null
+++ b/tests/e2e-openshift/multi-cluster/verify-traces.yaml
@@ -0,0 +1,50 @@
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: verify-traces-http
+spec:
+  template:
+    spec:
+      containers:
+      - name: verify-traces
+        image: ghcr.io/grafana/tempo-operator/test-utils:main
+        command: ["/bin/bash", "-eux", "-c"]
+        args:
+        - |
+          curl -sS -G \
+            --data-urlencode 'q={ resource.service.name="telemetrygen-http" }' \
+            http://tempo-multicluster.chainsaw-multi-cluster-receive.svc:3200/api/search \
+            | tee /tmp/tempo.out
+
+          num_traces=$(jq ".traces | length" /tmp/tempo.out)
+          if [[ "$num_traces" -le "1" ]]; then
+            echo && echo "The Tempo API returned $num_traces."
+            exit 1
+          fi
+      restartPolicy: Never
+
+---
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: verify-traces-grpc
+spec:
+  template:
+    spec:
+      containers:
+      - name: verify-traces
+        image: ghcr.io/grafana/tempo-operator/test-utils:main
+        command: ["/bin/bash", "-eux", "-c"]
+        args:
+        - |
+          curl -sS -G \
+            --data-urlencode 'q={ resource.service.name="telemetrygen-grpc" }' \
+            http://tempo-multicluster.chainsaw-multi-cluster-receive.svc:3200/api/search \
+            | tee /tmp/tempo.out
+
+          num_traces=$(jq ".traces | length" /tmp/tempo.out)
+          if [[ "$num_traces" -le "1" ]]; then
+            echo && echo "The Tempo API returned $num_traces."
+            exit 1
+          fi
+      restartPolicy: Never
diff --git a/tests/e2e-openshift/must-gather/assert-install-target-allocator.yaml b/tests/e2e-openshift/must-gather/assert-install-target-allocator.yaml
index d5843823..25c16d74 100644
--- a/tests/e2e-openshift/must-gather/assert-install-target-allocator.yaml
+++ b/tests/e2e-openshift/must-gather/assert-install-target-allocator.yaml
@@ -48,12 +48,12 @@ data:
                     - jaeger
         telemetry:
             metrics:
-              readers:
-                - pull:
-                    exporter:
-                      prometheus:
-                        host: 0.0.0.0
-                        port: 8888
+                readers:
+                    - pull:
+                        exporter:
+                            prometheus:
+                                host: 0.0.0.0
+                                port: 8888
 kind: ConfigMap
 metadata:
   labels:
@@ -62,7 +62,7 @@ metadata:
     app.kubernetes.io/managed-by: opentelemetry-operator
     app.kubernetes.io/name: stateful-collector
     app.kubernetes.io/part-of: opentelemetry
-  name: stateful-collector-2729987d
+  name: stateful-collector-95bef721
   namespace: chainsaw-must-gather
 ---
 apiVersion: v1
diff --git a/tests/e2e-openshift/must-gather/check_must_gather.sh b/tests/e2e-openshift/must-gather/check_must_gather.sh
index 5722a06e..56221ebf 100755
--- a/tests/e2e-openshift/must-gather/check_must_gather.sh
+++ b/tests/e2e-openshift/must-gather/check_must_gather.sh
@@ -20,7 +20,7 @@ REQUIRED_ITEMS=(
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-must-gather/stateful/poddisruptionbudget-stateful-targetallocator.yaml
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-must-gather/stateful/poddisruptionbudget-stateful-collector.yaml
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-must-gather/stateful/service-stateful-targetallocator.yaml
-  ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-must-gather/stateful/configmap-stateful-collector-2729987d.yaml
+  ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-must-gather/stateful/configmap-stateful-collector-*.yaml
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-must-gather/stateful/configmap-stateful-targetallocator.yaml
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-must-gather/stateful/statefulset-stateful-collector.yaml
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-must-gather/stateful/opentelemetrycollector-stateful.yaml
@@ -28,7 +28,7 @@ REQUIRED_ITEMS=(
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-must-gather/sidecar/service-sidecar-collector.yaml
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-must-gather/sidecar/opentelemetrycollector-sidecar.yaml
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-must-gather/sidecar/service-sidecar-collector-monitoring.yaml
-  ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-must-gather/sidecar/configmap-sidecar-collector-3826c0e7.yaml
+  ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-must-gather/sidecar/configmap-sidecar-collector-*.yaml
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-must-gather/sidecar/serviceaccount-sidecar-collector.yaml
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-must-gather/sidecar/service-sidecar-collector-headless.yaml
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/chainsaw-must-gather/instrumentation-nodejs.yaml
diff --git a/tests/e2e-openshift/otlp-metrics-traces/00-assert.yaml b/tests/e2e-openshift/otlp-metrics-traces/00-assert.yaml
index 273979ed..e26de20d 100644
--- a/tests/e2e-openshift/otlp-metrics-traces/00-assert.yaml
+++ b/tests/e2e-openshift/otlp-metrics-traces/00-assert.yaml
@@ -1,9 +1,8 @@
----
 apiVersion: apps/v1
-kind: Deployment
+kind: StatefulSet
 metadata:
+  name: tempo-otlpmetrics
   namespace: chainsaw-otlp-metrics
-  name: jaeger-allinone
 status:
   availableReplicas: 1
   readyReplicas: 1
diff --git a/tests/e2e-openshift/otlp-metrics-traces/00-install-jaeger.yaml b/tests/e2e-openshift/otlp-metrics-traces/00-install-jaeger.yaml
deleted file mode 100644
index 9a2cae1b..00000000
--- a/tests/e2e-openshift/otlp-metrics-traces/00-install-jaeger.yaml
+++ /dev/null
@@ -1,10 +0,0 @@
-#For this test case you'll need to install the Jaeger operator (OpenShift Distributed Tracing Platform in OpenShift)
-apiVersion: jaegertracing.io/v1
-kind: Jaeger
-metadata:
-  name: jaeger-allinone
-  namespace: chainsaw-otlp-metrics
-spec:
-  strategy: allinone
-  ingress:
-    security: none
diff --git a/tests/e2e-openshift/otlp-metrics-traces/00-install-tempo.yaml b/tests/e2e-openshift/otlp-metrics-traces/00-install-tempo.yaml
new file mode 100644
index 00000000..c828a4d6
--- /dev/null
+++ b/tests/e2e-openshift/otlp-metrics-traces/00-install-tempo.yaml
@@ -0,0 +1,6 @@
+apiVersion: tempo.grafana.com/v1alpha1
+kind: TempoMonolithic
+metadata:
+  name: otlpmetrics
+  namespace: chainsaw-otlp-metrics
+spec: {}
\ No newline at end of file
diff --git a/tests/e2e-openshift/otlp-metrics-traces/02-otel-metrics-collector.yaml b/tests/e2e-openshift/otlp-metrics-traces/02-otel-metrics-collector.yaml
index 5a7d056b..95c6355f 100644
--- a/tests/e2e-openshift/otlp-metrics-traces/02-otel-metrics-collector.yaml
+++ b/tests/e2e-openshift/otlp-metrics-traces/02-otel-metrics-collector.yaml
@@ -19,7 +19,7 @@ spec:
     processors: {}
     exporters:
       otlp:
-        endpoint: jaeger-allinone-collector-headless.chainsaw-otlp-metrics.svc:4317
+        endpoint: tempo-otlpmetrics.chainsaw-otlp-metrics.svc:4317
         tls:
           insecure: true
       prometheus:
diff --git a/tests/e2e-openshift/otlp-metrics-traces/03-metrics-traces-gen.yaml b/tests/e2e-openshift/otlp-metrics-traces/03-metrics-traces-gen.yaml
index 6483cd92..7075935b 100644
--- a/tests/e2e-openshift/otlp-metrics-traces/03-metrics-traces-gen.yaml
+++ b/tests/e2e-openshift/otlp-metrics-traces/03-metrics-traces-gen.yaml
@@ -37,7 +37,7 @@ spec:
     spec:
       containers:
         - name: telemetrygen-traces
-          image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:v0.92.0
+          image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:v0.124.1
           command: ["./telemetrygen"]
           args:
             - "--otlp-endpoint=cluster-collector-collector-headless.chainsaw-otlp-metrics.svc:4317"
@@ -64,7 +64,7 @@ spec:
     spec:
       containers:
         - name: telemetrygen-metrics
-          image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:v0.92.0
+          image: ghcr.io/open-telemetry/opentelemetry-collector-contrib/telemetrygen:v0.124.1
           command: ["./telemetrygen"]
           args:
             - "--otlp-endpoint=cluster-collector-collector-headless.chainsaw-otlp-metrics.svc:4317"
diff --git a/tests/e2e-openshift/otlp-metrics-traces/assert-verify-traces.yaml b/tests/e2e-openshift/otlp-metrics-traces/assert-verify-traces.yaml
new file mode 100644
index 00000000..d9ebd7fc
--- /dev/null
+++ b/tests/e2e-openshift/otlp-metrics-traces/assert-verify-traces.yaml
@@ -0,0 +1,6 @@
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: verify-traces
+status:
+  succeeded: 1
\ No newline at end of file
diff --git a/tests/e2e-openshift/otlp-metrics-traces/chainsaw-test.yaml b/tests/e2e-openshift/otlp-metrics-traces/chainsaw-test.yaml
index de34a5a2..7e668a0b 100755
--- a/tests/e2e-openshift/otlp-metrics-traces/chainsaw-test.yaml
+++ b/tests/e2e-openshift/otlp-metrics-traces/chainsaw-test.yaml
@@ -12,7 +12,7 @@ spec:
   - name: step-00
     try:
     - apply:
-        file: 00-install-jaeger.yaml
+        file: 00-install-tempo.yaml
     - assert:
         file: 00-assert.yaml
   - name: step-01
@@ -35,9 +35,10 @@ spec:
         file: 03-assert.yaml
   - name: step-04
     try:
-    - script:
-        timeout: 5m
-        content: ./check_traces.sh
+    - apply:
+        file: verify-traces.yaml
+    - assert:
+        file: assert-verify-traces.yaml
   - name: step-05
     try:
     - script:
diff --git a/tests/e2e-openshift/otlp-metrics-traces/check_must_gather.sh b/tests/e2e-openshift/otlp-metrics-traces/check_must_gather.sh
index 855506b7..6c2d5b6e 100755
--- a/tests/e2e-openshift/otlp-metrics-traces/check_must_gather.sh
+++ b/tests/e2e-openshift/otlp-metrics-traces/check_must_gather.sh
@@ -18,7 +18,7 @@ REQUIRED_ITEMS=(
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-otlp-metrics/cluster-collector/deployment-cluster-collector-collector.yaml
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-otlp-metrics/cluster-collector/service-cluster-collector-collector-monitoring.yaml
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-otlp-metrics/cluster-collector/opentelemetrycollector-cluster-collector.yaml
-  ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-otlp-metrics/cluster-collector/configmap-cluster-collector-collector-57b76c99.yaml
+  ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-otlp-metrics/cluster-collector/configmap-cluster-collector-collector-*.yaml
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-otlp-metrics/cluster-collector/serviceaccount-cluster-collector-collector.yaml
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-otlp-metrics/cluster-collector/service-cluster-collector-collector.yaml
   ghcr-io-open-telemetry-opentelemetry-operator-must-gather-sha256-*/namespaces/chainsaw-otlp-metrics/cluster-collector/poddisruptionbudget-cluster-collector-collector.yaml
diff --git a/tests/e2e-openshift/otlp-metrics-traces/check_traces.sh b/tests/e2e-openshift/otlp-metrics-traces/check_traces.sh
deleted file mode 100755
index 87f8dfb5..00000000
--- a/tests/e2e-openshift/otlp-metrics-traces/check_traces.sh
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-JAEGER_URL=$(oc -n chainsaw-otlp-metrics get route jaeger-allinone -o json | jq '.spec.host' -r)
-SERVICE_NAME="telemetrygen"
-
-while true; do
-  trace_exists=$(curl -ksSL "https://$JAEGER_URL/api/traces?service=$SERVICE_NAME&limit=1" | jq -r '.data | length')
-
-  if [[ $trace_exists -gt 0 ]]; then
-    echo "Traces for $SERVICE_NAME exist in Jaeger."
-    break
-  else
-    echo "Trace for $SERVICE_NAME does not exist in Jaeger. Fetching again..."
-  fi
-done
diff --git a/tests/e2e-openshift/otlp-metrics-traces/verify-traces.yaml b/tests/e2e-openshift/otlp-metrics-traces/verify-traces.yaml
new file mode 100644
index 00000000..20c34acc
--- /dev/null
+++ b/tests/e2e-openshift/otlp-metrics-traces/verify-traces.yaml
@@ -0,0 +1,24 @@
+apiVersion: batch/v1
+kind: Job
+metadata:
+  name: verify-traces
+spec:
+  template:
+    spec:
+      containers:
+      - name: verify-traces
+        image: ghcr.io/grafana/tempo-operator/test-utils:main
+        command: ["/bin/bash", "-eux", "-c"]
+        args:
+        - |
+          curl -sS -G \
+            --data-urlencode 'q={ resource.service.name="telemetrygen" }' \
+            http://tempo-otlpmetrics.chainsaw-otlp-metrics.svc:3200/api/search \
+            | tee /tmp/tempo.out
+
+          num_traces=$(jq ".traces | length" /tmp/tempo.out)
+          if [[ "$num_traces" -le "1" ]]; then
+            echo && echo "The Tempo API returned $num_traces."
+            exit 1
+          fi
+      restartPolicy: Never
diff --git a/tests/test-e2e-apps/dotnet/DiceRoller/DiceRoller.csproj b/tests/test-e2e-apps/dotnet/DiceRoller/DiceRoller.csproj
new file mode 100644
index 00000000..6bf3d4ab
--- /dev/null
+++ b/tests/test-e2e-apps/dotnet/DiceRoller/DiceRoller.csproj
@@ -0,0 +1,9 @@
+<Project Sdk="Microsoft.NET.Sdk.Web">
+
+  <PropertyGroup>
+    <TargetFramework>net7.0</TargetFramework>
+    <Nullable>enable</Nullable>
+    <ImplicitUsings>enable</ImplicitUsings>
+    </PropertyGroup>
+
+</Project>
diff --git a/tests/test-e2e-apps/dotnet/DiceRoller/Program.cs b/tests/test-e2e-apps/dotnet/DiceRoller/Program.cs
new file mode 100644
index 00000000..ff782f13
--- /dev/null
+++ b/tests/test-e2e-apps/dotnet/DiceRoller/Program.cs
@@ -0,0 +1,31 @@
+using System.Globalization;
+
+var builder = WebApplication.CreateBuilder(args);
+var app = builder.Build();
+
+var logger = app.Logger;
+
+int RollDice()
+{
+    // Corrected: Use Random.Shared
+    return Random.Shared.Next(1, 7);
+}
+
+string HandleRollDice(string? player)
+{
+    var result = RollDice();
+
+    if (string.IsNullOrEmpty(player))
+    {
+        logger.LogInformation("Anonymous player is rolling the dice: {result}", result);
+    }
+    else
+    {
+        logger.LogInformation("{player} is rolling the dice: {result}", player, result);
+    }
+
+    return result.ToString(CultureInfo.InvariantCulture);
+}
+
+app.MapGet("/rolldice/{player?}", HandleRollDice);
+app.Run();
diff --git a/tests/test-e2e-apps/dotnet/Dockerfile b/tests/test-e2e-apps/dotnet/Dockerfile
index c7f2eb83..e025523e 100644
--- a/tests/test-e2e-apps/dotnet/Dockerfile
+++ b/tests/test-e2e-apps/dotnet/Dockerfile
@@ -1,18 +1,36 @@
-FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:7.0.400-bookworm-slim-amd64 AS build
+# Stage 1: Build the application
+FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/sdk:7.0-bookworm-slim AS build
 ARG TARGETARCH
 WORKDIR /source
 
-RUN dotnet new webapp -o MyWebApp --no-https -f net7.0
+# Copy the project file first and restore dependencies
+# This improves Docker layer caching
+COPY DiceRoller/*.csproj ./DiceRoller/
+RUN dotnet restore ./DiceRoller/DiceRoller.csproj --arch $TARGETARCH
 
-WORKDIR /source/MyWebApp
-RUN dotnet publish -a $TARGETARCH -o /app
+# Copy the rest of the application code
+COPY DiceRoller/. ./DiceRoller/
 
-FROM mcr.microsoft.com/dotnet/aspnet:7.0.10-bullseye-slim
+# Publish the application
+# Update WORKDIR to the project directory before publishing
+WORKDIR /source/DiceRoller
+# Publish for the target architecture, in Release configuration, to the /app folder
+# --no-restore is used because we already restored dependencies
+RUN dotnet publish -a $TARGETARCH -c Release -o /app --no-restore
 
+# Stage 2: Create the runtime image
+FROM --platform=$BUILDPLATFORM mcr.microsoft.com/dotnet/aspnet:7.0-bookworm-slim
+
+# Environment variables for .NET runtime behavior
 ENV DOTNET_ROLL_FORWARD=Major
+# Consider setting DOTNET_ROLL_FORWARD_PRE_RELEASE to 0 (false) for production
 ENV DOTNET_ROLL_FORWARD_PRE_RELEASE=1
 
+# Set the working directory in the runtime image
 WORKDIR /app
+
+# Copy the published application artifacts from the build stage
 COPY --from=build /app/ .
 
-ENTRYPOINT ["./MyWebApp"]
\ No newline at end of file
+# Set the entry point to run the application
+ENTRYPOINT ["./DiceRoller"]
\ No newline at end of file
diff --git a/tests/test-e2e-apps/golang/Dockerfile b/tests/test-e2e-apps/golang/Dockerfile
index 6964ccd0..9b292613 100644
--- a/tests/test-e2e-apps/golang/Dockerfile
+++ b/tests/test-e2e-apps/golang/Dockerfile
@@ -1,8 +1,30 @@
-FROM golang:1.23-alpine as builder
+# Stage 1: Build the Go application
+FROM golang:1.23.0-alpine AS builder
 
+# Set the working directory inside the container for the build stage.
+WORKDIR /app
+
+# Copy the Go source file into the working directory inside the container.
 COPY main.go .
-RUN CGO_ENABLED=0 GOOS=linux GO111MODULE=on go build -o app main.go
 
+# Build the Go application.
+# - CGO_ENABLED=0: Disables CGO, which is necessary to build a statically linked binary
+#   that can run in a minimal 'scratch' image without external C libraries.
+# - GOOS=linux: Explicitly sets the target operating system to Linux, which is standard for containers.
+# -o /app/rolldice: Specifies the output path and name for the compiled executable inside this builder stage.
+# main.go: The source file to compile.
+RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-w -s" -o /app/rolldice main.go
+
+# Stage 2: Create the final minimal production image
 FROM scratch
-COPY --from=builder /go/app .
-ENTRYPOINT ["./app"]
+
+# Set the working directory for the final image.
+WORKDIR /
+
+# Copy only the compiled binary from the 'builder' stage (/app/rolldice)
+# into the root directory of the final 'scratch' image.
+COPY --from=builder /app/rolldice /rolldice
+
+# Set the command to run when the container starts.
+# This executes the compiled Go binary we copied into the image.
+ENTRYPOINT ["/rolldice"]
diff --git a/tests/test-e2e-apps/golang/main.go b/tests/test-e2e-apps/golang/main.go
index a911a8f5..76f43aa5 100644
--- a/tests/test-e2e-apps/golang/main.go
+++ b/tests/test-e2e-apps/golang/main.go
@@ -4,23 +4,106 @@
 package main
 
 import (
+	"crypto/rand"
 	"fmt"
+	"log"
+	"math/big"
 	"net/http"
+	"os"
+	"strconv"
 	"time"
 )
 
+// getRandomNumber generates a random integer between min and max (inclusive).
+func getRandomNumber(min, max int) (int, error) {
+	if min > max {
+		return 0, fmt.Errorf("min (%d) cannot be greater than max (%d)", min, max)
+	}
+
+	// Calculate the range size.
+	rangeSize := big.NewInt(int64(max - min + 1))
+
+	// Generate a random number n, where 0 <= n < rangeSize.
+	n, err := rand.Int(rand.Reader, rangeSize)
+	if err != nil {
+		// Return an error if random number generation fails
+		return 0, fmt.Errorf("failed to generate random number: %w", err)
+	}
+
+	// Convert the big.Int result back to a regular int.
+	// Add min to shift the range from [0, rangeSize) to [min, max].
+	// n.Int64() is safe here because rangeSize fits in int64 if max-min+1 does.
+	result := int(n.Int64()) + min
+	return result, nil
+}
+
+// rollDiceHandler handles requests to the /rolldice endpoint.
+func rollDiceHandler(w http.ResponseWriter, r *http.Request) {
+	// Ensure we only handle GET requests for this endpoint
+	if r.Method != http.MethodGet {
+		http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
+		return
+	}
+
+	// Generate a random number between 1 and 6
+	diceRoll, err := getRandomNumber(1, 6)
+	if err != nil {
+		// Log the error and return an internal server error if generation failed
+		log.Printf("Error generating random number: %v", err)
+		http.Error(w, "Internal Server Error", http.StatusInternalServerError)
+		return
+	}
+
+	// Convert the integer result to a string
+	responseString := strconv.Itoa(diceRoll)
+
+	// Set the content type header to text/plain
+	w.Header().Set("Content-Type", "text/plain")
+
+	// Write the string response back to the client
+	_, writeErr := fmt.Fprint(w, responseString)
+	if writeErr != nil {
+		// Log the error if writing the response failed (response may be partially sent)
+		log.Printf("Error writing response: %v", writeErr)
+		// Attempt to send an error, though headers might already be sent
+		// http.Error(w, "Internal Server Error", http.StatusInternalServerError) // Avoid sending second error
+	}
+	log.Printf("Rolled a %d for request from %s", diceRoll, r.RemoteAddr) // Optional: Log the roll
+}
+
 func main() {
-	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
-		fmt.Println("Hi")
-	})
+	// Get the port from the environment variable, default to "8095" if not set
+	port := os.Getenv("PORT")
+	if port == "" {
+		port = "8095"
+	}
+
+	// Register the handler function for the "/rolldice" path with the DefaultServeMux.
+	http.HandleFunc("/rolldice", rollDiceHandler)
+
+	// Construct the server address string (e.g., ":8095")
+	serverAddr := ":" + port
 
+	// Configure the HTTP server with timeouts
 	server := &http.Server{
-		Addr:              ":8080",
-		ReadHeaderTimeout: 3 * time.Second,
+		Addr: serverAddr,
+		// Use DefaultServeMux by leaving Handler nil, which includes our /rolldice handler
+		Handler:      nil,
+		ReadTimeout:  10 * time.Second, // Max time to read entire request, including body
+		WriteTimeout: 10 * time.Second, // Max time to write response
+		IdleTimeout:  60 * time.Second, // Max time for connections using TCP Keep-Alive
 	}
 
+	// Print a message indicating the server is starting
+	log.Printf("Listening for requests on http://localhost:%s", port)
+
+	// Start the configured HTTP server.
+	// This ListenAndServe is now called on our configured server instance.
 	err := server.ListenAndServe()
-	if err != nil {
-		panic(err)
+	if err != nil && err != http.ErrServerClosed {
+		// Log any fatal errors encountered during server startup, ignore ErrServerClosed
+		log.Fatalf("Server failed to start or unexpectedly closed: %v", err)
+	} else if err == http.ErrServerClosed {
+		log.Println("Server shut down gracefully")
 	}
 }
diff --git a/tests/test-e2e-apps/nodejs/Dockerfile b/tests/test-e2e-apps/nodejs/Dockerfile
index 7d624b85..b155963f 100644
--- a/tests/test-e2e-apps/nodejs/Dockerfile
+++ b/tests/test-e2e-apps/nodejs/Dockerfile
@@ -1,5 +1,26 @@
-FROM node:20-alpine3.17
-RUN npm install express  -g --verbose
-COPY index.js .
+# Stage 1: Use an official Node.js image as a base.
+FROM node:lts-bookworm
 
-ENTRYPOINT ["node", "index.js"]
\ No newline at end of file
+# Set the working directory inside the container
+WORKDIR /usr/src/app
+
+# Copy only package.json first to leverage Docker cache
+# We only need package.json since package-lock.json is absent
+COPY package.json ./
+
+# Install production dependencies using npm install
+# This will generate a package-lock.json within the layer based on package.json
+# and install only production dependencies.
+RUN npm install --only=production
+
+# Copy the rest of the application source code into the working directory
+COPY . .
+
+# Set environment variables
+ENV NODE_ENV=production
+
+# Set a default port. This can be overridden at runtime
+ENV PORT=3000
+
+# Define the command to run the application
+CMD ["node", "app.js"]
diff --git a/tests/test-e2e-apps/nodejs/app.js b/tests/test-e2e-apps/nodejs/app.js
new file mode 100644
index 00000000..06772b26
--- /dev/null
+++ b/tests/test-e2e-apps/nodejs/app.js
@@ -0,0 +1,18 @@
+/*app.js*/
+const express = require('express');
+
+const PORT = parseInt(process.env.PORT || '3000');
+const app = express();
+
+function getRandomNumber(min, max) {
+  return Math.floor(Math.random() * (max - min + 1) + min);
+}
+
+app.get('/rolldice', (req, res) => {
+  res.send(getRandomNumber(1, 6).toString());
+});
+
+app.listen(PORT, () => {
+  console.log(`Listening for requests on http://localhost:${PORT}`);
+});
+
diff --git a/tests/test-e2e-apps/nodejs/index.js b/tests/test-e2e-apps/nodejs/index.js
deleted file mode 100644
index 17e8f5ee..00000000
--- a/tests/test-e2e-apps/nodejs/index.js
+++ /dev/null
@@ -1,11 +0,0 @@
-const express = require('express')
-const app = express()
-const port = 3000
-
-app.get('/', (req, res) => {
-  res.send('Hello World!')
-})
-
-app.listen(port, () => {
-  console.log("Hi")
-})
diff --git a/tests/test-e2e-apps/nodejs/package.json b/tests/test-e2e-apps/nodejs/package.json
new file mode 100644
index 00000000..4557aebf
--- /dev/null
+++ b/tests/test-e2e-apps/nodejs/package.json
@@ -0,0 +1,15 @@
+{
+  "name": "nodejs",
+  "version": "1.0.0",
+  "description": "",
+  "main": "app.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "keywords": [],
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "express": "^5.1.0"
+  }
+}