# Expose Custom Metrics

By default PM2 Plus will add some metrics into your application, but it’s not always enough.

`@pm2/io` is the library that will help you add custom metrics to monitor the critical parts of your application.

## Create a custom metrics

You can create a custom metrics with the method `metric()` of `@pm2/io`.

```
const io = require('@pm2/io')

const realtimeUser = io.metric({
  name: 'Realtime user',
})

realtimeUser.set(42)
```

This arguments are available:

- **name**: A easy to understand name to be shown in the UI  
- **id**: A unique identifier for the metric  
- **unit**: Unit of measure for the metric  
- **historic**: keep the history in PM2 Plus (default: true)

The type corresponds to one of the 4 ways to gather metrics:

- **metric**: To expose a variable’s value  
- **counter**: A discrete counter to be triggered manually to increase or decrease a number  
- **meter**: To measure a frequency, a number of occurrences of a repeating event per unit of time  
- **histogram**: To measure a statistic, a statistic on a metric over the last hour

## Metric

In active mode, you need to save the return of the `metric` method. This will give you an object that has the method `set()`. Use this method to update the value of the metric.

```
const realtimeUsers = io.metric({
  name: 'Realtime Users',
  id: 'app/realtime/users',
})

realtimeUsers.set(23)
```

## Counter

The second type of metric, called `counter`, is a discrete counter that helps you count the number of occurrence of a particular event. The counter starts at 0 and can be incremented or decremented.

```
const io = require('@pm2/io');

const currentReqs = io.counter({
  name: 'Realtime request count',
  id: 'app/realtime/requests'
});

http.createServer((req, res) => {
  // Increment the counter, counter will eq 1
  currentReqs.inc();
  req.on('end', () => {
    // Decrement the counter, counter will eq 0
    currentReqs.dec();
  });
});
```

## Meter

The third type of metric, called `meter`, computes the frequency of an event. Each time the event happens, you need to call the `mark()` method. By default, the frequency is the number of events per second over the last minute.

```
const io = require('@pm2/io')

const reqsec = io.meter({
  name: 'req/sec',
  id: 'app/requests/volume'
})

http.createServer((req, res) => {
  reqsec.mark()
  res.end({ success: true })
})
```

## Histogram

This last type of metric collects values and provides statistic tools to explore their distribution over the last hour.
By default it will use the `mean` (`percentile 50`) of the last hour but you can choose between:

- min, max, sum, count, variance, mean, stddev, median, p75, p95, p99, p99.

```
const io = require('@pm2/io')

const latency = io.metric({
  name: 'latency',
  type: 'histogram',
  measurement: 'mean'
});

let latencyValue = 0;

setInterval(() => {
  latencyValue = Math.round(Math.random() * 100);
  latency.set(latencyValue);
}, 100);
```

## Next Steps

[Custom Action Center](https://pm2.io/docs/plus/guide/custom-actions/)
