Skip to content

Commit d829d65

Browse files
authored
Improve validation metrics for discarded samples and exemplars (#6218)
1 parent 0f848d8 commit d829d65

File tree

2 files changed

+82
-34
lines changed

2 files changed

+82
-34
lines changed

pkg/distributor/distributor.go

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -874,7 +874,13 @@ func (d *Distributor) prepareSeriesKeys(ctx context.Context, req *cortexpb.Write
874874
d.validateMetrics.DiscardedSamples.WithLabelValues(
875875
validation.DroppedByRelabelConfiguration,
876876
userID,
877-
).Add(float64(len(ts.Samples)))
877+
).Add(float64(len(ts.Samples) + len(ts.Histograms)))
878+
879+
// all labels are gone, exemplars will be discarded
880+
d.validateMetrics.DiscardedExemplars.WithLabelValues(
881+
validation.DroppedByRelabelConfiguration,
882+
userID,
883+
).Add(float64(len(ts.Exemplars)))
878884
continue
879885
}
880886
ts.Labels = cortexpb.FromLabelsToLabelAdapters(l)
@@ -892,11 +898,15 @@ func (d *Distributor) prepareSeriesKeys(ctx context.Context, req *cortexpb.Write
892898
}
893899

894900
if len(ts.Labels) == 0 {
895-
d.validateMetrics.DiscardedExemplars.WithLabelValues(
901+
d.validateMetrics.DiscardedSamples.WithLabelValues(
896902
validation.DroppedByUserConfigurationOverride,
897903
userID,
898-
).Add(float64(len(ts.Samples)))
904+
).Add(float64(len(ts.Samples) + len(ts.Histograms)))
899905

906+
d.validateMetrics.DiscardedExemplars.WithLabelValues(
907+
validation.DroppedByUserConfigurationOverride,
908+
userID,
909+
).Add(float64(len(ts.Exemplars)))
900910
continue
901911
}
902912

pkg/distributor/distributor_test.go

Lines changed: 69 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1490,6 +1490,7 @@ func TestDistributor_Push_LabelRemoval(t *testing.T) {
14901490
expectedSeries labels.Labels
14911491
removeReplica bool
14921492
removeLabels []string
1493+
exemplars []cortexpb.Exemplar
14931494
}
14941495

14951496
cases := []testcase{
@@ -1536,6 +1537,20 @@ func TestDistributor_Push_LabelRemoval(t *testing.T) {
15361537
{Name: "cluster", Value: "one"},
15371538
},
15381539
},
1540+
// No labels left.
1541+
{
1542+
removeReplica: true,
1543+
removeLabels: []string{"cluster"},
1544+
inputSeries: labels.Labels{
1545+
{Name: "cluster", Value: "one"},
1546+
{Name: "__replica__", Value: "two"},
1547+
},
1548+
expectedSeries: labels.Labels{},
1549+
exemplars: []cortexpb.Exemplar{
1550+
{Labels: cortexpb.FromLabelsToLabelAdapters(labels.FromStrings("test", "a")), Value: 1, TimestampMs: 0},
1551+
{Labels: cortexpb.FromLabelsToLabelAdapters(labels.FromStrings("test", "b")), Value: 1, TimestampMs: 0},
1552+
},
1553+
},
15391554
}
15401555

