diff --git a/storage/local/storage.go b/storage/local/storage.go index 25dc30b0a..fa9001702 100644 --- a/storage/local/storage.go +++ b/storage/local/storage.go @@ -180,6 +180,7 @@ type MemorySeriesStorage struct { persistErrors prometheus.Counter queuedChunksToPersist prometheus.Counter numSeries prometheus.Gauge + numHeadChunks prometheus.Gauge dirtySeries prometheus.Gauge seriesOps *prometheus.CounterVec ingestedSamplesCount prometheus.Counter @@ -254,6 +255,12 @@ func NewMemorySeriesStorage(o *MemorySeriesStorageOptions) *MemorySeriesStorage Name: "memory_series", Help: "The current number of series in memory.", }), + numHeadChunks: prometheus.NewGauge(prometheus.GaugeOpts{ + Namespace: namespace, + Subsystem: subsystem, + Name: "open_head_chunks", + Help: "The current number of open head chunks.", + }), dirtySeries: prometheus.NewGauge(prometheus.GaugeOpts{ Namespace: namespace, Subsystem: subsystem, @@ -372,6 +379,14 @@ func (s *MemorySeriesStorage) Start() (err error) { log.Info("Loading series map and head chunks...") s.fpToSeries, s.numChunksToPersist, err = p.loadSeriesMapAndHeads() + for fp := range s.fpToSeries.fpIter() { + if series, ok := s.fpToSeries.get(fp); ok { + if !series.headChunkClosed { + s.numHeadChunks.Inc() + } + } + } + if err != nil { return err } @@ -977,6 +992,9 @@ func (s *MemorySeriesStorage) getOrCreateSeries(fp model.Fingerprint, m model.Me } s.fpToSeries.put(fp, series) s.numSeries.Inc() + if !series.headChunkClosed { + s.numHeadChunks.Inc() + } } return series, nil } @@ -1383,6 +1401,7 @@ func (s *MemorySeriesStorage) maintainMemorySeries( } if closed { s.incNumChunksToPersist(1) + s.numHeadChunks.Dec() } seriesWasDirty := series.dirty @@ -1783,6 +1802,7 @@ func (s *MemorySeriesStorage) Describe(ch chan<- *prometheus.Desc) { ch <- maxChunksToPersistDesc ch <- numChunksToPersistDesc ch <- s.numSeries.Desc() + ch <- s.numHeadChunks.Desc() ch <- s.dirtySeries.Desc() s.seriesOps.Describe(ch) ch <- s.ingestedSamplesCount.Desc() @@ -1812,6 +1832,7 @@ func (s *MemorySeriesStorage) Collect(ch chan<- prometheus.Metric) { float64(s.getNumChunksToPersist()), ) ch <- s.numSeries + ch <- s.numHeadChunks ch <- s.dirtySeries s.seriesOps.Collect(ch) ch <- s.ingestedSamplesCount