blob: 99f60bc54a6a516578fccfbc6a8a01451e2e9380 [file] [log] [blame] [view] [edit]
# Heartd (Health Ensure and Accident Resolve Treatment)
`heartd` stands for "Health Ensure and Accident Resolve Treatment". It provides
the following functionalities:
- An interface for other apps or services to send heartbeat to us. When there is
missing heartbeat, it takes corresponding actions to restore the device.
- Actively collect data or passively receive data from other services. We may
use this to analyze the device health and take necessary action if needed.
System-wise problem (e.g. kernel hang) is not handled by `heartd`, it's resolved
by others like CPU lock up detector, daisydog, etc.
[TOC]
## How to start the service
This service is not running by default. It's a D-Bus service in current
implementation. To start up, you have to send the signal to D-Bus and then it
starts running.
The following is an example to show how to run it in command line.
```
(DUT) $ dbus-send --system --type=signal --dest=org.chromium.Heartd
/org/chromium/Heartd org.chromium.Heartd
```
If you are able to control the upstart job, you can simply run it up by `start
heartd`.
## How to register the heartbeat service
Using the service is simple.
However, to add a new service name (in step 4), we need to add it into the mojo
interface and this needs a security review. So please reach out to the OWNER as
early as possible.
1. Add dependency.
- For clients in ash Chrome: Add the following into your dependency.
- `//chromeos/ash/services/heartd/public/mojom`
- `//chromeos/ash/components/mojo_service_manager`
- For clients in platform: Add the following dependency in your ebuild.
- `chromeos-base/heartd:=`
- `chromeos-base/mojo_service_manager:=`
2. Create an object whose life cycle is equal to or larger than your service or
app. Add mojo remote as the object members. For example:
- `mojo::Remote<ash::heartd::mojom::HeartbeatService> hb_remote_;`
- `mojo::Remote<ash::heartd::mojom::HeartdControl> heartd_control_remote_;`
- `mojo::Remote<ash::heartd::mojom::Pacemaker> pacemaker_;`
3. Request the remote through mojo service manager.
```
#include "chromeos/ash/components/mojo_service_manager/connection.h"
mojo_service_manager::GetServiceManagerProxy()->Request(
chromeos::mojo_services::kHeartdHeartbeatService, std::nullopt,
hb_remote_.BindNewPipeAndPassReceiver().PassPipe());
mojo_service_manager::GetServiceManagerProxy()->Request(
chromeos::mojo_services::kHeartdControl, std::nullopt,
heartd_control_remote_.BindNewPipeAndPassReceiver().PassPipe());
```
4. Register the heartbeat service.
```
ash::heartd::mojom::HeartbeatServiceArgument argument;
// Set up argument.
// ...
hb_remote_->Register(ash::heartd::mojom::ServiceName::kServiceName,
std::move(argument),
pacemaker_.BindNewPipeAndPassReceiver(),
callback);
```
5. Start sending heartbeat.
```
pacemaker_->SendHeartbeat(callback);
```
## Links
1. [Design Doc](http://go/cros-heartd)