closes #1436 This also fixes the bad behavior of waiting until runtime to return log parsing pattern compile errors when a pattern was simply unfound. closes #1418 Also protect against user error when the telegraf user does not have permission to open the provided file. We will now error and exit in this case, rather than silently waiting to get permission to open it.
120 lines
2.9 KiB
Go
120 lines
2.9 KiB
Go
package logparser
|
|
|
|
import (
|
|
"runtime"
|
|
"strings"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/influxdata/telegraf/testutil"
|
|
|
|
"github.com/influxdata/telegraf/plugins/inputs/logparser/grok"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
)
|
|
|
|
func TestStartNoParsers(t *testing.T) {
|
|
logparser := &LogParserPlugin{
|
|
FromBeginning: true,
|
|
Files: []string{"grok/testdata/*.log"},
|
|
}
|
|
|
|
acc := testutil.Accumulator{}
|
|
assert.Error(t, logparser.Start(&acc))
|
|
}
|
|
|
|
func TestGrokParseLogFilesNonExistPattern(t *testing.T) {
|
|
thisdir := getCurrentDir()
|
|
p := &grok.Parser{
|
|
Patterns: []string{"%{FOOBAR}"},
|
|
CustomPatternFiles: []string{thisdir + "grok/testdata/test-patterns"},
|
|
}
|
|
|
|
logparser := &LogParserPlugin{
|
|
FromBeginning: true,
|
|
Files: []string{thisdir + "grok/testdata/*.log"},
|
|
GrokParser: p,
|
|
}
|
|
|
|
acc := testutil.Accumulator{}
|
|
assert.Error(t, logparser.Start(&acc))
|
|
|
|
time.Sleep(time.Millisecond * 500)
|
|
logparser.Stop()
|
|
}
|
|
|
|
func TestGrokParseLogFiles(t *testing.T) {
|
|
thisdir := getCurrentDir()
|
|
p := &grok.Parser{
|
|
Patterns: []string{"%{TEST_LOG_A}", "%{TEST_LOG_B}"},
|
|
CustomPatternFiles: []string{thisdir + "grok/testdata/test-patterns"},
|
|
}
|
|
|
|
logparser := &LogParserPlugin{
|
|
FromBeginning: true,
|
|
Files: []string{thisdir + "grok/testdata/*.log"},
|
|
GrokParser: p,
|
|
}
|
|
|
|
acc := testutil.Accumulator{}
|
|
assert.NoError(t, logparser.Start(&acc))
|
|
|
|
time.Sleep(time.Millisecond * 500)
|
|
logparser.Stop()
|
|
|
|
acc.AssertContainsTaggedFields(t, "logparser_grok",
|
|
map[string]interface{}{
|
|
"clientip": "192.168.1.1",
|
|
"myfloat": float64(1.25),
|
|
"response_time": int64(5432),
|
|
"myint": int64(101),
|
|
},
|
|
map[string]string{"response_code": "200"})
|
|
|
|
acc.AssertContainsTaggedFields(t, "logparser_grok",
|
|
map[string]interface{}{
|
|
"myfloat": 1.25,
|
|
"mystring": "mystring",
|
|
"nomodifier": "nomodifier",
|
|
},
|
|
map[string]string{})
|
|
}
|
|
|
|
// Test that test_a.log line gets parsed even though we don't have the correct
|
|
// pattern available for test_b.log
|
|
func TestGrokParseLogFilesOneBad(t *testing.T) {
|
|
thisdir := getCurrentDir()
|
|
p := &grok.Parser{
|
|
Patterns: []string{"%{TEST_LOG_A}", "%{TEST_LOG_BAD}"},
|
|
CustomPatternFiles: []string{thisdir + "grok/testdata/test-patterns"},
|
|
}
|
|
assert.NoError(t, p.Compile())
|
|
|
|
logparser := &LogParserPlugin{
|
|
FromBeginning: true,
|
|
Files: []string{thisdir + "grok/testdata/test_a.log"},
|
|
GrokParser: p,
|
|
}
|
|
|
|
acc := testutil.Accumulator{}
|
|
acc.SetDebug(true)
|
|
assert.NoError(t, logparser.Start(&acc))
|
|
|
|
time.Sleep(time.Millisecond * 500)
|
|
logparser.Stop()
|
|
|
|
acc.AssertContainsTaggedFields(t, "logparser_grok",
|
|
map[string]interface{}{
|
|
"clientip": "192.168.1.1",
|
|
"myfloat": float64(1.25),
|
|
"response_time": int64(5432),
|
|
"myint": int64(101),
|
|
},
|
|
map[string]string{"response_code": "200"})
|
|
}
|
|
|
|
func getCurrentDir() string {
|
|
_, filename, _, _ := runtime.Caller(1)
|
|
return strings.Replace(filename, "logparser_test.go", "", 1)
|
|
}
|