diff --git a/diskcache/metric.go b/diskcache/metric.go index 56b0ff32..dad43256 100644 --- a/diskcache/metric.go +++ b/diskcache/metric.go @@ -247,6 +247,14 @@ func setupMetrics() { metrics.MustRegister(Metrics()...) } +func (c *DiskCache) initMetrics() { + sizeVec.WithLabelValues(c.path).Set(float64(c.size.Load())) + putBytesVec.WithLabelValues(c.path) + getBytesVec.WithLabelValues(c.path) + putLatencyVec.WithLabelValues(c.path) + getLatencyVec.WithLabelValues(c.path) +} + // ResetMetrics used to cleanup exist metrics of diskcache. func ResetMetrics() { droppedDataVec.Reset() diff --git a/diskcache/metric_test.go b/diskcache/metric_test.go index 792d2667..4b361226 100644 --- a/diskcache/metric_test.go +++ b/diskcache/metric_test.go @@ -37,6 +37,77 @@ func getSamples(data []byte) []byte { } } +func TestOpenInitializesColdStartMetrics(t *T.T) { + ResetMetrics() + + reg := prometheus.NewRegistry() + reg.MustRegister(Metrics()...) + + cachePath := t.TempDir() + c, err := Open(WithPath(cachePath)) + require.NoError(t, err) + t.Cleanup(func() { + assert.NoError(t, c.Close()) + ResetMetrics() + }) + + mfs, err := reg.Gather() + require.NoError(t, err) + fullMetrics := metrics.MetricFamily2Text(mfs) + + sizeMetric := metrics.GetMetricOnLabels(mfs, "diskcache_size", c.path) + require.NotNilf(t, sizeMetric, fullMetrics) + assert.Zero(t, sizeMetric.GetGauge().GetValue(), fullMetrics) + + for _, name := range []string{ + "diskcache_put_bytes", + "diskcache_get_bytes", + "diskcache_put_latency", + "diskcache_get_latency", + } { + metric := metrics.GetMetricOnLabels(mfs, name, c.path) + require.NotNilf(t, metric, "%s:\n%s", name, fullMetrics) + assert.Zero(t, metric.GetSummary().GetSampleCount(), name) + assert.Zero(t, metric.GetSummary().GetSampleSum(), name) + } + + lastCloseMetric := metrics.GetMetricOnLabels(mfs, "diskcache_last_close_time", c.path) + assert.Nilf(t, lastCloseMetric, fullMetrics) +} + +func TestOpenInitializesSizeMetricFromRotatedFiles(t *T.T) { + ResetMetrics() + + cachePath := t.TempDir() + seedCache, err := Open(WithPath(cachePath), WithNoSync(true)) + require.NoError(t, err) + require.NoError(t, seedCache.Put(make([]byte, 9))) + require.NoError(t, seedCache.Rotate()) + require.NoError(t, seedCache.Put(make([]byte, 21))) + require.NoError(t, seedCache.Rotate()) + require.NoError(t, seedCache.Close()) + ResetMetrics() + + reg := prometheus.NewRegistry() + reg.MustRegister(Metrics()...) + + c, err := Open(WithPath(cachePath)) + require.NoError(t, err) + t.Cleanup(func() { + assert.NoError(t, c.Close()) + ResetMetrics() + }) + + mfs, err := reg.Gather() + require.NoError(t, err) + fullMetrics := metrics.MetricFamily2Text(mfs) + + sizeMetric := metrics.GetMetricOnLabels(mfs, "diskcache_size", c.path) + require.NotNilf(t, sizeMetric, fullMetrics) + assert.Equal(t, int64(46), c.size.Load()) + assert.Equal(t, float64(46), sizeMetric.GetGauge().GetValue(), fullMetrics) +} + func TestPutGetMetrics(t *T.T) { t.Run("test-wakeup-count", func(t *T.T) { reg := prometheus.NewRegistry() @@ -152,7 +223,9 @@ func TestMetric(t *T.T) { require.Nilf(t, m, fullMetrics) m = metrics.GetMetricOnLabels(mfs, "diskcache_get_latency", c.path) - require.Nilf(t, m, fullMetrics) + require.NotNilf(t, m, fullMetrics) + assert.Zero(t, m.GetSummary().GetSampleCount(), fullMetrics) + assert.Zero(t, m.GetSummary().GetSampleSum(), fullMetrics) m = metrics.GetMetricOnLabels(mfs, "diskcache_rotate", c.path) require.Nilf(t, m, fullMetrics) @@ -170,6 +243,14 @@ func TestMetric(t *T.T) { assert.Equalf(t, uint64(1), m.GetSummary().GetSampleCount(), fullMetrics) assert.Equalf(t, float64(108), m.GetSummary().GetSampleSum(), fullMetrics) + m = metrics.GetMetricOnLabels(mfs, "diskcache_put_latency", c.path) + require.NotNilf(t, m, fullMetrics) + assert.Equalf(t, uint64(1), m.GetSummary().GetSampleCount(), fullMetrics) + + m = metrics.GetMetricOnLabels(mfs, "diskcache_get_latency", c.path) + require.NotNilf(t, m, fullMetrics) + assert.Equalf(t, uint64(1), m.GetSummary().GetSampleCount(), fullMetrics) + m = metrics.GetMetricOnLabels(mfs, "diskcache_size", c.path) require.NotNilf(t, m, fullMetrics) assert.Equalf(t, 0.0, m.GetGauge().GetValue(), fullMetrics) diff --git a/diskcache/open.go b/diskcache/open.go index e590c233..0c7b9d43 100644 --- a/diskcache/open.go +++ b/diskcache/open.go @@ -39,6 +39,7 @@ func Open(opts ...CacheOption) (*DiskCache, error) { if err := c.doOpen(); err != nil { return nil, WrapOpenError(err, c.path).WithDetails("failed_to_open_diskcache") } + c.initMetrics() defer func() { c.labels = append(c.labels,