<!--
  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.
-->
<html>
<head>
<title>Accumulo Metrics</title>
<link rel='stylesheet' type='text/css' href='documentation.css' media='screen'/>
</head>
<body>

<h1>Apache Accumulo Documentation : Metrics</h1>

As of version 1.2, metrics for the Master and Tablet Servers are available. A new configuration file, accumulo-metrics.xml, is located in the conf directory and can
be modified to turn metrics collection on or off, and to enable file logging if desired. This file can be modified at runtime and the changes will be seen after a few seconds.
Except where specified all time values are in milliseconds.
<h1>Master Metrics</h1>
<p>JMX Object Name: org.apache.accumulo.server.metrics:type=MasterMetricsMBean,name= &lt;current thread name&gt;</p>
<table>
	<thead>
		<tr><td>Method Name</td><td>Description</td></tr>
	</thead>
	<tbody>
		<tr class="highlight"><td>public long getPingCount();</td><td>Number of pings to tablet servers</td></tr>
		<tr><td>public long getPingAvgTime();</td><td>Average time for each ping</td></tr>
		<tr class="highlight"><td>public long getPingMinTime();</td><td>Minimum time for each ping</td></tr>
		<tr><td>public long getPingMaxTime();</td><td>Maximum time for each ping</td></tr>
		<tr class="highlight"><td>public String getTServerWithHighestPingTime();</td><td>tablet server with highest ping</td></tr>
		<tr><td>public void reset();</td><td>Resets all counters to zero</td></tr>
	</tbody>
</table>
<h1>Tablet Server Metrics</h1>
<p>JMX Object Name: org.apache.accumulo.server.metrics:type=TabletServerMBean,name= &lt;current thread name&gt;</p>
<table>
	<thead>
		<tr><td>Method Name</td><td>Description</td></tr>
	</thead>
	<tbody>
		<tr class="highlight"><td>public int getOnlineCount();</td><td>Number of tablets online</td></tr>
		<tr><td>public int getOpeningCount();</td><td>Number of tablets that are being opened</td></tr>
		<tr class="highlight"><td>public int getUnopenedCount();</td><td>Number or unopened tablets</td></tr>
		<tr><td>public int getMajorCompactions();</td><td>Number of Major Compactions currently running</td></tr>
		<tr class="highlight"><td>public int getMajorCompactionsQueued();</td><td>Number of Major Compactions yet to run</td></tr>
		<tr><td>public int getMinorCompactions();</td><td>Number of Minor Compactions currently running</td></tr>
		<tr class="highlight"><td>public int getMinorCompactionsQueued();</td><td>Number of Minor Compactions yet to run</td></tr>
		<tr><td>public int getShutdownStage();</td><td>Current stage in the shutdown process</td></tr>
		<tr class="highlight"><td>public long getEntries();</td><td>Number of entries in all the tablets</td></tr>
		<tr><td>public long getEntriesInMemory();</td><td>Number of entries in memory on all tablet servers</td></tr>
		<tr class="highlight"><td>public long getQueries();</td><td>Number of queries currently running on all the tablet servers</td></tr>
		<tr><td>public long getIngest();</td><td>Number of entries currently being ingested on all the tablet servers</td></tr>
		<tr class="highlight"><td>public long getTotalMinorCompactions();</td><td>Number of Minor Compactions completed</td></tr>
		<tr><td>public double getHoldTime();</td><td>Number of seconds that ingest is waiting for memory to be freed on tablet servers</td></tr>
		<tr class="highlight"><td>public String getName();</td><td>Address of the master</td></tr>
	</tbody>
</table>
<h1>Tablet Server Minor Compaction Metrics</h1>
<p>JMX Object Name: org.apache.accumulo.server.metrics:type=TabletServerMinCMetricsMBean,name= &lt;current thread name&gt;</p>
<table>
	<thead>
		<tr><td>Method Name</td><td>Description</td></tr>
	</thead>
	<tbody>
		<tr class="highlight"><td>public long getMinorCompactionCount();</td><td>Number of completed Minor Compactions on all tablet servers</td></tr>
		<tr><td>public long getMinorCompactionAvgTime();</td><td>Average time to complete Minor Compaction</td></tr>
		<tr class="highlight"><td>public long getMinorCompactionMinTime();</td><td>Minimum time to complete Minor Compaction</td></tr>
		<tr><td>public long getMinorCompactionMaxTime();</td><td>Maximum time to complete Minor Compaction</td></tr>
		<tr class="highlight"><td>public long getMinorCompactionQueueCount();</td><td>Number of Minor Compactions yet to be run</td></tr>
		<tr><td>public long getMinorCompactionQueueAvgTime();</td><td>Average time Minor Compaction is in the queue</td></tr>
		<tr class="highlight"><td>public long getMinorCompactionQueueMinTime();</td><td>Minimum time Minor Compaction is in the queue</td></tr>
		<tr><td>public long getMinorCompactionQueueMaxTime();</td><td>Maximum time Minor Compaction is in the queue</td></tr>
		<tr class="highlight"><td>public void reset();</td><td>Resets all counters to zero</td></tr>
	</tbody>
