exporter/splunkhecexporter/factory.go (183 lines of code) (raw):
// Copyright The OpenTelemetry Authors
// SPDX-License-Identifier: Apache-2.0
package splunkhecexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter"
import (
"context"
"time"
"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/config/confighttp"
"go.opentelemetry.io/collector/config/configretry"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/exporter"
"go.opentelemetry.io/collector/exporter/exporterhelper"
conventions "go.opentelemetry.io/collector/semconv/v1.27.0"
"github.com/open-telemetry/opentelemetry-collector-contrib/exporter/splunkhecexporter/internal/metadata"
"github.com/open-telemetry/opentelemetry-collector-contrib/internal/splunk"
"github.com/open-telemetry/opentelemetry-collector-contrib/pkg/batchperresourceattr"
)
const (
defaultMaxIdleCons = 100
defaultHTTPTimeout = 10 * time.Second
defaultHTTP2ReadIdleTimeout = time.Second * 10
defaultHTTP2PingTimeout = time.Second * 10
defaultIdleConnTimeout = 10 * time.Second
defaultSplunkAppName = "OpenTelemetry Collector Contrib"
)
// TODO: Find a place for this to be shared.
type baseMetricsExporter struct {
component.Component
consumer.Metrics
}
// TODO: Find a place for this to be shared.
type baseLogsExporter struct {
component.Component
consumer.Logs
}
// TODO: Find a place for this to be shared.
type baseTracesExporter struct {
component.Component
consumer.Traces
}
// NewFactory creates a factory for Splunk HEC exporter.
func NewFactory() exporter.Factory {
return exporter.NewFactory(
metadata.Type,
createDefaultConfig,
exporter.WithTraces(createTracesExporter, metadata.TracesStability),
exporter.WithMetrics(createMetricsExporter, metadata.MetricsStability),
exporter.WithLogs(createLogsExporter, metadata.LogsStability))
}
func createDefaultConfig() component.Config {
batcherCfg := exporterhelper.NewDefaultBatcherConfig() //nolint:staticcheck
batcherCfg.Enabled = false
defaultMaxConns := defaultMaxIdleCons
defaultIdleConnTimeout := defaultIdleConnTimeout
clientConfig := confighttp.NewDefaultClientConfig()
clientConfig.Timeout = defaultHTTPTimeout
clientConfig.IdleConnTimeout = defaultIdleConnTimeout
clientConfig.MaxIdleConnsPerHost = defaultMaxConns
clientConfig.MaxIdleConns = defaultMaxConns
clientConfig.HTTP2ReadIdleTimeout = defaultHTTP2ReadIdleTimeout
clientConfig.HTTP2PingTimeout = defaultHTTP2PingTimeout
return &Config{
LogDataEnabled: true,
ProfilingDataEnabled: true,
ClientConfig: clientConfig,
SplunkAppName: defaultSplunkAppName,
BackOffConfig: configretry.NewDefaultBackOffConfig(),
QueueSettings: exporterhelper.NewDefaultQueueConfig(),
BatcherConfig: batcherCfg,
DisableCompression: false,
MaxContentLengthLogs: defaultContentLengthLogsLimit,
MaxContentLengthMetrics: defaultContentLengthMetricsLimit,
MaxContentLengthTraces: defaultContentLengthTracesLimit,
MaxEventSize: defaultMaxEventSize,
OtelAttrsToHec: splunk.HecToOtelAttrs{
Source: splunk.DefaultSourceLabel,
SourceType: splunk.DefaultSourceTypeLabel,
Index: splunk.DefaultIndexLabel,
Host: conventions.AttributeHostName,
},
HecToOtelAttrs: splunk.HecToOtelAttrs{
Source: splunk.DefaultSourceLabel,
SourceType: splunk.DefaultSourceTypeLabel,
Index: splunk.DefaultIndexLabel,
Host: conventions.AttributeHostName,
},
HecFields: OtelToHecFields{
SeverityText: splunk.DefaultSeverityTextLabel,
SeverityNumber: splunk.DefaultSeverityNumberLabel,
},
HealthPath: splunk.DefaultHealthPath,
HecHealthCheckEnabled: false,
ExportRaw: false,
Telemetry: HecTelemetry{
Enabled: false,
OverrideMetricsNames: map[string]string{},
ExtraAttributes: map[string]string{},
},
}
}
func createTracesExporter(
ctx context.Context,
set exporter.Settings,
config component.Config,
) (exporter.Traces, error) {
cfg := config.(*Config)
c := newTracesClient(set, cfg)
e, err := exporterhelper.NewTraces(
ctx,
set,
cfg,
c.pushTraceData,
// explicitly disable since we rely on http.Client timeout logic.
exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}),
exporterhelper.WithRetry(cfg.BackOffConfig),
exporterhelper.WithQueue(cfg.QueueSettings),
exporterhelper.WithStart(c.start),
exporterhelper.WithShutdown(c.stop),
exporterhelper.WithBatcher(cfg.BatcherConfig), //nolint:staticcheck
)
if err != nil {
return nil, err
}
wrapped := &baseTracesExporter{
Component: e,
Traces: batchperresourceattr.NewMultiBatchPerResourceTraces([]string{splunk.HecTokenLabel, splunk.DefaultIndexLabel}, e),
}
return wrapped, nil
}
func createMetricsExporter(
ctx context.Context,
set exporter.Settings,
config component.Config,
) (exporter.Metrics, error) {
cfg := config.(*Config)
c := newMetricsClient(set, cfg)
e, err := exporterhelper.NewMetrics(
ctx,
set,
cfg,
c.pushMetricsData,
// explicitly disable since we rely on http.Client timeout logic.
exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}),
exporterhelper.WithRetry(cfg.BackOffConfig),
exporterhelper.WithQueue(cfg.QueueSettings),
exporterhelper.WithStart(c.start),
exporterhelper.WithShutdown(c.stop),
exporterhelper.WithBatcher(cfg.BatcherConfig), //nolint:staticcheck
)
if err != nil {
return nil, err
}
wrapped := &baseMetricsExporter{
Component: e,
Metrics: batchperresourceattr.NewMultiBatchPerResourceMetrics([]string{splunk.HecTokenLabel, splunk.DefaultIndexLabel}, e),
}
return wrapped, nil
}
func createLogsExporter(
ctx context.Context,
set exporter.Settings,
config component.Config,
) (exporter exporter.Logs, err error) {
cfg := config.(*Config)
c := newLogsClient(set, cfg)
logsExporter, err := exporterhelper.NewLogs(
ctx,
set,
cfg,
c.pushLogData,
// explicitly disable since we rely on http.Client timeout logic.
exporterhelper.WithTimeout(exporterhelper.TimeoutConfig{Timeout: 0}),
exporterhelper.WithRetry(cfg.BackOffConfig),
exporterhelper.WithQueue(cfg.QueueSettings),
exporterhelper.WithStart(c.start),
exporterhelper.WithShutdown(c.stop),
exporterhelper.WithBatcher(cfg.BatcherConfig), //nolint:staticcheck
)
if err != nil {
return nil, err
}
wrapped := &baseLogsExporter{
Component: logsExporter,
Logs: batchperresourceattr.NewMultiBatchPerResourceLogs([]string{splunk.HecTokenLabel, splunk.DefaultIndexLabel}, &perScopeBatcher{
logsEnabled: cfg.LogDataEnabled,
profilingEnabled: cfg.ProfilingDataEnabled,
logger: set.Logger,
next: logsExporter,
}),
}
return wrapped, nil
}