Machine Extensible Monitoring - Reporter
The Reporter part of the Maxon bundle. Use this tool to send information about your machine's current status and/or operations.
- PHP 7.1+
- PHP
pcntl,json,posix,curlextension enabled.
Convenient Oneliner™:
curl -LO https://github.com/mergado/maxon-reporter/raw/master/build/reporter && chmod +x reporter && ./reporter
Note: reporter executable will be downloaded into your current working directory.
- An
exampleconfiguration is located at./res/example.json. - Basic, example
gatherersare located in./res/gatherersdirectory. - Use the
./build/reporter(that's a compiled PHAR binary) to manage the whole damn thing.
Just run the reporter. It will keep running in the background.
./reporter
./reporter- Run the reporter in standard mode. This means:
- Use the configuration file located at default path
- Default config path is either
./config.jsonor./config/config.json.
- Default config path is either
- Display the first gathering and sending data to target URL(s).
- This is to see any potential problems with gatherers (or their output) or with the resulting HTTP request to the target URL(s)
- Daemonize.
- And keep running in background.
- Use the configuration file located at default path
- Run the reporter in standard mode. This means:
./reporter --try- Reporter will execute gatherers once and print out:
- Gathered data.
- The final JSON payload which is going to be sent to target URL(s).
- HTTP code(s) returned from request(s) to target URL(s).
- Reporter will execute gatherers once and print out:
./reporter --pid- Return the current running daemonized reporter's PID, if it exists.
./reporter --self-update- Performs self-update from online repository.
./reporter --config some_dir/some_config.json- Run the reporter as in standard mode (daemonize) - but use the configuration specified in the
some_dir/some_config.jsonfile.
- Run the reporter as in standard mode (daemonize) - but use the configuration specified in the
./reporter --interval 30- Run the reporter as in standard mode - but gather data each 30 seconds instead of default 5 seconds.
- The same as the one above, but daemonize the reporter and send it to background. Interval will be 5 seconds by default.
./reporter --help- Display available options.
An example.json configuration file is provided. Following fields are mandatory, unless specified otherwise:
targetfield: Either a string or array of strings. These strings are URLs where the reporter will send the result payload.gatherersfield: An array of gatherers to use. Use absolute paths or paths relative to your current working directory.env(optional) field: Environment variables which will then be available during a gatherer's execution.payloadfield: The template payload from which the resulting JSON will be constructed.
See below.
A gatherer is a script (program) that reports back some information about the current state of the machine (or whatever is needed). The script's shebang is honored, thus any language that supports it can be used to write a gatherer.
A gatherer is executed by the reporter. The gatherer's standard output is then parsed by the reporter as string in INI format and values (ie. variables) defined this way are then available to use in the payload template (which, again, is defined in the config file).
{
"target": [
"http://localhost/maxon-display/report"
"http://whatever.domain/i-dont-really-care/report"
],
"gatherers": [
"./gatherers/machine.sh",
"./gatherers_py/some_script.py",
],
"env": {
"SOME_ENV_VAR_XYZ": "this env var is available in gatherers",
},
"payload": {
"machine": {
"name": "some_machine",
"hostname": "${machine.hostname}",
"title": "Some Machine"
},
"fields": {
"machine.cpu.load_score": {
"title": "Load Score",
"type": "progress",
"value": "${100 * machine.cpu.load_score}",
"config": {
"min": 0,
"max": "300",
"warning": "120",
"alert": "150",
"unit": "%"
}
},
"machine.cpu.load_avg.1": {
"title": "Load AVG 1",
"type": "progress",
"value": "${machine.cpu.load_avg.1}",
"config": {
"min": 0,
"max": "${2 * machine.cpu.load_avg_max}",
"warning": "${1.2 * machine.cpu.load_avg_max}",
"alert": "${1.8 * machine.cpu.load_avg_max}"
}
}
}
}
}
If you implement your own gatherer (which is expected), you need to format its output like INI.
storage.number_of_directories=456
storage.number_of_files=1534
books.last_word_in_the_newest_book=Serendipity