#### 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