Skip to content

Commit

Permalink
add AddError method to accumulator (influxdata#1536)
Browse files Browse the repository at this point in the history
  • Loading branch information
phemmer authored and sparrc committed Jul 25, 2016
1 parent 9867352 commit e68f251
Show file tree
Hide file tree
Showing 5 changed files with 58 additions and 0 deletions.
2 changes: 2 additions & 0 deletions accumulator.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ type Accumulator interface {
tags map[string]string,
t ...time.Time)

AddError(err error)

Debug() bool
SetDebug(enabled bool)

Expand Down
14 changes: 14 additions & 0 deletions agent/accumulator.go
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import (
"fmt"
"log"
"math"
"sync/atomic"
"time"

"github.com/influxdata/telegraf"
Expand Down Expand Up @@ -33,6 +34,8 @@ type accumulator struct {
inputConfig *internal_models.InputConfig

precision time.Duration

errCount uint64
}

func (ac *accumulator) Add(
Expand Down Expand Up @@ -155,6 +158,17 @@ func (ac *accumulator) AddFields(
ac.metrics <- m
}

// AddError passes a runtime error to the accumulator.
// The error will be tagged with the plugin name and written to the log.
func (ac *accumulator) AddError(err error) {
if err == nil {
return
}
atomic.AddUint64(&ac.errCount, 1)
//TODO suppress/throttle consecutive duplicate errors?
log.Printf("ERROR in input [%s]: %s", ac.inputConfig.Name, err)
}

func (ac *accumulator) Debug() bool {
return ac.debug
}
Expand Down
28 changes: 28 additions & 0 deletions agent/accumulator_test.go
Original file line number Diff line number Diff line change
@@ -1,15 +1,19 @@
package agent

import (
"bytes"
"fmt"
"log"
"math"
"os"
"testing"
"time"

"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/internal/models"

"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestAdd(t *testing.T) {
Expand Down Expand Up @@ -454,3 +458,27 @@ func TestAccFilterTags(t *testing.T) {
fmt.Sprintf("acctest value=101 %d", now.UnixNano()),
actual)
}

func TestAccAddError(t *testing.T) {
errBuf := bytes.NewBuffer(nil)
log.SetOutput(errBuf)
defer log.SetOutput(os.Stderr)

a := accumulator{}
a.inputConfig = &internal_models.InputConfig{}
a.inputConfig.Name = "mock_plugin"

a.AddError(fmt.Errorf("foo"))
a.AddError(fmt.Errorf("bar"))
a.AddError(fmt.Errorf("baz"))

errs := bytes.Split(errBuf.Bytes(), []byte{'\n'})
assert.EqualValues(t, 3, a.errCount)
require.Len(t, errs, 4) // 4 because of trailing newline
assert.Contains(t, string(errs[0]), "mock_plugin")
assert.Contains(t, string(errs[0]), "foo")
assert.Contains(t, string(errs[1]), "mock_plugin")
assert.Contains(t, string(errs[1]), "bar")
assert.Contains(t, string(errs[2]), "mock_plugin")
assert.Contains(t, string(errs[2]), "baz")
}
3 changes: 3 additions & 0 deletions agent/agent.go
Original file line number Diff line number Diff line change
Expand Up @@ -215,6 +215,9 @@ func (a *Agent) Test() error {
if err := input.Input.Gather(acc); err != nil {
return err
}
if acc.errCount > 0 {
return fmt.Errorf("Errors encountered during processing")
}

// Special instructions for some inputs. cpu, for example, needs to be
// run twice in order to return cpu usage percentages.
Expand Down
11 changes: 11 additions & 0 deletions testutil/accumulator.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ type Accumulator struct {
sync.Mutex

Metrics []*Metric
Errors []error
debug bool
}

Expand Down Expand Up @@ -84,6 +85,16 @@ func (a *Accumulator) AddFields(
a.Metrics = append(a.Metrics, p)
}

// AddError appends the given error to Accumulator.Errors.
func (a *Accumulator) AddError(err error) {
if err == nil {
return
}
a.Lock()
a.Errors = append(a.Errors, err)
a.Unlock()
}

func (a *Accumulator) SetPrecision(precision, interval time.Duration) {
return
}
Expand Down

0 comments on commit e68f251

Please sign in to comment.