diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
index cec3c3a22f33..d5e26a4a08c5 100644
--- a/.github/CODEOWNERS
+++ b/.github/CODEOWNERS
@@ -309,6 +309,8 @@ receiver/windowsperfcountersreceiver/                            @open-telemetry
 receiver/zipkinreceiver/                                         @open-telemetry/collector-contrib-approvers @MovieStoreGuy @andrzej-stencel @crobert-1
 receiver/zookeeperreceiver/                                      @open-telemetry/collector-contrib-approvers @djaglowski
 
+scraper/zookeeperscraper/                                        @open-telemetry/collector-contrib-approvers @djaglowski
+
 testbed/                                                         @open-telemetry/collector-contrib-approvers @open-telemetry/collector-approvers
 testbed/mockdatasenders/mockdatadogagentexporter/                @open-telemetry/collector-contrib-approvers @boostchicken
 
diff --git a/.github/ISSUE_TEMPLATE/bug_report.yaml b/.github/ISSUE_TEMPLATE/bug_report.yaml
index 684025a1b526..090ac6bdfd4e 100644
--- a/.github/ISSUE_TEMPLATE/bug_report.yaml
+++ b/.github/ISSUE_TEMPLATE/bug_report.yaml
@@ -311,6 +311,7 @@ body:
       - receiver/windowsperfcounters
       - receiver/zipkin
       - receiver/zookeeper
+      - scraper/zookeeperscraper
       - testbed
       - testbed/mockdatasenders/mockdatadogagentexporter
       # End Collector components list
diff --git a/.github/ISSUE_TEMPLATE/feature_request.yaml b/.github/ISSUE_TEMPLATE/feature_request.yaml
index 6dd4d83344f3..faa74202c42c 100644
--- a/.github/ISSUE_TEMPLATE/feature_request.yaml
+++ b/.github/ISSUE_TEMPLATE/feature_request.yaml
@@ -305,6 +305,7 @@ body:
       - receiver/windowsperfcounters
       - receiver/zipkin
       - receiver/zookeeper
+      - scraper/zookeeperscraper
       - testbed
       - testbed/mockdatasenders/mockdatadogagentexporter
       # End Collector components list
diff --git a/.github/ISSUE_TEMPLATE/other.yaml b/.github/ISSUE_TEMPLATE/other.yaml
index 3ae1f6623d2f..c0d87431483b 100644
--- a/.github/ISSUE_TEMPLATE/other.yaml
+++ b/.github/ISSUE_TEMPLATE/other.yaml
@@ -305,6 +305,7 @@ body:
       - receiver/windowsperfcounters
       - receiver/zipkin
       - receiver/zookeeper
+      - scraper/zookeeperscraper
       - testbed
       - testbed/mockdatasenders/mockdatadogagentexporter
       # End Collector components list
diff --git a/.github/ISSUE_TEMPLATE/unmaintained.yaml b/.github/ISSUE_TEMPLATE/unmaintained.yaml
index b1f1f809fe8b..135a3923abbb 100644
--- a/.github/ISSUE_TEMPLATE/unmaintained.yaml
+++ b/.github/ISSUE_TEMPLATE/unmaintained.yaml
@@ -310,6 +310,7 @@ body:
       - receiver/windowsperfcounters
       - receiver/zipkin
       - receiver/zookeeper
+      - scraper/zookeeperscraper
       - testbed
       - testbed/mockdatasenders/mockdatadogagentexporter
       # End Collector components list
diff --git a/cmd/otelcontribcol/builder-config.yaml b/cmd/otelcontribcol/builder-config.yaml
index 634d8c0f9ebb..3ca76898223b 100644
--- a/cmd/otelcontribcol/builder-config.yaml
+++ b/cmd/otelcontribcol/builder-config.yaml
@@ -253,4 +253,3 @@ providers:
 # When using `make genotelcontribcol`, a `replaces` section is appended to this
 # file before passing it to OCB, to ensure that local versions are used for all
 # Contrib modules.
