goburrow / cache

Mango Cache πŸ₯­ - Partial implementation of Guava Cache in Go (golang).
BSD 3-Clause "New" or "Revised" License
580 stars 48 forks source link

Enhance the StatsCounter interface to support size tracking of the cache #36

Open kakkoyun opened 1 year ago

kakkoyun commented 1 year ago

Hey πŸ‘‹ I'm a keen user of the library. Thanks a lot for the work. It's a fantastic package. Simple and functional.

I recently had a use case where I'd like to keep track of the cache size. I think it's doable with minimal change to the StatsCounter interface and stats.

I don't know if the size calculation should be left to the interface's implementer or handled by the caching layer. I'd love to hear your opinion on it @nqv

It could also be achieved if the withInsertionListener is public https://github.com/goburrow/cache/blob/f6da914dd6e3546dffa8802919dbca80cd33abe3/local.go#L575-L576

I would be happy to work if you're willing to accept my contribution.

type Stats struct {
    HitCount         uint64
    MissCount        uint64
    LoadSuccessCount uint64
    LoadErrorCount   uint64
    TotalLoadTime    time.Duration
    EvictionCount    uint64
+   Size uint64
}
// StatsCounter accumulates statistics of a cache.
type StatsCounter interface {
    // RecordHits records cache hits.
    RecordHits(count uint64)

    // RecordMisses records cache misses.
    RecordMisses(count uint64)

    // RecordLoadSuccess records successful load of a new entry.
    RecordLoadSuccess(loadTime time.Duration)

    // RecordLoadError records failed load of a new entry.
    RecordLoadError(loadTime time.Duration)

    // RecordInsertion records the insertion of an entry from the cache.
+   RecordInsertion(v Value) // or directly the size of the value

    // RecordEviction records eviction of an entry from the cache.
+   RecordEviction(v Value) // or directly the size of the value

    // Snapshot writes snapshot of this counter values to the given Stats pointer.
    Snapshot(*Stats)
}
kakkoyun commented 1 year ago

@nqv I could be creating an XY-problem https://xyproblem.info/

I want to reiterate. I want to expose a metric to show the current cache sizes of various caches we use. I would be glad if you have a better solution proposal.