15411556
for _, tc := range cases {
@@ -1546,6 +1561,15 @@ func TestDistributor_Push_LabelRemoval(t *testing.T) {
15461561
limits.DropLabels = tc.removeLabels
15471562
limits.AcceptHASamples = tc.removeReplica
15481563

1564+
expectedDiscardedSamples := 0
1565+
expectedDiscardedExemplars := 0
1566+
if tc.expectedSeries.Len() == 0 {
1567+
expectedDiscardedSamples = 1
1568+
expectedDiscardedExemplars = len(tc.exemplars)
1569+
// Allow series with no labels to ingest
1570+
limits.EnforceMetricName = false
1571+
}
1572+
15491573
ds, ingesters, _, _ := prepare(t, prepConfig{
15501574
numIngesters: 2,
15511575
happyIngesters: 2,
@@ -1556,14 +1580,24 @@ func TestDistributor_Push_LabelRemoval(t *testing.T) {
15561580

15571581
// Push the series to the distributor
15581582
req := mockWriteRequest([]labels.Labels{tc.inputSeries}, 1, 1, histogram)
1583+
req.Timeseries[0].Exemplars = tc.exemplars
15591584
_, err = ds[0].Push(ctx, req)
15601585
require.NoError(t, err)
15611586

1587+
actualDiscardedSamples := testutil.ToFloat64(ds[0].validateMetrics.DiscardedSamples.WithLabelValues(validation.DroppedByUserConfigurationOverride, "user"))
1588+
actualDiscardedExemplars := testutil.ToFloat64(ds[0].validateMetrics.DiscardedExemplars.WithLabelValues(validation.DroppedByUserConfigurationOverride, "user"))
1589+
require.Equal(t, float64(expectedDiscardedSamples), actualDiscardedSamples)
1590+
require.Equal(t, float64(expectedDiscardedExemplars), actualDiscardedExemplars)
1591+
15621592
// Since each test pushes only 1 series, we do expect the ingester
15631593
// to have received exactly 1 series
15641594
for i := range ingesters {
15651595
timeseries := ingesters[i].series()
1566-
assert.Equal(t, 1, len(timeseries))
1596+
expectedSeries := 1
1597+
if tc.expectedSeries.Len() == 0 {
1598+
expectedSeries = 0
1599+
}
1600+
assert.Equal(t, expectedSeries, len(timeseries))
15671601
for _, v := range timeseries {
15681602
assert.Equal(t, tc.expectedSeries, cortexpb.FromLabelAdaptersToLabels(v.Labels))
15691603
}
@@ -3777,39 +3811,43 @@ func TestDistributor_Push_RelabelDropWillExportMetricOfDroppedSamples(t *testing
37773811
flagext.DefaultValues(&limits)
37783812
limits.MetricRelabelConfigs = metricRelabelConfigs
37793813

3780-
ds, ingesters, regs, _ := prepare(t, prepConfig{
3781-
numIngesters: 2,
3782-
happyIngesters: 2,
3783-
numDistributors: 1,
3784-
shardByAllLabels: true,
3785-
limits: &limits,
3786-
})
3787-
3788-
// Push the series to the distributor
3789-
req := mockWriteRequest(inputSeries, 1, 1, false)
3790-
ctx := user.InjectOrgID(context.Background(), "userDistributorPushRelabelDropWillExportMetricOfDroppedSamples")
3791-
_, err = ds[0].Push(ctx, req)
3792-
require.NoError(t, err)
3814+
for _, histogramEnabled := range []bool{false, true} {
3815+
ds, ingesters, _, _ := prepare(t, prepConfig{
3816+
numIngesters: 2,
3817+
happyIngesters: 2,
3818+
numDistributors: 1,
3819+
shardByAllLabels: true,
3820+
limits: &limits,
3821+
})
37933822

3794-
// Since each test pushes only 1 series, we do expect the ingester
3795-
// to have received exactly 1 series
3796-
for i := range ingesters {
3797-
timeseries := ingesters[i].series()
3798-
assert.Equal(t, 1, len(timeseries))
3799-
}
3823+
// Push the series to the distributor
3824+
id := "user"
3825+
req := mockWriteRequest(inputSeries, 1, 1, histogramEnabled)
3826+
req.Timeseries[0].Exemplars = []cortexpb.Exemplar{
3827+
{Labels: cortexpb.FromLabelsToLabelAdapters(labels.FromStrings("test", "a")), Value: 1, TimestampMs: 0},
3828+
{Labels: cortexpb.FromLabelsToLabelAdapters(labels.FromStrings("test", "b")), Value: 1, TimestampMs: 0},
3829+
}
3830+
ctx := user.InjectOrgID(context.Background(), id)
3831+
_, err = ds[0].Push(ctx, req)
3832+
require.NoError(t, err)
38003833

3801-
metrics := []string{"cortex_distributor_received_samples_total", "cortex_discarded_samples_total"}
3834+
for i := range ingesters {
3835+
timeseries := ingesters[i].series()
3836+
assert.Equal(t, 1, len(timeseries))
3837+
}
38023838

3803-
expectedMetrics := `
3804-
# HELP cortex_discarded_samples_total The total number of samples that were discarded.
3805-
# TYPE cortex_discarded_samples_total counter
3806-
cortex_discarded_samples_total{reason="relabel_configuration",user="userDistributorPushRelabelDropWillExportMetricOfDroppedSamples"} 1
3807-
# HELP cortex_distributor_received_samples_total The total number of received samples, excluding rejected and deduped samples.
3808-
# TYPE cortex_distributor_received_samples_total counter
3809-
cortex_distributor_received_samples_total{type="float",user="userDistributorPushRelabelDropWillExportMetricOfDroppedSamples"} 1
3810-
cortex_distributor_received_samples_total{type="histogram",user="userDistributorPushRelabelDropWillExportMetricOfDroppedSamples"} 0
3811-
`
3812-
require.NoError(t, testutil.GatherAndCompare(regs[0], strings.NewReader(expectedMetrics), metrics...))
3839+
require.Equal(t, testutil.ToFloat64(ds[0].validateMetrics.DiscardedSamples.WithLabelValues(validation.DroppedByRelabelConfiguration, id)), float64(1))
3840+
require.Equal(t, testutil.ToFloat64(ds[0].validateMetrics.DiscardedExemplars.WithLabelValues(validation.DroppedByRelabelConfiguration, id)), float64(2))
3841+
receivedFloatSamples := testutil.ToFloat64(ds[0].receivedSamples.WithLabelValues(id, "float"))
3842+
receivedHistogramSamples := testutil.ToFloat64(ds[0].receivedSamples.WithLabelValues(id, "histogram"))
3843+
if histogramEnabled {
3844+
require.Equal(t, receivedFloatSamples, float64(0))
3845+
require.Equal(t, receivedHistogramSamples, float64(1))
3846+
} else {
3847+
require.Equal(t, receivedFloatSamples, float64(1))
3848+
require.Equal(t, receivedHistogramSamples, float64(0))
3849+
}
3850+
}
38133851
}
38143852

38153853
func countMockIngestersCalls(ingesters []*mockIngester, name string) int {

0 commit comments

Comments
 (0)