Compare commits

..

19 Commits

Author SHA1 Message Date
Patrick Stadler
4f28c79906
Merge pull request #7 from grimeyCH/systemd-compatibility
Systemd compatibility
2019-03-11 12:34:55 +01:00
Andreas Grimm
3fccd9615d Review part 2. 2019-03-11 09:27:09 +01:00
Andreas Grimm
2cca88ed8d Update from review. 2019-03-11 09:00:45 +01:00
Andreas Grimm
bc23216756 Link to systemd instruction 2019-02-25 14:13:19 +01:00
Andreas Grimm
8c5131c6ef chmod not necessary 2019-02-25 13:54:55 +01:00
Andreas Grimm
0533eb0ac8 Typos 2019-02-25 13:23:27 +01:00
Andreas Grimm
9023954f3f Readme update for systemd 2019-02-25 13:23:14 +01:00
Andreas Grimm
4f5ed15b98 Restart on exit/failure. 2019-02-25 13:22:53 +01:00
Andreas Grimm
2ed7792a20 Readme and nicer Unit 2019-02-21 18:17:45 +01:00
Andreas Grimm
3a2fff387d Systemd compatibility. 2019-02-20 17:27:02 +01:00
Patrick Stadler
be4039d647 Fix memory metric on *NIX 2017-10-09 14:54:57 +02:00
Patrick Stadler
636feccd7c update readme 2017-01-04 09:17:38 +01:00
Patrick Stadler
697b978d95 rename logentries.com reporter 2017-01-04 09:14:37 +01:00
Patrick Stadler
d8cd496543 Merge pull request #4 from seamusc/master
Logentries.com reporter
2017-01-04 09:14:08 +01:00
Seamus Cawley
215e50ecea Logentries.com reporter 2016-08-09 09:39:01 +01:00
Patrick Stadler
5c0962e12b remove unneeded variable 2016-02-23 09:39:15 +01:00
Patrick Stadler
85ee93aec3 fix update check 2015-12-02 10:20:16 +01:00
Patrick Stadler
3a9c155b7e fix potential word splitting problem 2015-12-02 10:16:06 +01:00
Patrick Stadler
81ca6e0e57 fix missing git error message 2015-12-02 10:11:10 +01:00
9 changed files with 104 additions and 32 deletions

View File

