---
title:  Configuring and Using 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.
-->

You can configure statistics and statistics archiving in several ways.

## <a id="setting_up_statistics__section_215BB4074BD64834BAADA87BE84C34DE" class="no-quick-link"></a>Configure Cluster or Server Statistics

In this procedure it is assumed that you understand [Basic Configuration and Programming](../../basic_config/book_intro.html).

Execute the following commands to modify the cluster's configuration and enable cluster or server statistics.

``` pre
gfsh>start locator --name=l1 --enable-cluster-configuration=true
gfsh>alter runtime --enable-statistics=true -–statistic-archive-file=myStatisticsArchiveFile.gfs
```

Note that an empty value of `statistics-archive-file` still calculates statistics, but they are not archived to a file.

You can also configure sample rate and the filename of your statistic archive files. See [alter runtime](../../tools_modules/gfsh/command-pages/alter.html#topic_7E6B7E1B972D4F418CB45354D1089C2B) for more command options.

Alternately, if you are not using the cluster configuration service, configure `gemfire.properties` for the statistics monitoring and archiving that you need:

1.  Enable statistics gathering for the cluster. This is required for all other statistics activities:

    ``` pre
    statistic-sampling-enabled=true
    statistic-archive-file=myStatisticsArchiveFile.gfs
    ```

    **Note:**
    Statistics sampling at the default sample rate (1000 milliseconds) does not impact system performance and is recommended in production environments for troubleshooting.

2.  Change the statistics sample rate as needed. Example:

    ``` pre
    statistic-sampling-enabled=true
    statistic-archive-file=myStatisticsArchiveFile.gfs
    statistic-sample-rate=2000
    ```

3.  To archive the statistics to disk, enable that and set any file or disk space limits that you need. Example:

    ``` pre
    statistic-sampling-enabled=true
    statistic-archive-file=myStatisticsArchiveFile.gfs
    archive-file-size-limit=100
    archive-disk-space-limit=1000
    ```

4.  If you need time-based statistics, enable that. Time-based statistics require statistics sampling and archiving. Example:

    ``` pre
    statistic-sampling-enabled=true
    statistic-archive-file=myStatisticsArchiveFile.gfs
    enable-time-statistics=true
    ```

    **Note:**
    Time-based statistics can impact system performance and are not recommended for production environments.

If these statistics are on, you are able to access archived statistics through the `gfsh show metrics` command.


## <a id="setting_up_statistics__section_region_level" class="no-quick-link"></a>Configure Transient Region and Entry Statistics

Enable transient region and entry statistics gathering on the regions where you need them. This configuration is distinct from the enabling of cluster or server statistics.

**gfsh example:**

``` pre
gfsh>create region --name=myRegion --type=REPLICATE --enable-statistics=true
```

**cache.xml example:**

``` pre
<region name="myRegion" refid="REPLICATE">
<region-attributes statistics-enabled="true">
</region-attributes>
</region>
```

**API example:**

**Note:**
Region and entry statistics are not archived and can be accessed only through the API. As needed, retrieve region and entry statistics through the `getStatistics` methods of the `Region` and `Region.Entry` objects. Example:

``` pre
out.println("Current Region:\n\t" + this.currRegion.getName());
RegionAttributes attrs = this.currRegion.getAttributes();
  if (attrs.getStatisticsEnabled()) {
      CacheStatistics stats = this.currRegion.getStatistics();
      out.println("Stats:\n\tHitCount is " + stats.getHitCount() +
          "\n\tMissCount is " + stats.getMissCount() +
          "\n\tLastAccessedTime is " + stats.getLastAccessedTime() +
          "\n\tLastModifiedTime is " + stats.getLastModifiedTime());
  }
```

## <a id="setting_up_statistics__section_custom_level" class="no-quick-link"></a> Configure Custom Statistics

Create and manage any custom statistics that you need through `cache.xml` and the API.

**cache/cluster.xml example:**

``` pre
// Create custom statistics
<?xml version="1.0" encoding="UTF-8"?>
  <!DOCTYPE statistics PUBLIC
    "-//Example Systems, Inc.//Example Statistics Type//EN"
    "http://www.example.com/dtd/statisticsType.dtd">
  <statistics>
    <type name="StatSampler">
      <description>Stats on the statistic sampler.</description>
      <stat name="sampleCount" storage="int" counter="true">
	<description>Total number of samples taken by this sampler.</description>
	<unit>samples</unit>
      </stat>
      <stat name="sampleTime" storage="long" counter="true">
	<description>Total amount of time spent taking samples.</description>
	<unit>milliseconds</unit>
      </stat>
    </type>
</statistics>
```

**API example:**

``` pre
// Update custom stats through the API
this.samplerStats.incInt(this.sampleCountId, 1);
this.samplerStats.incLong(this.sampleTimeId, nanosSpentWorking / 1000000);
```


## <a id="setting_up_statistics__section_D511BB61B27A44749E2012B066A5C906" class="no-quick-link"></a>Controlling the Size of Archive Files

You can specify limits on the archive files for statistics using the gfsh `alter runtime` command. These are the areas of control:

-   **Archive File Growth Rate**.
    -   The `--statistic-sample-rate` parameter controls how often samples are taken, which affects the speed at which the archive file grows.
    -   The `--statistic-archive-file` parameter controls whether the statistics files are compressed. If you give the file name a `.gz` suffix, it is compressed, thereby taking up less disk space.
-   **Maximum Size of a Single Archive File**. If the value of the `--archive-file-size-limit` is greater than zero, a new archive is started when the size of the current archive exceeds the limit. Only one archive can be active at a time.
    **Note:**
    If you modify the value of `--archive-file-size-limit` while the cluster is running, the new value does not take effect until the current archive becomes inactive (that is, when a new archive is started).

-   **Maximum Size of All Archive Files**. The `--archive-disk-space-limit` parameter controls the maximum size of all inactive archive files combined. By default, the limit is set to 0, meaning that archive space is unlimited. Whenever an archive becomes inactive or when the archive file is renamed, the combined size of the inactive files is calculated. If the size exceeds the `--archive-disk-space-limit`, the inactive archive with the oldest modification time is deleted. This continues until the combined size is less than the limit. If `--archive-disk-space-limit` is less than or equal to `--archive-file-size-limit`, when the active archive is made inactive due to its size, it is immediately deleted.

**Note:**
    If you modify the value of `--archive-disk-space-limit` while the cluster is running, the new value does not take effect until the current archive becomes inactive.
