From 4f002bf14e9e6dde1da46d2ca159135170130b6e Mon Sep 17 00:00:00 2001 From: Cyril Tovena Date: Thu, 22 Apr 2021 17:08:33 +0200 Subject: [PATCH 1/2] Rejects push requests with streams without labels. Fixes #3638 Signed-off-by: Cyril Tovena --- pkg/distributor/validator.go | 4 ++++ pkg/distributor/validator_test.go | 13 +++++++++++-- pkg/validation/validate.go | 5 ++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/pkg/distributor/validator.go b/pkg/distributor/validator.go index 57d59f93112f..5c6ab2374cfd 100644 --- a/pkg/distributor/validator.go +++ b/pkg/distributor/validator.go @@ -81,6 +81,10 @@ func (v Validator) ValidateEntry(ctx validationContext, labels string, entry log // Validate labels returns an error if the labels are invalid func (v Validator) ValidateLabels(ctx validationContext, ls labels.Labels, stream logproto.Stream) error { + if len(ls) == 0 { + validation.DiscardedSamples.WithLabelValues(validation.MissingLabels, ctx.userID).Inc() + return httpgrpc.Errorf(http.StatusBadRequest, validation.MissingLabelsErrorMsg) + } numLabelNames := len(ls) if numLabelNames > ctx.maxLabelNamesPerSeries { validation.DiscardedSamples.WithLabelValues(validation.MaxLabelNamesPerSeries, ctx.userID).Inc() diff --git a/pkg/distributor/validator_test.go b/pkg/distributor/validator_test.go index 21ba92235081..983a329008d8 100644 --- a/pkg/distributor/validator_test.go +++ b/pkg/distributor/validator_test.go @@ -16,8 +16,10 @@ import ( "github.com/grafana/loki/pkg/validation" ) -var testStreamLabels = "FIXME" -var testTime = time.Now() +var ( + testStreamLabels = "FIXME" + testTime = time.Now() +) func TestValidator_ValidateEntry(t *testing.T) { tests := []struct { @@ -95,6 +97,13 @@ func TestValidator_ValidateLabels(t *testing.T) { "{foo=\"bar\"}", nil, }, + { + "empty", + "test", + nil, + "{}", + nil, + }, { "test too many labels", "test", diff --git a/pkg/validation/validate.go b/pkg/validation/validate.go index 6441fe036e84..409f3047c3fb 100644 --- a/pkg/validation/validate.go +++ b/pkg/validation/validate.go @@ -7,7 +7,10 @@ import ( const ( discardReasonLabel = "reason" // InvalidLabels is a reason for discarding log lines which have labels that cannot be parsed. - InvalidLabels = "invalid_labels" + InvalidLabels = "invalid_labels" + MissingLabels = "missing_labels" + + MissingLabelsErrorMsg = "error at least one label pair is required per stream" InvalidLabelsErrorMsg = "Error parsing labels '%s' with error: %s" // RateLimited is one of the values for the reason to discard samples. // Declared here to avoid duplication in ingester and distributor. From f8b1e401bc76860bb37b3b37fbef014c1d885fb8 Mon Sep 17 00:00:00 2001 From: Cyril Tovena Date: Thu, 22 Apr 2021 17:11:30 +0200 Subject: [PATCH 2/2] Missing commit Signed-off-by: Cyril Tovena --- pkg/distributor/validator_test.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/distributor/validator_test.go b/pkg/distributor/validator_test.go index 983a329008d8..4eb6c1b28ae0 100644 --- a/pkg/distributor/validator_test.go +++ b/pkg/distributor/validator_test.go @@ -102,7 +102,7 @@ func TestValidator_ValidateLabels(t *testing.T) { "test", nil, "{}", - nil, + httpgrpc.Errorf(http.StatusBadRequest, validation.MissingLabelsErrorMsg), }, { "test too many labels",