diff --git a/cmd/prometheus/main.go b/cmd/prometheus/main.go index 57c21c6d8d..ea78e0436e 100644 --- a/cmd/prometheus/main.go +++ b/cmd/prometheus/main.go @@ -181,6 +181,9 @@ func (c *flagConfig) setFeatureListOptions(logger log.Logger) error { case "extra-scrape-metrics": c.scrape.ExtraMetrics = true level.Info(logger).Log("msg", "Experimental additional scrape metrics enabled") + case "metadata-storage": + c.scrape.EnableMetadataStorage = true + level.Info(logger).Log("msg", "Experimental in-memory metadata storage enabled") case "new-service-discovery-manager": c.enableNewSDManager = true level.Info(logger).Log("msg", "Experimental service discovery manager") diff --git a/storage/remote/codec.go b/storage/remote/codec.go index f45484160a..a8c4ba939e 100644 --- a/storage/remote/codec.go +++ b/storage/remote/codec.go @@ -36,7 +36,6 @@ import ( "github.com/prometheus/prometheus/storage" "github.com/prometheus/prometheus/tsdb/chunkenc" "github.com/prometheus/prometheus/tsdb/chunks" - "github.com/prometheus/prometheus/tsdb/record" ) // decodeReadLimit is the maximum size of a read request body in bytes. @@ -757,15 +756,6 @@ func spansToSpansProto(s []histogram.Span) []prompb.BucketSpan { return spans } -func MetadataToMetadataProto(metricName string, m record.RefMetadata) prompb.MetricMetadata { - return prompb.MetricMetadata{ - MetricFamilyName: metricName, - Type: metricTypeToMetricTypeProto(record.ToTextparseMetricType(m.Type)), - Help: m.Help, - Unit: m.Unit, - } -} - // LabelProtosToMetric unpack a []*prompb.Label to a model.Metric func LabelProtosToMetric(labelPairs []*prompb.Label) model.Metric { metric := make(model.Metric, len(labelPairs)) diff --git a/storage/remote/codec_test.go b/storage/remote/codec_test.go index dbd5cec219..436752d3f1 100644 --- a/storage/remote/codec_test.go +++ b/storage/remote/codec_test.go @@ -57,6 +57,7 @@ var writeRequestFixture = &prompb.WriteRequest{ Samples: []prompb.Sample{{Value: 1, Timestamp: 0}}, Exemplars: []prompb.Exemplar{{Labels: []prompb.Label{{Name: "f", Value: "g"}}, Value: 1, Timestamp: 0}}, Histograms: []prompb.Histogram{HistogramToHistogramProto(0, &testHistogram), FloatHistogramToHistogramProto(1, testHistogram.ToFloat())}, + Metadatas: []prompb.Metadata{{Type: prompb.Metadata_COUNTER, Help: "help text 1", Unit: "unit text 1"}}, }, { Labels: []prompb.Label{ @@ -69,6 +70,7 @@ var writeRequestFixture = &prompb.WriteRequest{ Samples: []prompb.Sample{{Value: 2, Timestamp: 1}}, Exemplars: []prompb.Exemplar{{Labels: []prompb.Label{{Name: "h", Value: "i"}}, Value: 2, Timestamp: 1}}, Histograms: []prompb.Histogram{HistogramToHistogramProto(2, &testHistogram), FloatHistogramToHistogramProto(3, testHistogram.ToFloat())}, + Metadatas: []prompb.Metadata{{Type: prompb.Metadata_GAUGE, Help: "help text 2", Unit: "unit text 2"}}, }, }, } diff --git a/storage/remote/queue_manager.go b/storage/remote/queue_manager.go index c8ed2611d7..d5feb03e92 100644 --- a/storage/remote/queue_manager.go +++ b/storage/remote/queue_manager.go @@ -1614,7 +1614,7 @@ func (s *shards) sendSamplesWithBackoff(ctx context.Context, samples []prompb.Ti s.qm.metrics.samplesTotal.Add(float64(sampleCount)) s.qm.metrics.exemplarsTotal.Add(float64(exemplarCount)) s.qm.metrics.histogramsTotal.Add(float64(histogramCount)) - s.qm.metrics.metadataTotal.Add(float64(histogramCount)) + s.qm.metrics.metadataTotal.Add(float64(metadataCount)) err := s.qm.client().Store(ctx, *buf) s.qm.metrics.sentBatchDuration.Observe(time.Since(begin).Seconds()) diff --git a/storage/remote/write_handler_test.go b/storage/remote/write_handler_test.go index 3bce5f1d88..a2b1a9b148 100644 --- a/storage/remote/write_handler_test.go +++ b/storage/remote/write_handler_test.go @@ -54,6 +54,7 @@ func TestRemoteWriteHandler(t *testing.T) { i := 0 j := 0 k := 0 + l := 0 for _, ts := range writeRequestFixture.Timeseries { labels := labelProtosToLabels(ts.Labels) for _, s := range ts.Samples { @@ -78,6 +79,11 @@ func TestRemoteWriteHandler(t *testing.T) { k++ } + + for _, m := range ts.Metadatas { + require.Equal(t, mockMetadata{labels, int32(m.Type), m.Unit, m.Help}, appendable.metadata[l]) + l++ + } } } @@ -239,6 +245,7 @@ type mockAppendable struct { exemplars []mockExemplar latestHistogram int64 histograms []mockHistogram + metadata []mockMetadata commitErr error } @@ -262,6 +269,13 @@ type mockHistogram struct { fh *histogram.FloatHistogram } +type mockMetadata struct { + l labels.Labels + mtype int32 + unit string + help string +} + func (m *mockAppendable) Appender(_ context.Context) storage.Appender { return m } @@ -304,8 +318,7 @@ func (m *mockAppendable) AppendHistogram(_ storage.SeriesRef, l labels.Labels, t return 0, nil } -func (m *mockAppendable) UpdateMetadata(_ storage.SeriesRef, _ labels.Labels, _ metadata.Metadata) (storage.SeriesRef, error) { - // TODO: Wire metadata in a mockAppendable field when we get around to handling metadata in remote_write. - // UpdateMetadata is no-op for remote write (where mockAppendable is being used to test) for now. +func (m *mockAppendable) UpdateMetadata(_ storage.SeriesRef, l labels.Labels, mp metadata.Metadata) (storage.SeriesRef, error) { + m.metadata = append(m.metadata, mockMetadata{l, int32(metricTypeToProtoEquivalent(mp.Type)), mp.Unit, mp.Help}) return 0, nil }