Fix precision truncation when no timestamp included (#3961)

This commit is contained in:
Daniel Nelson
2018-04-02 14:32:33 -07:00
committed by GitHub
parent 45e77b3301
commit 52d9a98b09
5 changed files with 97 additions and 11 deletions

View File

@@ -26,8 +26,9 @@ func (h *MetricHandler) SetTimeFunc(f metric.TimeFunc) {
h.builder.TimeFunc = f
}
func (h *MetricHandler) SetPrecision(factor time.Duration) {
h.precision = factor
func (h *MetricHandler) SetTimePrecision(precision time.Duration) {
h.builder.TimePrecision = precision
h.precision = precision
}
func (h *MetricHandler) Metric() (telegraf.Metric, error) {

View File

@@ -21,10 +21,12 @@ var DefaultTime = func() time.Time {
}
var ptests = []struct {
name string
input []byte
metrics []telegraf.Metric
err error
name string
input []byte
timeFunc func() time.Time
precision time.Duration
metrics []telegraf.Metric
err error
}{
{
name: "minimal",
@@ -406,7 +408,7 @@ var ptests = []struct {
err: nil,
},
{
name: "default timestamp",
name: "no timestamp",
input: []byte("cpu value=42"),
metrics: []telegraf.Metric{
Metric(
@@ -422,6 +424,47 @@ var ptests = []struct {
},
err: nil,
},
{
name: "no timestamp full precision",
input: []byte("cpu value=42"),
timeFunc: func() time.Time {
return time.Unix(42, 123456789)
},
metrics: []telegraf.Metric{
Metric(
metric.New(
"cpu",
map[string]string{},
map[string]interface{}{
"value": 42.0,
},
time.Unix(42, 123456789),
),
),
},
err: nil,
},
{
name: "no timestamp partial precision",
input: []byte("cpu value=42"),
timeFunc: func() time.Time {
return time.Unix(42, 123456789)
},
precision: 1 * time.Millisecond,
metrics: []telegraf.Metric{
Metric(
metric.New(
"cpu",
map[string]string{},
map[string]interface{}{
"value": 42.0,
},
time.Unix(42, 123000000),
),
),
},
err: nil,
},
{
name: "multiple lines",
input: []byte("cpu value=42\ncpu value=42"),
@@ -538,6 +581,12 @@ func TestParser(t *testing.T) {
t.Run(tt.name, func(t *testing.T) {
handler := NewMetricHandler()
handler.SetTimeFunc(DefaultTime)
if tt.timeFunc != nil {
handler.SetTimeFunc(tt.timeFunc)
}
if tt.precision > 0 {
handler.SetTimePrecision(tt.precision)
}
parser := NewParser(handler)
metrics, err := parser.Parse(tt.input)