Datadog Cassandra Metric Gaps

Datadog Cassandra Metric Gaps in the Default Integration

In the Cassandra Monitoring Tools Comparison 2026, I looked at the choice between a Cassandra-focused operations platform, a self-managed Prometheus stack, and broad observability products such as Datadog. This article goes one level deeper into Datadog’s shipped Cassandra integration.

The distinction is worth making because “Datadog can collect Cassandra metrics” is true, but incomplete. A default integration is a starting point, not a description of every JMX metric that Cassandra can publish. Datadog’s Cassandra check is useful for local read and write latency, disk consumption, basic table health, selected thread-pool queues, dropped messages, commit log size, and node availability. Datadog also has host metrics and standard JVM telemetry alongside this Cassandra-specific mapping.

That is enough to answer a sensible first question: are reads slow, are writes slow, and is a node filling its disks? It is not enough to diagnose many of the incidents Cassandra operators spend their time on. Repair progress, hint delivery, streaming, unavailable errors, compaction pressure, internode queues, and client connection health are not in the default collection set.

At a glance, the gap between Datadog’s default mapping and Cassandra’s available telemetry looks like this. Cassandra begins with its node-level metric families, then expands per keyspace, table, and peer. The table count alone changes the scale quickly: 60 user tables expose more than 6,900 table metric names on each node before attributes, percentiles, keyspace rollups, or per-peer metrics are included.

Figure What it shows
72 Distinct cassandra.* metric names in Datadog's published Cassandra catalogue.
~7 Cassandra JMX metric families addressed by the default mapping, out of roughly 30 families Cassandra 4.1 and 5.0 publish.
115+ Metric names Cassandra 5.0 exposes for every table, before attributes, percentiles, or dimensions are selected.
6,900+ Table metric names Cassandra publishes on one node with 60 user tables, before attributes, percentiles, keyspace rollups, or per-peer metrics.
350 Datadog's standard per-node metric collection ceiling, before a support exception is needed; it does not cover Cassandra's full metric output.

These are not metrics that Datadog cannot ingest. They are metrics that are not collected by the shipped Cassandra configuration, and the 350-metrics-per-instance limit makes collecting all of them impractical on a table-heavy cluster.

This review is based on Datadog’s current metrics.yaml and metric catalogue, read on 3 September 2026, against the Apache Cassandra 4.1 and 5.0 metric references. The configuration can change, so check the version installed with your Agent before making a production decision.

Datadog Default Metrics

The shipped Cassandra metric configuration has a deliberately narrow shape. At table level it collects local ReadLatency and WriteLatency percentiles, request rates, SSTable counts, disk usage, pending compactions, flush counts, tombstones scanned, SSTables per read, partition-size information, and a few cache and compression values. It excludes the Cassandra system keyspaces from that table-level collection.

At node level it includes selected request and internal thread-pool queues, dropped-message rates, storage exceptions, commit log size and pending tasks, key-cache hit rate, a cluster member count from the failure detector, and a small number of garbage-collection counters. A separate cassandra_nodetool integration can add nodetool status-style node state and ownership gauges.

This is a competent default for a general observability platform. It does not need to be dismissed to explain where it stops. The useful operational question is what you can see after an alert has fired, and what you still need to collect or investigate elsewhere.

Datadog Metric Gaps

The tables below distinguish between metrics that are absent from the shipped configuration, areas where only part of the relevant data is collected, and the smaller set that is adequately covered for the stated question. The metric names are Cassandra JMX names, not proposed Datadog dashboard names.

Repair, hints, streaming, and read repair

Operational questionDefault statusCassandra metrics not collected by default
Is data repaired, pending repair, or unrepaired?AbsentTable PercentRepaired, BytesRepaired, BytesUnrepaired, BytesPendingRepair
Are repair jobs progressing or failing?AbsentRepairJobsStarted, RepairJobsCompleted, RepairTime, RepairPrepareTime, RepairSyncTime, ValidationTime, AnticompactionTime, BytesValidated, PartitionsValidated; Storage:RepairExceptions; Repair retry and preview-failure metrics
Are hints accumulating or being delivered?AbsentStorage:TotalHints, Storage:TotalHintsInProgress; HintsService:HintsSucceeded, HintsFailed, HintsTimedOut, and delay metrics
Is bootstrap, rebuild, decommission, or repair streaming underway?AbsentStreaming:IncomingBytes, OutgoingBytes per peer; TotalIncomingBytes, TotalOutgoingBytes, TotalOutgoingRepairBytes, IncomingProcessTime
Are repair-side thread pools saturated?AbsentAntiEntropyStage, ValidationExecutor, CompactionExecutor, Repair-Task, RepairJobTask, StreamReceiveTask, PaxosRepairStage
Is read repair firing or timing out?AbsentReadRepair:Attempted, RepairedBlocking, RepairedBackground, RepairTimedOut, SpeculatedRead, SpeculatedWrite; table read-repair request and inconsistency metrics

Request outcomes and latency detail

Operational questionDefault statusCassandra metrics not collected by default
Are requests failing or unavailable?AbsentClientRequest:Failures, Unavailables across all scopes; Cassandra 5.0 TombstoneAborts and ReadSizeAborts
Which consistency level is degraded?AbsentClientRequest read and write scopes per consistency level, including LOCAL_QUORUM, EACH_QUORUM, and ONE
Is coordinator latency different from replica-local latency?AbsentTable CoordinatorReadLatency, CoordinatorWriteLatency, CoordinatorScanLatency
Is the tail moving beyond p99?PartialMax, 999thPercentile, Mean, and total-latency counters; p99 is collected only for table read and write latency
Is LWT contention increasing?PartialContentionHistogram, ConditionNotMet, UnfinishedCommit, UnknownResult, and Paxos:LinearizabilityViolations
Are materialized-view writes healthy?PartialViewReplicasAttempted, ViewReplicasSuccess, ViewPendingMutations, and view write timeout and failure metrics
Are local read and write request rates available?CoveredOneMinuteRate is collected from the relevant latency MBeans

Compaction, cache, memtable, and commit log detail

Operational questionDefault statusCassandra metrics not collected by default
Is compaction keeping up?PartialCompaction:PendingTasks, PendingTasksByTableName, CompletedTasks, TotalCompactionsCompleted, BytesCompacted, CompactionsAborted, CompactionsReduced, SSTablesDroppedFromCompaction; the compaction executor pool
Is the chunk cache helping the read path?AbsentCache scoped to ChunkCache: Hits, Misses, Requests, HitRate, Capacity, Size, Entries, MissLatency
Are key, row, and counter caches correctly sized?PartialCache capacity, size, entries, requests, and 1/5/15-minute hit rates; the complete CounterCache family
Is memtable pressure building?PartialMemtableOnHeapDataSize, MemtableOffHeapDataSize, MemtableLiveDataSize, MemtableSwitchCount, MemtableColumnsCount, AllMemtables*; MemtablePool:BlockedOnAllocation, PendingFlushTasks
Is the commit log causing stalls?PartialWaitingOnCommit, WaitingOnSegmentAllocation, CompletedTasks, OverSizedMutations
Do SSTable shape and compaction state point to a problem?PartialEstimatedPartitionCount, UnleveledSSTables, MinPartitionSize, OldVersionSSTableCount, MaxSSTableSize, MaxSSTableDuration, EstimatedPartitionSizeHistogram, SSTableCountPerLevel
Is off-heap usage rising through filters and indexes?PartialBloomFilterFalsePositives, BloomFilterDiskSpaceUsed, BloomFilterOffHeapMemoryUsed, IndexSummaryOffHeapMemoryUsed, CompressionMetadataOffHeapMemoryUsed
Is speculative retry doing useful work or adding load?AbsentTable SpeculativeRetries, SpeculativeFailedRetries, SpeculativeInsufficientReplicas, AdditionalWrites
Is direct-memory or networking buffer pressure visible?AbsentBufferPool size, used size, capacity, hits, misses, and overflow size for chunk-cache and networking pools

Internode communication

Operational questionDefault statusCassandra metrics not collected by default
Are internode queues backing up, and towards which peer?AbsentPer-peer Connection metrics for large, small, and urgent message pending tasks and bytes, completed tasks and bytes, drops due to timeout, overload, and error, plus timeouts
Is inbound messaging seeing corruption, throttling, or expiry?AbsentInboundConnection:CorruptFramesRecovered, CorruptFramesUnrecovered, ErrorBytes, ErrorCount, ExpiredBytes, ExpiredCount, ThrottledCount, ThrottledNanos, ProcessedBytes, ScheduledBytes
Is cross-node or cross-datacentre latency increasing?AbsentMessaging:CrossNodeLatency, per-datacentre latency, and per-verb wait latency
What caused dropped messages?PartialDrop Count, internal and cross-node dropped latency; the default keeps only the one-minute rate
Is gossip healthy beyond up/down member counts?PartialFailure-detector phi values and simple states, Gossiper state, and the GossipStage pool
Is the dynamic snitch penalising replicas?AbsentDynamicEndpointSnitch:Scores and Severity

Client, CQL, and workload behaviour

Operational questionDefault statusCassandra metrics not collected by default
How many native clients are connected, and under which protocol or user?AbsentClient:connectedNativeClients, connectedNativeClientsByUser, clientsByProtocolVersion, connections
Are authentication failures or protocol errors increasing?AbsentClient:AuthSuccess, AuthFailure, ProtocolException, UnknownException
Is native transport saturated or shedding requests?AbsentTransport ThreadPools metrics for Native-Transport-Requests; Client:PausedConnections, RequestDiscarded, TimedOutBeforeProcessing, Queued
Is the prepared-statement cache thrashing?AbsentCQL:PreparedStatementsCount, PreparedStatementsEvicted, PreparedStatementsExecuted, RegularStatementsExecuted, PreparedStatementsRatio
What is the client request and response volume?AbsentClientMessageSize bytes sent and received; ClientRequestSize rows and columns read and written
Are oversized batches appearing?AbsentBatch:PartitionsPerLoggedBatch, PartitionsPerUnloggedBatch, PartitionsPerCounterBatch
Are query guardrails warning or aborting work?PartialTombstone, read-size, row-index-size, and live-scanned warning and abort metrics; the default has tombstone-scan percentiles only

JVM and node state

Operational questionDefault statusDetail
Are heap, file descriptors, and thread counts available?CoveredDatadog collects standard JVM memory, file-descriptor, thread, and buffer metrics
Is G1 major-GC activity reported correctly?Requires verificationThe configuration names G1 Mixed Generation; standard HotSpot exposes G1 Old Generation, so test the reported counter on the JVM in use
Can pause distribution, allocation rate, or safepoint time be diagnosed?AbsentThe default has cumulative GC count and time, not per-pause duration, allocation rate, promotion, evacuation failure, or safepoint data
Are keyspace-level Cassandra rollups available?AbsentThe Keyspace metric family, including WriteFailedIdealCL and IdealCLWriteLatency
Can system keyspace and node lifecycle state be inspected?AbsentSystem keyspaces are excluded from table collection; StorageService operation mode, bootstrap state, joining/leaving/moving nodes, schema-version state, and related data are not collected
Are Storage-Attached Indexes visible in Cassandra 5.0?AbsentStorageAttachedIndex query timeouts, builds in progress, disk usage, query latency, and memtable index flush errors
Are host CPU, disk, and network available?CoveredDatadog host metrics provide this independently of the Cassandra metric mapping

Missing Anti-Entropy Metrics

The repair, hints, streaming, and read-repair rows above are the most consequential omissions. The default check does not collect any of those families.

These are not edge cases. A Cassandra cluster can continue serving traffic while hints grow, a repair falls behind, or streaming work changes the I/O and network profile of a node. Local read latency and disk usage alone do not explain that state.

Repair also needs more than a chart of counters. Scheduling, completion history, range selection, failures, and the relationship between repair and cluster load are operational state rather than a small group of JMX metrics. A generic metric collector does not provide that workflow by itself, even when its JMX configuration has been expanded.

Request Failure and Unavailable Metrics

Datadog collects Timeouts for the read and write ClientRequest scopes. It does not collect Failures or Unavailables by default.

That distinction changes how an incident is understood. A timeout indicates that the coordinator did not receive the required responses before the deadline. An unavailable exception tells you that the coordinator could already see that the consistency level could not be met. A failure can point to replica-side errors, overloaded resources, or request processing problems. An application team experiences all three as failed work, but the next diagnostic step is different for each one.

The default configuration also does not break request outcomes down by consistency level. If LOCAL_QUORUM requests are failing in one datacentre while ONE requests continue to work, a cluster-wide latency or timeout view will not show that split. Cassandra exposes the relevant scopes over JMX; they need deliberate selection and tagging before they become useful in Datadog.

There is a related limitation in the latency data. Table read and write metrics include p75, p95, and p99, while many of the other latency families stop at p75 and p95. The shipped check does not request maximum latency, p99.9, total-latency counters, or a full coordinator-versus-replica view. That is enough for a broad health view, but it leaves less evidence when a small group of requests is driving the complaint.

Missing Latency Metrics

When an alert says read latency has moved, the useful question is which part of the database changed at the same time. These are the four diagnostic paths an operator normally needs to compare.

Diagnostic pathMetrics to compareDefault coverage
CompactionQueue depth, completed tasks, bytes compacted, aborted work, and the compaction executor show whether the storage engine is falling behind.Partial: per-table pending compactions and bytes written only
Write pathMemtable memory, allocation blocking, commit-log waits, segment allocation, and oversized mutations separate a full write path from a slow coordinator.Partial: pending flushes and total commit-log size only
Read pathChunk-cache activity, filter effectiveness, index-summary memory, and compression metadata help explain why reads are now doing more work.Partial: key-cache hit rate and selected table metrics only
Replica pathPer-peer queues, message timeouts, cross-node latency, and replica-local metrics test whether the coordinator is waiting elsewhere.Absent: not collected

None of these signals proves a root cause on its own. Together, they let an operator test the most likely Cassandra explanations while the event is still occurring, rather than switching between ad hoc JMX queries, nodetool, logs, and guesswork.

Missing Internode and Client Metrics

The default check has one dropped-message rate by verb. It does not provide enough detail to identify where traffic is queuing, whether a peer is overloaded, or whether a client workload is producing the pressure.

Diagnostic pathMetrics to compareDefault coverage
Peer queuesLarge, small, and urgent connection queues, bytes in flight, and drops by timeout, overload, or error identify the affected peer.Absent: not collected
Network transitCross-node, per-datacentre, and per-verb wait latency separates a local processing issue from an internode path problem.Absent: not collected
Native transportConnection counts, authentication failures, protocol errors, transport queues, discarded requests, and pre-processing timeouts describe client pressure.Absent: not collected
CQL behaviourPrepared-statement evictions, executions, ratios, batch-size histograms, guardrail warnings, and SAI metrics expose query patterns that a basic dashboard cannot.Absent: not collected

For Cassandra 5.0 users, the same gap includes Storage-Attached Index build progress, query timeouts, disk usage, and flush errors. Tombstone-scan percentiles are included, while warnings and aborts for tombstones, read size, row-index size, and related query controls are not.

Datadog Metric Limit

Datadog documents a standard ceiling of 350 metrics per instance for its Cassandra integration, with support engagement required for a higher limit.

The table metrics in Cassandra are multiplied by keyspace and table. Per-peer connection and streaming metrics multiply by node. Consistency-level request metrics multiply again. Cassandra 5.0 exposes more than 115 metric names per table before choosing attributes and dimensions. A cluster with dozens of tables can use the available budget quickly if every percentile, cache metric, thread pool, and request scope is included.

Adding everything also creates an operational cost: more cardinality to manage, more dashboards and alert rules to maintain, and potentially more custom-metric cost. The answer is not to leave the defaults untouched; it is to select metrics around the failure modes that are relevant to the cluster.

A practical first configuration tranche is usually made of low-cardinality, cluster-level signals:

jmx_metrics:
  # Error outcomes in addition to latency and timeouts
  - include:
      domain: org.apache.cassandra.metrics
      type: ClientRequest
      name: [Failures, Unavailables]
      attribute: [Count, OneMinuteRate]

  # Hints and compaction backlog
  - include:
      domain: org.apache.cassandra.metrics
      type: Storage
      name: [TotalHints, TotalHintsInProgress]
  - include:
      domain: org.apache.cassandra.metrics
      type: Compaction
      name: [PendingTasks, CompletedTasks, BytesCompacted]

  # Streaming and native transport pressure
  - include:
      domain: org.apache.cassandra.metrics
      type: Streaming
      name: [TotalIncomingBytes, TotalOutgoingBytes]
      attribute: [Count]
  - include:
      domain: org.apache.cassandra.metrics
      type: ThreadPools
      path: transport
      name: [ActiveTasks, PendingTasks, CurrentlyBlockedTasks]

Treat that as a starting point to validate against your Cassandra and Agent versions, not a configuration to copy blindly. Review the resulting metric count and tags before rolling it across every node. The next tier, including per-table repair state, per-peer connection queues, and consistency-level request data, needs a hard budget and an explicit decision about how those metrics will be used.

There is also one small JVM detail worth checking in a live environment. Datadog’s current configuration names G1 Mixed Generation as a major collector. Standard HotSpot exposes G1 collectors as G1 Young Generation and G1 Old Generation; if the collector name does not match the JVM, the reported major-GC counter will not be populated. Test the metric on the Java build running Cassandra rather than assuming the dashboard is correct.

AxonOps Cassandra Monitoring

Datadog’s default Cassandra integration can show that reads or writes are slow, or that a node is filling its disks. From that data alone, it cannot reliably distinguish compaction pressure, memtable or commit-log stalls, repair or streaming activity, peer queue buildup, unavailable errors, consistency-level degradation, or native-transport pressure. The diagnosis has to be completed elsewhere with JMX queries, nodetool, logs, and local scripts.

Someone then has to choose the additional MBeans, stay within the metric ceiling, decide which dimensions are worth collecting, define tags, build dashboards, write alerts, connect them to runbooks, and keep the configuration aligned with Cassandra releases and changing workloads.

AxonOps starts with the Cassandra operating questions in this article. It can collect tens of thousands of Cassandra metrics from each node, alongside repair progress and history, backup status, service checks, logs, configuration, nodetool activity, and Cassandra-specific alerts. The dashboards are organised around the database state being investigated: repair, compaction, request path, table, node, or backup. The volume of collected data does not become one generic dashboard for an operator to work through.

AxonOps AI is trained using Cassandra source code, Cassandra documentation, and Cassandra operational best practices. It can assess the metrics alongside logs, events, configuration, and operational history. That lets an engineer examine a latency change, failed request, repair concern, or cluster-health issue with the related Cassandra context available together, rather than trying to reconstruct it across separate tools.

See Apache Cassandra Monitoring for the AxonOps monitoring model. For the wider product comparison, see Cassandra Monitoring Tools Comparison 2026.

Sources

  1. Datadog Cassandra integration default metric configuration
  2. Datadog Cassandra integration metric catalogue
  3. Datadog Cassandra integration documentation
  4. Datadog Cassandra nodetool integration documentation
  5. Apache Cassandra metrics reference
  6. Apache Cassandra 5.0 metrics source