---
title:  Application-Defined and Custom Statistics
---

<!--
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.
-->

<%=vars.product_name%> includes interfaces for defining and maintaining your own statistics.

<a id="application_defined_statistics__section_88C31FA62A194947BF71AD54B5F9BAB3"></a>
The <%=vars.product_name%> package, `org.apache.geode`, includes the following interfaces for defining and maintaining your own statistics:

-   **StatisticDescriptor**. Describes an individual statistic. Each statistic has a name and information on the statistic it holds, such as its class type (long, int, etc.) and whether it is a counter that always increments, or a gauge that can vary in any manner.
-   **StatisticsType**. Logical type that holds a list of `StatisticDescriptors` and provides access methods to them. The `StatisticDescriptors` contained by a `StatisticsType` are each assigned a unique ID within the list. `StatisticsType` is used to create a `Statistics` instance.
-   **Statistics**. Instantiation of an existing `StatisticsType` object with methods for setting, incrementing, getting individual `StatisticDescriptor` values, and setting a callback which will recompute the statistic's value at configured sampling intervals.
-   **StatisticsFactory**. Creates instances of `Statistics`. You can also use it to create instances of `StatisticDescriptor` and `StatisticsType`, because it implements `StatisticsTypeFactory`. `DistributedSystem` is an instance of `StatisticsFactory`.
-   **StatisticsTypeFactory**. Creates instances of `StatisticDescriptor` and `StatisticsType`.

The statistics interfaces are instantiated using statistics factory methods that are included in the package. For coding examples, see the online Java API documentation for `StatisticsFactory` and `StatisticsTypeFactory`.

As an example, an application server might collect statistics on each client session in order to
gauge whether client requests are being processed in a satisfactory manner. Long request queues or
long server response times could prompt some capacity-management action such as starting additional
application servers. To set this up, each session-state data point is identified and defined in a
`StatisticDescriptor` instance. One instance might be a `RequestsInQueue` gauge, a non-negative
integer that increments and decrements. Another could be a `RequestCount` counter, an integer that
always increments. A list of these descriptors is used to instantiate a `SessionStateStats`
`StatisticsType`. When a client connects, the application server uses the `StatisticsType` object to
create a session-specific `Statistics` object. The server then uses the `Statistics` methods to
modify and retrieve the client’s statistics. The figures below illustrate the relationships between the
statistics interfaces and show the implementation of this use case.

<img src="../../images/Statistics-interfaces.png" class="image" />

*The Statistics Interfaces*

Each `StatisticDescriptor` contains one piece of statistical information. `StatisticalDesriptor` objects
are collected into a `StatisticsType`. The `StatisticsType` is instantiated to create a `Statistics`
object.

<img src="../../images/Statistics-implementation.png" class="image" />

*Statistics Implementation*

The `StatisticDescriptor` objects shown here hold three pieces of statistical information about client
session state. These are collected into a `SessionStateStats StatisticsType`. With this type, the
server creates a `Statistics` object for each client that connects.


