Skip lines with missing refid in ntpq input (#5782)
This commit is contained in:
parent
a0f4c49fb4
commit
3011a009e5
|
@ -75,6 +75,7 @@ func (n *NTPQ) Gather(acc telegraf.Accumulator) error {
|
||||||
}
|
}
|
||||||
|
|
||||||
lineCounter := 0
|
lineCounter := 0
|
||||||
|
numColumns := 0
|
||||||
scanner := bufio.NewScanner(bytes.NewReader(out))
|
scanner := bufio.NewScanner(bytes.NewReader(out))
|
||||||
for scanner.Scan() {
|
for scanner.Scan() {
|
||||||
line := scanner.Text()
|
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, then this is the header line
|
||||||
if lineCounter == 0 {
|
if lineCounter == 0 {
|
||||||
|
numColumns = len(fields)
|
||||||
for i, field := range fields {
|
for i, field := range fields {
|
||||||
// Check if field is a tag:
|
// Check if field is a tag:
|
||||||
if tagKey, ok := tagHeaders[field]; ok {
|
if tagKey, ok := tagHeaders[field]; ok {
|
||||||
|
@ -116,6 +118,10 @@ func (n *NTPQ) Gather(acc telegraf.Accumulator) error {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
if len(fields) != numColumns {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
mFields := make(map[string]interface{})
|
mFields := make(map[string]interface{})
|
||||||
|
|
||||||
// Get tags from output
|
// Get tags from output
|
||||||
|
|
|
@ -3,10 +3,12 @@ package ntpq
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/influxdata/telegraf"
|
||||||
"github.com/influxdata/telegraf/testutil"
|
"github.com/influxdata/telegraf/testutil"
|
||||||
|
|
||||||
"github.com/stretchr/testify/assert"
|
"github.com/stretchr/testify/assert"
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestSingleNTPQ(t *testing.T) {
|
func TestSingleNTPQ(t *testing.T) {
|
||||||
|
@ -39,35 +41,6 @@ func TestSingleNTPQ(t *testing.T) {
|
||||||
acc.AssertContainsTaggedFields(t, "ntpq", fields, tags)
|
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) {
|
func TestBadIntNTPQ(t *testing.T) {
|
||||||
tt := tester{
|
tt := tester{
|
||||||
ret: []byte(badIntParseNTPQ),
|
ret: []byte(badIntParseNTPQ),
|
||||||
|
@ -428,6 +401,62 @@ func TestFailedNTPQ(t *testing.T) {
|
||||||
assert.Error(t, acc.GatherError(n.Gather))
|
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 {
|
type tester struct {
|
||||||
ret []byte
|
ret []byte
|
||||||
err error
|
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
|
*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
|
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
|
*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.
|
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.
|
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
|
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
|
*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
|
+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
|
-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.
|
||||||
|
`
|
||||||
|
|
Loading…
Reference in New Issue