</table>
<h1>Tablet Server Scan Metrics</h1>
<p>JMX Object Name: org.apache.accumulo.server.metrics:type=TabletServerScanMetricsMBean,name= &lt;current thread name&gt;</p>
<table>
	<thead>
		<tr><td>Method Name</td><td>Description</td></tr>
	</thead>
	<tbody>
		<tr class="highlight"><td>public long getScanCount();</td><td>Number of scans completed</td></tr>
		<tr><td>public long getScanAvgTime();</td><td>Average time for scan operation</td></tr>
		<tr class="highlight"><td>public long getScanMinTime();</td><td>Minimum time for scan operation</td></tr>
		<tr><td>public long getScanMaxTime();</td><td>Maximum time for scan operation</td></tr>
		<tr class="highlight"><td>public long getResultCount();</td><td>Number of scans that returned a result</td></tr>
		<tr><td>public long getResultAvgSize();</td><td>Average size of scan result</td></tr>
		<tr class="highlight"><td>public long getResultMinSize();</td><td>Minimum size of scan result</td></tr>
		<tr><td>public long getResultMaxSize();</td><td>Maximum size of scan result</td></tr>
		<tr class="highlight"><td>public void reset();</td><td>Resets all counters to zero</td></tr>
	</tbody>
</table>
<h1>Tablet Server Update Metrics</h1>
<p>JMX Object Name: org.apache.accumulo.server.metrics:type=TabletServerUpdateMetricsMBean,name= &lt;current thread name&gt;</p>
<table>
	<thead>
		<tr><td>Method Name</td><td>Description</td></tr>
	</thead>
	<tbody>
		<tr class="highlight"><td>public long getPermissionErrorCount();</td><td>Number of permission errors</td></tr>
		<tr><td>public long getUnknownTabletErrorCount();</td><td>Number of unknown tablet errors</td></tr>
		<tr class="highlight"><td>public long getMutationArrayAvgSize();</td><td>Average size of mutation array</td></tr>
		<tr><td>public long getMutationArrayMinSize();</td><td>Minimum size of mutation array</td></tr>
		<tr class="highlight"><td>public long getMutationArrayMaxSize();</td><td>Maximum size of mutation array</td></tr>
		<tr><td>public long getCommitPrepCount();</td><td>Number of commit preparations</td></tr>
		<tr class="highlight"><td>public long getCommitPrepMinTime();</td><td>Minimum time for commit preparation</td></tr>
		<tr><td>public long getCommitPrepMaxTime();</td><td>Maximum time for commit preparatation</td></tr>
		<tr class="highlight"><td>public long getCommitPrepAvgTime();</td><td>Average time for commit preparation</td></tr>
		<tr><td>public long getConstraintViolationCount();</td><td>Number of constraint violations</td></tr>
		<tr class="highlight"><td>public long getWALogWriteCount();</td><td>Number of writes to the Write Ahead Log</td></tr>
		<tr><td>public long getWALogWriteMinTime();</td><td>Minimum time of a write to the Write Ahead Log</td></tr>
		<tr class="highlight"><td>public long getWALogWriteMaxTime();</td><td>Maximum time of a write to the Write Ahead Log</td></tr>
		<tr><td>public long getWALogWriteAvgTime();</td><td>Average time of a write to the Write Ahead Log</td></tr>
		<tr class="highlight"><td>public long getCommitCount();</td><td>Number of commits</td></tr>
		<tr><td>public long getCommitMinTime();</td><td>Minimum time for a commit</td></tr>
		<tr class="highlight"><td>public long getCommitMaxTime();</td><td>Maximum time for a commit</td></tr>
		<tr><td>public long getCommitAvgTime();</td><td>Average time for a commit</td></tr>
		<tr class="highlight"><td>public void reset();</td><td>Resets all counters to zero</td></tr>
	</tbody>
</table>
<h1>Thrift Server Metrics</h1>
<p>JMX Object Name: org.apache.accumulo.server.metrics:type=ThriftMetricsMBean,name= &lt;thread name&gt;</p>
<table>
	<thead>
		<tr><td>Method Name</td><td>Description</td></tr>
	</thead>
	<tbody>
		<tr class="highlight"><td>public long getIdleCount();</td><td>Number of times the Thrift server has been idle</td></tr>
		<tr><td>public long getIdleMinTime();</td><td>Minimum amount of time the Thrift server has been idle</td></tr>
		<tr class="highlight"><td>public long getIdleMaxTime();</td><td>Maximum amount of time the Thrift server has been idle</td></tr>
		<tr><td>public long getIdleAvgTime();</td><td>Average time the Thrift server has been idle</td></tr>
		<tr class="highlight"><td>public long getExecutionCount();</td><td>Number of calls processed by the Thrift server</td></tr>
		<tr><td>public long getExecutionMinTime();</td><td>Minimum amount of time executing method</td></tr>
		<tr class="highlight"><td>public long getExecutionMaxTime();</td><td>Maximum amount of time executing method</td></tr>
		<tr><td>public long getExecutionAvgTime();</td><td>Average time executing methods</td></tr>
		<tr class="highlight"><td>public void reset();</td><td>Resets all counters to zero</td></tr>
	</tbody>
</table>
</body>
</html>
