diff --git a/.chloggen/jgm-span-dimensions.yaml b/.chloggen/jgm-span-dimensions.yaml new file mode 100755 index 000000000000..868eba7f8825 --- /dev/null +++ b/.chloggen/jgm-span-dimensions.yaml @@ -0,0 +1,20 @@ +# Use this changelog template to create an entry for release notes. +# If your change doesn't affect end users, such as a test fix or a tooling change, +# you should instead start your pull request title with [chore] or use the "Skip Changelog" label. + +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: enhancement + +# The name of the component, or a single word describing the area of concern, (e.g. filelogreceiver) +component: influxdbexporter + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: Add configurable span dimensions + +# Mandatory: One or more tracking issues related to the change. You can use the PR number here if no issue exists. +issues: [23230] + +# (Optional) One or more lines of additional information to render under the primary note. +# These lines will be padded with 2 spaces and then inserted directly into the document. +# Use pipe (|) for multiline entries. +subtext: diff --git a/cmd/configschema/go.mod b/cmd/configschema/go.mod index b67af64b6aba..d6ff5bc5ed35 100644 --- a/cmd/configschema/go.mod +++ b/cmd/configschema/go.mod @@ -427,9 +427,9 @@ require ( github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/influxdata/go-syslog/v3 v3.0.1-0.20210608084020-ac565dc76ba6 // indirect - github.com/influxdata/influxdb-observability/common v0.4.3 // indirect - github.com/influxdata/influxdb-observability/influx2otel v0.4.3 // indirect - github.com/influxdata/influxdb-observability/otel2influx v0.4.3 // indirect + github.com/influxdata/influxdb-observability/common v0.5.0 // indirect + github.com/influxdata/influxdb-observability/influx2otel v0.5.0 // indirect + github.com/influxdata/influxdb-observability/otel2influx v0.5.0 // indirect github.com/influxdata/line-protocol/v2 v2.2.1 // indirect github.com/ionos-cloud/sdk-go/v6 v6.1.4 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect diff --git a/cmd/configschema/go.sum b/cmd/configschema/go.sum index 3773fcfcf83f..9892370b3883 100644 --- a/cmd/configschema/go.sum +++ b/cmd/configschema/go.sum @@ -2004,12 +2004,12 @@ github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf github.com/influxdata/go-syslog/v3 v3.0.1-0.20210608084020-ac565dc76ba6 h1:s9ZL6ZhFF8y6ebnm1FLvobkzoIu5xwDQUcRPk/IEhpM= github.com/influxdata/go-syslog/v3 v3.0.1-0.20210608084020-ac565dc76ba6/go.mod h1:aXdIdfn2OcGnMhOTojXmwZqXKgC3MU5riiNvzwwG9OY= github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0IpXeMSkY/uJa/O/vC4= -github.com/influxdata/influxdb-observability/common v0.4.3 h1:7EBqIVJC9rFNohuOIvtpftkXFgNv8xkXd5JueqgHFO8= -github.com/influxdata/influxdb-observability/common v0.4.3/go.mod h1:4iLh+a678292K5J4pMh8wf2ZplteKfyGCfjHevgiUl0= -github.com/influxdata/influxdb-observability/influx2otel v0.4.3 h1:BAYfxUn7X6nQBfoUQz06wNkM/VDZbUacFtUG3F4I+Yc= -github.com/influxdata/influxdb-observability/influx2otel v0.4.3/go.mod h1:ALf1LF/Q8UKvKSZzF+Te6QwXPLbV3FlVnV6sGmiK99w= -github.com/influxdata/influxdb-observability/otel2influx v0.4.3 h1:W+bAZlCzDlXmGIzInoE97YFhqR/tLzXluTT1WqY34Ew= -github.com/influxdata/influxdb-observability/otel2influx v0.4.3/go.mod h1:Y+EnAd3n/u7a2+rMCh8FfcrxHbE7H7DrXFKVvM7YuWw= +github.com/influxdata/influxdb-observability/common v0.5.0 h1:Fo7AEfBzxkdjlP2R5390AeVo6Tr+lTSR+YX5qB0jxUc= +github.com/influxdata/influxdb-observability/common v0.5.0/go.mod h1:4iLh+a678292K5J4pMh8wf2ZplteKfyGCfjHevgiUl0= +github.com/influxdata/influxdb-observability/influx2otel v0.5.0 h1:+Boa8sos34aoaPJh+Rqrb6WYmewTD7dorjsGocOB/KY= +github.com/influxdata/influxdb-observability/influx2otel v0.5.0/go.mod h1:ALf1LF/Q8UKvKSZzF+Te6QwXPLbV3FlVnV6sGmiK99w= +github.com/influxdata/influxdb-observability/otel2influx v0.5.0 h1:nURLtW0mWp5q6xtfD7SFeoV6Ik0Cdk4Kgog83vZ6/qE= +github.com/influxdata/influxdb-observability/otel2influx v0.5.0/go.mod h1:e95xRYLB1aIR1IRC0/Iq4pSrR4txuQHu9PGtHbiVGAE= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= diff --git a/cmd/otelcontribcol/go.mod b/cmd/otelcontribcol/go.mod index 4b1bb8e46a71..60df7f8f6854 100644 --- a/cmd/otelcontribcol/go.mod +++ b/cmd/otelcontribcol/go.mod @@ -430,9 +430,9 @@ require ( github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/influxdata/go-syslog/v3 v3.0.1-0.20210608084020-ac565dc76ba6 // indirect - github.com/influxdata/influxdb-observability/common v0.4.3 // indirect - github.com/influxdata/influxdb-observability/influx2otel v0.4.3 // indirect - github.com/influxdata/influxdb-observability/otel2influx v0.4.3 // indirect + github.com/influxdata/influxdb-observability/common v0.5.0 // indirect + github.com/influxdata/influxdb-observability/influx2otel v0.5.0 // indirect + github.com/influxdata/influxdb-observability/otel2influx v0.5.0 // indirect github.com/influxdata/line-protocol/v2 v2.2.1 // indirect github.com/ionos-cloud/sdk-go/v6 v6.1.4 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect diff --git a/cmd/otelcontribcol/go.sum b/cmd/otelcontribcol/go.sum index 5b535808b0dd..139cd58bef03 100644 --- a/cmd/otelcontribcol/go.sum +++ b/cmd/otelcontribcol/go.sum @@ -2001,12 +2001,12 @@ github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf github.com/influxdata/go-syslog/v3 v3.0.1-0.20210608084020-ac565dc76ba6 h1:s9ZL6ZhFF8y6ebnm1FLvobkzoIu5xwDQUcRPk/IEhpM= github.com/influxdata/go-syslog/v3 v3.0.1-0.20210608084020-ac565dc76ba6/go.mod h1:aXdIdfn2OcGnMhOTojXmwZqXKgC3MU5riiNvzwwG9OY= github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0IpXeMSkY/uJa/O/vC4= -github.com/influxdata/influxdb-observability/common v0.4.3 h1:7EBqIVJC9rFNohuOIvtpftkXFgNv8xkXd5JueqgHFO8= -github.com/influxdata/influxdb-observability/common v0.4.3/go.mod h1:4iLh+a678292K5J4pMh8wf2ZplteKfyGCfjHevgiUl0= -github.com/influxdata/influxdb-observability/influx2otel v0.4.3 h1:BAYfxUn7X6nQBfoUQz06wNkM/VDZbUacFtUG3F4I+Yc= -github.com/influxdata/influxdb-observability/influx2otel v0.4.3/go.mod h1:ALf1LF/Q8UKvKSZzF+Te6QwXPLbV3FlVnV6sGmiK99w= -github.com/influxdata/influxdb-observability/otel2influx v0.4.3 h1:W+bAZlCzDlXmGIzInoE97YFhqR/tLzXluTT1WqY34Ew= -github.com/influxdata/influxdb-observability/otel2influx v0.4.3/go.mod h1:Y+EnAd3n/u7a2+rMCh8FfcrxHbE7H7DrXFKVvM7YuWw= +github.com/influxdata/influxdb-observability/common v0.5.0 h1:Fo7AEfBzxkdjlP2R5390AeVo6Tr+lTSR+YX5qB0jxUc= +github.com/influxdata/influxdb-observability/common v0.5.0/go.mod h1:4iLh+a678292K5J4pMh8wf2ZplteKfyGCfjHevgiUl0= +github.com/influxdata/influxdb-observability/influx2otel v0.5.0 h1:+Boa8sos34aoaPJh+Rqrb6WYmewTD7dorjsGocOB/KY= +github.com/influxdata/influxdb-observability/influx2otel v0.5.0/go.mod h1:ALf1LF/Q8UKvKSZzF+Te6QwXPLbV3FlVnV6sGmiK99w= +github.com/influxdata/influxdb-observability/otel2influx v0.5.0 h1:nURLtW0mWp5q6xtfD7SFeoV6Ik0Cdk4Kgog83vZ6/qE= +github.com/influxdata/influxdb-observability/otel2influx v0.5.0/go.mod h1:e95xRYLB1aIR1IRC0/Iq4pSrR4txuQHu9PGtHbiVGAE= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= diff --git a/exporter/influxdbexporter/README.md b/exporter/influxdbexporter/README.md index 979915991580..09fa06535051 100644 --- a/exporter/influxdbexporter/README.md +++ b/exporter/influxdbexporter/README.md @@ -31,6 +31,7 @@ The following configuration options are supported: * `db` (required if enabled) Name of the InfluxDB database to which signals will be written * `username` (optional) Basic auth username for authenticating with InfluxDB v1.x * `password` (optional) Basic auth password for authenticating with InfluxDB v1.x +* `span_dimensions` (default = service.name, span.name) Span attributes to use as dimensions (InfluxDB tags) * `metrics_schema` (default = telegraf-prometheus-v1) The chosen metrics schema to write; must be one of: * `telegraf-prometheus-v1` * `telegraf-prometheus-v2` @@ -55,6 +56,9 @@ exporters: org: my-org bucket: my-bucket token: my-token + span_dimensions: + - service.name + - span.name metrics_schema: telegraf-prometheus-v1 sending_queue: diff --git a/exporter/influxdbexporter/config.go b/exporter/influxdbexporter/config.go index 0aa5a0de3611..a5bd3d103a7d 100644 --- a/exporter/influxdbexporter/config.go +++ b/exporter/influxdbexporter/config.go @@ -4,9 +4,13 @@ package influxdbexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/influxdbexporter" import ( + "fmt" + "strings" + "go.opentelemetry.io/collector/config/confighttp" "go.opentelemetry.io/collector/config/configopaque" "go.opentelemetry.io/collector/exporter/exporterhelper" + "golang.org/x/exp/maps" ) // V1Compatibility is used to specify if the exporter should use the v1.X InfluxDB API schema. @@ -36,6 +40,17 @@ type Config struct { // V1Compatibility is used to specify if the exporter should use the v1.X InfluxDB API schema. V1Compatibility V1Compatibility `mapstructure:"v1_compatibility"` + // SpanDimensions are span attributes to be used as line protocol tags. + // These are always included as tags: + // - trace ID + // - span ID + // The default values are strongly recommended for use with Jaeger: + // - service.name + // - span.name + // Other common attributes can be found here: + // - https://github.com/open-telemetry/opentelemetry-collector/tree/main/semconv + SpanDimensions []string `mapstructure:"span_dimensions"` + // MetricsSchema indicates the metrics schema to emit to line protocol. // Options: // - telegraf-prometheus-v1 @@ -44,5 +59,19 @@ type Config struct { } func (cfg *Config) Validate() error { + uniqueDimensions := make(map[string]struct{}, len(cfg.SpanDimensions)) + duplicateDimensions := make(map[string]struct{}) + for _, k := range cfg.SpanDimensions { + if _, found := uniqueDimensions[k]; found { + duplicateDimensions[k] = struct{}{} + } else { + uniqueDimensions[k] = struct{}{} + } + } + + if len(duplicateDimensions) > 0 { + return fmt.Errorf("duplicate span dimension(s) configured: %s", + strings.Join(maps.Keys(duplicateDimensions), ",")) + } return nil } diff --git a/exporter/influxdbexporter/config_test.go b/exporter/influxdbexporter/config_test.go index 63736f2169d1..e2c62f0eaa60 100644 --- a/exporter/influxdbexporter/config_test.go +++ b/exporter/influxdbexporter/config_test.go @@ -31,11 +31,11 @@ func TestLoadConfig(t *testing.T) { expected component.Config }{ { - id: component.NewIDWithName(metadata.Type, ""), + id: component.NewIDWithName(metadata.Type, "default-config"), expected: createDefaultConfig(), }, { - id: component.NewIDWithName(metadata.Type, "withsettings"), + id: component.NewIDWithName(metadata.Type, "override-config"), expected: &Config{ HTTPClientSettings: confighttp.HTTPClientSettings{ Endpoint: "http://localhost:8080", @@ -55,10 +55,11 @@ func TestLoadConfig(t *testing.T) { RandomizationFactor: backoff.DefaultRandomizationFactor, Multiplier: backoff.DefaultMultiplier, }, - Org: "my-org", - Bucket: "my-bucket", - Token: "my-token", - MetricsSchema: "telegraf-prometheus-v2", + Org: "my-org", + Bucket: "my-bucket", + Token: "my-token", + SpanDimensions: []string{"service.name", "span.name"}, + MetricsSchema: "telegraf-prometheus-v1", }, }, } diff --git a/exporter/influxdbexporter/exporter.go b/exporter/influxdbexporter/exporter.go deleted file mode 100644 index c5963cd744bb..000000000000 --- a/exporter/influxdbexporter/exporter.go +++ /dev/null @@ -1,145 +0,0 @@ -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package influxdbexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/influxdbexporter" - -import ( - "context" - "fmt" - - "github.com/influxdata/influxdb-observability/common" - "github.com/influxdata/influxdb-observability/otel2influx" - "go.opentelemetry.io/collector/component" - "go.opentelemetry.io/collector/consumer/consumererror" - "go.opentelemetry.io/collector/exporter" - "go.opentelemetry.io/collector/pdata/plog" - "go.opentelemetry.io/collector/pdata/pmetric" - "go.opentelemetry.io/collector/pdata/ptrace" - "go.uber.org/multierr" -) - -type tracesExporter struct { - logger common.Logger - writer *influxHTTPWriter - converter *otel2influx.OtelTracesToLineProtocol - started bool -} - -func newTracesExporter(config *Config, settings exporter.CreateSettings) (*tracesExporter, error) { - logger := newZapInfluxLogger(settings.Logger) - - writer, err := newInfluxHTTPWriter(logger, config, settings.TelemetrySettings) - if err != nil { - return nil, err - } - - converter, err := otel2influx.NewOtelTracesToLineProtocol(logger, writer) - if err != nil { - return nil, err - } - - return &tracesExporter{ - logger: logger, - writer: writer, - converter: converter, - }, nil -} - -func (e *tracesExporter) pushTraces(ctx context.Context, td ptrace.Traces) error { - err := e.converter.WriteTraces(ctx, td) - if err != nil { - return consumererror.NewPermanent(err) - } - return nil -} - -func (e *tracesExporter) Start(ctx context.Context, host component.Host) error { - e.logger.Debug("starting traces exporter") - e.started = true - return multierr.Combine( - e.writer.Start(ctx, host), - e.converter.Start(ctx, host)) -} - -func (e *tracesExporter) Shutdown(ctx context.Context) error { - if !e.started { - return nil - } - return e.converter.Shutdown(ctx) -} - -type metricsExporter struct { - logger common.Logger - writer *influxHTTPWriter - converter *otel2influx.OtelMetricsToLineProtocol -} - -func newMetricsExporter(config *Config, params exporter.CreateSettings) (*metricsExporter, error) { - logger := newZapInfluxLogger(params.Logger) - schema, found := common.MetricsSchemata[config.MetricsSchema] - if !found { - return nil, fmt.Errorf("schema '%s' not recognized", config.MetricsSchema) - } - - writer, err := newInfluxHTTPWriter(logger, config, params.TelemetrySettings) - if err != nil { - return nil, err - } - - converter, err := otel2influx.NewOtelMetricsToLineProtocol(logger, writer, schema) - if err != nil { - return nil, err - } - - return &metricsExporter{ - logger: logger, - writer: writer, - converter: converter, - }, nil -} - -func (e *metricsExporter) pushMetrics(ctx context.Context, md pmetric.Metrics) error { - err := e.converter.WriteMetrics(ctx, md) - if err != nil { - return consumererror.NewPermanent(err) - } - return nil -} - -func (e *metricsExporter) Start(ctx context.Context, host component.Host) error { - return e.writer.Start(ctx, host) -} - -type logsExporter struct { - logger common.Logger - writer *influxHTTPWriter - converter *otel2influx.OtelLogsToLineProtocol -} - -func newLogsExporter(config *Config, params exporter.CreateSettings) (*logsExporter, error) { - logger := newZapInfluxLogger(params.Logger) - - writer, err := newInfluxHTTPWriter(logger, config, params.TelemetrySettings) - if err != nil { - return nil, err - } - converter := otel2influx.NewOtelLogsToLineProtocol(logger, writer) - - return &logsExporter{ - logger: logger, - writer: writer, - converter: converter, - }, nil -} - -func (e *logsExporter) pushLogs(ctx context.Context, ld plog.Logs) error { - err := e.converter.WriteLogs(ctx, ld) - if err != nil { - return consumererror.NewPermanent(err) - } - return nil -} - -func (e *logsExporter) Start(ctx context.Context, host component.Host) error { - return e.writer.Start(ctx, host) -} diff --git a/exporter/influxdbexporter/factory.go b/exporter/influxdbexporter/factory.go index 65491b6a63ee..2963f975a714 100644 --- a/exporter/influxdbexporter/factory.go +++ b/exporter/influxdbexporter/factory.go @@ -7,9 +7,11 @@ package influxdbexporter // import "github.com/open-telemetry/opentelemetry-coll import ( "context" + "fmt" "time" "github.com/influxdata/influxdb-observability/common" + "github.com/influxdata/influxdb-observability/otel2influx" "go.opentelemetry.io/collector/component" "go.opentelemetry.io/collector/config/confighttp" "go.opentelemetry.io/collector/config/configopaque" @@ -19,7 +21,7 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/influxdbexporter/internal/metadata" ) -// NewFactory creates a factory for Jaeger Thrift over HTTP exporter. +// NewFactory creates a factory for InfluxDB exporter. func NewFactory() exporter.Factory { return exporter.NewFactory( metadata.Type, @@ -30,10 +32,40 @@ func NewFactory() exporter.Factory { ) } -func createTraceExporter(ctx context.Context, set exporter.CreateSettings, config component.Config) (exporter.Traces, error) { +func createDefaultConfig() component.Config { + return &Config{ + HTTPClientSettings: confighttp.HTTPClientSettings{ + Timeout: 5 * time.Second, + Headers: map[string]configopaque.String{ + "User-Agent": "OpenTelemetry -> Influx", + }, + }, + QueueSettings: exporterhelper.NewDefaultQueueSettings(), + RetrySettings: exporterhelper.NewDefaultRetrySettings(), + MetricsSchema: common.MetricsSchemaTelegrafPrometheusV1.String(), + SpanDimensions: otel2influx.DefaultOtelTracesToLineProtocolConfig().SpanDimensions, + } +} + +func createTraceExporter( + ctx context.Context, + set exporter.CreateSettings, + config component.Config, +) (exporter.Traces, error) { cfg := config.(*Config) - exporter, err := newTracesExporter(cfg, set) + logger := newZapInfluxLogger(set.Logger) + + writer, err := newInfluxHTTPWriter(logger, cfg, set.TelemetrySettings) + if err != nil { + return nil, err + } + + expConfig := otel2influx.DefaultOtelTracesToLineProtocolConfig() + expConfig.Logger = logger + expConfig.Writer = writer + expConfig.SpanDimensions = cfg.SpanDimensions + exp, err := otel2influx.NewOtelTracesToLineProtocol(expConfig) if err != nil { return nil, err } @@ -42,18 +74,33 @@ func createTraceExporter(ctx context.Context, set exporter.CreateSettings, confi ctx, set, cfg, - exporter.pushTraces, + exp.WriteTraces, exporterhelper.WithQueue(cfg.QueueSettings), exporterhelper.WithRetry(cfg.RetrySettings), - exporterhelper.WithStart(exporter.Start), - exporterhelper.WithShutdown(exporter.Shutdown), + exporterhelper.WithStart(writer.Start), ) } func createMetricsExporter(ctx context.Context, set exporter.CreateSettings, config component.Config) (exporter.Metrics, error) { cfg := config.(*Config) - exporter, err := newMetricsExporter(cfg, set) + logger := newZapInfluxLogger(set.Logger) + + writer, err := newInfluxHTTPWriter(logger, cfg, set.TelemetrySettings) + if err != nil { + return nil, err + } + + schema, found := common.MetricsSchemata[cfg.MetricsSchema] + if !found { + return nil, fmt.Errorf("schema '%s' not recognized", cfg.MetricsSchema) + } + + expConfig := otel2influx.DefaultOtelMetricsToLineProtocolConfig() + expConfig.Logger = logger + expConfig.Writer = writer + expConfig.Schema = schema + exp, err := otel2influx.NewOtelMetricsToLineProtocol(expConfig) if err != nil { return nil, err } @@ -62,17 +109,27 @@ func createMetricsExporter(ctx context.Context, set exporter.CreateSettings, con ctx, set, cfg, - exporter.pushMetrics, + exp.WriteMetrics, exporterhelper.WithQueue(cfg.QueueSettings), exporterhelper.WithRetry(cfg.RetrySettings), - exporterhelper.WithStart(exporter.Start), + exporterhelper.WithStart(writer.Start), ) } func createLogsExporter(ctx context.Context, set exporter.CreateSettings, config component.Config) (exporter.Logs, error) { cfg := config.(*Config) - exporter, err := newLogsExporter(cfg, set) + logger := newZapInfluxLogger(set.Logger) + + writer, err := newInfluxHTTPWriter(logger, cfg, set.TelemetrySettings) + if err != nil { + return nil, err + } + + expConfig := otel2influx.DefaultOtelLogsToLineProtocolConfig() + expConfig.Logger = logger + expConfig.Writer = writer + exp, err := otel2influx.NewOtelLogsToLineProtocol(expConfig) if err != nil { return nil, err } @@ -81,23 +138,9 @@ func createLogsExporter(ctx context.Context, set exporter.CreateSettings, config ctx, set, cfg, - exporter.pushLogs, + exp.WriteLogs, exporterhelper.WithQueue(cfg.QueueSettings), exporterhelper.WithRetry(cfg.RetrySettings), - exporterhelper.WithStart(exporter.Start), + exporterhelper.WithStart(writer.Start), ) } - -func createDefaultConfig() component.Config { - return &Config{ - HTTPClientSettings: confighttp.HTTPClientSettings{ - Timeout: 5 * time.Second, - Headers: map[string]configopaque.String{ - "User-Agent": "OpenTelemetry -> Influx", - }, - }, - QueueSettings: exporterhelper.NewDefaultQueueSettings(), - RetrySettings: exporterhelper.NewDefaultRetrySettings(), - MetricsSchema: common.MetricsSchemaTelegrafPrometheusV1.String(), - } -} diff --git a/exporter/influxdbexporter/go.mod b/exporter/influxdbexporter/go.mod index 13478495c2e8..bca986af077a 100644 --- a/exporter/influxdbexporter/go.mod +++ b/exporter/influxdbexporter/go.mod @@ -4,8 +4,8 @@ go 1.19 require ( github.com/cenkalti/backoff/v4 v4.2.1 - github.com/influxdata/influxdb-observability/common v0.4.3 - github.com/influxdata/influxdb-observability/otel2influx v0.4.3 + github.com/influxdata/influxdb-observability/common v0.5.0 + github.com/influxdata/influxdb-observability/otel2influx v0.5.0 github.com/influxdata/line-protocol/v2 v2.2.1 github.com/stretchr/testify v1.8.4 go.opentelemetry.io/collector v0.79.0 @@ -13,9 +13,8 @@ require ( go.opentelemetry.io/collector/confmap v0.79.0 go.opentelemetry.io/collector/consumer v0.79.0 go.opentelemetry.io/collector/exporter v0.79.0 - go.opentelemetry.io/collector/pdata v1.0.0-rcv0012 - go.uber.org/multierr v1.11.0 go.uber.org/zap v1.24.0 + golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 ) require ( @@ -40,6 +39,7 @@ require ( github.com/rs/cors v1.9.0 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/collector/featuregate v1.0.0-rcv0012 // indirect + go.opentelemetry.io/collector/pdata v1.0.0-rcv0012 // indirect go.opentelemetry.io/collector/receiver v0.79.0 // indirect go.opentelemetry.io/collector/semconv v0.79.0 // indirect go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.42.0 // indirect @@ -47,6 +47,7 @@ require ( go.opentelemetry.io/otel/metric v1.16.0 // indirect go.opentelemetry.io/otel/trace v1.16.0 // indirect go.uber.org/atomic v1.10.0 // indirect + go.uber.org/multierr v1.11.0 // indirect golang.org/x/net v0.10.0 // indirect golang.org/x/sys v0.8.0 // indirect golang.org/x/text v0.9.0 // indirect diff --git a/exporter/influxdbexporter/go.sum b/exporter/influxdbexporter/go.sum index e4b00a001161..a9e4c351ee6f 100644 --- a/exporter/influxdbexporter/go.sum +++ b/exporter/influxdbexporter/go.sum @@ -158,10 +158,10 @@ github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKe github.com/hashicorp/yamux v0.0.0-20181012175058-2f1d1f20f75d/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM= github.com/hjson/hjson-go/v4 v4.0.0 h1:wlm6IYYqHjOdXH1gHev4VoXCaW20HdQAGCxdOEEg2cs= github.com/hjson/hjson-go/v4 v4.0.0/go.mod h1:KaYt3bTw3zhBjYqnXkYywcYctk0A2nxeEFTse3rH13E= -github.com/influxdata/influxdb-observability/common v0.4.3 h1:7EBqIVJC9rFNohuOIvtpftkXFgNv8xkXd5JueqgHFO8= -github.com/influxdata/influxdb-observability/common v0.4.3/go.mod h1:4iLh+a678292K5J4pMh8wf2ZplteKfyGCfjHevgiUl0= -github.com/influxdata/influxdb-observability/otel2influx v0.4.3 h1:W+bAZlCzDlXmGIzInoE97YFhqR/tLzXluTT1WqY34Ew= -github.com/influxdata/influxdb-observability/otel2influx v0.4.3/go.mod h1:Y+EnAd3n/u7a2+rMCh8FfcrxHbE7H7DrXFKVvM7YuWw= +github.com/influxdata/influxdb-observability/common v0.5.0 h1:Fo7AEfBzxkdjlP2R5390AeVo6Tr+lTSR+YX5qB0jxUc= +github.com/influxdata/influxdb-observability/common v0.5.0/go.mod h1:4iLh+a678292K5J4pMh8wf2ZplteKfyGCfjHevgiUl0= +github.com/influxdata/influxdb-observability/otel2influx v0.5.0 h1:nURLtW0mWp5q6xtfD7SFeoV6Ik0Cdk4Kgog83vZ6/qE= +github.com/influxdata/influxdb-observability/otel2influx v0.5.0/go.mod h1:e95xRYLB1aIR1IRC0/Iq4pSrR4txuQHu9PGtHbiVGAE= github.com/influxdata/line-protocol-corpus v0.0.0-20210519164801-ca6fa5da0184/go.mod h1:03nmhxzZ7Xk2pdG+lmMd7mHDfeVOYFyhOgwO61qWU98= github.com/influxdata/line-protocol-corpus v0.0.0-20210922080147-aa28ccfb8937 h1:MHJNQ+p99hFATQm6ORoLmpUCF7ovjwEFshs/NHzAbig= github.com/influxdata/line-protocol-corpus v0.0.0-20210922080147-aa28ccfb8937/go.mod h1:BKR9c0uHSmRgM/se9JhFHtTT7JTO67X23MtKMHtZcpo= @@ -354,6 +354,8 @@ golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3 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/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1 h1:k/i9J1pBpvlfR+9QsetwPyERsqu1GIbi967PQMq3Ivc= +golang.org/x/exp v0.0.0-20230522175609-2e198f4a06a1/go.mod h1:V1LtkGg67GoY2N1AnLN78QLrzxkLyJw7RJb1gzOOz9w= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= diff --git a/exporter/influxdbexporter/testdata/config.yaml b/exporter/influxdbexporter/testdata/config.yaml index ca32b0734ffa..e9729de3ac8e 100644 --- a/exporter/influxdbexporter/testdata/config.yaml +++ b/exporter/influxdbexporter/testdata/config.yaml @@ -1,5 +1,5 @@ -influxdb: -influxdb/withsettings: +influxdb/default-config: +influxdb/override-config: endpoint: http://localhost:8080 timeout: 500ms sending_queue: @@ -14,4 +14,7 @@ influxdb/withsettings: org: my-org bucket: my-bucket token: my-token - metrics_schema: telegraf-prometheus-v2 + metrics_schema: telegraf-prometheus-v1 + span_dimensions: + - service.name + - span.name diff --git a/exporter/influxdbexporter/writer.go b/exporter/influxdbexporter/writer.go index e8fcd804dd9d..85a60549ea14 100644 --- a/exporter/influxdbexporter/writer.go +++ b/exporter/influxdbexporter/writer.go @@ -24,6 +24,8 @@ import ( "go.opentelemetry.io/collector/consumer/consumererror" ) +var _ otel2influx.InfluxWriter = (*influxHTTPWriter)(nil) + type influxHTTPWriter struct { encoderPool sync.Pool httpClient *http.Client @@ -100,6 +102,7 @@ func composeWriteURL(config *Config) (string, error) { return writeURL.String(), nil } +// Start implements component.StartFunc func (w *influxHTTPWriter) Start(_ context.Context, host component.Host) error { httpClient, err := w.httpClientSettings.ToClient(host, w.telemetrySettings) if err != nil { @@ -113,6 +116,8 @@ func (w *influxHTTPWriter) NewBatch() otel2influx.InfluxWriterBatch { return newInfluxHTTPWriterBatch(w) } +var _ otel2influx.InfluxWriterBatch = (*influxHTTPWriterBatch)(nil) + type influxHTTPWriterBatch struct { *influxHTTPWriter encoder *lineprotocol.Encoder @@ -125,9 +130,10 @@ func newInfluxHTTPWriterBatch(w *influxHTTPWriter) *influxHTTPWriterBatch { } } -// WritePoint emits a set of line protocol attributes (metrics, tags, fields, timestamp) -// to the internal line protocol buffer. This method implements otel2influx.InfluxWriter. -func (b *influxHTTPWriterBatch) WritePoint(_ context.Context, measurement string, tags map[string]string, fields map[string]interface{}, ts time.Time, _ common.InfluxMetricValueType) error { +// EnqueuePoint emits a set of line protocol attributes (metrics, tags, fields, timestamp) +// to the internal line protocol buffer. +// Errors are always "permanent". +func (b *influxHTTPWriterBatch) EnqueuePoint(measurement string, tags map[string]string, fields map[string]interface{}, ts time.Time, _ common.InfluxMetricValueType) error { b.encoder.StartLine(measurement) for _, tag := range b.optimizeTags(tags) { b.encoder.AddTag(tag.k, tag.v) @@ -146,7 +152,8 @@ func (b *influxHTTPWriterBatch) WritePoint(_ context.Context, measurement string return nil } -func (b *influxHTTPWriterBatch) FlushBatch(ctx context.Context) error { +// WriteBatch sends the internal line protocol buffer to InfluxDB. +func (b *influxHTTPWriterBatch) WriteBatch(ctx context.Context) error { defer func() { b.encoder.Reset() b.encoder.ClearErr() diff --git a/go.mod b/go.mod index ed8088c4dbd8..93e01577c63a 100644 --- a/go.mod +++ b/go.mod @@ -411,9 +411,9 @@ require ( github.com/imdario/mergo v0.3.13 // indirect github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/influxdata/go-syslog/v3 v3.0.1-0.20210608084020-ac565dc76ba6 // indirect - github.com/influxdata/influxdb-observability/common v0.4.3 // indirect - github.com/influxdata/influxdb-observability/influx2otel v0.4.3 // indirect - github.com/influxdata/influxdb-observability/otel2influx v0.4.3 // indirect + github.com/influxdata/influxdb-observability/common v0.5.0 // indirect + github.com/influxdata/influxdb-observability/influx2otel v0.5.0 // indirect + github.com/influxdata/influxdb-observability/otel2influx v0.5.0 // indirect github.com/influxdata/line-protocol/v2 v2.2.1 // indirect github.com/ionos-cloud/sdk-go/v6 v6.1.4 // indirect github.com/jackc/chunkreader/v2 v2.0.1 // indirect diff --git a/go.sum b/go.sum index 9a8e4cb8bd4a..b064e9798393 100644 --- a/go.sum +++ b/go.sum @@ -2007,12 +2007,12 @@ github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLf github.com/influxdata/go-syslog/v3 v3.0.1-0.20210608084020-ac565dc76ba6 h1:s9ZL6ZhFF8y6ebnm1FLvobkzoIu5xwDQUcRPk/IEhpM= github.com/influxdata/go-syslog/v3 v3.0.1-0.20210608084020-ac565dc76ba6/go.mod h1:aXdIdfn2OcGnMhOTojXmwZqXKgC3MU5riiNvzwwG9OY= github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0IpXeMSkY/uJa/O/vC4= -github.com/influxdata/influxdb-observability/common v0.4.3 h1:7EBqIVJC9rFNohuOIvtpftkXFgNv8xkXd5JueqgHFO8= -github.com/influxdata/influxdb-observability/common v0.4.3/go.mod h1:4iLh+a678292K5J4pMh8wf2ZplteKfyGCfjHevgiUl0= -github.com/influxdata/influxdb-observability/influx2otel v0.4.3 h1:BAYfxUn7X6nQBfoUQz06wNkM/VDZbUacFtUG3F4I+Yc= -github.com/influxdata/influxdb-observability/influx2otel v0.4.3/go.mod h1:ALf1LF/Q8UKvKSZzF+Te6QwXPLbV3FlVnV6sGmiK99w= -github.com/influxdata/influxdb-observability/otel2influx v0.4.3 h1:W+bAZlCzDlXmGIzInoE97YFhqR/tLzXluTT1WqY34Ew= -github.com/influxdata/influxdb-observability/otel2influx v0.4.3/go.mod h1:Y+EnAd3n/u7a2+rMCh8FfcrxHbE7H7DrXFKVvM7YuWw= +github.com/influxdata/influxdb-observability/common v0.5.0 h1:Fo7AEfBzxkdjlP2R5390AeVo6Tr+lTSR+YX5qB0jxUc= +github.com/influxdata/influxdb-observability/common v0.5.0/go.mod h1:4iLh+a678292K5J4pMh8wf2ZplteKfyGCfjHevgiUl0= +github.com/influxdata/influxdb-observability/influx2otel v0.5.0 h1:+Boa8sos34aoaPJh+Rqrb6WYmewTD7dorjsGocOB/KY= +github.com/influxdata/influxdb-observability/influx2otel v0.5.0/go.mod h1:ALf1LF/Q8UKvKSZzF+Te6QwXPLbV3FlVnV6sGmiK99w= +github.com/influxdata/influxdb-observability/otel2influx v0.5.0 h1:nURLtW0mWp5q6xtfD7SFeoV6Ik0Cdk4Kgog83vZ6/qE= +github.com/influxdata/influxdb-observability/otel2influx v0.5.0/go.mod h1:e95xRYLB1aIR1IRC0/Iq4pSrR4txuQHu9PGtHbiVGAE= github.com/influxdata/influxdb1-client v0.0.0-20191209144304-8bf82d3c094d/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= diff --git a/receiver/influxdbreceiver/go.mod b/receiver/influxdbreceiver/go.mod index b1ded2de9253..e4ce22eaf588 100644 --- a/receiver/influxdbreceiver/go.mod +++ b/receiver/influxdbreceiver/go.mod @@ -4,8 +4,8 @@ go 1.19 require ( github.com/influxdata/influxdb-client-go/v2 v2.12.3 - github.com/influxdata/influxdb-observability/common v0.4.3 - github.com/influxdata/influxdb-observability/influx2otel v0.4.3 + github.com/influxdata/influxdb-observability/common v0.5.0 + github.com/influxdata/influxdb-observability/influx2otel v0.5.0 github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c github.com/influxdata/line-protocol/v2 v2.2.1 github.com/open-telemetry/opentelemetry-collector-contrib/internal/common v0.79.0 diff --git a/receiver/influxdbreceiver/go.sum b/receiver/influxdbreceiver/go.sum index f62753d5ba20..2d6e21c04424 100644 --- a/receiver/influxdbreceiver/go.sum +++ b/receiver/influxdbreceiver/go.sum @@ -162,10 +162,10 @@ github.com/hjson/hjson-go/v4 v4.0.0 h1:wlm6IYYqHjOdXH1gHev4VoXCaW20HdQAGCxdOEEg2 github.com/hjson/hjson-go/v4 v4.0.0/go.mod h1:KaYt3bTw3zhBjYqnXkYywcYctk0A2nxeEFTse3rH13E= github.com/influxdata/influxdb-client-go/v2 v2.12.3 h1:28nRlNMRIV4QbtIUvxhWqaxn0IpXeMSkY/uJa/O/vC4= github.com/influxdata/influxdb-client-go/v2 v2.12.3/go.mod h1:IrrLUbCjjfkmRuaCiGQg4m2GbkaeJDcuWoxiWdQEbA0= -github.com/influxdata/influxdb-observability/common v0.4.3 h1:7EBqIVJC9rFNohuOIvtpftkXFgNv8xkXd5JueqgHFO8= -github.com/influxdata/influxdb-observability/common v0.4.3/go.mod h1:4iLh+a678292K5J4pMh8wf2ZplteKfyGCfjHevgiUl0= -github.com/influxdata/influxdb-observability/influx2otel v0.4.3 h1:BAYfxUn7X6nQBfoUQz06wNkM/VDZbUacFtUG3F4I+Yc= -github.com/influxdata/influxdb-observability/influx2otel v0.4.3/go.mod h1:ALf1LF/Q8UKvKSZzF+Te6QwXPLbV3FlVnV6sGmiK99w= +github.com/influxdata/influxdb-observability/common v0.5.0 h1:Fo7AEfBzxkdjlP2R5390AeVo6Tr+lTSR+YX5qB0jxUc= +github.com/influxdata/influxdb-observability/common v0.5.0/go.mod h1:4iLh+a678292K5J4pMh8wf2ZplteKfyGCfjHevgiUl0= +github.com/influxdata/influxdb-observability/influx2otel v0.5.0 h1:+Boa8sos34aoaPJh+Rqrb6WYmewTD7dorjsGocOB/KY= +github.com/influxdata/influxdb-observability/influx2otel v0.5.0/go.mod h1:ALf1LF/Q8UKvKSZzF+Te6QwXPLbV3FlVnV6sGmiK99w= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c h1:qSHzRbhzK8RdXOsAdfDgO49TtqC1oZ+acxPrkfTxcCs= github.com/influxdata/influxdb1-client v0.0.0-20220302092344-a9ab5670611c/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839 h1:W9WBk7wlPfJLvMCdtV4zPulc4uCPrlywQOmbFOhgQNU=