blob: d6ea576973f040dd68260bec63fbcc661b66b9d8 [file] [log] [blame] [view]
## Metrics
The driver exposes measurements of its internal behavior through the popular [Dropwizard Metrics]
library. Developers can access these metrics and choose to export them to a monitoring tool.
The driver depends on Metrics 3.2.x, but is compatible with newer versions of Dropwizard Metrics.
For using Metrics 4.x with the driver, see [Metrics 4 Compatibility](#metrics-4-compatibility).
### Structure
Metric names are path-like, dot-separated strings. Metrics are measured at the `Cluster`-level,
thus the driver prefixes them with the name of the `Cluster` they are associated with (see [withClusterName]
for how to configure this), suffixed by `-metrics`. For example:
```
cluster1-metrics.connected-to
cluster1-metrics.connection-errors
...
```
### Configuration
By default, metrics are enabled and exposed via JMX as [MXBeans].
Some users may find that they don't want the driver to record and expose metrics. To disable
metrics collection, use the [withoutMetrics] builder method, i.e.:
```java
Cluster cluster = Cluster.builder()
.withoutMetrics()
.build();
```
Note that if you decide to disable metrics, you may also consider excluding metrics as a dependency.
To do this in a maven project:
```xml
<dependency>
<groupId>com.datastax.cassandra</groupId>
<artifactId>cassandra-driver-core</artifactId>
<version>3.9.0</version>
<exclusions>
<exclusion>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-core</artifactId>
</exclusion>
</exclusions>
</dependency>
```
Alternatively, one may not want to expose metrics using JMX. Disabling JMX reporting is simple
as using the [withoutJMXReporting] builder method, i.e.:
```java
Cluster cluster = Cluster.builder()
.withoutJMXReporting()
.build();
```
### Accessing Cluster Metrics
`Cluster` metrics may be accessed via the [getMetrics] method. The [Metrics] class offers
direct access to all metrics recorded for the `Cluster` via getter methods. Refer to
the [Metrics javadoc][Metrics] for more details about the metrics offered.
It is very common for applications to record their own metrics. You can add all metrics
recorded for a `Cluster` to your applications' [MetricRegistry] in the following manner:
```java
MetricRegistry myRegistery = new MetricRegistry();
myRegistry.registerAll(cluster.getMetrics().getRegistry());
```
### Registering a Custom Reporter
Dropwizard Metrics offers a variety of [Reporters] for exporting metrics. To enable reporting,
access the `Cluster`'s metrics via the [getMetrics] method. For example, to enable CSV reporting
every 30 seconds:
```java
import com.codahale.metrics.*;
import java.io.File;
import java.util.concurrent.TimeUnit;
Metrics metrics = cluster.getMetrics();
CsvReporter csvReporter = CsvReporter.forRegistry(metrics.getRegistry())
.convertDurationsTo(TimeUnit.MILLISECONDS)
.convertRatesTo(TimeUnit.SECONDS)
.build(new File("."));
csvReporter.start(30, TimeUnit.SECONDS);
```
### Metrics 4 Compatibility
While the driver depends on Metrics 3.2.x, it also works with Metrics 4, with some caveats.
In Metrics 4, JMX reporting was moved to a separate module, `metrics-jmx`. Because of this you are
likely to encounter the following exception at runtime when initializing a `Cluster`:
```
Exception in thread "main" java.lang.NoClassDefFoundError: com/codahale/metrics/JmxReporter
at com.datastax.driver.core.Metrics.<init>(Metrics.java:103)
at com.datastax.driver.core.Cluster$Manager.init(Cluster.java:1402)
at com.datastax.driver.core.Cluster.init(Cluster.java:159)
at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:330)
at com.datastax.driver.core.Cluster.connectAsync(Cluster.java:305)
at com.datastax.durationtest.core.DurationTest.createSessions(DurationTest.java:360)
....
Caused by: java.lang.ClassNotFoundException: com.codahale.metrics.JmxReporter
at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582)
at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496)
... 8 more
```
To fix this, use [withoutJMXReporting] when constructing your `Cluster`. If you still desire JMX
reporting, add `metrics-jmx` as a dependency:
```xml
<dependency>
<groupId>io.dropwizard.metrics</groupId>
<artifactId>metrics-jmx</artifactId>
<version>4.0.2</version>
</dependency>
```
Then create your `Cluster` and `JmxReporter` in the following manner:
```java
Cluster cluster = Cluster.builder()
.withoutJMXReporting()
.build();
JmxReporter reporter =
JmxReporter.forRegistry(cluster.getMetrics().getRegistry())
.inDomain(cluster.getClusterName() + "-metrics")
.build();
reporter.start();
```
[Dropwizard Metrics]: http://metrics.dropwizard.io/3.2.2/manual/index.html
[Reporters]: http://metrics.dropwizard.io/3.2.2/manual/core.html#reporters
[MetricRegistry]: http://metrics.dropwizard.io/3.2.2/apidocs/com/codahale/metrics/MetricRegistry.html
[MXBeans]: https://docs.oracle.com/javase/tutorial/jmx/mbeans/mxbeans.html
[withClusterName]: https://docs.datastax.com/en/drivers/java/3.9/com/datastax/driver/core/Cluster.Builder.html#withClusterName-java.lang.String-
[withoutMetrics]: https://docs.datastax.com/en/drivers/java/3.9/com/datastax/driver/core/Cluster.Builder.html#withoutMetrics--
[withoutJMXReporting]: https://docs.datastax.com/en/drivers/java/3.9/com/datastax/driver/core/Cluster.Builder.html#withoutJMXReporting--
[getMetrics]: https://docs.datastax.com/en/drivers/java/3.9/com/datastax/driver/core/Cluster.html#getMetrics--
[Metrics]: http://docs.datastax.com/en/drivers/java/3.9/com/datastax/driver/core/Metrics.html