> For the complete documentation index, see [llms.txt](https://docs.rumi.systems/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.rumi.systems/rumi-cli/commands/tools/hbdump.md).

# hbdump

The Heartbeats Dump Tool (`rumi tools hbdump`) reads a binary transaction log containing container heartbeats and writes them out in human-readable format.

This tool provides a low-overhead way to collect and analyze application statistics. Computing and tracing statistics from the running application process results in CPU overhead and garbage. As a lower cost alternative, Rumi can be configured to log its [container heartbeats to a transaction log](/rumi-core/guides/operating-applications/monitoring/container-heartbeats.md#configuring-heartbeats), and this tool can be used to compute and trace the binary stats in a separate process (possibly on another host).

## Overview

Each heartbeat message includes the following statistics:

**System Stats:**

* Basic information - Server/hostname and process PID
* GC stats - Heap size and collection time
* JIT Information
* System load average
* Thread count
* Thread stats
* Pool stats

**Application Stats:**

* Engine
* User stats
* Event Multiplexer
* Store binding
* Store binding persister
* Store binding ICR sender
* Bus binding stats

Rumi allows fairly granular control over which portions of the above stats are collected to provide the ability to control the associated overhead with collecting them. See [Engine Stats](/rumi-core/guides/operating-applications/monitoring/engine-statistics.md) for information on enabling collection of these statistics.

## Basic Usage

{% hint style="info" %}
**Requirement**: In order to use this tool, [Binary Heartbeat Logging](/rumi-core/guides/operating-applications/monitoring/container-heartbeats.md#configuring-heartbeats) must have been enabled on the application in question. Even if you have enabled stats collection, but did not enable the heartbeat logging, you will not be able to retrieve said statistics at a later date.
{% endhint %}

**Syntax:**

```bash
rumi tools hbdump [options] <transactionLog>
```

**Options:**

```
-h, --help              Displays help message
-o, --outFile <file>    Name of output file (default: 'stats.txt')
-s, --startDate <date>  Start date of the query (yyyy-MM-dd HH:mm:ss)
-e, --endDate <date>    End date of the query (yyyy-MM-dd HH:mm:ss)
<transactionLog>        Path of the stats transaction log to read
```

## Querying Records Within a Time Range

You can query for records in a time range by specifying --startDate or --endDate or both:

* If **only --startDate is specified**, stats records are dumped from startDate until the end of the file is reached
* If **only --endDate is specified**, stats records are dumped from beginning of the file until the endDate
* If **both --startDate and --endDate are specified**, stats are dumped between the given start and end dates

The format for specifying the timestamps used with --startDate and --endDate is **yyyy-MM-dd HH:mm:ss**.

{% hint style="info" %}
**Tip**: Be careful when specifying these timestamps! Leading/trailing spaces or additional spaces between date and time block might cause them to not be parsed correctly.
{% endhint %}

## Examples

### All Records

Here is the output of running the heartbeats dump tool on a sample transaction log file:

```bash
rumi tools hbdump /path/to/statsdumptest.log
```

Output:

```
<10,2224,host> 20160218-20:59:34:555 (inf)...[RogLog->'statsdumptest'] Live transaction log file is 'statsdumptest.log'...
<10,2224,host> 20160218-20:59:34:696 (inf)...[RogLog->'statsdumptest'] Scavenging old log files....
<10,2224,host> 20160218-20:59:34:700 (inf)...[RogLog->'statsdumptest'] ....scavenged 0 files (0 failed).

Writing 2619 records to /path/to/stats.txt

Done ...
```

The output shows that the tool has read 2,619 records and written them to the output file (*stats.txt*). Note that the output file is created in the same directory as the input file.

### All Records Within a Date Range

Here is an example of how using --startDate can be used to filter out records:

```bash
rumi tools hbdump /path/to/statsdumptest.log --startDate "2016-01-26 00:00:00"
```

Output:

```
<10,11784,host> 20160218-21:46:02:211 (inf)...[RogLog->'statsdumptest'] Live transaction log file is 'statsdumptest.log'...
<10,11784,host> 20160218-21:46:02:297 (inf)...[RogLog->'statsdumptest'] Scavenging old log files....
<10,11784,host> 20160218-21:46:02:300 (inf)...[RogLog->'statsdumptest'] ....scavenged 0 files (0 failed).

Writing 99 records to /path/to/stats.txt

Done ...
```

Notice that because we specified --startDate here, only 99 records are written (of the 2,619 records in the transaction log).

You can further filter records by specifying a time range with a particular --startDate and --endDate. In the example below we are querying records starting between "2016-01-27 00:00:00" and "2016-01-27 01:26:39":

```bash
rumi tools hbdump /path/to/statsdumptest.log \
  --startDate "2016-01-27 00:00:00" \
  --endDate "2016-01-27 01:26:39"
```

Output:

```
<10,8248,host> 20160218-22:25:06:957 (inf)...[RogLog->'statsdumptest'] Live transaction log file is 'statsdumptest.log'...
<10,8248,host> 20160218-22:25:07:043 (inf)...[RogLog->'statsdumptest'] Scavenging old log files....
<10,8248,host> 20160218-22:25:07:046 (inf)...[RogLog->'statsdumptest'] ....scavenged 0 files (0 failed).
Writing 8 records to /path/to/stats.txt

Done ...
```

Notice only 8 records are written to the output file.

## Related Topics

* [Container Heartbeats](/rumi-core/guides/operating-applications/monitoring/container-heartbeats.md) - Configure heartbeat logging
* [Engine Stats](/rumi-core/guides/operating-applications/monitoring/engine-statistics.md) - Engine metrics collected in heartbeats
* [Exposing Application Stats](/rumi-core/guides/developing-applications/authoring-user-code/monitoring/exposing-application-statistics.md) - Custom statistics included in heartbeats

## Next Steps

1. Enable binary heartbeat logging in your container configuration
2. Run your application and collect heartbeat data
3. Use Heartbeats Dump Tool to convert binary logs to human-readable format
4. Analyze statistics to identify performance trends or issues


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.rumi.systems/rumi-cli/commands/tools/hbdump.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
