introduce timestamps to file content and path

new parameter to allow timestamp prefix to each line in file.  Also, add
ability to introduce time parameters in path and file name.  Will also
create missing directories if required.
This commit is contained in:
silverboots 2016-06-18 21:04:41 +01:00
parent af0979cce5
commit 7ba58e134d
1 changed files with 51 additions and 4 deletions

View File

@ -4,6 +4,8 @@ import (
"fmt"
"io"
"os"
"strings"
"time"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/plugins/outputs"
@ -13,6 +15,8 @@ import (
type File struct {
Files []string
Timestamp bool
writer io.Writer
closers []io.Closer
@ -23,6 +27,9 @@ var sampleConfig = `
## Files to write to, "stdout" is a specially handled file.
files = ["stdout", "/tmp/metrics.out"]
## Prefix each output line with timestamp
timestamp = true
## Data format to output.
## Each data format has it's own unique set of configuration options, read
## more about them here:
@ -48,13 +55,24 @@ func (f *File) Connect() error {
} else {
var of *os.File
var err error
if _, err := os.Stat(file); os.IsNotExist(err) {
of, err = os.Create(file)
generatedFile := generateFileName(file)
fmt.Printf("writing to output file [%s]", generatedFile)
if _, err := os.Stat(generatedFile); os.IsNotExist(err) {
// create directory f it doesn't exist
lastSlash := strings.LastIndex(generatedFile, "/")
if lastSlash != -1 {
err = os.MkdirAll(generatedFile[:lastSlash], os.ModeDir)
}
// create file if it doesn't exist
if err == nil {
of, err = os.Create(generatedFile)
}
} else {
of, err = os.OpenFile(file, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
of, err = os.OpenFile(generatedFile, os.O_APPEND|os.O_WRONLY, os.ModeAppend)
}
if err != nil {
fmt.Errorf("Failed to initialise file [%s] [%s]", generatedFile, err)
return err
}
writers = append(writers, of)
@ -91,6 +109,12 @@ func (f *File) Write(metrics []telegraf.Metric) error {
return nil
}
prefix := ""
if f.Timestamp {
t := time.Now().UTC()
prefix = t.Format(time.RFC3339) + " "
}
for _, metric := range metrics {
values, err := f.serializer.Serialize(metric)
if err != nil {
@ -98,7 +122,7 @@ func (f *File) Write(metrics []telegraf.Metric) error {
}
for _, value := range values {
_, err = f.writer.Write([]byte(value + "\n"))
_, err = f.writer.Write([]byte(prefix + value + "\n"))
if err != nil {
return fmt.Errorf("FAILED to write message: %s, %s", value, err)
}
@ -107,6 +131,29 @@ func (f *File) Write(metrics []telegraf.Metric) error {
return nil
}
// Generate filename, replace tokens enclosed by { and } with time format
func generateFileName(s string) string {
t := time.Now().UTC()
//split on opening brace
tokens := strings.Split(s, "{")
// first token has no left bracket
outputString := tokens[0]
// cycle through remaining tokens
for j := 1; j < len(tokens); j++ {
//find closing brace
index := strings.Index(tokens[j], "}")
// if -1 we have opening brace with no closing brace so we don't format
if index == -1 {
outputString += tokens[j]
} else {
// Extract enclosed token and format, concatenate anything after closing brace on output
generatedString := t.Format(tokens[j][:index])
outputString += generatedString + tokens[j][index+1:]
}
}
return outputString
}
func init() {
outputs.Add("file", func() telegraf.Output {
return &File{}