.. Licensed to the Apache Software Foundation (ASF) under one
.. or more contributor license agreements.  See the NOTICE file
.. distributed with this work for additional information
.. regarding copyright ownership.  The ASF licenses this file
.. to you under the Apache License, Version 2.0 (the
.. "License"); you may not use this file except in compliance
.. with the License.  You may obtain a copy of the License at
..
..     http://www.apache.org/licenses/LICENSE-2.0
..
.. Unless required by applicable law or agreed to in writing, software
.. distributed under the License is distributed on an "AS IS" BASIS,
.. WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
.. See the License for the specific language governing permissions and
.. limitations under the License.

.. highlight:: none

Monitoring
----------

Metrics in Cassandra are managed using the `Dropwizard Metrics <http://metrics.dropwizard.io>`__ library. These metrics
can be queried via JMX or pushed to external monitoring systems using a number of `built in
<http://metrics.dropwizard.io/3.1.0/getting-started/#other-reporting>`__ and `third party
<http://metrics.dropwizard.io/3.1.0/manual/third-party/>`__ reporter plugins.

Metrics are collected for a single node. It's up to the operator to use an external monitoring system to aggregate them.

Metric Types
^^^^^^^^^^^^
All metrics reported by cassandra fit into one of the following types.

``Gauge``
    An instantaneous measurement of a value.

``Counter``
    A gauge for an ``AtomicLong`` instance. Typically this is consumed by monitoring the change since the last call to
    see if there is a large increase compared to the norm.

``Histogram``
    Measures the statistical distribution of values in a stream of data.

    In addition to minimum, maximum, mean, etc., it also measures median, 75th, 90th, 95th, 98th, 99th, and 99.9th
    percentiles.

``Timer``
    Measures both the rate that a particular piece of code is called and the histogram of its duration.

``Latency``
    Special type that tracks latency (in microseconds) with a ``Timer`` plus a ``Counter`` that tracks the total latency
    accrued since starting. The former is useful if you track the change in total latency since the last check. Each
    metric name of this type will have 'Latency' and 'TotalLatency' appended to it.

``Meter``
    A meter metric which measures mean throughput and one-, five-, and fifteen-minute exponentially-weighted moving
    average throughputs.

Table Metrics
^^^^^^^^^^^^^

Each table in Cassandra has metrics responsible for tracking its state and performance.

The metric names are all appended with the specific ``Keyspace`` and ``Table`` name.

Reported name format:

**Metric Name**
    ``org.apache.cassandra.metrics.Table.{{MetricName}}.{{Keyspace}}.{{Table}}``

