Skip to content

Commit

Permalink
Utilizing new client and overhauling Accumulator interface
Browse files Browse the repository at this point in the history
Fixes #280
Fixes #281
  • Loading branch information
sparrc committed Oct 20, 2015
1 parent 6263bc2 commit 95680e1
Show file tree
Hide file tree
Showing 15 changed files with 326 additions and 311 deletions.
191 changes: 138 additions & 53 deletions accumulator.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,146 @@ import (
"sync"
"time"

"github.com/influxdb/influxdb/client"
oldclient "github.com/influxdb/influxdb/client"
"github.com/influxdb/influxdb/client/v2"
)

type Accumulator interface {
Add(measurement string, value interface{},
tags map[string]string, t ...time.Time)
AddFields(measurement string, fields map[string]interface{},
tags map[string]string, t ...time.Time)

SetDefaultTags(tags map[string]string)
AddDefaultTag(key, value string)

Prefix() string
SetPrefix(prefix string)

Debug() bool
SetDebug(enabled bool)
}

func NewAccumulator(
plugin *ConfiguredPlugin,
points chan *client.Point,
) Accumulator {
acc := accumulator{}
acc.points = points
acc.plugin = plugin
return &acc
}

type accumulator struct {
sync.Mutex

points chan *client.Point

defaultTags map[string]string

debug bool

plugin *ConfiguredPlugin

prefix string
}

func (ac *accumulator) Add(
measurement string,
value interface{},
tags map[string]string,
t ...time.Time,
) {
fields := make(map[string]interface{})
fields["value"] = value
ac.AddFields(measurement, fields, tags, t...)
}

func (ac *accumulator) AddFields(
measurement string,
fields map[string]interface{},
tags map[string]string,
t ...time.Time,
) {

if tags == nil {
tags = make(map[string]string)
}

// InfluxDB client/points does not support writing uint64
// TODO fix when it does
// https://github.com/influxdb/influxdb/pull/4508
for k, v := range fields {
switch val := v.(type) {
case uint64:
if val < uint64(9223372036854775808) {
fields[k] = int64(val)
} else {
fields[k] = int64(9223372036854775807)
}
}
}

var timestamp time.Time
if len(t) > 0 {
timestamp = t[0]
} else {
timestamp = time.Now()
}

if ac.plugin != nil {
if !ac.plugin.ShouldPass(measurement, tags) {
return
}
}

for k, v := range ac.defaultTags {
if _, ok := tags[k]; !ok {
tags[k] = v
}
}

if ac.prefix != "" {
measurement = ac.prefix + measurement
}

pt := client.NewPoint(measurement, tags, fields, timestamp)
if ac.debug {
fmt.Println("> " + pt.String())
}
ac.points <- pt
}

func (ac *accumulator) SetDefaultTags(tags map[string]string) {
ac.defaultTags = tags
}

func (ac *accumulator) AddDefaultTag(key, value string) {
ac.defaultTags[key] = value
}

func (ac *accumulator) Prefix() string {
return ac.prefix
}

func (ac *accumulator) SetPrefix(prefix string) {
ac.prefix = prefix
}

func (ac *accumulator) Debug() bool {
return ac.debug
}

func (ac *accumulator) SetDebug(debug bool) {
ac.debug = debug
}

// BatchPoints is used to send a batch of data in a single write from telegraf
// to influx
type BatchPoints struct {
sync.Mutex

client.BatchPoints
oldclient.BatchPoints

Debug bool

Expand All @@ -39,9 +170,9 @@ func (bp *BatchPoints) deepcopy() *BatchPoints {
bpc.Tags[k] = v
}

var pts []client.Point
var pts []oldclient.Point
for _, pt := range bp.Points {
var ptc client.Point
var ptc oldclient.Point

ptc.Measurement = pt.Measurement
ptc.Time = pt.Time
Expand Down Expand Up @@ -70,66 +201,20 @@ func (bp *BatchPoints) Add(
measurement string,
val interface{},
tags map[string]string,
timestamp ...time.Time,
) {
fields := make(map[string]interface{})
fields["value"] = val
bp.AddFields(measurement, fields, tags)
}

// AddFieldsWithTime adds a measurement with a provided timestamp
func (bp *BatchPoints) AddFieldsWithTime(
measurement string,
fields map[string]interface{},
tags map[string]string,
timestamp time.Time,
) {
// TODO this function should add the fields with the timestamp, but that will
// need to wait for the InfluxDB point precision/unit to be fixed
bp.AddFields(measurement, fields, tags)
// bp.Lock()
// defer bp.Unlock()

// measurement = bp.Prefix + measurement

// if bp.Config != nil {
// if !bp.Config.ShouldPass(measurement, tags) {
// return
// }
// }

// if bp.Debug {
// var tg []string

// for k, v := range tags {
// tg = append(tg, fmt.Sprintf("%s=\"%s\"", k, v))
// }

// var vals []string

// for k, v := range fields {
// vals = append(vals, fmt.Sprintf("%s=%v", k, v))
// }

// sort.Strings(tg)
// sort.Strings(vals)

// fmt.Printf("> [%s] %s %s\n", strings.Join(tg, " "), measurement, strings.Join(vals, " "))
// }

// bp.Points = append(bp.Points, client.Point{
// Measurement: measurement,
// Tags: tags,
// Fields: fields,
// Time: timestamp,
// })
}

// AddFields will eventually replace the Add function, once we move to having a
// single plugin as a single measurement with multiple fields
func (bp *BatchPoints) AddFields(
measurement string,
fields map[string]interface{},
tags map[string]string,
timestamp ...time.Time,
) {
bp.Lock()
defer bp.Unlock()
Expand Down Expand Up @@ -181,7 +266,7 @@ func (bp *BatchPoints) AddFields(
fmt.Printf("> [%s] %s %s\n", strings.Join(tg, " "), measurement, strings.Join(vals, " "))
}

bp.Points = append(bp.Points, client.Point{
bp.Points = append(bp.Points, oldclient.Point{
Measurement: measurement,
Tags: tags,
Fields: fields,
Expand Down
Loading

0 comments on commit 95680e1

Please sign in to comment.