@ -39,6 +39,7 @@ $ git clone https://github.com/pstadler/metrics.sh.git
``` ```
See this [guide](init.d/README.md) how to run metrics.sh as a service on Linux. See this [guide](init.d/README.md) how to run metrics.sh as a service on Linux.
Or [here](systemd/README.md) for instructions to set metrics.sh up for systemd.
### Requirements ### Requirements
@ -60,7 +61,7 @@ Metric | Description
## Reporters ## Reporters
Reporter | Description Reporter | Description
--------------- | ------------- ---------------- | -------------
`stdout` | Write to standard out (default) `stdout` | Write to standard out (default)
`file` | Write to a file or named pipe `file` | Write to a file or named pipe
`udp` | Send data to any service via UDP `udp` | Send data to any service via UDP
@ -69,6 +70,7 @@ Reporter | Description
`prometheus` | Provide HTTP endpoint for [Prometheus](http://prometheus.io/) `prometheus` | Provide HTTP endpoint for [Prometheus](http://prometheus.io/)
`keen_io` | Send data to [Keen IO](https://keen.io) `keen_io` | Send data to [Keen IO](https://keen.io)
`stathat` | Send data to [StatHat](https://www.stathat.com) `stathat` | Send data to [StatHat](https://www.stathat.com)
`logentries_com` | Send data to [Logentries](https://logentries.com/)
## Configuration ## Configuration
@ -94,7 +96,7 @@ $ DISK_USAGE_MOUNTPOINT=/dev/vdb ./metrics.sh -m disk_usage
### Configuration files ### Configuration files
Maintaing all these options can become a cumbersome job, but metrics.sh provides functionality for creating and reading configuration files. Maintaining all these options can become a cumbersome job, but metrics.sh provides functionality for creating and reading configuration files.
```sh ```sh
$ ./metrics.sh -C > metrics.ini # write configuration to metrics.ini $ ./metrics.sh -C > metrics.ini # write configuration to metrics.ini
@ -151,7 +153,7 @@ defaults () {} # setting default variables
start () {} # called at the beginning start () {} # called at the beginning
collect () {} # collect the actual metric collect () {} # collect the actual metric
stop () {} # called before exiting stop () {} # called before exiting
docs () {} # used for priting docs and creating output for configuration docs () {} # used for printing docs and creating output for configuration
``` ```
Metrics run within an isolated scope. It's generally safe to create variables and helper functions within metrics. Metrics run within an isolated scope. It's generally safe to create variables and helper functions within metrics.
@ -214,7 +216,7 @@ defaults () {} # setting default variables
start () {} # called at the beginning start () {} # called at the beginning
report () {} # report the actual metric report () {} # report the actual metric
stop () {} # called before exiting stop () {} # called before exiting
docs () {} # used for priting docs and creating output for configuration docs () {} # used for printing docs and creating output for configuration
``` ```
Below is an example script for sending metrics as JSON data to an API endpoint. Assuming this script is located at `./reporters/custom/json_api.sh`, it can be invoked by calling `./metrics.sh -r json_api`. Below is an example script for sending metrics as JSON data to an API endpoint. Assuming this script is located at `./reporters/custom/json_api.sh`, it can be invoked by calling `./metrics.sh -r json_api`.
@ -230,7 +232,7 @@ defaults () {
} }
# Prepare the reporter. Create helper functions to be used during collection # Prepare the reporter. Create helper functions to be used during collection
# if needed. Returning 1 will result in an error and exection will be stopped. # if needed. Returning 1 will result in an error and execution will be stopped.
start () { start () {
if [ -z $JSON_API_ENDPOINT ]; then if [ -z $JSON_API_ENDPOINT ]; then
echo "Error: json_api requires \$JSON_API_ENDPOINT to be specified" echo "Error: json_api requires \$JSON_API_ENDPOINT to be specified"

View File

@ -1,7 +1,7 @@
#!/bin/sh #!/bin/sh
# load utils # load utils
for util in ./lib/utils/*.sh; do for util in ${DIR}/lib/utils/*.sh; do
. $util . $util
done done
@ -16,10 +16,10 @@ main_defaults () {
DEFAULT_REPORTER=stdout DEFAULT_REPORTER=stdout
fi fi
if [ -z $CUSTOM_REPORTERS_PATH ]; then if [ -z $CUSTOM_REPORTERS_PATH ]; then
CUSTOM_REPORTERS_PATH=./reporters/custom CUSTOM_REPORTERS_PATH=${DIR}/reporters/custom
fi fi
if [ -z $CUSTOM_METRICS_PATH ]; then if [ -z $CUSTOM_METRICS_PATH ]; then
CUSTOM_METRICS_PATH=./metrics/custom CUSTOM_METRICS_PATH=${DIR}/metrics/custom
fi fi
} }

View File

@ -2,7 +2,7 @@
get_available_reporters () { get_available_reporters () {
local result local result
for file in `ls ./reporters/*.sh $CUSTOM_REPORTERS_PATH/*.sh 2> /dev/null`; do for file in `ls ${DIR}/reporters/*.sh $CUSTOM_REPORTERS_PATH/*.sh 2> /dev/null`; do
local filename=$(basename $file) local filename=$(basename $file)
local reporter=${filename%.*} local reporter=${filename%.*}
result=$(echo "$result $reporter") result=$(echo "$result $reporter")
@ -12,7 +12,7 @@ get_available_reporters () {
get_available_metrics () { get_available_metrics () {
local result local result
for file in `ls ./metrics/*.sh $CUSTOM_METRICS_PATH/*.sh 2> /dev/null`; do for file in `ls ${DIR}/metrics/*.sh $CUSTOM_METRICS_PATH/*.sh 2> /dev/null`; do
local filename=$(basename $file) local filename=$(basename $file)
local metric=${filename%.*} local metric=${filename%.*}
# register metric # register metric
@ -26,7 +26,7 @@ load_reporter_with_prefix () {
local name=$2 local name=$2
local file local file
for dir in $CUSTOM_REPORTERS_PATH ./reporters; do for dir in $CUSTOM_REPORTERS_PATH ${DIR}/reporters; do
if [ -f $dir/$name.sh ]; then if [ -f $dir/$name.sh ]; then
file=$dir/$name.sh file=$dir/$name.sh
break break
@ -53,7 +53,7 @@ load_metric_with_prefix () {
local name=$2 local name=$2
local file local file
for dir in $CUSTOM_METRICS_PATH ./metrics; do for dir in $CUSTOM_METRICS_PATH ${DIR}/metrics; do
if [ -f $dir/$name.sh ]; then if [ -f $dir/$name.sh ]; then
file=$dir/$name.sh file=$dir/$name.sh
break break

View File

@ -4,6 +4,7 @@
LC_ALL=en_US.UTF-8 LC_ALL=en_US.UTF-8
LANG=en_US.UTF-8 LANG=en_US.UTF-8
LANGUAGE=en_US.UTF-8 LANGUAGE=en_US.UTF-8
DIR=$(dirname "$0")
usage () { usage () {
echo " Usage: $0 [-d] [-h] [-v] [-c] [-m] [-r] [-i] [-C] [-u]" echo " Usage: $0 [-d] [-h] [-v] [-c] [-m] [-r] [-i] [-C] [-u]"
@ -90,11 +91,11 @@ while [ $# -gt 0 ]; do
done done
# run # run
. ./lib/main.sh . ${DIR}/lib/main.sh
if [ $opt_do_update = true ]; then if [ $opt_do_update = true ]; then
if ! command_exists git; then if ! command_exists git; then
echo "Error: --update requires `git` to be in the PATH" echo "Error: --update requires 'git' to be in the PATH"
exit 1 exit 1
fi fi
echo "Fetching latest version..." echo "Fetching latest version..."
@ -125,7 +126,7 @@ fi
if [ -n "$opt_config_file" ]; then if [ -n "$opt_config_file" ]; then
verbose "Loading configuration file: $opt_config_file" verbose "Loading configuration file: $opt_config_file"
parse_config $opt_config_file parse_config "$opt_config_file"
if [ $? -ne 0 ]; then if [ $? -ne 0 ]; then
exit 1 exit 1
fi fi

View File

@ -13,8 +13,8 @@ if is_osx; then
} }
else else
collect () { collect () {
report $(free | awk '/buffers\/cache/ { report $(free | awk '/Mem:/ {
printf "%.1f", 100 - $4 / ($3 + $4) * 100.0 }') printf "%.1f", 100 - $4 / ($3 + $4) * 100}')
} }
fi fi

View File

@ -20,7 +20,6 @@ start () {
report () { report () {
local metric=$1 local metric=$1
local value=$2 local value=$2
local points
local data="$metric,$__influxdb_hostname value=$value" local data="$metric,$__influxdb_hostname value=$value"
curl -s -X POST $INFLUXDB_API_ENDPOINT --data-binary "$data" curl -s -X POST $INFLUXDB_API_ENDPOINT --data-binary "$data"
} }

View File

@ -0,0 +1,19 @@
#!/bin/sh
start () {
if [ -z $LOGENTRIES_TOKEN ]; then
echo "Error: logentries.com requires \$LOGENTRIES_TOKEN to be specified"
return 1
fi
}
report () {
local metric=$1 # the name of the metric, e.g. "cpu", "cpu_alias", "cpu.foo"
local value=$2 # int or float
echo "$LOGENTRIES_TOKEN $metric=$value" | nc data.logentries.com 10000
}
docs () {
echo "Send data to Logentries.com using token TCP (https://docs.logentries.com/docs/input-token)"
echo "LOGENTRIES_TOKEN=$LOGENTRIES_TOKEN"
}

40
systemd/README.md Normal file
View File

@ -0,0 +1,40 @@
# Running metrics.sh as a systemd service on Linux
Run the following commands as root:
```sh
# Install metrics.sh at /opt/metrics.sh
$ mkdir /opt; cd /opt
$ git clone https://github.com/pstadler/metrics.sh.git
$ cd metrics.sh
# Install the service
$ cp -p $PWD/systemd/metrics.sh.service /etc/systemd/system/metrics.sh.service
# Create a config file
$ mkdir /etc/metrics.sh && chmod 600 /etc/metrics.sh
$ ./metrics.sh -C > /etc/metrics.sh/metrics.ini
# At this point you should edit your config file at
# /etc/metrics.sh/metrics.ini
# Reload systemd daemon
$ systemctl daemon-reload
# Start service
$ systemctl start metrics.sh.service
# If run with the default configuration where reporter is 'stdout', metrics
# will be written to the journal. See the log using `journalctl -u metrics.sh`
# or follow it with:
$ journalctl -f -u metrics.sh
# Stop service
$ systemctl stop metrics.sh.service
# Check service status
$ systemctl status metrics.sh.service
# Automatically start service when booting and stop when shutting down
$ systemctl enable metrics.sh.service
# Disable automatic starting/stopping
$ systemctl disable metrics.sh.service
```

View File

@ -0,0 +1,11 @@
[Unit]
Description=Controls the metrics daemon "metrics.sh"
Documentation=https://github.com/pstadler/metrics.sh
After=network.target
[Service]
ExecStart=/opt/metrics.sh/metrics.sh -c /etc/metrics.sh/metrics.ini
Restart=always
[Install]
WantedBy=multi-user.target