telegraf/plugins/inputs/execd
Steven Soroka a34180459a Close stdin on exit in execd input 2020-02-28 13:58:56 -05:00
..
examples Add an exec daemon plugin (#4424) 2020-02-28 13:46:03 -05:00
README.md Close stdin on exit in execd input 2020-02-28 13:58:56 -05:00
execd.go Close stdin on exit in execd input 2020-02-28 13:58:56 -05:00
execd_unix.go Add an exec daemon plugin (#4424) 2020-02-28 13:46:03 -05:00
execd_win.go Add an exec daemon plugin (#4424) 2020-02-28 13:46:03 -05:00

README.md

Execd Input Plugin

The execd plugin runs an external program as a daemon. The programs must output metrics in any one of the accepted Input Data Formats on its standard output.

The signal can be configured to send a signal the running daemon on each collection interval.

Program output on standard error is mirrored to the telegraf log.

Configuration:

[[inputs.execd]]
  ## Program to run as daemon
  command = ["telegraf-smartctl", "-d", "/dev/sda"]

  ## Define how the process is signaled on each collection interval.
  ## Valid values are:
  ##   "none"    : Do not signal anything.
  ##              The process must output metrics by itself.
  ##   "STDIN"   : Send a newline on STDIN.
  ##   "SIGHUP"  : Send a HUP signal. Not available on Windows.
  ##   "SIGUSR1" : Send a USR1 signal. Not available on Windows.
  ##   "SIGUSR2" : Send a USR2 signal. Not available on Windows.
  signal = "none"

  ## Delay before the process is restarted after an unexpected termination
  restart_delay = "10s"

  ## Data format to consume.
  ## Each data format has its own unique set of configuration options, read
  ## more about them here:
  ## https://github.com/influxdata/telegraf/blob/master/docs/DATA_FORMATS_INPUT.md
  data_format = "influx"

Example

Daemon written in bash using STDIN signaling
#!/bin/bash

counter=0

while IFS= read -r LINE; do
    echo "counter_bash count=${counter}"
    let counter=counter+1
done
[[inputs.execd]]
  command = ["plugins/inputs/execd/examples/count.sh"]
  signal = "STDIN"
Go daemon using SIGHUP
package main

import (
    "fmt"
    "os"
    "os/signal"
    "syscall"
)

func main() {
    c := make(chan os.Signal, 1)
    signal.Notify(c, syscall.SIGHUP)

    counter := 0

    for {
        <-c

        fmt.Printf("counter_go count=%d\n", counter)
        counter++
    }
}

[[inputs.execd]]
  command = ["plugins/inputs/execd/examples/count.go.exe"]
  signal = "SIGHUP"
Ruby daemon running standalone
#!/usr/bin/env ruby

counter = 0

loop do
  puts "counter_ruby count=#{counter}"
  STDOUT.flush

  counter += 1
  sleep 1
end
[[inputs.execd]]
  command = ["plugins/inputs/execd/examples/count.rb"]
  signal = "none"