#### Description This PR introduces a testable example to the package [exporter](/receiver). it's a similar example to the documentation one on https://opentelemetry.io/docs/collector/building/receiver/#designing-and-validating-receiver-settings #### Issue: https://github.com/open-telemetry/opentelemetry-collector/issues/5675#issuecomment-2796741807 #### Testing the testable example was executed successfully  #### Documentation this testable example follows https://go.dev/blog/examples#larger-examples format and should be automatically added to `exporter` package documentation Co-authored-by: Damien Mathieu <42@dmathieu.com>
This commit is contained in:
		
							parent
							
								
									094e1faf9e
								
							
						
					
					
						commit
						ee2c7845a6
					
				| 
						 | 
				
			
			@ -0,0 +1,114 @@
 | 
			
		|||
// Copyright The OpenTelemetry Authors
 | 
			
		||||
// SPDX-License-Identifier: Apache-2.0
 | 
			
		||||
 | 
			
		||||
package exporter_test
 | 
			
		||||
 | 
			
		||||
import (
 | 
			
		||||
	"context"
 | 
			
		||||
	"fmt"
 | 
			
		||||
 | 
			
		||||
	"go.uber.org/zap"
 | 
			
		||||
 | 
			
		||||
	"go.opentelemetry.io/collector/component"
 | 
			
		||||
	"go.opentelemetry.io/collector/config/configretry"
 | 
			
		||||
	"go.opentelemetry.io/collector/consumer"
 | 
			
		||||
	"go.opentelemetry.io/collector/exporter"
 | 
			
		||||
	"go.opentelemetry.io/collector/exporter/exporterhelper"
 | 
			
		||||
	"go.opentelemetry.io/collector/pdata/pmetric"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
// typeStr defines the unique type identifier for the exporter.
 | 
			
		||||
var typeStr = component.MustNewType("example")
 | 
			
		||||
 | 
			
		||||
// exampleConfig holds configuration settings for the exporter.
 | 
			
		||||
type exampleConfig struct {
 | 
			
		||||
	QueueSettings exporterhelper.QueueBatchConfig
 | 
			
		||||
	BackOffConfig configretry.BackOffConfig
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// exampleExporter implements the OpenTelemetry exporter interface.
 | 
			
		||||
type exampleExporter struct {
 | 
			
		||||
	cancel context.CancelFunc
 | 
			
		||||
	config exampleConfig
 | 
			
		||||
	client *loggerClient
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// loggerClient wraps a Zap logger to provide logging functionality.
 | 
			
		||||
type loggerClient struct {
 | 
			
		||||
	logger *zap.Logger
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Example demonstrates the usage of the exporter factory.
 | 
			
		||||
func Example() {
 | 
			
		||||
	// Instantiate the exporter factory and print its type.
 | 
			
		||||
	exampleExporter := NewFactory()
 | 
			
		||||
	fmt.Println(exampleExporter.Type())
 | 
			
		||||
 | 
			
		||||
	// Output:
 | 
			
		||||
	// example
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// NewFactory creates a new exporter factory.
 | 
			
		||||
func NewFactory() exporter.Factory {
 | 
			
		||||
	return exporter.NewFactory(
 | 
			
		||||
		typeStr,
 | 
			
		||||
		createDefaultConfig,
 | 
			
		||||
		exporter.WithMetrics(createExampleExporter, component.StabilityLevelAlpha),
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// createDefaultConfig returns the default configuration for the exporter.
 | 
			
		||||
func createDefaultConfig() component.Config {
 | 
			
		||||
	return &exampleConfig{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// createExampleExporter initializes an instance of the example exporter.
 | 
			
		||||
func createExampleExporter(ctx context.Context, params exporter.Settings, baseCfg component.Config) (exporter.Metrics, error) {
 | 
			
		||||
	// Convert baseCfg to the correct type.
 | 
			
		||||
	cfg := baseCfg.(*exampleConfig)
 | 
			
		||||
 | 
			
		||||
	// Create a new exporter instance.
 | 
			
		||||
	xptr := newExampleExporter(ctx, cfg, params)
 | 
			
		||||
 | 
			
		||||
	// Wrap the exporter with the helper utilities.
 | 
			
		||||
	return exporterhelper.NewMetrics(
 | 
			
		||||
		ctx,
 | 
			
		||||
		params,
 | 
			
		||||
		cfg,
 | 
			
		||||
		xptr.consumeMetrics,
 | 
			
		||||
		exporterhelper.WithQueue(cfg.QueueSettings),
 | 
			
		||||
		exporterhelper.WithRetry(cfg.BackOffConfig),
 | 
			
		||||
		exporterhelper.WithCapabilities(consumer.Capabilities{MutatesData: false}),
 | 
			
		||||
		exporterhelper.WithShutdown(xptr.shutdown),
 | 
			
		||||
	)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// newExampleExporter constructs a new instance of the example exporter.
 | 
			
		||||
func newExampleExporter(ctx context.Context, cfg *exampleConfig, params exporter.Settings) *exampleExporter {
 | 
			
		||||
	xptr := &exampleExporter{
 | 
			
		||||
		config: *cfg,
 | 
			
		||||
		client: &loggerClient{logger: params.Logger},
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Create a cancelable context.
 | 
			
		||||
	_, xptr.cancel = context.WithCancel(ctx)
 | 
			
		||||
 | 
			
		||||
	return xptr
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// consumeMetrics processes incoming metric data and logs it.
 | 
			
		||||
func (xptr *exampleExporter) consumeMetrics(_ context.Context, md pmetric.Metrics) error {
 | 
			
		||||
	xptr.client.Push(md)
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Shutdown properly stops the exporter and releases resources.
 | 
			
		||||
func (xptr *exampleExporter) shutdown(_ context.Context) error {
 | 
			
		||||
	xptr.cancel()
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Push logs the received metric data.
 | 
			
		||||
func (client *loggerClient) Push(md pmetric.Metrics) {
 | 
			
		||||
	client.logger.Info("Exporting metrics", zap.Any("metrics", md))
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1,3 +1,5 @@
 | 
			
		|||
github.com/cenkalti/backoff/v5 v5.0.2 h1:rIfFVxEf1QsI7E1ZHfp/B4DF/6QBAUhmgkxc0H7Zss8=
 | 
			
		||||
github.com/cenkalti/backoff/v5 v5.0.2/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
 | 
			
		||||
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=
 | 
			
		||||
| 
						 | 
				
			
			@ -6,6 +8,10 @@ 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/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y=
 | 
			
		||||
github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
 | 
			
		||||
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=
 | 
			
		||||
| 
						 | 
				
			
			@ -21,10 +27,20 @@ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnr
 | 
			
		|||
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.2 h1:RBfmAW5CnZT+PJ1CVc1QSJKf4Xu9kxfQgYVQSu8hpbo=
 | 
			
		||||
github.com/knadh/koanf/maps v0.1.2/go.mod h1:npD/QZY3V6ghQDdcQzl1W4ICNVTkohC8E73eI2xW4yI=
 | 
			
		||||
github.com/knadh/koanf/providers/confmap v1.0.0 h1:mHKLJTE7iXEys6deO5p6olAiZdG5zwp8Aebir+/EaRE=
 | 
			
		||||
github.com/knadh/koanf/providers/confmap v1.0.0/go.mod h1:txHYHiI2hAtF0/0sCmcuol4IDcuQbKTybiB1nOcUo1A=
 | 
			
		||||
github.com/knadh/koanf/v2 v2.2.0 h1:FZFwd9bUjpb8DyCWARUBy5ovuhDs1lI87dOEn2K8UVU=
 | 
			
		||||
github.com/knadh/koanf/v2 v2.2.0/go.mod h1:PSFru3ufQgTsI7IF+95rf9s8XA1+aHxKuO/W+dPoHEY=
 | 
			
		||||
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=
 | 
			
		||||
| 
						 | 
				
			
			@ -104,3 +120,5 @@ gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntN
 | 
			
		|||
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=
 | 
			
		||||
sigs.k8s.io/yaml v1.4.0 h1:Mk1wCc2gy/F0THH0TAp1QYyJNzRm2KCLy3o5ASXVI5E=
 | 
			
		||||
sigs.k8s.io/yaml v1.4.0/go.mod h1:Ejl7/uTz7PSA4eKMyQCUTnhZYNmLIl+5c2lQPGR2BPY=
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue