Adopt asynchronous helpers in Cassandra target script (#21)
This commit is contained in:
parent
4449284563
commit
66f487eb1e
|
|
@ -28,7 +28,7 @@ otel.jmx.password = my-password
|
||||||
def storageLoadMBean = otel.mbean("org.apache.cassandra.metrics:type=Storage,name=Load")
|
def storageLoadMBean = otel.mbean("org.apache.cassandra.metrics:type=Storage,name=Load")
|
||||||
otel.instrument(storageLoadMBean, "cassandra.storage.load",
|
otel.instrument(storageLoadMBean, "cassandra.storage.load",
|
||||||
"Size, in bytes, of the on disk data size this node manages",
|
"Size, in bytes, of the on disk data size this node manages",
|
||||||
"By", "Count", otel.&longValueRecorder
|
"By", "Count", otel.&longValueObserver
|
||||||
)
|
)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,118 +10,118 @@ These metrics are sourced from Cassandra's exposed Dropwizard Metrics for each n
|
||||||
* Name: `cassandra.client.request.range_slice.latency.50p`
|
* Name: `cassandra.client.request.range_slice.latency.50p`
|
||||||
* Description: Token range read request latency - 50th percentile
|
* Description: Token range read request latency - 50th percentile
|
||||||
* Unit: `µs`
|
* Unit: `µs`
|
||||||
* Instrument Type: DoubleUpDownCounter
|
* Instrument Type: DoubleValueObserver
|
||||||
|
|
||||||
* Name: `cassandra.client.request.range_slice.latency.99p`
|
* Name: `cassandra.client.request.range_slice.latency.99p`
|
||||||
* Description: Token range read request latency - 99th percentile
|
* Description: Token range read request latency - 99th percentile
|
||||||
* Unit: `µs`
|
* Unit: `µs`
|
||||||
* Instrument Type: DoubleUpDownCounter
|
* Instrument Type: DoubleValueObserver
|
||||||
|
|
||||||
* Name: `cassandra.client.request.range_slice.latency.count`
|
* Name: `cassandra.client.request.range_slice.latency.count`
|
||||||
* Description: Total token range read request latency
|
* Description: Total token range read request latency
|
||||||
* Unit: `µs`
|
* Unit: `µs`
|
||||||
* Instrument Type: LongCounter
|
* Instrument Type: LongSumObserver
|
||||||
|
|
||||||
* Name: `cassandra.client.request.range_slice.latency.max`
|
* Name: `cassandra.client.request.range_slice.latency.max`
|
||||||
* Description: Maximum token range read request latency
|
* Description: Maximum token range read request latency
|
||||||
* Unit: `µs`
|
* Unit: `µs`
|
||||||
* Instrument Type: DoubleUpDownCounter
|
* Instrument Type: DoubleValueObserver
|
||||||
|
|
||||||
* Name: `cassandra.client.request.range_slice.timeout.count`
|
* Name: `cassandra.client.request.range_slice.timeout.count`
|
||||||
* Description: Number of token range read request timeouts encountered
|
* Description: Number of token range read request timeouts encountered
|
||||||
* Unit: `1`
|
* Unit: `1`
|
||||||
* Instrument Type: LongCounter
|
* Instrument Type: LongSumObserver
|
||||||
|
|
||||||
* Name: `cassandra.client.request.range_slice.unavailable.count`
|
* Name: `cassandra.client.request.range_slice.unavailable.count`
|
||||||
* Description: Number of token range read request unavailable exceptions encountered
|
* Description: Number of token range read request unavailable exceptions encountered
|
||||||
* Unit: `1`
|
* Unit: `1`
|
||||||
* Instrument Type: LongCounter
|
* Instrument Type: LongSumObserver
|
||||||
|
|
||||||
* Name: `cassandra.client.request.read.latency.50p`
|
* Name: `cassandra.client.request.read.latency.50p`
|
||||||
* Description: Standard read request latency - 50th percentile
|
* Description: Standard read request latency - 50th percentile
|
||||||
* Unit: `µs`
|
* Unit: `µs`
|
||||||
* Instrument Type: DoubleUpDownCounter
|
* Instrument Type: DoubleValueObserver
|
||||||
|
|
||||||
* Name: `cassandra.client.request.read.latency.99p`
|
* Name: `cassandra.client.request.read.latency.99p`
|
||||||
* Description: Standard read request latency - 99th percentile
|
* Description: Standard read request latency - 99th percentile
|
||||||
* Unit: `µs`
|
* Unit: `µs`
|
||||||
* Instrument Type: DoubleUpDownCounter
|
* Instrument Type: DoubleValueObserver
|
||||||
|
|
||||||
* Name: `cassandra.client.request.read.latency.count`
|
* Name: `cassandra.client.request.read.latency.count`
|
||||||
* Description: Total standard read request latency
|
* Description: Total standard read request latency
|
||||||
* Unit: `µs`
|
* Unit: `µs`
|
||||||
* Instrument Type: LongCounter
|
* Instrument Type: LongSumObserver
|
||||||
|
|
||||||
* Name: `cassandra.client.request.read.latency.max`
|
* Name: `cassandra.client.request.read.latency.max`
|
||||||
* Description: Maximum standard read request latency
|
* Description: Maximum standard read request latency
|
||||||
* Unit: `µs`
|
* Unit: `µs`
|
||||||
* Instrument Type: DoubleUpDownCounter
|
* Instrument Type: DoubleValueObserver
|
||||||
|
|
||||||
* Name: `cassandra.client.request.read.timeout.count`
|
* Name: `cassandra.client.request.read.timeout.count`
|
||||||
* Description: Number of standard read request timeouts encountered
|
* Description: Number of standard read request timeouts encountered
|
||||||
* Unit: `1`
|
* Unit: `1`
|
||||||
* Instrument Type: LongCounter
|
* Instrument Type: LongSumObserver
|
||||||
|
|
||||||
* Name: `cassandra.client.request.read.unavailable.count`
|
* Name: `cassandra.client.request.read.unavailable.count`
|
||||||
* Description: Number of standard read request unavailable exceptions encountered
|
* Description: Number of standard read request unavailable exceptions encountered
|
||||||
* Unit: `1`
|
* Unit: `1`
|
||||||
* Instrument Type: LongCounter
|
* Instrument Type: LongSumObserver
|
||||||
|
|
||||||
* Name: `cassandra.client.request.write.latency.50p`
|
* Name: `cassandra.client.request.write.latency.50p`
|
||||||
* Description: Regular write request latency - 50th percentile
|
* Description: Regular write request latency - 50th percentile
|
||||||
* Unit: `µs`
|
* Unit: `µs`
|
||||||
* Instrument Type: DoubleUpDownCounter
|
* Instrument Type: DoubleValueObserver
|
||||||
|
|
||||||
* Name: `cassandra.client.request.write.latency.99p`
|
* Name: `cassandra.client.request.write.latency.99p`
|
||||||
* Description: Regular write request latency - 99th percentile
|
* Description: Regular write request latency - 99th percentile
|
||||||
* Unit: `µs`
|
* Unit: `µs`
|
||||||
* Instrument Type: DoubleUpDownCounter
|
* Instrument Type: DoubleValueObserver
|
||||||
|
|
||||||
* Name: `cassandra.client.request.write.latency.count`
|
* Name: `cassandra.client.request.write.latency.count`
|
||||||
* Description: Total regular write request latency
|
* Description: Total regular write request latency
|
||||||
* Unit: `µs`
|
* Unit: `µs`
|
||||||
* Instrument Type: LongCounter
|
* Instrument Type: LongSumObserver
|
||||||
|
|
||||||
* Name: `cassandra.client.request.write.latency.max`
|
* Name: `cassandra.client.request.write.latency.max`
|
||||||
* Description: Maximum regular write request latency
|
* Description: Maximum regular write request latency
|
||||||
* Unit: `µs`
|
* Unit: `µs`
|
||||||
* Instrument Type: DoubleUpDownCounter
|
* Instrument Type: DoubleValueObserver
|
||||||
|
|
||||||
* Name: `cassandra.client.request.write.timeout.count`
|
* Name: `cassandra.client.request.write.timeout.count`
|
||||||
* Description: Number of regular write request timeouts encountered
|
* Description: Number of regular write request timeouts encountered
|
||||||
* Unit: `1`
|
* Unit: `1`
|
||||||
* Instrument Type: LongCounter
|
* Instrument Type: LongSumObserver
|
||||||
|
|
||||||
* Name: `cassandra.client.request.write.unavailable.count`
|
* Name: `cassandra.client.request.write.unavailable.count`
|
||||||
* Description: Number of regular write request unavailable exceptions encountered
|
* Description: Number of regular write request unavailable exceptions encountered
|
||||||
* Unit: `1`
|
* Unit: `1`
|
||||||
* Instrument Type: LongCounter
|
* Instrument Type: LongSumObserver
|
||||||
|
|
||||||
### Compaction Metrics
|
### Compaction Metrics
|
||||||
|
|
||||||
* Name: `cassandra.compaction.tasks.completed`
|
* Name: `cassandra.compaction.tasks.completed`
|
||||||
* Description: Number of completed compactions since server [re]start
|
* Description: Number of completed compactions since server [re]start
|
||||||
* Unit: `1`
|
* Unit: `1`
|
||||||
* Instrument Type: LongCounter
|
* Instrument Type: LongSumObserver
|
||||||
|
|
||||||
* Name: `cassandra.compaction.tasks.pending`
|
* Name: `cassandra.compaction.tasks.pending`
|
||||||
* Description: Estimated number of compactions remaining to perform
|
* Description: Estimated number of compactions remaining to perform
|
||||||
* Unit: `1`
|
* Unit: `1`
|
||||||
* Instrument Type: LongUpDownCounter
|
* Instrument Type: LongValueObserver
|
||||||
|
|
||||||
### Storage Metrics
|
### Storage Metrics
|
||||||
|
|
||||||
* Name: `cassandra.storage.load.count`
|
* Name: `cassandra.storage.load.count`
|
||||||
* Description: Size of the on disk data size this node manages
|
* Description: Size of the on disk data size this node manages
|
||||||
* Unit: `by`
|
* Unit: `by`
|
||||||
* Instrument Type: LongUpDownCounter
|
* Instrument Type: LongValueObserver
|
||||||
|
|
||||||
* Name: `cassandra.storage.total_hints.count`
|
* Name: `cassandra.storage.total_hints.count`
|
||||||
* Description: Number of hint messages written to this node since [re]start
|
* Description: Number of hint messages written to this node since [re]start
|
||||||
* Unit: `1`
|
* Unit: `1`
|
||||||
* Instrument Type: LongCounter
|
* Instrument Type: LongSumObserver
|
||||||
|
|
||||||
* Name: `cassandra.storage.total_hints.in_progress.count`
|
* Name: `cassandra.storage.total_hints.in_progress.count`
|
||||||
* Description: Number of hints attempting to be sent currently
|
* Description: Number of hints attempting to be sent currently
|
||||||
* Unit: `1`
|
* Unit: `1`
|
||||||
* Instrument Type: LongUpDownCounter
|
* Instrument Type: LongValueObserver
|
||||||
|
|
|
||||||
|
|
@ -14,271 +14,138 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
class CassandraMBean {
|
|
||||||
// Necessary to have script-bound `otel` and `log` in class scope
|
|
||||||
protected Binding sb
|
|
||||||
protected GroovyMBean mbean
|
|
||||||
|
|
||||||
private String objectName
|
|
||||||
|
|
||||||
CassandraMBean(Binding scriptBinding, objectName) {
|
|
||||||
sb = scriptBinding
|
|
||||||
this.objectName = objectName
|
|
||||||
}
|
|
||||||
|
|
||||||
def fetch() {
|
|
||||||
def mbeans = sb.otel.queryJmx(objectName)
|
|
||||||
if (mbeans.size() == 0) {
|
|
||||||
sb.log.warning("CassandraMBean.fetch(): Failed to fetch MBean ${objectName}.")
|
|
||||||
} else {
|
|
||||||
sb.log.fine("CassandraMBean.fetch(): Fetched ${mbeans.size()} MBeans - ${mbeans}")
|
|
||||||
mbean = mbeans.first()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def getAttribute(String attribute) {
|
|
||||||
if (mbean == null) {
|
|
||||||
return null
|
|
||||||
}
|
|
||||||
return mbean.getProperty(attribute)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
class CassandraMetric {
|
|
||||||
private CassandraMBean cassandraMBean
|
|
||||||
private Binding sb
|
|
||||||
private String instrumentName
|
|
||||||
private String description
|
|
||||||
private String unit
|
|
||||||
private String attribute
|
|
||||||
private Closure instrument
|
|
||||||
|
|
||||||
CassandraMetric(CassandraMBean cassandraMBean, String instrumentName, String description, String unit, String attribute, Closure instrument) {
|
|
||||||
this.cassandraMBean = cassandraMBean
|
|
||||||
this.sb = cassandraMBean.sb
|
|
||||||
this.instrumentName = instrumentName
|
|
||||||
this.description = description
|
|
||||||
this.unit = unit
|
|
||||||
this.attribute = attribute
|
|
||||||
this.instrument = instrument
|
|
||||||
}
|
|
||||||
|
|
||||||
def update() {
|
|
||||||
def value = cassandraMBean.getAttribute(attribute)
|
|
||||||
if (value == null) {
|
|
||||||
sb.log.warning("No valid value for ${instrumentName} - ${cassandraMBean}.${attribute}" as String)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
def inst = instrument(instrumentName, description, unit)
|
|
||||||
sb.log.fine("Recording ${instrumentName} - ${inst} w/ ${value}")
|
|
||||||
inst.add(value)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
def cassandraMetrics = "org.apache.cassandra.metrics"
|
def cassandraMetrics = "org.apache.cassandra.metrics"
|
||||||
|
|
||||||
def clientRequest = "${cassandraMetrics}:type=ClientRequest"
|
def clientRequest = "${cassandraMetrics}:type=ClientRequest"
|
||||||
def clientRequestRangeSlice = "${clientRequest},scope=RangeSlice"
|
def clientRequestRangeSlice = "${clientRequest},scope=RangeSlice"
|
||||||
def clientRequestRead = "${clientRequest},scope=Read"
|
def clientRequestRangeSliceLatency = otel.mbean("${clientRequestRangeSlice},name=Latency")
|
||||||
def clientRequestWrite = "${clientRequest},scope=Write"
|
otel.instrument(clientRequestRangeSliceLatency,
|
||||||
def compaction = "${cassandraMetrics}:type=Compaction"
|
|
||||||
def storage = "${cassandraMetrics}:type=Storage"
|
|
||||||
|
|
||||||
def clientRequestRangeSliceLatency = new CassandraMBean(binding, "${clientRequestRangeSlice},name=Latency")
|
|
||||||
def clientRequestRangeSliceTimeouts = new CassandraMBean(binding, "${clientRequestRangeSlice},name=Timeouts")
|
|
||||||
def clientRequestRangeSliceUnavailables = new CassandraMBean(binding, "${clientRequestRangeSlice},name=Unavailables")
|
|
||||||
def clientRequestReadLatency = new CassandraMBean(binding, "${clientRequestRead},name=Latency")
|
|
||||||
def clientRequestReadTimeouts = new CassandraMBean(binding, "${clientRequestRead},name=Timeouts")
|
|
||||||
def clientRequestReadUnavailables = new CassandraMBean(binding, "${clientRequestRead},name=Unavailables")
|
|
||||||
def clientRequestWriteLatency = new CassandraMBean(binding, "${clientRequestWrite},name=Latency")
|
|
||||||
def clientRequestWriteTimeouts = new CassandraMBean(binding, "${clientRequestWrite},name=Timeouts")
|
|
||||||
def clientRequestWriteUnavailables = new CassandraMBean(binding, "${clientRequestWrite},name=Unavailables")
|
|
||||||
def compactionCompletedTasks = new CassandraMBean(binding, "${compaction},name=CompletedTasks")
|
|
||||||
def compactionPendingTasks = new CassandraMBean(binding, "${compaction},name=PendingTasks")
|
|
||||||
def storageLoad = new CassandraMBean(binding, "${storage},name=Load")
|
|
||||||
def storageTotalHints = new CassandraMBean(binding, "${storage},name=TotalHints")
|
|
||||||
def storageTotalHintsInProgress = new CassandraMBean(binding, "${storage},name=TotalHintsInProgress")
|
|
||||||
|
|
||||||
def clientRequestRangeSliceLatency50p = new CassandraMetric(
|
|
||||||
clientRequestRangeSliceLatency,
|
|
||||||
"cassandra.client.request.range_slice.latency.50p",
|
"cassandra.client.request.range_slice.latency.50p",
|
||||||
"Token range read request latency - 50th percentile", "µs", "50thPercentile",
|
"Token range read request latency - 50th percentile", "µs", "50thPercentile",
|
||||||
otel.&doubleUpDownCounter)
|
otel.&doubleValueObserver)
|
||||||
|
|
||||||
def clientRequestRangeSliceLatency99p = new CassandraMetric(
|
otel.instrument(clientRequestRangeSliceLatency,
|
||||||
clientRequestRangeSliceLatency,
|
|
||||||
"cassandra.client.request.range_slice.latency.99p",
|
"cassandra.client.request.range_slice.latency.99p",
|
||||||
"Token range read request latency - 99th percentile", "µs", "99thPercentile",
|
"Token range read request latency - 99th percentile", "µs", "99thPercentile",
|
||||||
otel.&doubleUpDownCounter)
|
otel.&doubleValueObserver)
|
||||||
|
|
||||||
def clientRequestRangeSliceLatencyCount = new CassandraMetric(
|
otel.instrument(clientRequestRangeSliceLatency,
|
||||||
clientRequestRangeSliceLatency,
|
|
||||||
"cassandra.client.request.range_slice.latency.count",
|
"cassandra.client.request.range_slice.latency.count",
|
||||||
"Total token range read request latency", "µs", "Count",
|
"Total token range read request latency", "µs", "Count",
|
||||||
otel.&longCounter)
|
otel.&longSumObserver)
|
||||||
|
|
||||||
def clientRequestRangeSliceLatencyMax = new CassandraMetric(
|
otel.instrument(clientRequestRangeSliceLatency,
|
||||||
clientRequestRangeSliceLatency,
|
|
||||||
"cassandra.client.request.range_slice.latency.max",
|
"cassandra.client.request.range_slice.latency.max",
|
||||||
"Maximum token range read request latency", "µs", "Max",
|
"Maximum token range read request latency", "µs", "Max",
|
||||||
otel.&doubleUpDownCounter)
|
otel.&doubleValueObserver)
|
||||||
|
|
||||||
def clientRequestRangeSliceTimeoutCount = new CassandraMetric(
|
def clientRequestRangeSliceTimeouts = otel.mbean("${clientRequestRangeSlice},name=Timeouts")
|
||||||
clientRequestRangeSliceTimeouts,
|
otel.instrument(clientRequestRangeSliceTimeouts,
|
||||||
"cassandra.client.request.range_slice.timeout.count",
|
"cassandra.client.request.range_slice.timeout.count",
|
||||||
"Number of token range read request timeouts encountered", "1", "Count",
|
"Number of token range read request timeouts encountered", "1", "Count",
|
||||||
otel.&longCounter)
|
otel.&longSumObserver)
|
||||||
|
|
||||||
def clientRequestRangeSliceUnavailableCount = new CassandraMetric(
|
def clientRequestRangeSliceUnavailables = otel.mbean("${clientRequestRangeSlice},name=Unavailables")
|
||||||
clientRequestRangeSliceUnavailables,
|
otel.instrument(clientRequestRangeSliceUnavailables,
|
||||||
"cassandra.client.request.range_slice.unavailable.count",
|
"cassandra.client.request.range_slice.unavailable.count",
|
||||||
"Number of token range read request unavailable exceptions encountered", "1", "Count",
|
"Number of token range read request unavailable exceptions encountered", "1", "Count",
|
||||||
otel.&longCounter)
|
otel.&longSumObserver)
|
||||||
|
|
||||||
def clientRequestReadLatency50p = new CassandraMetric(clientRequestReadLatency,
|
def clientRequestRead = "${clientRequest},scope=Read"
|
||||||
|
def clientRequestReadLatency = otel.mbean("${clientRequestRead},name=Latency")
|
||||||
|
otel.instrument(clientRequestReadLatency,
|
||||||
"cassandra.client.request.read.latency.50p",
|
"cassandra.client.request.read.latency.50p",
|
||||||
"Standard read request latency - 50th percentile", "µs", "50thPercentile",
|
"Standard read request latency - 50th percentile", "µs", "50thPercentile",
|
||||||
otel.&doubleUpDownCounter)
|
otel.&doubleValueObserver)
|
||||||
|
|
||||||
def clientRequestReadLatency99p = new CassandraMetric(
|
otel.instrument(clientRequestReadLatency,
|
||||||
clientRequestReadLatency,
|
|
||||||
"cassandra.client.request.read.latency.99p",
|
"cassandra.client.request.read.latency.99p",
|
||||||
"Standard read request latency - 99th percentile", "µs", "99thPercentile",
|
"Standard read request latency - 99th percentile", "µs", "99thPercentile",
|
||||||
otel.&doubleUpDownCounter)
|
otel.&doubleValueObserver)
|
||||||
|
|
||||||
def clientRequestReadLatencyCount = new CassandraMetric(
|
otel.instrument(clientRequestReadLatency,
|
||||||
clientRequestReadLatency,
|
|
||||||
"cassandra.client.request.read.latency.count",
|
"cassandra.client.request.read.latency.count",
|
||||||
"Total standard read request latency", "µs", "Count",
|
"Total standard read request latency", "µs", "Count",
|
||||||
otel.&longCounter)
|
otel.&longSumObserver)
|
||||||
|
|
||||||
def clientRequestReadLatencyMax = new CassandraMetric(
|
otel.instrument(clientRequestReadLatency,
|
||||||
clientRequestReadLatency,
|
|
||||||
"cassandra.client.request.read.latency.max",
|
"cassandra.client.request.read.latency.max",
|
||||||
"Maximum standard read request latency", "µs", "Max",
|
"Maximum standard read request latency", "µs", "Max",
|
||||||
otel.&doubleUpDownCounter)
|
otel.&doubleValueObserver)
|
||||||
|
|
||||||
def clientRequestReadTimeoutCount = new CassandraMetric(
|
def clientRequestReadTimeouts = otel.mbean("${clientRequestRead},name=Timeouts")
|
||||||
clientRequestReadTimeouts,
|
otel.instrument(clientRequestReadTimeouts,
|
||||||
"cassandra.client.request.read.timeout.count",
|
"cassandra.client.request.read.timeout.count",
|
||||||
"Number of standard read request timeouts encountered", "1", "Count",
|
"Number of standard read request timeouts encountered", "1", "Count",
|
||||||
otel.&longCounter)
|
otel.&longSumObserver)
|
||||||
|
|
||||||
def clientRequestReadUnavailableCount = new CassandraMetric(
|
def clientRequestReadUnavailables = otel.mbean("${clientRequestRead},name=Unavailables")
|
||||||
clientRequestReadUnavailables,
|
otel.instrument(clientRequestReadUnavailables,
|
||||||
"cassandra.client.request.read.unavailable.count",
|
"cassandra.client.request.read.unavailable.count",
|
||||||
"Number of standard read request unavailable exceptions encountered", "1", "Count",
|
"Number of standard read request unavailable exceptions encountered", "1", "Count",
|
||||||
otel.&longCounter)
|
otel.&longSumObserver)
|
||||||
|
|
||||||
def clientRequestWriteLatency50p = new CassandraMetric(
|
def clientRequestWrite = "${clientRequest},scope=Write"
|
||||||
clientRequestWriteLatency,
|
def clientRequestWriteLatency = otel.mbean("${clientRequestWrite},name=Latency")
|
||||||
|
otel.instrument(clientRequestWriteLatency,
|
||||||
"cassandra.client.request.write.latency.50p",
|
"cassandra.client.request.write.latency.50p",
|
||||||
"Regular write request latency - 50th percentile", "µs", "50thPercentile",
|
"Regular write request latency - 50th percentile", "µs", "50thPercentile",
|
||||||
otel.&doubleUpDownCounter)
|
otel.&doubleValueObserver)
|
||||||
|
|
||||||
def clientRequestWriteLatency99p = new CassandraMetric(
|
otel.instrument(clientRequestWriteLatency,
|
||||||
clientRequestWriteLatency,
|
|
||||||
"cassandra.client.request.write.latency.99p",
|
"cassandra.client.request.write.latency.99p",
|
||||||
"Regular write request latency - 99th percentile", "µs", "99thPercentile",
|
"Regular write request latency - 99th percentile", "µs", "99thPercentile",
|
||||||
otel.&doubleUpDownCounter)
|
otel.&doubleValueObserver)
|
||||||
|
|
||||||
def clientRequestWriteLatencyCount = new CassandraMetric(
|
otel.instrument(clientRequestWriteLatency,
|
||||||
clientRequestWriteLatency,
|
|
||||||
"cassandra.client.request.write.latency.count",
|
"cassandra.client.request.write.latency.count",
|
||||||
"Total regular write request latency", "µs", "Count",
|
"Total regular write request latency", "µs", "Count",
|
||||||
otel.&longCounter)
|
otel.&longSumObserver)
|
||||||
|
|
||||||
def clientRequestWriteLatencyMax = new CassandraMetric(
|
otel.instrument(clientRequestWriteLatency,
|
||||||
clientRequestWriteLatency,
|
|
||||||
"cassandra.client.request.write.latency.max",
|
"cassandra.client.request.write.latency.max",
|
||||||
"Maximum regular write request latency", "µs", "Max",
|
"Maximum regular write request latency", "µs", "Max",
|
||||||
otel.&doubleUpDownCounter)
|
otel.&doubleValueObserver)
|
||||||
|
|
||||||
def clientRequestWriteTimeoutCount = new CassandraMetric(
|
def clientRequestWriteTimeouts = otel.mbean("${clientRequestWrite},name=Timeouts")
|
||||||
clientRequestWriteTimeouts,
|
otel.instrument(clientRequestWriteTimeouts,
|
||||||
"cassandra.client.request.write.timeout.count",
|
"cassandra.client.request.write.timeout.count",
|
||||||
"Number of regular write request timeouts encountered", "1", "Count",
|
"Number of regular write request timeouts encountered", "1", "Count",
|
||||||
otel.&longCounter)
|
otel.&longSumObserver)
|
||||||
|
|
||||||
def clientRequestWriteUnavailableCount = new CassandraMetric(
|
def clientRequestWriteUnavailables = otel.mbean("${clientRequestWrite},name=Unavailables")
|
||||||
clientRequestWriteUnavailables,
|
otel.instrument(clientRequestWriteUnavailables,
|
||||||
"cassandra.client.request.write.unavailable.count",
|
"cassandra.client.request.write.unavailable.count",
|
||||||
"Number of regular write request unavailable exceptions encountered", "1", "Count",
|
"Number of regular write request unavailable exceptions encountered", "1", "Count",
|
||||||
otel.&longCounter)
|
otel.&longSumObserver)
|
||||||
|
|
||||||
def storageLoadCount = new CassandraMetric(
|
def storage = "${cassandraMetrics}:type=Storage"
|
||||||
storageLoad,
|
def storageLoad = otel.mbean("${storage},name=Load")
|
||||||
|
otel.instrument(storageLoad,
|
||||||
"cassandra.storage.load.count",
|
"cassandra.storage.load.count",
|
||||||
"Size of the on disk data size this node manages", "by", "Count",
|
"Size of the on disk data size this node manages", "by", "Count",
|
||||||
otel.&longUpDownCounter)
|
otel.&longSumObserver)
|
||||||
|
|
||||||
def storageTotalHintsCount = new CassandraMetric(
|
def storageTotalHints = otel.mbean("${storage},name=TotalHints")
|
||||||
storageTotalHints,
|
otel.instrument(storageTotalHints,
|
||||||
"cassandra.storage.total_hints.count",
|
"cassandra.storage.total_hints.count",
|
||||||
"Number of hint messages written to this node since [re]start", "1", "Count",
|
"Number of hint messages written to this node since [re]start", "1", "Count",
|
||||||
otel.&longCounter)
|
otel.&longSumObserver)
|
||||||
|
|
||||||
def storageTotalHintsInProgressCount = new CassandraMetric(
|
def storageTotalHintsInProgress = otel.mbean("${storage},name=TotalHintsInProgress")
|
||||||
storageTotalHintsInProgress,
|
otel.instrument(storageTotalHintsInProgress,
|
||||||
"cassandra.storage.total_hints.in_progress.count",
|
"cassandra.storage.total_hints.in_progress.count",
|
||||||
"Number of hints attempting to be sent currently", "1", "Count",
|
"Number of hints attempting to be sent currently", "1", "Count",
|
||||||
otel.&longUpDownCounter)
|
otel.&longSumObserver)
|
||||||
|
|
||||||
def compactionTasksPending = new CassandraMetric(
|
def compaction = "${cassandraMetrics}:type=Compaction"
|
||||||
compactionPendingTasks,
|
def compactionPendingTasks = otel.mbean("${compaction},name=PendingTasks")
|
||||||
|
otel.instrument(compactionPendingTasks,
|
||||||
"cassandra.compaction.tasks.pending",
|
"cassandra.compaction.tasks.pending",
|
||||||
"Estimated number of compactions remaining to perform", "1", "Value",
|
"Estimated number of compactions remaining to perform", "1", "Value",
|
||||||
otel.&longUpDownCounter)
|
otel.&longValueObserver)
|
||||||
|
|
||||||
def compactionTasksCompleted = new CassandraMetric(
|
def compactionCompletedTasks = otel.mbean("${compaction},name=CompletedTasks")
|
||||||
compactionCompletedTasks,
|
otel.instrument(compactionCompletedTasks,
|
||||||
"cassandra.compaction.tasks.completed",
|
"cassandra.compaction.tasks.completed",
|
||||||
"Number of completed compactions since server [re]start", "1", "Value",
|
"Number of completed compactions since server [re]start", "1", "Value",
|
||||||
otel.&longCounter)
|
otel.&longSumObserver)
|
||||||
|
|
||||||
[
|
|
||||||
clientRequestRangeSliceLatency,
|
|
||||||
clientRequestRangeSliceTimeouts,
|
|
||||||
clientRequestRangeSliceUnavailables,
|
|
||||||
clientRequestReadLatency,
|
|
||||||
clientRequestReadTimeouts,
|
|
||||||
clientRequestReadUnavailables,
|
|
||||||
clientRequestWriteLatency,
|
|
||||||
clientRequestWriteTimeouts,
|
|
||||||
clientRequestWriteUnavailables,
|
|
||||||
compactionCompletedTasks,
|
|
||||||
compactionPendingTasks,
|
|
||||||
storageLoad,
|
|
||||||
storageTotalHints,
|
|
||||||
storageTotalHintsInProgress,
|
|
||||||
].each {
|
|
||||||
it.fetch()
|
|
||||||
}
|
|
||||||
|
|
||||||
[
|
|
||||||
clientRequestRangeSliceLatency50p,
|
|
||||||
clientRequestRangeSliceLatency99p,
|
|
||||||
clientRequestRangeSliceLatencyCount,
|
|
||||||
clientRequestRangeSliceLatencyMax,
|
|
||||||
clientRequestRangeSliceTimeoutCount,
|
|
||||||
clientRequestRangeSliceUnavailableCount,
|
|
||||||
clientRequestReadLatency50p,
|
|
||||||
clientRequestReadLatency99p,
|
|
||||||
clientRequestReadLatencyCount,
|
|
||||||
clientRequestReadLatencyMax,
|
|
||||||
clientRequestReadTimeoutCount,
|
|
||||||
clientRequestReadUnavailableCount,
|
|
||||||
clientRequestWriteLatency50p,
|
|
||||||
clientRequestWriteLatency99p,
|
|
||||||
clientRequestWriteLatencyCount,
|
|
||||||
clientRequestWriteLatencyMax,
|
|
||||||
clientRequestWriteTimeoutCount,
|
|
||||||
clientRequestWriteUnavailableCount,
|
|
||||||
compactionTasksCompleted,
|
|
||||||
compactionTasksPending,
|
|
||||||
storageLoadCount,
|
|
||||||
storageTotalHintsCount,
|
|
||||||
storageTotalHintsInProgressCount,
|
|
||||||
].each {
|
|
||||||
it.update()
|
|
||||||
}
|
|
||||||
|
|
|
||||||
|
|
@ -16,7 +16,8 @@
|
||||||
|
|
||||||
package io.opentelemetry.contrib.jmxmetrics
|
package io.opentelemetry.contrib.jmxmetrics
|
||||||
|
|
||||||
import io.opentelemetry.proto.metrics.v1.DoubleSum
|
import io.opentelemetry.proto.metrics.v1.DoubleGauge
|
||||||
|
import io.opentelemetry.proto.metrics.v1.IntGauge
|
||||||
import io.opentelemetry.proto.metrics.v1.IntSum
|
import io.opentelemetry.proto.metrics.v1.IntSum
|
||||||
|
|
||||||
import io.opentelemetry.proto.common.v1.InstrumentationLibrary
|
import io.opentelemetry.proto.common.v1.InstrumentationLibrary
|
||||||
|
|
@ -71,139 +72,139 @@ class CassandraIntegrationTests extends OtlpIntegrationTest {
|
||||||
'cassandra.client.request.range_slice.latency.50p',
|
'cassandra.client.request.range_slice.latency.50p',
|
||||||
'Token range read request latency - 50th percentile',
|
'Token range read request latency - 50th percentile',
|
||||||
'µs',
|
'µs',
|
||||||
'double',
|
DoubleGauge
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.client.request.range_slice.latency.99p',
|
'cassandra.client.request.range_slice.latency.99p',
|
||||||
'Token range read request latency - 99th percentile',
|
'Token range read request latency - 99th percentile',
|
||||||
'µs',
|
'µs',
|
||||||
'double',
|
DoubleGauge
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.client.request.range_slice.latency.count',
|
'cassandra.client.request.range_slice.latency.count',
|
||||||
'Total token range read request latency',
|
'Total token range read request latency',
|
||||||
'µs',
|
'µs',
|
||||||
'int',
|
IntSum
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.client.request.range_slice.latency.max',
|
'cassandra.client.request.range_slice.latency.max',
|
||||||
'Maximum token range read request latency',
|
'Maximum token range read request latency',
|
||||||
'µs',
|
'µs',
|
||||||
'double',
|
DoubleGauge,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.client.request.range_slice.timeout.count',
|
'cassandra.client.request.range_slice.timeout.count',
|
||||||
'Number of token range read request timeouts encountered',
|
'Number of token range read request timeouts encountered',
|
||||||
'1',
|
'1',
|
||||||
'int',
|
IntSum,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.client.request.range_slice.unavailable.count',
|
'cassandra.client.request.range_slice.unavailable.count',
|
||||||
'Number of token range read request unavailable exceptions encountered',
|
'Number of token range read request unavailable exceptions encountered',
|
||||||
'1',
|
'1',
|
||||||
'int',
|
IntSum,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.client.request.read.latency.50p',
|
'cassandra.client.request.read.latency.50p',
|
||||||
'Standard read request latency - 50th percentile',
|
'Standard read request latency - 50th percentile',
|
||||||
'µs',
|
'µs',
|
||||||
'double',
|
DoubleGauge,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.client.request.read.latency.99p',
|
'cassandra.client.request.read.latency.99p',
|
||||||
'Standard read request latency - 99th percentile',
|
'Standard read request latency - 99th percentile',
|
||||||
'µs',
|
'µs',
|
||||||
'double',
|
DoubleGauge,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.client.request.read.latency.count',
|
'cassandra.client.request.read.latency.count',
|
||||||
'Total standard read request latency',
|
'Total standard read request latency',
|
||||||
'µs',
|
'µs',
|
||||||
'int',
|
IntSum,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.client.request.read.latency.max',
|
'cassandra.client.request.read.latency.max',
|
||||||
'Maximum standard read request latency',
|
'Maximum standard read request latency',
|
||||||
'µs',
|
'µs',
|
||||||
'double',
|
DoubleGauge,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.client.request.read.timeout.count',
|
'cassandra.client.request.read.timeout.count',
|
||||||
'Number of standard read request timeouts encountered',
|
'Number of standard read request timeouts encountered',
|
||||||
'1',
|
'1',
|
||||||
'int',
|
IntSum,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.client.request.read.unavailable.count',
|
'cassandra.client.request.read.unavailable.count',
|
||||||
'Number of standard read request unavailable exceptions encountered',
|
'Number of standard read request unavailable exceptions encountered',
|
||||||
'1',
|
'1',
|
||||||
'int',
|
IntSum,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.client.request.write.latency.50p',
|
'cassandra.client.request.write.latency.50p',
|
||||||
'Regular write request latency - 50th percentile',
|
'Regular write request latency - 50th percentile',
|
||||||
'µs',
|
'µs',
|
||||||
'double',
|
DoubleGauge,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.client.request.write.latency.99p',
|
'cassandra.client.request.write.latency.99p',
|
||||||
'Regular write request latency - 99th percentile',
|
'Regular write request latency - 99th percentile',
|
||||||
'µs',
|
'µs',
|
||||||
'double',
|
DoubleGauge,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.client.request.write.latency.count',
|
'cassandra.client.request.write.latency.count',
|
||||||
'Total regular write request latency',
|
'Total regular write request latency',
|
||||||
'µs',
|
'µs',
|
||||||
'int',
|
IntSum,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.client.request.write.latency.max',
|
'cassandra.client.request.write.latency.max',
|
||||||
'Maximum regular write request latency',
|
'Maximum regular write request latency',
|
||||||
'µs',
|
'µs',
|
||||||
'double',
|
DoubleGauge,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.client.request.write.timeout.count',
|
'cassandra.client.request.write.timeout.count',
|
||||||
'Number of regular write request timeouts encountered',
|
'Number of regular write request timeouts encountered',
|
||||||
'1',
|
'1',
|
||||||
'int',
|
IntSum,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.client.request.write.unavailable.count',
|
'cassandra.client.request.write.unavailable.count',
|
||||||
'Number of regular write request unavailable exceptions encountered',
|
'Number of regular write request unavailable exceptions encountered',
|
||||||
'1',
|
'1',
|
||||||
'int',
|
IntSum,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.compaction.tasks.completed',
|
'cassandra.compaction.tasks.completed',
|
||||||
'Number of completed compactions since server [re]start',
|
'Number of completed compactions since server [re]start',
|
||||||
'1',
|
'1',
|
||||||
'int',
|
IntSum,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.compaction.tasks.pending',
|
'cassandra.compaction.tasks.pending',
|
||||||
'Estimated number of compactions remaining to perform',
|
'Estimated number of compactions remaining to perform',
|
||||||
'1',
|
'1',
|
||||||
'int',
|
IntGauge,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.storage.load.count',
|
'cassandra.storage.load.count',
|
||||||
'Size of the on disk data size this node manages',
|
'Size of the on disk data size this node manages',
|
||||||
'by',
|
'by',
|
||||||
'int',
|
IntSum,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.storage.total_hints.count',
|
'cassandra.storage.total_hints.count',
|
||||||
'Number of hint messages written to this node since [re]start',
|
'Number of hint messages written to this node since [re]start',
|
||||||
'1',
|
'1',
|
||||||
'int',
|
IntSum,
|
||||||
],
|
],
|
||||||
[
|
[
|
||||||
'cassandra.storage.total_hints.in_progress.count',
|
'cassandra.storage.total_hints.in_progress.count',
|
||||||
'Number of hints attempting to be sent currently',
|
'Number of hints attempting to be sent currently',
|
||||||
'1',
|
'1',
|
||||||
'int',
|
IntSum,
|
||||||
],
|
],
|
||||||
].eachWithIndex{ item, index ->
|
].eachWithIndex{ item, index ->
|
||||||
Metric metric = metrics.get(index)
|
Metric metric = metrics.get(index)
|
||||||
|
|
@ -212,13 +213,19 @@ class CassandraIntegrationTests extends OtlpIntegrationTest {
|
||||||
assert metric.unit == item[2]
|
assert metric.unit == item[2]
|
||||||
def datapoint
|
def datapoint
|
||||||
switch(item[3]) {
|
switch(item[3]) {
|
||||||
case 'double':
|
case DoubleGauge:
|
||||||
assert metric.hasDoubleSum()
|
assert metric.hasDoubleGauge()
|
||||||
DoubleSum datapoints = metric.doubleSum
|
DoubleGauge datapoints = metric.doubleGauge
|
||||||
assert datapoints.dataPointsCount == 1
|
assert datapoints.dataPointsCount == 1
|
||||||
datapoint = datapoints.getDataPoints(0)
|
datapoint = datapoints.getDataPoints(0)
|
||||||
break
|
break
|
||||||
case 'int':
|
case IntGauge:
|
||||||
|
assert metric.hasIntGauge()
|
||||||
|
IntGauge datapoints = metric.intGauge
|
||||||
|
assert datapoints.dataPointsCount == 1
|
||||||
|
datapoint = datapoints.getDataPoints(0)
|
||||||
|
break
|
||||||
|
case IntSum:
|
||||||
assert metric.hasIntSum()
|
assert metric.hasIntSum()
|
||||||
IntSum datapoints = metric.intSum
|
IntSum datapoints = metric.intSum
|
||||||
assert datapoints.dataPointsCount == 1
|
assert datapoints.dataPointsCount == 1
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue