Monitor a Gradle build cache with Prometheus and Grafana
+The cache server exposes Prometheus metrics and a read-only status page. This page lists what is there, a scrape setting, a few queries, and where to get a ready-made Grafana dashboard.
+ +Metrics need no password
+The /metrics and /healthz paths stay open even when Basic Auth is on, so a Prometheus scraper needs no credentials. The status page, /statusz, sits behind Basic Auth when it is enabled.
A scrape setting
+scrape_configs:
+ - job_name: fscache
+ static_configs:
+ - targets: ['cache.example.com:8080']
+ This is a plain example. Use your own address, and HTTPS if you have put the server behind a proxy.
+ +The metrics
+These are the names a running 0.2.1 server reports:
+| Metric | Type | What it tells you |
|---|---|---|
fscache_cache_hits_total | counter | Requests answered from the cache |
fscache_cache_misses_total | counter | Requests for something not stored |
fscache_store_bytes | gauge | How much is stored now |
fscache_store_entries | gauge | How many entries are stored |
fscache_evicted_entries_total | counter | Entries removed to stay under the size cap |
fscache_http_requests_total | counter | Requests, by method and status |
fscache_http_request_duration_seconds | histogram | How long requests take |
fscache_bytes_read_total | counter | Bytes sent to clients |
fscache_bytes_written_total | counter | Bytes received from clients |
Queries worth having
+# hit rate over the last 5 minutes
+sum(rate(fscache_cache_hits_total[5m]))
+ / clamp_min(sum(rate(fscache_cache_hits_total[5m])) + sum(rate(fscache_cache_misses_total[5m])), 0.0001)
+
+# entries removed per second to stay under the cap
+sum(rate(fscache_evicted_entries_total[5m]))
+
+# 95th percentile request time
+histogram_quantile(0.95, sum by (le, method) (rate(fscache_http_request_duration_seconds_bucket[5m])))
+ A hit rate that never climbs, together with constant evictions, usually means the size cap is too small. See server sizing.
+ +A ready-made Grafana dashboard
+The repository includes a dashboard with eight panels: hit rate, cache size against the cap, entries, evictions, hits and misses, requests by status, throughput, and request latency. Download grafana-dashboard.json and import it in Grafana.
The status page
+For a quick look without Prometheus, /statusz returns the same numbers in one place, in a browser or as JSON. This is what a freshly started 0.2.1 server returned after one stored entry and two requests:
$ curl -s localhost:8080/statusz
+{
+ "version": "v0.2.1",
+ "revision": "0bfc498ecfca3e38cb4a456acda44359a1620c5a",
+ "fips140": false,
+ "fips140_note": "off",
+ "uptime_seconds": 2.118684875,
+ "uptime": "2s",
+ "store_bytes": 5,
+ "max_bytes": 1073741824,
+ "store_entries": 1,
+ "cache_hits": 1,
+ "cache_misses": 1,
+ "hit_ratio": 0.5,
+ "evicted_entries": 0,
+ "auth_enabled": false
+}
+
+ Related: Gradle remote build cache not working and Gradle build cache with Docker Compose.
+ +