Codebase list golang-github-go-kit-kit / b149ec8
examples: fixes for new metrics Peter Bourgon 7 years ago
11 changed file(s) with 75 addition(s) and 89 deletion(s). Raw diff Collapse all Expand all
99 "os/signal"
1010 "strings"
1111 "syscall"
12 "time"
1312
1413 "github.com/apache/thrift/lib/go/thrift"
1514 lightstep "github.com/lightstep/lightstep-tracer-go"
6059 var ints, chars metrics.Counter
6160 {
6261 // Business level metrics.
63 ints = prometheus.NewCounter(stdprometheus.CounterOpts{
62 ints = prometheus.NewCounterFrom(stdprometheus.CounterOpts{
6463 Namespace: "addsvc",
6564 Name: "integers_summed",
6665 Help: "Total count of integers summed via the Sum method.",
6766 }, []string{})
68 chars = prometheus.NewCounter(stdprometheus.CounterOpts{
67 chars = prometheus.NewCounterFrom(stdprometheus.CounterOpts{
6968 Namespace: "addsvc",
7069 Name: "characters_concatenated",
7170 Help: "Total count of characters concatenated via the Concat method.",
7271 }, []string{})
7372 }
74 var duration metrics.TimeHistogram
73 var duration metrics.Histogram
7574 {
7675 // Transport level metrics.
77 duration = metrics.NewTimeHistogram(time.Nanosecond, prometheus.NewSummary(stdprometheus.SummaryOpts{
76 duration = prometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
7877 Namespace: "addsvc",
7978 Name: "request_duration_ns",
8079 Help: "Request duration in nanoseconds.",
81 }, []string{"method", "success"}))
80 }, []string{"method", "success"})
8281 }
8382
8483 // Tracing domain.
131130 // Endpoint domain.
132131 var sumEndpoint endpoint.Endpoint
133132 {
134 sumDuration := duration.With(metrics.Field{Key: "method", Value: "Sum"})
133 sumDuration := duration.With("method", "Sum")
135134 sumLogger := log.NewContext(logger).With("method", "Sum")
136135
137136 sumEndpoint = addsvc.MakeSumEndpoint(service)
141140 }
142141 var concatEndpoint endpoint.Endpoint
143142 {
144 concatDuration := duration.With(metrics.Field{Key: "method", Value: "Concat"})
143 concatDuration := duration.With("method", "Concat")
145144 concatLogger := log.NewContext(logger).With("method", "Concat")
146145
147146 concatEndpoint = addsvc.MakeConcatEndpoint(service)
8787 // the duration of each invocation to the passed histogram. The middleware adds
8888 // a single field: "success", which is "true" if no error is returned, and
8989 // "false" otherwise.
90 func EndpointInstrumentingMiddleware(duration metrics.TimeHistogram) endpoint.Middleware {
90 func EndpointInstrumentingMiddleware(duration metrics.Histogram) endpoint.Middleware {
9191 return func(next endpoint.Endpoint) endpoint.Endpoint {
9292 return func(ctx context.Context, request interface{}) (response interface{}, err error) {
9393
9494 defer func(begin time.Time) {
95 f := metrics.Field{Key: "success", Value: fmt.Sprint(err == nil)}
96 duration.With(f).Observe(time.Since(begin))
95 duration.With("success", fmt.Sprint(err == nil)).Observe(time.Since(begin).Seconds())
9796 }(time.Now())
9897 return next(ctx, request)
9998
152152
153153 func (mw serviceInstrumentingMiddleware) Sum(ctx context.Context, a, b int) (int, error) {
154154 v, err := mw.next.Sum(ctx, a, b)
155 mw.ints.Add(uint64(v))
155 mw.ints.Add(float64(v))
156156 return v, err
157157 }
158158
159159 func (mw serviceInstrumentingMiddleware) Concat(ctx context.Context, a, b string) (string, error) {
160160 v, err := mw.next.Concat(ctx, a, b)
161 mw.chars.Add(uint64(len(v)))
161 mw.chars.Add(float64(len(v)))
162162 return v, err
163163 }
1010
1111 type instrumentingService struct {
1212 requestCount metrics.Counter
13 requestLatency metrics.TimeHistogram
13 requestLatency metrics.Histogram
1414 Service
1515 }
1616
1717 // NewInstrumentingService returns an instance of an instrumenting Service.
18 func NewInstrumentingService(requestCount metrics.Counter, requestLatency metrics.TimeHistogram, s Service) Service {
18 func NewInstrumentingService(requestCount metrics.Counter, requestLatency metrics.Histogram, s Service) Service {
1919 return &instrumentingService{
2020 requestCount: requestCount,
2121 requestLatency: requestLatency,
2525
2626 func (s *instrumentingService) BookNewCargo(origin, destination location.UNLocode, arrivalDeadline time.Time) (cargo.TrackingID, error) {
2727 defer func(begin time.Time) {
28 methodField := metrics.Field{Key: "method", Value: "book"}
29 s.requestCount.With(methodField).Add(1)
30 s.requestLatency.With(methodField).Observe(time.Since(begin))
28 s.requestCount.With("method", "book").Add(1)
29 s.requestLatency.With("method", "book").Observe(time.Since(begin).Seconds())
3130 }(time.Now())
3231
3332 return s.Service.BookNewCargo(origin, destination, arrivalDeadline)
3534
3635 func (s *instrumentingService) LoadCargo(id cargo.TrackingID) (c Cargo, err error) {
3736 defer func(begin time.Time) {
38 methodField := metrics.Field{Key: "method", Value: "load"}
39 s.requestCount.With(methodField).Add(1)
40 s.requestLatency.With(methodField).Observe(time.Since(begin))
37 s.requestCount.With("method", "load").Add(1)
38 s.requestLatency.With("method", "load").Observe(time.Since(begin).Seconds())
4139 }(time.Now())
4240
4341 return s.Service.LoadCargo(id)
4543
4644 func (s *instrumentingService) RequestPossibleRoutesForCargo(id cargo.TrackingID) []cargo.Itinerary {
4745 defer func(begin time.Time) {
48 methodField := metrics.Field{Key: "method", Value: "request_routes"}
49 s.requestCount.With(methodField).Add(1)
50 s.requestLatency.With(methodField).Observe(time.Since(begin))
46 s.requestCount.With("method", "request_routes").Add(1)
47 s.requestLatency.With("method", "request_routes").Observe(time.Since(begin).Seconds())
5148 }(time.Now())
5249
5350 return s.Service.RequestPossibleRoutesForCargo(id)
5552
5653 func (s *instrumentingService) AssignCargoToRoute(id cargo.TrackingID, itinerary cargo.Itinerary) (err error) {
5754 defer func(begin time.Time) {
58 methodField := metrics.Field{Key: "method", Value: "assign_to_route"}
59 s.requestCount.With(methodField).Add(1)
60 s.requestLatency.With(methodField).Observe(time.Since(begin))
55 s.requestCount.With("method", "assign_to_route").Add(1)
56 s.requestLatency.With("method", "assign_to_route").Observe(time.Since(begin).Seconds())
6157 }(time.Now())
6258
6359 return s.Service.AssignCargoToRoute(id, itinerary)
6561
6662 func (s *instrumentingService) ChangeDestination(id cargo.TrackingID, l location.UNLocode) (err error) {
6763 defer func(begin time.Time) {
68 methodField := metrics.Field{Key: "method", Value: "change_destination"}
69 s.requestCount.With(methodField).Add(1)
70 s.requestLatency.With(methodField).Observe(time.Since(begin))
64 s.requestCount.With("method", "change_destination").Add(1)
65 s.requestLatency.With("method", "change_destination").Observe(time.Since(begin).Seconds())
7166 }(time.Now())
7267
7368 return s.Service.ChangeDestination(id, l)
7570
7671 func (s *instrumentingService) Cargos() []Cargo {
7772 defer func(begin time.Time) {
78 methodField := metrics.Field{Key: "method", Value: "list_cargos"}
79 s.requestCount.With(methodField).Add(1)
80 s.requestLatency.With(methodField).Observe(time.Since(begin))
73 s.requestCount.With("method", "list_cargos").Add(1)
74 s.requestLatency.With("method", "list_cargos").Observe(time.Since(begin).Seconds())
8175 }(time.Now())
8276
8377 return s.Service.Cargos()
8579
8680 func (s *instrumentingService) Locations() []Location {
8781 defer func(begin time.Time) {
88 methodField := metrics.Field{Key: "method", Value: "list_locations"}
89 s.requestCount.With(methodField).Add(1)
90 s.requestLatency.With(methodField).Observe(time.Since(begin))
82 s.requestCount.With("method", "list_locations").Add(1)
83 s.requestLatency.With("method", "list_locations").Observe(time.Since(begin).Seconds())
9184 }(time.Now())
9285
9386 return s.Service.Locations()
1111
1212 type instrumentingService struct {
1313 requestCount metrics.Counter
14 requestLatency metrics.TimeHistogram
14 requestLatency metrics.Histogram
1515 Service
1616 }
1717
1818 // NewInstrumentingService returns an instance of an instrumenting Service.
19 func NewInstrumentingService(requestCount metrics.Counter, requestLatency metrics.TimeHistogram, s Service) Service {
19 func NewInstrumentingService(requestCount metrics.Counter, requestLatency metrics.Histogram, s Service) Service {
2020 return &instrumentingService{
2121 requestCount: requestCount,
2222 requestLatency: requestLatency,
2828 loc location.UNLocode, eventType cargo.HandlingEventType) error {
2929
3030 defer func(begin time.Time) {
31 methodField := metrics.Field{Key: "method", Value: "register_incident"}
32 s.requestCount.With(methodField).Add(1)
33 s.requestLatency.With(methodField).Observe(time.Since(begin))
31 s.requestCount.With("method", "register_incident").Add(1)
32 s.requestLatency.With("method", "register_incident").Observe(time.Since(begin).Seconds())
3433 }(time.Now())
3534
3635 return s.Service.RegisterHandlingEvent(completionTime, trackingID, voyage, loc, eventType)
1313 "golang.org/x/net/context"
1414
1515 "github.com/go-kit/kit/log"
16 "github.com/go-kit/kit/metrics"
1716 kitprometheus "github.com/go-kit/kit/metrics/prometheus"
1817
1918 "github.com/go-kit/kit/examples/shipping/booking"
8079 bs = booking.NewService(cargos, locations, handlingEvents, rs)
8180 bs = booking.NewLoggingService(log.NewContext(logger).With("component", "booking"), bs)
8281 bs = booking.NewInstrumentingService(
83 kitprometheus.NewCounter(stdprometheus.CounterOpts{
82 kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{
8483 Namespace: "api",
8584 Subsystem: "booking_service",
8685 Name: "request_count",
8786 Help: "Number of requests received.",
8887 }, fieldKeys),
89 metrics.NewTimeHistogram(time.Microsecond, kitprometheus.NewSummary(stdprometheus.SummaryOpts{
88 kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
9089 Namespace: "api",
9190 Subsystem: "booking_service",
9291 Name: "request_latency_microseconds",
9392 Help: "Total duration of requests in microseconds.",
94 }, fieldKeys)), bs)
93 }, fieldKeys),
94 bs,
95 )
9596
9697 var ts tracking.Service
9798 ts = tracking.NewService(cargos, handlingEvents)
9899 ts = tracking.NewLoggingService(log.NewContext(logger).With("component", "tracking"), ts)
99100 ts = tracking.NewInstrumentingService(
100 kitprometheus.NewCounter(stdprometheus.CounterOpts{
101 kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{
101102 Namespace: "api",
102103 Subsystem: "tracking_service",
103104 Name: "request_count",
104105 Help: "Number of requests received.",
105106 }, fieldKeys),
106 metrics.NewTimeHistogram(time.Microsecond, kitprometheus.NewSummary(stdprometheus.SummaryOpts{
107 kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
107108 Namespace: "api",
108109 Subsystem: "tracking_service",
109110 Name: "request_latency_microseconds",
110111 Help: "Total duration of requests in microseconds.",
111 }, fieldKeys)), ts)
112 }, fieldKeys),
113 ts,
114 )
112115
113116 var hs handling.Service
114117 hs = handling.NewService(handlingEvents, handlingEventFactory, handlingEventHandler)
115118 hs = handling.NewLoggingService(log.NewContext(logger).With("component", "handling"), hs)
116119 hs = handling.NewInstrumentingService(
117 kitprometheus.NewCounter(stdprometheus.CounterOpts{
120 kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{
118121 Namespace: "api",
119122 Subsystem: "handling_service",
120123 Name: "request_count",
121124 Help: "Number of requests received.",
122125 }, fieldKeys),
123 metrics.NewTimeHistogram(time.Microsecond, kitprometheus.NewSummary(stdprometheus.SummaryOpts{
126 kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
124127 Namespace: "api",
125128 Subsystem: "handling_service",
126129 Name: "request_latency_microseconds",
127130 Help: "Total duration of requests in microseconds.",
128 }, fieldKeys)), hs)
131 }, fieldKeys),
132 hs,
133 )
129134
130135 httpLogger := log.NewContext(logger).With("component", "http")
131136
77
88 type instrumentingService struct {
99 requestCount metrics.Counter
10 requestLatency metrics.TimeHistogram
10 requestLatency metrics.Histogram
1111 Service
1212 }
1313
1414 // NewInstrumentingService returns an instance of an instrumenting Service.
15 func NewInstrumentingService(requestCount metrics.Counter, requestLatency metrics.TimeHistogram, s Service) Service {
15 func NewInstrumentingService(requestCount metrics.Counter, requestLatency metrics.Histogram, s Service) Service {
1616 return &instrumentingService{
1717 requestCount: requestCount,
1818 requestLatency: requestLatency,
2222
2323 func (s *instrumentingService) Track(id string) (Cargo, error) {
2424 defer func(begin time.Time) {
25 methodField := metrics.Field{Key: "method", Value: "track"}
26 s.requestCount.With(methodField).Add(1)
27 s.requestLatency.With(methodField).Observe(time.Since(begin))
25 s.requestCount.With("method", "track").Add(1)
26 s.requestLatency.With("method", "track").Observe(time.Since(begin).Seconds())
2827 }(time.Now())
2928
3029 return s.Service.Track(id)
88
99 type instrumentingMiddleware struct {
1010 requestCount metrics.Counter
11 requestLatency metrics.TimeHistogram
11 requestLatency metrics.Histogram
1212 countResult metrics.Histogram
1313 next StringService
1414 }
1515
1616 func (mw instrumentingMiddleware) Uppercase(s string) (output string, err error) {
1717 defer func(begin time.Time) {
18 methodField := metrics.Field{Key: "method", Value: "uppercase"}
19 errorField := metrics.Field{Key: "error", Value: fmt.Sprintf("%v", err)}
20 mw.requestCount.With(methodField).With(errorField).Add(1)
21 mw.requestLatency.With(methodField).With(errorField).Observe(time.Since(begin))
18 lvs := []string{"method", "uppercase", "error", fmt.Sprint(err == nil)}
19 mw.requestCount.With(lvs...).Add(1)
20 mw.requestLatency.With(lvs...).Observe(time.Since(begin).Seconds())
2221 }(time.Now())
2322
2423 output, err = mw.next.Uppercase(s)
2726
2827 func (mw instrumentingMiddleware) Count(s string) (n int) {
2928 defer func(begin time.Time) {
30 methodField := metrics.Field{Key: "method", Value: "count"}
31 errorField := metrics.Field{Key: "error", Value: fmt.Sprintf("%v", error(nil))}
32 mw.requestCount.With(methodField).With(errorField).Add(1)
33 mw.requestLatency.With(methodField).With(errorField).Observe(time.Since(begin))
34 mw.countResult.Observe(int64(n))
29 lvs := []string{"method", "count"}
30 mw.requestCount.With(lvs...).Add(1)
31 mw.requestLatency.With(lvs...).Observe(time.Since(begin).Seconds())
32 mw.countResult.Observe(float64(n))
3533 }(time.Now())
3634
3735 n = mw.next.Count(s)
22 import (
33 "net/http"
44 "os"
5 "time"
65
76 stdprometheus "github.com/prometheus/client_golang/prometheus"
87 "golang.org/x/net/context"
98
109 "github.com/go-kit/kit/log"
11 "github.com/go-kit/kit/metrics"
1210 kitprometheus "github.com/go-kit/kit/metrics/prometheus"
1311 httptransport "github.com/go-kit/kit/transport/http"
1412 )
1816 logger := log.NewLogfmtLogger(os.Stderr)
1917
2018 fieldKeys := []string{"method", "error"}
21 requestCount := kitprometheus.NewCounter(stdprometheus.CounterOpts{
19 requestCount := kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{
2220 Namespace: "my_group",
2321 Subsystem: "string_service",
2422 Name: "request_count",
2523 Help: "Number of requests received.",
2624 }, fieldKeys)
27 requestLatency := metrics.NewTimeHistogram(time.Microsecond, kitprometheus.NewSummary(stdprometheus.SummaryOpts{
25 requestLatency := kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
2826 Namespace: "my_group",
2927 Subsystem: "string_service",
3028 Name: "request_latency_microseconds",
3129 Help: "Total duration of requests in microseconds.",
32 }, fieldKeys))
33 countResult := kitprometheus.NewSummary(stdprometheus.SummaryOpts{
30 }, fieldKeys)
31 countResult := kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
3432 Namespace: "my_group",
3533 Subsystem: "string_service",
3634 Name: "count_result",
88
99 func instrumentingMiddleware(
1010 requestCount metrics.Counter,
11 requestLatency metrics.TimeHistogram,
11 requestLatency metrics.Histogram,
1212 countResult metrics.Histogram,
1313 ) ServiceMiddleware {
1414 return func(next StringService) StringService {
1818
1919 type instrmw struct {
2020 requestCount metrics.Counter
21 requestLatency metrics.TimeHistogram
21 requestLatency metrics.Histogram
2222 countResult metrics.Histogram
2323 StringService
2424 }
2525
2626 func (mw instrmw) Uppercase(s string) (output string, err error) {
2727 defer func(begin time.Time) {
28 methodField := metrics.Field{Key: "method", Value: "uppercase"}
29 errorField := metrics.Field{Key: "error", Value: fmt.Sprintf("%v", err)}
30 mw.requestCount.With(methodField).With(errorField).Add(1)
31 mw.requestLatency.With(methodField).With(errorField).Observe(time.Since(begin))
28 lvs := []string{"method", "uppercase", "error", fmt.Sprint(err == nil)}
29 mw.requestCount.With(lvs...).Add(1)
30 mw.requestLatency.With(lvs...).Observe(time.Since(begin).Seconds())
3231 }(time.Now())
3332
3433 output, err = mw.StringService.Uppercase(s)
3736
3837 func (mw instrmw) Count(s string) (n int) {
3938 defer func(begin time.Time) {
40 methodField := metrics.Field{Key: "method", Value: "count"}
41 errorField := metrics.Field{Key: "error", Value: fmt.Sprintf("%v", error(nil))}
42 mw.requestCount.With(methodField).With(errorField).Add(1)
43 mw.requestLatency.With(methodField).With(errorField).Observe(time.Since(begin))
44 mw.countResult.Observe(int64(n))
39 lvs := []string{"method", "uppercase"}
40 mw.requestCount.With(lvs...).Add(1)
41 mw.requestLatency.With(lvs...).Observe(time.Since(begin).Seconds())
42 mw.countResult.Observe(float64(n))
4543 }(time.Now())
4644
4745 n = mw.StringService.Count(s)
33 "flag"
44 "net/http"
55 "os"
6 "time"
76
87 stdprometheus "github.com/prometheus/client_golang/prometheus"
98 "golang.org/x/net/context"
109
1110 "github.com/go-kit/kit/log"
12 "github.com/go-kit/kit/metrics"
1311 kitprometheus "github.com/go-kit/kit/metrics/prometheus"
1412 httptransport "github.com/go-kit/kit/transport/http"
1513 )
2826 ctx := context.Background()
2927
3028 fieldKeys := []string{"method", "error"}
31 requestCount := kitprometheus.NewCounter(stdprometheus.CounterOpts{
29 requestCount := kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{
3230 Namespace: "my_group",
3331 Subsystem: "string_service",
3432 Name: "request_count",
3533 Help: "Number of requests received.",
3634 }, fieldKeys)
37 requestLatency := metrics.NewTimeHistogram(time.Microsecond, kitprometheus.NewSummary(stdprometheus.SummaryOpts{
35 requestLatency := kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
3836 Namespace: "my_group",
3937 Subsystem: "string_service",
4038 Name: "request_latency_microseconds",
4139 Help: "Total duration of requests in microseconds.",
42 }, fieldKeys))
43 countResult := kitprometheus.NewSummary(stdprometheus.SummaryOpts{
40 }, fieldKeys)
41 countResult := kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
4442 Namespace: "my_group",
4543 Subsystem: "string_service",
4644 Name: "count_result",