Node metrics
A Corda node exports a number of metrics for the purpose of monitoring the health of the node via JMX. These metrics are described below.
For more information on how to monitor a node, see Node administration, Node monitoring and logging, and Node monitoring scenarios.
Node status
The node status, indicating what the node is currently doing, is published as net.corda.Node.Status
, and is available almost immediately at startup.
Metric accuracy and performance
Histogram and timer-based metrics use internal data reservoirs to compute percentile-based metric data. By default, the metrics produced by Corda nodes rely on the reservoir implementation provided by the DropWizard metrics library, which is an exponentially decaying reservoir (EDR). These reservoirs sample the data and do not keep a full set of data over time. This can cause outlying data points to be missed if they are not included in the sample set.
Alternatively, a node can be configured to use a time window reservoir by adding the following configuration block to the node.conf
file:
enterpriseConfiguration {
metricsConfiguration {
reservoirType = TIME_WINDOW // Can also be EDR, but this is the default if this item is absent
timeWindow = <Duration> // Optional - will default to 5m if not specified
}
The reservoirType
configuration option can be set as either TIME_WINDOW
or EDR
, and will default to EDR
if the configuration block is missing.
Time window data reservoirs record all data points across the specified time window. This ensures that outliers are accurately recorded for metrics calculation, and contain a bias towards more recent results.
Using time window reservoirs increases heap memory usage proportionally to the amount of load on the system.
Attachments
Metric Query | Description |
---|---|
net.corda:name=Attachments | A count of the total number of attachments on the node. |
Caches
A Corda node maintains a number of caches. For each of the metrics below, the name of the cache must be supplied in the component
field to
show metrics for that cache.
There are two types of caches: size-based and weight-based. Size-based caches are measured in the number of entries in the cache, while weight-based caches are measured in the bytes of memory occupied by the entries.
maximum-size
and sizePercent
metrics are only available for size-based caches, while maximum-weight
, weight
, and weightPercent
metrics are only available for weight-based caches.Metric Query | Description |
---|---|
net.corda:type=Caches,component=<cache_name>,name=evictions | The number of items evicted from the cache. |
net.corda:type=Caches,component=<cache_name>,name=evictions-weight | The total weight of items evicted from the cache. |
net.corda:type=Caches,component=<cache_name>,name=hits | The number of cache hits. |
net.corda:type=Caches,component=<cache_name>,name=loads | A histogram indicating how long loads into the cache are taking. |
net.corda:type=Caches,component=<cache_name>,name=loads-failure | The number of items that could not be loaded into the cache. |
net.corda:type=Caches,component=<cache_name>,name=loads-success | The number of items successfully loaded into the cache. |
net.corda:type=Caches,component=<cache_name>,name=maximum-size | The maximum number of entries in the cache. |
net.corda:type=Caches,component=<cache_name>,name=misses | The number of cache misses. |
net.corda:type=Caches,component=<cache_name>,name=size | The current number of entries in the cache. |
net.corda:type=Caches,component=<cache_name>,name=sizePercent | The current size of the cache expressed as a percentage of the maximum. |
net.corda:type=Caches,component=<cache_name>,name=maximum-weight | The maximum size of the cache, expressed as a total weight. |
net.corda:type=Caches,component=<cache_name>,name=weight | The current weight of the cache. |
net.corda:type=Caches,component=<cache_name>,name=weightPercent | The current weight of the cache, expressed as a percentage of the maximum. |
Flows
Metric Query | Description |
---|---|
net.corda:type=Flows,name=ActiveThreads | The total number of threads running flows. |
net.corda:type=Flows,name=CheckpointVolumeBytesPerSecondCurrent | The current rate at which checkpoint data is being persisted. |
net.corda:type=Flows,name=CheckpointVolumeBytesPerSecondHist | A histogram indicating the rate at which bytes are being checkpointed. |
net.corda:type=Flows,name=Checkpointing Rate | The rate at which checkpoint events are occurring. |
net.corda:type=Flows,name=Error | The total number of flows failed with an error. |
net.corda:type=Flows,name=ErrorPerMinute | The rate at which flows fail with an error. |
net.corda:type=Flows,name=Finished | The total number of completed flows (both successfully and unsuccessfully). |
net.corda:type=Flows,name=InFlight | The number of in-flight flows. |
net.corda:type=Flows,name=QueueSize | The current size of the queue for flows waiting to be executed. |
net.corda:type=Flows,name=QueueSizeOnInsert | A histogram showing the queue size at the point new flows are added. |
net.corda:type=Flows,name=Started | The total number of flows started. |
net.corda:type=Flows,name=StartedPerMinute | The rate at which flows are started. |
net.corda:type=Flows,name=StartupQueueTime | This timer measures the time a flow spends queued before it is executed. |
net.corda:type=Flows,name=Success | The total number of successful flows. |
net.corda:type=Flows,name=<action_name> | A histogram indicating the time taken to execute a particular action. See the following section for more details. |
Actions
Actions are reified IO actions to execute as part of state machine transitions. These metrics are only exposed when the relevant action gets executed for the first time.
Metric Query | Action description |
---|---|
net.corda:type=Flows,name=Actions.AcknowledgeMessages | Acknowledge messages |
net.corda:type=Flows,name=Actions.AddSessionBinding | Create a session binding to allow routing of incoming messages. |
net.corda:type=Flows,name=Actions.CancelFlowTimeout | Cancel the retry timeout for a flow. |
net.corda:type=Flows,name=Actions.CommitTransaction | Commit the current database transaction. |
net.corda:type=Flows,name=Actions.CreateTransaction | Create a new database transaction. |
net.corda:type=Flows,name=Actions.ExecuteAsyncOperation | Execute the specified operation. |
net.corda:type=Flows,name=Actions.PersistCheckpoint | Persist a checkpoint. |
net.corda:type=Flows,name=Actions.PersistDeduplicationFacts | Persist deduplication facts. |
net.corda:type=Flows,name=Actions.PropagateErrors | Propagate error messages to sessions. |
net.corda:type=Flows,name=Actions.ReleaseSoftLocks | Release soft locks associated with a given ID. |
net.corda:type=Flows,name=Actions.RemoveCheckpoint | Remove a checkpoint. |
net.corda:type=Flows,name=Actions.RemoveFlow | Remove a flow. |
net.corda:type=Flows,name=Actions.RemoveSessionBindings | Remove session bindings. |
net.corda:type=Flows,name=Actions.RetryFlowFromSafePoint | Retry a flow from the last checkpoint. If there is no checkpoint, restart the flow with the same invocation details. |
net.corda:type=Flows,name=Actions.RollbackTransaction | Roll back the current database transaction. |
net.corda:type=Flows,name=Actions.ScheduleEvent | Schedule an event. |
net.corda:type=Flows,name=Actions.ScheduleFlowTimeout | Schedule a flow to be retried if it does not complete within the timeout period specified in the configuration. |
net.corda:type=Flows,name=Actions.SendExisting | Send a session message to a party with which there has been an established session. |
net.corda:type=Flows,name=Actions.SendInitial | Send an initial session message to a destination. |
net.corda:type=Flows,name=Actions.SendMultiple | Send session messages to multiple destinations. |
net.corda:type=Flows,name=Actions.SignalFlowHasStarted | Signal that a flow is considered as started. |
net.corda:type=Flows,name=Actions.SleepUntil | Sleep until a given moment in time. |
net.corda:type=Flows,name=Actions.TrackTransaction | Track a transaction hash and notify the state machine once the corresponding transaction has committed. |
Metering
Metric Query | Description |
---|---|
net.corda:type=Metering,name=commandsPersisted | The number of unique sets of commands persisted. |
net.corda:type=Metering,name=droppedCounts | The number of signing events not persisted. |
net.corda:type=Metering,name=eventsProcessed | A histogram indicating the number of events processed on every aggregation interval. |
net.corda:type=Metering,name=dataQueueSize | An instant value of the size of the queue of aggregation events. |
net.corda:type=Metering,name=stacksPersisted | The number of unique CorDapp stacks persisted. |
net.corda:type=Metering,name=totalCounts | The total number of signing events persisted. |
P2P
Metric Query | Description |
---|---|
net.corda:type=P2P,name=ReceiveDuration | A histogram measuring latency between the node receiving a P2P message and delivering it to the state machine. |
net.corda:type=P2P,name=ReceiveInterval | A histogram measuring the interval between received P2P messages. |
net.corda:type=P2P,name=ReceiveMessageSize | A histogram measuring the size of received messages. |
net.corda:type=P2P,name=SendLatency | A histogram measuring latency when sending P2P messages, between the message sending and the send acknowledgement by Artemis. |
net.corda:type=P2P,name=SendMessageSize | A histogram measuring the size of sent messages. |
net.corda:type=P2P,name=SendQueueSize | The size of the in-memory send queue in the state machine for messages waiting to be sent to Artemis. |
net.corda:type=P2P,name=SendQueueSizeOnInsert | A histogram measuring the size of the in-memory send queue in the state machine when new messages are added. |
Other metrics
Metric Query | Description |
---|---|
net.corda:type=NetworkParameter,name=UpdateProposed | A gauge with a true / false value to indicate that a network parameter update was proposed but it has not been accepted yet. |
net.corda:type=Transaction,name=SignDuration | A histogram measuring the time taken to sign a transaction. |
Was this page helpful?
Thanks for your feedback!
Chat with us
Chat with us on our #docs channel on slack. You can also join a lot of other slack channels there and have access to 1-on-1 communication with members of the R3 team and the online community.
Propose documentation improvements directly
Help us to improve the docs by contributing directly. It's simple - just fork this repository and raise a PR of your own - R3's Technical Writers will review it and apply the relevant suggestions.
We're sorry this page wasn't helpful. Let us know how we can make it better!
Chat with us
Chat with us on our #docs channel on slack. You can also join a lot of other slack channels there and have access to 1-on-1 communication with members of the R3 team and the online community.
Create an issue
Create a new GitHub issue in this repository - submit technical feedback, draw attention to a potential documentation bug, or share ideas for improvement and general feedback.
Propose documentation improvements directly
Help us to improve the docs by contributing directly. It's simple - just fork this repository and raise a PR of your own - R3's Technical Writers will review it and apply the relevant suggestions.