---
title: Cacti
description: Forward your Cacti RRDs to Datadog for richer alerting and beautiful graphing.
breadcrumbs: Docs > Integrations > Cacti
---

# Cacti
Supported OS Integration version4.5.0
## Overview{% #overview %}

Get metrics from Cacti in real time to:

- Visualize and monitor Cacti states.
- Be notified about Cacti failovers and events.

**Minimum Agent version:** 6.0.0

## Setup{% #setup %}

### Installation{% #installation %}

The Cacti check is included in the [Datadog Agent](https://app.datadoghq.com/account/settings/agent/latest) package, to start gathering metrics you first need to:

1. Install `librrd` headers and libraries.
1. Install Python bindings to `rrdtool`.

#### Headers and libraries{% #headers-and-libraries %}

On Debian/Ubuntu:

```shell
sudo apt-get install librrd-dev
```

On RHEL/CentOS:

```shell
sudo yum install rrdtool-devel
```

#### Python bindings{% #python-bindings %}

Add the `rrdtool` Python package to the Agent with the following command:

```shell
sudo -u dd-agent /opt/datadog-agent/embedded/bin/pip install rrdtool
```

### Configuration{% #configuration %}

#### Create a Datadog user{% #create-a-datadog-user %}

1. Create a Datadog user with read-only rights to the Cacti database.

   ```shell
   sudo mysql -e "create user 'datadog'@'localhost' identified by '<MYSQL_PASSWORD>';"
   sudo mysql -e "grant select on cacti.* to 'datadog'@'localhost';"
   ```

1. Check the user and rights:

   ```shell
   mysql -u datadog --password=<MYSQL_PASSWORD> -e "show status" | \
   grep Uptime && echo -e "\033[0;32mMySQL user - OK\033[0m" || \
   echo -e "\033[0;31mCannot connect to MySQL\033[0m"
   
   mysql -u datadog --password=<MYSQL_PASSWORD> -D cacti -e "select * from data_template_data limit 1" && \
   echo -e "\033[0;32mMySQL grant - OK\033[0m" || \
   echo -e "\033[0;31mMissing SELECT grant\033[0m"
   ```

1. Give the `datadog-agent` user access to the RRD files:

   ```shell
   sudo gpasswd -a dd-agent www-data
   sudo chmod -R g+rx /var/lib/cacti/rra/
   sudo su - datadog-agent -c 'if [ -r /var/lib/cacti/rra/ ];
   then echo -e "\033[0;31mdatadog-agent can read the RRD files\033[0m";
   else echo -e "\033[0;31mdatadog-agent can not read the RRD files\033[0m";
   fi'
   ```

#### Configure the Agent{% #configure-the-agent %}

1. Configure the Agent to connect to MySQL, edit your `cacti.d/conf.yaml` file. See the [sample cacti.d/conf.yaml](https://github.com/DataDog/integrations-core/blob/master/cacti/datadog_checks/cacti/data/conf.yaml.example) for all available configuration options:

   ```yaml
   init_config:
   
   instances:
     ## @param mysql_host - string - required
     ## url of your MySQL database
     #
     - mysql_host: "localhost"
   
       ## @param mysql_port - integer - optional - default: 3306
       ## port of your MySQL database
       #
       # mysql_port: 3306
   
       ## @param mysql_user - string - required
       ## User to use to connect to MySQL in order to gather metrics
       #
       mysql_user: "datadog"
   
       ## @param mysql_password - string - required
       ## Password to use to connect to MySQL in order to gather metrics
       #
       mysql_password: "<MYSQL_PASSWORD>"
   
       ## @param rrd_path - string - required
       ## The Cacti checks requires access to the Cacti DB in MySQL and to the RRD
       ## files that contain the metrics tracked in Cacti.
       ## In almost all cases, you'll only need one instance pointing to the Cacti
       ## database.
       ## The `rrd_path` will probably be `/var/lib/cacti/rra` on Ubuntu
       ## or `/var/www/html/cacti/rra` on any other machines.
       #
       rrd_path: "<CACTI_RRA_PATH>"
   ```

1. [Restart the Agent](https://docs.datadoghq.com/agent/guide/agent-commands.md#start-stop-and-restart-the-agent).

### Validation{% #validation %}

[Run the Agent's status subcommand](https://docs.datadoghq.com/agent/guide/agent-commands.md#agent-status-and-information) and look for `cacti` under the Checks section.

## Data Collected{% #data-collected %}

### Metrics{% #metrics %}

|  |
|  |
| **cacti.hosts.count**(gauge)         | The number of hosts monitored by Cacti*Shown as host*                                |
| **cacti.metrics.count**(gauge)       | The number of metrics collected from Cacti                                           |
| **cacti.rrd.count**(gauge)           | The number of Cacti RRD files*Shown as file*                                         |
| **system.disk.free.last**(gauge)     | The amount of disk space that is free - last polling value*Shown as byte*            |
| **system.disk.free.max**(gauge)      | The amount of disk space that is free - max polling value*Shown as byte*             |
| **system.disk.free.min**(gauge)      | The amount of disk space that is free - min polling value*Shown as byte*             |
| **system.disk.used.last**(gauge)     | The amount of disk space that is used - last polling value*Shown as byte*            |
| **system.disk.used.max**(gauge)      | The amount of disk space that is used - max polling value*Shown as byte*             |
| **system.disk.used.min**(gauge)      | The amount of disk space that is used - min polling value*Shown as byte*             |
| **system.load.1.last**(gauge)        | The average system load over one minute - last polling value                         |
| **system.load.1.max**(gauge)         | The average system load over one minute - max polling value                          |
| **system.load.1.min**(gauge)         | The average system load over one minute - min polling value                          |
| **system.load.15.last**(gauge)       | The average system load over 15 minute - last polling value                          |
| **system.load.15.max**(gauge)        | The average system load over 15 minute - max polling value                           |
| **system.load.15.min**(gauge)        | The average system load over 15 minute - min polling value                           |
| **system.load.5.last**(gauge)        | The average system load over five minute - last polling value                        |
| **system.load.5.max**(gauge)         | The average system load over five minute - max polling value                         |
| **system.load.5.min**(gauge)         | The average system load over five minute - min polling value                         |
| **system.mem.buffered.last**(gauge)  | The amount of physical RAM used for file buffers - last polling value*Shown as byte* |
| **system.mem.buffered.max**(gauge)   | The amount of physical RAM used for file buffers - max polling value*Shown as byte*  |
| **system.mem.buffered.min**(gauge)   | The amount of physical RAM used for file buffers - min polling value*Shown as byte*  |
| **system.ping.latency**(gauge)       | The system ping latency - avg polling value*Shown as millisecond*                    |
| **system.ping.latency.max**(gauge)   | The system ping latency - max polling value*Shown as millisecond*                    |
| **system.proc.running.last**(gauge)  | The number of processes running - last polling value*Shown as process*               |
| **system.proc.running.max**(gauge)   | The number of processes running - max polling value*Shown as process*                |
| **system.proc.running.min**(gauge)   | The number of processes running - min polling value*Shown as process*                |
| **system.swap.free.max**(gauge)      | The amount of free swap space - max polling value*Shown as byte*                     |
| **system.users.current.last**(gauge) | The number of logged in users - last polling value                                   |
| **system.users.current.max**(gauge)  | The number of logged in users - max polling value                                    |
| **system.users.current.min**(gauge)  | The number of logged in users - min polling value                                    |

### Log collection{% #log-collection %}

1. Collecting logs is disabled by default in the Datadog Agent, enable it in your `datadog.yaml` file:

   ```yaml
   logs_enabled: true
   ```

1. Add this configuration block to your `cacti.d/conf.yaml` file to start collecting your Cacti logs:

   ```yaml
   logs:
     - type: file
       path: /opt/cacti/log/cacti.log
       source: cacti
   ```

Change the `path` parameter value based on your environment. See the [sample cacti.d/conf.yaml](https://github.com/DataDog/integrations-core/blob/master/cacti/datadog_checks/cacti/data/conf.yaml.example) for all available configuration options.

1. [Restart the Agent](https://docs.datadoghq.com/agent/guide/agent-commands.md#start-stop-and-restart-the-agent).

### Events{% #events %}

The Cacti check does not include any events.

### Service Checks{% #service-checks %}

The Cacti check does not include any service checks.

## Troubleshooting{% #troubleshooting %}

### Known issues{% #known-issues %}

The Python library used by this integration leaks memory under certain circumstances. If you experience this, one workaround is to install the [python-rrdtool](https://github.com/pbanaszkiewicz/python-rrdtool) package instead of rrdtool. This older package is not maintained and is not officially supported by this integration but it has helped others resolve the memory issues.

A [Github issue](https://github.com/commx/python-rrdtool/issues/25) has been opened to track this memory leak.

Need help? Contact [Datadog support](https://docs.datadoghq.com/help/).
