Merge pull request #9845 from dcantah/prometheus-middleware-deprecated
Replace go-grpc-prometheus with go-grpc-middleware/providers/prometheus
This commit is contained in:
commit
b6ee1add7c
@ -37,9 +37,9 @@ import (
|
|||||||
"github.com/containerd/log"
|
"github.com/containerd/log"
|
||||||
"github.com/containerd/ttrpc"
|
"github.com/containerd/ttrpc"
|
||||||
"github.com/docker/go-metrics"
|
"github.com/docker/go-metrics"
|
||||||
grpc_middleware "github.com/grpc-ecosystem/go-grpc-middleware"
|
grpc_prometheus "github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus"
|
||||||
grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
|
|
||||||
v1 "github.com/opencontainers/image-spec/specs-go/v1"
|
v1 "github.com/opencontainers/image-spec/specs-go/v1"
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
"go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
|
"go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
|
||||||
"google.golang.org/grpc"
|
"google.golang.org/grpc"
|
||||||
"google.golang.org/grpc/backoff"
|
"google.golang.org/grpc/backoff"
|
||||||
@ -144,16 +144,25 @@ func New(ctx context.Context, config *srvconfig.Config) (*Server, error) {
|
|||||||
diff.RegisterProcessor(diff.BinaryHandler(id, p.Returns, p.Accepts, p.Path, p.Args, p.Env))
|
diff.RegisterProcessor(diff.BinaryHandler(id, p.Returns, p.Accepts, p.Path, p.Args, p.Env))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var prometheusServerMetricsOpts []grpc_prometheus.ServerMetricsOption
|
||||||
|
if config.Metrics.GRPCHistogram {
|
||||||
|
// Enable grpc time histograms to measure rpc latencies
|
||||||
|
prometheusServerMetricsOpts = append(prometheusServerMetricsOpts, grpc_prometheus.WithServerHandlingTimeHistogram())
|
||||||
|
}
|
||||||
|
|
||||||
|
prometheusServerMetrics := grpc_prometheus.NewServerMetrics(prometheusServerMetricsOpts...)
|
||||||
|
prometheus.MustRegister(prometheusServerMetrics)
|
||||||
|
|
||||||
serverOpts := []grpc.ServerOption{
|
serverOpts := []grpc.ServerOption{
|
||||||
grpc.StatsHandler(otelgrpc.NewServerHandler()),
|
grpc.StatsHandler(otelgrpc.NewServerHandler()),
|
||||||
grpc.StreamInterceptor(grpc_middleware.ChainStreamServer(
|
grpc.ChainStreamInterceptor(
|
||||||
grpc_prometheus.StreamServerInterceptor,
|
|
||||||
streamNamespaceInterceptor,
|
streamNamespaceInterceptor,
|
||||||
)),
|
prometheusServerMetrics.StreamServerInterceptor(),
|
||||||
grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(
|
),
|
||||||
grpc_prometheus.UnaryServerInterceptor,
|
grpc.ChainUnaryInterceptor(
|
||||||
unaryNamespaceInterceptor,
|
unaryNamespaceInterceptor,
|
||||||
)),
|
prometheusServerMetrics.UnaryServerInterceptor(),
|
||||||
|
),
|
||||||
}
|
}
|
||||||
if config.GRPC.MaxRecvMsgSize > 0 {
|
if config.GRPC.MaxRecvMsgSize > 0 {
|
||||||
serverOpts = append(serverOpts, grpc.MaxRecvMsgSize(config.GRPC.MaxRecvMsgSize))
|
serverOpts = append(serverOpts, grpc.MaxRecvMsgSize(config.GRPC.MaxRecvMsgSize))
|
||||||
@ -213,10 +222,11 @@ func New(ctx context.Context, config *srvconfig.Config) (*Server, error) {
|
|||||||
ttrpcServices []ttrpcService
|
ttrpcServices []ttrpcService
|
||||||
|
|
||||||
s = &Server{
|
s = &Server{
|
||||||
grpcServer: grpcServer,
|
prometheusServerMetrics: prometheusServerMetrics,
|
||||||
tcpServer: tcpServer,
|
grpcServer: grpcServer,
|
||||||
ttrpcServer: ttrpcServer,
|
tcpServer: tcpServer,
|
||||||
config: config,
|
ttrpcServer: ttrpcServer,
|
||||||
|
config: config,
|
||||||
}
|
}
|
||||||
initialized = plugin.NewPluginSet()
|
initialized = plugin.NewPluginSet()
|
||||||
required = make(map[string]struct{})
|
required = make(map[string]struct{})
|
||||||
@ -364,24 +374,18 @@ func recordConfigDeprecations(ctx context.Context, config *srvconfig.Config, set
|
|||||||
|
|
||||||
// Server is the containerd main daemon
|
// Server is the containerd main daemon
|
||||||
type Server struct {
|
type Server struct {
|
||||||
grpcServer *grpc.Server
|
prometheusServerMetrics *grpc_prometheus.ServerMetrics
|
||||||
ttrpcServer *ttrpc.Server
|
grpcServer *grpc.Server
|
||||||
tcpServer *grpc.Server
|
ttrpcServer *ttrpc.Server
|
||||||
config *srvconfig.Config
|
tcpServer *grpc.Server
|
||||||
plugins []*plugin.Plugin
|
config *srvconfig.Config
|
||||||
ready sync.WaitGroup
|
plugins []*plugin.Plugin
|
||||||
|
ready sync.WaitGroup
|
||||||
}
|
}
|
||||||
|
|
||||||
// ServeGRPC provides the containerd grpc APIs on the provided listener
|
// ServeGRPC provides the containerd grpc APIs on the provided listener
|
||||||
func (s *Server) ServeGRPC(l net.Listener) error {
|
func (s *Server) ServeGRPC(l net.Listener) error {
|
||||||
if s.config.Metrics.GRPCHistogram {
|
s.prometheusServerMetrics.InitializeMetrics(s.grpcServer)
|
||||||
// enable grpc time histograms to measure rpc latencies
|
|
||||||
grpc_prometheus.EnableHandlingTimeHistogram()
|
|
||||||
}
|
|
||||||
// before we start serving the grpc API register the grpc_prometheus metrics
|
|
||||||
// handler. This needs to be the last service registered so that it can collect
|
|
||||||
// metrics for every other service
|
|
||||||
grpc_prometheus.Register(s.grpcServer)
|
|
||||||
return trapClosedConnErr(s.grpcServer.Serve(l))
|
return trapClosedConnErr(s.grpcServer.Serve(l))
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -403,7 +407,7 @@ func (s *Server) ServeMetrics(l net.Listener) error {
|
|||||||
|
|
||||||
// ServeTCP allows services to serve over tcp
|
// ServeTCP allows services to serve over tcp
|
||||||
func (s *Server) ServeTCP(l net.Listener) error {
|
func (s *Server) ServeTCP(l net.Listener) error {
|
||||||
grpc_prometheus.Register(s.tcpServer)
|
s.prometheusServerMetrics.InitializeMetrics(s.tcpServer)
|
||||||
return trapClosedConnErr(s.tcpServer.Serve(l))
|
return trapClosedConnErr(s.tcpServer.Serve(l))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
4
go.mod
4
go.mod
@ -33,8 +33,7 @@ require (
|
|||||||
github.com/fsnotify/fsnotify v1.7.0
|
github.com/fsnotify/fsnotify v1.7.0
|
||||||
github.com/google/go-cmp v0.6.0
|
github.com/google/go-cmp v0.6.0
|
||||||
github.com/google/uuid v1.6.0
|
github.com/google/uuid v1.6.0
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0
|
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.0
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
|
||||||
github.com/intel/goresctrl v0.6.0
|
github.com/intel/goresctrl v0.6.0
|
||||||
github.com/klauspost/compress v1.17.6
|
github.com/klauspost/compress v1.17.6
|
||||||
github.com/minio/sha256-simd v1.0.1
|
github.com/minio/sha256-simd v1.0.1
|
||||||
@ -98,6 +97,7 @@ require (
|
|||||||
github.com/golang/protobuf v1.5.3 // indirect
|
github.com/golang/protobuf v1.5.3 // indirect
|
||||||
github.com/google/gofuzz v1.2.0 // indirect
|
github.com/google/gofuzz v1.2.0 // indirect
|
||||||
github.com/gorilla/websocket v1.5.0 // indirect
|
github.com/gorilla/websocket v1.5.0 // indirect
|
||||||
|
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.3 // indirect
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 // indirect
|
||||||
github.com/hashicorp/errwrap v1.1.0 // indirect
|
github.com/hashicorp/errwrap v1.1.0 // indirect
|
||||||
github.com/json-iterator/go v1.1.12 // indirect
|
github.com/json-iterator/go v1.1.12 // indirect
|
||||||
|
280
go.sum
280
go.sum
@ -1,16 +1,49 @@
|
|||||||
cloud.google.com/go v0.26.0 h1:e0WKqKTd5BnrG8aKH3J3h+QvEIQtSUcf2n5UZ5ZgLtQ=
|
|
||||||
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
|
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
|
||||||
|
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
|
||||||
|
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
|
||||||
|
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
|
||||||
|
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
|
||||||
|
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
|
||||||
|
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
|
||||||
|
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
|
||||||
|
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
|
||||||
|
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
|
||||||
|
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
|
||||||
|
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
|
||||||
|
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
|
||||||
|
cloud.google.com/go v0.65.0 h1:Dg9iHVQfrhq82rUNu9ZxUDrJLaxFUe/HlCVaLyRruq8=
|
||||||
|
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
|
||||||
|
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
|
||||||
|
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
|
||||||
|
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
|
||||||
|
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
|
||||||
|
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
|
||||||
|
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
|
||||||
cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk=
|
cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk=
|
||||||
cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI=
|
cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI=
|
||||||
cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
|
cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY=
|
||||||
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
|
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
|
||||||
|
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
|
||||||
|
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
|
||||||
|
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
|
||||||
|
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
|
||||||
|
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
|
||||||
|
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
|
||||||
|
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
|
||||||
|
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
|
||||||
|
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
|
||||||
|
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
|
||||||
|
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
|
||||||
dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
|
dario.cat/mergo v1.0.0 h1:AGCNq9Evsj31mOgNPcLyXc+4PNABt905YmuqPYYpBWk=
|
||||||
dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
|
dario.cat/mergo v1.0.0/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk=
|
||||||
|
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
|
||||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU=
|
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU=
|
||||||
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
|
github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8=
|
||||||
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 h1:59MxjQVfjXsBpLy+dbd2/ELV5ofnUkUZBvWSC85sheA=
|
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0 h1:59MxjQVfjXsBpLy+dbd2/ELV5ofnUkUZBvWSC85sheA=
|
||||||
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0/go.mod h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU=
|
github.com/AdamKorcz/go-118-fuzz-build v0.0.0-20230306123547-8075edf89bb0/go.mod h1:OahwfttHWG6eJ0clwcfBAHoDI6X/LV/15hx/wlMZSrU=
|
||||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||||
|
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||||
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
|
github.com/Microsoft/go-winio v0.6.1 h1:9/kr64B9VUZrLm5YYwbGtUJnMgqWVOdUAXu6Migciow=
|
||||||
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
|
github.com/Microsoft/go-winio v0.6.1/go.mod h1:LRdKpFKfdobln8UmuiYcKPot9D2v6svN5+sAH+4kjUM=
|
||||||
github.com/Microsoft/hcsshim v0.12.0-rc.3 h1:5GNGrobGs/sN/0nFO21W9k4lFn+iXXZAE8fCZbmdRak=
|
github.com/Microsoft/hcsshim v0.12.0-rc.3 h1:5GNGrobGs/sN/0nFO21W9k4lFn+iXXZAE8fCZbmdRak=
|
||||||
@ -19,7 +52,6 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy
|
|||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
|
||||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
|
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5 h1:0CwZNZbxp69SHPdPJAN/hZIm0C4OItdklCFmMRWYpio=
|
||||||
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
|
github.com/armon/go-socks5 v0.0.0-20160902184237-e75332964ef5/go.mod h1:wHh0iHkYZB8zMSxRWpUBQtwG5a7fFgvEO+odwuTv2gs=
|
||||||
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
|
|
||||||
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
|
||||||
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
|
||||||
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
|
||||||
@ -38,6 +70,7 @@ github.com/cilium/ebpf v0.11.0 h1:V8gS/bTCCjX9uUnkUFUpPsksM8n1lXBAvHcpiFk1X2Y=
|
|||||||
github.com/cilium/ebpf v0.11.0/go.mod h1:WE7CZAnqOL2RouJ4f1uyNhqr2P4CCvXFIqdRDUgWsVs=
|
github.com/cilium/ebpf v0.11.0/go.mod h1:WE7CZAnqOL2RouJ4f1uyNhqr2P4CCvXFIqdRDUgWsVs=
|
||||||
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
|
||||||
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
|
||||||
|
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
|
||||||
github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101 h1:7To3pQ+pZo0i3dsWEbinPNFs5gPSBOsJtx3wTT94VBY=
|
github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101 h1:7To3pQ+pZo0i3dsWEbinPNFs5gPSBOsJtx3wTT94VBY=
|
||||||
github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
github.com/cncf/xds/go v0.0.0-20231109132714-523115ebc101/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
|
||||||
github.com/containerd/btrfs/v2 v2.0.0 h1:FN4wsx7KQrYoLXN7uLP0vBV4oVWHOIKDRQ1G2Z0oL5M=
|
github.com/containerd/btrfs/v2 v2.0.0 h1:FN4wsx7KQrYoLXN7uLP0vBV4oVWHOIKDRQ1G2Z0oL5M=
|
||||||
@ -92,6 +125,7 @@ github.com/emicklei/go-restful/v3 v3.11.0/go.mod h1:6n3XBCmQQb25CM2LCACGz8ukIrRr
|
|||||||
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
|
||||||
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
|
||||||
|
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
|
||||||
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
|
||||||
github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA=
|
github.com/envoyproxy/protoc-gen-validate v1.0.2 h1:QkIBuU5k+x7/QXPvPPnWXWlCdaBFApVqftFV6k087DA=
|
||||||
github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE=
|
github.com/envoyproxy/protoc-gen-validate v1.0.2/go.mod h1:GpiZQP3dDbg4JouG/NNS7QWXpgx6x8QiMKdmN72jogE=
|
||||||
@ -103,11 +137,12 @@ github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMo
|
|||||||
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
|
||||||
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
|
github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
|
||||||
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
|
github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
|
||||||
|
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
|
||||||
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
|
||||||
github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY=
|
|
||||||
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
|
||||||
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
|
||||||
github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A=
|
|
||||||
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
|
||||||
github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
|
||||||
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
|
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
|
||||||
@ -131,14 +166,24 @@ github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7a
|
|||||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||||
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
|
||||||
|
github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
|
github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE=
|
||||||
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
|
||||||
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
|
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
|
||||||
|
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
|
||||||
|
github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
|
github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
|
github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
|
||||||
|
github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
|
||||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||||
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
|
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
|
||||||
|
github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
|
||||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||||
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
|
||||||
@ -151,13 +196,17 @@ github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaS
|
|||||||
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||||
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
|
||||||
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
|
||||||
|
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
|
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
|
||||||
github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
|
github.com/google/gnostic-models v0.6.8 h1:yo/ABAfM5IMRsS1VnXjTBvUb61tFIHozhlYvRgGre9I=
|
||||||
github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
|
github.com/google/gnostic-models v0.6.8/go.mod h1:5n7qKqH0f5wFt+aWF8CW6pZLLNOfYuF5OpfBSENuI8U=
|
||||||
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
|
||||||
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
|
||||||
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
|
github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
|
||||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||||
@ -166,20 +215,32 @@ github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeN
|
|||||||
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0=
|
||||||
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
|
||||||
|
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
|
||||||
|
github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
|
||||||
|
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
|
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
|
||||||
|
github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
|
github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
|
||||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||||
github.com/google/pprof v0.0.0-20230323073829-e72429f035bd h1:r8yyd+DJDmsUhGrRBxH5Pj7KeFK5l+Y3FsgT8keqKtk=
|
github.com/google/pprof v0.0.0-20230323073829-e72429f035bd h1:r8yyd+DJDmsUhGrRBxH5Pj7KeFK5l+Y3FsgT8keqKtk=
|
||||||
github.com/google/pprof v0.0.0-20230323073829-e72429f035bd/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk=
|
github.com/google/pprof v0.0.0-20230323073829-e72429f035bd/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk=
|
||||||
|
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||||
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
|
||||||
|
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
|
||||||
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
|
github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWmnc=
|
||||||
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0 h1:UH//fgunKIs4JdUbpDl1VZCDaL56wXCB/5+wF6uHfaI=
|
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.0 h1:f4tggROQKKcnh4eItay6z/HbHLqghBxS8g7pyMhmDio=
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware v1.4.0/go.mod h1:g5qyo/la0ALbONm6Vbp88Yd8NsDy6rZz+RcrMPxvld8=
|
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.0/go.mod h1:hKAkSgNkL0FII46ZkJcpVEAai4KV+swlIWCKfekd1pA=
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho=
|
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.3 h1:o95KDiV/b1xdkumY5YbLR0/n2+wBxUpgf3HgfKgTyLI=
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
|
github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.3/go.mod h1:hTxjzRcX49ogbTGVJ1sM5mz5s+SSgiGIyL3jjPxl32E=
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0 h1:Wqo399gCIufwto+VfwCSvsnfGpF/w5E9CNxSwbpD6No=
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=
|
github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0/go.mod h1:qmOFXW2epJhM0qSnUUYpldc7gVz2KMQwJ/QYCDIa7XU=
|
||||||
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
@ -187,7 +248,10 @@ github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY
|
|||||||
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
|
||||||
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
|
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
|
||||||
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
|
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
|
||||||
|
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
|
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
|
||||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||||
|
github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||||
github.com/intel/goresctrl v0.6.0 h1:lOqo9o+uXtqPwSB4vpd1greUcWlkBSTPdnbTFgRILf4=
|
github.com/intel/goresctrl v0.6.0 h1:lOqo9o+uXtqPwSB4vpd1greUcWlkBSTPdnbTFgRILf4=
|
||||||
github.com/intel/goresctrl v0.6.0/go.mod h1:Qg+rhwvfW78p22OJi649sCH71bJIBX7zT0b+IGe69eE=
|
github.com/intel/goresctrl v0.6.0/go.mod h1:Qg+rhwvfW78p22OJi649sCH71bJIBX7zT0b+IGe69eE=
|
||||||
@ -197,6 +261,8 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV
|
|||||||
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
|
||||||
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
|
||||||
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
|
||||||
|
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
|
||||||
|
github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
|
||||||
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
|
||||||
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8=
|
||||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||||
@ -274,11 +340,9 @@ github.com/opencontainers/runtime-tools v0.9.1-0.20221107090550-2e043c6bd626/go.
|
|||||||
github.com/opencontainers/selinux v1.9.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI=
|
github.com/opencontainers/selinux v1.9.1/go.mod h1:2i0OySw99QjzBBQByd1Gr9gSjvuho1lHsJxIJ3gGbJI=
|
||||||
github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU=
|
github.com/opencontainers/selinux v1.11.0 h1:+5Zbo97w3Lbmb3PeqQtpmTkMwsW5nRI3YaLpt7tQ7oU=
|
||||||
github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec=
|
github.com/opencontainers/selinux v1.11.0/go.mod h1:E5dMC3VPuVvVHDYmi78qvhJp8+M586T4DlDRYpFkyec=
|
||||||
github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
|
|
||||||
github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI=
|
github.com/pelletier/go-toml/v2 v2.1.1 h1:LWAJwfNvjQZCFIDKWYQaM62NcYeYViCmWIwmOStowAI=
|
||||||
github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
|
github.com/pelletier/go-toml/v2 v2.1.1/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc=
|
||||||
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
|
||||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||||
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
@ -302,12 +366,12 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT
|
|||||||
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
|
github.com/prometheus/procfs v0.0.3/go.mod h1:4A/X28fw3Fc593LaREMrKMqOKvUAntwMDaekg4FpcdQ=
|
||||||
github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI=
|
github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI=
|
||||||
github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY=
|
github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY=
|
||||||
|
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||||
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
|
||||||
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
|
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
|
||||||
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
||||||
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
|
||||||
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
|
||||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
|
||||||
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0=
|
||||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||||
@ -349,11 +413,18 @@ github.com/xeipuuv/gojsonschema v1.2.0 h1:LhYJRs+L4fBtjZUfuSZIKGeVu0QRy8e5Xi7D17
|
|||||||
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
|
github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y=
|
||||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
|
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
|
||||||
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
|
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
|
||||||
|
github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
|
github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||||
go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA=
|
go.etcd.io/bbolt v1.3.8 h1:xs88BrvEv273UsB79e0hcVrlUWmS0a8upikMFhSyAtA=
|
||||||
go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=
|
go.etcd.io/bbolt v1.3.8/go.mod h1:N9Mkw9X8x5fupy0IKsmuqVtoGDyxsaDlbk4Rd05IAQw=
|
||||||
|
go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
|
||||||
|
go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
|
||||||
|
go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
|
go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
|
go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
|
||||||
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
|
go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0=
|
||||||
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
|
go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo=
|
||||||
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.48.0 h1:P+/g8GpuJGYbOp2tAdKrIPUX9JO02q8Q0YNlHolpibA=
|
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.48.0 h1:P+/g8GpuJGYbOp2tAdKrIPUX9JO02q8Q0YNlHolpibA=
|
||||||
@ -376,24 +447,45 @@ go.opentelemetry.io/otel/trace v1.23.1 h1:4LrmmEd8AU2rFvU1zegmvqW7+kWarxtNOPyeL6
|
|||||||
go.opentelemetry.io/otel/trace v1.23.1/go.mod h1:4IpnpJFwr1mo/6HL8XIPJaE9y0+u1KcVmuW7dwFSVrI=
|
go.opentelemetry.io/otel/trace v1.23.1/go.mod h1:4IpnpJFwr1mo/6HL8XIPJaE9y0+u1KcVmuW7dwFSVrI=
|
||||||
go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=
|
go.opentelemetry.io/proto/otlp v1.1.0 h1:2Di21piLrCqJ3U3eXGCTPHE9R8Nh+0uglSnOyxikMeI=
|
||||||
go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=
|
go.opentelemetry.io/proto/otlp v1.1.0/go.mod h1:GpBHCBWiqvVLDqmHZsoMM3C5ySeKTC7ej/RNTae6MdY=
|
||||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
|
||||||
go.uber.org/goleak v1.1.10/go.mod h1:8a7PlsEVH3e/a/GLqe5IIrQx6GzcnRmZEufDUTk4A7A=
|
|
||||||
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
|
||||||
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
|
||||||
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
|
|
||||||
go.uber.org/zap v1.18.1/go.mod h1:xg/QME4nWcxGxrpdeYfq7UvYrLh66cuVKdrbD1XF/NI=
|
|
||||||
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||||
|
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
|
golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||||
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
|
||||||
|
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
|
||||||
|
golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
|
||||||
|
golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
|
||||||
|
golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||||
|
golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||||
|
golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
|
||||||
|
golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
|
||||||
|
golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
|
||||||
golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=
|
golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611 h1:qCEDpW1G+vcj3Y7Fy52pEM1AWm3abj8WimGYejI3SC4=
|
||||||
golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=
|
golang.org/x/exp v0.0.0-20231214170342-aacd6d4b4611/go.mod h1:iRJReGqOEeBhDZGkGbynYwcHlctCvnjTYIamk7uXpHI=
|
||||||
|
golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||||
|
golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||||
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
|
||||||
|
golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
|
||||||
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||||
|
golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
|
||||||
|
golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
|
golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
|
||||||
|
golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
|
||||||
|
golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
|
||||||
|
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||||
|
golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
|
||||||
|
golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||||
|
golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
|
||||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||||
@ -403,28 +495,56 @@ golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73r
|
|||||||
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
|
golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||||
|
golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
|
||||||
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||||
|
golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||||
|
golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
|
golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
|
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
|
||||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||||
|
golang.org/x/net v0.0.0-20210423184538-5f58ad60dda6/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||||
golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
|
golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
|
||||||
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
|
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
|
||||||
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
|
||||||
|
golang.org/x/oauth2 v0.0.0-20210413134643-5e61552d6c78/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
|
||||||
golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ=
|
golang.org/x/oauth2 v0.15.0 h1:s8pnnxNVzjWyrvYdFUQq5llS1PX2zhPXmccZv99h7uQ=
|
||||||
golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM=
|
golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM=
|
||||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
|
golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||||
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
|
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
|
||||||
@ -434,18 +554,37 @@ golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5h
|
|||||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||||
|
golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190801041406-cbf593c0f2f3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191115151921-52ab43148777/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200217220822-9197077df867/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200728102440-3e129f6d46b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
|
golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||||
@ -463,23 +602,62 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn
|
|||||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||||
golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE=
|
golang.org/x/term v0.16.0 h1:m+B6fahuftsE9qjo0VWp2FW0mB3MTJvR0BaMQrq0pmE=
|
||||||
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
|
golang.org/x/term v0.16.0/go.mod h1:yn7UURbUtPyrVJPGPq404EukNFxcm/foM+bV/bfcDsY=
|
||||||
|
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||||
|
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
|
||||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||||
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
|
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
|
||||||
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
|
||||||
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
|
||||||
|
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
|
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
||||||
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
golang.org/x/time v0.3.0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
|
||||||
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
|
||||||
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
|
||||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||||
|
golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
|
golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
|
||||||
golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||||
|
golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||||
|
golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
|
||||||
|
golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
|
||||||
|
golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
|
||||||
|
golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
|
||||||
|
golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||||
|
golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
|
golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
|
golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
|
||||||
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||||
@ -489,14 +667,60 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
|
|||||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||||
|
google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
|
||||||
|
google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
|
||||||
|
google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||||
|
google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
|
||||||
|
google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||||
|
google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||||
|
google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
|
||||||
|
google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
|
||||||
|
google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
||||||
|
google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
|
||||||
|
google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
|
||||||
|
google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
|
||||||
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
|
||||||
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
|
google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
|
||||||
|
google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
|
||||||
|
google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||||
|
google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
|
||||||
google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
|
google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM=
|
||||||
google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
|
google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds=
|
||||||
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
|
||||||
|
google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
|
||||||
|
google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
|
||||||
google.golang.org/genproto v0.0.0-20200423170343-7949de9c1215/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
|
||||||
|
google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
|
||||||
|
google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
|
||||||
|
google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
|
||||||
|
google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
|
||||||
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
|
||||||
|
google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
|
||||||
|
google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/genproto v0.0.0-20200806141610-86f49bd18e98/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
|
google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
|
||||||
google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 h1:YJ5pD9rF8o9Qtta0Cmy9rdBwkSjrTCT6XTiUQVOtIos=
|
google.golang.org/genproto v0.0.0-20231212172506-995d672761c0 h1:YJ5pD9rF8o9Qtta0Cmy9rdBwkSjrTCT6XTiUQVOtIos=
|
||||||
google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY=
|
google.golang.org/genproto v0.0.0-20231212172506-995d672761c0/go.mod h1:l/k7rMz0vFTBPy+tFSGvXEd3z+BcoG1k7EHbqm+YBsY=
|
||||||
google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 h1:rcS6EyEaoCO52hQDupoSfrxI3R6C2Tq741is7X8OvnM=
|
google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917 h1:rcS6EyEaoCO52hQDupoSfrxI3R6C2Tq741is7X8OvnM=
|
||||||
@ -504,13 +728,22 @@ google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.
|
|||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 h1:6G8oQ016D88m1xAKljMlBOOGWDZkes4kMhgGFlf8WcQ=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917 h1:6G8oQ016D88m1xAKljMlBOOGWDZkes4kMhgGFlf8WcQ=
|
||||||
google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU=
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU=
|
||||||
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
|
||||||
|
google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
|
||||||
|
google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
|
||||||
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
|
||||||
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
|
||||||
|
google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
|
google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
|
||||||
|
google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
|
||||||
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
|
||||||
|
google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
|
google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
|
||||||
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
google.golang.org/grpc v1.33.2/go.mod h1:JMHMWHQWaTccqQQlmk3MJZS+GWXOdAesneDmEnv2fbc=
|
||||||
|
google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
|
||||||
google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0=
|
google.golang.org/grpc v1.61.0 h1:TOvOcuXn30kRao+gfcvsebNEa5iZIiLkisYEkf7R7o0=
|
||||||
google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs=
|
google.golang.org/grpc v1.61.0/go.mod h1:VUbo7IFqmF1QtCAstipjG0GIoq49KvMe9+h1jFLBNJs=
|
||||||
|
google.golang.org/grpc/examples v0.0.0-20210424002626-9572fd6faeae/go.mod h1:Ly7ZA/ARzg8fnPU9TyZIxoz33sEUuWX7txiqs8lPTgE=
|
||||||
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
|
||||||
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
|
||||||
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
|
||||||
@ -519,6 +752,7 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi
|
|||||||
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
|
||||||
|
google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
|
||||||
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
|
||||||
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
|
||||||
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
|
||||||
@ -530,6 +764,7 @@ gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8
|
|||||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
||||||
|
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||||
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
|
||||||
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
|
gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc=
|
||||||
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw=
|
||||||
@ -542,11 +777,15 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
|||||||
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
|
||||||
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
|
||||||
|
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
||||||
|
honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
|
honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
|
||||||
k8s.io/api v0.29.1 h1:DAjwWX/9YT7NQD4INu49ROJuZAAAP/Ijki48GUPzxqw=
|
k8s.io/api v0.29.1 h1:DAjwWX/9YT7NQD4INu49ROJuZAAAP/Ijki48GUPzxqw=
|
||||||
k8s.io/api v0.29.1/go.mod h1:7Kl10vBRUXhnQQI8YR/R327zXC8eJ7887/+Ybta+RoQ=
|
k8s.io/api v0.29.1/go.mod h1:7Kl10vBRUXhnQQI8YR/R327zXC8eJ7887/+Ybta+RoQ=
|
||||||
k8s.io/apimachinery v0.29.1 h1:KY4/E6km/wLBguvCZv8cKTeOwwOBqFNjwJIdMkMbbRc=
|
k8s.io/apimachinery v0.29.1 h1:KY4/E6km/wLBguvCZv8cKTeOwwOBqFNjwJIdMkMbbRc=
|
||||||
@ -567,6 +806,9 @@ k8s.io/kubelet v0.29.1 h1:cso8Dk8dymkj8q+EvW/aCbIYU2aOkH27gho48tYza/8=
|
|||||||
k8s.io/kubelet v0.29.1/go.mod h1:hTl/naFcCVG1Ku17fMgj/krbheBwBkf3gnFhaboMx7E=
|
k8s.io/kubelet v0.29.1/go.mod h1:hTl/naFcCVG1Ku17fMgj/krbheBwBkf3gnFhaboMx7E=
|
||||||
k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI=
|
k8s.io/utils v0.0.0-20230726121419-3b25d923346b h1:sgn3ZU783SCgtaSJjpcVVlRqd6GSnlTLKgpAAttJvpI=
|
||||||
k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
k8s.io/utils v0.0.0-20230726121419-3b25d923346b/go.mod h1:OLgZIPagt7ERELqWJFomSt595RzquPNLL48iOWgYOg0=
|
||||||
|
rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
|
||||||
|
rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
|
||||||
|
rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
|
||||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
|
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd h1:EDPBXCAspyGV4jQlpZSudPeMmr1bNJefnuqLsRAsHZo=
|
||||||
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
|
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd/go.mod h1:B8JuhiUyNFVKdsE8h686QcCxMaH6HrOAZj4vswFpcB0=
|
||||||
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
|
sigs.k8s.io/structured-merge-diff/v4 v4.4.1 h1:150L+0vs/8DA78h1u02ooW1/fFq/Lwr+sGiqlzvrtq4=
|
||||||
|
204
vendor/github.com/grpc-ecosystem/go-grpc-middleware/.gitignore
generated
vendored
204
vendor/github.com/grpc-ecosystem/go-grpc-middleware/.gitignore
generated
vendored
@ -1,204 +0,0 @@
|
|||||||
# Created by .ignore support plugin (hsz.mobi)
|
|
||||||
### Go template
|
|
||||||
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
|
||||||
*.o
|
|
||||||
*.a
|
|
||||||
*.so
|
|
||||||
|
|
||||||
# Folders
|
|
||||||
_obj
|
|
||||||
_test
|
|
||||||
|
|
||||||
# Architecture specific extensions/prefixes
|
|
||||||
*.[568vq]
|
|
||||||
[568vq].out
|
|
||||||
|
|
||||||
*.cgo1.go
|
|
||||||
*.cgo2.c
|
|
||||||
_cgo_defun.c
|
|
||||||
_cgo_gotypes.go
|
|
||||||
_cgo_export.*
|
|
||||||
|
|
||||||
_testmain.go
|
|
||||||
|
|
||||||
*.exe
|
|
||||||
*.test
|
|
||||||
*.prof
|
|
||||||
### Windows template
|
|
||||||
# Windows image file caches
|
|
||||||
Thumbs.db
|
|
||||||
ehthumbs.db
|
|
||||||
|
|
||||||
# Folder config file
|
|
||||||
Desktop.ini
|
|
||||||
|
|
||||||
# Recycle Bin used on file shares
|
|
||||||
$RECYCLE.BIN/
|
|
||||||
|
|
||||||
# Windows Installer files
|
|
||||||
*.cab
|
|
||||||
*.msi
|
|
||||||
*.msm
|
|
||||||
*.msp
|
|
||||||
|
|
||||||
# Windows shortcuts
|
|
||||||
*.lnk
|
|
||||||
### Kate template
|
|
||||||
# Swap Files #
|
|
||||||
.*.kate-swp
|
|
||||||
.swp.*
|
|
||||||
### SublimeText template
|
|
||||||
# cache files for sublime text
|
|
||||||
*.tmlanguage.cache
|
|
||||||
*.tmPreferences.cache
|
|
||||||
*.stTheme.cache
|
|
||||||
|
|
||||||
# workspace files are user-specific
|
|
||||||
*.sublime-workspace
|
|
||||||
|
|
||||||
# project files should be checked into the repository, unless a significant
|
|
||||||
# proportion of contributors will probably not be using SublimeText
|
|
||||||
# *.sublime-project
|
|
||||||
|
|
||||||
# sftp configuration file
|
|
||||||
sftp-config.json
|
|
||||||
### Linux template
|
|
||||||
*~
|
|
||||||
|
|
||||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
|
||||||
.fuse_hidden*
|
|
||||||
|
|
||||||
# KDE directory preferences
|
|
||||||
.directory
|
|
||||||
|
|
||||||
# Linux trash folder which might appear on any partition or disk
|
|
||||||
.Trash-*
|
|
||||||
### JetBrains template
|
|
||||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
|
|
||||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
|
||||||
|
|
||||||
# User-specific stuff:
|
|
||||||
.idea
|
|
||||||
.idea/tasks.xml
|
|
||||||
.idea/dictionaries
|
|
||||||
.idea/vcs.xml
|
|
||||||
.idea/jsLibraryMappings.xml
|
|
||||||
|
|
||||||
# Sensitive or high-churn files:
|
|
||||||
.idea/dataSources.ids
|
|
||||||
.idea/dataSources.xml
|
|
||||||
.idea/dataSources.local.xml
|
|
||||||
.idea/sqlDataSources.xml
|
|
||||||
.idea/dynamic.xml
|
|
||||||
.idea/uiDesigner.xml
|
|
||||||
|
|
||||||
# Gradle:
|
|
||||||
.idea/gradle.xml
|
|
||||||
.idea/libraries
|
|
||||||
|
|
||||||
# Mongo Explorer plugin:
|
|
||||||
.idea/mongoSettings.xml
|
|
||||||
|
|
||||||
## File-based project format:
|
|
||||||
*.iws
|
|
||||||
|
|
||||||
## Plugin-specific files:
|
|
||||||
|
|
||||||
# IntelliJ
|
|
||||||
/out/
|
|
||||||
|
|
||||||
# mpeltonen/sbt-idea plugin
|
|
||||||
.idea_modules/
|
|
||||||
|
|
||||||
# JIRA plugin
|
|
||||||
atlassian-ide-plugin.xml
|
|
||||||
|
|
||||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
|
||||||
com_crashlytics_export_strings.xml
|
|
||||||
crashlytics.properties
|
|
||||||
crashlytics-build.properties
|
|
||||||
fabric.properties
|
|
||||||
### Xcode template
|
|
||||||
# Xcode
|
|
||||||
#
|
|
||||||
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
|
|
||||||
|
|
||||||
## Build generated
|
|
||||||
build/
|
|
||||||
DerivedData/
|
|
||||||
|
|
||||||
## Various settings
|
|
||||||
*.pbxuser
|
|
||||||
!default.pbxuser
|
|
||||||
*.mode1v3
|
|
||||||
!default.mode1v3
|
|
||||||
*.mode2v3
|
|
||||||
!default.mode2v3
|
|
||||||
*.perspectivev3
|
|
||||||
!default.perspectivev3
|
|
||||||
xcuserdata/
|
|
||||||
|
|
||||||
## Other
|
|
||||||
*.moved-aside
|
|
||||||
*.xccheckout
|
|
||||||
*.xcscmblueprint
|
|
||||||
### Eclipse template
|
|
||||||
|
|
||||||
.metadata
|
|
||||||
bin/
|
|
||||||
tmp/
|
|
||||||
*.tmp
|
|
||||||
*.bak
|
|
||||||
*.swp
|
|
||||||
*~.nib
|
|
||||||
local.properties
|
|
||||||
.settings/
|
|
||||||
.loadpath
|
|
||||||
.recommenders
|
|
||||||
|
|
||||||
# Eclipse Core
|
|
||||||
.project
|
|
||||||
|
|
||||||
# External tool builders
|
|
||||||
.externalToolBuilders/
|
|
||||||
|
|
||||||
# Locally stored "Eclipse launch configurations"
|
|
||||||
*.launch
|
|
||||||
|
|
||||||
# PyDev specific (Python IDE for Eclipse)
|
|
||||||
*.pydevproject
|
|
||||||
|
|
||||||
# CDT-specific (C/C++ Development Tooling)
|
|
||||||
.cproject
|
|
||||||
|
|
||||||
# JDT-specific (Eclipse Java Development Tools)
|
|
||||||
.classpath
|
|
||||||
|
|
||||||
# Java annotation processor (APT)
|
|
||||||
.factorypath
|
|
||||||
|
|
||||||
# PDT-specific (PHP Development Tools)
|
|
||||||
.buildpath
|
|
||||||
|
|
||||||
# sbteclipse plugin
|
|
||||||
.target
|
|
||||||
|
|
||||||
# Tern plugin
|
|
||||||
.tern-project
|
|
||||||
|
|
||||||
# TeXlipse plugin
|
|
||||||
.texlipse
|
|
||||||
|
|
||||||
# STS (Spring Tool Suite)
|
|
||||||
.springBeans
|
|
||||||
|
|
||||||
# Code Recommenders
|
|
||||||
.recommenders/
|
|
||||||
|
|
||||||
|
|
||||||
coverage.txt
|
|
||||||
|
|
||||||
#vendor
|
|
||||||
vendor/
|
|
||||||
|
|
||||||
.envrc
|
|
20
vendor/github.com/grpc-ecosystem/go-grpc-middleware/CONTRIBUTING.md
generated
vendored
20
vendor/github.com/grpc-ecosystem/go-grpc-middleware/CONTRIBUTING.md
generated
vendored
@ -1,20 +0,0 @@
|
|||||||
# Contributing
|
|
||||||
|
|
||||||
We would love to have people submit pull requests and help make `grpc-ecosystem/go-grpc-middleware` even better 👍.
|
|
||||||
|
|
||||||
Fork, then clone the repo:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git clone git@github.com:your-username/go-grpc-middleware.git
|
|
||||||
```
|
|
||||||
|
|
||||||
Before checking in please run the following:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
make all
|
|
||||||
```
|
|
||||||
|
|
||||||
This will `vet`, `fmt`, regenerate documentation and run all tests.
|
|
||||||
|
|
||||||
|
|
||||||
Push to your fork and open a pull request.
|
|
93
vendor/github.com/grpc-ecosystem/go-grpc-middleware/README.md
generated
vendored
93
vendor/github.com/grpc-ecosystem/go-grpc-middleware/README.md
generated
vendored
@ -1,93 +0,0 @@
|
|||||||
# Go gRPC Middleware
|
|
||||||
|
|
||||||
[](https://travis-ci.org/grpc-ecosystem/go-grpc-middleware)
|
|
||||||
[](https://goreportcard.com/report/github.com/grpc-ecosystem/go-grpc-middleware)
|
|
||||||
[](https://godoc.org/github.com/grpc-ecosystem/go-grpc-middleware)
|
|
||||||
[](https://sourcegraph.com/github.com/grpc-ecosystem/go-grpc-middleware/?badge)
|
|
||||||
[](https://codecov.io/gh/grpc-ecosystem/go-grpc-middleware)
|
|
||||||
[](LICENSE)
|
|
||||||
[](#status)
|
|
||||||
[](https://gophers.slack.com/archives/CNJL30P4P)
|
|
||||||
|
|
||||||
[gRPC Go](https://github.com/grpc/grpc-go) Middleware: interceptors, helpers, utilities.
|
|
||||||
|
|
||||||
## ⚠️ Status
|
|
||||||
|
|
||||||
Version [v2](https://github.com/grpc-ecosystem/go-grpc-middleware/tree/v2) is about to be released, with migration guide, which will replace v1. Try v2 and give us feedback!
|
|
||||||
|
|
||||||
Version v1 is currently in deprecation mode, which means only critical and safety bug fixes will be merged.
|
|
||||||
|
|
||||||
|
|
||||||
## Middleware
|
|
||||||
|
|
||||||
[gRPC Go](https://github.com/grpc/grpc-go) recently acquired support for
|
|
||||||
Interceptors, i.e. [middleware](https://medium.com/@matryer/writing-middleware-in-golang-and-how-go-makes-it-so-much-fun-4375c1246e81#.gv7tdlghs)
|
|
||||||
that is executed either on the gRPC Server before the request is passed onto the user's application logic, or on the gRPC client around the user call. It is a perfect way to implement
|
|
||||||
common patterns: auth, logging, message, validation, retries, or monitoring.
|
|
||||||
|
|
||||||
These are generic building blocks that make it easy to build multiple microservices easily.
|
|
||||||
The purpose of this repository is to act as a go-to point for such reusable functionality. It contains
|
|
||||||
some of them itself, but also will link to useful external repos.
|
|
||||||
|
|
||||||
`grpc_middleware` itself provides support for chaining interceptors, here's an example:
|
|
||||||
|
|
||||||
```go
|
|
||||||
import "github.com/grpc-ecosystem/go-grpc-middleware"
|
|
||||||
|
|
||||||
myServer := grpc.NewServer(
|
|
||||||
grpc.StreamInterceptor(grpc_middleware.ChainStreamServer(
|
|
||||||
grpc_ctxtags.StreamServerInterceptor(),
|
|
||||||
grpc_opentracing.StreamServerInterceptor(),
|
|
||||||
grpc_prometheus.StreamServerInterceptor,
|
|
||||||
grpc_zap.StreamServerInterceptor(zapLogger),
|
|
||||||
grpc_auth.StreamServerInterceptor(myAuthFunction),
|
|
||||||
grpc_recovery.StreamServerInterceptor(),
|
|
||||||
)),
|
|
||||||
grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(
|
|
||||||
grpc_ctxtags.UnaryServerInterceptor(),
|
|
||||||
grpc_opentracing.UnaryServerInterceptor(),
|
|
||||||
grpc_prometheus.UnaryServerInterceptor,
|
|
||||||
grpc_zap.UnaryServerInterceptor(zapLogger),
|
|
||||||
grpc_auth.UnaryServerInterceptor(myAuthFunction),
|
|
||||||
grpc_recovery.UnaryServerInterceptor(),
|
|
||||||
)),
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Interceptors
|
|
||||||
|
|
||||||
_Please send a PR to add new interceptors or middleware to this list_
|
|
||||||
|
|
||||||
#### Auth
|
|
||||||
|
|
||||||
- [`grpc_auth`](auth) - a customizable (via `AuthFunc`) piece of auth middleware
|
|
||||||
|
|
||||||
#### Logging
|
|
||||||
|
|
||||||
- [`grpc_ctxtags`](tags/) - a library that adds a `Tag` map to context, with data populated from request body
|
|
||||||
- [`grpc_zap`](logging/zap/) - integration of [zap](https://github.com/uber-go/zap) logging library into gRPC handlers.
|
|
||||||
- [`grpc_logrus`](logging/logrus/) - integration of [logrus](https://github.com/sirupsen/logrus) logging library into gRPC handlers.
|
|
||||||
- [`grpc_kit`](logging/kit/) - integration of [go-kit/log](https://github.com/go-kit/log) logging library into gRPC handlers.
|
|
||||||
- [`grpc_grpc_logsettable`](logging/settable/) - a wrapper around `grpclog.LoggerV2` that allows to replace loggers in runtime (thread-safe).
|
|
||||||
|
|
||||||
#### Monitoring
|
|
||||||
|
|
||||||
- [`grpc_prometheus`⚡](https://github.com/grpc-ecosystem/go-grpc-prometheus) - Prometheus client-side and server-side monitoring middleware
|
|
||||||
- [`otgrpc`⚡](https://github.com/grpc-ecosystem/grpc-opentracing/tree/master/go/otgrpc) - [OpenTracing](http://opentracing.io/) client-side and server-side interceptors
|
|
||||||
- [`grpc_opentracing`](tracing/opentracing) - [OpenTracing](http://opentracing.io/) client-side and server-side interceptors with support for streaming and handler-returned tags
|
|
||||||
- [`otelgrpc`](https://github.com/open-telemetry/opentelemetry-go-contrib/tree/main/instrumentation/google.golang.org/grpc/otelgrpc) - [OpenTelemetry](https://opentelemetry.io/) client-side and server-side interceptors
|
|
||||||
|
|
||||||
#### Client
|
|
||||||
|
|
||||||
- [`grpc_retry`](retry/) - a generic gRPC response code retry mechanism, client-side middleware
|
|
||||||
|
|
||||||
#### Server
|
|
||||||
|
|
||||||
- [`grpc_validator`](validator/) - codegen inbound message validation from `.proto` options
|
|
||||||
- [`grpc_recovery`](recovery/) - turn panics into gRPC errors
|
|
||||||
- [`ratelimit`](ratelimit/) - grpc rate limiting by your own limiter
|
|
||||||
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
`go-grpc-middleware` is released under the Apache 2.0 license. See the [LICENSE](LICENSE) file for details.
|
|
166
vendor/github.com/grpc-ecosystem/go-grpc-middleware/chain.go
generated
vendored
166
vendor/github.com/grpc-ecosystem/go-grpc-middleware/chain.go
generated
vendored
@ -1,166 +0,0 @@
|
|||||||
// Copyright 2016 Michal Witkowski. All Rights Reserved.
|
|
||||||
// See LICENSE for licensing terms.
|
|
||||||
|
|
||||||
// gRPC Server Interceptor chaining middleware.
|
|
||||||
|
|
||||||
package grpc_middleware
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ChainUnaryServer creates a single interceptor out of a chain of many interceptors.
|
|
||||||
//
|
|
||||||
// Execution is done in left-to-right order, including passing of context.
|
|
||||||
// For example ChainUnaryServer(one, two, three) will execute one before two before three, and three
|
|
||||||
// will see context changes of one and two.
|
|
||||||
//
|
|
||||||
// While this can be useful in some scenarios, it is generally advisable to use google.golang.org/grpc.ChainUnaryInterceptor directly.
|
|
||||||
func ChainUnaryServer(interceptors ...grpc.UnaryServerInterceptor) grpc.UnaryServerInterceptor {
|
|
||||||
n := len(interceptors)
|
|
||||||
|
|
||||||
// Dummy interceptor maintained for backward compatibility to avoid returning nil.
|
|
||||||
if n == 0 {
|
|
||||||
return func(ctx context.Context, req interface{}, _ *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
|
|
||||||
return handler(ctx, req)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// The degenerate case, just return the single wrapped interceptor directly.
|
|
||||||
if n == 1 {
|
|
||||||
return interceptors[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return a function which satisfies the interceptor interface, and which is
|
|
||||||
// a closure over the given list of interceptors to be chained.
|
|
||||||
return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
|
|
||||||
currHandler := handler
|
|
||||||
// Iterate backwards through all interceptors except the first (outermost).
|
|
||||||
// Wrap each one in a function which satisfies the handler interface, but
|
|
||||||
// is also a closure over the `info` and `handler` parameters. Then pass
|
|
||||||
// each pseudo-handler to the next outer interceptor as the handler to be called.
|
|
||||||
for i := n - 1; i > 0; i-- {
|
|
||||||
// Rebind to loop-local vars so they can be closed over.
|
|
||||||
innerHandler, i := currHandler, i
|
|
||||||
currHandler = func(currentCtx context.Context, currentReq interface{}) (interface{}, error) {
|
|
||||||
return interceptors[i](currentCtx, currentReq, info, innerHandler)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// Finally return the result of calling the outermost interceptor with the
|
|
||||||
// outermost pseudo-handler created above as its handler.
|
|
||||||
return interceptors[0](ctx, req, info, currHandler)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ChainStreamServer creates a single interceptor out of a chain of many interceptors.
|
|
||||||
//
|
|
||||||
// Execution is done in left-to-right order, including passing of context.
|
|
||||||
// For example ChainUnaryServer(one, two, three) will execute one before two before three.
|
|
||||||
// If you want to pass context between interceptors, use WrapServerStream.
|
|
||||||
//
|
|
||||||
// While this can be useful in some scenarios, it is generally advisable to use google.golang.org/grpc.ChainStreamInterceptor directly.
|
|
||||||
func ChainStreamServer(interceptors ...grpc.StreamServerInterceptor) grpc.StreamServerInterceptor {
|
|
||||||
n := len(interceptors)
|
|
||||||
|
|
||||||
// Dummy interceptor maintained for backward compatibility to avoid returning nil.
|
|
||||||
if n == 0 {
|
|
||||||
return func(srv interface{}, stream grpc.ServerStream, _ *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
|
|
||||||
return handler(srv, stream)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if n == 1 {
|
|
||||||
return interceptors[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
return func(srv interface{}, stream grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
|
|
||||||
currHandler := handler
|
|
||||||
for i := n - 1; i > 0; i-- {
|
|
||||||
innerHandler, i := currHandler, i
|
|
||||||
currHandler = func(currentSrv interface{}, currentStream grpc.ServerStream) error {
|
|
||||||
return interceptors[i](currentSrv, currentStream, info, innerHandler)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return interceptors[0](srv, stream, info, currHandler)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ChainUnaryClient creates a single interceptor out of a chain of many interceptors.
|
|
||||||
//
|
|
||||||
// Execution is done in left-to-right order, including passing of context.
|
|
||||||
// For example ChainUnaryClient(one, two, three) will execute one before two before three.
|
|
||||||
func ChainUnaryClient(interceptors ...grpc.UnaryClientInterceptor) grpc.UnaryClientInterceptor {
|
|
||||||
n := len(interceptors)
|
|
||||||
|
|
||||||
// Dummy interceptor maintained for backward compatibility to avoid returning nil.
|
|
||||||
if n == 0 {
|
|
||||||
return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
|
|
||||||
return invoker(ctx, method, req, reply, cc, opts...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if n == 1 {
|
|
||||||
return interceptors[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
|
|
||||||
currInvoker := invoker
|
|
||||||
for i := n - 1; i > 0; i-- {
|
|
||||||
innerInvoker, i := currInvoker, i
|
|
||||||
currInvoker = func(currentCtx context.Context, currentMethod string, currentReq, currentRepl interface{}, currentConn *grpc.ClientConn, currentOpts ...grpc.CallOption) error {
|
|
||||||
return interceptors[i](currentCtx, currentMethod, currentReq, currentRepl, currentConn, innerInvoker, currentOpts...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return interceptors[0](ctx, method, req, reply, cc, currInvoker, opts...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// ChainStreamClient creates a single interceptor out of a chain of many interceptors.
|
|
||||||
//
|
|
||||||
// Execution is done in left-to-right order, including passing of context.
|
|
||||||
// For example ChainStreamClient(one, two, three) will execute one before two before three.
|
|
||||||
func ChainStreamClient(interceptors ...grpc.StreamClientInterceptor) grpc.StreamClientInterceptor {
|
|
||||||
n := len(interceptors)
|
|
||||||
|
|
||||||
// Dummy interceptor maintained for backward compatibility to avoid returning nil.
|
|
||||||
if n == 0 {
|
|
||||||
return func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) {
|
|
||||||
return streamer(ctx, desc, cc, method, opts...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if n == 1 {
|
|
||||||
return interceptors[0]
|
|
||||||
}
|
|
||||||
|
|
||||||
return func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) {
|
|
||||||
currStreamer := streamer
|
|
||||||
for i := n - 1; i > 0; i-- {
|
|
||||||
innerStreamer, i := currStreamer, i
|
|
||||||
currStreamer = func(currentCtx context.Context, currentDesc *grpc.StreamDesc, currentConn *grpc.ClientConn, currentMethod string, currentOpts ...grpc.CallOption) (grpc.ClientStream, error) {
|
|
||||||
return interceptors[i](currentCtx, currentDesc, currentConn, currentMethod, innerStreamer, currentOpts...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return interceptors[0](ctx, desc, cc, method, currStreamer, opts...)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Chain creates a single interceptor out of a chain of many interceptors.
|
|
||||||
//
|
|
||||||
// WithUnaryServerChain is a grpc.Server config option that accepts multiple unary interceptors.
|
|
||||||
// Basically syntactic sugar.
|
|
||||||
//
|
|
||||||
// Deprecated: use google.golang.org/grpc.ChainUnaryInterceptor instead.
|
|
||||||
func WithUnaryServerChain(interceptors ...grpc.UnaryServerInterceptor) grpc.ServerOption {
|
|
||||||
return grpc.ChainUnaryInterceptor(interceptors...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithStreamServerChain is a grpc.Server config option that accepts multiple stream interceptors.
|
|
||||||
// Basically syntactic sugar.
|
|
||||||
//
|
|
||||||
// Deprecated: use google.golang.org/grpc.ChainStreamInterceptor instead.
|
|
||||||
func WithStreamServerChain(interceptors ...grpc.StreamServerInterceptor) grpc.ServerOption {
|
|
||||||
return grpc.ChainStreamInterceptor(interceptors...)
|
|
||||||
}
|
|
69
vendor/github.com/grpc-ecosystem/go-grpc-middleware/doc.go
generated
vendored
69
vendor/github.com/grpc-ecosystem/go-grpc-middleware/doc.go
generated
vendored
@ -1,69 +0,0 @@
|
|||||||
// Copyright 2016 Michal Witkowski. All Rights Reserved.
|
|
||||||
// See LICENSE for licensing terms.
|
|
||||||
|
|
||||||
/*
|
|
||||||
`grpc_middleware` is a collection of gRPC middleware packages: interceptors, helpers and tools.
|
|
||||||
|
|
||||||
Middleware
|
|
||||||
|
|
||||||
gRPC is a fantastic RPC middleware, which sees a lot of adoption in the Golang world. However, the
|
|
||||||
upstream gRPC codebase is relatively bare bones.
|
|
||||||
|
|
||||||
This package, and most of its child packages provides commonly needed middleware for gRPC:
|
|
||||||
client-side interceptors for retires, server-side interceptors for input validation and auth,
|
|
||||||
functions for chaining said interceptors, metadata convenience methods and more.
|
|
||||||
|
|
||||||
Chaining
|
|
||||||
|
|
||||||
By default, gRPC doesn't allow one to have more than one interceptor either on the client nor on
|
|
||||||
the server side. `grpc_middleware` provides convenient chaining methods
|
|
||||||
|
|
||||||
Simple way of turning a multiple interceptors into a single interceptor. Here's an example for
|
|
||||||
server chaining:
|
|
||||||
|
|
||||||
myServer := grpc.NewServer(
|
|
||||||
grpc.StreamInterceptor(grpc_middleware.ChainStreamServer(loggingStream, monitoringStream, authStream)),
|
|
||||||
grpc.UnaryInterceptor(grpc_middleware.ChainUnaryServer(loggingUnary, monitoringUnary, authUnary)),
|
|
||||||
)
|
|
||||||
|
|
||||||
These interceptors will be executed from left to right: logging, monitoring and auth.
|
|
||||||
|
|
||||||
Here's an example for client side chaining:
|
|
||||||
|
|
||||||
clientConn, err = grpc.Dial(
|
|
||||||
address,
|
|
||||||
grpc.WithUnaryInterceptor(grpc_middleware.ChainUnaryClient(monitoringClientUnary, retryUnary)),
|
|
||||||
grpc.WithStreamInterceptor(grpc_middleware.ChainStreamClient(monitoringClientStream, retryStream)),
|
|
||||||
)
|
|
||||||
client = pb_testproto.NewTestServiceClient(clientConn)
|
|
||||||
resp, err := client.PingEmpty(s.ctx, &myservice.Request{Msg: "hello"})
|
|
||||||
|
|
||||||
These interceptors will be executed from left to right: monitoring and then retry logic.
|
|
||||||
|
|
||||||
The retry interceptor will call every interceptor that follows it whenever when a retry happens.
|
|
||||||
|
|
||||||
Writing Your Own
|
|
||||||
|
|
||||||
Implementing your own interceptor is pretty trivial: there are interfaces for that. But the interesting
|
|
||||||
bit exposing common data to handlers (and other middleware), similarly to HTTP Middleware design.
|
|
||||||
For example, you may want to pass the identity of the caller from the auth interceptor all the way
|
|
||||||
to the handling function.
|
|
||||||
|
|
||||||
For example, a client side interceptor example for auth looks like:
|
|
||||||
|
|
||||||
func FakeAuthUnaryInterceptor(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
|
|
||||||
newCtx := context.WithValue(ctx, "user_id", "john@example.com")
|
|
||||||
return handler(newCtx, req)
|
|
||||||
}
|
|
||||||
|
|
||||||
Unfortunately, it's not as easy for streaming RPCs. These have the `context.Context` embedded within
|
|
||||||
the `grpc.ServerStream` object. To pass values through context, a wrapper (`WrappedServerStream`) is
|
|
||||||
needed. For example:
|
|
||||||
|
|
||||||
func FakeAuthStreamingInterceptor(srv interface{}, stream grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
|
|
||||||
newStream := grpc_middleware.WrapServerStream(stream)
|
|
||||||
newStream.WrappedContext = context.WithValue(ctx, "user_id", "john@example.com")
|
|
||||||
return handler(srv, newStream)
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
package grpc_middleware
|
|
17
vendor/github.com/grpc-ecosystem/go-grpc-middleware/makefile
generated
vendored
17
vendor/github.com/grpc-ecosystem/go-grpc-middleware/makefile
generated
vendored
@ -1,17 +0,0 @@
|
|||||||
SHELL=/bin/bash
|
|
||||||
|
|
||||||
GOFILES_NOVENDOR = $(shell go list ./... | grep -v /vendor/)
|
|
||||||
|
|
||||||
all: vet fmt test
|
|
||||||
|
|
||||||
fmt:
|
|
||||||
go fmt $(GOFILES_NOVENDOR)
|
|
||||||
|
|
||||||
vet:
|
|
||||||
# do not check lostcancel, they are intentional.
|
|
||||||
go vet -lostcancel=false $(GOFILES_NOVENDOR)
|
|
||||||
|
|
||||||
test: vet
|
|
||||||
./scripts/test_all.sh
|
|
||||||
|
|
||||||
.PHONY: all test
|
|
117
vendor/github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus/client_metrics.go
generated
vendored
Normal file
117
vendor/github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus/client_metrics.go
generated
vendored
Normal file
@ -0,0 +1,117 @@
|
|||||||
|
// Copyright (c) The go-grpc-middleware Authors.
|
||||||
|
// Licensed under the Apache License 2.0.
|
||||||
|
|
||||||
|
package prometheus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors"
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ClientMetrics represents a collection of metrics to be registered on a
|
||||||
|
// Prometheus metrics registry for a gRPC client.
|
||||||
|
type ClientMetrics struct {
|
||||||
|
clientStartedCounter *prometheus.CounterVec
|
||||||
|
clientHandledCounter *prometheus.CounterVec
|
||||||
|
clientStreamMsgReceived *prometheus.CounterVec
|
||||||
|
clientStreamMsgSent *prometheus.CounterVec
|
||||||
|
|
||||||
|
// clientHandledHistogram can be nil
|
||||||
|
clientHandledHistogram *prometheus.HistogramVec
|
||||||
|
// clientStreamRecvHistogram can be nil
|
||||||
|
clientStreamRecvHistogram *prometheus.HistogramVec
|
||||||
|
// clientStreamSendHistogram can be nil
|
||||||
|
clientStreamSendHistogram *prometheus.HistogramVec
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewClientMetrics returns a new ClientMetrics object.
|
||||||
|
// NOTE: Remember to register ClientMetrics object using prometheus registry
|
||||||
|
// e.g. prometheus.MustRegister(myClientMetrics).
|
||||||
|
func NewClientMetrics(opts ...ClientMetricsOption) *ClientMetrics {
|
||||||
|
var config clientMetricsConfig
|
||||||
|
config.apply(opts)
|
||||||
|
return &ClientMetrics{
|
||||||
|
clientStartedCounter: prometheus.NewCounterVec(
|
||||||
|
config.counterOpts.apply(prometheus.CounterOpts{
|
||||||
|
Name: "grpc_client_started_total",
|
||||||
|
Help: "Total number of RPCs started on the client.",
|
||||||
|
}), []string{"grpc_type", "grpc_service", "grpc_method"}),
|
||||||
|
|
||||||
|
clientHandledCounter: prometheus.NewCounterVec(
|
||||||
|
config.counterOpts.apply(prometheus.CounterOpts{
|
||||||
|
Name: "grpc_client_handled_total",
|
||||||
|
Help: "Total number of RPCs completed by the client, regardless of success or failure.",
|
||||||
|
}), []string{"grpc_type", "grpc_service", "grpc_method", "grpc_code"}),
|
||||||
|
|
||||||
|
clientStreamMsgReceived: prometheus.NewCounterVec(
|
||||||
|
config.counterOpts.apply(prometheus.CounterOpts{
|
||||||
|
Name: "grpc_client_msg_received_total",
|
||||||
|
Help: "Total number of RPC stream messages received by the client.",
|
||||||
|
}), []string{"grpc_type", "grpc_service", "grpc_method"}),
|
||||||
|
|
||||||
|
clientStreamMsgSent: prometheus.NewCounterVec(
|
||||||
|
config.counterOpts.apply(prometheus.CounterOpts{
|
||||||
|
Name: "grpc_client_msg_sent_total",
|
||||||
|
Help: "Total number of gRPC stream messages sent by the client.",
|
||||||
|
}), []string{"grpc_type", "grpc_service", "grpc_method"}),
|
||||||
|
|
||||||
|
clientHandledHistogram: config.clientHandledHistogram,
|
||||||
|
clientStreamRecvHistogram: config.clientStreamRecvHistogram,
|
||||||
|
clientStreamSendHistogram: config.clientStreamSendHistogram,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describe sends the super-set of all possible descriptors of metrics
|
||||||
|
// collected by this Collector to the provided channel and returns once
|
||||||
|
// the last descriptor has been sent.
|
||||||
|
func (m *ClientMetrics) Describe(ch chan<- *prometheus.Desc) {
|
||||||
|
m.clientStartedCounter.Describe(ch)
|
||||||
|
m.clientHandledCounter.Describe(ch)
|
||||||
|
m.clientStreamMsgReceived.Describe(ch)
|
||||||
|
m.clientStreamMsgSent.Describe(ch)
|
||||||
|
if m.clientHandledHistogram != nil {
|
||||||
|
m.clientHandledHistogram.Describe(ch)
|
||||||
|
}
|
||||||
|
if m.clientStreamRecvHistogram != nil {
|
||||||
|
m.clientStreamRecvHistogram.Describe(ch)
|
||||||
|
}
|
||||||
|
if m.clientStreamSendHistogram != nil {
|
||||||
|
m.clientStreamSendHistogram.Describe(ch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect is called by the Prometheus registry when collecting
|
||||||
|
// metrics. The implementation sends each collected metric via the
|
||||||
|
// provided channel and returns once the last metric has been sent.
|
||||||
|
func (m *ClientMetrics) Collect(ch chan<- prometheus.Metric) {
|
||||||
|
m.clientStartedCounter.Collect(ch)
|
||||||
|
m.clientHandledCounter.Collect(ch)
|
||||||
|
m.clientStreamMsgReceived.Collect(ch)
|
||||||
|
m.clientStreamMsgSent.Collect(ch)
|
||||||
|
if m.clientHandledHistogram != nil {
|
||||||
|
m.clientHandledHistogram.Collect(ch)
|
||||||
|
}
|
||||||
|
if m.clientStreamRecvHistogram != nil {
|
||||||
|
m.clientStreamRecvHistogram.Collect(ch)
|
||||||
|
}
|
||||||
|
if m.clientStreamSendHistogram != nil {
|
||||||
|
m.clientStreamSendHistogram.Collect(ch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnaryClientInterceptor is a gRPC client-side interceptor that provides Prometheus monitoring for Unary RPCs.
|
||||||
|
func (m *ClientMetrics) UnaryClientInterceptor(opts ...Option) grpc.UnaryClientInterceptor {
|
||||||
|
return interceptors.UnaryClientInterceptor(&reportable{
|
||||||
|
opts: opts,
|
||||||
|
clientMetrics: m,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// StreamClientInterceptor is a gRPC client-side interceptor that provides Prometheus monitoring for Streaming RPCs.
|
||||||
|
func (m *ClientMetrics) StreamClientInterceptor(opts ...Option) grpc.StreamClientInterceptor {
|
||||||
|
return interceptors.StreamClientInterceptor(&reportable{
|
||||||
|
opts: opts,
|
||||||
|
clientMetrics: m,
|
||||||
|
})
|
||||||
|
}
|
77
vendor/github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus/client_options.go
generated
vendored
Normal file
77
vendor/github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus/client_options.go
generated
vendored
Normal file
@ -0,0 +1,77 @@
|
|||||||
|
// Copyright (c) The go-grpc-middleware Authors.
|
||||||
|
// Licensed under the Apache License 2.0.
|
||||||
|
|
||||||
|
package prometheus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
)
|
||||||
|
|
||||||
|
type clientMetricsConfig struct {
|
||||||
|
counterOpts counterOptions
|
||||||
|
// clientHandledHistogram can be nil.
|
||||||
|
clientHandledHistogram *prometheus.HistogramVec
|
||||||
|
// clientStreamRecvHistogram can be nil.
|
||||||
|
clientStreamRecvHistogram *prometheus.HistogramVec
|
||||||
|
// clientStreamSendHistogram can be nil.
|
||||||
|
clientStreamSendHistogram *prometheus.HistogramVec
|
||||||
|
}
|
||||||
|
|
||||||
|
type ClientMetricsOption func(*clientMetricsConfig)
|
||||||
|
|
||||||
|
func (c *clientMetricsConfig) apply(opts []ClientMetricsOption) {
|
||||||
|
for _, o := range opts {
|
||||||
|
o(c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func WithClientCounterOptions(opts ...CounterOption) ClientMetricsOption {
|
||||||
|
return func(o *clientMetricsConfig) {
|
||||||
|
o.counterOpts = opts
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithClientHandlingTimeHistogram turns on recording of handling time of RPCs.
|
||||||
|
// Histogram metrics can be very expensive for Prometheus to retain and query.
|
||||||
|
func WithClientHandlingTimeHistogram(opts ...HistogramOption) ClientMetricsOption {
|
||||||
|
return func(o *clientMetricsConfig) {
|
||||||
|
o.clientHandledHistogram = prometheus.NewHistogramVec(
|
||||||
|
histogramOptions(opts).apply(prometheus.HistogramOpts{
|
||||||
|
Name: "grpc_client_handling_seconds",
|
||||||
|
Help: "Histogram of response latency (seconds) of the gRPC until it is finished by the application.",
|
||||||
|
Buckets: prometheus.DefBuckets,
|
||||||
|
}),
|
||||||
|
[]string{"grpc_type", "grpc_service", "grpc_method"},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithClientStreamRecvHistogram turns on recording of single message receive time of streaming RPCs.
|
||||||
|
// Histogram metrics can be very expensive for Prometheus to retain and query.
|
||||||
|
func WithClientStreamRecvHistogram(opts ...HistogramOption) ClientMetricsOption {
|
||||||
|
return func(o *clientMetricsConfig) {
|
||||||
|
o.clientStreamRecvHistogram = prometheus.NewHistogramVec(
|
||||||
|
histogramOptions(opts).apply(prometheus.HistogramOpts{
|
||||||
|
Name: "grpc_client_msg_recv_handling_seconds",
|
||||||
|
Help: "Histogram of response latency (seconds) of the gRPC single message receive.",
|
||||||
|
Buckets: prometheus.DefBuckets,
|
||||||
|
}),
|
||||||
|
[]string{"grpc_type", "grpc_service", "grpc_method"},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithClientStreamSendHistogram turns on recording of single message send time of streaming RPCs.
|
||||||
|
// Histogram metrics can be very expensive for Prometheus to retain and query.
|
||||||
|
func WithClientStreamSendHistogram(opts ...HistogramOption) ClientMetricsOption {
|
||||||
|
return func(o *clientMetricsConfig) {
|
||||||
|
o.clientStreamSendHistogram = prometheus.NewHistogramVec(
|
||||||
|
histogramOptions(opts).apply(prometheus.HistogramOpts{
|
||||||
|
Name: "grpc_client_msg_send_handling_seconds",
|
||||||
|
Help: "Histogram of response latency (seconds) of the gRPC single message send.",
|
||||||
|
Buckets: prometheus.DefBuckets,
|
||||||
|
}),
|
||||||
|
[]string{"grpc_type", "grpc_service", "grpc_method"},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
23
vendor/github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus/constants.go
generated
vendored
Normal file
23
vendor/github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus/constants.go
generated
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
// Copyright (c) The go-grpc-middleware Authors.
|
||||||
|
// Licensed under the Apache License 2.0.
|
||||||
|
|
||||||
|
package prometheus
|
||||||
|
|
||||||
|
type grpcType string
|
||||||
|
|
||||||
|
// grpcType describes all types of grpc connection.
|
||||||
|
const (
|
||||||
|
Unary grpcType = "unary"
|
||||||
|
ClientStream grpcType = "client_stream"
|
||||||
|
ServerStream grpcType = "server_stream"
|
||||||
|
BidiStream grpcType = "bidi_stream"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Kind describes whether interceptor is a client or server type.
|
||||||
|
type Kind string
|
||||||
|
|
||||||
|
// Enum for Client and Server Kind.
|
||||||
|
const (
|
||||||
|
KindClient Kind = "client"
|
||||||
|
KindServer Kind = "server"
|
||||||
|
)
|
8
vendor/github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus/doc.go
generated
vendored
Normal file
8
vendor/github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus/doc.go
generated
vendored
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
// Copyright (c) The go-grpc-middleware Authors.
|
||||||
|
// Licensed under the Apache License 2.0.
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package prometheus provides a standalone interceptor for metrics. It's next iteration of deprecated https://github.com/grpc-ecosystem/go-grpc-prometheus.
|
||||||
|
See https://github.com/grpc-ecosystem/go-grpc-middleware/tree/main/examples for example.
|
||||||
|
*/
|
||||||
|
package prometheus
|
129
vendor/github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus/options.go
generated
vendored
Normal file
129
vendor/github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus/options.go
generated
vendored
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
// Copyright (c) The go-grpc-middleware Authors.
|
||||||
|
// Licensed under the Apache License 2.0.
|
||||||
|
|
||||||
|
package prometheus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
"google.golang.org/grpc/status"
|
||||||
|
)
|
||||||
|
|
||||||
|
// FromError returns a grpc status. If the error code is neither a valid grpc status nor a context error, codes.Unknown
|
||||||
|
// will be set.
|
||||||
|
func FromError(err error) *status.Status {
|
||||||
|
s, ok := status.FromError(err)
|
||||||
|
// Mirror what the grpc server itself does, i.e. also convert context errors to status
|
||||||
|
if !ok {
|
||||||
|
s = status.FromContextError(err)
|
||||||
|
}
|
||||||
|
return s
|
||||||
|
}
|
||||||
|
|
||||||
|
// A CounterOption lets you add options to Counter metrics using With* funcs.
|
||||||
|
type CounterOption func(*prometheus.CounterOpts)
|
||||||
|
|
||||||
|
type counterOptions []CounterOption
|
||||||
|
|
||||||
|
func (co counterOptions) apply(o prometheus.CounterOpts) prometheus.CounterOpts {
|
||||||
|
for _, f := range co {
|
||||||
|
f(&o)
|
||||||
|
}
|
||||||
|
return o
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithConstLabels allows you to add ConstLabels to Counter metrics.
|
||||||
|
func WithConstLabels(labels prometheus.Labels) CounterOption {
|
||||||
|
return func(o *prometheus.CounterOpts) {
|
||||||
|
o.ConstLabels = labels
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithSubsystem allows you to add a Subsystem to Counter metrics.
|
||||||
|
func WithSubsystem(subsystem string) CounterOption {
|
||||||
|
return func(o *prometheus.CounterOpts) {
|
||||||
|
o.Subsystem = subsystem
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// A HistogramOption lets you add options to Histogram metrics using With*
|
||||||
|
// funcs.
|
||||||
|
type HistogramOption func(*prometheus.HistogramOpts)
|
||||||
|
|
||||||
|
type histogramOptions []HistogramOption
|
||||||
|
|
||||||
|
func (ho histogramOptions) apply(o prometheus.HistogramOpts) prometheus.HistogramOpts {
|
||||||
|
for _, f := range ho {
|
||||||
|
f(&o)
|
||||||
|
}
|
||||||
|
return o
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithHistogramBuckets allows you to specify custom bucket ranges for histograms if EnableHandlingTimeHistogram is on.
|
||||||
|
func WithHistogramBuckets(buckets []float64) HistogramOption {
|
||||||
|
return func(o *prometheus.HistogramOpts) { o.Buckets = buckets }
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithHistogramOpts allows you to specify HistogramOpts but makes sure the correct name and label is used.
|
||||||
|
// This function is helpful when specifying more than just the buckets, like using NativeHistograms.
|
||||||
|
func WithHistogramOpts(opts *prometheus.HistogramOpts) HistogramOption {
|
||||||
|
// TODO: This isn't ideal either if new fields are added to prometheus.HistogramOpts.
|
||||||
|
// Maybe we can change the interface to accept abitrary HistogramOpts and
|
||||||
|
// only make sure to overwrite the necessary fields (name, labels).
|
||||||
|
return func(o *prometheus.HistogramOpts) {
|
||||||
|
o.Buckets = opts.Buckets
|
||||||
|
o.NativeHistogramBucketFactor = opts.NativeHistogramBucketFactor
|
||||||
|
o.NativeHistogramZeroThreshold = opts.NativeHistogramZeroThreshold
|
||||||
|
o.NativeHistogramMaxBucketNumber = opts.NativeHistogramMaxBucketNumber
|
||||||
|
o.NativeHistogramMinResetDuration = opts.NativeHistogramMinResetDuration
|
||||||
|
o.NativeHistogramMaxZeroThreshold = opts.NativeHistogramMaxZeroThreshold
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithHistogramConstLabels allows you to add custom ConstLabels to
|
||||||
|
// histograms metrics.
|
||||||
|
func WithHistogramConstLabels(labels prometheus.Labels) HistogramOption {
|
||||||
|
return func(o *prometheus.HistogramOpts) {
|
||||||
|
o.ConstLabels = labels
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithHistogramSubsystem allows you to add a Subsystem to histograms metrics.
|
||||||
|
func WithHistogramSubsystem(subsystem string) HistogramOption {
|
||||||
|
return func(o *prometheus.HistogramOpts) {
|
||||||
|
o.Subsystem = subsystem
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func typeFromMethodInfo(mInfo *grpc.MethodInfo) grpcType {
|
||||||
|
if !mInfo.IsClientStream && !mInfo.IsServerStream {
|
||||||
|
return Unary
|
||||||
|
}
|
||||||
|
if mInfo.IsClientStream && !mInfo.IsServerStream {
|
||||||
|
return ClientStream
|
||||||
|
}
|
||||||
|
if !mInfo.IsClientStream && mInfo.IsServerStream {
|
||||||
|
return ServerStream
|
||||||
|
}
|
||||||
|
return BidiStream
|
||||||
|
}
|
||||||
|
|
||||||
|
// An Option lets you add options to prometheus interceptors using With* funcs.
|
||||||
|
type Option func(*config)
|
||||||
|
|
||||||
|
type config struct {
|
||||||
|
exemplarFn exemplarFromCtxFn
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *config) apply(opts []Option) {
|
||||||
|
for _, o := range opts {
|
||||||
|
o(c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithExemplarFromContext sets function that will be used to deduce exemplar for all counter and histogram metrics.
|
||||||
|
func WithExemplarFromContext(exemplarFn exemplarFromCtxFn) Option {
|
||||||
|
return func(o *config) {
|
||||||
|
o.exemplarFn = exemplarFn
|
||||||
|
}
|
||||||
|
}
|
113
vendor/github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus/reporter.go
generated
vendored
Normal file
113
vendor/github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus/reporter.go
generated
vendored
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
// Copyright (c) The go-grpc-middleware Authors.
|
||||||
|
// Licensed under the Apache License 2.0.
|
||||||
|
|
||||||
|
package prometheus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors"
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
)
|
||||||
|
|
||||||
|
type reporter struct {
|
||||||
|
clientMetrics *ClientMetrics
|
||||||
|
serverMetrics *ServerMetrics
|
||||||
|
typ interceptors.GRPCType
|
||||||
|
service, method string
|
||||||
|
kind Kind
|
||||||
|
exemplar prometheus.Labels
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *reporter) PostCall(err error, rpcDuration time.Duration) {
|
||||||
|
// get status code from error
|
||||||
|
status := FromError(err)
|
||||||
|
code := status.Code()
|
||||||
|
|
||||||
|
// perform handling of metrics from code
|
||||||
|
switch r.kind {
|
||||||
|
case KindServer:
|
||||||
|
r.incrementWithExemplar(r.serverMetrics.serverHandledCounter, string(r.typ), r.service, r.method, code.String())
|
||||||
|
if r.serverMetrics.serverHandledHistogram != nil {
|
||||||
|
r.observeWithExemplar(r.serverMetrics.serverHandledHistogram, rpcDuration.Seconds(), string(r.typ), r.service, r.method)
|
||||||
|
}
|
||||||
|
|
||||||
|
case KindClient:
|
||||||
|
r.incrementWithExemplar(r.clientMetrics.clientHandledCounter, string(r.typ), r.service, r.method, code.String())
|
||||||
|
if r.clientMetrics.clientHandledHistogram != nil {
|
||||||
|
r.observeWithExemplar(r.clientMetrics.clientHandledHistogram, rpcDuration.Seconds(), string(r.typ), r.service, r.method)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *reporter) PostMsgSend(_ any, _ error, sendDuration time.Duration) {
|
||||||
|
switch r.kind {
|
||||||
|
case KindServer:
|
||||||
|
r.incrementWithExemplar(r.serverMetrics.serverStreamMsgSent, string(r.typ), r.service, r.method)
|
||||||
|
case KindClient:
|
||||||
|
r.incrementWithExemplar(r.clientMetrics.clientStreamMsgSent, string(r.typ), r.service, r.method)
|
||||||
|
if r.clientMetrics.clientStreamSendHistogram != nil {
|
||||||
|
r.observeWithExemplar(r.clientMetrics.clientStreamSendHistogram, sendDuration.Seconds(), string(r.typ), r.service, r.method)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *reporter) PostMsgReceive(_ any, _ error, recvDuration time.Duration) {
|
||||||
|
switch r.kind {
|
||||||
|
case KindServer:
|
||||||
|
r.incrementWithExemplar(r.serverMetrics.serverStreamMsgReceived, string(r.typ), r.service, r.method)
|
||||||
|
case KindClient:
|
||||||
|
r.incrementWithExemplar(r.clientMetrics.clientStreamMsgReceived, string(r.typ), r.service, r.method)
|
||||||
|
if r.clientMetrics.clientStreamRecvHistogram != nil {
|
||||||
|
r.observeWithExemplar(r.clientMetrics.clientStreamRecvHistogram, recvDuration.Seconds(), string(r.typ), r.service, r.method)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type reportable struct {
|
||||||
|
clientMetrics *ClientMetrics
|
||||||
|
serverMetrics *ServerMetrics
|
||||||
|
|
||||||
|
opts []Option
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rep *reportable) ServerReporter(ctx context.Context, meta interceptors.CallMeta) (interceptors.Reporter, context.Context) {
|
||||||
|
return rep.reporter(ctx, rep.serverMetrics, nil, meta, KindServer)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rep *reportable) ClientReporter(ctx context.Context, meta interceptors.CallMeta) (interceptors.Reporter, context.Context) {
|
||||||
|
return rep.reporter(ctx, nil, rep.clientMetrics, meta, KindClient)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (rep *reportable) reporter(ctx context.Context, sm *ServerMetrics, cm *ClientMetrics, meta interceptors.CallMeta, kind Kind) (interceptors.Reporter, context.Context) {
|
||||||
|
var c config
|
||||||
|
c.apply(rep.opts)
|
||||||
|
r := &reporter{
|
||||||
|
clientMetrics: cm,
|
||||||
|
serverMetrics: sm,
|
||||||
|
typ: meta.Typ,
|
||||||
|
service: meta.Service,
|
||||||
|
method: meta.Method,
|
||||||
|
kind: kind,
|
||||||
|
}
|
||||||
|
if c.exemplarFn != nil {
|
||||||
|
r.exemplar = c.exemplarFn(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
switch kind {
|
||||||
|
case KindClient:
|
||||||
|
r.incrementWithExemplar(r.clientMetrics.clientStartedCounter, string(r.typ), r.service, r.method)
|
||||||
|
case KindServer:
|
||||||
|
r.incrementWithExemplar(r.serverMetrics.serverStartedCounter, string(r.typ), r.service, r.method)
|
||||||
|
}
|
||||||
|
return r, ctx
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *reporter) incrementWithExemplar(c *prometheus.CounterVec, lvals ...string) {
|
||||||
|
c.WithLabelValues(lvals...).(prometheus.ExemplarAdder).AddWithExemplar(1, r.exemplar)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *reporter) observeWithExemplar(h *prometheus.HistogramVec, value float64, lvals ...string) {
|
||||||
|
h.WithLabelValues(lvals...).(prometheus.ExemplarObserver).ObserveWithExemplar(value, r.exemplar)
|
||||||
|
}
|
123
vendor/github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus/server_metrics.go
generated
vendored
Normal file
123
vendor/github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus/server_metrics.go
generated
vendored
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
// Copyright (c) The go-grpc-middleware Authors.
|
||||||
|
// Licensed under the Apache License 2.0.
|
||||||
|
|
||||||
|
package prometheus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors"
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
// ServerMetrics represents a collection of metrics to be registered on a
|
||||||
|
// Prometheus metrics registry for a gRPC server.
|
||||||
|
type ServerMetrics struct {
|
||||||
|
serverStartedCounter *prometheus.CounterVec
|
||||||
|
serverHandledCounter *prometheus.CounterVec
|
||||||
|
serverStreamMsgReceived *prometheus.CounterVec
|
||||||
|
serverStreamMsgSent *prometheus.CounterVec
|
||||||
|
// serverHandledHistogram can be nil.
|
||||||
|
serverHandledHistogram *prometheus.HistogramVec
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewServerMetrics returns a new ServerMetrics object that has server interceptor methods.
|
||||||
|
// NOTE: Remember to register ServerMetrics object by using prometheus registry
|
||||||
|
// e.g. prometheus.MustRegister(myServerMetrics).
|
||||||
|
func NewServerMetrics(opts ...ServerMetricsOption) *ServerMetrics {
|
||||||
|
var config serverMetricsConfig
|
||||||
|
config.apply(opts)
|
||||||
|
return &ServerMetrics{
|
||||||
|
serverStartedCounter: prometheus.NewCounterVec(
|
||||||
|
config.counterOpts.apply(prometheus.CounterOpts{
|
||||||
|
Name: "grpc_server_started_total",
|
||||||
|
Help: "Total number of RPCs started on the server.",
|
||||||
|
}), []string{"grpc_type", "grpc_service", "grpc_method"}),
|
||||||
|
serverHandledCounter: prometheus.NewCounterVec(
|
||||||
|
config.counterOpts.apply(prometheus.CounterOpts{
|
||||||
|
Name: "grpc_server_handled_total",
|
||||||
|
Help: "Total number of RPCs completed on the server, regardless of success or failure.",
|
||||||
|
}), []string{"grpc_type", "grpc_service", "grpc_method", "grpc_code"}),
|
||||||
|
serverStreamMsgReceived: prometheus.NewCounterVec(
|
||||||
|
config.counterOpts.apply(prometheus.CounterOpts{
|
||||||
|
Name: "grpc_server_msg_received_total",
|
||||||
|
Help: "Total number of RPC stream messages received on the server.",
|
||||||
|
}), []string{"grpc_type", "grpc_service", "grpc_method"}),
|
||||||
|
serverStreamMsgSent: prometheus.NewCounterVec(
|
||||||
|
config.counterOpts.apply(prometheus.CounterOpts{
|
||||||
|
Name: "grpc_server_msg_sent_total",
|
||||||
|
Help: "Total number of gRPC stream messages sent by the server.",
|
||||||
|
}), []string{"grpc_type", "grpc_service", "grpc_method"}),
|
||||||
|
serverHandledHistogram: config.serverHandledHistogram,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Describe sends the super-set of all possible descriptors of metrics
|
||||||
|
// collected by this Collector to the provided channel and returns once
|
||||||
|
// the last descriptor has been sent.
|
||||||
|
func (m *ServerMetrics) Describe(ch chan<- *prometheus.Desc) {
|
||||||
|
m.serverStartedCounter.Describe(ch)
|
||||||
|
m.serverHandledCounter.Describe(ch)
|
||||||
|
m.serverStreamMsgReceived.Describe(ch)
|
||||||
|
m.serverStreamMsgSent.Describe(ch)
|
||||||
|
if m.serverHandledHistogram != nil {
|
||||||
|
m.serverHandledHistogram.Describe(ch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Collect is called by the Prometheus registry when collecting
|
||||||
|
// metrics. The implementation sends each collected metric via the
|
||||||
|
// provided channel and returns once the last metric has been sent.
|
||||||
|
func (m *ServerMetrics) Collect(ch chan<- prometheus.Metric) {
|
||||||
|
m.serverStartedCounter.Collect(ch)
|
||||||
|
m.serverHandledCounter.Collect(ch)
|
||||||
|
m.serverStreamMsgReceived.Collect(ch)
|
||||||
|
m.serverStreamMsgSent.Collect(ch)
|
||||||
|
if m.serverHandledHistogram != nil {
|
||||||
|
m.serverHandledHistogram.Collect(ch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// InitializeMetrics initializes all metrics, with their appropriate null
|
||||||
|
// value, for all gRPC methods registered on a gRPC server. This is useful, to
|
||||||
|
// ensure that all metrics exist when collecting and querying.
|
||||||
|
// NOTE: This might add significant cardinality and might not be needed in future version of Prometheus (created timestamp).
|
||||||
|
func (m *ServerMetrics) InitializeMetrics(server *grpc.Server) {
|
||||||
|
serviceInfo := server.GetServiceInfo()
|
||||||
|
for serviceName, info := range serviceInfo {
|
||||||
|
for _, mInfo := range info.Methods {
|
||||||
|
m.preRegisterMethod(serviceName, &mInfo)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// preRegisterMethod is invoked on Register of a Server, allowing all gRPC services labels to be pre-populated.
|
||||||
|
func (m *ServerMetrics) preRegisterMethod(serviceName string, mInfo *grpc.MethodInfo) {
|
||||||
|
methodName := mInfo.Name
|
||||||
|
methodType := string(typeFromMethodInfo(mInfo))
|
||||||
|
// These are just references (no increments), as just referencing will create the labels but not set values.
|
||||||
|
_, _ = m.serverStartedCounter.GetMetricWithLabelValues(methodType, serviceName, methodName)
|
||||||
|
_, _ = m.serverStreamMsgReceived.GetMetricWithLabelValues(methodType, serviceName, methodName)
|
||||||
|
_, _ = m.serverStreamMsgSent.GetMetricWithLabelValues(methodType, serviceName, methodName)
|
||||||
|
if m.serverHandledHistogram != nil {
|
||||||
|
_, _ = m.serverHandledHistogram.GetMetricWithLabelValues(methodType, serviceName, methodName)
|
||||||
|
}
|
||||||
|
for _, code := range interceptors.AllCodes {
|
||||||
|
_, _ = m.serverHandledCounter.GetMetricWithLabelValues(methodType, serviceName, methodName, code.String())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// UnaryServerInterceptor is a gRPC server-side interceptor that provides Prometheus monitoring for Unary RPCs.
|
||||||
|
func (m *ServerMetrics) UnaryServerInterceptor(opts ...Option) grpc.UnaryServerInterceptor {
|
||||||
|
return interceptors.UnaryServerInterceptor(&reportable{
|
||||||
|
opts: opts,
|
||||||
|
serverMetrics: m,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// StreamServerInterceptor is a gRPC server-side interceptor that provides Prometheus monitoring for Streaming RPCs.
|
||||||
|
func (m *ServerMetrics) StreamServerInterceptor(opts ...Option) grpc.StreamServerInterceptor {
|
||||||
|
return interceptors.StreamServerInterceptor(&reportable{
|
||||||
|
opts: opts,
|
||||||
|
serverMetrics: m,
|
||||||
|
})
|
||||||
|
}
|
48
vendor/github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus/server_options.go
generated
vendored
Normal file
48
vendor/github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus/server_options.go
generated
vendored
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
// Copyright (c) The go-grpc-middleware Authors.
|
||||||
|
// Licensed under the Apache License 2.0.
|
||||||
|
|
||||||
|
package prometheus
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/prometheus/client_golang/prometheus"
|
||||||
|
)
|
||||||
|
|
||||||
|
type exemplarFromCtxFn func(ctx context.Context) prometheus.Labels
|
||||||
|
|
||||||
|
type serverMetricsConfig struct {
|
||||||
|
counterOpts counterOptions
|
||||||
|
// serverHandledHistogram can be nil.
|
||||||
|
serverHandledHistogram *prometheus.HistogramVec
|
||||||
|
}
|
||||||
|
|
||||||
|
type ServerMetricsOption func(*serverMetricsConfig)
|
||||||
|
|
||||||
|
func (c *serverMetricsConfig) apply(opts []ServerMetricsOption) {
|
||||||
|
for _, o := range opts {
|
||||||
|
o(c)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithServerCounterOptions sets counter options.
|
||||||
|
func WithServerCounterOptions(opts ...CounterOption) ServerMetricsOption {
|
||||||
|
return func(o *serverMetricsConfig) {
|
||||||
|
o.counterOpts = opts
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// WithServerHandlingTimeHistogram turns on recording of handling time of RPCs.
|
||||||
|
// Histogram metrics can be very expensive for Prometheus to retain and query.
|
||||||
|
func WithServerHandlingTimeHistogram(opts ...HistogramOption) ServerMetricsOption {
|
||||||
|
return func(o *serverMetricsConfig) {
|
||||||
|
o.serverHandledHistogram = prometheus.NewHistogramVec(
|
||||||
|
histogramOptions(opts).apply(prometheus.HistogramOpts{
|
||||||
|
Name: "grpc_server_handling_seconds",
|
||||||
|
Help: "Histogram of response latency (seconds) of gRPC that had been application-level handled by the server.",
|
||||||
|
Buckets: prometheus.DefBuckets,
|
||||||
|
}),
|
||||||
|
[]string{"grpc_type", "grpc_service", "grpc_method"},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
BIN
vendor/github.com/grpc-ecosystem/go-grpc-middleware/slack.png
generated
vendored
BIN
vendor/github.com/grpc-ecosystem/go-grpc-middleware/slack.png
generated
vendored
Binary file not shown.
Before Width: | Height: | Size: 5.0 KiB |
2
vendor/github.com/grpc-ecosystem/go-grpc-middleware/v2/COPYRIGHT
generated
vendored
Normal file
2
vendor/github.com/grpc-ecosystem/go-grpc-middleware/v2/COPYRIGHT
generated
vendored
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
Copyright (c) The go-grpc-middleware Authors.
|
||||||
|
Licensed under the Apache License 2.0.
|
83
vendor/github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/client.go
generated
vendored
Normal file
83
vendor/github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/client.go
generated
vendored
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
// Copyright (c) The go-grpc-middleware Authors.
|
||||||
|
// Licensed under the Apache License 2.0.
|
||||||
|
|
||||||
|
// Go gRPC Middleware monitoring interceptors for client-side gRPC.
|
||||||
|
|
||||||
|
package interceptors
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"io"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
// UnaryClientInterceptor is a gRPC client-side interceptor that provides reporting for Unary RPCs.
|
||||||
|
func UnaryClientInterceptor(reportable ClientReportable) grpc.UnaryClientInterceptor {
|
||||||
|
return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
|
||||||
|
r := newReport(Unary, method)
|
||||||
|
reporter, newCtx := reportable.ClientReporter(ctx, CallMeta{ReqProtoOrNil: req, Typ: r.rpcType, Service: r.service, Method: r.method})
|
||||||
|
|
||||||
|
reporter.PostMsgSend(req, nil, time.Since(r.startTime))
|
||||||
|
err := invoker(newCtx, method, req, reply, cc, opts...)
|
||||||
|
reporter.PostMsgReceive(reply, err, time.Since(r.startTime))
|
||||||
|
reporter.PostCall(err, time.Since(r.startTime))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// StreamClientInterceptor is a gRPC client-side interceptor that provides reporting for Stream RPCs.
|
||||||
|
func StreamClientInterceptor(reportable ClientReportable) grpc.StreamClientInterceptor {
|
||||||
|
return func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) {
|
||||||
|
r := newReport(clientStreamType(desc), method)
|
||||||
|
reporter, newCtx := reportable.ClientReporter(ctx, CallMeta{ReqProtoOrNil: nil, Typ: r.rpcType, Service: r.service, Method: r.method})
|
||||||
|
|
||||||
|
clientStream, err := streamer(newCtx, desc, cc, method, opts...)
|
||||||
|
if err != nil {
|
||||||
|
reporter.PostCall(err, time.Since(r.startTime))
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &monitoredClientStream{ClientStream: clientStream, startTime: r.startTime, reporter: reporter}, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func clientStreamType(desc *grpc.StreamDesc) GRPCType {
|
||||||
|
if desc.ClientStreams && !desc.ServerStreams {
|
||||||
|
return ClientStream
|
||||||
|
} else if !desc.ClientStreams && desc.ServerStreams {
|
||||||
|
return ServerStream
|
||||||
|
}
|
||||||
|
return BidiStream
|
||||||
|
}
|
||||||
|
|
||||||
|
// monitoredClientStream wraps grpc.ClientStream allowing each Sent/Recv of message to report.
|
||||||
|
type monitoredClientStream struct {
|
||||||
|
grpc.ClientStream
|
||||||
|
|
||||||
|
startTime time.Time
|
||||||
|
reporter Reporter
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *monitoredClientStream) SendMsg(m interface{}) error {
|
||||||
|
start := time.Now()
|
||||||
|
err := s.ClientStream.SendMsg(m)
|
||||||
|
s.reporter.PostMsgSend(m, err, time.Since(start))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *monitoredClientStream) RecvMsg(m interface{}) error {
|
||||||
|
start := time.Now()
|
||||||
|
err := s.ClientStream.RecvMsg(m)
|
||||||
|
s.reporter.PostMsgReceive(m, err, time.Since(start))
|
||||||
|
|
||||||
|
if err == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var postErr error
|
||||||
|
if err != io.EOF {
|
||||||
|
postErr = err
|
||||||
|
}
|
||||||
|
s.reporter.PostCall(postErr, time.Since(s.startTime))
|
||||||
|
return err
|
||||||
|
}
|
12
vendor/github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/doc.go
generated
vendored
Normal file
12
vendor/github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/doc.go
generated
vendored
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
// Copyright (c) The go-grpc-middleware Authors.
|
||||||
|
// Licensed under the Apache License 2.0.
|
||||||
|
|
||||||
|
//
|
||||||
|
/*
|
||||||
|
interceptor is an internal package used by higher level middlewares. It allows injecting custom code in various
|
||||||
|
places of the gRPC lifecycle.
|
||||||
|
|
||||||
|
This particular package is intended for use by other middleware, metric, logging or otherwise.
|
||||||
|
This allows code to be shared between different implementations.
|
||||||
|
*/
|
||||||
|
package interceptors
|
116
vendor/github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/reporter.go
generated
vendored
Normal file
116
vendor/github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/reporter.go
generated
vendored
Normal file
@ -0,0 +1,116 @@
|
|||||||
|
// Copyright (c) The go-grpc-middleware Authors.
|
||||||
|
// Licensed under the Apache License 2.0.
|
||||||
|
|
||||||
|
package interceptors
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"google.golang.org/grpc/codes"
|
||||||
|
)
|
||||||
|
|
||||||
|
type GRPCType string
|
||||||
|
|
||||||
|
// Timer is a helper interface to time functions.
|
||||||
|
// Useful for interceptors to record the total
|
||||||
|
// time elapsed since completion of a call.
|
||||||
|
type Timer interface {
|
||||||
|
ObserveDuration() time.Duration
|
||||||
|
}
|
||||||
|
|
||||||
|
// zeroTimer.
|
||||||
|
type zeroTimer struct {
|
||||||
|
}
|
||||||
|
|
||||||
|
func (zeroTimer) ObserveDuration() time.Duration {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
var EmptyTimer = &zeroTimer{}
|
||||||
|
|
||||||
|
const (
|
||||||
|
Unary GRPCType = "unary"
|
||||||
|
ClientStream GRPCType = "client_stream"
|
||||||
|
ServerStream GRPCType = "server_stream"
|
||||||
|
BidiStream GRPCType = "bidi_stream"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
AllCodes = []codes.Code{
|
||||||
|
codes.OK, codes.Canceled, codes.Unknown, codes.InvalidArgument, codes.DeadlineExceeded, codes.NotFound,
|
||||||
|
codes.AlreadyExists, codes.PermissionDenied, codes.Unauthenticated, codes.ResourceExhausted,
|
||||||
|
codes.FailedPrecondition, codes.Aborted, codes.OutOfRange, codes.Unimplemented, codes.Internal,
|
||||||
|
codes.Unavailable, codes.DataLoss,
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
func SplitMethodName(fullMethod string) (string, string) {
|
||||||
|
fullMethod = strings.TrimPrefix(fullMethod, "/") // remove leading slash
|
||||||
|
if i := strings.Index(fullMethod, "/"); i >= 0 {
|
||||||
|
return fullMethod[:i], fullMethod[i+1:]
|
||||||
|
}
|
||||||
|
return "unknown", "unknown"
|
||||||
|
}
|
||||||
|
|
||||||
|
type CallMeta struct {
|
||||||
|
ReqProtoOrNil interface{}
|
||||||
|
Typ GRPCType
|
||||||
|
Service string
|
||||||
|
Method string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c CallMeta) FullMethod() string {
|
||||||
|
return fmt.Sprintf("/%s/%s", c.Service, c.Method)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ClientReportable interface {
|
||||||
|
ClientReporter(context.Context, CallMeta) (Reporter, context.Context)
|
||||||
|
}
|
||||||
|
|
||||||
|
type ServerReportable interface {
|
||||||
|
ServerReporter(context.Context, CallMeta) (Reporter, context.Context)
|
||||||
|
}
|
||||||
|
|
||||||
|
// CommonReportableFunc helper allows an easy way to implement reporter with common client and server logic.
|
||||||
|
type CommonReportableFunc func(ctx context.Context, c CallMeta, isClient bool) (Reporter, context.Context)
|
||||||
|
|
||||||
|
func (f CommonReportableFunc) ClientReporter(ctx context.Context, c CallMeta) (Reporter, context.Context) {
|
||||||
|
return f(ctx, c, true)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f CommonReportableFunc) ServerReporter(ctx context.Context, c CallMeta) (Reporter, context.Context) {
|
||||||
|
return f(ctx, c, false)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Reporter interface {
|
||||||
|
PostCall(err error, rpcDuration time.Duration)
|
||||||
|
PostMsgSend(reqProto interface{}, err error, sendDuration time.Duration)
|
||||||
|
PostMsgReceive(replyProto interface{}, err error, recvDuration time.Duration)
|
||||||
|
}
|
||||||
|
|
||||||
|
var _ Reporter = NoopReporter{}
|
||||||
|
|
||||||
|
type NoopReporter struct{}
|
||||||
|
|
||||||
|
func (NoopReporter) PostCall(error, time.Duration) {}
|
||||||
|
func (NoopReporter) PostMsgSend(interface{}, error, time.Duration) {}
|
||||||
|
func (NoopReporter) PostMsgReceive(interface{}, error, time.Duration) {}
|
||||||
|
|
||||||
|
type report struct {
|
||||||
|
rpcType GRPCType
|
||||||
|
service string
|
||||||
|
method string
|
||||||
|
startTime time.Time
|
||||||
|
}
|
||||||
|
|
||||||
|
func newReport(typ GRPCType, fullMethod string) report {
|
||||||
|
r := report{
|
||||||
|
startTime: time.Now(),
|
||||||
|
rpcType: typ,
|
||||||
|
}
|
||||||
|
r.service, r.method = SplitMethodName(fullMethod)
|
||||||
|
return r
|
||||||
|
}
|
74
vendor/github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/server.go
generated
vendored
Normal file
74
vendor/github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/server.go
generated
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
// Copyright (c) The go-grpc-middleware Authors.
|
||||||
|
// Licensed under the Apache License 2.0.
|
||||||
|
|
||||||
|
// Go gRPC Middleware monitoring interceptors for server-side gRPC.
|
||||||
|
|
||||||
|
package interceptors
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
// UnaryServerInterceptor is a gRPC server-side interceptor that provides reporting for Unary RPCs.
|
||||||
|
func UnaryServerInterceptor(reportable ServerReportable) grpc.UnaryServerInterceptor {
|
||||||
|
return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
|
||||||
|
r := newReport(Unary, info.FullMethod)
|
||||||
|
reporter, newCtx := reportable.ServerReporter(ctx, CallMeta{ReqProtoOrNil: req, Typ: r.rpcType, Service: r.service, Method: r.method})
|
||||||
|
|
||||||
|
reporter.PostMsgReceive(req, nil, time.Since(r.startTime))
|
||||||
|
resp, err := handler(newCtx, req)
|
||||||
|
reporter.PostMsgSend(resp, err, time.Since(r.startTime))
|
||||||
|
|
||||||
|
reporter.PostCall(err, time.Since(r.startTime))
|
||||||
|
return resp, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// StreamServerInterceptor is a gRPC server-side interceptor that provides reporting for Streaming RPCs.
|
||||||
|
func StreamServerInterceptor(reportable ServerReportable) grpc.StreamServerInterceptor {
|
||||||
|
return func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
|
||||||
|
r := newReport(ServerStream, info.FullMethod)
|
||||||
|
reporter, newCtx := reportable.ServerReporter(ss.Context(), CallMeta{ReqProtoOrNil: nil, Typ: StreamRPCType(info), Service: r.service, Method: r.method})
|
||||||
|
err := handler(srv, &monitoredServerStream{ServerStream: ss, newCtx: newCtx, reporter: reporter})
|
||||||
|
reporter.PostCall(err, time.Since(r.startTime))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func StreamRPCType(info *grpc.StreamServerInfo) GRPCType {
|
||||||
|
if info.IsClientStream && !info.IsServerStream {
|
||||||
|
return ClientStream
|
||||||
|
} else if !info.IsClientStream && info.IsServerStream {
|
||||||
|
return ServerStream
|
||||||
|
}
|
||||||
|
return BidiStream
|
||||||
|
}
|
||||||
|
|
||||||
|
// monitoredStream wraps grpc.ServerStream allowing each Sent/Recv of message to report.
|
||||||
|
type monitoredServerStream struct {
|
||||||
|
grpc.ServerStream
|
||||||
|
|
||||||
|
newCtx context.Context
|
||||||
|
reporter Reporter
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *monitoredServerStream) Context() context.Context {
|
||||||
|
return s.newCtx
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *monitoredServerStream) SendMsg(m interface{}) error {
|
||||||
|
start := time.Now()
|
||||||
|
err := s.ServerStream.SendMsg(m)
|
||||||
|
s.reporter.PostMsgSend(m, err, time.Since(start))
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *monitoredServerStream) RecvMsg(m interface{}) error {
|
||||||
|
start := time.Now()
|
||||||
|
err := s.ServerStream.RecvMsg(m)
|
||||||
|
s.reporter.PostMsgReceive(m, err, time.Since(start))
|
||||||
|
return err
|
||||||
|
}
|
30
vendor/github.com/grpc-ecosystem/go-grpc-middleware/wrappers.go
generated
vendored
30
vendor/github.com/grpc-ecosystem/go-grpc-middleware/wrappers.go
generated
vendored
@ -1,30 +0,0 @@
|
|||||||
// Copyright 2016 Michal Witkowski. All Rights Reserved.
|
|
||||||
// See LICENSE for licensing terms.
|
|
||||||
|
|
||||||
package grpc_middleware
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context"
|
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
)
|
|
||||||
|
|
||||||
// WrappedServerStream is a thin wrapper around grpc.ServerStream that allows modifying context.
|
|
||||||
type WrappedServerStream struct {
|
|
||||||
grpc.ServerStream
|
|
||||||
// WrappedContext is the wrapper's own Context. You can assign it.
|
|
||||||
WrappedContext context.Context
|
|
||||||
}
|
|
||||||
|
|
||||||
// Context returns the wrapper's WrappedContext, overwriting the nested grpc.ServerStream.Context()
|
|
||||||
func (w *WrappedServerStream) Context() context.Context {
|
|
||||||
return w.WrappedContext
|
|
||||||
}
|
|
||||||
|
|
||||||
// WrapServerStream returns a ServerStream that has the ability to overwrite context.
|
|
||||||
func WrapServerStream(stream grpc.ServerStream) *WrappedServerStream {
|
|
||||||
if existing, ok := stream.(*WrappedServerStream); ok {
|
|
||||||
return existing
|
|
||||||
}
|
|
||||||
return &WrappedServerStream{ServerStream: stream, WrappedContext: stream.Context()}
|
|
||||||
}
|
|
201
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/.gitignore
generated
vendored
201
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/.gitignore
generated
vendored
@ -1,201 +0,0 @@
|
|||||||
#vendor
|
|
||||||
vendor/
|
|
||||||
|
|
||||||
# Created by .ignore support plugin (hsz.mobi)
|
|
||||||
coverage.txt
|
|
||||||
### Go template
|
|
||||||
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
|
||||||
*.o
|
|
||||||
*.a
|
|
||||||
*.so
|
|
||||||
|
|
||||||
# Folders
|
|
||||||
_obj
|
|
||||||
_test
|
|
||||||
|
|
||||||
# Architecture specific extensions/prefixes
|
|
||||||
*.[568vq]
|
|
||||||
[568vq].out
|
|
||||||
|
|
||||||
*.cgo1.go
|
|
||||||
*.cgo2.c
|
|
||||||
_cgo_defun.c
|
|
||||||
_cgo_gotypes.go
|
|
||||||
_cgo_export.*
|
|
||||||
|
|
||||||
_testmain.go
|
|
||||||
|
|
||||||
*.exe
|
|
||||||
*.test
|
|
||||||
*.prof
|
|
||||||
### Windows template
|
|
||||||
# Windows image file caches
|
|
||||||
Thumbs.db
|
|
||||||
ehthumbs.db
|
|
||||||
|
|
||||||
# Folder config file
|
|
||||||
Desktop.ini
|
|
||||||
|
|
||||||
# Recycle Bin used on file shares
|
|
||||||
$RECYCLE.BIN/
|
|
||||||
|
|
||||||
# Windows Installer files
|
|
||||||
*.cab
|
|
||||||
*.msi
|
|
||||||
*.msm
|
|
||||||
*.msp
|
|
||||||
|
|
||||||
# Windows shortcuts
|
|
||||||
*.lnk
|
|
||||||
### Kate template
|
|
||||||
# Swap Files #
|
|
||||||
.*.kate-swp
|
|
||||||
.swp.*
|
|
||||||
### SublimeText template
|
|
||||||
# cache files for sublime text
|
|
||||||
*.tmlanguage.cache
|
|
||||||
*.tmPreferences.cache
|
|
||||||
*.stTheme.cache
|
|
||||||
|
|
||||||
# workspace files are user-specific
|
|
||||||
*.sublime-workspace
|
|
||||||
|
|
||||||
# project files should be checked into the repository, unless a significant
|
|
||||||
# proportion of contributors will probably not be using SublimeText
|
|
||||||
# *.sublime-project
|
|
||||||
|
|
||||||
# sftp configuration file
|
|
||||||
sftp-config.json
|
|
||||||
### Linux template
|
|
||||||
*~
|
|
||||||
|
|
||||||
# temporary files which can be created if a process still has a handle open of a deleted file
|
|
||||||
.fuse_hidden*
|
|
||||||
|
|
||||||
# KDE directory preferences
|
|
||||||
.directory
|
|
||||||
|
|
||||||
# Linux trash folder which might appear on any partition or disk
|
|
||||||
.Trash-*
|
|
||||||
### JetBrains template
|
|
||||||
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and Webstorm
|
|
||||||
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
|
|
||||||
|
|
||||||
# User-specific stuff:
|
|
||||||
.idea
|
|
||||||
.idea/tasks.xml
|
|
||||||
.idea/dictionaries
|
|
||||||
.idea/vcs.xml
|
|
||||||
.idea/jsLibraryMappings.xml
|
|
||||||
|
|
||||||
# Sensitive or high-churn files:
|
|
||||||
.idea/dataSources.ids
|
|
||||||
.idea/dataSources.xml
|
|
||||||
.idea/dataSources.local.xml
|
|
||||||
.idea/sqlDataSources.xml
|
|
||||||
.idea/dynamic.xml
|
|
||||||
.idea/uiDesigner.xml
|
|
||||||
|
|
||||||
# Gradle:
|
|
||||||
.idea/gradle.xml
|
|
||||||
.idea/libraries
|
|
||||||
|
|
||||||
# Mongo Explorer plugin:
|
|
||||||
.idea/mongoSettings.xml
|
|
||||||
|
|
||||||
## File-based project format:
|
|
||||||
*.iws
|
|
||||||
|
|
||||||
## Plugin-specific files:
|
|
||||||
|
|
||||||
# IntelliJ
|
|
||||||
/out/
|
|
||||||
|
|
||||||
# mpeltonen/sbt-idea plugin
|
|
||||||
.idea_modules/
|
|
||||||
|
|
||||||
# JIRA plugin
|
|
||||||
atlassian-ide-plugin.xml
|
|
||||||
|
|
||||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
|
||||||
com_crashlytics_export_strings.xml
|
|
||||||
crashlytics.properties
|
|
||||||
crashlytics-build.properties
|
|
||||||
fabric.properties
|
|
||||||
### Xcode template
|
|
||||||
# Xcode
|
|
||||||
#
|
|
||||||
# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore
|
|
||||||
|
|
||||||
## Build generated
|
|
||||||
build/
|
|
||||||
DerivedData/
|
|
||||||
|
|
||||||
## Various settings
|
|
||||||
*.pbxuser
|
|
||||||
!default.pbxuser
|
|
||||||
*.mode1v3
|
|
||||||
!default.mode1v3
|
|
||||||
*.mode2v3
|
|
||||||
!default.mode2v3
|
|
||||||
*.perspectivev3
|
|
||||||
!default.perspectivev3
|
|
||||||
xcuserdata/
|
|
||||||
|
|
||||||
## Other
|
|
||||||
*.moved-aside
|
|
||||||
*.xccheckout
|
|
||||||
*.xcscmblueprint
|
|
||||||
### Eclipse template
|
|
||||||
|
|
||||||
.metadata
|
|
||||||
bin/
|
|
||||||
tmp/
|
|
||||||
*.tmp
|
|
||||||
*.bak
|
|
||||||
*.swp
|
|
||||||
*~.nib
|
|
||||||
local.properties
|
|
||||||
.settings/
|
|
||||||
.loadpath
|
|
||||||
.recommenders
|
|
||||||
|
|
||||||
# Eclipse Core
|
|
||||||
.project
|
|
||||||
|
|
||||||
# External tool builders
|
|
||||||
.externalToolBuilders/
|
|
||||||
|
|
||||||
# Locally stored "Eclipse launch configurations"
|
|
||||||
*.launch
|
|
||||||
|
|
||||||
# PyDev specific (Python IDE for Eclipse)
|
|
||||||
*.pydevproject
|
|
||||||
|
|
||||||
# CDT-specific (C/C++ Development Tooling)
|
|
||||||
.cproject
|
|
||||||
|
|
||||||
# JDT-specific (Eclipse Java Development Tools)
|
|
||||||
.classpath
|
|
||||||
|
|
||||||
# Java annotation processor (APT)
|
|
||||||
.factorypath
|
|
||||||
|
|
||||||
# PDT-specific (PHP Development Tools)
|
|
||||||
.buildpath
|
|
||||||
|
|
||||||
# sbteclipse plugin
|
|
||||||
.target
|
|
||||||
|
|
||||||
# Tern plugin
|
|
||||||
.tern-project
|
|
||||||
|
|
||||||
# TeXlipse plugin
|
|
||||||
.texlipse
|
|
||||||
|
|
||||||
# STS (Spring Tool Suite)
|
|
||||||
.springBeans
|
|
||||||
|
|
||||||
# Code Recommenders
|
|
||||||
.recommenders/
|
|
||||||
|
|
25
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/.travis.yml
generated
vendored
25
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/.travis.yml
generated
vendored
@ -1,25 +0,0 @@
|
|||||||
sudo: false
|
|
||||||
language: go
|
|
||||||
# * github.com/grpc/grpc-go still supports go1.6
|
|
||||||
# - When we drop support for go1.6 we can remove golang.org/x/net/context
|
|
||||||
# below as it is part of the Go std library since go1.7
|
|
||||||
# * github.com/prometheus/client_golang already requires at least go1.7 since
|
|
||||||
# September 2017
|
|
||||||
go:
|
|
||||||
- 1.6.x
|
|
||||||
- 1.7.x
|
|
||||||
- 1.8.x
|
|
||||||
- 1.9.x
|
|
||||||
- 1.10.x
|
|
||||||
- master
|
|
||||||
|
|
||||||
install:
|
|
||||||
- go get github.com/prometheus/client_golang/prometheus
|
|
||||||
- go get google.golang.org/grpc
|
|
||||||
- go get golang.org/x/net/context
|
|
||||||
- go get github.com/stretchr/testify
|
|
||||||
script:
|
|
||||||
- make test
|
|
||||||
|
|
||||||
after_success:
|
|
||||||
- bash <(curl -s https://codecov.io/bash)
|
|
24
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/CHANGELOG.md
generated
vendored
24
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/CHANGELOG.md
generated
vendored
@ -1,24 +0,0 @@
|
|||||||
# Changelog
|
|
||||||
All notable changes to this project will be documented in this file.
|
|
||||||
|
|
||||||
The format is based on [Keep a Changelog](http://keepachangelog.com/en/1.0.0/)
|
|
||||||
and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.html).
|
|
||||||
|
|
||||||
## [Unreleased]
|
|
||||||
|
|
||||||
## [1.2.0](https://github.com/grpc-ecosystem/go-grpc-prometheus/releases/tag/v1.2.0) - 2018-06-04
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
* Provide metrics object as `prometheus.Collector`, for conventional metric registration.
|
|
||||||
* Support non-default/global Prometheus registry.
|
|
||||||
* Allow configuring counters with `prometheus.CounterOpts`.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
* Remove usage of deprecated `grpc.Code()`.
|
|
||||||
* Remove usage of deprecated `grpc.Errorf` and replace with `status.Errorf`.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
This changelog was started with version `v1.2.0`, for earlier versions refer to the respective [GitHub releases](https://github.com/grpc-ecosystem/go-grpc-prometheus/releases).
|
|
247
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/README.md
generated
vendored
247
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/README.md
generated
vendored
@ -1,247 +0,0 @@
|
|||||||
# Go gRPC Interceptors for Prometheus monitoring
|
|
||||||
|
|
||||||
[](https://travis-ci.org/grpc-ecosystem/go-grpc-prometheus)
|
|
||||||
[](http://goreportcard.com/report/grpc-ecosystem/go-grpc-prometheus)
|
|
||||||
[](https://godoc.org/github.com/grpc-ecosystem/go-grpc-prometheus)
|
|
||||||
[](https://sourcegraph.com/github.com/grpc-ecosystem/go-grpc-prometheus/?badge)
|
|
||||||
[](https://codecov.io/gh/grpc-ecosystem/go-grpc-prometheus)
|
|
||||||
[](LICENSE)
|
|
||||||
|
|
||||||
[Prometheus](https://prometheus.io/) monitoring for your [gRPC Go](https://github.com/grpc/grpc-go) servers and clients.
|
|
||||||
|
|
||||||
A sister implementation for [gRPC Java](https://github.com/grpc/grpc-java) (same metrics, same semantics) is in [grpc-ecosystem/java-grpc-prometheus](https://github.com/grpc-ecosystem/java-grpc-prometheus).
|
|
||||||
|
|
||||||
## Interceptors
|
|
||||||
|
|
||||||
[gRPC Go](https://github.com/grpc/grpc-go) recently acquired support for Interceptors, i.e. middleware that is executed
|
|
||||||
by a gRPC Server before the request is passed onto the user's application logic. It is a perfect way to implement
|
|
||||||
common patterns: auth, logging and... monitoring.
|
|
||||||
|
|
||||||
To use Interceptors in chains, please see [`go-grpc-middleware`](https://github.com/mwitkow/go-grpc-middleware).
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
There are two types of interceptors: client-side and server-side. This package provides monitoring Interceptors for both.
|
|
||||||
|
|
||||||
### Server-side
|
|
||||||
|
|
||||||
```go
|
|
||||||
import "github.com/grpc-ecosystem/go-grpc-prometheus"
|
|
||||||
...
|
|
||||||
// Initialize your gRPC server's interceptor.
|
|
||||||
myServer := grpc.NewServer(
|
|
||||||
grpc.StreamInterceptor(grpc_prometheus.StreamServerInterceptor),
|
|
||||||
grpc.UnaryInterceptor(grpc_prometheus.UnaryServerInterceptor),
|
|
||||||
)
|
|
||||||
// Register your gRPC service implementations.
|
|
||||||
myservice.RegisterMyServiceServer(s.server, &myServiceImpl{})
|
|
||||||
// After all your registrations, make sure all of the Prometheus metrics are initialized.
|
|
||||||
grpc_prometheus.Register(myServer)
|
|
||||||
// Register Prometheus metrics handler.
|
|
||||||
http.Handle("/metrics", promhttp.Handler())
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
### Client-side
|
|
||||||
|
|
||||||
```go
|
|
||||||
import "github.com/grpc-ecosystem/go-grpc-prometheus"
|
|
||||||
...
|
|
||||||
clientConn, err = grpc.Dial(
|
|
||||||
address,
|
|
||||||
grpc.WithUnaryInterceptor(grpc_prometheus.UnaryClientInterceptor),
|
|
||||||
grpc.WithStreamInterceptor(grpc_prometheus.StreamClientInterceptor)
|
|
||||||
)
|
|
||||||
client = pb_testproto.NewTestServiceClient(clientConn)
|
|
||||||
resp, err := client.PingEmpty(s.ctx, &myservice.Request{Msg: "hello"})
|
|
||||||
...
|
|
||||||
```
|
|
||||||
|
|
||||||
# Metrics
|
|
||||||
|
|
||||||
## Labels
|
|
||||||
|
|
||||||
All server-side metrics start with `grpc_server` as Prometheus subsystem name. All client-side metrics start with `grpc_client`. Both of them have mirror-concepts. Similarly all methods
|
|
||||||
contain the same rich labels:
|
|
||||||
|
|
||||||
* `grpc_service` - the [gRPC service](http://www.grpc.io/docs/#defining-a-service) name, which is the combination of protobuf `package` and
|
|
||||||
the `grpc_service` section name. E.g. for `package = mwitkow.testproto` and
|
|
||||||
`service TestService` the label will be `grpc_service="mwitkow.testproto.TestService"`
|
|
||||||
* `grpc_method` - the name of the method called on the gRPC service. E.g.
|
|
||||||
`grpc_method="Ping"`
|
|
||||||
* `grpc_type` - the gRPC [type of request](http://www.grpc.io/docs/guides/concepts.html#rpc-life-cycle).
|
|
||||||
Differentiating between the two is important especially for latency measurements.
|
|
||||||
|
|
||||||
- `unary` is single request, single response RPC
|
|
||||||
- `client_stream` is a multi-request, single response RPC
|
|
||||||
- `server_stream` is a single request, multi-response RPC
|
|
||||||
- `bidi_stream` is a multi-request, multi-response RPC
|
|
||||||
|
|
||||||
|
|
||||||
Additionally for completed RPCs, the following labels are used:
|
|
||||||
|
|
||||||
* `grpc_code` - the human-readable [gRPC status code](https://github.com/grpc/grpc-go/blob/master/codes/codes.go).
|
|
||||||
The list of all statuses is to long, but here are some common ones:
|
|
||||||
|
|
||||||
- `OK` - means the RPC was successful
|
|
||||||
- `IllegalArgument` - RPC contained bad values
|
|
||||||
- `Internal` - server-side error not disclosed to the clients
|
|
||||||
|
|
||||||
## Counters
|
|
||||||
|
|
||||||
The counters and their up to date documentation is in [server_reporter.go](server_reporter.go) and [client_reporter.go](client_reporter.go)
|
|
||||||
the respective Prometheus handler (usually `/metrics`).
|
|
||||||
|
|
||||||
For the purpose of this documentation we will only discuss `grpc_server` metrics. The `grpc_client` ones contain mirror concepts.
|
|
||||||
|
|
||||||
For simplicity, let's assume we're tracking a single server-side RPC call of [`mwitkow.testproto.TestService`](examples/testproto/test.proto),
|
|
||||||
calling the method `PingList`. The call succeeds and returns 20 messages in the stream.
|
|
||||||
|
|
||||||
First, immediately after the server receives the call it will increment the
|
|
||||||
`grpc_server_started_total` and start the handling time clock (if histograms are enabled).
|
|
||||||
|
|
||||||
```jsoniq
|
|
||||||
grpc_server_started_total{grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream"} 1
|
|
||||||
```
|
|
||||||
|
|
||||||
Then the user logic gets invoked. It receives one message from the client containing the request
|
|
||||||
(it's a `server_stream`):
|
|
||||||
|
|
||||||
```jsoniq
|
|
||||||
grpc_server_msg_received_total{grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream"} 1
|
|
||||||
```
|
|
||||||
|
|
||||||
The user logic may return an error, or send multiple messages back to the client. In this case, on
|
|
||||||
each of the 20 messages sent back, a counter will be incremented:
|
|
||||||
|
|
||||||
```jsoniq
|
|
||||||
grpc_server_msg_sent_total{grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream"} 20
|
|
||||||
```
|
|
||||||
|
|
||||||
After the call completes, its status (`OK` or other [gRPC status code](https://github.com/grpc/grpc-go/blob/master/codes/codes.go))
|
|
||||||
and the relevant call labels increment the `grpc_server_handled_total` counter.
|
|
||||||
|
|
||||||
```jsoniq
|
|
||||||
grpc_server_handled_total{grpc_code="OK",grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream"} 1
|
|
||||||
```
|
|
||||||
|
|
||||||
## Histograms
|
|
||||||
|
|
||||||
[Prometheus histograms](https://prometheus.io/docs/concepts/metric_types/#histogram) are a great way
|
|
||||||
to measure latency distributions of your RPCs. However, since it is bad practice to have metrics
|
|
||||||
of [high cardinality](https://prometheus.io/docs/practices/instrumentation/#do-not-overuse-labels)
|
|
||||||
the latency monitoring metrics are disabled by default. To enable them please call the following
|
|
||||||
in your server initialization code:
|
|
||||||
|
|
||||||
```jsoniq
|
|
||||||
grpc_prometheus.EnableHandlingTimeHistogram()
|
|
||||||
```
|
|
||||||
|
|
||||||
After the call completes, its handling time will be recorded in a [Prometheus histogram](https://prometheus.io/docs/concepts/metric_types/#histogram)
|
|
||||||
variable `grpc_server_handling_seconds`. The histogram variable contains three sub-metrics:
|
|
||||||
|
|
||||||
* `grpc_server_handling_seconds_count` - the count of all completed RPCs by status and method
|
|
||||||
* `grpc_server_handling_seconds_sum` - cumulative time of RPCs by status and method, useful for
|
|
||||||
calculating average handling times
|
|
||||||
* `grpc_server_handling_seconds_bucket` - contains the counts of RPCs by status and method in respective
|
|
||||||
handling-time buckets. These buckets can be used by Prometheus to estimate SLAs (see [here](https://prometheus.io/docs/practices/histograms/))
|
|
||||||
|
|
||||||
The counter values will look as follows:
|
|
||||||
|
|
||||||
```jsoniq
|
|
||||||
grpc_server_handling_seconds_bucket{grpc_code="OK",grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream",le="0.005"} 1
|
|
||||||
grpc_server_handling_seconds_bucket{grpc_code="OK",grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream",le="0.01"} 1
|
|
||||||
grpc_server_handling_seconds_bucket{grpc_code="OK",grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream",le="0.025"} 1
|
|
||||||
grpc_server_handling_seconds_bucket{grpc_code="OK",grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream",le="0.05"} 1
|
|
||||||
grpc_server_handling_seconds_bucket{grpc_code="OK",grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream",le="0.1"} 1
|
|
||||||
grpc_server_handling_seconds_bucket{grpc_code="OK",grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream",le="0.25"} 1
|
|
||||||
grpc_server_handling_seconds_bucket{grpc_code="OK",grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream",le="0.5"} 1
|
|
||||||
grpc_server_handling_seconds_bucket{grpc_code="OK",grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream",le="1"} 1
|
|
||||||
grpc_server_handling_seconds_bucket{grpc_code="OK",grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream",le="2.5"} 1
|
|
||||||
grpc_server_handling_seconds_bucket{grpc_code="OK",grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream",le="5"} 1
|
|
||||||
grpc_server_handling_seconds_bucket{grpc_code="OK",grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream",le="10"} 1
|
|
||||||
grpc_server_handling_seconds_bucket{grpc_code="OK",grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream",le="+Inf"} 1
|
|
||||||
grpc_server_handling_seconds_sum{grpc_code="OK",grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream"} 0.0003866430000000001
|
|
||||||
grpc_server_handling_seconds_count{grpc_code="OK",grpc_method="PingList",grpc_service="mwitkow.testproto.TestService",grpc_type="server_stream"} 1
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
||||||
## Useful query examples
|
|
||||||
|
|
||||||
Prometheus philosophy is to provide raw metrics to the monitoring system, and
|
|
||||||
let the aggregations be handled there. The verbosity of above metrics make it possible to have that
|
|
||||||
flexibility. Here's a couple of useful monitoring queries:
|
|
||||||
|
|
||||||
|
|
||||||
### request inbound rate
|
|
||||||
```jsoniq
|
|
||||||
sum(rate(grpc_server_started_total{job="foo"}[1m])) by (grpc_service)
|
|
||||||
```
|
|
||||||
For `job="foo"` (common label to differentiate between Prometheus monitoring targets), calculate the
|
|
||||||
rate of requests per second (1 minute window) for each gRPC `grpc_service` that the job has. Please note
|
|
||||||
how the `grpc_method` is being omitted here: all methods of a given gRPC service will be summed together.
|
|
||||||
|
|
||||||
### unary request error rate
|
|
||||||
```jsoniq
|
|
||||||
sum(rate(grpc_server_handled_total{job="foo",grpc_type="unary",grpc_code!="OK"}[1m])) by (grpc_service)
|
|
||||||
```
|
|
||||||
For `job="foo"`, calculate the per-`grpc_service` rate of `unary` (1:1) RPCs that failed, i.e. the
|
|
||||||
ones that didn't finish with `OK` code.
|
|
||||||
|
|
||||||
### unary request error percentage
|
|
||||||
```jsoniq
|
|
||||||
sum(rate(grpc_server_handled_total{job="foo",grpc_type="unary",grpc_code!="OK"}[1m])) by (grpc_service)
|
|
||||||
/
|
|
||||||
sum(rate(grpc_server_started_total{job="foo",grpc_type="unary"}[1m])) by (grpc_service)
|
|
||||||
* 100.0
|
|
||||||
```
|
|
||||||
For `job="foo"`, calculate the percentage of failed requests by service. It's easy to notice that
|
|
||||||
this is a combination of the two above examples. This is an example of a query you would like to
|
|
||||||
[alert on](https://prometheus.io/docs/alerting/rules/) in your system for SLA violations, e.g.
|
|
||||||
"no more than 1% requests should fail".
|
|
||||||
|
|
||||||
### average response stream size
|
|
||||||
```jsoniq
|
|
||||||
sum(rate(grpc_server_msg_sent_total{job="foo",grpc_type="server_stream"}[10m])) by (grpc_service)
|
|
||||||
/
|
|
||||||
sum(rate(grpc_server_started_total{job="foo",grpc_type="server_stream"}[10m])) by (grpc_service)
|
|
||||||
```
|
|
||||||
For `job="foo"` what is the `grpc_service`-wide `10m` average of messages returned for all `
|
|
||||||
server_stream` RPCs. This allows you to track the stream sizes returned by your system, e.g. allows
|
|
||||||
you to track when clients started to send "wide" queries that ret
|
|
||||||
Note the divisor is the number of started RPCs, in order to account for in-flight requests.
|
|
||||||
|
|
||||||
### 99%-tile latency of unary requests
|
|
||||||
```jsoniq
|
|
||||||
histogram_quantile(0.99,
|
|
||||||
sum(rate(grpc_server_handling_seconds_bucket{job="foo",grpc_type="unary"}[5m])) by (grpc_service,le)
|
|
||||||
)
|
|
||||||
```
|
|
||||||
For `job="foo"`, returns an 99%-tile [quantile estimation](https://prometheus.io/docs/practices/histograms/#quantiles)
|
|
||||||
of the handling time of RPCs per service. Please note the `5m` rate, this means that the quantile
|
|
||||||
estimation will take samples in a rolling `5m` window. When combined with other quantiles
|
|
||||||
(e.g. 50%, 90%), this query gives you tremendous insight into the responsiveness of your system
|
|
||||||
(e.g. impact of caching).
|
|
||||||
|
|
||||||
### percentage of slow unary queries (>250ms)
|
|
||||||
```jsoniq
|
|
||||||
100.0 - (
|
|
||||||
sum(rate(grpc_server_handling_seconds_bucket{job="foo",grpc_type="unary",le="0.25"}[5m])) by (grpc_service)
|
|
||||||
/
|
|
||||||
sum(rate(grpc_server_handling_seconds_count{job="foo",grpc_type="unary"}[5m])) by (grpc_service)
|
|
||||||
) * 100.0
|
|
||||||
```
|
|
||||||
For `job="foo"` calculate the by-`grpc_service` fraction of slow requests that took longer than `0.25`
|
|
||||||
seconds. This query is relatively complex, since the Prometheus aggregations use `le` (less or equal)
|
|
||||||
buckets, meaning that counting "fast" requests fractions is easier. However, simple maths helps.
|
|
||||||
This is an example of a query you would like to alert on in your system for SLA violations,
|
|
||||||
e.g. "less than 1% of requests are slower than 250ms".
|
|
||||||
|
|
||||||
|
|
||||||
## Status
|
|
||||||
|
|
||||||
This code has been used since August 2015 as the basis for monitoring of *production* gRPC micro services at [Improbable](https://improbable.io).
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
`go-grpc-prometheus` is released under the Apache 2.0 license. See the [LICENSE](LICENSE) file for details.
|
|
39
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/client.go
generated
vendored
39
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/client.go
generated
vendored
@ -1,39 +0,0 @@
|
|||||||
// Copyright 2016 Michal Witkowski. All Rights Reserved.
|
|
||||||
// See LICENSE for licensing terms.
|
|
||||||
|
|
||||||
// gRPC Prometheus monitoring interceptors for client-side gRPC.
|
|
||||||
|
|
||||||
package grpc_prometheus
|
|
||||||
|
|
||||||
import (
|
|
||||||
prom "github.com/prometheus/client_golang/prometheus"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
// DefaultClientMetrics is the default instance of ClientMetrics. It is
|
|
||||||
// intended to be used in conjunction the default Prometheus metrics
|
|
||||||
// registry.
|
|
||||||
DefaultClientMetrics = NewClientMetrics()
|
|
||||||
|
|
||||||
// UnaryClientInterceptor is a gRPC client-side interceptor that provides Prometheus monitoring for Unary RPCs.
|
|
||||||
UnaryClientInterceptor = DefaultClientMetrics.UnaryClientInterceptor()
|
|
||||||
|
|
||||||
// StreamClientInterceptor is a gRPC client-side interceptor that provides Prometheus monitoring for Streaming RPCs.
|
|
||||||
StreamClientInterceptor = DefaultClientMetrics.StreamClientInterceptor()
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
prom.MustRegister(DefaultClientMetrics.clientStartedCounter)
|
|
||||||
prom.MustRegister(DefaultClientMetrics.clientHandledCounter)
|
|
||||||
prom.MustRegister(DefaultClientMetrics.clientStreamMsgReceived)
|
|
||||||
prom.MustRegister(DefaultClientMetrics.clientStreamMsgSent)
|
|
||||||
}
|
|
||||||
|
|
||||||
// EnableClientHandlingTimeHistogram turns on recording of handling time of
|
|
||||||
// RPCs. Histogram metrics can be very expensive for Prometheus to retain and
|
|
||||||
// query. This function acts on the DefaultClientMetrics variable and the
|
|
||||||
// default Prometheus metrics registry.
|
|
||||||
func EnableClientHandlingTimeHistogram(opts ...HistogramOption) {
|
|
||||||
DefaultClientMetrics.EnableClientHandlingTimeHistogram(opts...)
|
|
||||||
prom.Register(DefaultClientMetrics.clientHandledHistogram)
|
|
||||||
}
|
|
170
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/client_metrics.go
generated
vendored
170
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/client_metrics.go
generated
vendored
@ -1,170 +0,0 @@
|
|||||||
package grpc_prometheus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"io"
|
|
||||||
|
|
||||||
prom "github.com/prometheus/client_golang/prometheus"
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
"google.golang.org/grpc/codes"
|
|
||||||
"google.golang.org/grpc/status"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ClientMetrics represents a collection of metrics to be registered on a
|
|
||||||
// Prometheus metrics registry for a gRPC client.
|
|
||||||
type ClientMetrics struct {
|
|
||||||
clientStartedCounter *prom.CounterVec
|
|
||||||
clientHandledCounter *prom.CounterVec
|
|
||||||
clientStreamMsgReceived *prom.CounterVec
|
|
||||||
clientStreamMsgSent *prom.CounterVec
|
|
||||||
clientHandledHistogramEnabled bool
|
|
||||||
clientHandledHistogramOpts prom.HistogramOpts
|
|
||||||
clientHandledHistogram *prom.HistogramVec
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewClientMetrics returns a ClientMetrics object. Use a new instance of
|
|
||||||
// ClientMetrics when not using the default Prometheus metrics registry, for
|
|
||||||
// example when wanting to control which metrics are added to a registry as
|
|
||||||
// opposed to automatically adding metrics via init functions.
|
|
||||||
func NewClientMetrics(counterOpts ...CounterOption) *ClientMetrics {
|
|
||||||
opts := counterOptions(counterOpts)
|
|
||||||
return &ClientMetrics{
|
|
||||||
clientStartedCounter: prom.NewCounterVec(
|
|
||||||
opts.apply(prom.CounterOpts{
|
|
||||||
Name: "grpc_client_started_total",
|
|
||||||
Help: "Total number of RPCs started on the client.",
|
|
||||||
}), []string{"grpc_type", "grpc_service", "grpc_method"}),
|
|
||||||
|
|
||||||
clientHandledCounter: prom.NewCounterVec(
|
|
||||||
opts.apply(prom.CounterOpts{
|
|
||||||
Name: "grpc_client_handled_total",
|
|
||||||
Help: "Total number of RPCs completed by the client, regardless of success or failure.",
|
|
||||||
}), []string{"grpc_type", "grpc_service", "grpc_method", "grpc_code"}),
|
|
||||||
|
|
||||||
clientStreamMsgReceived: prom.NewCounterVec(
|
|
||||||
opts.apply(prom.CounterOpts{
|
|
||||||
Name: "grpc_client_msg_received_total",
|
|
||||||
Help: "Total number of RPC stream messages received by the client.",
|
|
||||||
}), []string{"grpc_type", "grpc_service", "grpc_method"}),
|
|
||||||
|
|
||||||
clientStreamMsgSent: prom.NewCounterVec(
|
|
||||||
opts.apply(prom.CounterOpts{
|
|
||||||
Name: "grpc_client_msg_sent_total",
|
|
||||||
Help: "Total number of gRPC stream messages sent by the client.",
|
|
||||||
}), []string{"grpc_type", "grpc_service", "grpc_method"}),
|
|
||||||
|
|
||||||
clientHandledHistogramEnabled: false,
|
|
||||||
clientHandledHistogramOpts: prom.HistogramOpts{
|
|
||||||
Name: "grpc_client_handling_seconds",
|
|
||||||
Help: "Histogram of response latency (seconds) of the gRPC until it is finished by the application.",
|
|
||||||
Buckets: prom.DefBuckets,
|
|
||||||
},
|
|
||||||
clientHandledHistogram: nil,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Describe sends the super-set of all possible descriptors of metrics
|
|
||||||
// collected by this Collector to the provided channel and returns once
|
|
||||||
// the last descriptor has been sent.
|
|
||||||
func (m *ClientMetrics) Describe(ch chan<- *prom.Desc) {
|
|
||||||
m.clientStartedCounter.Describe(ch)
|
|
||||||
m.clientHandledCounter.Describe(ch)
|
|
||||||
m.clientStreamMsgReceived.Describe(ch)
|
|
||||||
m.clientStreamMsgSent.Describe(ch)
|
|
||||||
if m.clientHandledHistogramEnabled {
|
|
||||||
m.clientHandledHistogram.Describe(ch)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Collect is called by the Prometheus registry when collecting
|
|
||||||
// metrics. The implementation sends each collected metric via the
|
|
||||||
// provided channel and returns once the last metric has been sent.
|
|
||||||
func (m *ClientMetrics) Collect(ch chan<- prom.Metric) {
|
|
||||||
m.clientStartedCounter.Collect(ch)
|
|
||||||
m.clientHandledCounter.Collect(ch)
|
|
||||||
m.clientStreamMsgReceived.Collect(ch)
|
|
||||||
m.clientStreamMsgSent.Collect(ch)
|
|
||||||
if m.clientHandledHistogramEnabled {
|
|
||||||
m.clientHandledHistogram.Collect(ch)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// EnableClientHandlingTimeHistogram turns on recording of handling time of RPCs.
|
|
||||||
// Histogram metrics can be very expensive for Prometheus to retain and query.
|
|
||||||
func (m *ClientMetrics) EnableClientHandlingTimeHistogram(opts ...HistogramOption) {
|
|
||||||
for _, o := range opts {
|
|
||||||
o(&m.clientHandledHistogramOpts)
|
|
||||||
}
|
|
||||||
if !m.clientHandledHistogramEnabled {
|
|
||||||
m.clientHandledHistogram = prom.NewHistogramVec(
|
|
||||||
m.clientHandledHistogramOpts,
|
|
||||||
[]string{"grpc_type", "grpc_service", "grpc_method"},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
m.clientHandledHistogramEnabled = true
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnaryClientInterceptor is a gRPC client-side interceptor that provides Prometheus monitoring for Unary RPCs.
|
|
||||||
func (m *ClientMetrics) UnaryClientInterceptor() func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
|
|
||||||
return func(ctx context.Context, method string, req, reply interface{}, cc *grpc.ClientConn, invoker grpc.UnaryInvoker, opts ...grpc.CallOption) error {
|
|
||||||
monitor := newClientReporter(m, Unary, method)
|
|
||||||
monitor.SentMessage()
|
|
||||||
err := invoker(ctx, method, req, reply, cc, opts...)
|
|
||||||
if err != nil {
|
|
||||||
monitor.ReceivedMessage()
|
|
||||||
}
|
|
||||||
st, _ := status.FromError(err)
|
|
||||||
monitor.Handled(st.Code())
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// StreamClientInterceptor is a gRPC client-side interceptor that provides Prometheus monitoring for Streaming RPCs.
|
|
||||||
func (m *ClientMetrics) StreamClientInterceptor() func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) {
|
|
||||||
return func(ctx context.Context, desc *grpc.StreamDesc, cc *grpc.ClientConn, method string, streamer grpc.Streamer, opts ...grpc.CallOption) (grpc.ClientStream, error) {
|
|
||||||
monitor := newClientReporter(m, clientStreamType(desc), method)
|
|
||||||
clientStream, err := streamer(ctx, desc, cc, method, opts...)
|
|
||||||
if err != nil {
|
|
||||||
st, _ := status.FromError(err)
|
|
||||||
monitor.Handled(st.Code())
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
return &monitoredClientStream{clientStream, monitor}, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func clientStreamType(desc *grpc.StreamDesc) grpcType {
|
|
||||||
if desc.ClientStreams && !desc.ServerStreams {
|
|
||||||
return ClientStream
|
|
||||||
} else if !desc.ClientStreams && desc.ServerStreams {
|
|
||||||
return ServerStream
|
|
||||||
}
|
|
||||||
return BidiStream
|
|
||||||
}
|
|
||||||
|
|
||||||
// monitoredClientStream wraps grpc.ClientStream allowing each Sent/Recv of message to increment counters.
|
|
||||||
type monitoredClientStream struct {
|
|
||||||
grpc.ClientStream
|
|
||||||
monitor *clientReporter
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *monitoredClientStream) SendMsg(m interface{}) error {
|
|
||||||
err := s.ClientStream.SendMsg(m)
|
|
||||||
if err == nil {
|
|
||||||
s.monitor.SentMessage()
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *monitoredClientStream) RecvMsg(m interface{}) error {
|
|
||||||
err := s.ClientStream.RecvMsg(m)
|
|
||||||
if err == nil {
|
|
||||||
s.monitor.ReceivedMessage()
|
|
||||||
} else if err == io.EOF {
|
|
||||||
s.monitor.Handled(codes.OK)
|
|
||||||
} else {
|
|
||||||
st, _ := status.FromError(err)
|
|
||||||
s.monitor.Handled(st.Code())
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
46
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/client_reporter.go
generated
vendored
46
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/client_reporter.go
generated
vendored
@ -1,46 +0,0 @@
|
|||||||
// Copyright 2016 Michal Witkowski. All Rights Reserved.
|
|
||||||
// See LICENSE for licensing terms.
|
|
||||||
|
|
||||||
package grpc_prometheus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"google.golang.org/grpc/codes"
|
|
||||||
)
|
|
||||||
|
|
||||||
type clientReporter struct {
|
|
||||||
metrics *ClientMetrics
|
|
||||||
rpcType grpcType
|
|
||||||
serviceName string
|
|
||||||
methodName string
|
|
||||||
startTime time.Time
|
|
||||||
}
|
|
||||||
|
|
||||||
func newClientReporter(m *ClientMetrics, rpcType grpcType, fullMethod string) *clientReporter {
|
|
||||||
r := &clientReporter{
|
|
||||||
metrics: m,
|
|
||||||
rpcType: rpcType,
|
|
||||||
}
|
|
||||||
if r.metrics.clientHandledHistogramEnabled {
|
|
||||||
r.startTime = time.Now()
|
|
||||||
}
|
|
||||||
r.serviceName, r.methodName = splitMethodName(fullMethod)
|
|
||||||
r.metrics.clientStartedCounter.WithLabelValues(string(r.rpcType), r.serviceName, r.methodName).Inc()
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *clientReporter) ReceivedMessage() {
|
|
||||||
r.metrics.clientStreamMsgReceived.WithLabelValues(string(r.rpcType), r.serviceName, r.methodName).Inc()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *clientReporter) SentMessage() {
|
|
||||||
r.metrics.clientStreamMsgSent.WithLabelValues(string(r.rpcType), r.serviceName, r.methodName).Inc()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *clientReporter) Handled(code codes.Code) {
|
|
||||||
r.metrics.clientHandledCounter.WithLabelValues(string(r.rpcType), r.serviceName, r.methodName, code.String()).Inc()
|
|
||||||
if r.metrics.clientHandledHistogramEnabled {
|
|
||||||
r.metrics.clientHandledHistogram.WithLabelValues(string(r.rpcType), r.serviceName, r.methodName).Observe(time.Since(r.startTime).Seconds())
|
|
||||||
}
|
|
||||||
}
|
|
16
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/makefile
generated
vendored
16
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/makefile
generated
vendored
@ -1,16 +0,0 @@
|
|||||||
SHELL="/bin/bash"
|
|
||||||
|
|
||||||
GOFILES_NOVENDOR = $(shell go list ./... | grep -v /vendor/)
|
|
||||||
|
|
||||||
all: vet fmt test
|
|
||||||
|
|
||||||
fmt:
|
|
||||||
go fmt $(GOFILES_NOVENDOR)
|
|
||||||
|
|
||||||
vet:
|
|
||||||
go vet $(GOFILES_NOVENDOR)
|
|
||||||
|
|
||||||
test: vet
|
|
||||||
./scripts/test_all.sh
|
|
||||||
|
|
||||||
.PHONY: all vet test
|
|
41
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/metric_options.go
generated
vendored
41
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/metric_options.go
generated
vendored
@ -1,41 +0,0 @@
|
|||||||
package grpc_prometheus
|
|
||||||
|
|
||||||
import (
|
|
||||||
prom "github.com/prometheus/client_golang/prometheus"
|
|
||||||
)
|
|
||||||
|
|
||||||
// A CounterOption lets you add options to Counter metrics using With* funcs.
|
|
||||||
type CounterOption func(*prom.CounterOpts)
|
|
||||||
|
|
||||||
type counterOptions []CounterOption
|
|
||||||
|
|
||||||
func (co counterOptions) apply(o prom.CounterOpts) prom.CounterOpts {
|
|
||||||
for _, f := range co {
|
|
||||||
f(&o)
|
|
||||||
}
|
|
||||||
return o
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithConstLabels allows you to add ConstLabels to Counter metrics.
|
|
||||||
func WithConstLabels(labels prom.Labels) CounterOption {
|
|
||||||
return func(o *prom.CounterOpts) {
|
|
||||||
o.ConstLabels = labels
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A HistogramOption lets you add options to Histogram metrics using With*
|
|
||||||
// funcs.
|
|
||||||
type HistogramOption func(*prom.HistogramOpts)
|
|
||||||
|
|
||||||
// WithHistogramBuckets allows you to specify custom bucket ranges for histograms if EnableHandlingTimeHistogram is on.
|
|
||||||
func WithHistogramBuckets(buckets []float64) HistogramOption {
|
|
||||||
return func(o *prom.HistogramOpts) { o.Buckets = buckets }
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithHistogramConstLabels allows you to add custom ConstLabels to
|
|
||||||
// histograms metrics.
|
|
||||||
func WithHistogramConstLabels(labels prom.Labels) HistogramOption {
|
|
||||||
return func(o *prom.HistogramOpts) {
|
|
||||||
o.ConstLabels = labels
|
|
||||||
}
|
|
||||||
}
|
|
48
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/server.go
generated
vendored
48
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/server.go
generated
vendored
@ -1,48 +0,0 @@
|
|||||||
// Copyright 2016 Michal Witkowski. All Rights Reserved.
|
|
||||||
// See LICENSE for licensing terms.
|
|
||||||
|
|
||||||
// gRPC Prometheus monitoring interceptors for server-side gRPC.
|
|
||||||
|
|
||||||
package grpc_prometheus
|
|
||||||
|
|
||||||
import (
|
|
||||||
prom "github.com/prometheus/client_golang/prometheus"
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
// DefaultServerMetrics is the default instance of ServerMetrics. It is
|
|
||||||
// intended to be used in conjunction the default Prometheus metrics
|
|
||||||
// registry.
|
|
||||||
DefaultServerMetrics = NewServerMetrics()
|
|
||||||
|
|
||||||
// UnaryServerInterceptor is a gRPC server-side interceptor that provides Prometheus monitoring for Unary RPCs.
|
|
||||||
UnaryServerInterceptor = DefaultServerMetrics.UnaryServerInterceptor()
|
|
||||||
|
|
||||||
// StreamServerInterceptor is a gRPC server-side interceptor that provides Prometheus monitoring for Streaming RPCs.
|
|
||||||
StreamServerInterceptor = DefaultServerMetrics.StreamServerInterceptor()
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
prom.MustRegister(DefaultServerMetrics.serverStartedCounter)
|
|
||||||
prom.MustRegister(DefaultServerMetrics.serverHandledCounter)
|
|
||||||
prom.MustRegister(DefaultServerMetrics.serverStreamMsgReceived)
|
|
||||||
prom.MustRegister(DefaultServerMetrics.serverStreamMsgSent)
|
|
||||||
}
|
|
||||||
|
|
||||||
// Register takes a gRPC server and pre-initializes all counters to 0. This
|
|
||||||
// allows for easier monitoring in Prometheus (no missing metrics), and should
|
|
||||||
// be called *after* all services have been registered with the server. This
|
|
||||||
// function acts on the DefaultServerMetrics variable.
|
|
||||||
func Register(server *grpc.Server) {
|
|
||||||
DefaultServerMetrics.InitializeMetrics(server)
|
|
||||||
}
|
|
||||||
|
|
||||||
// EnableHandlingTimeHistogram turns on recording of handling time
|
|
||||||
// of RPCs. Histogram metrics can be very expensive for Prometheus
|
|
||||||
// to retain and query. This function acts on the DefaultServerMetrics
|
|
||||||
// variable and the default Prometheus metrics registry.
|
|
||||||
func EnableHandlingTimeHistogram(opts ...HistogramOption) {
|
|
||||||
DefaultServerMetrics.EnableHandlingTimeHistogram(opts...)
|
|
||||||
prom.Register(DefaultServerMetrics.serverHandledHistogram)
|
|
||||||
}
|
|
185
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/server_metrics.go
generated
vendored
185
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/server_metrics.go
generated
vendored
@ -1,185 +0,0 @@
|
|||||||
package grpc_prometheus
|
|
||||||
|
|
||||||
import (
|
|
||||||
prom "github.com/prometheus/client_golang/prometheus"
|
|
||||||
"golang.org/x/net/context"
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
"google.golang.org/grpc/status"
|
|
||||||
)
|
|
||||||
|
|
||||||
// ServerMetrics represents a collection of metrics to be registered on a
|
|
||||||
// Prometheus metrics registry for a gRPC server.
|
|
||||||
type ServerMetrics struct {
|
|
||||||
serverStartedCounter *prom.CounterVec
|
|
||||||
serverHandledCounter *prom.CounterVec
|
|
||||||
serverStreamMsgReceived *prom.CounterVec
|
|
||||||
serverStreamMsgSent *prom.CounterVec
|
|
||||||
serverHandledHistogramEnabled bool
|
|
||||||
serverHandledHistogramOpts prom.HistogramOpts
|
|
||||||
serverHandledHistogram *prom.HistogramVec
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewServerMetrics returns a ServerMetrics object. Use a new instance of
|
|
||||||
// ServerMetrics when not using the default Prometheus metrics registry, for
|
|
||||||
// example when wanting to control which metrics are added to a registry as
|
|
||||||
// opposed to automatically adding metrics via init functions.
|
|
||||||
func NewServerMetrics(counterOpts ...CounterOption) *ServerMetrics {
|
|
||||||
opts := counterOptions(counterOpts)
|
|
||||||
return &ServerMetrics{
|
|
||||||
serverStartedCounter: prom.NewCounterVec(
|
|
||||||
opts.apply(prom.CounterOpts{
|
|
||||||
Name: "grpc_server_started_total",
|
|
||||||
Help: "Total number of RPCs started on the server.",
|
|
||||||
}), []string{"grpc_type", "grpc_service", "grpc_method"}),
|
|
||||||
serverHandledCounter: prom.NewCounterVec(
|
|
||||||
opts.apply(prom.CounterOpts{
|
|
||||||
Name: "grpc_server_handled_total",
|
|
||||||
Help: "Total number of RPCs completed on the server, regardless of success or failure.",
|
|
||||||
}), []string{"grpc_type", "grpc_service", "grpc_method", "grpc_code"}),
|
|
||||||
serverStreamMsgReceived: prom.NewCounterVec(
|
|
||||||
opts.apply(prom.CounterOpts{
|
|
||||||
Name: "grpc_server_msg_received_total",
|
|
||||||
Help: "Total number of RPC stream messages received on the server.",
|
|
||||||
}), []string{"grpc_type", "grpc_service", "grpc_method"}),
|
|
||||||
serverStreamMsgSent: prom.NewCounterVec(
|
|
||||||
opts.apply(prom.CounterOpts{
|
|
||||||
Name: "grpc_server_msg_sent_total",
|
|
||||||
Help: "Total number of gRPC stream messages sent by the server.",
|
|
||||||
}), []string{"grpc_type", "grpc_service", "grpc_method"}),
|
|
||||||
serverHandledHistogramEnabled: false,
|
|
||||||
serverHandledHistogramOpts: prom.HistogramOpts{
|
|
||||||
Name: "grpc_server_handling_seconds",
|
|
||||||
Help: "Histogram of response latency (seconds) of gRPC that had been application-level handled by the server.",
|
|
||||||
Buckets: prom.DefBuckets,
|
|
||||||
},
|
|
||||||
serverHandledHistogram: nil,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// EnableHandlingTimeHistogram enables histograms being registered when
|
|
||||||
// registering the ServerMetrics on a Prometheus registry. Histograms can be
|
|
||||||
// expensive on Prometheus servers. It takes options to configure histogram
|
|
||||||
// options such as the defined buckets.
|
|
||||||
func (m *ServerMetrics) EnableHandlingTimeHistogram(opts ...HistogramOption) {
|
|
||||||
for _, o := range opts {
|
|
||||||
o(&m.serverHandledHistogramOpts)
|
|
||||||
}
|
|
||||||
if !m.serverHandledHistogramEnabled {
|
|
||||||
m.serverHandledHistogram = prom.NewHistogramVec(
|
|
||||||
m.serverHandledHistogramOpts,
|
|
||||||
[]string{"grpc_type", "grpc_service", "grpc_method"},
|
|
||||||
)
|
|
||||||
}
|
|
||||||
m.serverHandledHistogramEnabled = true
|
|
||||||
}
|
|
||||||
|
|
||||||
// Describe sends the super-set of all possible descriptors of metrics
|
|
||||||
// collected by this Collector to the provided channel and returns once
|
|
||||||
// the last descriptor has been sent.
|
|
||||||
func (m *ServerMetrics) Describe(ch chan<- *prom.Desc) {
|
|
||||||
m.serverStartedCounter.Describe(ch)
|
|
||||||
m.serverHandledCounter.Describe(ch)
|
|
||||||
m.serverStreamMsgReceived.Describe(ch)
|
|
||||||
m.serverStreamMsgSent.Describe(ch)
|
|
||||||
if m.serverHandledHistogramEnabled {
|
|
||||||
m.serverHandledHistogram.Describe(ch)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Collect is called by the Prometheus registry when collecting
|
|
||||||
// metrics. The implementation sends each collected metric via the
|
|
||||||
// provided channel and returns once the last metric has been sent.
|
|
||||||
func (m *ServerMetrics) Collect(ch chan<- prom.Metric) {
|
|
||||||
m.serverStartedCounter.Collect(ch)
|
|
||||||
m.serverHandledCounter.Collect(ch)
|
|
||||||
m.serverStreamMsgReceived.Collect(ch)
|
|
||||||
m.serverStreamMsgSent.Collect(ch)
|
|
||||||
if m.serverHandledHistogramEnabled {
|
|
||||||
m.serverHandledHistogram.Collect(ch)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// UnaryServerInterceptor is a gRPC server-side interceptor that provides Prometheus monitoring for Unary RPCs.
|
|
||||||
func (m *ServerMetrics) UnaryServerInterceptor() func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
|
|
||||||
return func(ctx context.Context, req interface{}, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) {
|
|
||||||
monitor := newServerReporter(m, Unary, info.FullMethod)
|
|
||||||
monitor.ReceivedMessage()
|
|
||||||
resp, err := handler(ctx, req)
|
|
||||||
st, _ := status.FromError(err)
|
|
||||||
monitor.Handled(st.Code())
|
|
||||||
if err == nil {
|
|
||||||
monitor.SentMessage()
|
|
||||||
}
|
|
||||||
return resp, err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// StreamServerInterceptor is a gRPC server-side interceptor that provides Prometheus monitoring for Streaming RPCs.
|
|
||||||
func (m *ServerMetrics) StreamServerInterceptor() func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
|
|
||||||
return func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error {
|
|
||||||
monitor := newServerReporter(m, streamRPCType(info), info.FullMethod)
|
|
||||||
err := handler(srv, &monitoredServerStream{ss, monitor})
|
|
||||||
st, _ := status.FromError(err)
|
|
||||||
monitor.Handled(st.Code())
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// InitializeMetrics initializes all metrics, with their appropriate null
|
|
||||||
// value, for all gRPC methods registered on a gRPC server. This is useful, to
|
|
||||||
// ensure that all metrics exist when collecting and querying.
|
|
||||||
func (m *ServerMetrics) InitializeMetrics(server *grpc.Server) {
|
|
||||||
serviceInfo := server.GetServiceInfo()
|
|
||||||
for serviceName, info := range serviceInfo {
|
|
||||||
for _, mInfo := range info.Methods {
|
|
||||||
preRegisterMethod(m, serviceName, &mInfo)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func streamRPCType(info *grpc.StreamServerInfo) grpcType {
|
|
||||||
if info.IsClientStream && !info.IsServerStream {
|
|
||||||
return ClientStream
|
|
||||||
} else if !info.IsClientStream && info.IsServerStream {
|
|
||||||
return ServerStream
|
|
||||||
}
|
|
||||||
return BidiStream
|
|
||||||
}
|
|
||||||
|
|
||||||
// monitoredStream wraps grpc.ServerStream allowing each Sent/Recv of message to increment counters.
|
|
||||||
type monitoredServerStream struct {
|
|
||||||
grpc.ServerStream
|
|
||||||
monitor *serverReporter
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *monitoredServerStream) SendMsg(m interface{}) error {
|
|
||||||
err := s.ServerStream.SendMsg(m)
|
|
||||||
if err == nil {
|
|
||||||
s.monitor.SentMessage()
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (s *monitoredServerStream) RecvMsg(m interface{}) error {
|
|
||||||
err := s.ServerStream.RecvMsg(m)
|
|
||||||
if err == nil {
|
|
||||||
s.monitor.ReceivedMessage()
|
|
||||||
}
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
|
|
||||||
// preRegisterMethod is invoked on Register of a Server, allowing all gRPC services labels to be pre-populated.
|
|
||||||
func preRegisterMethod(metrics *ServerMetrics, serviceName string, mInfo *grpc.MethodInfo) {
|
|
||||||
methodName := mInfo.Name
|
|
||||||
methodType := string(typeFromMethodInfo(mInfo))
|
|
||||||
// These are just references (no increments), as just referencing will create the labels but not set values.
|
|
||||||
metrics.serverStartedCounter.GetMetricWithLabelValues(methodType, serviceName, methodName)
|
|
||||||
metrics.serverStreamMsgReceived.GetMetricWithLabelValues(methodType, serviceName, methodName)
|
|
||||||
metrics.serverStreamMsgSent.GetMetricWithLabelValues(methodType, serviceName, methodName)
|
|
||||||
if metrics.serverHandledHistogramEnabled {
|
|
||||||
metrics.serverHandledHistogram.GetMetricWithLabelValues(methodType, serviceName, methodName)
|
|
||||||
}
|
|
||||||
for _, code := range allCodes {
|
|
||||||
metrics.serverHandledCounter.GetMetricWithLabelValues(methodType, serviceName, methodName, code.String())
|
|
||||||
}
|
|
||||||
}
|
|
46
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/server_reporter.go
generated
vendored
46
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/server_reporter.go
generated
vendored
@ -1,46 +0,0 @@
|
|||||||
// Copyright 2016 Michal Witkowski. All Rights Reserved.
|
|
||||||
// See LICENSE for licensing terms.
|
|
||||||
|
|
||||||
package grpc_prometheus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"time"
|
|
||||||
|
|
||||||
"google.golang.org/grpc/codes"
|
|
||||||
)
|
|
||||||
|
|
||||||
type serverReporter struct {
|
|
||||||
metrics *ServerMetrics
|
|
||||||
rpcType grpcType
|
|
||||||
serviceName string
|
|
||||||
methodName string
|
|
||||||
startTime time.Time
|
|
||||||
}
|
|
||||||
|
|
||||||
func newServerReporter(m *ServerMetrics, rpcType grpcType, fullMethod string) *serverReporter {
|
|
||||||
r := &serverReporter{
|
|
||||||
metrics: m,
|
|
||||||
rpcType: rpcType,
|
|
||||||
}
|
|
||||||
if r.metrics.serverHandledHistogramEnabled {
|
|
||||||
r.startTime = time.Now()
|
|
||||||
}
|
|
||||||
r.serviceName, r.methodName = splitMethodName(fullMethod)
|
|
||||||
r.metrics.serverStartedCounter.WithLabelValues(string(r.rpcType), r.serviceName, r.methodName).Inc()
|
|
||||||
return r
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *serverReporter) ReceivedMessage() {
|
|
||||||
r.metrics.serverStreamMsgReceived.WithLabelValues(string(r.rpcType), r.serviceName, r.methodName).Inc()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *serverReporter) SentMessage() {
|
|
||||||
r.metrics.serverStreamMsgSent.WithLabelValues(string(r.rpcType), r.serviceName, r.methodName).Inc()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (r *serverReporter) Handled(code codes.Code) {
|
|
||||||
r.metrics.serverHandledCounter.WithLabelValues(string(r.rpcType), r.serviceName, r.methodName, code.String()).Inc()
|
|
||||||
if r.metrics.serverHandledHistogramEnabled {
|
|
||||||
r.metrics.serverHandledHistogram.WithLabelValues(string(r.rpcType), r.serviceName, r.methodName).Observe(time.Since(r.startTime).Seconds())
|
|
||||||
}
|
|
||||||
}
|
|
50
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/util.go
generated
vendored
50
vendor/github.com/grpc-ecosystem/go-grpc-prometheus/util.go
generated
vendored
@ -1,50 +0,0 @@
|
|||||||
// Copyright 2016 Michal Witkowski. All Rights Reserved.
|
|
||||||
// See LICENSE for licensing terms.
|
|
||||||
|
|
||||||
package grpc_prometheus
|
|
||||||
|
|
||||||
import (
|
|
||||||
"strings"
|
|
||||||
|
|
||||||
"google.golang.org/grpc"
|
|
||||||
"google.golang.org/grpc/codes"
|
|
||||||
)
|
|
||||||
|
|
||||||
type grpcType string
|
|
||||||
|
|
||||||
const (
|
|
||||||
Unary grpcType = "unary"
|
|
||||||
ClientStream grpcType = "client_stream"
|
|
||||||
ServerStream grpcType = "server_stream"
|
|
||||||
BidiStream grpcType = "bidi_stream"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
allCodes = []codes.Code{
|
|
||||||
codes.OK, codes.Canceled, codes.Unknown, codes.InvalidArgument, codes.DeadlineExceeded, codes.NotFound,
|
|
||||||
codes.AlreadyExists, codes.PermissionDenied, codes.Unauthenticated, codes.ResourceExhausted,
|
|
||||||
codes.FailedPrecondition, codes.Aborted, codes.OutOfRange, codes.Unimplemented, codes.Internal,
|
|
||||||
codes.Unavailable, codes.DataLoss,
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
func splitMethodName(fullMethodName string) (string, string) {
|
|
||||||
fullMethodName = strings.TrimPrefix(fullMethodName, "/") // remove leading slash
|
|
||||||
if i := strings.Index(fullMethodName, "/"); i >= 0 {
|
|
||||||
return fullMethodName[:i], fullMethodName[i+1:]
|
|
||||||
}
|
|
||||||
return "unknown", "unknown"
|
|
||||||
}
|
|
||||||
|
|
||||||
func typeFromMethodInfo(mInfo *grpc.MethodInfo) grpcType {
|
|
||||||
if !mInfo.IsClientStream && !mInfo.IsServerStream {
|
|
||||||
return Unary
|
|
||||||
}
|
|
||||||
if mInfo.IsClientStream && !mInfo.IsServerStream {
|
|
||||||
return ClientStream
|
|
||||||
}
|
|
||||||
if !mInfo.IsClientStream && mInfo.IsServerStream {
|
|
||||||
return ServerStream
|
|
||||||
}
|
|
||||||
return BidiStream
|
|
||||||
}
|
|
56
vendor/golang.org/x/net/context/context.go
generated
vendored
56
vendor/golang.org/x/net/context/context.go
generated
vendored
@ -1,56 +0,0 @@
|
|||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
// Package context defines the Context type, which carries deadlines,
|
|
||||||
// cancelation signals, and other request-scoped values across API boundaries
|
|
||||||
// and between processes.
|
|
||||||
// As of Go 1.7 this package is available in the standard library under the
|
|
||||||
// name context. https://golang.org/pkg/context.
|
|
||||||
//
|
|
||||||
// Incoming requests to a server should create a Context, and outgoing calls to
|
|
||||||
// servers should accept a Context. The chain of function calls between must
|
|
||||||
// propagate the Context, optionally replacing it with a modified copy created
|
|
||||||
// using WithDeadline, WithTimeout, WithCancel, or WithValue.
|
|
||||||
//
|
|
||||||
// Programs that use Contexts should follow these rules to keep interfaces
|
|
||||||
// consistent across packages and enable static analysis tools to check context
|
|
||||||
// propagation:
|
|
||||||
//
|
|
||||||
// Do not store Contexts inside a struct type; instead, pass a Context
|
|
||||||
// explicitly to each function that needs it. The Context should be the first
|
|
||||||
// parameter, typically named ctx:
|
|
||||||
//
|
|
||||||
// func DoSomething(ctx context.Context, arg Arg) error {
|
|
||||||
// // ... use ctx ...
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// Do not pass a nil Context, even if a function permits it. Pass context.TODO
|
|
||||||
// if you are unsure about which Context to use.
|
|
||||||
//
|
|
||||||
// Use context Values only for request-scoped data that transits processes and
|
|
||||||
// APIs, not for passing optional parameters to functions.
|
|
||||||
//
|
|
||||||
// The same Context may be passed to functions running in different goroutines;
|
|
||||||
// Contexts are safe for simultaneous use by multiple goroutines.
|
|
||||||
//
|
|
||||||
// See http://blog.golang.org/context for example code for a server that uses
|
|
||||||
// Contexts.
|
|
||||||
package context // import "golang.org/x/net/context"
|
|
||||||
|
|
||||||
// Background returns a non-nil, empty Context. It is never canceled, has no
|
|
||||||
// values, and has no deadline. It is typically used by the main function,
|
|
||||||
// initialization, and tests, and as the top-level Context for incoming
|
|
||||||
// requests.
|
|
||||||
func Background() Context {
|
|
||||||
return background
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO returns a non-nil, empty Context. Code should use context.TODO when
|
|
||||||
// it's unclear which Context to use or it is not yet available (because the
|
|
||||||
// surrounding function has not yet been extended to accept a Context
|
|
||||||
// parameter). TODO is recognized by static analysis tools that determine
|
|
||||||
// whether Contexts are propagated correctly in a program.
|
|
||||||
func TODO() Context {
|
|
||||||
return todo
|
|
||||||
}
|
|
72
vendor/golang.org/x/net/context/go17.go
generated
vendored
72
vendor/golang.org/x/net/context/go17.go
generated
vendored
@ -1,72 +0,0 @@
|
|||||||
// Copyright 2016 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
//go:build go1.7
|
|
||||||
|
|
||||||
package context
|
|
||||||
|
|
||||||
import (
|
|
||||||
"context" // standard library's context, as of Go 1.7
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
var (
|
|
||||||
todo = context.TODO()
|
|
||||||
background = context.Background()
|
|
||||||
)
|
|
||||||
|
|
||||||
// Canceled is the error returned by Context.Err when the context is canceled.
|
|
||||||
var Canceled = context.Canceled
|
|
||||||
|
|
||||||
// DeadlineExceeded is the error returned by Context.Err when the context's
|
|
||||||
// deadline passes.
|
|
||||||
var DeadlineExceeded = context.DeadlineExceeded
|
|
||||||
|
|
||||||
// WithCancel returns a copy of parent with a new Done channel. The returned
|
|
||||||
// context's Done channel is closed when the returned cancel function is called
|
|
||||||
// or when the parent context's Done channel is closed, whichever happens first.
|
|
||||||
//
|
|
||||||
// Canceling this context releases resources associated with it, so code should
|
|
||||||
// call cancel as soon as the operations running in this Context complete.
|
|
||||||
func WithCancel(parent Context) (ctx Context, cancel CancelFunc) {
|
|
||||||
ctx, f := context.WithCancel(parent)
|
|
||||||
return ctx, f
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithDeadline returns a copy of the parent context with the deadline adjusted
|
|
||||||
// to be no later than d. If the parent's deadline is already earlier than d,
|
|
||||||
// WithDeadline(parent, d) is semantically equivalent to parent. The returned
|
|
||||||
// context's Done channel is closed when the deadline expires, when the returned
|
|
||||||
// cancel function is called, or when the parent context's Done channel is
|
|
||||||
// closed, whichever happens first.
|
|
||||||
//
|
|
||||||
// Canceling this context releases resources associated with it, so code should
|
|
||||||
// call cancel as soon as the operations running in this Context complete.
|
|
||||||
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) {
|
|
||||||
ctx, f := context.WithDeadline(parent, deadline)
|
|
||||||
return ctx, f
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)).
|
|
||||||
//
|
|
||||||
// Canceling this context releases resources associated with it, so code should
|
|
||||||
// call cancel as soon as the operations running in this Context complete:
|
|
||||||
//
|
|
||||||
// func slowOperationWithTimeout(ctx context.Context) (Result, error) {
|
|
||||||
// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond)
|
|
||||||
// defer cancel() // releases resources if slowOperation completes before timeout elapses
|
|
||||||
// return slowOperation(ctx)
|
|
||||||
// }
|
|
||||||
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {
|
|
||||||
return WithDeadline(parent, time.Now().Add(timeout))
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithValue returns a copy of parent in which the value associated with key is
|
|
||||||
// val.
|
|
||||||
//
|
|
||||||
// Use context Values only for request-scoped data that transits processes and
|
|
||||||
// APIs, not for passing optional parameters to functions.
|
|
||||||
func WithValue(parent Context, key interface{}, val interface{}) Context {
|
|
||||||
return context.WithValue(parent, key, val)
|
|
||||||
}
|
|
20
vendor/golang.org/x/net/context/go19.go
generated
vendored
20
vendor/golang.org/x/net/context/go19.go
generated
vendored
@ -1,20 +0,0 @@
|
|||||||
// Copyright 2017 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
//go:build go1.9
|
|
||||||
|
|
||||||
package context
|
|
||||||
|
|
||||||
import "context" // standard library's context, as of Go 1.7
|
|
||||||
|
|
||||||
// A Context carries a deadline, a cancelation signal, and other values across
|
|
||||||
// API boundaries.
|
|
||||||
//
|
|
||||||
// Context's methods may be called by multiple goroutines simultaneously.
|
|
||||||
type Context = context.Context
|
|
||||||
|
|
||||||
// A CancelFunc tells an operation to abandon its work.
|
|
||||||
// A CancelFunc does not wait for the work to stop.
|
|
||||||
// After the first call, subsequent calls to a CancelFunc do nothing.
|
|
||||||
type CancelFunc = context.CancelFunc
|
|
300
vendor/golang.org/x/net/context/pre_go17.go
generated
vendored
300
vendor/golang.org/x/net/context/pre_go17.go
generated
vendored
@ -1,300 +0,0 @@
|
|||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
//go:build !go1.7
|
|
||||||
|
|
||||||
package context
|
|
||||||
|
|
||||||
import (
|
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"sync"
|
|
||||||
"time"
|
|
||||||
)
|
|
||||||
|
|
||||||
// An emptyCtx is never canceled, has no values, and has no deadline. It is not
|
|
||||||
// struct{}, since vars of this type must have distinct addresses.
|
|
||||||
type emptyCtx int
|
|
||||||
|
|
||||||
func (*emptyCtx) Deadline() (deadline time.Time, ok bool) {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*emptyCtx) Done() <-chan struct{} {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*emptyCtx) Err() error {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (*emptyCtx) Value(key interface{}) interface{} {
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e *emptyCtx) String() string {
|
|
||||||
switch e {
|
|
||||||
case background:
|
|
||||||
return "context.Background"
|
|
||||||
case todo:
|
|
||||||
return "context.TODO"
|
|
||||||
}
|
|
||||||
return "unknown empty Context"
|
|
||||||
}
|
|
||||||
|
|
||||||
var (
|
|
||||||
background = new(emptyCtx)
|
|
||||||
todo = new(emptyCtx)
|
|
||||||
)
|
|
||||||
|
|
||||||
// Canceled is the error returned by Context.Err when the context is canceled.
|
|
||||||
var Canceled = errors.New("context canceled")
|
|
||||||
|
|
||||||
// DeadlineExceeded is the error returned by Context.Err when the context's
|
|
||||||
// deadline passes.
|
|
||||||
var DeadlineExceeded = errors.New("context deadline exceeded")
|
|
||||||
|
|
||||||
// WithCancel returns a copy of parent with a new Done channel. The returned
|
|
||||||
// context's Done channel is closed when the returned cancel function is called
|
|
||||||
// or when the parent context's Done channel is closed, whichever happens first.
|
|
||||||
//
|
|
||||||
// Canceling this context releases resources associated with it, so code should
|
|
||||||
// call cancel as soon as the operations running in this Context complete.
|
|
||||||
func WithCancel(parent Context) (ctx Context, cancel CancelFunc) {
|
|
||||||
c := newCancelCtx(parent)
|
|
||||||
propagateCancel(parent, c)
|
|
||||||
return c, func() { c.cancel(true, Canceled) }
|
|
||||||
}
|
|
||||||
|
|
||||||
// newCancelCtx returns an initialized cancelCtx.
|
|
||||||
func newCancelCtx(parent Context) *cancelCtx {
|
|
||||||
return &cancelCtx{
|
|
||||||
Context: parent,
|
|
||||||
done: make(chan struct{}),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// propagateCancel arranges for child to be canceled when parent is.
|
|
||||||
func propagateCancel(parent Context, child canceler) {
|
|
||||||
if parent.Done() == nil {
|
|
||||||
return // parent is never canceled
|
|
||||||
}
|
|
||||||
if p, ok := parentCancelCtx(parent); ok {
|
|
||||||
p.mu.Lock()
|
|
||||||
if p.err != nil {
|
|
||||||
// parent has already been canceled
|
|
||||||
child.cancel(false, p.err)
|
|
||||||
} else {
|
|
||||||
if p.children == nil {
|
|
||||||
p.children = make(map[canceler]bool)
|
|
||||||
}
|
|
||||||
p.children[child] = true
|
|
||||||
}
|
|
||||||
p.mu.Unlock()
|
|
||||||
} else {
|
|
||||||
go func() {
|
|
||||||
select {
|
|
||||||
case <-parent.Done():
|
|
||||||
child.cancel(false, parent.Err())
|
|
||||||
case <-child.Done():
|
|
||||||
}
|
|
||||||
}()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// parentCancelCtx follows a chain of parent references until it finds a
|
|
||||||
// *cancelCtx. This function understands how each of the concrete types in this
|
|
||||||
// package represents its parent.
|
|
||||||
func parentCancelCtx(parent Context) (*cancelCtx, bool) {
|
|
||||||
for {
|
|
||||||
switch c := parent.(type) {
|
|
||||||
case *cancelCtx:
|
|
||||||
return c, true
|
|
||||||
case *timerCtx:
|
|
||||||
return c.cancelCtx, true
|
|
||||||
case *valueCtx:
|
|
||||||
parent = c.Context
|
|
||||||
default:
|
|
||||||
return nil, false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// removeChild removes a context from its parent.
|
|
||||||
func removeChild(parent Context, child canceler) {
|
|
||||||
p, ok := parentCancelCtx(parent)
|
|
||||||
if !ok {
|
|
||||||
return
|
|
||||||
}
|
|
||||||
p.mu.Lock()
|
|
||||||
if p.children != nil {
|
|
||||||
delete(p.children, child)
|
|
||||||
}
|
|
||||||
p.mu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
// A canceler is a context type that can be canceled directly. The
|
|
||||||
// implementations are *cancelCtx and *timerCtx.
|
|
||||||
type canceler interface {
|
|
||||||
cancel(removeFromParent bool, err error)
|
|
||||||
Done() <-chan struct{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A cancelCtx can be canceled. When canceled, it also cancels any children
|
|
||||||
// that implement canceler.
|
|
||||||
type cancelCtx struct {
|
|
||||||
Context
|
|
||||||
|
|
||||||
done chan struct{} // closed by the first cancel call.
|
|
||||||
|
|
||||||
mu sync.Mutex
|
|
||||||
children map[canceler]bool // set to nil by the first cancel call
|
|
||||||
err error // set to non-nil by the first cancel call
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *cancelCtx) Done() <-chan struct{} {
|
|
||||||
return c.done
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *cancelCtx) Err() error {
|
|
||||||
c.mu.Lock()
|
|
||||||
defer c.mu.Unlock()
|
|
||||||
return c.err
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *cancelCtx) String() string {
|
|
||||||
return fmt.Sprintf("%v.WithCancel", c.Context)
|
|
||||||
}
|
|
||||||
|
|
||||||
// cancel closes c.done, cancels each of c's children, and, if
|
|
||||||
// removeFromParent is true, removes c from its parent's children.
|
|
||||||
func (c *cancelCtx) cancel(removeFromParent bool, err error) {
|
|
||||||
if err == nil {
|
|
||||||
panic("context: internal error: missing cancel error")
|
|
||||||
}
|
|
||||||
c.mu.Lock()
|
|
||||||
if c.err != nil {
|
|
||||||
c.mu.Unlock()
|
|
||||||
return // already canceled
|
|
||||||
}
|
|
||||||
c.err = err
|
|
||||||
close(c.done)
|
|
||||||
for child := range c.children {
|
|
||||||
// NOTE: acquiring the child's lock while holding parent's lock.
|
|
||||||
child.cancel(false, err)
|
|
||||||
}
|
|
||||||
c.children = nil
|
|
||||||
c.mu.Unlock()
|
|
||||||
|
|
||||||
if removeFromParent {
|
|
||||||
removeChild(c.Context, c)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithDeadline returns a copy of the parent context with the deadline adjusted
|
|
||||||
// to be no later than d. If the parent's deadline is already earlier than d,
|
|
||||||
// WithDeadline(parent, d) is semantically equivalent to parent. The returned
|
|
||||||
// context's Done channel is closed when the deadline expires, when the returned
|
|
||||||
// cancel function is called, or when the parent context's Done channel is
|
|
||||||
// closed, whichever happens first.
|
|
||||||
//
|
|
||||||
// Canceling this context releases resources associated with it, so code should
|
|
||||||
// call cancel as soon as the operations running in this Context complete.
|
|
||||||
func WithDeadline(parent Context, deadline time.Time) (Context, CancelFunc) {
|
|
||||||
if cur, ok := parent.Deadline(); ok && cur.Before(deadline) {
|
|
||||||
// The current deadline is already sooner than the new one.
|
|
||||||
return WithCancel(parent)
|
|
||||||
}
|
|
||||||
c := &timerCtx{
|
|
||||||
cancelCtx: newCancelCtx(parent),
|
|
||||||
deadline: deadline,
|
|
||||||
}
|
|
||||||
propagateCancel(parent, c)
|
|
||||||
d := deadline.Sub(time.Now())
|
|
||||||
if d <= 0 {
|
|
||||||
c.cancel(true, DeadlineExceeded) // deadline has already passed
|
|
||||||
return c, func() { c.cancel(true, Canceled) }
|
|
||||||
}
|
|
||||||
c.mu.Lock()
|
|
||||||
defer c.mu.Unlock()
|
|
||||||
if c.err == nil {
|
|
||||||
c.timer = time.AfterFunc(d, func() {
|
|
||||||
c.cancel(true, DeadlineExceeded)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
return c, func() { c.cancel(true, Canceled) }
|
|
||||||
}
|
|
||||||
|
|
||||||
// A timerCtx carries a timer and a deadline. It embeds a cancelCtx to
|
|
||||||
// implement Done and Err. It implements cancel by stopping its timer then
|
|
||||||
// delegating to cancelCtx.cancel.
|
|
||||||
type timerCtx struct {
|
|
||||||
*cancelCtx
|
|
||||||
timer *time.Timer // Under cancelCtx.mu.
|
|
||||||
|
|
||||||
deadline time.Time
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *timerCtx) Deadline() (deadline time.Time, ok bool) {
|
|
||||||
return c.deadline, true
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *timerCtx) String() string {
|
|
||||||
return fmt.Sprintf("%v.WithDeadline(%s [%s])", c.cancelCtx.Context, c.deadline, c.deadline.Sub(time.Now()))
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *timerCtx) cancel(removeFromParent bool, err error) {
|
|
||||||
c.cancelCtx.cancel(false, err)
|
|
||||||
if removeFromParent {
|
|
||||||
// Remove this timerCtx from its parent cancelCtx's children.
|
|
||||||
removeChild(c.cancelCtx.Context, c)
|
|
||||||
}
|
|
||||||
c.mu.Lock()
|
|
||||||
if c.timer != nil {
|
|
||||||
c.timer.Stop()
|
|
||||||
c.timer = nil
|
|
||||||
}
|
|
||||||
c.mu.Unlock()
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithTimeout returns WithDeadline(parent, time.Now().Add(timeout)).
|
|
||||||
//
|
|
||||||
// Canceling this context releases resources associated with it, so code should
|
|
||||||
// call cancel as soon as the operations running in this Context complete:
|
|
||||||
//
|
|
||||||
// func slowOperationWithTimeout(ctx context.Context) (Result, error) {
|
|
||||||
// ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond)
|
|
||||||
// defer cancel() // releases resources if slowOperation completes before timeout elapses
|
|
||||||
// return slowOperation(ctx)
|
|
||||||
// }
|
|
||||||
func WithTimeout(parent Context, timeout time.Duration) (Context, CancelFunc) {
|
|
||||||
return WithDeadline(parent, time.Now().Add(timeout))
|
|
||||||
}
|
|
||||||
|
|
||||||
// WithValue returns a copy of parent in which the value associated with key is
|
|
||||||
// val.
|
|
||||||
//
|
|
||||||
// Use context Values only for request-scoped data that transits processes and
|
|
||||||
// APIs, not for passing optional parameters to functions.
|
|
||||||
func WithValue(parent Context, key interface{}, val interface{}) Context {
|
|
||||||
return &valueCtx{parent, key, val}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A valueCtx carries a key-value pair. It implements Value for that key and
|
|
||||||
// delegates all other calls to the embedded Context.
|
|
||||||
type valueCtx struct {
|
|
||||||
Context
|
|
||||||
key, val interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *valueCtx) String() string {
|
|
||||||
return fmt.Sprintf("%v.WithValue(%#v, %#v)", c.Context, c.key, c.val)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (c *valueCtx) Value(key interface{}) interface{} {
|
|
||||||
if c.key == key {
|
|
||||||
return c.val
|
|
||||||
}
|
|
||||||
return c.Context.Value(key)
|
|
||||||
}
|
|
109
vendor/golang.org/x/net/context/pre_go19.go
generated
vendored
109
vendor/golang.org/x/net/context/pre_go19.go
generated
vendored
@ -1,109 +0,0 @@
|
|||||||
// Copyright 2014 The Go Authors. All rights reserved.
|
|
||||||
// Use of this source code is governed by a BSD-style
|
|
||||||
// license that can be found in the LICENSE file.
|
|
||||||
|
|
||||||
//go:build !go1.9
|
|
||||||
|
|
||||||
package context
|
|
||||||
|
|
||||||
import "time"
|
|
||||||
|
|
||||||
// A Context carries a deadline, a cancelation signal, and other values across
|
|
||||||
// API boundaries.
|
|
||||||
//
|
|
||||||
// Context's methods may be called by multiple goroutines simultaneously.
|
|
||||||
type Context interface {
|
|
||||||
// Deadline returns the time when work done on behalf of this context
|
|
||||||
// should be canceled. Deadline returns ok==false when no deadline is
|
|
||||||
// set. Successive calls to Deadline return the same results.
|
|
||||||
Deadline() (deadline time.Time, ok bool)
|
|
||||||
|
|
||||||
// Done returns a channel that's closed when work done on behalf of this
|
|
||||||
// context should be canceled. Done may return nil if this context can
|
|
||||||
// never be canceled. Successive calls to Done return the same value.
|
|
||||||
//
|
|
||||||
// WithCancel arranges for Done to be closed when cancel is called;
|
|
||||||
// WithDeadline arranges for Done to be closed when the deadline
|
|
||||||
// expires; WithTimeout arranges for Done to be closed when the timeout
|
|
||||||
// elapses.
|
|
||||||
//
|
|
||||||
// Done is provided for use in select statements:
|
|
||||||
//
|
|
||||||
// // Stream generates values with DoSomething and sends them to out
|
|
||||||
// // until DoSomething returns an error or ctx.Done is closed.
|
|
||||||
// func Stream(ctx context.Context, out chan<- Value) error {
|
|
||||||
// for {
|
|
||||||
// v, err := DoSomething(ctx)
|
|
||||||
// if err != nil {
|
|
||||||
// return err
|
|
||||||
// }
|
|
||||||
// select {
|
|
||||||
// case <-ctx.Done():
|
|
||||||
// return ctx.Err()
|
|
||||||
// case out <- v:
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// See http://blog.golang.org/pipelines for more examples of how to use
|
|
||||||
// a Done channel for cancelation.
|
|
||||||
Done() <-chan struct{}
|
|
||||||
|
|
||||||
// Err returns a non-nil error value after Done is closed. Err returns
|
|
||||||
// Canceled if the context was canceled or DeadlineExceeded if the
|
|
||||||
// context's deadline passed. No other values for Err are defined.
|
|
||||||
// After Done is closed, successive calls to Err return the same value.
|
|
||||||
Err() error
|
|
||||||
|
|
||||||
// Value returns the value associated with this context for key, or nil
|
|
||||||
// if no value is associated with key. Successive calls to Value with
|
|
||||||
// the same key returns the same result.
|
|
||||||
//
|
|
||||||
// Use context values only for request-scoped data that transits
|
|
||||||
// processes and API boundaries, not for passing optional parameters to
|
|
||||||
// functions.
|
|
||||||
//
|
|
||||||
// A key identifies a specific value in a Context. Functions that wish
|
|
||||||
// to store values in Context typically allocate a key in a global
|
|
||||||
// variable then use that key as the argument to context.WithValue and
|
|
||||||
// Context.Value. A key can be any type that supports equality;
|
|
||||||
// packages should define keys as an unexported type to avoid
|
|
||||||
// collisions.
|
|
||||||
//
|
|
||||||
// Packages that define a Context key should provide type-safe accessors
|
|
||||||
// for the values stores using that key:
|
|
||||||
//
|
|
||||||
// // Package user defines a User type that's stored in Contexts.
|
|
||||||
// package user
|
|
||||||
//
|
|
||||||
// import "golang.org/x/net/context"
|
|
||||||
//
|
|
||||||
// // User is the type of value stored in the Contexts.
|
|
||||||
// type User struct {...}
|
|
||||||
//
|
|
||||||
// // key is an unexported type for keys defined in this package.
|
|
||||||
// // This prevents collisions with keys defined in other packages.
|
|
||||||
// type key int
|
|
||||||
//
|
|
||||||
// // userKey is the key for user.User values in Contexts. It is
|
|
||||||
// // unexported; clients use user.NewContext and user.FromContext
|
|
||||||
// // instead of using this key directly.
|
|
||||||
// var userKey key = 0
|
|
||||||
//
|
|
||||||
// // NewContext returns a new Context that carries value u.
|
|
||||||
// func NewContext(ctx context.Context, u *User) context.Context {
|
|
||||||
// return context.WithValue(ctx, userKey, u)
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// // FromContext returns the User value stored in ctx, if any.
|
|
||||||
// func FromContext(ctx context.Context) (*User, bool) {
|
|
||||||
// u, ok := ctx.Value(userKey).(*User)
|
|
||||||
// return u, ok
|
|
||||||
// }
|
|
||||||
Value(key interface{}) interface{}
|
|
||||||
}
|
|
||||||
|
|
||||||
// A CancelFunc tells an operation to abandon its work.
|
|
||||||
// A CancelFunc does not wait for the work to stop.
|
|
||||||
// After the first call, subsequent calls to a CancelFunc do nothing.
|
|
||||||
type CancelFunc func()
|
|
11
vendor/modules.txt
vendored
11
vendor/modules.txt
vendored
@ -246,12 +246,12 @@ github.com/google/uuid
|
|||||||
# github.com/gorilla/websocket v1.5.0
|
# github.com/gorilla/websocket v1.5.0
|
||||||
## explicit; go 1.12
|
## explicit; go 1.12
|
||||||
github.com/gorilla/websocket
|
github.com/gorilla/websocket
|
||||||
# github.com/grpc-ecosystem/go-grpc-middleware v1.4.0
|
# github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus v1.0.0
|
||||||
|
## explicit; go 1.19
|
||||||
|
github.com/grpc-ecosystem/go-grpc-middleware/providers/prometheus
|
||||||
|
# github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.0.0-rc.3
|
||||||
## explicit; go 1.14
|
## explicit; go 1.14
|
||||||
github.com/grpc-ecosystem/go-grpc-middleware
|
github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors
|
||||||
# github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0
|
|
||||||
## explicit
|
|
||||||
github.com/grpc-ecosystem/go-grpc-prometheus
|
|
||||||
# github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0
|
# github.com/grpc-ecosystem/grpc-gateway/v2 v2.19.0
|
||||||
## explicit; go 1.19
|
## explicit; go 1.19
|
||||||
github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule
|
github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule
|
||||||
@ -488,7 +488,6 @@ golang.org/x/exp/slices
|
|||||||
golang.org/x/mod/semver
|
golang.org/x/mod/semver
|
||||||
# golang.org/x/net v0.20.0
|
# golang.org/x/net v0.20.0
|
||||||
## explicit; go 1.18
|
## explicit; go 1.18
|
||||||
golang.org/x/net/context
|
|
||||||
golang.org/x/net/html
|
golang.org/x/net/html
|
||||||
golang.org/x/net/html/atom
|
golang.org/x/net/html/atom
|
||||||
golang.org/x/net/http/httpguts
|
golang.org/x/net/http/httpguts
|
||||||
|
Loading…
Reference in New Issue
Block a user