**JMX MBean**
    ``org.apache.cassandra.metrics:type=Table keyspace={{Keyspace} scope={{Table}} name={{MetricName}}``

.. NOTE::
    There is a special table called '``all``' without a keyspace. This represents the aggregation of metrics across
    **all** tables and keyspaces on the node.


======================================= ============== ===========
Name                                    Type           Description
======================================= ============== ===========
MemtableOnHeapSize                      Gauge<Long>    Total amount of data stored in the memtable that resides **on**-heap, including column related overhead and partitions overwritten.
MemtableOffHeapSize                     Gauge<Long>    Total amount of data stored in the memtable that resides **off**-heap, including column related overhead and partitions overwritten.
MemtableLiveDataSize                    Gauge<Long>    Total amount of live data stored in the memtable, excluding any data structure overhead.
AllMemtablesOnHeapSize                  Gauge<Long>    Total amount of data stored in the memtables (2i and pending flush memtables included) that resides **on**-heap.
AllMemtablesOffHeapSize                 Gauge<Long>    Total amount of data stored in the memtables (2i and pending flush memtables included) that resides **off**-heap.
AllMemtablesLiveDataSize                Gauge<Long>    Total amount of live data stored in the memtables (2i and pending flush memtables included) that resides off-heap, excluding any data structure overhead.
MemtableColumnsCount                    Gauge<Long>    Total number of columns present in the memtable.
MemtableSwitchCount                     Counter        Number of times flush has resulted in the memtable being switched out.
CompressionRatio                        Gauge<Double>  Current compression ratio for all SSTables.
EstimatedPartitionSizeHistogram         Gauge<long[]>  Histogram of estimated partition size (in bytes).
EstimatedPartitionCount                 Gauge<Long>    Approximate number of keys in table.
EstimatedColumnCountHistogram           Gauge<long[]>  Histogram of estimated number of columns.
SSTablesPerReadHistogram                Histogram      Histogram of the number of sstable data files accessed per read.
ReadLatency                             Latency        Local read latency for this table.
RangeLatency                            Latency        Local range scan latency for this table.
WriteLatency                            Latency        Local write latency for this table.
CoordinatorReadLatency                  Timer          Coordinator read latency for this table.
CoordinatorScanLatency                  Timer          Coordinator range scan latency for this table.
PendingFlushes                          Counter        Estimated number of flush tasks pending for this table.
BytesFlushed                            Counter        Total number of bytes flushed since server [re]start.
CompactionBytesWritten                  Counter        Total number of bytes written by compaction since server [re]start.
PendingCompactions                      Gauge<Integer> Estimate of number of pending compactions for this table.
LiveSSTableCount                        Gauge<Integer> Number of SSTables on disk for this table.
LiveDiskSpaceUsed                       Counter        Disk space used by SSTables belonging to this table (in bytes).
TotalDiskSpaceUsed                      Counter        Total disk space used by SSTables belonging to this table, including obsolete ones waiting to be GC'd.
MinPartitionSize                        Gauge<Long>    Size of the smallest compacted partition (in bytes).
MaxPartitionSize                        Gauge<Long>    Size of the largest compacted partition (in bytes).
MeanPartitionSize                       Gauge<Long>    Size of the average compacted partition (in bytes).
BloomFilterFalsePositives               Gauge<Long>    Number of false positives on table's bloom filter.
BloomFilterFalseRatio                   Gauge<Double>  False positive ratio of table's bloom filter.
BloomFilterDiskSpaceUsed                Gauge<Long>    Disk space used by bloom filter (in bytes).
BloomFilterOffHeapMemoryUsed            Gauge<Long>    Off-heap memory used by bloom filter.
IndexSummaryOffHeapMemoryUsed           Gauge<Long>    Off-heap memory used by index summary.
CompressionMetadataOffHeapMemoryUsed    Gauge<Long>    Off-heap memory used by compression meta data.
KeyCacheHitRate                         Gauge<Double>  Key cache hit rate for this table.
TombstoneScannedHistogram               Histogram      Histogram of tombstones scanned in queries on this table.
LiveScannedHistogram                    Histogram      Histogram of live cells scanned in queries on this table.
ColUpdateTimeDeltaHistogram             Histogram      Histogram of column update time delta on this table.
ViewLockAcquireTime                     Timer          Time taken acquiring a partition lock for materialized view updates on this table.
ViewReadTime                            Timer          Time taken during the local read of a materialized view update.
TrueSnapshotsSize                       Gauge<Long>    Disk space used by snapshots of this table including all SSTable components.
RowCacheHitOutOfRange                   Counter        Number of table row cache hits that do not satisfy the query filter, thus went to disk.
RowCacheHit                             Counter        Number of table row cache hits.
RowCacheMiss                            Counter        Number of table row cache misses.
CasPrepare                              Latency        Latency of paxos prepare round.
CasPropose                              Latency        Latency of paxos propose round.
CasCommit                               Latency        Latency of paxos commit round.
PercentRepaired                         Gauge<Double>  Percent of table data that is repaired on disk.
SpeculativeRetries                      Counter        Number of times speculative retries were sent for this table.
WaitingOnFreeMemtableSpace              Histogram      Histogram of time spent waiting for free memtable space, either on- or off-heap.
DroppedMutations                        Counter        Number of dropped mutations on this table.
======================================= ============== ===========

Keyspace Metrics
^^^^^^^^^^^^^^^^
Each keyspace in Cassandra has metrics responsible for tracking its state and performance.

These metrics are the same as the ``Table Metrics`` above, only they are aggregated at the Keyspace level.

Reported name format:

**Metric Name**
    ``org.apache.cassandra.metrics.keyspace.{{MetricName}}.{{Keyspace}}``

**JMX MBean**
    ``org.apache.cassandra.metrics:type=Keyspace scope={{Keyspace}} name={{MetricName}}``

ThreadPool Metrics
^^^^^^^^^^^^^^^^^^

Cassandra splits work of a particular type into its own thread pool.  This provides back-pressure and asynchrony for
requests on a node.  It's important to monitor the state of these thread pools since they can tell you how saturated a
node is.

The metric names are all appended with the specific ``ThreadPool`` name.  The thread pools are also categorized under a
specific type.

Reported name format:

**Metric Name**
    ``org.apache.cassandra.metrics.ThreadPools.{{MetricName}}.{{Path}}.{{ThreadPoolName}}``

**JMX MBean**
    ``org.apache.cassandra.metrics:type=ThreadPools scope={{ThreadPoolName}} type={{Type}} name={{MetricName}}``

===================== ============== ===========
Name                  Type           Description
===================== ============== ===========
ActiveTasks           Gauge<Integer> Number of tasks being actively worked on by this pool.
PendingTasks          Gauge<Integer> Number of queued tasks queued up on this pool.
CompletedTasks        Counter        Number of tasks completed.
TotalBlockedTasks     Counter        Number of tasks that were blocked due to queue saturation.
CurrentlyBlockedTask  Counter        Number of tasks that are currently blocked due to queue saturation but on retry will become unblocked.
MaxPoolSize           Gauge<Integer> The maximum number of threads in this pool.
===================== ============== ===========

The following thread pools can be monitored.

============================ ============== ===========
Name                         Type           Description
============================ ============== ===========
Native-Transport-Requests    transport      Handles client CQL requests
CounterMutationStage         request        Responsible for counter writes
ViewMutationStage            request        Responsible for materialized view writes
MutationStage                request        Responsible for all other writes
ReadRepairStage              request        ReadRepair happens on this thread pool
ReadStage                    request        Local reads run on this thread pool
RequestResponseStage         request        Coordinator requests to the cluster run on this thread pool
AntiEntropyStage             internal       Builds merkle tree for repairs
CacheCleanupExecutor         internal       Cache maintenance performed on this thread pool
CompactionExecutor           internal       Compactions are run on these threads
GossipStage                  internal       Handles gossip requests
HintsDispatcher              internal       Performs hinted handoff
InternalResponseStage        internal       Responsible for intra-cluster callbacks
MemtableFlushWriter          internal       Writes memtables to disk
MemtablePostFlush            internal       Cleans up commit log after memtable is written to disk
MemtableReclaimMemory        internal       Memtable recycling
MigrationStage               internal       Runs schema migrations
MiscStage                    internal       Misceleneous tasks run here
PendingRangeCalculator       internal       Calculates token range
PerDiskMemtableFlushWriter_0 internal       Responsible for writing a spec (there is one of these per disk 0-N)
Sampler                      internal       Responsible for re-sampling the index summaries of SStables
SecondaryIndexManagement     internal       Performs updates to secondary indexes
ValidationExecutor           internal       Performs validation compaction or scrubbing
============================ ============== ===========

.. |nbsp| unicode:: 0xA0 .. nonbreaking space

Client Request Metrics
^^^^^^^^^^^^^^^^^^^^^^

Client requests have their own set of metrics that encapsulate the work happening at coordinator level.

Different types of client requests are broken down by ``RequestType``.

Reported name format:

**Metric Name**
    ``org.apache.cassandra.metrics.ClientRequest.{{MetricName}}.{{RequestType}}``

**JMX MBean**
    ``org.apache.cassandra.metrics:type=ClientRequest scope={{RequestType}} name={{MetricName}}``


:RequestType: CASRead
:Description: Metrics related to transactional read requests.
:Metrics:
    ===================== ============== =============================================================
    Name                  Type           Description
    ===================== ============== =============================================================
    Timeouts              Counter        Number of timeouts encountered.
    Failures              Counter        Number of transaction failures encountered.
    |nbsp|                Latency        Transaction read latency.
    Unavailables          Counter        Number of unavailable exceptions encountered.
    UnfinishedCommit      Counter        Number of transactions that were committed on read.
    ConditionNotMet       Counter        Number of transaction preconditions did not match current values.
    ContentionHistogram   Histogram      How many contended reads were encountered
    ===================== ============== =============================================================

:RequestType: CASWrite
:Description: Metrics related to transactional write requests.
:Metrics:
    ===================== ============== =============================================================
    Name                  Type           Description
    ===================== ============== =============================================================
    Timeouts              Counter        Number of timeouts encountered.
    Failures              Counter        Number of transaction failures encountered.
    |nbsp|                Latency        Transaction write latency.
    UnfinishedCommit      Counter        Number of transactions that were committed on write.
    ConditionNotMet       Counter        Number of transaction preconditions did not match current values.
    ContentionHistogram   Histogram      How many contended writes were encountered
    ===================== ============== =============================================================


:RequestType: Read
:Description: Metrics related to standard read requests.
:Metrics:
    ===================== ============== =============================================================
    Name                  Type           Description
    ===================== ============== =============================================================
    Timeouts              Counter        Number of timeouts encountered.
    Failures              Counter        Number of read failures encountered.
    |nbsp|                Latency        Read latency.
    Unavailables          Counter        Number of unavailable exceptions encountered.
    ===================== ============== =============================================================

:RequestType: RangeSlice
:Description: Metrics related to token range read requests.
:Metrics:
    ===================== ============== =============================================================
    Name                  Type           Description
    ===================== ============== =============================================================
    Timeouts              Counter        Number of timeouts encountered.
    Failures              Counter        Number of range query failures encountered.
    |nbsp|                Latency        Range query latency.
    Unavailables          Counter        Number of unavailable exceptions encountered.
    ===================== ============== =============================================================

:RequestType: Write
:Description: Metrics related to regular write requests.
:Metrics:
    ===================== ============== =============================================================
    Name                  Type           Description
    ===================== ============== =============================================================
    Timeouts              Counter        Number of timeouts encountered.
    Failures              Counter        Number of write failures encountered.
    |nbsp|                Latency        Write latency.
    Unavailables          Counter        Number of unavailable exceptions encountered.
    ===================== ============== =============================================================


:RequestType: ViewWrite
:Description: Metrics related to materialized view write wrtes.
:Metrics:
    ===================== ============== =============================================================
    Timeouts              Counter        Number of timeouts encountered.
    Failures              Counter        Number of transaction failures encountered.
    Unavailables          Counter        Number of unavailable exceptions encountered.
    ViewReplicasAttempted Counter        Total number of attempted view replica writes.
    ViewReplicasSuccess   Counter        Total number of succeded view replica writes.
    ViewPendingMutations  Gauge<Long>    ViewReplicasAttempted - ViewReplicasSuccess.
    ViewWriteLatency      Timer          Time between when mutation is applied to base table and when CL.ONE is achieved on view.
    ===================== ============== =============================================================

Cache Metrics
^^^^^^^^^^^^^

Cassandra caches have metrics to track the effectivness of the caches. Though the ``Table Metrics`` might be more useful.

Reported name format:

**Metric Name**
    ``org.apache.cassandra.metrics.Cache.{{MetricName}}.{{CacheName}}``

**JMX MBean**
    ``org.apache.cassandra.metrics:type=Cache scope={{CacheName}} name={{MetricName}}``

========================== ============== ===========
Name                       Type           Description
========================== ============== ===========
Capacity                   Gauge<Long>    Cache capacity in bytes.
Entries                    Gauge<Integer> Total number of cache entries.
FifteenMinuteCacheHitRate  Gauge<Double>  15m cache hit rate.
FiveMinuteCacheHitRate     Gauge<Double>  5m cache hit rate.
OneMinuteCacheHitRate      Gauge<Double>  1m cache hit rate.
HitRate                    Gauge<Double>  All time cache hit rate.
Hits                       Meter          Total number of cache hits.
Misses                     Meter          Total number of cache misses.
MissLatency                Timer          Latency of misses.
Requests                   Gauge<Long>    Total number of cache requests.
Size                       Gauge<Long>    Total size of occupied cache, in bytes.
========================== ============== ===========

The following caches are covered:

============================ ===========
Name                         Description
============================ ===========
CounterCache                 Keeps hot counters in memory for performance.
ChunkCache                   In process uncompressed page cache.
KeyCache                     Cache for partition to sstable offsets.
RowCache                     Cache for rows kept in memory.
============================ ===========

.. NOTE::
    Misses and MissLatency are only defined for the ChunkCache

CQL Metrics
^^^^^^^^^^^

Metrics specific to CQL prepared statement caching.

Reported name format:

**Metric Name**
    ``org.apache.cassandra.metrics.CQL.{{MetricName}}``

**JMX MBean**
    ``org.apache.cassandra.metrics:type=CQL name={{MetricName}}``

========================== ============== ===========
Name                       Type           Description
========================== ============== ===========
PreparedStatementsCount    Gauge<Integer> Number of cached prepared statements.
PreparedStatementsEvicted  Counter        Number of prepared statements evicted from the prepared statement cache
PreparedStatementsExecuted Counter        Number of prepared statements executed.
RegularStatementsExecuted  Counter        Number of **non** prepared statements executed.
PreparedStatementsRatio    Gauge<Double>  Percentage of statements that are prepared vs unprepared.
========================== ============== ===========


DroppedMessage Metrics
^^^^^^^^^^^^^^^^^^^^^^

Metrics specific to tracking dropped messages for different types of requests.
Dropped writes are stored and retried by ``Hinted Handoff``

Reported name format:

**Metric Name**
    ``org.apache.cassandra.metrics.DroppedMessages.{{MetricName}}.{{Type}}``

**JMX MBean**
    ``org.apache.cassandra.metrics:type=DroppedMetrics scope={{Type}} name={{MetricName}}``

========================== ============== ===========
Name                       Type           Description
========================== ============== ===========
CrossNodeDroppedLatency    Timer          The dropped latency across nodes.
InternalDroppedLatency     Timer          The dropped latency within node.
Dropped                    Meter          Number of dropped messages.
========================== ============== ===========

The different types of messages tracked are:

============================ ===========
Name                         Description
============================ ===========
BATCH_STORE                  Batchlog write
BATCH_REMOVE                 Batchlog cleanup (after succesfully applied)
COUNTER_MUTATION             Counter writes
HINT                         Hint replay
MUTATION                     Regular writes
READ                         Regular reads
READ_REPAIR                  Read repair
PAGED_SLICE                  Paged read
RANGE_SLICE                  Token range read
REQUEST_RESPONSE             RPC Callbacks
_TRACE                       Tracing writes
============================ ===========

Streaming Metrics
^^^^^^^^^^^^^^^^^

Metrics reported during ``Streaming`` operations, such as repair, bootstrap, rebuild.

These metrics are specific to a peer endpoint, with the source node being the node you are pulling the metrics from.

Reported name format:

**Metric Name**
    ``org.apache.cassandra.metrics.Streaming.{{MetricName}}.{{PeerIP}}``

**JMX MBean**
    ``org.apache.cassandra.metrics:type=Streaming scope={{PeerIP}} name={{MetricName}}``

========================== ============== ===========
Name                       Type           Description
========================== ============== ===========
IncomingBytes              Counter        Number of bytes streamed to this node from the peer.
OutgoingBytes              Counter        Number of bytes streamed to the peer endpoint from this node.
========================== ============== ===========


Compaction Metrics
^^^^^^^^^^^^^^^^^^

Metrics specific to ``Compaction`` work.

Reported name format:

**Metric Name**
    ``org.apache.cassandra.metrics.Compaction.{{MetricName}}``

**JMX MBean**
    ``org.apache.cassandra.metrics:type=Compaction name={{MetricName}}``

========================== ======================================== ===============================================
Name                       Type                                     Description
========================== ======================================== ===============================================
BytesCompacted             Counter                                  Total number of bytes compacted since server [re]start.
PendingTasks               Gauge<Integer>                           Estimated number of compactions remaining to perform.
CompletedTasks             Gauge<Long>                              Number of completed compactions since server [re]start.
TotalCompactionsCompleted  Meter                                    Throughput of completed compactions since server [re]start.
PendingTasksByTableName    Gauge<Map<String, Map<String, Integer>>> Estimated number of compactions remaining to perform, grouped by keyspace and then table name. This info is also kept in ``Table Metrics``.
========================== ======================================== ===============================================

CommitLog Metrics
^^^^^^^^^^^^^^^^^

Metrics specific to the ``CommitLog``

Reported name format:

**Metric Name**
    ``org.apache.cassandra.metrics.CommitLog.{{MetricName}}``

**JMX MBean**
    ``org.apache.cassandra.metrics:type=CommitLog name={{MetricName}}``

========================== ============== ===========
Name                       Type           Description
========================== ============== ===========
CompletedTasks             Gauge<Long>    Total number of commit log messages written since [re]start.
PendingTasks               Gauge<Long>    Number of commit log messages written but yet to be fsync'd.
TotalCommitLogSize         Gauge<Long>    Current size, in bytes, used by all the commit log segments.
WaitingOnSegmentAllocation Timer          Time spent waiting for a CommitLogSegment to be allocated - under normal conditions this should be zero.
WaitingOnCommit            Timer          The time spent waiting on CL fsync; for Periodic this is only occurs when the sync is lagging its sync interval.
========================== ============== ===========

Storage Metrics
^^^^^^^^^^^^^^^

Metrics specific to the storage engine.

Reported name format:

**Metric Name**
    ``org.apache.cassandra.metrics.Storage.{{MetricName}}``

**JMX MBean**
    ``org.apache.cassandra.metrics:type=Storage name={{MetricName}}``

========================== ============== ===========
Name                       Type           Description
========================== ============== ===========
Exceptions                 Counter        Number of internal exceptions caught. Under normal exceptions this should be zero.
Load                       Counter        Size, in bytes, of the on disk data size this node manages.
TotalHints                 Counter        Number of hint messages written to this node since [re]start. Includes one entry for each host to be hinted per hint.
TotalHintsInProgress       Counter        Number of hints attemping to be sent currently.
========================== ============== ===========

HintedHandoff Metrics
^^^^^^^^^^^^^^^^^^^^^

Metrics specific to Hinted Handoff.  There are also some metrics related to hints tracked in ``Storage Metrics``

These metrics include the peer endpoint **in the metric name**

Reported name format:

**Metric Name**
    ``org.apache.cassandra.metrics.HintedHandOffManager.{{MetricName}}``

**JMX MBean**
    ``org.apache.cassandra.metrics:type=HintedHandOffManager name={{MetricName}}``

=========================== ============== ===========
Name                        Type           Description
=========================== ============== ===========
Hints_created-{{PeerIP}}    Counter        Number of hints on disk for this peer.
Hints_not_stored-{{PeerIP}} Counter        Number of hints not stored for this peer, due to being down past the configured hint window.
=========================== ============== ===========

SSTable Index Metrics
^^^^^^^^^^^^^^^^^^^^^

Metrics specific to the SSTable index metadata.

Reported name format:

**Metric Name**
    ``org.apache.cassandra.metrics.Index.{{MetricName}}.RowIndexEntry``

**JMX MBean**
    ``org.apache.cassandra.metrics:type=Index scope=RowIndexEntry name={{MetricName}}``

=========================== ============== ===========
Name                        Type           Description
=========================== ============== ===========
IndexedEntrySize            Histogram      Histogram of the on-heap size, in bytes, of the index across all SSTables.
IndexInfoCount              Histogram      Histogram of the number of on-heap index entries managed across all SSTables.
IndexInfoGets               Histogram      Histogram of the number index seeks performed per SSTable.
=========================== ============== ===========

BufferPool Metrics
^^^^^^^^^^^^^^^^^^

Metrics specific to the internal recycled buffer pool Cassandra manages.  This pool is meant to keep allocations and GC
lower by recycling on and off heap buffers.

Reported name format:

**Metric Name**
    ``org.apache.cassandra.metrics.BufferPool.{{MetricName}}``

**JMX MBean**
    ``org.apache.cassandra.metrics:type=BufferPool name={{MetricName}}``

=========================== ============== ===========
Name                        Type           Description
=========================== ============== ===========
Size                        Gauge<Long>    Size, in bytes, of the managed buffer pool
Misses                      Meter           The rate of misses in the pool. The higher this is the more allocations incurred.
=========================== ============== ===========


Client Metrics
^^^^^^^^^^^^^^

Metrics specifc to client managment.

Reported name format:

**Metric Name**
    ``org.apache.cassandra.metrics.Client.{{MetricName}}``

**JMX MBean**
    ``org.apache.cassandra.metrics:type=Client name={{MetricName}}``

=========================== ============== ===========
Name                        Type           Description
=========================== ============== ===========
connectedNativeClients      Counter        Number of clients connected to this nodes native protocol server
connectedThriftClients      Counter        Number of clients connected to this nodes thrift protocol server
=========================== ============== ===========

JMX
^^^

Any JMX based client can access metrics from cassandra.

If you wish to access JMX metrics over http it's possible to download `Mx4jTool <http://mx4j.sourceforge.net/>`__ and
place ``mx4j-tools.jar`` into the classpath.  On startup you will see in the log::

    HttpAdaptor version 3.0.2 started on port 8081

To choose a different port (8081 is the default) or a different listen address (0.0.0.0 is not the default) edit
``conf/cassandra-env.sh`` and uncomment::

    #MX4J_ADDRESS="-Dmx4jaddress=0.0.0.0"

    #MX4J_PORT="-Dmx4jport=8081"


Metric Reporters
^^^^^^^^^^^^^^^^

As mentioned at the top of this section on monitoring the Cassandra metrics can be exported to a number of monitoring
system a number of `built in <http://metrics.dropwizard.io/3.1.0/getting-started/#other-reporting>`__ and `third party
<http://metrics.dropwizard.io/3.1.0/manual/third-party/>`__ reporter plugins.

The configuration of these plugins is managed by the `metrics reporter config project
<https://github.com/addthis/metrics-reporter-config>`__. There is a sample configuration file located at
``conf/metrics-reporter-config-sample.yaml``.

Once configured, you simply start cassandra with the flag
``-Dcassandra.metricsReporterConfigFile=metrics-reporter-config.yaml``. The specified .yaml file plus any 3rd party
reporter jars must all be in Cassandra's classpath.
