Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor package metrics #313

Merged
merged 55 commits into from Aug 26, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
d8e4488
Reimplement package metrics
peterbourgon Jul 7, 2016
673c81d
Tests for package metrics
peterbourgon Jul 10, 2016
06a10c1
A new Circonus API appears
peterbourgon Jul 11, 2016
b815bb5
Oops
peterbourgon Jul 13, 2016
25a0d24
Finish TestHistograms, and mark future tests TODO
peterbourgon Jul 13, 2016
86bc66e
More testing for package generic
peterbourgon Jul 13, 2016
52a6d15
Fix for Circonus breaking change
peterbourgon Jul 13, 2016
66c8bef
metrics/circonus: test With
peterbourgon Jul 15, 2016
cfb4f12
metrics/internal/push: buffering type
peterbourgon Jul 16, 2016
1633c51
metrics/dogstatsd: use push.Buffer to support With
peterbourgon Jul 16, 2016
7136e0d
metrics/provider: comments
peterbourgon Jul 16, 2016
760e487
metrics/expvar: include no-op With in tests
peterbourgon Jul 16, 2016
5a704a1
WIP
peterbourgon Jul 18, 2016
cffc052
metrics/internal/lv: LabelValues
peterbourgon Jul 22, 2016
3eb9702
metrics/internal/push: use package lv + comments
peterbourgon Jul 22, 2016
3dbc991
metrics/generic: use package lv and generic_test
peterbourgon Jul 22, 2016
807e610
metrics/teststat: remove debug
peterbourgon Jul 22, 2016
010b064
metrics/graphite: update tests
peterbourgon Jul 22, 2016
11beef7
metrics/dogstatsd: add Timings and fix test regexes
peterbourgon Jul 22, 2016
19c2fc2
metrics/statsd: update to new push.Buffer style
peterbourgon Jul 22, 2016
ac25819
metrics/dogstatsd: add sample rate to Counter metrics
peterbourgon Jul 22, 2016
127cf39
metrics/graphite: Histogram edge case
peterbourgon Jul 22, 2016
4f9efbb
Various WIP
peterbourgon Jul 23, 2016
08bbec4
Another ground-up refactor, n.b. internal/lv.Space
peterbourgon Aug 7, 2016
4fd6596
Fix
peterbourgon Aug 11, 2016
1f4c16f
With tests
peterbourgon Aug 11, 2016
b591423
Dogstats first cut
peterbourgon Aug 11, 2016
8cc1b97
Finish dogstatsd
peterbourgon Aug 14, 2016
d8fcedd
ratemap can be internal
peterbourgon Aug 14, 2016
8037788
Add statsd
peterbourgon Aug 14, 2016
68c6403
Influx
peterbourgon Aug 14, 2016
be31337
mv metrics2, pending delete
peterbourgon Aug 14, 2016
aa8d9b9
Circonus tests working in CI
peterbourgon Aug 14, 2016
0ea30e6
Oh, it was failing due to change in Gauge semantics
peterbourgon Aug 14, 2016
8505fa8
Missed an import
peterbourgon Aug 14, 2016
6f8cd68
Add discard and graphite
peterbourgon Aug 14, 2016
a61ec96
Additional generic test
peterbourgon Aug 14, 2016
6e578a4
generic/Histogram.Print for console printing purposes
peterbourgon Aug 14, 2016
48bd4fb
Provider
peterbourgon Aug 14, 2016
bafbd4e
Oops
peterbourgon Aug 14, 2016
155a736
Oops
peterbourgon Aug 15, 2016
5e4078f
Oops
peterbourgon Aug 15, 2016
7570a72
Clarify metric comments
brian-brazil Aug 16, 2016
e343043
Merge pull request #342 from brian-brazil/patch-5
peterbourgon Aug 16, 2016
1430cab
rm -rf _metrics2/
peterbourgon Aug 17, 2016
f35f14c
metrics3/README
peterbourgon Aug 17, 2016
8cce994
mv metrics3 metrics
peterbourgon Aug 17, 2016
8114e4a
metrics: cleanup
peterbourgon Aug 17, 2016
b149ec8
examples: fixes for new metrics
peterbourgon Aug 17, 2016
77e82e2
Fixes for go1.7
peterbourgon Aug 17, 2016
4e19ed8
Re-add Brian's changes, lost in rebase
peterbourgon Aug 17, 2016
d537d3b
Ugh
peterbourgon Aug 17, 2016
160de2f
Reimplement package multi
peterbourgon Aug 21, 2016
b87d35b
metrics: update README (see #300)
peterbourgon Aug 23, 2016
ab603d2
metrics/prometheus: properly encode label values
peterbourgon Aug 25, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
5 changes: 3 additions & 2 deletions .travis.yml
Expand Up @@ -4,5 +4,6 @@ script: go test -race -v ./...

go:
- 1.5.3
- 1.6
#- tip
- 1.6.3
- 1.7
- tip
15 changes: 7 additions & 8 deletions examples/addsvc/cmd/addsvc/main.go
Expand Up @@ -10,7 +10,6 @@ import (
"os/signal"
"strings"
"syscall"
"time"

"github.com/apache/thrift/lib/go/thrift"
lightstep "github.com/lightstep/lightstep-tracer-go"
Expand Down Expand Up @@ -61,25 +60,25 @@ func main() {
var ints, chars metrics.Counter
{
// Business level metrics.
ints = prometheus.NewCounter(stdprometheus.CounterOpts{
ints = prometheus.NewCounterFrom(stdprometheus.CounterOpts{
Namespace: "addsvc",
Name: "integers_summed",
Help: "Total count of integers summed via the Sum method.",
}, []string{})
chars = prometheus.NewCounter(stdprometheus.CounterOpts{
chars = prometheus.NewCounterFrom(stdprometheus.CounterOpts{
Namespace: "addsvc",
Name: "characters_concatenated",
Help: "Total count of characters concatenated via the Concat method.",
}, []string{})
}
var duration metrics.TimeHistogram
var duration metrics.Histogram
{
// Transport level metrics.
duration = metrics.NewTimeHistogram(time.Nanosecond, prometheus.NewSummary(stdprometheus.SummaryOpts{
duration = prometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
Namespace: "addsvc",
Name: "request_duration_ns",
Help: "Request duration in nanoseconds.",
}, []string{"method", "success"}))
}, []string{"method", "success"})
}

// Tracing domain.
Expand Down Expand Up @@ -132,7 +131,7 @@ func main() {
// Endpoint domain.
var sumEndpoint endpoint.Endpoint
{
sumDuration := duration.With(metrics.Field{Key: "method", Value: "Sum"})
sumDuration := duration.With("method", "Sum")
sumLogger := log.NewContext(logger).With("method", "Sum")

sumEndpoint = addsvc.MakeSumEndpoint(service)
Expand All @@ -142,7 +141,7 @@ func main() {
}
var concatEndpoint endpoint.Endpoint
{
concatDuration := duration.With(metrics.Field{Key: "method", Value: "Concat"})
concatDuration := duration.With("method", "Concat")
concatLogger := log.NewContext(logger).With("method", "Concat")

concatEndpoint = addsvc.MakeConcatEndpoint(service)
Expand Down
5 changes: 2 additions & 3 deletions examples/addsvc/endpoints.go
Expand Up @@ -88,13 +88,12 @@ func MakeConcatEndpoint(s Service) endpoint.Endpoint {
// the duration of each invocation to the passed histogram. The middleware adds
// a single field: "success", which is "true" if no error is returned, and
// "false" otherwise.
func EndpointInstrumentingMiddleware(duration metrics.TimeHistogram) endpoint.Middleware {
func EndpointInstrumentingMiddleware(duration metrics.Histogram) endpoint.Middleware {
return func(next endpoint.Endpoint) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (response interface{}, err error) {

defer func(begin time.Time) {
f := metrics.Field{Key: "success", Value: fmt.Sprint(err == nil)}
duration.With(f).Observe(time.Since(begin))
duration.With("success", fmt.Sprint(err == nil)).Observe(time.Since(begin).Seconds())
}(time.Now())
return next(ctx, request)

Expand Down
4 changes: 2 additions & 2 deletions examples/addsvc/service.go
Expand Up @@ -153,12 +153,12 @@ type serviceInstrumentingMiddleware struct {

func (mw serviceInstrumentingMiddleware) Sum(ctx context.Context, a, b int) (int, error) {
v, err := mw.next.Sum(ctx, a, b)
mw.ints.Add(uint64(v))
mw.ints.Add(float64(v))
return v, err
}

func (mw serviceInstrumentingMiddleware) Concat(ctx context.Context, a, b string) (string, error) {
v, err := mw.next.Concat(ctx, a, b)
mw.chars.Add(uint64(len(v)))
mw.chars.Add(float64(len(v)))
return v, err
}
39 changes: 16 additions & 23 deletions examples/shipping/booking/instrumenting.go
Expand Up @@ -11,12 +11,12 @@ import (

type instrumentingService struct {
requestCount metrics.Counter
requestLatency metrics.TimeHistogram
requestLatency metrics.Histogram
Service
}

// NewInstrumentingService returns an instance of an instrumenting Service.
func NewInstrumentingService(requestCount metrics.Counter, requestLatency metrics.TimeHistogram, s Service) Service {
func NewInstrumentingService(requestCount metrics.Counter, requestLatency metrics.Histogram, s Service) Service {
return &instrumentingService{
requestCount: requestCount,
requestLatency: requestLatency,
Expand All @@ -26,69 +26,62 @@ func NewInstrumentingService(requestCount metrics.Counter, requestLatency metric

func (s *instrumentingService) BookNewCargo(origin, destination location.UNLocode, arrivalDeadline time.Time) (cargo.TrackingID, error) {
defer func(begin time.Time) {
methodField := metrics.Field{Key: "method", Value: "book"}
s.requestCount.With(methodField).Add(1)
s.requestLatency.With(methodField).Observe(time.Since(begin))
s.requestCount.With("method", "book").Add(1)
s.requestLatency.With("method", "book").Observe(time.Since(begin).Seconds())
}(time.Now())

return s.Service.BookNewCargo(origin, destination, arrivalDeadline)
}

func (s *instrumentingService) LoadCargo(id cargo.TrackingID) (c Cargo, err error) {
defer func(begin time.Time) {
methodField := metrics.Field{Key: "method", Value: "load"}
s.requestCount.With(methodField).Add(1)
s.requestLatency.With(methodField).Observe(time.Since(begin))
s.requestCount.With("method", "load").Add(1)
s.requestLatency.With("method", "load").Observe(time.Since(begin).Seconds())
}(time.Now())

return s.Service.LoadCargo(id)
}

func (s *instrumentingService) RequestPossibleRoutesForCargo(id cargo.TrackingID) []cargo.Itinerary {
defer func(begin time.Time) {
methodField := metrics.Field{Key: "method", Value: "request_routes"}
s.requestCount.With(methodField).Add(1)
s.requestLatency.With(methodField).Observe(time.Since(begin))
s.requestCount.With("method", "request_routes").Add(1)
s.requestLatency.With("method", "request_routes").Observe(time.Since(begin).Seconds())
}(time.Now())

return s.Service.RequestPossibleRoutesForCargo(id)
}

func (s *instrumentingService) AssignCargoToRoute(id cargo.TrackingID, itinerary cargo.Itinerary) (err error) {
defer func(begin time.Time) {
methodField := metrics.Field{Key: "method", Value: "assign_to_route"}
s.requestCount.With(methodField).Add(1)
s.requestLatency.With(methodField).Observe(time.Since(begin))
s.requestCount.With("method", "assign_to_route").Add(1)
s.requestLatency.With("method", "assign_to_route").Observe(time.Since(begin).Seconds())
}(time.Now())

return s.Service.AssignCargoToRoute(id, itinerary)
}

func (s *instrumentingService) ChangeDestination(id cargo.TrackingID, l location.UNLocode) (err error) {
defer func(begin time.Time) {
methodField := metrics.Field{Key: "method", Value: "change_destination"}
s.requestCount.With(methodField).Add(1)
s.requestLatency.With(methodField).Observe(time.Since(begin))
s.requestCount.With("method", "change_destination").Add(1)
s.requestLatency.With("method", "change_destination").Observe(time.Since(begin).Seconds())
}(time.Now())

return s.Service.ChangeDestination(id, l)
}

func (s *instrumentingService) Cargos() []Cargo {
defer func(begin time.Time) {
methodField := metrics.Field{Key: "method", Value: "list_cargos"}
s.requestCount.With(methodField).Add(1)
s.requestLatency.With(methodField).Observe(time.Since(begin))
s.requestCount.With("method", "list_cargos").Add(1)
s.requestLatency.With("method", "list_cargos").Observe(time.Since(begin).Seconds())
}(time.Now())

return s.Service.Cargos()
}

func (s *instrumentingService) Locations() []Location {
defer func(begin time.Time) {
methodField := metrics.Field{Key: "method", Value: "list_locations"}
s.requestCount.With(methodField).Add(1)
s.requestLatency.With(methodField).Observe(time.Since(begin))
s.requestCount.With("method", "list_locations").Add(1)
s.requestLatency.With("method", "list_locations").Observe(time.Since(begin).Seconds())
}(time.Now())

return s.Service.Locations()
Expand Down
9 changes: 4 additions & 5 deletions examples/shipping/handling/instrumenting.go
Expand Up @@ -12,12 +12,12 @@ import (

type instrumentingService struct {
requestCount metrics.Counter
requestLatency metrics.TimeHistogram
requestLatency metrics.Histogram
Service
}

// NewInstrumentingService returns an instance of an instrumenting Service.
func NewInstrumentingService(requestCount metrics.Counter, requestLatency metrics.TimeHistogram, s Service) Service {
func NewInstrumentingService(requestCount metrics.Counter, requestLatency metrics.Histogram, s Service) Service {
return &instrumentingService{
requestCount: requestCount,
requestLatency: requestLatency,
Expand All @@ -29,9 +29,8 @@ func (s *instrumentingService) RegisterHandlingEvent(completionTime time.Time, t
loc location.UNLocode, eventType cargo.HandlingEventType) error {

defer func(begin time.Time) {
methodField := metrics.Field{Key: "method", Value: "register_incident"}
s.requestCount.With(methodField).Add(1)
s.requestLatency.With(methodField).Observe(time.Since(begin))
s.requestCount.With("method", "register_incident").Add(1)
s.requestLatency.With("method", "register_incident").Observe(time.Since(begin).Seconds())
}(time.Now())

return s.Service.RegisterHandlingEvent(completionTime, trackingID, voyage, loc, eventType)
Expand Down
25 changes: 15 additions & 10 deletions examples/shipping/main.go
Expand Up @@ -14,7 +14,6 @@ import (
"golang.org/x/net/context"

"github.com/go-kit/kit/log"
"github.com/go-kit/kit/metrics"
kitprometheus "github.com/go-kit/kit/metrics/prometheus"

"github.com/go-kit/kit/examples/shipping/booking"
Expand Down Expand Up @@ -81,52 +80,58 @@ func main() {
bs = booking.NewService(cargos, locations, handlingEvents, rs)
bs = booking.NewLoggingService(log.NewContext(logger).With("component", "booking"), bs)
bs = booking.NewInstrumentingService(
kitprometheus.NewCounter(stdprometheus.CounterOpts{
kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{
Namespace: "api",
Subsystem: "booking_service",
Name: "request_count",
Help: "Number of requests received.",
}, fieldKeys),
metrics.NewTimeHistogram(time.Microsecond, kitprometheus.NewSummary(stdprometheus.SummaryOpts{
kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
Namespace: "api",
Subsystem: "booking_service",
Name: "request_latency_microseconds",
Help: "Total duration of requests in microseconds.",
}, fieldKeys)), bs)
}, fieldKeys),
bs,
)

var ts tracking.Service
ts = tracking.NewService(cargos, handlingEvents)
ts = tracking.NewLoggingService(log.NewContext(logger).With("component", "tracking"), ts)
ts = tracking.NewInstrumentingService(
kitprometheus.NewCounter(stdprometheus.CounterOpts{
kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{
Namespace: "api",
Subsystem: "tracking_service",
Name: "request_count",
Help: "Number of requests received.",
}, fieldKeys),
metrics.NewTimeHistogram(time.Microsecond, kitprometheus.NewSummary(stdprometheus.SummaryOpts{
kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
Namespace: "api",
Subsystem: "tracking_service",
Name: "request_latency_microseconds",
Help: "Total duration of requests in microseconds.",
}, fieldKeys)), ts)
}, fieldKeys),
ts,
)

var hs handling.Service
hs = handling.NewService(handlingEvents, handlingEventFactory, handlingEventHandler)
hs = handling.NewLoggingService(log.NewContext(logger).With("component", "handling"), hs)
hs = handling.NewInstrumentingService(
kitprometheus.NewCounter(stdprometheus.CounterOpts{
kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{
Namespace: "api",
Subsystem: "handling_service",
Name: "request_count",
Help: "Number of requests received.",
}, fieldKeys),
metrics.NewTimeHistogram(time.Microsecond, kitprometheus.NewSummary(stdprometheus.SummaryOpts{
kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
Namespace: "api",
Subsystem: "handling_service",
Name: "request_latency_microseconds",
Help: "Total duration of requests in microseconds.",
}, fieldKeys)), hs)
}, fieldKeys),
hs,
)

httpLogger := log.NewContext(logger).With("component", "http")

Expand Down
9 changes: 4 additions & 5 deletions examples/shipping/tracking/instrumenting.go
Expand Up @@ -8,12 +8,12 @@ import (

type instrumentingService struct {
requestCount metrics.Counter
requestLatency metrics.TimeHistogram
requestLatency metrics.Histogram
Service
}

// NewInstrumentingService returns an instance of an instrumenting Service.
func NewInstrumentingService(requestCount metrics.Counter, requestLatency metrics.TimeHistogram, s Service) Service {
func NewInstrumentingService(requestCount metrics.Counter, requestLatency metrics.Histogram, s Service) Service {
return &instrumentingService{
requestCount: requestCount,
requestLatency: requestLatency,
Expand All @@ -23,9 +23,8 @@ func NewInstrumentingService(requestCount metrics.Counter, requestLatency metric

func (s *instrumentingService) Track(id string) (Cargo, error) {
defer func(begin time.Time) {
methodField := metrics.Field{Key: "method", Value: "track"}
s.requestCount.With(methodField).Add(1)
s.requestLatency.With(methodField).Observe(time.Since(begin))
s.requestCount.With("method", "track").Add(1)
s.requestLatency.With("method", "track").Observe(time.Since(begin).Seconds())
}(time.Now())

return s.Service.Track(id)
Expand Down
18 changes: 8 additions & 10 deletions examples/stringsvc2/instrumenting.go
Expand Up @@ -9,17 +9,16 @@ import (

type instrumentingMiddleware struct {
requestCount metrics.Counter
requestLatency metrics.TimeHistogram
requestLatency metrics.Histogram
countResult metrics.Histogram
next StringService
}

func (mw instrumentingMiddleware) Uppercase(s string) (output string, err error) {
defer func(begin time.Time) {
methodField := metrics.Field{Key: "method", Value: "uppercase"}
errorField := metrics.Field{Key: "error", Value: fmt.Sprintf("%v", err)}
mw.requestCount.With(methodField).With(errorField).Add(1)
mw.requestLatency.With(methodField).With(errorField).Observe(time.Since(begin))
lvs := []string{"method", "uppercase", "error", fmt.Sprint(err == nil)}
mw.requestCount.With(lvs...).Add(1)
mw.requestLatency.With(lvs...).Observe(time.Since(begin).Seconds())
}(time.Now())

output, err = mw.next.Uppercase(s)
Expand All @@ -28,11 +27,10 @@ func (mw instrumentingMiddleware) Uppercase(s string) (output string, err error)

func (mw instrumentingMiddleware) Count(s string) (n int) {
defer func(begin time.Time) {
methodField := metrics.Field{Key: "method", Value: "count"}
errorField := metrics.Field{Key: "error", Value: fmt.Sprintf("%v", error(nil))}
mw.requestCount.With(methodField).With(errorField).Add(1)
mw.requestLatency.With(methodField).With(errorField).Observe(time.Since(begin))
mw.countResult.Observe(int64(n))
lvs := []string{"method", "count"}
mw.requestCount.With(lvs...).Add(1)
mw.requestLatency.With(lvs...).Observe(time.Since(begin).Seconds())
mw.countResult.Observe(float64(n))
}(time.Now())

n = mw.next.Count(s)
Expand Down