Skip to content

Commit

Permalink
Merge pull request #10 from maier/master
Browse files Browse the repository at this point in the history
v0.0.8
  • Loading branch information
maier committed May 23, 2022
2 parents a640bba + 100dbc9 commit 1baf731
Show file tree
Hide file tree
Showing 13 changed files with 748 additions and 69 deletions.
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,16 @@
# v0.0.8

* upd: go-trapcheck v0.0.8
* add: additional text tests (leading/trailing spaces, non-printable char)
* upd: generic text cleaner method
* add: trim leading/trailing spaces from text metric values
* add: replace non-printable chars in text metric values
* add: replace 'smart' quotes (with regular quotes) in text metric values
* add: escape any embedded quotes in text metric values
* add: non-printable char replacement to config (default '_')
* upd: check type assertions
* add: more tests for each metric type

# v0.0.7

* upd: go-trapcheck v0.0.7
Expand Down
69 changes: 69 additions & 0 deletions counter_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
// Copyright (c) 2021 Circonus, Inc. <support@circonus.com>
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//

package trapmetrics

import (
"strings"
"testing"
)

func TestTrapMetrics_CounterIncrement(t *testing.T) {
tests := []struct {
name string
metricName string
wantJSON string
metricTags Tags
metricValue int64
wantErr bool
}{
{
name: "valid",
metricName: "test",
metricValue: 1,
metricTags: Tags{
Tag{
Category: "foo",
Value: "bar",
},
},
wantJSON: `"_value":1`,
wantErr: false,
},
}
for _, tt := range tests {
tt := tt

t.Run(tt.name, func(t *testing.T) {
tm, err := New(&Config{Trap: FakeTrap{}})
if err != nil {
t.Fatalf("unable to initialize TrapMetrics for test: %s", err)
}

if err = tm.CounterIncrement(tt.metricName, tt.metricTags); (err != nil) != tt.wantErr {
t.Errorf("TrapMetrics.CounterIncrement() error = %v, wantErr %v", err, tt.wantErr)
}

m, err := tm.CounterFetch(tt.metricName, tt.metricTags)
if (err != nil) != tt.wantErr {
t.Errorf("TrapMetrics.TextFetch() error = %v, wantErr %v", err, tt.wantErr)
}

want := tt.metricValue
if val, ok := m.Samples[0]; ok {
if val != want {
t.Errorf("Invalid value want [%v]%T got [%v]%T", want, want, val, val)
}
}

if jm, err := tm.JSONMetrics(); err != nil {
t.Fatalf("flushing metrics: %s", err)
} else if !strings.Contains(string(jm), tt.wantJSON) {
t.Errorf("json metrics want [%v] got [%v]", tt.wantJSON, string(jm))
}

})
}
}
30 changes: 25 additions & 5 deletions gauge.go
Original file line number Diff line number Diff line change
Expand Up @@ -101,15 +101,35 @@ func (tm *TrapMetrics) GaugeAdd(name string, tags Tags, val interface{}, ts *tim
func addValByType(rtype string, base interface{}, val interface{}) interface{} {
switch rtype {
case rtInt32:
return base.(int32) + val.(int32)
if i, oki := base.(int32); oki {
if j, okj := val.(int32); okj {
return i + j
}
}
case rtInt64:
return base.(int64) + val.(int64)
if i, oki := base.(int64); oki {
if j, okj := val.(int64); okj {
return i + j
}
}
case rtUint32:
return base.(uint32) + val.(uint32)
if i, oki := base.(uint32); oki {
if j, okj := val.(uint32); okj {
return i + j
}
}
case rtUint64:
return base.(uint64) + val.(uint64)
if i, oki := base.(uint64); oki {
if j, okj := val.(uint64); okj {
return i + j
}
}
case rtFloat64:
return base.(float64) + val.(float64)
if i, oki := base.(float64); oki {
if j, okj := val.(float64); okj {
return i + j
}
}
}

return base
Expand Down
198 changes: 198 additions & 0 deletions gauge_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,198 @@
// Copyright (c) 2021 Circonus, Inc. <support@circonus.com>
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
//

package trapmetrics

import (
"strings"
"testing"
"time"
)

func TestTrapMetrics_GaugeSet(t *testing.T) {
tests := []struct {
metricValue interface{}
name string
metricName string
wantJSON string
metricTags Tags
wantErr bool
}{
{
name: "valid",
metricName: "test",
metricValue: int64(1),
metricTags: Tags{
Tag{
Category: "foo",
Value: "bar",
},
},
wantJSON: `"_value":1`,
wantErr: false,
},
}
for _, tt := range tests {
tt := tt

t.Run(tt.name, func(t *testing.T) {
tm, err := New(&Config{Trap: FakeTrap{}})
if err != nil {
t.Fatalf("unable to initialize TrapMetrics for test: %s", err)
}

ts := time.Now()

if err = tm.GaugeSet(tt.metricName, tt.metricTags, tt.metricValue, &ts); (err != nil) != tt.wantErr {
t.Errorf("TrapMetrics.GaugeSet() error = %v, wantErr %v", err, tt.wantErr)
}

m, err := tm.GaugeFetch(tt.metricName, tt.metricTags)
if (err != nil) != tt.wantErr {
t.Errorf("TrapMetrics.TextFetch() error = %v, wantErr %v", err, tt.wantErr)
}

want := tt.metricValue
sk := generateSampleKey(&ts)
if val, ok := m.Samples[sk]; ok {
if val != want {
t.Errorf("Invalid value want [%v]%T got [%v]%T", want, want, val, val)
}
} else {
t.Fatalf("unable to get sample for key %v", sk)
}

if jm, err := tm.JSONMetrics(); err != nil {
t.Fatalf("flushing metrics: %s", err)
} else if !strings.Contains(string(jm), tt.wantJSON) {
t.Errorf("json metrics want [%v] got [%v]", tt.wantJSON, string(jm))
}
})
}
}

func TestTrapMetrics_GaugeAdd(t *testing.T) {
tests := []struct {
metricValue interface{}
wantValue interface{}
name string
metricName string
wantJSON string
metricTags Tags
wantErr bool
}{
{
name: "valid int32",
metricName: "test",
metricValue: int32(1),
metricTags: Tags{
Tag{
Category: "foo",
Value: "bar",
},
},
wantJSON: `"_value":2`,
wantValue: int32(2),
wantErr: false,
},
{
name: "valid int64",
metricName: "test",
metricValue: int64(1),
metricTags: Tags{
Tag{
Category: "foo",
Value: "bar",
},
},
wantJSON: `"_value":2`,
wantValue: int64(2),
wantErr: false,
},
{
name: "valid uint32",
metricName: "test",
metricValue: uint32(1),
metricTags: Tags{
Tag{
Category: "foo",
Value: "bar",
},
},
wantJSON: `"_value":2`,
wantValue: uint32(2),
wantErr: false,
},
{
name: "valid uint64",
metricName: "test",
metricValue: uint64(1),
metricTags: Tags{
Tag{
Category: "foo",
Value: "bar",
},
},
wantJSON: `"_value":2`,
wantValue: uint64(2),
wantErr: false,
},
{
name: "valid float64",
metricName: "test",
metricValue: float64(1.2),
metricTags: Tags{
Tag{
Category: "foo",
Value: "bar",
},
},
wantJSON: `"_value":2.4`,
wantValue: float64(2.4),
wantErr: false,
},
}
for _, tt := range tests {
tt := tt

t.Run(tt.name, func(t *testing.T) {
tm, err := New(&Config{Trap: FakeTrap{}})
if err != nil {
t.Fatalf("unable to initialize TrapMetrics for test: %s", err)
}

ts := time.Now()

if err = tm.GaugeAdd(tt.metricName, tt.metricTags, tt.metricValue, &ts); (err != nil) != tt.wantErr {
t.Errorf("TrapMetrics.GaugeSet() error = %v, wantErr %v", err, tt.wantErr)
}

if err = tm.GaugeAdd(tt.metricName, tt.metricTags, tt.metricValue, &ts); (err != nil) != tt.wantErr {
t.Errorf("TrapMetrics.GaugeAdd() error = %v, wantErr %v", err, tt.wantErr)
}

m, err := tm.GaugeFetch(tt.metricName, tt.metricTags)
if (err != nil) != tt.wantErr {
t.Errorf("TrapMetrics.TextFetch() error = %v, wantErr %v", err, tt.wantErr)
}

want := tt.wantValue
sk := generateSampleKey(&ts)
if val, ok := m.Samples[sk]; ok {
if val != want {
t.Errorf("Invalid value want [%v]%T got [%v]%T", want, want, val, val)
}
} else {
t.Fatalf("unable to get sample for key %v", sk)
}

if jm, err := tm.JSONMetrics(); err != nil {
t.Fatalf("flushing metrics: %s", err)
} else if !strings.Contains(string(jm), tt.wantJSON) {
t.Errorf("json metrics want [%v] got [%v]", tt.wantJSON, string(jm))
}
})
}
}
2 changes: 1 addition & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ module github.com/circonus-labs/go-trapmetrics
go 1.15

require (
github.com/circonus-labs/go-trapcheck v0.0.7
github.com/circonus-labs/go-trapcheck v0.0.8
github.com/openhistogram/circonusllhist v0.3.0
)
4 changes: 2 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
github.com/circonus-labs/go-apiclient v0.7.15 h1:r9sUdc+EDM0tL6Z6u03dac8fxYvlz1kPhxlNwkoIoqM=
github.com/circonus-labs/go-apiclient v0.7.15/go.mod h1:RFgkvdYEkimzgu3V2vVYlS1bitjOz1SF6uw109ieNeY=
github.com/circonus-labs/go-trapcheck v0.0.7 h1:aNofUdDtGwQXPcd+43oq3zZRkRhZ7MGqvvuQE52NoiQ=
github.com/circonus-labs/go-trapcheck v0.0.7/go.mod h1:j7vCtb3MfxGZnLCZBdpl0ZGDSGuGbbGRx9rFyGl6OAo=
github.com/circonus-labs/go-trapcheck v0.0.8 h1:5i4GPlKKZWpfG/0p9ggbGZfjaiHkDQnjIB6DwJKDrJE=
github.com/circonus-labs/go-trapcheck v0.0.8/go.mod h1:j7vCtb3MfxGZnLCZBdpl0ZGDSGuGbbGRx9rFyGl6OAo=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/google/uuid v1.3.0 h1:t6JiXgmwXMjEs8VusXIJk2BXHsn+wx8BZdTaoZ5fu7I=
Expand Down

0 comments on commit 1baf731

Please sign in to comment.