diff --git a/CHANGELOG.md b/CHANGELOG.md index c1ac31375986..0a54c3f22717 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ - `k8s_observer`: discover k8s.node endpoints (#6820) - `redisreceiver`: Add missing description fields to keyspace metrics (#6940) - `kafkaexporter`: Allow controlling Kafka acknowledgment behaviour (#6301) +- `lokiexporter`: Log the first part of the http body on failed pushes to loki (#6946) ## 🛑 Breaking changes 🛑 diff --git a/exporter/lokiexporter/exporter.go b/exporter/lokiexporter/exporter.go index 5293616f213a..aa1f7f7ea7ac 100644 --- a/exporter/lokiexporter/exporter.go +++ b/exporter/lokiexporter/exporter.go @@ -15,12 +15,12 @@ package lokiexporter // import "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter" import ( + "bufio" "bytes" "context" "errors" "fmt" "io" - "io/ioutil" "net/http" "strconv" "strings" @@ -39,6 +39,10 @@ import ( "github.com/open-telemetry/opentelemetry-collector-contrib/exporter/lokiexporter/internal/third_party/loki/logproto" ) +const ( + maxErrMsgLen = 1024 +) + type lokiExporter struct { config *Config logger *zap.Logger @@ -93,11 +97,18 @@ func (l *lokiExporter) pushLogData(ctx context.Context, ld pdata.Logs) error { return consumererror.NewLogs(err, ld) } - _, _ = io.Copy(ioutil.Discard, resp.Body) - _ = resp.Body.Close() + defer func() { + _, _ = io.Copy(io.Discard, resp.Body) + _ = resp.Body.Close() + }() if resp.StatusCode < http.StatusOK || resp.StatusCode >= http.StatusMultipleChoices { - err = fmt.Errorf("HTTP %d %q", resp.StatusCode, http.StatusText(resp.StatusCode)) + scanner := bufio.NewScanner(io.LimitReader(resp.Body, maxErrMsgLen)) + line := "" + if scanner.Scan() { + line = scanner.Text() + } + err = fmt.Errorf("HTTP %d %q: %s", resp.StatusCode, http.StatusText(resp.StatusCode), line) return consumererror.NewLogs(err, ld) }