-
Notifications
You must be signed in to change notification settings - Fork 5.6k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Use an internal 'Metric' data type for telegraf metrics
As of now, this is pretty much just a wrapper around client.Point, but this gives latitude to expand functionality more easily. closes #564
- Loading branch information
Showing
1 changed file
with
105 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
package models | ||
|
||
import ( | ||
"time" | ||
|
||
"github.com/influxdata/influxdb/client/v2" | ||
"github.com/influxdata/influxdb/models" | ||
) | ||
|
||
type Metric interface { | ||
// Name returns the measurement name of the metric | ||
Name() string | ||
|
||
// Name returns the tags associated with the metric | ||
Tags() map[string]string | ||
|
||
// Time return the timestamp for the metric | ||
Time() time.Time | ||
|
||
// UnixNano returns the unix nano time of the metric | ||
UnixNano() int64 | ||
|
||
// Fields returns the fields for the metric | ||
Fields() map[string]interface{} | ||
|
||
// String returns a line-protocol string of the metric | ||
String() string | ||
|
||
// PrecisionString returns a line-protocol string of the metric, at precision | ||
PrecisionString(precison string) string | ||
} | ||
|
||
// metric is a wrapper of the influxdb client.Point struct | ||
type metric struct { | ||
pt *client.Point | ||
} | ||
|
||
// NewMetric returns a metric with the given timestamp. If a timestamp is not | ||
// given, then data is sent to the database without a timestamp, in which case | ||
// the server will assign local time upon reception. NOTE: it is recommended to | ||
// send data with a timestamp. | ||
func NewMetric( | ||
name string, | ||
tags map[string]string, | ||
fields map[string]interface{}, | ||
t ...time.Time, | ||
) (Metric, error) { | ||
var T time.Time | ||
if len(t) > 0 { | ||
T = t[0] | ||
} | ||
|
||
pt, err := client.NewPoint(name, tags, fields, T) | ||
if err != nil { | ||
return nil, err | ||
} | ||
return &metric{ | ||
pt: pt, | ||
}, nil | ||
} | ||
|
||
// ParseMetrics returns a slice of Metrics from a text representation of a | ||
// metric (in line-protocol format) | ||
// with each metric separated by newlines. If any metrics fail to parse, | ||
// a non-nil error will be returned in addition to the metrics that parsed | ||
// successfully. | ||
func ParseMetrics(buf []byte) ([]Metric, error) { | ||
points, err := models.ParsePoints(buf) | ||
metrics := make([]Metric, len(points)) | ||
for i, point := range points { | ||
// Ignore error here because it's impossible that a model.Point | ||
// wouldn't parse into client.Point properly | ||
metrics[i], _ = NewMetric(point.Name(), point.Tags(), | ||
point.Fields(), point.Time()) | ||
} | ||
return metrics, err | ||
} | ||
|
||
func (m *metric) Name() string { | ||
return m.pt.Name() | ||
} | ||
|
||
func (m *metric) Tags() map[string]string { | ||
return m.pt.Tags() | ||
} | ||
|
||
func (m *metric) Time() time.Time { | ||
return m.pt.Time() | ||
} | ||
|
||
func (m *metric) UnixNano() int64 { | ||
return m.pt.UnixNano() | ||
} | ||
|
||
func (m *metric) Fields() map[string]interface{} { | ||
return m.pt.Fields() | ||
} | ||
|
||
func (m *metric) String() string { | ||
return m.pt.String() | ||
} | ||
|
||
func (m *metric) PrecisionString(precison string) string { | ||
return m.pt.PrecisionString(precison) | ||
} |