-
diff --git a/receiver/zookeeperreceiver/README.md b/receiver/zookeeperreceiver/README.md
index 3819dafea1cb..9d0a6a5cb555 100644
--- a/receiver/zookeeperreceiver/README.md
+++ b/receiver/zookeeperreceiver/README.md
@@ -31,10 +31,6 @@ receivers:
     initial_delay: 1s
 ```
 
-## Metrics
+## Scraper
 
-Details about the metrics produced by this receiver can be found in [metadata.yaml](./metadata.yaml) with further documentation in [documentation.md](./documentation.md)
-
-## Limitations
-
-This receiver does not support scraping metrics from Zookeeper's [New Metric System](https://zookeeper.apache.org/doc/r3.6.3/zookeeperMonitor.html#Metrics-System).
+Details about the scraper in [README.md](../../scraper/zookeeperscraper/README.md)
diff --git a/receiver/zookeeperreceiver/config.go b/receiver/zookeeperreceiver/config.go
index 873484aac48c..e928cbbb9a06 100644
--- a/receiver/zookeeperreceiver/config.go
+++ b/receiver/zookeeperreceiver/config.go
@@ -4,14 +4,12 @@
 package zookeeperreceiver // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver"
 
 import (
-	"go.opentelemetry.io/collector/config/confignet"
 	"go.opentelemetry.io/collector/scraper/scraperhelper"
 
-	"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver/internal/metadata"
+	"github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper"
 )
 
 type Config struct {
 	scraperhelper.ControllerConfig `mapstructure:",squash"`
-	confignet.TCPAddrConfig        `mapstructure:",squash"`
-	metadata.MetricsBuilderConfig  `mapstructure:",squash"`
+	zookeeperscraper.Config        `mapstructure:",squash"`
 }
diff --git a/receiver/zookeeperreceiver/factory.go b/receiver/zookeeperreceiver/factory.go
index 6feba7061d00..4106c615541d 100644
--- a/receiver/zookeeperreceiver/factory.go
+++ b/receiver/zookeeperreceiver/factory.go
@@ -8,21 +8,21 @@ import (
 	"time"
 
 	"go.opentelemetry.io/collector/component"
-	"go.opentelemetry.io/collector/config/confignet"
 	"go.opentelemetry.io/collector/consumer"
 	"go.opentelemetry.io/collector/receiver"
-	"go.opentelemetry.io/collector/scraper"
 	"go.opentelemetry.io/collector/scraper/scraperhelper"
 
 	"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver/internal/metadata"
+	"github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper"
 )
 
 const (
-	defaultEndpoint           = "localhost:2181"
 	defaultCollectionInterval = 10 * time.Second
 	defaultTimeout            = 10 * time.Second
 )
 
+var sFact = zookeeperscraper.NewFactory()
+
 func NewFactory() receiver.Factory {
 	return receiver.NewFactory(
 		metadata.Type,
@@ -38,10 +38,7 @@ func createDefaultConfig() component.Config {
 
 	return &Config{
 		ControllerConfig: cfg,
-		TCPAddrConfig: confignet.TCPAddrConfig{
-			Endpoint: defaultEndpoint,
-		},
-		MetricsBuilderConfig: metadata.DefaultMetricsBuilderConfig(),
+		Config:           *sFact.CreateDefaultConfig().(*zookeeperscraper.Config),
 	}
 }
 
@@ -53,23 +50,10 @@ func createMetricsReceiver(
 	consumer consumer.Metrics,
 ) (receiver.Metrics, error) {
 	rConfig := config.(*Config)
-	zms, err := newZookeeperMetricsScraper(params, rConfig)
-	if err != nil {
-		return nil, err
-	}
-
-	scrp, err := scraper.NewMetrics(
-		zms.scrape,
-		scraper.WithShutdown(zms.shutdown),
-	)
-	if err != nil {
-		return nil, err
-	}
-
 	return scraperhelper.NewMetricsController(
 		&rConfig.ControllerConfig,
 		params,
 		consumer,
-		scraperhelper.AddScraper(metadata.Type, scrp),
+		scraperhelper.AddFactoryWithConfig(sFact, &rConfig.Config),
 	)
 }
diff --git a/receiver/zookeeperreceiver/factory_test.go b/receiver/zookeeperreceiver/factory_test.go
deleted file mode 100644
index d1690dfd9ba9..000000000000
--- a/receiver/zookeeperreceiver/factory_test.go
+++ /dev/null
@@ -1,77 +0,0 @@
-// Copyright The OpenTelemetry Authors
-// SPDX-License-Identifier: Apache-2.0
-
-package zookeeperreceiver
-
-import (
-	"context"
-	"testing"
-	"time"
-
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
-	"go.opentelemetry.io/collector/component"
-	"go.opentelemetry.io/collector/config/confignet"
-	"go.opentelemetry.io/collector/consumer/consumertest"
-	"go.opentelemetry.io/collector/receiver/receivertest"
-
-	"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver/internal/metadata"
-)
-
-func TestFactory(t *testing.T) {
-	f := NewFactory()
-	require.Equal(t, metadata.Type, f.Type())
-
-	cfg := f.CreateDefaultConfig()
-	rCfg := cfg.(*Config)
-
-	// Assert defaults.
-	assert.Equal(t, 10*time.Second, rCfg.CollectionInterval)
-	assert.Equal(t, 10*time.Second, rCfg.Timeout)
-	assert.Equal(t, "localhost:2181", rCfg.Endpoint)
-
-	tests := []struct {
-		name    string
-		config  component.Config
-		wantErr bool
-	}{
-		{
-			name:   "Happy path",
-			config: createDefaultConfig(),
-		},
-		{
-			name:    "Invalid endpoint",
-			config:  &Config{},
-			wantErr: true,
-		},
-		{
-			name: "Invalid timeout",
-			config: &Config{
-				TCPAddrConfig: confignet.TCPAddrConfig{
-					Endpoint: ":2181",
-				},
-			},
-			wantErr: true,
-		},
-	}
-
-	for _, test := range tests {
-		t.Run(test.name, func(t *testing.T) {
-			r, err := f.CreateMetrics(
-				context.Background(),
-				receivertest.NewNopSettings(),
-				test.config,
-				consumertest.NewNop(),
-			)
-
-			if test.wantErr {
-				require.Error(t, err)
-				require.Nil(t, r)
-				return
-			}
-
-			require.NoError(t, err)
-			require.NotNil(t, r)
-		})
-	}
-}
diff --git a/receiver/zookeeperreceiver/go.mod b/receiver/zookeeperreceiver/go.mod
index e14ba035dbf9..94e36ba63d43 100644
--- a/receiver/zookeeperreceiver/go.mod
+++ b/receiver/zookeeperreceiver/go.mod
@@ -3,27 +3,20 @@ module github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookee
 go 1.22.0
 
 require (
-	github.com/google/go-cmp v0.6.0
-	github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.118.0
 	github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal v0.118.0
-	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.118.0
 	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.118.0
+	github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper v0.118.0
 	github.com/stretchr/testify v1.10.0
 	github.com/testcontainers/testcontainers-go v0.35.0
 	go.opentelemetry.io/collector/component v0.118.1-0.20250130000211-c119b2a55eb4
 	go.opentelemetry.io/collector/component/componenttest v0.118.1-0.20250130000211-c119b2a55eb4
-	go.opentelemetry.io/collector/config/confignet v1.24.1-0.20250130000211-c119b2a55eb4
 	go.opentelemetry.io/collector/confmap v1.24.1-0.20250130000211-c119b2a55eb4
 	go.opentelemetry.io/collector/consumer v1.24.1-0.20250130000211-c119b2a55eb4
 	go.opentelemetry.io/collector/consumer/consumertest v0.118.1-0.20250130000211-c119b2a55eb4
-	go.opentelemetry.io/collector/filter v0.118.1-0.20250130000211-c119b2a55eb4
-	go.opentelemetry.io/collector/pdata v1.24.1-0.20250130000211-c119b2a55eb4
 	go.opentelemetry.io/collector/receiver v0.118.1-0.20250130000211-c119b2a55eb4
 	go.opentelemetry.io/collector/receiver/receivertest v0.118.1-0.20250130000211-c119b2a55eb4
-	go.opentelemetry.io/collector/scraper v0.118.1-0.20250130000211-c119b2a55eb4
 	go.opentelemetry.io/collector/scraper/scraperhelper v0.118.1-0.20250130000211-c119b2a55eb4
 	go.uber.org/goleak v1.3.0
-	go.uber.org/zap v1.27.0
 )
 
 require (
@@ -47,7 +40,6 @@ require (
 	github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
 	github.com/gogo/protobuf v1.3.2 // indirect
 	github.com/google/uuid v1.6.0 // indirect
-	github.com/hashicorp/go-version v1.7.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
 	github.com/klauspost/compress v1.17.9 // indirect
 	github.com/knadh/koanf/maps v0.1.1 // indirect
@@ -66,6 +58,7 @@ require (
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
 	github.com/morikuni/aec v1.0.0 // indirect
+	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.118.0 // indirect
 	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.118.0 // indirect
 	github.com/opencontainers/go-digest v1.0.0 // indirect
 	github.com/opencontainers/image-spec v1.1.0 // indirect
@@ -79,40 +72,36 @@ require (
 	github.com/tklauser/numcpus v0.6.1 // indirect
 	github.com/yusufpapurcu/wmi v1.2.4 // indirect
 	go.opentelemetry.io/auto/sdk v1.1.0 // indirect
+	go.opentelemetry.io/collector/config/confignet v1.24.1-0.20250130000211-c119b2a55eb4 // indirect
 	go.opentelemetry.io/collector/config/configtelemetry v0.118.1-0.20250130000211-c119b2a55eb4 // indirect
 	go.opentelemetry.io/collector/consumer/consumererror v0.118.1-0.20250130000211-c119b2a55eb4 // indirect
 	go.opentelemetry.io/collector/consumer/xconsumer v0.118.1-0.20250130000211-c119b2a55eb4 // indirect
-	go.opentelemetry.io/collector/featuregate v1.24.1-0.20250130000211-c119b2a55eb4 // indirect
+	go.opentelemetry.io/collector/filter v0.118.1-0.20250130000211-c119b2a55eb4 // indirect
+	go.opentelemetry.io/collector/pdata v1.24.1-0.20250130000211-c119b2a55eb4 // indirect
 	go.opentelemetry.io/collector/pdata/pprofile v0.118.1-0.20250130000211-c119b2a55eb4 // indirect
 	go.opentelemetry.io/collector/pipeline v0.118.1-0.20250130000211-c119b2a55eb4 // indirect
 	go.opentelemetry.io/collector/receiver/xreceiver v0.118.1-0.20250130000211-c119b2a55eb4 // indirect
+	go.opentelemetry.io/collector/scraper v0.118.1-0.20250130000211-c119b2a55eb4 // indirect
 	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 // indirect
 	go.opentelemetry.io/otel v1.34.0 // indirect
-	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 // indirect
+	go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 // indirect
 	go.opentelemetry.io/otel/metric v1.34.0 // indirect
 	go.opentelemetry.io/otel/sdk v1.34.0 // indirect
 	go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect
 	go.opentelemetry.io/otel/trace v1.34.0 // indirect
-	go.opentelemetry.io/proto/otlp v1.0.0 // indirect
+	go.opentelemetry.io/proto/otlp v1.5.0 // indirect
 	go.uber.org/multierr v1.11.0 // indirect
+	go.uber.org/zap v1.27.0 // indirect
 	golang.org/x/crypto v0.31.0 // indirect
 	golang.org/x/net v0.33.0 // indirect
 	golang.org/x/sys v0.29.0 // indirect
 	golang.org/x/text v0.21.0 // indirect
-	google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d // indirect
 	google.golang.org/grpc v1.70.0 // indirect
 	google.golang.org/protobuf v1.36.4 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 )
 
-replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/common => ../../internal/common
-
-replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest
-
-replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil
-
-replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal
-
 // see https://github.com/distribution/distribution/issues/3590
 exclude github.com/docker/distribution v2.8.0+incompatible
 
@@ -122,4 +111,14 @@ retract (
 	v0.65.0
 )
 
+replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/coreinternal => ../../internal/coreinternal
+
+replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil
+
 replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden
+
+replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest
+
+replace github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper => ../../scraper/zookeeperscraper
+
+replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/common => ../../internal/common
diff --git a/receiver/zookeeperreceiver/go.sum b/receiver/zookeeperreceiver/go.sum
index b01c1a08b66e..62579f75cd4d 100644
--- a/receiver/zookeeperreceiver/go.sum
+++ b/receiver/zookeeperreceiver/go.sum
@@ -50,8 +50,8 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
 github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
 github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
 github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0 h1:YBftPWNWd4WwGqtY2yeZL2ef8rHAxPBD8KFhJpmcqms=
-github.com/grpc-ecosystem/grpc-gateway/v2 v2.16.0/go.mod h1:YN5jB8ie0yfIUg6VvR9Kz84aCaG7AsGZnLjhHbUqwPg=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1 h1:VNqngBF40hVlDloBruUehVYC3ArSgIyScOAyMRqBxRg=
+github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1/go.mod h1:RBRO7fro65R6tjKzYgLAFo0t1QEXY1Dp+i/bvpRiqiQ=
 github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY=
 github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
 github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
@@ -176,12 +176,14 @@ go.opentelemetry.io/collector/scraper v0.118.1-0.20250130000211-c119b2a55eb4 h1:
 go.opentelemetry.io/collector/scraper v0.118.1-0.20250130000211-c119b2a55eb4/go.mod h1:3emjr1Or5hqINEzb5848fDpZguQQqwQ3ES44sASQGUg=
 go.opentelemetry.io/collector/scraper/scraperhelper v0.118.1-0.20250130000211-c119b2a55eb4 h1:60dZvPmmzQpaqXAej/OKdRDYjFv8kyBOJB+6VFn5vZ0=
 go.opentelemetry.io/collector/scraper/scraperhelper v0.118.1-0.20250130000211-c119b2a55eb4/go.mod h1:lmaDcg1p2+Kt7iEtrzyL0AETFQs9bStgZU8XHoI+5pU=
+go.opentelemetry.io/collector/scraper/scrapertest v0.118.1-0.20250130000211-c119b2a55eb4 h1:tNlNF+T+ktGLtcEdWSB4BW0NHnzqIHWavOp1wwXuvnw=
+go.opentelemetry.io/collector/scraper/scrapertest v0.118.1-0.20250130000211-c119b2a55eb4/go.mod h1:r0lzMsazeHI+Rs4oHjTIeaB4fMIidjePZHQxOCP9RrA=
 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0 h1:jq9TW8u3so/bN+JPT166wjOI6/vQPF6Xe7nMNIltagk=
 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.49.0/go.mod h1:p8pYQP+m5XfbZm9fxtSKAbM6oIllS7s2AfxrChvc7iw=
 go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
 go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0 h1:Mne5On7VWdx7omSrSSZvM4Kw7cS7NQkOOmLcgscI51U=
-go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.19.0/go.mod h1:IPtUMKL4O3tH5y+iXVyAXqpAwMuzC1IrxVS81rummfE=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0 h1:OeNbIYk/2C15ckl7glBlOBp5+WlYsOElzTNmiPW/x60=
+go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.34.0/go.mod h1:7Bept48yIeqxP2OZ9/AqIpYS94h2or0aB4FypJTc8ZM=
 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0 h1:j9+03ymgYhPKmeXGk5Zu+cIZOlVzd9Zv7QIiyItjFBU=
 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.28.0/go.mod h1:Y5+XiUG4Emn1hTfciPzGPJaSI+RpDts6BnCIir0SLqk=
 go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
@@ -192,8 +194,8 @@ go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce
 go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
 go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
 go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
-go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I=
-go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM=
+go.opentelemetry.io/proto/otlp v1.5.0 h1:xJvq7gMzB31/d406fB8U5CBdyQGw4P399D1aQWU/3i4=
+go.opentelemetry.io/proto/otlp v1.5.0/go.mod h1:keN8WnHxOy8PG0rQZjJJ5A2ebUoafqWp0eVQ4yIXvJ4=
 go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
 go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
 go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
@@ -243,10 +245,10 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
 golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
 golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
-google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a h1:OAiGFfOiA0v9MRYsSidp3ubZaBnteRUyn3xB2ZQ5G/E=
-google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a/go.mod h1:jehYqy3+AhJU9ve55aNOaSml7wUXjF9x6z2LcCfpAhY=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a h1:hgh8P4EuoxpsuKMXX/To36nOFD7vixReXgn8lPGnt+o=
-google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU=
+google.golang.org/genproto/googleapis/api v0.0.0-20250102185135-69823020774d h1:H8tOf8XM88HvKqLTxe755haY6r1fqqzLbEnfrmLXlSA=
+google.golang.org/genproto/googleapis/api v0.0.0-20250102185135-69823020774d/go.mod h1:2v7Z7gP2ZUOGsaFyxATQSRoBnKygqVq2Cwnvom7QiqY=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d h1:xJJRGY7TJcvIlpSrN3K6LAWgNFUILlO+OMAqtg9aqnw=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d/go.mod h1:3ENsm/5D1mzDyhpzeRi1NR784I0BcofWBoSc5QqqMK4=
 google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
 google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
 google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM=
diff --git a/receiver/zookeeperreceiver/metadata.yaml b/receiver/zookeeperreceiver/metadata.yaml
index e72fbbf068c0..f0ced1348fc8 100644
--- a/receiver/zookeeperreceiver/metadata.yaml
+++ b/receiver/zookeeperreceiver/metadata.yaml
@@ -9,151 +9,5 @@ status:
     active: [djaglowski]
     seeking_new: true
 
-resource_attributes:
-  server.state:
-    description: State of the Zookeeper server (leader, standalone or follower).
-    enabled: true
-    type: string
-  zk.version:
-    description: Zookeeper version of the instance.
-    enabled: true
-    type: string
-
-attributes:
-  state:
-    description: State of followers
-    type: string
-    enum:
-      - synced
-      - unsynced
-  direction:
-    description: State of a packet based on io direction.
-    type: string
-    enum:
-      - received
-      - sent
-
-metrics:
-  zookeeper.follower.count:
-    enabled: true
-    description: The number of followers. Only exposed by the leader.
-    unit: "{followers}"
-    attributes: [state]
-    sum:
-      monotonic: false
-      aggregation_temporality: cumulative
-      value_type: int
-  zookeeper.sync.pending:
-    enabled: true
-    description: The number of pending syncs from the followers. Only exposed by the leader.
-    unit: "{syncs}"
-    sum:
-      monotonic: false
-      aggregation_temporality: cumulative
-      value_type: int
-  zookeeper.latency.avg:
-    enabled: true
-    description: Average time in milliseconds for requests to be processed.
-    unit: ms
-    gauge:
-      value_type: int
-  zookeeper.latency.max:
-    enabled: true
-    description: Maximum time in milliseconds for requests to be processed.
-    unit: ms
-    gauge:
-      value_type: int
-  zookeeper.latency.min:
-    enabled: true
-    description: Minimum time in milliseconds for requests to be processed.
-    unit: ms
-    gauge:
-      value_type: int
-  zookeeper.connection.active:
-    enabled: true
-    description: Number of active clients connected to a ZooKeeper server.
-    unit: "{connections}"
-    sum:
-      monotonic: false
-      aggregation_temporality: cumulative
-      value_type: int
-  zookeeper.request.active:
-    enabled: true
-    description: Number of currently executing requests.
-    unit: "{requests}"
-    sum:
-      monotonic: false
-      aggregation_temporality: cumulative
-      value_type: int
-  zookeeper.znode.count:
-    enabled: true
-    description: Number of z-nodes that a ZooKeeper server has in its data tree.
-    unit: "{znodes}"
-    sum:
-      monotonic: false
-      aggregation_temporality: cumulative
-      value_type: int
-  zookeeper.watch.count:
-    enabled: true
-    description: Number of watches placed on Z-Nodes on a ZooKeeper server.
-    unit: "{watches}"
-    sum:
-      monotonic: false
-      aggregation_temporality: cumulative
-      value_type: int
-  zookeeper.data_tree.ephemeral_node.count:
-    enabled: true
-    description: Number of ephemeral nodes that a ZooKeeper server has in its data tree.
-    unit: "{nodes}"
-    sum:
-      monotonic: false
-      aggregation_temporality: cumulative
-      value_type: int
-  zookeeper.data_tree.size:
-    enabled: true
-    description: Size of data in bytes that a ZooKeeper server has in its data tree.
-    unit: By
-    sum:
-      monotonic: false
-      aggregation_temporality: cumulative
-      value_type: int
-  zookeeper.file_descriptor.open:
-    enabled: true
-    description: Number of file descriptors that a ZooKeeper server has open.
-    unit: "{file_descriptors}"
-    sum:
-      monotonic: false
-      aggregation_temporality: cumulative
-      value_type: int
-  zookeeper.file_descriptor.limit:
-    enabled: true
-    description: Maximum number of file descriptors that a ZooKeeper server can open.
-    unit: "{file_descriptors}"
-    gauge:
-      value_type: int
-  zookeeper.packet.count:
-    enabled: true
-    description: The number of ZooKeeper packets received or sent by a server.
-    unit: "{packets}"
-    attributes: [direction]
-    sum:
-      value_type: int
-      monotonic: true
-      aggregation_temporality: cumulative
-  zookeeper.fsync.exceeded_threshold.count:
-    enabled: true
-    description: Number of times fsync duration has exceeded warning threshold.
-    unit: "{events}"
-    sum:
-      value_type: int
-      monotonic: true
-      aggregation_temporality: cumulative
-  zookeeper.ruok:
-    enabled: true
-    description: Response from zookeeper ruok command
-    unit: "1"
-    gauge:
-      value_type: int
-
 tests:
   config:
diff --git a/receiver/zookeeperreceiver/testdata/integration/expected-3.4.13.yaml b/receiver/zookeeperreceiver/testdata/integration/expected-3.4.13.yaml
index 21c82a63ad2a..8a5a8fa33d03 100644
--- a/receiver/zookeeperreceiver/testdata/integration/expected-3.4.13.yaml
+++ b/receiver/zookeeperreceiver/testdata/integration/expected-3.4.13.yaml
@@ -144,5 +144,5 @@ resourceMetrics:
                   timeUnixNano: "1684779363308697000"
             unit: '{znodes}'
         scope:
-          name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver
+          name: github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper
           version: latest
diff --git a/receiver/zookeeperreceiver/testdata/integration/expected-3.5.10-standalone.yaml b/receiver/zookeeperreceiver/testdata/integration/expected-3.5.10-standalone.yaml
index 1deede267134..d8c54801e898 100644
--- a/receiver/zookeeperreceiver/testdata/integration/expected-3.5.10-standalone.yaml
+++ b/receiver/zookeeperreceiver/testdata/integration/expected-3.5.10-standalone.yaml
@@ -134,5 +134,5 @@ resourceMetrics:
                   timeUnixNano: "1684780475969536000"
             unit: '{znodes}'
         scope:
-          name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver
+          name: github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper
           version: latest
diff --git a/receiver/zookeeperreceiver/testdata/integration/expected-3.5.10.yaml b/receiver/zookeeperreceiver/testdata/integration/expected-3.5.10.yaml
index 1f0576dd0796..785dc5e1df20 100644
--- a/receiver/zookeeperreceiver/testdata/integration/expected-3.5.10.yaml
+++ b/receiver/zookeeperreceiver/testdata/integration/expected-3.5.10.yaml
@@ -163,5 +163,5 @@ resourceMetrics:
                   timeUnixNano: "1684779392577522000"
             unit: '{znodes}'
         scope:
-          name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver
+          name: github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper
           version: latest
diff --git a/reports/distributions/contrib.yaml b/reports/distributions/contrib.yaml
index 1f2347d84634..e98b5b7d6d3b 100644
--- a/reports/distributions/contrib.yaml
+++ b/reports/distributions/contrib.yaml
@@ -213,3 +213,4 @@ components:
         - process
         - processes
         - system
+        - zookeeper
diff --git a/scraper/zookeeperscraper/Makefile b/scraper/zookeeperscraper/Makefile
new file mode 100644
index 000000000000..c1496226e590
--- /dev/null
+++ b/scraper/zookeeperscraper/Makefile
@@ -0,0 +1 @@
+include ../../Makefile.Common
\ No newline at end of file
diff --git a/scraper/zookeeperscraper/README.md b/scraper/zookeeperscraper/README.md
new file mode 100644
index 000000000000..3611914e945c
--- /dev/null
+++ b/scraper/zookeeperscraper/README.md
@@ -0,0 +1,30 @@
+# Zookeeper Scraper
+
+<!-- status autogenerated section -->
+| Status        |           |
+| ------------- |-----------|
+| Stability     | [alpha]: metrics   |
+| Distributions | [contrib] |
+| Issues        | [![Open issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aopen%20label%3Ascraper%2Fzookeeper%20&label=open&color=orange&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aopen+is%3Aissue+label%3Ascraper%2Fzookeeper) [![Closed issues](https://img.shields.io/github/issues-search/open-telemetry/opentelemetry-collector-contrib?query=is%3Aissue%20is%3Aclosed%20label%3Ascraper%2Fzookeeper%20&label=closed&color=blue&logo=opentelemetry)](https://github.com/open-telemetry/opentelemetry-collector-contrib/issues?q=is%3Aclosed+is%3Aissue+label%3Ascraper%2Fzookeeper) |
+| [Code Owners](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/CONTRIBUTING.md#becoming-a-code-owner)    | [@djaglowski](https://www.github.com/djaglowski) \| Seeking more code owners! |
+
+[alpha]: https://github.com/open-telemetry/opentelemetry-collector/blob/main/docs/component-stability.md#alpha
+[contrib]: https://github.com/open-telemetry/opentelemetry-collector-releases/tree/main/distributions/otelcol-contrib
+<!-- end autogenerated section -->
+
+The Zookeeper scraper collects metrics from a Zookeeper instance, using the `mntr` command. The `mntr` 4 letter word command needs
+to be enabled for the scraper to be able to collect metrics.
+
+## Configuration
+
+- `endpoint`: (default = `localhost:2181`) Endpoint to connect to collect metrics. Takes the form `host:port`. See our [security best practices doc](https://opentelemetry.io/docs/security/config-best-practices/#protect-against-denial-of-service-attacks) to understand how to set the endpoint in different environments.
+
+Example configuration.
+
+## Metrics
+
+Details about the metrics produced by this scraper can be found in [metadata.yaml](./metadata.yaml) with further documentation in [documentation.md](./documentation.md)
+
+## Limitations
+
+This scraper does not support scraping metrics from Zookeeper's [New Metric System](https://zookeeper.apache.org/doc/r3.6.3/zookeeperMonitor.html#Metrics-System).
diff --git a/scraper/zookeeperscraper/config.go b/scraper/zookeeperscraper/config.go
new file mode 100644
index 000000000000..9fdfd1b53bce
--- /dev/null
+++ b/scraper/zookeeperscraper/config.go
@@ -0,0 +1,22 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+package zookeeperscraper // import "github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper"
+
+import (
+	"net"
+
+	"go.opentelemetry.io/collector/config/confignet"
+
+	"github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper/internal/metadata"
+)
+
+type Config struct {
+	confignet.TCPAddrConfig       `mapstructure:",squash"`
+	metadata.MetricsBuilderConfig `mapstructure:",squash"`
+}
+
+func (cfg *Config) Validate() error {
+	_, _, err := net.SplitHostPort(cfg.TCPAddrConfig.Endpoint)
+	return err
+}
diff --git a/scraper/zookeeperscraper/config_test.go b/scraper/zookeeperscraper/config_test.go
new file mode 100644
index 000000000000..509f469ebb40
--- /dev/null
+++ b/scraper/zookeeperscraper/config_test.go
@@ -0,0 +1,15 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+package zookeeperscraper
+
+import (
+	"testing"
+
+	"github.com/stretchr/testify/require"
+)
+
+func TestConfigValidate(t *testing.T) {
+	cfg := &Config{}
+	require.Error(t, cfg.Validate())
+}
diff --git a/scraper/zookeeperscraper/doc.go b/scraper/zookeeperscraper/doc.go
new file mode 100644
index 000000000000..621baf58b57b
--- /dev/null
+++ b/scraper/zookeeperscraper/doc.go
@@ -0,0 +1,6 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+//go:generate mdatagen metadata.yaml
+
+package zookeeperscraper // import "github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper"
diff --git a/receiver/zookeeperreceiver/documentation.md b/scraper/zookeeperscraper/documentation.md
similarity index 100%
rename from receiver/zookeeperreceiver/documentation.md
rename to scraper/zookeeperscraper/documentation.md
diff --git a/scraper/zookeeperscraper/factory.go b/scraper/zookeeperscraper/factory.go
new file mode 100644
index 000000000000..1ec2354e38dc
--- /dev/null
+++ b/scraper/zookeeperscraper/factory.go
@@ -0,0 +1,44 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+package zookeeperscraper // import "github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper"
+
+import (
+	"context"
+
+	"go.opentelemetry.io/collector/component"
+	"go.opentelemetry.io/collector/config/confignet"
+	"go.opentelemetry.io/collector/scraper"
+
+	"github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper/internal/metadata"
+)
+
+const (
+	defaultEndpoint = "localhost:2181"
+)
+
+func NewFactory() scraper.Factory {
+	return scraper.NewFactory(
+		metadata.Type,
+		createDefaultConfig,
+		scraper.WithMetrics(createMetrics, metadata.MetricsStability),
+	)
+}
+
+func createDefaultConfig() component.Config {
+	return &Config{
+		TCPAddrConfig: confignet.TCPAddrConfig{
+			Endpoint: defaultEndpoint,
+		},
+		MetricsBuilderConfig: metadata.DefaultMetricsBuilderConfig(),
+	}
+}
+
+// createMetrics creates zookeeper (metrics) scraper.
+func createMetrics(
+	_ context.Context,
+	params scraper.Settings,
+	config component.Config,
+) (scraper.Metrics, error) {
+	return newZookeeperMetricsScraper(params, config.(*Config)), nil
+}
diff --git a/scraper/zookeeperscraper/factory_test.go b/scraper/zookeeperscraper/factory_test.go
new file mode 100644
index 000000000000..13650c65acaa
--- /dev/null
+++ b/scraper/zookeeperscraper/factory_test.go
@@ -0,0 +1,29 @@
+// Copyright The OpenTelemetry Authors
+// SPDX-License-Identifier: Apache-2.0
+
+package zookeeperscraper
+
+import (
+	"context"
+	"testing"
+
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+	"go.opentelemetry.io/collector/scraper/scrapertest"
+
+	"github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper/internal/metadata"
+)
+
+func TestFactory(t *testing.T) {
+	f := NewFactory()
+	require.Equal(t, metadata.Type, f.Type())
+
+	cfg := f.CreateDefaultConfig()
+	// Assert defaults.
+	assert.Equal(t, "localhost:2181", cfg.(*Config).Endpoint)
+
+	r, err := f.CreateMetrics(context.Background(), scrapertest.NewNopSettings(), cfg)
+
+	require.NoError(t, err)
+	require.NotNil(t, r)
+}
diff --git a/scraper/zookeeperscraper/generated_component_test.go b/scraper/zookeeperscraper/generated_component_test.go
new file mode 100644
index 000000000000..64ed6f2c3a3b
--- /dev/null
+++ b/scraper/zookeeperscraper/generated_component_test.go
@@ -0,0 +1,68 @@
+// Code generated by mdatagen. DO NOT EDIT.
+
+package zookeeperscraper
+
+import (
+	"context"
+	"testing"
+
+	"github.com/stretchr/testify/require"
+	"go.opentelemetry.io/collector/component"
+	"go.opentelemetry.io/collector/component/componenttest"
+	"go.opentelemetry.io/collector/confmap/confmaptest"
+	"go.opentelemetry.io/collector/scraper"
+	"go.opentelemetry.io/collector/scraper/scrapertest"
+)
+
+func TestComponentFactoryType(t *testing.T) {
+	require.Equal(t, "zookeeper", NewFactory().Type().String())
+}
+
+func TestComponentConfigStruct(t *testing.T) {
+	require.NoError(t, componenttest.CheckConfigStruct(NewFactory().CreateDefaultConfig()))
+}
+
+func TestComponentLifecycle(t *testing.T) {
+	factory := NewFactory()
+
+	tests := []struct {
+		createFn func(ctx context.Context, set scraper.Settings, cfg component.Config) (component.Component, error)
+		name     string
+	}{
+
+		{
+			name: "metrics",
+			createFn: func(ctx context.Context, set scraper.Settings, cfg component.Config) (component.Component, error) {
+				return factory.CreateMetrics(ctx, set, cfg)
+			},
+		},
+	}
+
+	cm, err := confmaptest.LoadConf("metadata.yaml")
+	require.NoError(t, err)
+	cfg := factory.CreateDefaultConfig()
+	sub, err := cm.Sub("tests::config")
+	require.NoError(t, err)
+	require.NoError(t, sub.Unmarshal(&cfg))
+
+	for _, tt := range tests {
+		t.Run(tt.name+"-shutdown", func(t *testing.T) {
+			c, err := tt.createFn(context.Background(), scrapertest.NewNopSettings(), cfg)
+			require.NoError(t, err)
+			err = c.Shutdown(context.Background())
+			require.NoError(t, err)
+		})
+		t.Run(tt.name+"-lifecycle", func(t *testing.T) {
+			firstRcvr, err := tt.createFn(context.Background(), scrapertest.NewNopSettings(), cfg)
+			require.NoError(t, err)
+			host := componenttest.NewNopHost()
+			require.NoError(t, err)
+			require.NoError(t, firstRcvr.Start(context.Background(), host))
+			require.NoError(t, firstRcvr.Shutdown(context.Background()))
+			secondRcvr, err := tt.createFn(context.Background(), scrapertest.NewNopSettings(), cfg)
+			require.NoError(t, err)
+			require.NoError(t, secondRcvr.Start(context.Background(), host))
+			require.NoError(t, secondRcvr.Shutdown(context.Background()))
+		})
+	}
+}
diff --git a/scraper/zookeeperscraper/generated_package_test.go b/scraper/zookeeperscraper/generated_package_test.go
new file mode 100644
index 000000000000..bf88a1698c5e
--- /dev/null
+++ b/scraper/zookeeperscraper/generated_package_test.go
@@ -0,0 +1,13 @@
+// Code generated by mdatagen. DO NOT EDIT.
+
+package zookeeperscraper
+
+import (
+	"testing"
+
+	"go.uber.org/goleak"
+)
+
+func TestMain(m *testing.M) {
+	goleak.VerifyTestMain(m)
+}
diff --git a/scraper/zookeeperscraper/go.mod b/scraper/zookeeperscraper/go.mod
new file mode 100644
index 000000000000..36c4184faf91
--- /dev/null
+++ b/scraper/zookeeperscraper/go.mod
@@ -0,0 +1,67 @@
+module github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper
+
+go 1.22.0
+
+require (
+	github.com/google/go-cmp v0.6.0
+	github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.118.0
+	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden v0.118.0
+	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest v0.118.0
+	github.com/stretchr/testify v1.10.0
+	go.opentelemetry.io/collector/component v0.118.1-0.20250130000211-c119b2a55eb4
+	go.opentelemetry.io/collector/component/componenttest v0.118.1-0.20250130000211-c119b2a55eb4
+	go.opentelemetry.io/collector/config/confignet v1.24.1-0.20250130000211-c119b2a55eb4
+	go.opentelemetry.io/collector/confmap v1.24.1-0.20250130000211-c119b2a55eb4
+	go.opentelemetry.io/collector/filter v0.118.1-0.20250130000211-c119b2a55eb4
+	go.opentelemetry.io/collector/pdata v1.24.1-0.20250130000211-c119b2a55eb4
+	go.opentelemetry.io/collector/scraper v0.118.1-0.20250130000211-c119b2a55eb4
+	go.opentelemetry.io/collector/scraper/scrapertest v0.118.1-0.20250130000211-c119b2a55eb4
+	go.uber.org/goleak v1.3.0
+	go.uber.org/zap v1.27.0
+)
+
+require (
+	github.com/cespare/xxhash/v2 v2.3.0 // indirect
+	github.com/davecgh/go-spew v1.1.1 // indirect
+	github.com/go-logr/logr v1.4.2 // indirect
+	github.com/go-logr/stdr v1.2.2 // indirect
+	github.com/go-viper/mapstructure/v2 v2.2.1 // indirect
+	github.com/gogo/protobuf v1.3.2 // indirect
+	github.com/google/uuid v1.6.0 // indirect
+	github.com/hashicorp/go-version v1.7.0 // indirect
+	github.com/json-iterator/go v1.1.12 // indirect
+	github.com/knadh/koanf/maps v0.1.1 // indirect
+	github.com/knadh/koanf/providers/confmap v0.1.0 // indirect
+	github.com/knadh/koanf/v2 v2.1.2 // indirect
+	github.com/mitchellh/copystructure v1.2.0 // indirect
+	github.com/mitchellh/reflectwalk v1.0.2 // indirect
+	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
+	github.com/modern-go/reflect2 v1.0.2 // indirect
+	github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil v0.118.0 // indirect
+	github.com/pmezard/go-difflib v1.0.0 // indirect
+	go.opentelemetry.io/auto/sdk v1.1.0 // indirect
+	go.opentelemetry.io/collector/config/configtelemetry v0.118.1-0.20250130000211-c119b2a55eb4 // indirect
+	go.opentelemetry.io/collector/featuregate v1.24.1-0.20250130000211-c119b2a55eb4 // indirect
+	go.opentelemetry.io/collector/pipeline v0.118.1-0.20250130000211-c119b2a55eb4 // indirect
+	go.opentelemetry.io/otel v1.34.0 // indirect
+	go.opentelemetry.io/otel/metric v1.34.0 // indirect
+	go.opentelemetry.io/otel/sdk v1.34.0 // indirect
+	go.opentelemetry.io/otel/sdk/metric v1.34.0 // indirect
+	go.opentelemetry.io/otel/trace v1.34.0 // indirect
+	go.uber.org/multierr v1.11.0 // indirect
+	golang.org/x/net v0.33.0 // indirect
+	golang.org/x/sys v0.29.0 // indirect
+	golang.org/x/text v0.21.0 // indirect
+	google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a // indirect
+	google.golang.org/grpc v1.70.0 // indirect
+	google.golang.org/protobuf v1.36.4 // indirect
+	gopkg.in/yaml.v3 v3.0.1 // indirect
+)
+
+replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest => ../../pkg/pdatatest
+
+replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatautil => ../../pkg/pdatautil
+
+replace github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden => ../../pkg/golden
+
+replace github.com/open-telemetry/opentelemetry-collector-contrib/internal/common => ../../internal/common
diff --git a/scraper/zookeeperscraper/go.sum b/scraper/zookeeperscraper/go.sum
new file mode 100644
index 000000000000..13ef0f10f80b
--- /dev/null
+++ b/scraper/zookeeperscraper/go.sum
@@ -0,0 +1,138 @@
+github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
+github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
+github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
+github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
+github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
+github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
+github.com/go-viper/mapstructure/v2 v2.2.1 h1:ZAaOCxANMuZx5RCeg0mBdEZk7DZasvvZIxtHqx8aGss=
+github.com/go-viper/mapstructure/v2 v2.2.1/go.mod h1:oJDH3BJKyqBA2TXFhDsKDGDTlndYOZ6rGS0BRZIxGhM=
+github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
+github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
+github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
+github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
+github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
+github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
+github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/hashicorp/go-version v1.7.0 h1:5tqGy27NaOTB8yJKUZELlFAS/LTKJkrmONwQKeRZfjY=
+github.com/hashicorp/go-version v1.7.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/knadh/koanf/maps v0.1.1 h1:G5TjmUh2D7G2YWf5SQQqSiHRJEjaicvU0KpypqB3NIs=
+github.com/knadh/koanf/maps v0.1.1/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI=
+github.com/knadh/koanf/providers/confmap v0.1.0 h1:gOkxhHkemwG4LezxxN8DMOFopOPghxRVp7JbIvdvqzU=
+github.com/knadh/koanf/providers/confmap v0.1.0/go.mod h1:2uLhxQzJnyHKfxG927awZC7+fyHFdQkd697K4MdLnIU=
+github.com/knadh/koanf/v2 v2.1.2 h1:I2rtLRqXRy1p01m/utEtpZSSA6dcJbgGVuE27kW2PzQ=
+github.com/knadh/koanf/v2 v2.1.2/go.mod h1:Gphfaen0q1Fc1HTgJgSTC4oRX9R2R5ErYMZJy8fLJBo=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/mitchellh/copystructure v1.2.0 h1:vpKXTN4ewci03Vljg/q9QvCGUDttBOGBIa15WveJJGw=
+github.com/mitchellh/copystructure v1.2.0/go.mod h1:qLl+cE2AmVv+CoeAwDPye/v+N2HKCj9FbZEVFJRxO9s=
+github.com/mitchellh/reflectwalk v1.0.2 h1:G2LzWKi524PWgd3mLHV8Y5k7s6XUvT0Gef6zxSIeXaQ=
+github.com/mitchellh/reflectwalk v1.0.2/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII=
+github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
+github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+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/component v0.118.1-0.20250130000211-c119b2a55eb4 h1:NUVBjiZNGbfhbPk1LB956X197n4/OrUtuOqq0XlmMyQ=
+go.opentelemetry.io/collector/component v0.118.1-0.20250130000211-c119b2a55eb4/go.mod h1:X6S0R6vXECThDa1q+m682asO/WEfMWIMeafJsFidr3E=
+go.opentelemetry.io/collector/component/componenttest v0.118.1-0.20250130000211-c119b2a55eb4 h1:77B30QO8IrBUtD3mhvq4g1IiYDXerFb35g91+lK14Wk=
+go.opentelemetry.io/collector/component/componenttest v0.118.1-0.20250130000211-c119b2a55eb4/go.mod h1:VyxLB3apQi4ureRTv8HhSGrKpimubvgWs1yiXMubYmc=
+go.opentelemetry.io/collector/config/confignet v1.24.1-0.20250130000211-c119b2a55eb4 h1:kfEd3QcDgvPNRuHkBMtElECP5uM0kDRWuIZVhQr1+R0=
+go.opentelemetry.io/collector/config/confignet v1.24.1-0.20250130000211-c119b2a55eb4/go.mod h1:ZppUH1hgUJOubawEsxsQ9MzEYFytqo2GnVSS7d4CVxc=
+go.opentelemetry.io/collector/config/configtelemetry v0.118.1-0.20250130000211-c119b2a55eb4 h1:Cr/TN9njhCCu6YdqkWaNvQlSZVLI/W/EpWawGGymZgI=
+go.opentelemetry.io/collector/config/configtelemetry v0.118.1-0.20250130000211-c119b2a55eb4/go.mod h1:SlBEwQg0qly75rXZ6W1Ig8jN25KBVBkFIIAUI1GiAAE=
+go.opentelemetry.io/collector/confmap v1.24.1-0.20250130000211-c119b2a55eb4 h1:XMGNUDNAMmlGVGjTQgG9BCh1WOKSOZQSER47ZRi2gWk=
+go.opentelemetry.io/collector/confmap v1.24.1-0.20250130000211-c119b2a55eb4/go.mod h1:Rrhs+MWoaP6AswZp+ReQ2VO9dfOfcUjdjiSHBsG+nec=
+go.opentelemetry.io/collector/featuregate v1.24.1-0.20250130000211-c119b2a55eb4 h1:FQaYa9hV8DlUwV7NCdegMQTXCFvTjfx5kKM2MnjT6YI=
+go.opentelemetry.io/collector/featuregate v1.24.1-0.20250130000211-c119b2a55eb4/go.mod h1:3GaXqflNDVwWndNGBJ1+XJFy3Fv/XrFgjMN60N3z7yg=
+go.opentelemetry.io/collector/filter v0.118.1-0.20250130000211-c119b2a55eb4 h1:6TGNOGYpV8hwC/u57/7tEvARDjjNozRamskRjHzAR9U=
+go.opentelemetry.io/collector/filter v0.118.1-0.20250130000211-c119b2a55eb4/go.mod h1:Pgii0Ad2PXdxYSYYqki6Mr4gZdueJG9rDOiaB3fXf3Q=
+go.opentelemetry.io/collector/pdata v1.24.1-0.20250130000211-c119b2a55eb4 h1:jMNwHuYLgYKbBdv4m52lD22sqPI7tnC0uNd/QrjVANA=
+go.opentelemetry.io/collector/pdata v1.24.1-0.20250130000211-c119b2a55eb4/go.mod h1:Zs7D4RXOGS7E2faGc/jfWdbmhoiHBxA7QbpuJOioxq8=
+go.opentelemetry.io/collector/pipeline v0.118.1-0.20250130000211-c119b2a55eb4 h1:Zv0i8l1HzArbqEyOF3hSJuaIQixLDScry/vhwnD19xw=
+go.opentelemetry.io/collector/pipeline v0.118.1-0.20250130000211-c119b2a55eb4/go.mod h1:qE3DmoB05AW0C3lmPvdxZqd/H4po84NPzd5MrqgtL74=
+go.opentelemetry.io/collector/scraper v0.118.1-0.20250130000211-c119b2a55eb4 h1:M4kVV9p80w+NPGR5IffzKwlOAH2UCQZdaYB+sSg0TKQ=
+go.opentelemetry.io/collector/scraper v0.118.1-0.20250130000211-c119b2a55eb4/go.mod h1:3emjr1Or5hqINEzb5848fDpZguQQqwQ3ES44sASQGUg=
+go.opentelemetry.io/collector/scraper/scrapertest v0.118.1-0.20250130000211-c119b2a55eb4 h1:tNlNF+T+ktGLtcEdWSB4BW0NHnzqIHWavOp1wwXuvnw=
+go.opentelemetry.io/collector/scraper/scrapertest v0.118.1-0.20250130000211-c119b2a55eb4/go.mod h1:r0lzMsazeHI+Rs4oHjTIeaB4fMIidjePZHQxOCP9RrA=
+go.opentelemetry.io/otel v1.34.0 h1:zRLXxLCgL1WyKsPVrgbSdMN4c0FMkDAskSTQP+0hdUY=
+go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI=
+go.opentelemetry.io/otel/metric v1.34.0 h1:+eTR3U0MyfWjRDhmFMxe2SsW64QrZ84AOhvqS7Y+PoQ=
+go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE=
+go.opentelemetry.io/otel/sdk v1.34.0 h1:95zS4k/2GOy069d321O8jWgYsW3MzVV+KuSPKp7Wr1A=
+go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU=
+go.opentelemetry.io/otel/sdk/metric v1.34.0 h1:5CeK9ujjbFVL5c1PhLuStg1wxA7vQv7ce1EK0Gyvahk=
+go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w=
+go.opentelemetry.io/otel/trace v1.34.0 h1:+ouXS2V8Rd4hp4580a8q23bg0azF2nI8cqLYnC8mh/k=
+go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE=
+go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
+go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
+go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
+go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
+go.uber.org/zap v1.27.0 h1:aJMhYGrd5QSmlpLMr2MftRKl7t8J8PTZPA732ud/XR8=
+go.uber.org/zap v1.27.0/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
+golang.org/x/net v0.33.0 h1:74SYHlV8BIgHIFC/LrYkOGIwL19eTYXQ5wc6TBuO36I=
+golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU=
+golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
+golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
+golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a h1:hgh8P4EuoxpsuKMXX/To36nOFD7vixReXgn8lPGnt+o=
+google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU=
+google.golang.org/grpc v1.70.0 h1:pWFv03aZoHzlRKHWicjsZytKAiYCtNS0dHbXnIdq7jQ=
+google.golang.org/grpc v1.70.0/go.mod h1:ofIJqVKDXx/JiXrwr2IG4/zwdH9txy3IlF40RmcJSQw=
+google.golang.org/protobuf v1.36.4 h1:6A3ZDJHn/eNqc1i+IdefRzy/9PokBTPvcqMySR7NNIM=
+google.golang.org/protobuf v1.36.4/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
+gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/receiver/zookeeperreceiver/internal/metadata/generated_config.go b/scraper/zookeeperscraper/internal/metadata/generated_config.go
similarity index 100%
rename from receiver/zookeeperreceiver/internal/metadata/generated_config.go
rename to scraper/zookeeperscraper/internal/metadata/generated_config.go
diff --git a/receiver/zookeeperreceiver/internal/metadata/generated_config_test.go b/scraper/zookeeperscraper/internal/metadata/generated_config_test.go
similarity index 100%
rename from receiver/zookeeperreceiver/internal/metadata/generated_config_test.go
rename to scraper/zookeeperscraper/internal/metadata/generated_config_test.go
diff --git a/receiver/zookeeperreceiver/internal/metadata/generated_metrics.go b/scraper/zookeeperscraper/internal/metadata/generated_metrics.go
similarity index 99%
rename from receiver/zookeeperreceiver/internal/metadata/generated_metrics.go
rename to scraper/zookeeperscraper/internal/metadata/generated_metrics.go
index 0ee553cb4f1a..56d0815ea457 100644
--- a/receiver/zookeeperreceiver/internal/metadata/generated_metrics.go
+++ b/scraper/zookeeperscraper/internal/metadata/generated_metrics.go
@@ -9,7 +9,7 @@ import (
 	"go.opentelemetry.io/collector/filter"
 	"go.opentelemetry.io/collector/pdata/pcommon"
 	"go.opentelemetry.io/collector/pdata/pmetric"
-	"go.opentelemetry.io/collector/receiver"
+	"go.opentelemetry.io/collector/scraper"
 )
 
 // AttributeDirection specifies the value direction attribute.
@@ -919,7 +919,7 @@ func WithStartTime(startTime pcommon.Timestamp) MetricBuilderOption {
 		mb.startTime = startTime
 	})
 }
-func NewMetricsBuilder(mbc MetricsBuilderConfig, settings receiver.Settings, options ...MetricBuilderOption) *MetricsBuilder {
+func NewMetricsBuilder(mbc MetricsBuilderConfig, settings scraper.Settings, options ...MetricBuilderOption) *MetricsBuilder {
 	mb := &MetricsBuilder{
 		config:                          mbc,
 		startTime:                       pcommon.NewTimestampFromTime(time.Now()),
@@ -1022,7 +1022,7 @@ func WithStartTimeOverride(start pcommon.Timestamp) ResourceMetricsOption {
 func (mb *MetricsBuilder) EmitForResource(options ...ResourceMetricsOption) {
 	rm := pmetric.NewResourceMetrics()
 	ils := rm.ScopeMetrics().AppendEmpty()
-	ils.Scope().SetName("github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver")
+	ils.Scope().SetName("github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper")
 	ils.Scope().SetVersion(mb.buildInfo.Version)
 	ils.Metrics().EnsureCapacity(mb.metricsCapacity)
 	mb.metricZookeeperConnectionActive.emit(ils.Metrics())
diff --git a/receiver/zookeeperreceiver/internal/metadata/generated_metrics_test.go b/scraper/zookeeperscraper/internal/metadata/generated_metrics_test.go
similarity index 99%
rename from receiver/zookeeperreceiver/internal/metadata/generated_metrics_test.go
rename to scraper/zookeeperscraper/internal/metadata/generated_metrics_test.go
index f437a201045f..3d6f5a199598 100644
--- a/receiver/zookeeperreceiver/internal/metadata/generated_metrics_test.go
+++ b/scraper/zookeeperscraper/internal/metadata/generated_metrics_test.go
@@ -8,7 +8,7 @@ import (
 	"github.com/stretchr/testify/assert"
 	"go.opentelemetry.io/collector/pdata/pcommon"
 	"go.opentelemetry.io/collector/pdata/pmetric"
-	"go.opentelemetry.io/collector/receiver/receivertest"
+	"go.opentelemetry.io/collector/scraper/scrapertest"
 	"go.uber.org/zap"
 	"go.uber.org/zap/zaptest/observer"
 )
@@ -57,7 +57,7 @@ func TestMetricsBuilder(t *testing.T) {
 			start := pcommon.Timestamp(1_000_000_000)
 			ts := pcommon.Timestamp(1_000_001_000)
 			observedZapCore, observedLogs := observer.New(zap.WarnLevel)
-			settings := receivertest.NewNopSettings()
+			settings := scrapertest.NewNopSettings()
 			settings.Logger = zap.New(observedZapCore)
 			mb := NewMetricsBuilder(loadMetricsBuilderConfig(t, tt.name), settings, WithStartTime(start))
 
diff --git a/receiver/zookeeperreceiver/internal/metadata/generated_resource.go b/scraper/zookeeperscraper/internal/metadata/generated_resource.go
similarity index 100%
rename from receiver/zookeeperreceiver/internal/metadata/generated_resource.go
rename to scraper/zookeeperscraper/internal/metadata/generated_resource.go
diff --git a/receiver/zookeeperreceiver/internal/metadata/generated_resource_test.go b/scraper/zookeeperscraper/internal/metadata/generated_resource_test.go
similarity index 100%
rename from receiver/zookeeperreceiver/internal/metadata/generated_resource_test.go
rename to scraper/zookeeperscraper/internal/metadata/generated_resource_test.go
diff --git a/scraper/zookeeperscraper/internal/metadata/generated_status.go b/scraper/zookeeperscraper/internal/metadata/generated_status.go
new file mode 100644
index 000000000000..275df5a7500b
--- /dev/null
+++ b/scraper/zookeeperscraper/internal/metadata/generated_status.go
@@ -0,0 +1,16 @@
+// Code generated by mdatagen. DO NOT EDIT.
+
+package metadata
+
+import (
+	"go.opentelemetry.io/collector/component"
+)
+
+var (
+	Type      = component.MustNewType("zookeeper")
+	ScopeName = "github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper"
+)
+
+const (
+	MetricsStability = component.StabilityLevelAlpha
+)
diff --git a/receiver/zookeeperreceiver/internal/metadata/package_test.go b/scraper/zookeeperscraper/internal/metadata/package_test.go
similarity index 100%
rename from receiver/zookeeperreceiver/internal/metadata/package_test.go
rename to scraper/zookeeperscraper/internal/metadata/package_test.go
diff --git a/receiver/zookeeperreceiver/internal/metadata/testdata/config.yaml b/scraper/zookeeperscraper/internal/metadata/testdata/config.yaml
similarity index 100%
rename from receiver/zookeeperreceiver/internal/metadata/testdata/config.yaml
rename to scraper/zookeeperscraper/internal/metadata/testdata/config.yaml
diff --git a/scraper/zookeeperscraper/metadata.yaml b/scraper/zookeeperscraper/metadata.yaml
new file mode 100644
index 000000000000..97943d2a3cc7
--- /dev/null
+++ b/scraper/zookeeperscraper/metadata.yaml
@@ -0,0 +1,159 @@
+type: zookeeper
+
+status:
+  class: scraper
+  stability:
+    alpha: [metrics]
+  distributions: [contrib]
+  codeowners:
+    active: [djaglowski]
+    seeking_new: true
+
+resource_attributes:
+  server.state:
+    description: State of the Zookeeper server (leader, standalone or follower).
+    enabled: true
+    type: string
+  zk.version:
+    description: Zookeeper version of the instance.
+    enabled: true
+    type: string
+
+attributes:
+  state:
+    description: State of followers
+    type: string
+    enum:
+      - synced
+      - unsynced
+  direction:
+    description: State of a packet based on io direction.
+    type: string
+    enum:
+      - received
+      - sent
+
+metrics:
+  zookeeper.follower.count:
+    enabled: true
+    description: The number of followers. Only exposed by the leader.
+    unit: "{followers}"
+    attributes: [state]
+    sum:
+      monotonic: false
+      aggregation_temporality: cumulative
+      value_type: int
+  zookeeper.sync.pending:
+    enabled: true
+    description: The number of pending syncs from the followers. Only exposed by the leader.
+    unit: "{syncs}"
+    sum:
+      monotonic: false
+      aggregation_temporality: cumulative
+      value_type: int
+  zookeeper.latency.avg:
+    enabled: true
+    description: Average time in milliseconds for requests to be processed.
+    unit: ms
+    gauge:
+      value_type: int
+  zookeeper.latency.max:
+    enabled: true
+    description: Maximum time in milliseconds for requests to be processed.
+    unit: ms
+    gauge:
+      value_type: int
+  zookeeper.latency.min:
+    enabled: true
+    description: Minimum time in milliseconds for requests to be processed.
+    unit: ms
+    gauge:
+      value_type: int
+  zookeeper.connection.active:
+    enabled: true
+    description: Number of active clients connected to a ZooKeeper server.
+    unit: "{connections}"
+    sum:
+      monotonic: false
+      aggregation_temporality: cumulative
+      value_type: int
+  zookeeper.request.active:
+    enabled: true
+    description: Number of currently executing requests.
+    unit: "{requests}"
+    sum:
+      monotonic: false
+      aggregation_temporality: cumulative
+      value_type: int
+  zookeeper.znode.count:
+    enabled: true
+    description: Number of z-nodes that a ZooKeeper server has in its data tree.
+    unit: "{znodes}"
+    sum:
+      monotonic: false
+      aggregation_temporality: cumulative
+      value_type: int
+  zookeeper.watch.count:
+    enabled: true
+    description: Number of watches placed on Z-Nodes on a ZooKeeper server.
+    unit: "{watches}"
+    sum:
+      monotonic: false
+      aggregation_temporality: cumulative
+      value_type: int
+  zookeeper.data_tree.ephemeral_node.count:
+    enabled: true
+    description: Number of ephemeral nodes that a ZooKeeper server has in its data tree.
+    unit: "{nodes}"
+    sum:
+      monotonic: false
+      aggregation_temporality: cumulative
+      value_type: int
+  zookeeper.data_tree.size:
+    enabled: true
+    description: Size of data in bytes that a ZooKeeper server has in its data tree.
+    unit: By
+    sum:
+      monotonic: false
+      aggregation_temporality: cumulative
+      value_type: int
+  zookeeper.file_descriptor.open:
+    enabled: true
+    description: Number of file descriptors that a ZooKeeper server has open.
+    unit: "{file_descriptors}"
+    sum:
+      monotonic: false
+      aggregation_temporality: cumulative
+      value_type: int
+  zookeeper.file_descriptor.limit:
+    enabled: true
+    description: Maximum number of file descriptors that a ZooKeeper server can open.
+    unit: "{file_descriptors}"
+    gauge:
+      value_type: int
+  zookeeper.packet.count:
+    enabled: true
+    description: The number of ZooKeeper packets received or sent by a server.
+    unit: "{packets}"
+    attributes: [direction]
+    sum:
+      value_type: int
+      monotonic: true
+      aggregation_temporality: cumulative
+  zookeeper.fsync.exceeded_threshold.count:
+    enabled: true
+    description: Number of times fsync duration has exceeded warning threshold.
+    unit: "{events}"
+    sum:
+      value_type: int
+      monotonic: true
+      aggregation_temporality: cumulative
+  zookeeper.ruok:
+    enabled: true
+    description: Response from zookeeper ruok command
+    unit: "1"
+    gauge:
+      value_type: int
+
+tests:
+  config:
diff --git a/receiver/zookeeperreceiver/metrics.go b/scraper/zookeeperscraper/metrics.go
similarity index 95%
rename from receiver/zookeeperreceiver/metrics.go
rename to scraper/zookeeperscraper/metrics.go
index 86ae2eeb0049..ae73df4e4228 100644
--- a/receiver/zookeeperreceiver/metrics.go
+++ b/scraper/zookeeperscraper/metrics.go
@@ -1,7 +1,7 @@
 // Copyright The OpenTelemetry Authors
 // SPDX-License-Identifier: Apache-2.0
 
-package zookeeperreceiver // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver"
+package zookeeperscraper // import "github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper"
 
 import (
 	"fmt"
@@ -9,7 +9,7 @@ import (
 	"go.opentelemetry.io/collector/pdata/pcommon"
 	"go.uber.org/zap"
 
-	"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver/internal/metadata"
+	"github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper/internal/metadata"
 )
 
 // Constants to define entries in the output of "mntr" command.
diff --git a/receiver/zookeeperreceiver/scraper.go b/scraper/zookeeperscraper/scraper.go
similarity index 83%
rename from receiver/zookeeperreceiver/scraper.go
rename to scraper/zookeeperscraper/scraper.go
index 17062a3784a8..668cd5f4263f 100644
--- a/receiver/zookeeperreceiver/scraper.go
+++ b/scraper/zookeeperscraper/scraper.go
@@ -1,24 +1,24 @@
 // Copyright The OpenTelemetry Authors
 // SPDX-License-Identifier: Apache-2.0
 
-package zookeeperreceiver // import "github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver"
+package zookeeperscraper // import "github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper"
 
 import (
 	"bufio"
 	"context"
-	"errors"
 	"fmt"
 	"net"
 	"regexp"
 	"strconv"
 	"time"
 
+	"go.opentelemetry.io/collector/component"
 	"go.opentelemetry.io/collector/pdata/pcommon"
 	"go.opentelemetry.io/collector/pdata/pmetric"
-	"go.opentelemetry.io/collector/receiver"
+	"go.opentelemetry.io/collector/scraper"
 	"go.uber.org/zap"
 
-	"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver/internal/metadata"
+	"github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper/internal/metadata"
 )
 
 var zookeeperFormatRE = regexp.MustCompile(`(^zk_\w+)\s+([\w\.\-]+)`)
@@ -29,6 +29,7 @@ const (
 )
 
 type zookeeperMetricsScraper struct {
+	component.StartFunc
 	logger *zap.Logger
 	config *Config
 	cancel context.CancelFunc
@@ -41,21 +42,8 @@ type zookeeperMetricsScraper struct {
 	sendCmd               func(net.Conn, string) (*bufio.Scanner, error)
 }
 
-func (z *zookeeperMetricsScraper) Name() string {
-	return metadata.Type.String()
-}
-
-func newZookeeperMetricsScraper(settings receiver.Settings, config *Config) (*zookeeperMetricsScraper, error) {
-	_, _, err := net.SplitHostPort(config.TCPAddrConfig.Endpoint)
-	if err != nil {
-		return nil, err
-	}
-
-	if config.Timeout <= 0 {
-		return nil, errors.New("timeout must be a positive duration")
-	}
-
-	z := &zookeeperMetricsScraper{
+func newZookeeperMetricsScraper(settings scraper.Settings, config *Config) *zookeeperMetricsScraper {
+	return &zookeeperMetricsScraper{
 		logger:                settings.Logger,
 		config:                config,
 		rb:                    metadata.NewResourceBuilder(config.ResourceAttributes),
@@ -64,11 +52,9 @@ func newZookeeperMetricsScraper(settings receiver.Settings, config *Config) (*zo
 		setConnectionDeadline: setConnectionDeadline,
 		sendCmd:               sendCmd,
 	}
-
-	return z, nil
 }
 
-func (z *zookeeperMetricsScraper) shutdown(_ context.Context) error {
+func (z *zookeeperMetricsScraper) Shutdown(context.Context) error {
 	if z.cancel != nil {
 		z.cancel()
 		z.cancel = nil
@@ -76,7 +62,7 @@ func (z *zookeeperMetricsScraper) shutdown(_ context.Context) error {
 	return nil
 }
 
-func (z *zookeeperMetricsScraper) scrape(ctx context.Context) (pmetric.Metrics, error) {
+func (z *zookeeperMetricsScraper) ScrapeMetrics(ctx context.Context) (pmetric.Metrics, error) {
 	responseMntr, err := z.runCommand(ctx, "mntr")
 	if err != nil {
 		return pmetric.NewMetrics(), err
diff --git a/receiver/zookeeperreceiver/scraper_test.go b/scraper/zookeeperscraper/scraper_test.go
similarity index 91%
rename from receiver/zookeeperreceiver/scraper_test.go
rename to scraper/zookeeperscraper/scraper_test.go
index cee0c9cacfea..4a16ad1dd496 100644
--- a/receiver/zookeeperreceiver/scraper_test.go
+++ b/scraper/zookeeperscraper/scraper_test.go
@@ -1,7 +1,7 @@
 // Copyright The OpenTelemetry Authors
 // SPDX-License-Identifier: Apache-2.0
 
-package zookeeperreceiver
+package zookeeperscraper
 
 import (
 	"bufio"
@@ -16,8 +16,9 @@ import (
 
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+	"go.opentelemetry.io/collector/component/componenttest"
 	"go.opentelemetry.io/collector/pdata/pmetric"
-	"go.opentelemetry.io/collector/receiver/receivertest"
+	"go.opentelemetry.io/collector/scraper/scrapertest"
 	"go.uber.org/zap"
 	"go.uber.org/zap/zapcore"
 	"go.uber.org/zap/zaptest/observer"
@@ -25,7 +26,7 @@ import (
 	"github.com/open-telemetry/opentelemetry-collector-contrib/internal/common/testutil"
 	"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/golden"
 	"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/pdatatest/pmetrictest"
-	"github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver/internal/metadata"
+	"github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper/internal/metadata"
 )
 
 type logMsg struct {
@@ -290,12 +291,10 @@ func TestZookeeperMetricsScraperScrape(t *testing.T) {
 			}
 
 			core, observedLogs := observer.New(zap.DebugLevel)
-			settings := receivertest.NewNopSettings()
+			settings := scrapertest.NewNopSettings()
 			settings.Logger = zap.New(core)
-			z, err := newZookeeperMetricsScraper(settings, cfg)
-			require.NoError(t, err)
-			require.Equal(t, "zookeeper", z.Name())
 
+			z := newZookeeperMetricsScraper(settings, cfg)
 			if tt.setConnectionDeadline != nil {
 				z.setConnectionDeadline = tt.setConnectionDeadline
 			}
@@ -307,10 +306,11 @@ func TestZookeeperMetricsScraperScrape(t *testing.T) {
 			if tt.sendCmd != nil {
 				z.sendCmd = tt.sendCmd
 			}
-			ctx, cancel := context.WithTimeout(context.Background(), z.config.Timeout)
+			require.NoError(t, z.Start(context.Background(), componenttest.NewNopHost()))
+			ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
 			defer cancel()
-			actualMetrics, err := z.scrape(ctx)
-			require.NoError(t, z.shutdown(ctx))
+			actualMetrics, err := z.ScrapeMetrics(ctx)
+			require.NoError(t, z.Shutdown(context.Background()))
 
 			require.Equal(t, len(tt.expectedLogs), observedLogs.Len())
 			for i, log := range tt.expectedLogs {
@@ -323,7 +323,7 @@ func TestZookeeperMetricsScraperScrape(t *testing.T) {
 					require.Error(t, err)
 					require.Equal(t, pmetric.NewMetrics(), actualMetrics)
 				}
-				require.NoError(t, z.shutdown(ctx))
+				require.NoError(t, z.Shutdown(context.Background()))
 				return
 			}
 
@@ -339,9 +339,9 @@ func TestZookeeperMetricsScraperScrape(t *testing.T) {
 
 func TestZookeeperShutdownBeforeScrape(t *testing.T) {
 	cfg := createDefaultConfig().(*Config)
-	z, err := newZookeeperMetricsScraper(receivertest.NewNopSettings(), cfg)
-	require.NoError(t, err)
-	require.NoError(t, z.shutdown(context.Background()))
+	z := newZookeeperMetricsScraper(scrapertest.NewNopSettings(), cfg)
+	require.NoError(t, z.Start(context.Background(), componenttest.NewNopHost()))
+	require.NoError(t, z.Shutdown(context.Background()))
 }
 
 type mockedServer struct {
diff --git a/receiver/zookeeperreceiver/testdata/mntr-3.4.14 b/scraper/zookeeperscraper/testdata/mntr-3.4.14
similarity index 100%
rename from receiver/zookeeperreceiver/testdata/mntr-3.4.14
rename to scraper/zookeeperscraper/testdata/mntr-3.4.14
diff --git a/receiver/zookeeperreceiver/testdata/mntr-3.5.5 b/scraper/zookeeperscraper/testdata/mntr-3.5.5
similarity index 100%
rename from receiver/zookeeperreceiver/testdata/mntr-3.5.5
rename to scraper/zookeeperscraper/testdata/mntr-3.5.5
diff --git a/receiver/zookeeperreceiver/testdata/mntr-unexpected_line_format b/scraper/zookeeperscraper/testdata/mntr-unexpected_line_format
similarity index 100%
rename from receiver/zookeeperreceiver/testdata/mntr-unexpected_line_format
rename to scraper/zookeeperscraper/testdata/mntr-unexpected_line_format
diff --git a/receiver/zookeeperreceiver/testdata/mntr-unexpected_value_type b/scraper/zookeeperscraper/testdata/mntr-unexpected_value_type
similarity index 100%
rename from receiver/zookeeperreceiver/testdata/mntr-unexpected_value_type
rename to scraper/zookeeperscraper/testdata/mntr-unexpected_value_type
diff --git a/receiver/zookeeperreceiver/testdata/ruok-invalid b/scraper/zookeeperscraper/testdata/ruok-invalid
similarity index 100%
rename from receiver/zookeeperreceiver/testdata/ruok-invalid
rename to scraper/zookeeperscraper/testdata/ruok-invalid
diff --git a/receiver/zookeeperreceiver/testdata/ruok-null b/scraper/zookeeperscraper/testdata/ruok-null
similarity index 100%
rename from receiver/zookeeperreceiver/testdata/ruok-null
rename to scraper/zookeeperscraper/testdata/ruok-null
diff --git a/receiver/zookeeperreceiver/testdata/ruok-valid b/scraper/zookeeperscraper/testdata/ruok-valid
similarity index 100%
rename from receiver/zookeeperreceiver/testdata/ruok-valid
rename to scraper/zookeeperscraper/testdata/ruok-valid
diff --git a/receiver/zookeeperreceiver/testdata/scraper/correctness-ruok.yaml b/scraper/zookeeperscraper/testdata/scraper/correctness-ruok.yaml
similarity index 100%
rename from receiver/zookeeperreceiver/testdata/scraper/correctness-ruok.yaml
rename to scraper/zookeeperscraper/testdata/scraper/correctness-ruok.yaml
diff --git a/receiver/zookeeperreceiver/testdata/scraper/correctness-v3.4.14.yaml b/scraper/zookeeperscraper/testdata/scraper/correctness-v3.4.14.yaml
similarity index 99%
rename from receiver/zookeeperreceiver/testdata/scraper/correctness-v3.4.14.yaml
rename to scraper/zookeeperscraper/testdata/scraper/correctness-v3.4.14.yaml
index 0bd76f06ddbc..f2660bab6743 100644
--- a/receiver/zookeeperreceiver/testdata/scraper/correctness-v3.4.14.yaml
+++ b/scraper/zookeeperscraper/testdata/scraper/correctness-v3.4.14.yaml
@@ -144,5 +144,5 @@ resourceMetrics:
                   timeUnixNano: "2000000"
             unit: '{znodes}'
         scope:
-          name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver
+          name: github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper
           version: latest
diff --git a/receiver/zookeeperreceiver/testdata/scraper/correctness-v3.5.5.yaml b/scraper/zookeeperscraper/testdata/scraper/correctness-v3.5.5.yaml
similarity index 99%
rename from receiver/zookeeperreceiver/testdata/scraper/correctness-v3.5.5.yaml
rename to scraper/zookeeperscraper/testdata/scraper/correctness-v3.5.5.yaml
index 68f28a967bda..54352a2a63a5 100644
--- a/receiver/zookeeperreceiver/testdata/scraper/correctness-v3.5.5.yaml
+++ b/scraper/zookeeperscraper/testdata/scraper/correctness-v3.5.5.yaml
@@ -163,5 +163,5 @@ resourceMetrics:
                   timeUnixNano: "2000000"
             unit: '{znodes}'
         scope:
-          name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver
+          name: github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper
           version: latest
diff --git a/receiver/zookeeperreceiver/testdata/scraper/disable-watches.yaml b/scraper/zookeeperscraper/testdata/scraper/disable-watches.yaml
similarity index 99%
rename from receiver/zookeeperreceiver/testdata/scraper/disable-watches.yaml
rename to scraper/zookeeperscraper/testdata/scraper/disable-watches.yaml
index 27def9b6fb87..6102123261c5 100644
--- a/receiver/zookeeperreceiver/testdata/scraper/disable-watches.yaml
+++ b/scraper/zookeeperscraper/testdata/scraper/disable-watches.yaml
@@ -135,5 +135,5 @@ resourceMetrics:
                   timeUnixNano: "2000000"
             unit: '{znodes}'
         scope:
-          name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver
+          name: github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper
           version: latest
diff --git a/receiver/zookeeperreceiver/testdata/scraper/error-closing-connection.yaml b/scraper/zookeeperscraper/testdata/scraper/error-closing-connection.yaml
similarity index 99%
rename from receiver/zookeeperreceiver/testdata/scraper/error-closing-connection.yaml
rename to scraper/zookeeperscraper/testdata/scraper/error-closing-connection.yaml
index 0bd76f06ddbc..f2660bab6743 100644
--- a/receiver/zookeeperreceiver/testdata/scraper/error-closing-connection.yaml
+++ b/scraper/zookeeperscraper/testdata/scraper/error-closing-connection.yaml
@@ -144,5 +144,5 @@ resourceMetrics:
                   timeUnixNano: "2000000"
             unit: '{znodes}'
         scope:
-          name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver
+          name: github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper
           version: latest
diff --git a/receiver/zookeeperreceiver/testdata/scraper/error-setting-connection-deadline.yaml b/scraper/zookeeperscraper/testdata/scraper/error-setting-connection-deadline.yaml
similarity index 99%
rename from receiver/zookeeperreceiver/testdata/scraper/error-setting-connection-deadline.yaml
rename to scraper/zookeeperscraper/testdata/scraper/error-setting-connection-deadline.yaml
index 0bd76f06ddbc..f2660bab6743 100644
--- a/receiver/zookeeperreceiver/testdata/scraper/error-setting-connection-deadline.yaml
+++ b/scraper/zookeeperscraper/testdata/scraper/error-setting-connection-deadline.yaml
@@ -144,5 +144,5 @@ resourceMetrics:
                   timeUnixNano: "2000000"
             unit: '{znodes}'
         scope:
-          name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver
+          name: github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper
           version: latest
diff --git a/receiver/zookeeperreceiver/testdata/scraper/invalid-ruok.yaml b/scraper/zookeeperscraper/testdata/scraper/invalid-ruok.yaml
similarity index 99%
rename from receiver/zookeeperreceiver/testdata/scraper/invalid-ruok.yaml
rename to scraper/zookeeperscraper/testdata/scraper/invalid-ruok.yaml
index ac65bdd8f075..5f869053119f 100644
--- a/receiver/zookeeperreceiver/testdata/scraper/invalid-ruok.yaml
+++ b/scraper/zookeeperscraper/testdata/scraper/invalid-ruok.yaml
@@ -136,5 +136,5 @@ resourceMetrics:
                   timeUnixNano: "2000000"
             unit: '{znodes}'
         scope:
-          name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver
+          name: github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper
           version: latest
diff --git a/receiver/zookeeperreceiver/testdata/scraper/null-ruok.yaml b/scraper/zookeeperscraper/testdata/scraper/null-ruok.yaml
similarity index 99%
rename from receiver/zookeeperreceiver/testdata/scraper/null-ruok.yaml
rename to scraper/zookeeperscraper/testdata/scraper/null-ruok.yaml
index 68f140fc11e0..48401a26c051 100644
--- a/receiver/zookeeperreceiver/testdata/scraper/null-ruok.yaml
+++ b/scraper/zookeeperscraper/testdata/scraper/null-ruok.yaml
@@ -144,5 +144,5 @@ resourceMetrics:
                   timeUnixNano: "2000000"
             unit: '{znodes}'
         scope:
-          name: github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver
+          name: github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper
           version: latest
diff --git a/versions.yaml b/versions.yaml
index 00053edafaa4..bb66fe86ebe4 100644
--- a/versions.yaml
+++ b/versions.yaml
@@ -299,6 +299,7 @@ module-sets:
       - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/windowsperfcountersreceiver
       - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zipkinreceiver
       - github.com/open-telemetry/opentelemetry-collector-contrib/receiver/zookeeperreceiver
+      - github.com/open-telemetry/opentelemetry-collector-contrib/scraper/zookeeperscraper
       - github.com/open-telemetry/opentelemetry-collector-contrib/testbed
       - github.com/open-telemetry/opentelemetry-collector-contrib/testbed/mockdatasenders/mockdatadogagentexporter