Skip lines with missing refid in ntpq input (#5782)

This commit is contained in:
Daniel Nelson 2019-05-07 14:54:43 -07:00 committed by GitHub
parent a0f4c49fb4
commit 3011a009e5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 73 additions and 35 deletions

View File

@ -75,6 +75,7 @@ func (n *NTPQ) Gather(acc telegraf.Accumulator) error {
}
lineCounter := 0
numColumns := 0
scanner := bufio.NewScanner(bytes.NewReader(out))
for scanner.Scan() {
line := scanner.Text()
@ -96,6 +97,7 @@ func (n *NTPQ) Gather(acc telegraf.Accumulator) error {
// If lineCounter == 0, then this is the header line
if lineCounter == 0 {
numColumns = len(fields)
for i, field := range fields {
// Check if field is a tag:
if tagKey, ok := tagHeaders[field]; ok {
@ -116,6 +118,10 @@ func (n *NTPQ) Gather(acc telegraf.Accumulator) error {
}
}
} else {
if len(fields) != numColumns {
continue
}
mFields := make(map[string]interface{})
// Get tags from output

View File

@ -3,10 +3,12 @@ package ntpq
import (
"fmt"
"testing"
"time"
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/testutil"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestSingleNTPQ(t *testing.T) {
@ -39,35 +41,6 @@ func TestSingleNTPQ(t *testing.T) {
acc.AssertContainsTaggedFields(t, "ntpq", fields, tags)
}
func TestMissingJitterField(t *testing.T) {
tt := tester{
ret: []byte(missingJitterField),
err: nil,
}
n := &NTPQ{
runQ: tt.runqTest,
}
acc := testutil.Accumulator{}
assert.NoError(t, acc.GatherError(n.Gather))
fields := map[string]interface{}{
"when": int64(101),
"poll": int64(256),
"reach": int64(37),
"delay": float64(51.016),
"offset": float64(233.010),
}
tags := map[string]string{
"remote": "uschi5-ntp-002.",
"state_prefix": "*",
"refid": "10.177.80.46",
"stratum": "2",
"type": "u",
}
acc.AssertContainsTaggedFields(t, "ntpq", fields, tags)
}
func TestBadIntNTPQ(t *testing.T) {
tt := tester{
ret: []byte(badIntParseNTPQ),
@ -428,6 +401,62 @@ func TestFailedNTPQ(t *testing.T) {
assert.Error(t, acc.GatherError(n.Gather))
}
// It is possible for the output of ntqp to be missing the refid column. This
// is believed to be http://bugs.ntp.org/show_bug.cgi?id=3484 which is fixed
// in ntp-4.2.8p12 (included first in Debian Buster).
func TestNoRefID(t *testing.T) {
now := time.Now()
expected := []telegraf.Metric{
testutil.MustMetric("ntpq",
map[string]string{
"refid": "10.177.80.37",
"remote": "83.137.98.96",
"stratum": "2",
"type": "u",
},
map[string]interface{}{
"delay": float64(54.033),
"jitter": float64(449514),
"offset": float64(243.426),
"poll": int64(1024),
"reach": int64(377),
"when": int64(740),
},
now),
testutil.MustMetric("ntpq",
map[string]string{
"refid": "10.177.80.37",
"remote": "131.188.3.221",
"stratum": "2",
"type": "u",
},
map[string]interface{}{
"delay": float64(111.820),
"jitter": float64(449528),
"offset": float64(261.921),
"poll": int64(1024),
"reach": int64(377),
"when": int64(783),
},
now),
}
tt := tester{
ret: []byte(noRefID),
err: nil,
}
n := &NTPQ{
runQ: tt.runqTest,
}
acc := testutil.Accumulator{
TimeFunc: func() time.Time { return now },
}
require.NoError(t, acc.GatherError(n.Gather))
testutil.RequireMetricsEqual(t, expected, acc.GetTelegrafMetrics())
}
type tester struct {
ret []byte
err error
@ -474,11 +503,6 @@ var singleNTPQ = ` remote refid st t when poll reach delay
*uschi5-ntp-002. 10.177.80.46 2 u 101 256 37 51.016 233.010 17.462
`
var missingJitterField = ` remote refid st t when poll reach delay offset jitter
==============================================================================
*uschi5-ntp-002. 10.177.80.46 2 u 101 256 37 51.016 233.010
`
var badHeaderNTPQ = `remote refid foobar t when poll reach delay offset jitter
==============================================================================
*uschi5-ntp-002. 10.177.80.46 2 u 101 256 37 51.016 233.010 17.462
@ -527,6 +551,7 @@ var multiNTPQ = ` remote refid st t when poll reach delay
5.9.29.107 10.177.80.37 2 u 703 1024 377 205.704 160.406 449602.
91.189.94.4 10.177.80.37 2 u 673 1024 377 143.047 274.726 449445.
`
var multiParserNTPQ = ` remote refid st t when poll reach delay offset jitter
==============================================================================
*SHM(0) .PPS. 1 u 60 64 377 0.000 0.045 1.012
@ -535,3 +560,10 @@ var multiParserNTPQ = ` remote refid st t when poll reach d
+37.58.57.238 ( 192.53.103.103 2 u 10 1024 377 1.748 0.373 0.101
-SHM(1) .GPS. 1 u 121 128 377 0.000 10.105 2.012
`
var noRefID = ` remote refid st t when poll reach delay offset jitter
==============================================================================
83.137.98.96 10.177.80.37 2 u 740 1024 377 54.033 243.426 449514.
91.189.94.4 2 u 673 1024 377 143.047 274.726 449445.
131.188.3.221 10.177.80.37 2 u 783 1024 377 111.820 261.921 449528.
`