Skip to content
This repository has been archived by the owner on Mar 27, 2024. It is now read-only.

Commit

Permalink
feat(cassandra): collect row cache (#945)
Browse files Browse the repository at this point in the history
  • Loading branch information
ilyam8 authored Oct 25, 2022
1 parent 8f2f8ab commit 590dc6b
Show file tree
Hide file tree
Showing 7 changed files with 307 additions and 234 deletions.
4 changes: 4 additions & 0 deletions modules/cassandra/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,6 +43,10 @@ Labels per scope:
|-----------------------------------|:-----------:|:-------------:|:------------:|
| client_requests_rate | global | read, write | requests/s |
| client_requests_latency | global | read, write | seconds |
| row_cache_hit_ratio | global | hit_ratio | percentage |
| row_cache_hit_rate | global | hits, misses | events/s |
| row_cache_utilization | global | used | percentage |
| row_cache_size | global | size | bytes |
| key_cache_hit_ratio | global | hit_ratio | percentage |
| key_cache_hit_rate | global | hits, misses | events/s |
| key_cache_utilization | global | used | percentage |
Expand Down
45 changes: 27 additions & 18 deletions modules/cassandra/cassandra_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -115,31 +115,36 @@ func TestCassandra_Collect(t *testing.T) {
wantCollected: map[string]int64{
"client_request_failures_reads": 0,
"client_request_failures_writes": 0,
"client_request_latency_reads": 1,
"client_request_latency_writes": 0,
"client_request_latency_reads": 2279017,
"client_request_latency_writes": 2285110,
"client_request_timeouts_reads": 0,
"client_request_timeouts_writes": 0,
"client_request_total_latency_reads": 19692,
"client_request_total_latency_writes": 0,
"client_request_total_latency_reads": 155385053,
"client_request_total_latency_writes": 100869491,
"client_request_unavailables_reads": 0,
"client_request_unavailables_writes": 0,
"compaction_bytes_compacted": 24822,
"compaction_completed_tasks": 44,
"compaction_bytes_compacted": 840350211,
"compaction_completed_tasks": 185,
"compaction_pending_tasks": 0,
"dropped_messages_one_minute": 0,
"jvm_gc_cms_count": 1,
"jvm_gc_cms_time": 60,
"jvm_gc_parnew_count": 297,
"jvm_gc_parnew_time": 937,
"jvm_memory_heap_used": 602092056,
"jvm_memory_nonheap_used": 78651400,
"key_cache_hit_ratio": 85401,
"key_cache_hits": 117,
"key_cache_misses": 20,
"key_cache_size": 72921832,
"key_cache_utilization": 7727,
"jvm_gc_cms_count": 4,
"jvm_gc_cms_time": 208,
"jvm_gc_parnew_count": 324,
"jvm_gc_parnew_time": 5020,
"jvm_memory_heap_used": 1262549184,
"jvm_memory_nonheap_used": 95144624,
"key_cache_hit_ratio": 76552,
"key_cache_hits": 5323032,
"key_cache_misses": 1630411,
"key_cache_size": 131861248,
"key_cache_utilization": 13972,
"row_cache_hit_ratio": 0,
"row_cache_hits": 0,
"row_cache_misses": 0,
"row_cache_size": 0,
"row_cache_utilization": 0,
"storage_exceptions": 0,
"storage_load": 145838019,
"storage_load": 630321359,
"thread_pool_CacheCleanupExecutor_active_tasks": 0,
"thread_pool_CacheCleanupExecutor_blocked_tasks": 0,
"thread_pool_CacheCleanupExecutor_pending_tasks": 0,
Expand Down Expand Up @@ -168,6 +173,10 @@ func TestCassandra_Collect(t *testing.T) {
"thread_pool_MemtableReclaimMemory_blocked_tasks": 0,
"thread_pool_MemtableReclaimMemory_pending_tasks": 0,
"thread_pool_MemtableReclaimMemory_total_blocked_tasks": 0,
"thread_pool_MutationStage_active_tasks": 0,
"thread_pool_MutationStage_blocked_tasks": 0,
"thread_pool_MutationStage_pending_tasks": 0,
"thread_pool_MutationStage_total_blocked_tasks": 0,
"thread_pool_Native-Transport-Requests_active_tasks": 0,
"thread_pool_Native-Transport-Requests_blocked_tasks": 0,
"thread_pool_Native-Transport-Requests_pending_tasks": 0,
Expand Down
56 changes: 56 additions & 0 deletions modules/cassandra/charts.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ package cassandra

import (
"fmt"

"github.com/netdata/go.d.plugin/agent/module"
)

Expand All @@ -13,9 +14,13 @@ const (
prioLatency

prioKeyCacheHitRatio
prioRowCacheHitRatio
prioKeyCacheHitRate
prioRowCacheHitRate
prioKeyCacheUtilization
prioRowCacheUtilization
prioKeyCacheSize
prioRowCacheSize

prioStorageLiveDiskSpaceUsed

Expand Down Expand Up @@ -45,9 +50,13 @@ var baseCharts = module.Charts{
chartClientRequestsLatency.Copy(),

chartKeyCacheHitRatio.Copy(),
chartRowCacheHitRatio.Copy(),
chartKeyCacheHitRate.Copy(),
chartRowCacheHitRate.Copy(),
chartKeyCacheUtilization.Copy(),
chartRowCacheUtilization.Copy(),
chartKeyCacheSize.Copy(),
chartRowCacheSize.Copy(),

chartStorageLiveDiskSpaceUsed.Copy(),

Expand Down Expand Up @@ -143,6 +152,53 @@ var (
{ID: "key_cache_size", Name: "size"},
},
}

chartRowCacheHitRatio = module.Chart{
ID: "row_cache_hit_ratio",
Title: "Row cache hit ratio",
Units: "percentage",
Fam: "cache",
Ctx: "cassandra.row_cache_hit_ratio",
Priority: prioRowCacheHitRatio,
Dims: module.Dims{
{ID: "row_cache_hit_ratio", Name: "hit_ratio", Div: 1000},
},
}
chartRowCacheHitRate = module.Chart{
ID: "row_cache_hit_rate",
Title: "Row cache hit rate",
Units: "events/s",
Fam: "cache",
Ctx: "cassandra.row_cache_hit_rate",
Priority: prioRowCacheHitRate,
Type: module.Stacked,
Dims: module.Dims{
{ID: "row_cache_hits", Name: "hits", Algo: module.Incremental},
{ID: "row_cache_misses", Name: "misses", Algo: module.Incremental},
},
}
chartRowCacheUtilization = module.Chart{
ID: "row_cache_utilization",
Title: "Row cache utilization",
Units: "percentage",
Fam: "cache",
Ctx: "cassandra.row_cache_utilization",
Priority: prioRowCacheUtilization,
Dims: module.Dims{
{ID: "row_cache_utilization", Name: "used", Div: 1000},
},
}
chartRowCacheSize = module.Chart{
ID: "row_cache_size",
Title: "Row cache size",
Units: "bytes",
Fam: "cache",
Ctx: "cassandra.row_cache_size",
Priority: prioRowCacheSize,
Dims: module.Dims{
{ID: "row_cache_size", Name: "size"},
},
}
)

var (
Expand Down
62 changes: 49 additions & 13 deletions modules/cassandra/collect.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,24 @@ func (c *Cassandra) processMetric(mx map[string]int64) {
c.mx.clientReqFailuresReads.write(mx, "client_request_failures_reads")
c.mx.clientReqFailuresWrites.write(mx, "client_request_failures_writes")

c.mx.rowCacheHits.write(mx, "row_cache_hits")
c.mx.rowCacheMisses.write(mx, "row_cache_misses")
c.mx.rowCacheSize.write(mx, "row_cache_size")
if c.mx.rowCacheHits.isSet && c.mx.rowCacheMisses.isSet {
if s := c.mx.rowCacheHits.value + c.mx.rowCacheMisses.value; s > 0 {
mx["row_cache_hit_ratio"] = int64((c.mx.rowCacheHits.value * 100 / s) * 1000)
} else {
mx["row_cache_hit_ratio"] = 0
}
}
if c.mx.rowCacheCapacity.isSet && c.mx.rowCacheSize.isSet {
if s := c.mx.rowCacheCapacity.value; s > 0 {
mx["row_cache_utilization"] = int64((c.mx.rowCacheSize.value * 100 / s) * 1000)
} else {
mx["row_cache_utilization"] = 0
}
}

c.mx.keyCacheHits.write(mx, "key_cache_hits")
c.mx.keyCacheMisses.write(mx, "key_cache_misses")
c.mx.keyCacheSize.write(mx, "key_cache_size")
Expand Down Expand Up @@ -121,61 +139,79 @@ func (c *Cassandra) collectMetrics(pms prometheus.Metrics) {
func (c *Cassandra) collectClientRequestMetrics(pms prometheus.Metrics) {
const metric = "org_apache_cassandra_metrics_clientrequest"

var rw struct{ r, w *metricValue }
var rw struct{ read, write *metricValue }
for _, pm := range pms.FindByName(metric + suffixCount) {
name := pm.Labels.Get("name")
scope := pm.Labels.Get("scope")

switch name {
case "TotalLatency":
rw.r, rw.w = &c.mx.clientReqTotalLatencyReads, &c.mx.clientReqTotalLatencyWrites
rw.read, rw.write = &c.mx.clientReqTotalLatencyReads, &c.mx.clientReqTotalLatencyWrites
case "Latency":
rw.r, rw.w = &c.mx.clientReqLatencyReads, &c.mx.clientReqLatencyWrites
rw.read, rw.write = &c.mx.clientReqLatencyReads, &c.mx.clientReqLatencyWrites
case "Timeouts":
rw.r, rw.w = &c.mx.clientReqTimeoutsReads, &c.mx.clientReqTimeoutsWrites
rw.read, rw.write = &c.mx.clientReqTimeoutsReads, &c.mx.clientReqTimeoutsWrites
case "Unavailables":
rw.r, rw.w = &c.mx.clientReqUnavailablesReads, &c.mx.clientReqUnavailablesWrites
rw.read, rw.write = &c.mx.clientReqUnavailablesReads, &c.mx.clientReqUnavailablesWrites
case "Failures":
rw.r, rw.w = &c.mx.clientReqFailuresReads, &c.mx.clientReqFailuresWrites
rw.read, rw.write = &c.mx.clientReqFailuresReads, &c.mx.clientReqFailuresWrites
default:
continue
}

switch scope {
case "Read":
rw.r.add(pm.Value)
rw.read.add(pm.Value)
case "Write":
rw.w.add(pm.Value)
rw.write.add(pm.Value)
}
}
}

func (c *Cassandra) collectCacheMetrics(pms prometheus.Metrics) {
const metric = "org_apache_cassandra_metrics_cache"

var hm struct{ hits, misses *metricValue }
for _, pm := range pms.FindByName(metric + suffixCount) {
name := pm.Labels.Get("name")
scope := pm.Labels.Get("scope")
if scope != "KeyCache" {

switch scope {
case "KeyCache":
hm.hits, hm.misses = &c.mx.keyCacheHits, &c.mx.keyCacheMisses
case "RowCache":
hm.hits, hm.misses = &c.mx.rowCacheHits, &c.mx.rowCacheMisses
default:
continue
}

switch name {
case "Hits":
c.mx.keyCacheHits.add(pm.Value)
hm.hits.add(pm.Value)
case "Misses":
c.mx.keyCacheMisses.add(pm.Value)
hm.misses.add(pm.Value)
}
}

var cs struct{ cap, size *metricValue }
for _, pm := range pms.FindByName(metric + suffixValue) {
name := pm.Labels.Get("name")
scope := pm.Labels.Get("scope")

switch scope {
case "KeyCache":
cs.cap, cs.size = &c.mx.keyCacheCapacity, &c.mx.keyCacheSize
case "RowCache":
cs.cap, cs.size = &c.mx.rowCacheCapacity, &c.mx.rowCacheSize
default:
continue
}

switch name {
case "Capacity":
c.mx.keyCacheCapacity.add(pm.Value)
cs.cap.add(pm.Value)
case "Size":
c.mx.keyCacheSize.add(pm.Value)
cs.size.add(pm.Value)
}
}
}
Expand Down
4 changes: 2 additions & 2 deletions modules/cassandra/jmx_exporter.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ rules:
- pattern: org.apache.cassandra.metrics<type=(DroppedMessage), scope=(\S*), name=(Dropped)><>(OneMinuteRate)

# Cache
- pattern: org.apache.cassandra.metrics<type=Cache, scope=(KeyCache), name=(Hits|Misses)><>(Count)
- pattern: org.apache.cassandra.metrics<type=Cache, scope=(KeyCache), name=(Capacity|Size)><>(Value)
- pattern: org.apache.cassandra.metrics<type=Cache, scope=(KeyCache|RowCache), name=(Hits|Misses)><>(Count)
- pattern: org.apache.cassandra.metrics<type=Cache, scope=(KeyCache|RowCache), name=(Capacity|Size)><>(Value)

# Storage
- pattern: org.apache.cassandra.metrics<type=(Storage), name=(Load|Exceptions)><>(Count)
Expand Down
4 changes: 4 additions & 0 deletions modules/cassandra/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,10 @@ type cassandraMetrics struct {
clientReqFailuresReads metricValue
clientReqFailuresWrites metricValue

rowCacheHits metricValue
rowCacheMisses metricValue
rowCacheCapacity metricValue
rowCacheSize metricValue
keyCacheHits metricValue
keyCacheMisses metricValue
keyCacheCapacity metricValue
Expand Down
Loading

0 comments on commit 590dc6b

Please sign in to comment.