Skip to content

Commit

Permalink
Log errors even when retry_on_failure is not used (#8792)
Browse files Browse the repository at this point in the history
**Description:**

Fixes
#8791.
Logging errors normally happens in the retry exporter helper if
retry_on_failure is disabled:


https://github.com/open-telemetry/opentelemetry-collector/blob/66166c4cc371fbe945d7ff19232decd3ee65f76a/exporter/exporterhelper/retry_sender.go#L108-L115

When WithRetry is not specified in the component, no logging happens at
all. This change makes the "base" retry sender log errors, so that if a
component does not specify WithRetry, it still has errors logged,
similar to the behavior with disabled retry.
  • Loading branch information
dashpole authored Nov 1, 2023
1 parent 66166c4 commit 29c16a2
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 1 deletion.
25 changes: 25 additions & 0 deletions .chloggen/fix_logging_without_retry.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
# Use this changelog template to create an entry for release notes.

# 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. otlpreceiver)
component: exporterhelper

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Log export errors when retry is not used by the component.

# One or more tracking issues or pull requests related to the change
issues: [8791]

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

# Optional: The change log or logs in which this entry should be included.
# e.g. '[user]' or '[user, api]'
# Include 'user' if the change is relevant to end users.
# Include 'api' if there is a change to a library API.
# Default: '[user]'
change_logs: [user]
20 changes: 19 additions & 1 deletion exporter/exporterhelper/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@ package exporterhelper // import "go.opentelemetry.io/collector/exporter/exporte
import (
"context"

"go.uber.org/zap"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/consumer"
"go.opentelemetry.io/collector/exporter"
Expand Down Expand Up @@ -40,6 +42,22 @@ func (b *baseRequestSender) setNextSender(nextSender requestSender) {
b.nextSender = nextSender
}

type errorLoggingRequestSender struct {
baseRequestSender
logger *zap.Logger
}

func (l *errorLoggingRequestSender) send(req internal.Request) error {
err := l.baseRequestSender.send(req)
if err != nil {
l.logger.Error(
"Exporting failed",
zap.Error(err),
)
}
return err
}

type obsrepSenderFactory func(obsrep *ObsReport) requestSender

// baseRequest is a base implementation for the internal.Request.
Expand Down Expand Up @@ -176,7 +194,7 @@ func newBaseExporter(set exporter.CreateSettings, signal component.DataType, req

queueSender: &baseRequestSender{},
obsrepSender: osf(obsReport),
retrySender: &baseRequestSender{},
retrySender: &errorLoggingRequestSender{logger: set.Logger},
timeoutSender: &timeoutSender{cfg: NewDefaultTimeoutSettings()},

set: set,
Expand Down
15 changes: 15 additions & 0 deletions exporter/exporterhelper/common_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import (
"go.opencensus.io/tag"
"go.opentelemetry.io/otel/codes"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
"go.uber.org/zap"
"go.uber.org/zap/zaptest/observer"

"go.opentelemetry.io/collector/component"
"go.opentelemetry.io/collector/component/componenttest"
Expand Down Expand Up @@ -79,3 +81,16 @@ func TestQueueRetryOptionsWithRequestExporter(t *testing.T) {
WithRetry(NewDefaultRetrySettings()), WithQueue(NewDefaultQueueSettings()))
})
}

func TestBaseExporterLogging(t *testing.T) {
set := exportertest.NewNopCreateSettings()
logger, observed := observer.New(zap.DebugLevel)
set.Logger = zap.New(logger)
bs, err := newBaseExporter(set, "", true, nil, nil, newNoopObsrepSender)
require.Nil(t, err)
require.True(t, bs.requestExporter)
sendErr := bs.send(newErrorRequest(context.Background()))
require.Error(t, sendErr)

require.Len(t, observed.FilterLevelExact(zap.ErrorLevel).All(), 1)
}

0 comments on commit 29c16a2

Please sign in to comment.