Moved to google.golang.org/genproto/googleapis/api/annotations
Fixes #52
This commit is contained in:
48
vendor/github.com/go-kit/kit/examples/stringsvc3/instrumenting.go
generated
vendored
Normal file
48
vendor/github.com/go-kit/kit/examples/stringsvc3/instrumenting.go
generated
vendored
Normal file
@@ -0,0 +1,48 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"time"
|
||||
|
||||
"github.com/go-kit/kit/metrics"
|
||||
)
|
||||
|
||||
func instrumentingMiddleware(
|
||||
requestCount metrics.Counter,
|
||||
requestLatency metrics.Histogram,
|
||||
countResult metrics.Histogram,
|
||||
) ServiceMiddleware {
|
||||
return func(next StringService) StringService {
|
||||
return instrmw{requestCount, requestLatency, countResult, next}
|
||||
}
|
||||
}
|
||||
|
||||
type instrmw struct {
|
||||
requestCount metrics.Counter
|
||||
requestLatency metrics.Histogram
|
||||
countResult metrics.Histogram
|
||||
StringService
|
||||
}
|
||||
|
||||
func (mw instrmw) Uppercase(s string) (output string, err error) {
|
||||
defer func(begin time.Time) {
|
||||
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.StringService.Uppercase(s)
|
||||
return
|
||||
}
|
||||
|
||||
func (mw instrmw) Count(s string) (n int) {
|
||||
defer func(begin time.Time) {
|
||||
lvs := []string{"method", "count", "error", "false"}
|
||||
mw.requestCount.With(lvs...).Add(1)
|
||||
mw.requestLatency.With(lvs...).Observe(time.Since(begin).Seconds())
|
||||
mw.countResult.Observe(float64(n))
|
||||
}(time.Now())
|
||||
|
||||
n = mw.StringService.Count(s)
|
||||
return
|
||||
}
|
47
vendor/github.com/go-kit/kit/examples/stringsvc3/logging.go
generated
vendored
Normal file
47
vendor/github.com/go-kit/kit/examples/stringsvc3/logging.go
generated
vendored
Normal file
@@ -0,0 +1,47 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"time"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
)
|
||||
|
||||
func loggingMiddleware(logger log.Logger) ServiceMiddleware {
|
||||
return func(next StringService) StringService {
|
||||
return logmw{logger, next}
|
||||
}
|
||||
}
|
||||
|
||||
type logmw struct {
|
||||
logger log.Logger
|
||||
StringService
|
||||
}
|
||||
|
||||
func (mw logmw) Uppercase(s string) (output string, err error) {
|
||||
defer func(begin time.Time) {
|
||||
_ = mw.logger.Log(
|
||||
"method", "uppercase",
|
||||
"input", s,
|
||||
"output", output,
|
||||
"err", err,
|
||||
"took", time.Since(begin),
|
||||
)
|
||||
}(time.Now())
|
||||
|
||||
output, err = mw.StringService.Uppercase(s)
|
||||
return
|
||||
}
|
||||
|
||||
func (mw logmw) Count(s string) (n int) {
|
||||
defer func(begin time.Time) {
|
||||
_ = mw.logger.Log(
|
||||
"method", "count",
|
||||
"input", s,
|
||||
"n", n,
|
||||
"took", time.Since(begin),
|
||||
)
|
||||
}(time.Now())
|
||||
|
||||
n = mw.StringService.Count(s)
|
||||
return
|
||||
}
|
69
vendor/github.com/go-kit/kit/examples/stringsvc3/main.go
generated
vendored
Normal file
69
vendor/github.com/go-kit/kit/examples/stringsvc3/main.go
generated
vendored
Normal file
@@ -0,0 +1,69 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"flag"
|
||||
"net/http"
|
||||
"os"
|
||||
|
||||
stdprometheus "github.com/prometheus/client_golang/prometheus"
|
||||
|
||||
"github.com/go-kit/kit/log"
|
||||
kitprometheus "github.com/go-kit/kit/metrics/prometheus"
|
||||
httptransport "github.com/go-kit/kit/transport/http"
|
||||
)
|
||||
|
||||
func main() {
|
||||
var (
|
||||
listen = flag.String("listen", ":8080", "HTTP listen address")
|
||||
proxy = flag.String("proxy", "", "Optional comma-separated list of URLs to proxy uppercase requests")
|
||||
)
|
||||
flag.Parse()
|
||||
|
||||
var logger log.Logger
|
||||
logger = log.NewLogfmtLogger(os.Stderr)
|
||||
logger = log.With(logger, "listen", *listen, "caller", log.DefaultCaller)
|
||||
|
||||
fieldKeys := []string{"method", "error"}
|
||||
requestCount := kitprometheus.NewCounterFrom(stdprometheus.CounterOpts{
|
||||
Namespace: "my_group",
|
||||
Subsystem: "string_service",
|
||||
Name: "request_count",
|
||||
Help: "Number of requests received.",
|
||||
}, fieldKeys)
|
||||
requestLatency := kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
|
||||
Namespace: "my_group",
|
||||
Subsystem: "string_service",
|
||||
Name: "request_latency_microseconds",
|
||||
Help: "Total duration of requests in microseconds.",
|
||||
}, fieldKeys)
|
||||
countResult := kitprometheus.NewSummaryFrom(stdprometheus.SummaryOpts{
|
||||
Namespace: "my_group",
|
||||
Subsystem: "string_service",
|
||||
Name: "count_result",
|
||||
Help: "The result of each count method.",
|
||||
}, []string{})
|
||||
|
||||
var svc StringService
|
||||
svc = stringService{}
|
||||
svc = proxyingMiddleware(context.Background(), *proxy, logger)(svc)
|
||||
svc = loggingMiddleware(logger)(svc)
|
||||
svc = instrumentingMiddleware(requestCount, requestLatency, countResult)(svc)
|
||||
|
||||
uppercaseHandler := httptransport.NewServer(
|
||||
makeUppercaseEndpoint(svc),
|
||||
decodeUppercaseRequest,
|
||||
encodeResponse,
|
||||
)
|
||||
countHandler := httptransport.NewServer(
|
||||
makeCountEndpoint(svc),
|
||||
decodeCountRequest,
|
||||
encodeResponse,
|
||||
)
|
||||
|
||||
http.Handle("/uppercase", uppercaseHandler)
|
||||
http.Handle("/count", countHandler)
|
||||
http.Handle("/metrics", stdprometheus.Handler())
|
||||
logger.Log("msg", "HTTP", "addr", *listen)
|
||||
logger.Log("err", http.ListenAndServe(*listen, nil))
|
||||
}
|
116
vendor/github.com/go-kit/kit/examples/stringsvc3/proxying.go
generated
vendored
Normal file
116
vendor/github.com/go-kit/kit/examples/stringsvc3/proxying.go
generated
vendored
Normal file
@@ -0,0 +1,116 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/url"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
jujuratelimit "github.com/juju/ratelimit"
|
||||
"github.com/sony/gobreaker"
|
||||
|
||||
"github.com/go-kit/kit/circuitbreaker"
|
||||
"github.com/go-kit/kit/endpoint"
|
||||
"github.com/go-kit/kit/log"
|
||||
"github.com/go-kit/kit/ratelimit"
|
||||
"github.com/go-kit/kit/sd"
|
||||
"github.com/go-kit/kit/sd/lb"
|
||||
httptransport "github.com/go-kit/kit/transport/http"
|
||||
)
|
||||
|
||||
func proxyingMiddleware(ctx context.Context, instances string, logger log.Logger) ServiceMiddleware {
|
||||
// If instances is empty, don't proxy.
|
||||
if instances == "" {
|
||||
logger.Log("proxy_to", "none")
|
||||
return func(next StringService) StringService { return next }
|
||||
}
|
||||
|
||||
// Set some parameters for our client.
|
||||
var (
|
||||
qps = 100 // beyond which we will return an error
|
||||
maxAttempts = 3 // per request, before giving up
|
||||
maxTime = 250 * time.Millisecond // wallclock time, before giving up
|
||||
)
|
||||
|
||||
// Otherwise, construct an endpoint for each instance in the list, and add
|
||||
// it to a fixed set of endpoints. In a real service, rather than doing this
|
||||
// by hand, you'd probably use package sd's support for your service
|
||||
// discovery system.
|
||||
var (
|
||||
instanceList = split(instances)
|
||||
subscriber sd.FixedSubscriber
|
||||
)
|
||||
logger.Log("proxy_to", fmt.Sprint(instanceList))
|
||||
for _, instance := range instanceList {
|
||||
var e endpoint.Endpoint
|
||||
e = makeUppercaseProxy(ctx, instance)
|
||||
e = circuitbreaker.Gobreaker(gobreaker.NewCircuitBreaker(gobreaker.Settings{}))(e)
|
||||
e = ratelimit.NewTokenBucketLimiter(jujuratelimit.NewBucketWithRate(float64(qps), int64(qps)))(e)
|
||||
subscriber = append(subscriber, e)
|
||||
}
|
||||
|
||||
// Now, build a single, retrying, load-balancing endpoint out of all of
|
||||
// those individual endpoints.
|
||||
balancer := lb.NewRoundRobin(subscriber)
|
||||
retry := lb.Retry(maxAttempts, maxTime, balancer)
|
||||
|
||||
// And finally, return the ServiceMiddleware, implemented by proxymw.
|
||||
return func(next StringService) StringService {
|
||||
return proxymw{ctx, next, retry}
|
||||
}
|
||||
}
|
||||
|
||||
// proxymw implements StringService, forwarding Uppercase requests to the
|
||||
// provided endpoint, and serving all other (i.e. Count) requests via the
|
||||
// next StringService.
|
||||
type proxymw struct {
|
||||
ctx context.Context
|
||||
next StringService // Serve most requests via this service...
|
||||
uppercase endpoint.Endpoint // ...except Uppercase, which gets served by this endpoint
|
||||
}
|
||||
|
||||
func (mw proxymw) Count(s string) int {
|
||||
return mw.next.Count(s)
|
||||
}
|
||||
|
||||
func (mw proxymw) Uppercase(s string) (string, error) {
|
||||
response, err := mw.uppercase(mw.ctx, uppercaseRequest{S: s})
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
|
||||
resp := response.(uppercaseResponse)
|
||||
if resp.Err != "" {
|
||||
return resp.V, errors.New(resp.Err)
|
||||
}
|
||||
return resp.V, nil
|
||||
}
|
||||
|
||||
func makeUppercaseProxy(ctx context.Context, instance string) endpoint.Endpoint {
|
||||
if !strings.HasPrefix(instance, "http") {
|
||||
instance = "http://" + instance
|
||||
}
|
||||
u, err := url.Parse(instance)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
if u.Path == "" {
|
||||
u.Path = "/uppercase"
|
||||
}
|
||||
return httptransport.NewClient(
|
||||
"GET",
|
||||
u,
|
||||
encodeRequest,
|
||||
decodeUppercaseResponse,
|
||||
).Endpoint()
|
||||
}
|
||||
|
||||
func split(s string) []string {
|
||||
a := strings.Split(s, ",")
|
||||
for i := range a {
|
||||
a[i] = strings.TrimSpace(a[i])
|
||||
}
|
||||
return a
|
||||
}
|
31
vendor/github.com/go-kit/kit/examples/stringsvc3/service.go
generated
vendored
Normal file
31
vendor/github.com/go-kit/kit/examples/stringsvc3/service.go
generated
vendored
Normal file
@@ -0,0 +1,31 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strings"
|
||||
)
|
||||
|
||||
// StringService provides operations on strings.
|
||||
type StringService interface {
|
||||
Uppercase(string) (string, error)
|
||||
Count(string) int
|
||||
}
|
||||
|
||||
type stringService struct{}
|
||||
|
||||
func (stringService) Uppercase(s string) (string, error) {
|
||||
if s == "" {
|
||||
return "", ErrEmpty
|
||||
}
|
||||
return strings.ToUpper(s), nil
|
||||
}
|
||||
|
||||
func (stringService) Count(s string) int {
|
||||
return len(s)
|
||||
}
|
||||
|
||||
// ErrEmpty is returned when an input string is empty.
|
||||
var ErrEmpty = errors.New("empty string")
|
||||
|
||||
// ServiceMiddleware is a chainable behavior modifier for StringService.
|
||||
type ServiceMiddleware func(StringService) StringService
|
84
vendor/github.com/go-kit/kit/examples/stringsvc3/transport.go
generated
vendored
Normal file
84
vendor/github.com/go-kit/kit/examples/stringsvc3/transport.go
generated
vendored
Normal file
@@ -0,0 +1,84 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
|
||||
"github.com/go-kit/kit/endpoint"
|
||||
)
|
||||
|
||||
func makeUppercaseEndpoint(svc StringService) endpoint.Endpoint {
|
||||
return func(ctx context.Context, request interface{}) (interface{}, error) {
|
||||
req := request.(uppercaseRequest)
|
||||
v, err := svc.Uppercase(req.S)
|
||||
if err != nil {
|
||||
return uppercaseResponse{v, err.Error()}, nil
|
||||
}
|
||||
return uppercaseResponse{v, ""}, nil
|
||||
}
|
||||
}
|
||||
|
||||
func makeCountEndpoint(svc StringService) endpoint.Endpoint {
|
||||
return func(ctx context.Context, request interface{}) (interface{}, error) {
|
||||
req := request.(countRequest)
|
||||
v := svc.Count(req.S)
|
||||
return countResponse{v}, nil
|
||||
}
|
||||
}
|
||||
|
||||
func decodeUppercaseRequest(_ context.Context, r *http.Request) (interface{}, error) {
|
||||
var request uppercaseRequest
|
||||
if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return request, nil
|
||||
}
|
||||
|
||||
func decodeCountRequest(_ context.Context, r *http.Request) (interface{}, error) {
|
||||
var request countRequest
|
||||
if err := json.NewDecoder(r.Body).Decode(&request); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return request, nil
|
||||
}
|
||||
|
||||
func decodeUppercaseResponse(_ context.Context, r *http.Response) (interface{}, error) {
|
||||
var response uppercaseResponse
|
||||
if err := json.NewDecoder(r.Body).Decode(&response); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return response, nil
|
||||
}
|
||||
|
||||
func encodeResponse(_ context.Context, w http.ResponseWriter, response interface{}) error {
|
||||
return json.NewEncoder(w).Encode(response)
|
||||
}
|
||||
|
||||
func encodeRequest(_ context.Context, r *http.Request, request interface{}) error {
|
||||
var buf bytes.Buffer
|
||||
if err := json.NewEncoder(&buf).Encode(request); err != nil {
|
||||
return err
|
||||
}
|
||||
r.Body = ioutil.NopCloser(&buf)
|
||||
return nil
|
||||
}
|
||||
|
||||
type uppercaseRequest struct {
|
||||
S string `json:"s"`
|
||||
}
|
||||
|
||||
type uppercaseResponse struct {
|
||||
V string `json:"v"`
|
||||
Err string `json:"err,omitempty"`
|
||||
}
|
||||
|
||||
type countRequest struct {
|
||||
S string `json:"s"`
|
||||
}
|
||||
|
||||
type countResponse struct {
|
||||
V int `json:"v"`
|
||||
}
|
Reference in New Issue
Block a user