Add latency stats in new stat summary endpoint (#737)

The new StatSummary endpoint was only providing request volume and
successs rate information.

Add support for retrieving latency stats via StatSummary. Also make
all prometheus calls in parallel, and implement kubernetes test
fixtures.

Fixes #681

Signed-off-by: Andrew Seigner <siggy@buoyant.io>
This commit is contained in:
Andrew Seigner 2018-04-11 11:58:32 -07:00 committed by GitHub
parent e1e1b6b599
commit 259fdcd134
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
10 changed files with 276 additions and 105 deletions

2
Gopkg.lock generated
View File

@ -746,6 +746,6 @@
[solve-meta]
analyzer-name = "dep"
analyzer-version = 1
inputs-digest = "24bea55844bef399aefb2624f12dc240050dd0757d3ff99b7ae07642432b7e0d"
inputs-digest = "fcb8abf65ef829da5c65b12728673c4c60aadcc2ae4037874e24943ab3a2db89"
solver-name = "gps-cdcl"
solver-version = 1

View File

@ -1,5 +1,5 @@
## compile binaries
FROM gcr.io/runconduit/go-deps:787ece88 as golang
FROM gcr.io/runconduit/go-deps:bccd0b8c as golang
ARG CONDUIT_VERSION
WORKDIR /go/src/github.com/runconduit/conduit
COPY cli cli

View File

@ -110,8 +110,9 @@ type summaryRow struct {
meshed string
requestRate float64
successRate float64
latencyP50 int64
latencyP99 int64
latencyP50 uint64
latencyP95 uint64
latencyP99 uint64
}
func writeStatTableToBuffer(resp *pb.StatSummaryResponse, w *tabwriter.Writer) {
@ -136,6 +137,9 @@ func writeStatTableToBuffer(resp *pb.StatSummaryResponse, w *tabwriter.Writer) {
meshed: fmt.Sprintf("%d/%d", r.MeshedPodCount, r.TotalPodCount),
requestRate: getRequestRate(*r),
successRate: getSuccessRate(*r),
latencyP50: r.Stats.LatencyMsP50,
latencyP95: r.Stats.LatencyMsP95,
latencyP99: r.Stats.LatencyMsP99,
}
}
}
@ -143,22 +147,24 @@ func writeStatTableToBuffer(resp *pb.StatSummaryResponse, w *tabwriter.Writer) {
fmt.Fprintln(w, strings.Join([]string{
nameHeader + strings.Repeat(" ", maxNameLength-len(nameHeader)),
"MESHED",
"IN_RPS",
"IN_SUCCESS",
"IN_LATENCY_P50",
"IN_LATENCY_P99\t", // trailing \t is required to format last column
"SUCCESS",
"RPS",
"LATENCY_P50",
"LATENCY_P95",
"LATENCY_P99\t", // trailing \t is required to format last column
}, "\t"))
sortedNames := sortStatSummaryKeys(stats)
for _, name := range sortedNames {
fmt.Fprintf(
w,
"%s\t%s\t%.1frps\t%.2f%%\t%dms\t%dms\t\n",
"%s\t%s\t%.1frps\t%.2f%%\t%dms\t%dms\t%dms\t\n",
name+strings.Repeat(" ", maxNameLength-len(name)),
stats[name].meshed,
stats[name].requestRate,
stats[name].successRate*100,
stats[name].requestRate,
stats[name].latencyP50,
stats[name].latencyP95,
stats[name].latencyP99,
)
}

View File

@ -1,5 +1,5 @@
## compile controller services
FROM gcr.io/runconduit/go-deps:787ece88 as golang
FROM gcr.io/runconduit/go-deps:bccd0b8c as golang
ARG CONDUIT_VERSION
WORKDIR /go/src/github.com/runconduit/conduit
COPY controller/gen controller/gen

View File

@ -4,6 +4,7 @@ import (
"context"
"errors"
"fmt"
"math"
"strings"
"time"
@ -18,11 +19,26 @@ import (
"k8s.io/apimachinery/pkg/runtime"
)
type promType string
type promResult struct {
prom promType
vec model.Vector
err error
}
const (
reqQuery = "sum(increase(response_total{%s}[%s])) by (%s, classification)"
reqQuery = "sum(increase(response_total{%s}[%s])) by (%s, classification)"
latencyQuantileQuery = "histogram_quantile(%s, sum(irate(response_latency_ms_bucket{%s}[%s])) by (le, %s))"
promRequests = promType("QUERY_REQUESTS")
promLatencyP50 = promType("0.5")
promLatencyP95 = promType("0.95")
promLatencyP99 = promType("0.99")
)
var (
promTypes = []promType{promRequests, promLatencyP50, promLatencyP95, promLatencyP99}
k8sResourceTypesToPromLabels = map[string]model.LabelName{
k8s.KubernetesDeployments: "deployment",
}
@ -166,33 +182,83 @@ func buildRequestLabels(req *pb.StatSummaryRequest) string {
}
func (s *grpcServer) getRequests(ctx context.Context, reqLabels string, groupBy string, timeWindow string) (map[string]*pb.BasicStats, error) {
requestsQuery := fmt.Sprintf(reqQuery, reqLabels, timeWindow, groupBy)
resultChan := make(chan promResult)
resultVector, err := s.queryProm(ctx, requestsQuery)
// kick off 4 asynchronous queries: 1 request volume + 3 latency
go func() {
requestsQuery := fmt.Sprintf(reqQuery, reqLabels, timeWindow, groupBy)
resultVector, err := s.queryProm(ctx, requestsQuery)
resultChan <- promResult{
prom: promRequests,
vec: resultVector,
err: err,
}
}()
for _, quantile := range []promType{promLatencyP50, promLatencyP95, promLatencyP99} {
go func(quantile promType) {
latencyQuery := fmt.Sprintf(latencyQuantileQuery, quantile, reqLabels, timeWindow, groupBy)
latencyResult, err := s.queryProm(ctx, latencyQuery)
resultChan <- promResult{
prom: quantile,
vec: latencyResult,
err: err,
}
}(quantile)
}
// process results, receive one message per prometheus query type
var err error
results := []promResult{}
for i := 0; i < len(promTypes); i++ {
result := <-resultChan
if result.err != nil {
log.Errorf("queryProm failed with: %s", err)
err = result.err
} else {
results = append(results, result)
}
}
if err != nil {
return nil, err
}
return processRequests(resultVector, groupBy), nil
return processRequests(results, groupBy), nil
}
func processRequests(vec model.Vector, labelSelector string) map[string]*pb.BasicStats {
result := make(map[string]*pb.BasicStats)
func processRequests(results []promResult, labelSelector string) map[string]*pb.BasicStats {
basicStats := make(map[string]*pb.BasicStats)
for _, sample := range vec {
label := string(sample.Metric[model.LabelName(labelSelector)])
if result[label] == nil {
result[label] = &pb.BasicStats{}
}
for _, result := range results {
for _, sample := range result.vec {
label := string(sample.Metric[model.LabelName(labelSelector)])
if basicStats[label] == nil {
basicStats[label] = &pb.BasicStats{}
}
switch string(sample.Metric[model.LabelName("classification")]) {
case "success":
result[label].SuccessCount = uint64(sample.Value)
case "failure":
result[label].FailureCount = uint64(sample.Value)
value := uint64(math.Round(float64(sample.Value)))
switch result.prom {
case promRequests:
switch string(sample.Metric[model.LabelName("classification")]) {
case "success":
basicStats[label].SuccessCount = value
case "failure":
basicStats[label].FailureCount = value
}
case promLatencyP50:
basicStats[label].LatencyMsP50 = value
case promLatencyP95:
basicStats[label].LatencyMsP95 = value
case promLatencyP99:
basicStats[label].LatencyMsP99 = value
}
}
}
return result
return basicStats
}
func (s *grpcServer) getDeployment(namespace string, name string) ([]*appsv1.Deployment, map[string]*meshedCount, error) {

View File

@ -11,42 +11,76 @@ import (
tap "github.com/runconduit/conduit/controller/gen/controller/tap"
pb "github.com/runconduit/conduit/controller/gen/public"
"github.com/runconduit/conduit/pkg/k8s"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes/fake"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/tools/cache"
)
type statSumExpected struct {
err error
k8sRes []string
promRes model.Value
req pb.StatSummaryRequest
res pb.StatSummaryResponse
}
var (
clientSet = fake.NewSimpleClientset()
sharedInformers = informers.NewSharedInformerFactory(clientSet, 10*time.Minute)
fakeGrpcServer = newGrpcServer(
&MockProm{},
&mockTelemetry{},
tap.NewTapClient(nil),
sharedInformers.Apps().V1().Deployments().Lister(),
sharedInformers.Core().V1().Pods().Lister(),
"conduit",
)
)
func TestStatSummary(t *testing.T) {
t.Run("Successfully performs a query based on resource type", func(t *testing.T) {
expectations := []statSumExpected{
statSumExpected{
err: nil,
promRes: model.Value(model.Vector{}),
err: nil,
k8sRes: []string{`
apiVersion: apps/v1
kind: Deployment
metadata:
name: emoji
namespace: emojivoto
spec:
selector:
matchLabels:
app: emoji-svc
strategy: {}
template:
spec:
containers:
- image: buoyantio/emojivoto-emoji-svc:v3
`, `
apiVersion: v1
kind: Pod
metadata:
name: emojivoto-meshed
namespace: emojivoto
labels:
app: emoji-svc
annotations:
conduit.io/proxy-version: testinjectversion
`, `
apiVersion: v1
kind: Pod
metadata:
name: emojivoto-not-meshed
namespace: emojivoto
labels:
app: emoji-svc
`,
},
promRes: model.Vector{
&model.Sample{
Metric: model.Metric{"deployment": "emoji", "classification": "success"},
Value: 123,
Timestamp: 456,
},
},
req: pb.StatSummaryRequest{
Selector: &pb.ResourceSelection{
Resource: &pb.Resource{
Type: k8s.KubernetesDeployments,
Namespace: "emojivoto",
Type: k8s.KubernetesDeployments,
},
},
TimeWindow: pb.TimeWindow_ONE_MIN,
},
res: pb.StatSummaryResponse{
Response: &pb.StatSummaryResponse_Ok_{ // https://github.com/golang/protobuf/issues/205
@ -55,7 +89,25 @@ func TestStatSummary(t *testing.T) {
&pb.StatTable{
Table: &pb.StatTable_PodGroup_{
PodGroup: &pb.StatTable_PodGroup{
Rows: []*pb.StatTable_PodGroup_Row{},
Rows: []*pb.StatTable_PodGroup_Row{
&pb.StatTable_PodGroup_Row{
Resource: &pb.Resource{
Namespace: "emojivoto",
Type: "deployments",
Name: "emoji",
},
Stats: &pb.BasicStats{
SuccessCount: 123,
FailureCount: 0,
LatencyMsP50: 123,
LatencyMsP95: 123,
LatencyMsP99: 123,
},
TimeWindow: pb.TimeWindow_ONE_MIN,
MeshedPodCount: 1,
TotalPodCount: 2,
},
},
},
},
},
@ -67,7 +119,35 @@ func TestStatSummary(t *testing.T) {
}
for _, exp := range expectations {
fakeGrpcServer.prometheusAPI.(*MockProm).Res = exp.promRes
k8sObjs := []runtime.Object{}
for _, res := range exp.k8sRes {
decode := scheme.Codecs.UniversalDeserializer().Decode
obj, _, err := decode([]byte(res), nil, nil)
if err != nil {
t.Fatalf("could not decode yml: %s", err)
}
k8sObjs = append(k8sObjs, obj)
}
clientSet := fake.NewSimpleClientset(k8sObjs...)
sharedInformers := informers.NewSharedInformerFactory(clientSet, 10*time.Minute)
deployInformer := sharedInformers.Apps().V1().Deployments()
podInformer := sharedInformers.Core().V1().Pods()
fakeGrpcServer := newGrpcServer(
&MockProm{Res: exp.promRes},
&mockTelemetry{},
tap.NewTapClient(nil),
deployInformer.Lister(),
podInformer.Lister(),
"conduit",
)
stopCh := make(chan struct{})
sharedInformers.Start(stopCh)
if !cache.WaitForCacheSync(stopCh, deployInformer.Informer().HasSynced, podInformer.Informer().HasSynced) {
t.Fatalf("timed out wait for caches to sync")
}
rsp, err := fakeGrpcServer.StatSummary(context.TODO(), &exp.req)
if err != exp.err {
@ -115,7 +195,16 @@ func TestStatSummary(t *testing.T) {
}
for _, exp := range expectations {
fakeGrpcServer.prometheusAPI.(*MockProm).Res = exp.promRes
clientSet := fake.NewSimpleClientset()
sharedInformers := informers.NewSharedInformerFactory(clientSet, 10*time.Minute)
fakeGrpcServer := newGrpcServer(
&MockProm{Res: exp.promRes},
&mockTelemetry{},
tap.NewTapClient(nil),
sharedInformers.Apps().V1().Deployments().Lister(),
sharedInformers.Core().V1().Pods().Lister(),
"conduit",
)
_, err := fakeGrpcServer.StatSummary(context.TODO(), &exp.req)
if err != nil || exp.err != nil {

View File

@ -1205,7 +1205,8 @@ type BasicStats struct {
SuccessCount uint64 `protobuf:"varint,1,opt,name=success_count,json=successCount" json:"success_count,omitempty"`
FailureCount uint64 `protobuf:"varint,2,opt,name=failure_count,json=failureCount" json:"failure_count,omitempty"`
LatencyMsP50 uint64 `protobuf:"varint,3,opt,name=latency_ms_p50,json=latencyMsP50" json:"latency_ms_p50,omitempty"`
LatencyMsP90 uint64 `protobuf:"varint,4,opt,name=latency_ms_p90,json=latencyMsP90" json:"latency_ms_p90,omitempty"`
LatencyMsP95 uint64 `protobuf:"varint,4,opt,name=latency_ms_p95,json=latencyMsP95" json:"latency_ms_p95,omitempty"`
LatencyMsP99 uint64 `protobuf:"varint,5,opt,name=latency_ms_p99,json=latencyMsP99" json:"latency_ms_p99,omitempty"`
}
func (m *BasicStats) Reset() { *m = BasicStats{} }
@ -1234,9 +1235,16 @@ func (m *BasicStats) GetLatencyMsP50() uint64 {
return 0
}
func (m *BasicStats) GetLatencyMsP90() uint64 {
func (m *BasicStats) GetLatencyMsP95() uint64 {
if m != nil {
return m.LatencyMsP90
return m.LatencyMsP95
}
return 0
}
func (m *BasicStats) GetLatencyMsP99() uint64 {
if m != nil {
return m.LatencyMsP99
}
return 0
}
@ -1692,13 +1700,13 @@ var _Api_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("public/api.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 1689 bytes of a gzipped FileDescriptorProto
// 1697 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x57, 0xcd, 0x73, 0x23, 0x47,
0x15, 0xd7, 0x8c, 0x64, 0x4b, 0x7a, 0xb2, 0x6c, 0x6d, 0x6f, 0x48, 0x29, 0x22, 0x59, 0x9c, 0x49,
0x58, 0x5c, 0x0b, 0x68, 0x8d, 0x59, 0xa7, 0xf0, 0xa6, 0xb6, 0x82, 0x2c, 0x2b, 0x2b, 0x57, 0xf9,
0x43, 0xb4, 0xb4, 0x21, 0x29, 0xa8, 0x52, 0xb5, 0x67, 0xda, 0xd2, 0xe0, 0x99, 0xe9, 0xc9, 0x74,
0xcf, 0x1a, 0x71, 0xe7, 0xca, 0x99, 0x1b, 0x55, 0x1c, 0xf8, 0x27, 0x38, 0xf3, 0x1f, 0xc0, 0x91,
0xff, 0x84, 0x03, 0xd5, 0x1f, 0x33, 0xfa, 0x58, 0x79, 0xe3, 0xda, 0x9c, 0xd4, 0xfd, 0xeb, 0xdf,
0xcf, 0x1a, 0x71, 0xe7, 0xca, 0x99, 0x1b, 0x37, 0xfe, 0x09, 0xce, 0x54, 0xf1, 0x07, 0xc0, 0x91,
0xff, 0x84, 0x03, 0xd5, 0x1f, 0x33, 0xfa, 0xb0, 0xbc, 0xd9, 0xda, 0x9c, 0xd4, 0xfd, 0xeb, 0xdf,
0x7b, 0xfd, 0xbe, 0xfa, 0xe9, 0x0d, 0x34, 0xe2, 0xf4, 0x2a, 0xf0, 0xdd, 0xa7, 0x24, 0xf6, 0xdb,
0x71, 0xc2, 0x04, 0x43, 0xdb, 0x2e, 0x8b, 0xbc, 0xd4, 0x17, 0x6d, 0x7d, 0xd2, 0x7a, 0x34, 0x61,
0x6c, 0x12, 0xd0, 0xa7, 0xea, 0xf4, 0x2a, 0xbd, 0x7e, 0xea, 0xa5, 0x09, 0x11, 0x3e, 0x8b, 0x34,
@ -1707,14 +1715,14 @@ var fileDescriptor0 = []byte{
0x36, 0x49, 0x48, 0xf8, 0x15, 0x09, 0x52, 0x8a, 0x9e, 0xc1, 0x46, 0x40, 0xae, 0x68, 0xd0, 0xb4,
0x76, 0xad, 0xbd, 0xed, 0x83, 0x47, 0xed, 0x65, 0x63, 0xda, 0x39, 0xfd, 0x4c, 0xb2, 0xb0, 0x26,
0xa3, 0xf7, 0x60, 0xe3, 0xb5, 0x14, 0x6f, 0xda, 0xbb, 0xd6, 0x5e, 0x11, 0xeb, 0x8d, 0xd3, 0x85,
0x6a, 0x4e, 0x47, 0x9f, 0xc1, 0xa6, 0x42, 0x79, 0xd3, 0xda, 0x2d, 0xee, 0xd5, 0xde, 0xa2, 0x59,
0x6a, 0x4e, 0x47, 0x9f, 0xc1, 0xa6, 0x42, 0x79, 0xd3, 0xda, 0x2d, 0xee, 0xd5, 0xde, 0xa0, 0x59,
0x19, 0x82, 0x0d, 0xdb, 0xf9, 0xb3, 0x05, 0xb5, 0x73, 0x2a, 0x12, 0xdf, 0xd5, 0x06, 0xb6, 0xa0,
0xec, 0xb2, 0x34, 0x12, 0x34, 0x51, 0x26, 0x16, 0xfb, 0x05, 0x9c, 0x01, 0xe8, 0x7d, 0xd8, 0x98,
0x90, 0x74, 0xa2, 0xcd, 0xb0, 0xfa, 0x05, 0xac, 0xb7, 0xe8, 0x08, 0xaa, 0xd3, 0x4c, 0x7b, 0xb3,
0xb8, 0x6b, 0xed, 0xd5, 0x0e, 0x3e, 0xb8, 0xf3, 0xfa, 0x7e, 0x01, 0xcf, 0xd9, 0xc7, 0x65, 0xe3,
0xb8, 0x6b, 0xed, 0xd5, 0x0e, 0x3e, 0xb8, 0xf7, 0xfa, 0x7e, 0x01, 0xcf, 0xd9, 0xc7, 0x65, 0xe3,
0x99, 0x33, 0x81, 0x1d, 0x6d, 0xc6, 0x09, 0x11, 0x24, 0x66, 0x7e, 0x24, 0xd0, 0x2f, 0x32, 0xaf,
0x2d, 0xa5, 0xf2, 0x87, 0xab, 0x2a, 0x17, 0xcc, 0x36, 0x21, 0x41, 0x1f, 0xc3, 0x96, 0xf0, 0x43,
0xca, 0x05, 0x09, 0xe3, 0x71, 0xc8, 0x4d, 0xbc, 0x6a, 0x39, 0x76, 0xce, 0x9d, 0x7f, 0x5a, 0xb0,
0xca, 0x05, 0x09, 0xe3, 0x71, 0xc8, 0x4d, 0xbc, 0x6a, 0x39, 0x76, 0xce, 0x9d, 0x7f, 0x58, 0xb0,
0xa5, 0x25, 0x87, 0x34, 0xf1, 0x29, 0x47, 0x6d, 0x28, 0x45, 0x24, 0xa4, 0x26, 0x23, 0xad, 0xf5,
0xb7, 0x5c, 0x90, 0x90, 0x62, 0xc5, 0x43, 0xcf, 0xa1, 0x12, 0x52, 0x41, 0x3c, 0x22, 0x88, 0xd2,
0xbf, 0x26, 0xd6, 0x5a, 0xe6, 0xdc, 0xb0, 0x70, 0xce, 0x47, 0x5f, 0x00, 0x78, 0x99, 0x7f, 0xbc,
@ -1724,10 +1732,10 @@ var fileDescriptor0 = []byte{
0xba, 0x2c, 0x8c, 0x59, 0x44, 0x23, 0xa1, 0x92, 0x58, 0xc5, 0x73, 0xc0, 0xe9, 0x67, 0xf7, 0x62,
0xca, 0x63, 0x16, 0x71, 0x8a, 0x3e, 0x83, 0x72, 0xa8, 0x90, 0xac, 0xe2, 0x3e, 0x5c, 0xef, 0x87,
0x8e, 0x32, 0xce, 0xc8, 0xce, 0x5f, 0x6c, 0xa8, 0x67, 0xaa, 0xbe, 0x4d, 0x29, 0x17, 0xe8, 0xd9,
0xb2, 0xa6, 0xb7, 0xe7, 0x20, 0xa3, 0xa2, 0x03, 0xd8, 0xbc, 0xf5, 0x23, 0x8f, 0xdd, 0x2a, 0x6f,
0xb2, 0xa6, 0x37, 0xe7, 0x20, 0xa3, 0xa2, 0x03, 0xd8, 0xbc, 0xf5, 0x23, 0x8f, 0xdd, 0x2a, 0x6f,
0xd6, 0x08, 0x8d, 0xfc, 0x90, 0xfe, 0x56, 0x31, 0xb0, 0x61, 0xa2, 0x23, 0x28, 0x4f, 0x12, 0x96,
0xc6, 0xc7, 0x33, 0xe5, 0xe1, 0xf6, 0x9b, 0xb1, 0xef, 0x4c, 0x26, 0x09, 0x9d, 0xa8, 0xe7, 0x3f,
0x9a, 0xc5, 0x14, 0x67, 0x7c, 0x99, 0xf5, 0x6b, 0x3f, 0x10, 0x34, 0x39, 0x9e, 0x35, 0x4b, 0xf7,
0xc6, 0xc7, 0x33, 0xe5, 0xe1, 0xf6, 0xdd, 0xd8, 0x77, 0x26, 0x93, 0x84, 0x4e, 0xd4, 0xf3, 0x1f,
0xcd, 0x62, 0x8a, 0x33, 0xbe, 0xcc, 0xfa, 0xb5, 0x1f, 0x08, 0x9a, 0x1c, 0xcf, 0x9a, 0xa5, 0xb7,
0xcb, 0x7a, 0xc6, 0x97, 0xa1, 0xe5, 0x69, 0x18, 0x92, 0xc4, 0xff, 0x13, 0x6d, 0x6e, 0xec, 0x5a,
0x7b, 0x15, 0x3c, 0x07, 0x9c, 0x32, 0x6c, 0xf4, 0xc2, 0x58, 0xcc, 0x9c, 0x6f, 0xa1, 0xf6, 0x15,
0x4d, 0xb8, 0xcf, 0xa2, 0xd3, 0xe8, 0x9a, 0x49, 0xa9, 0x09, 0x33, 0x80, 0xc9, 0xea, 0x1c, 0x90,
@ -1741,7 +1749,7 @@ var fileDescriptor0 = []byte{
0xe9, 0x19, 0xe1, 0x02, 0xd3, 0x98, 0x25, 0xa2, 0xb9, 0x69, 0x9a, 0x8f, 0x6e, 0xe9, 0xed, 0xac,
0xa5, 0xb7, 0x4f, 0x4c, 0x4b, 0xc7, 0xab, 0x12, 0x68, 0x1f, 0x1e, 0xba, 0x2c, 0x12, 0x09, 0x0b,
0x02, 0x9a, 0xc8, 0x0a, 0xe3, 0x31, 0x71, 0x69, 0xb3, 0xac, 0xee, 0x5f, 0x77, 0x24, 0x1f, 0x93,
0x81, 0x07, 0x01, 0x89, 0x68, 0xb3, 0xa2, 0x6c, 0x5a, 0xc2, 0x9c, 0x7f, 0xd8, 0x00, 0x23, 0x12,
0x81, 0x07, 0x01, 0x89, 0x68, 0xb3, 0xa2, 0x6c, 0x5a, 0xc2, 0x9c, 0xbf, 0xdb, 0x00, 0x23, 0x12,
0x67, 0x15, 0x8e, 0xa0, 0x18, 0x33, 0x4f, 0x07, 0xa8, 0x5f, 0xc0, 0x72, 0x83, 0x76, 0x97, 0x62,
0x61, 0x9b, 0xa3, 0x95, 0x68, 0x84, 0xe4, 0x8f, 0x38, 0xe6, 0x2a, 0x52, 0x36, 0x36, 0x3b, 0x89,
0x0b, 0x36, 0x90, 0xee, 0xca, 0x28, 0xd5, 0xb1, 0xd9, 0xc9, 0x3c, 0x08, 0x76, 0x3a, 0x50, 0x41,
@ -1757,46 +1765,47 @@ var fileDescriptor0 = []byte{
0x44, 0x3f, 0x86, 0x6d, 0xf5, 0x0f, 0x3d, 0xe6, 0x4a, 0x11, 0x4b, 0xcc, 0xe5, 0x75, 0x85, 0x0e,
0x0d, 0xe8, 0xfc, 0x0e, 0xea, 0x99, 0xb0, 0x76, 0xf5, 0xdd, 0x6e, 0xcb, 0x03, 0x64, 0x2f, 0x06,
0xe8, 0x3f, 0x36, 0xa0, 0xa1, 0x20, 0x62, 0xa8, 0x3a, 0xca, 0x2c, 0xab, 0xb9, 0x17, 0x50, 0xc9,
0x8d, 0xd2, 0x57, 0x7c, 0x7c, 0xd7, 0x15, 0x79, 0x14, 0x70, 0x2e, 0x82, 0x3e, 0x07, 0xf5, 0xaf,
0x39, 0xbe, 0x77, 0x8f, 0x05, 0x91, 0xaf, 0xd1, 0x4f, 0xa1, 0x14, 0xb1, 0x88, 0x9a, 0x59, 0xe0,
0x07, 0xab, 0x52, 0xaa, 0xdd, 0xf5, 0x0b, 0x58, 0x91, 0xd0, 0x31, 0xec, 0xb0, 0x54, 0x8c, 0x05,
0x1b, 0xe7, 0x21, 0x29, 0xbd, 0x3d, 0x24, 0xfd, 0x02, 0xae, 0xb3, 0x54, 0x8c, 0x58, 0x5e, 0x18,
0x5f, 0xc2, 0x03, 0xa9, 0x43, 0x16, 0xf0, 0x5c, 0xcb, 0xc6, 0x77, 0x6a, 0x91, 0x17, 0x7f, 0x99,
0xb0, 0x30, 0x83, 0x8e, 0x01, 0x2a, 0x2c, 0x15, 0x57, 0x2c, 0x8d, 0x3c, 0xe7, 0xdf, 0x16, 0x3c,
0x5c, 0x8a, 0xab, 0xe9, 0x8f, 0xbf, 0x02, 0x9b, 0xdd, 0x98, 0x90, 0x3e, 0x5e, 0x55, 0xbe, 0x46,
0xa0, 0x7d, 0x79, 0xd3, 0x2f, 0x60, 0x9b, 0xdd, 0xa0, 0xc3, 0xc5, 0xfc, 0xd5, 0x0e, 0x3e, 0xba,
0xcb, 0x32, 0x55, 0x23, 0x72, 0xbc, 0x52, 0xec, 0xd6, 0xaf, 0xc1, 0xbe, 0xbc, 0x41, 0xcf, 0xa1,
0x26, 0xbb, 0xe1, 0x58, 0x90, 0xab, 0x20, 0x9f, 0xf2, 0x3e, 0x58, 0x77, 0xff, 0x48, 0x32, 0x30,
0xf0, 0x6c, 0xc9, 0xa5, 0x5b, 0x89, 0xb1, 0xc6, 0xf9, 0xbb, 0x05, 0x70, 0x4c, 0xb8, 0xef, 0x4a,
0x2a, 0x47, 0x9f, 0x40, 0x9d, 0xa7, 0xae, 0x4b, 0x39, 0x1f, 0xab, 0x31, 0x4f, 0x39, 0x56, 0xc2,
0x5b, 0x06, 0xec, 0x4a, 0x4c, 0x92, 0xae, 0x89, 0x1f, 0xa4, 0x09, 0x35, 0x24, 0x5b, 0x93, 0x0c,
0xa8, 0x49, 0x9f, 0xca, 0xb7, 0x20, 0x68, 0xe4, 0xce, 0xc6, 0x21, 0x1f, 0xc7, 0x87, 0xfb, 0x2a,
0xfd, 0x25, 0xbc, 0x65, 0xd0, 0x73, 0x3e, 0x38, 0xdc, 0x5f, 0x65, 0x1d, 0xed, 0xab, 0x64, 0x2f,
0xb1, 0x8e, 0xf6, 0x9d, 0xbf, 0x15, 0xa1, 0x9a, 0xbb, 0x82, 0x3a, 0x50, 0x8d, 0x99, 0x37, 0x56,
0x7f, 0xc5, 0x26, 0xf0, 0xce, 0x9d, 0x8e, 0xcb, 0x3f, 0xa8, 0x97, 0x92, 0xd9, 0x2f, 0xe0, 0x4a,
0x6c, 0xd6, 0xad, 0x7f, 0xd9, 0x50, 0xc9, 0x0e, 0xd0, 0x73, 0x28, 0x25, 0xec, 0x36, 0x8b, 0xe1,
0xe3, 0xef, 0x56, 0xd5, 0xc6, 0xec, 0x16, 0x2b, 0x99, 0xd6, 0xff, 0x2c, 0x28, 0x62, 0x76, 0xfb,
0x8e, 0x2f, 0xf8, 0x7b, 0xbd, 0xaa, 0x3d, 0x68, 0x84, 0x94, 0x4f, 0xa9, 0x37, 0x96, 0xd1, 0xd0,
0x89, 0xd0, 0x21, 0xde, 0xd6, 0xf8, 0x80, 0x79, 0x3a, 0x15, 0x8f, 0x61, 0x47, 0x30, 0x41, 0x82,
0x05, 0xa2, 0x8e, 0x72, 0x5d, 0xc1, 0x39, 0x6f, 0x1f, 0x36, 0x64, 0x95, 0x70, 0xf3, 0x54, 0xde,
0x30, 0x64, 0x5e, 0x27, 0x58, 0x13, 0xe5, 0xbc, 0xae, 0x0a, 0xf0, 0xc9, 0x0b, 0x80, 0xf9, 0x54,
0x86, 0x1a, 0xb0, 0x85, 0x7b, 0xbf, 0x79, 0xd5, 0x1b, 0x8e, 0xc6, 0xb8, 0x33, 0xea, 0x35, 0x0a,
0xa8, 0x06, 0xe5, 0xb3, 0xce, 0xa8, 0x77, 0xd1, 0xfd, 0xa6, 0x61, 0xc9, 0xe3, 0xe1, 0xab, 0x6e,
0xb7, 0x37, 0x1c, 0xea, 0x63, 0xfb, 0x49, 0x07, 0x60, 0xee, 0xa5, 0x24, 0x8f, 0x7a, 0x17, 0xe3,
0x61, 0xaf, 0xab, 0x25, 0x2f, 0x2f, 0x7a, 0xe3, 0xf3, 0xd3, 0x8b, 0x86, 0x95, 0x9d, 0xc8, 0x8d,
0x8d, 0xb6, 0xa0, 0x22, 0x4f, 0xfa, 0x97, 0xaf, 0x70, 0xa3, 0xf8, 0xa4, 0x03, 0x3b, 0x2b, 0xd3,
0x1a, 0x7a, 0x00, 0xf5, 0x51, 0x07, 0xbf, 0xec, 0x8d, 0xc6, 0x27, 0xbd, 0xc1, 0xd9, 0xe5, 0x37,
0x8d, 0x82, 0x84, 0x86, 0x97, 0xaf, 0x70, 0xb7, 0x97, 0x41, 0x16, 0xaa, 0x40, 0xe9, 0xbc, 0x37,
0xec, 0x37, 0xec, 0x27, 0x2f, 0x16, 0xbe, 0xcf, 0xd4, 0x07, 0x17, 0x2a, 0x43, 0x51, 0xde, 0x55,
0x90, 0x8b, 0xc1, 0xe1, 0x7e, 0xc3, 0x52, 0x8b, 0xa3, 0xc3, 0x86, 0xad, 0x17, 0x47, 0x8d, 0xa2,
0xe2, 0x74, 0xbe, 0x6e, 0x94, 0x0e, 0xfe, 0x5b, 0x84, 0x62, 0x27, 0xf6, 0xd1, 0x4b, 0x28, 0xc9,
0x20, 0xa1, 0x8f, 0xd6, 0x4f, 0x84, 0xa6, 0x23, 0xb7, 0x1e, 0xdd, 0x75, 0x6c, 0x5e, 0x66, 0x01,
0x7d, 0x0d, 0xb5, 0x85, 0x06, 0x82, 0x9c, 0xb7, 0x76, 0x17, 0xad, 0xf4, 0x93, 0x7b, 0x74, 0x20,
0xa7, 0x80, 0xbe, 0x80, 0x72, 0x36, 0x39, 0xae, 0x6f, 0xc7, 0xad, 0x37, 0x3e, 0xaf, 0x16, 0x66,
0x51, 0xa7, 0x80, 0x7a, 0x50, 0xc9, 0x26, 0xc5, 0xbb, 0x34, 0xec, 0xae, 0xc2, 0xab, 0xa3, 0xa5,
0x53, 0x40, 0x7f, 0x80, 0xea, 0x90, 0x06, 0xd7, 0x5d, 0xf9, 0x91, 0x8c, 0x7e, 0x96, 0x0b, 0x98,
0x6f, 0xeb, 0xc5, 0x2f, 0xe8, 0x9c, 0x96, 0x79, 0xfa, 0xf3, 0x7b, 0xb2, 0x17, 0x7c, 0x2e, 0x8e,
0x48, 0x8c, 0xde, 0x7c, 0x5e, 0xf9, 0x60, 0xd6, 0x6a, 0xae, 0xea, 0x1c, 0x91, 0xb8, 0xf7, 0x5a,
0x7e, 0xf0, 0x14, 0xf6, 0xad, 0xab, 0x4d, 0x35, 0x3f, 0xfe, 0xf2, 0xff, 0x01, 0x00, 0x00, 0xff,
0xff, 0x5f, 0x59, 0x17, 0x25, 0x44, 0x10, 0x00, 0x00,
0x8d, 0xd2, 0x57, 0x7c, 0x7c, 0xdf, 0x15, 0x79, 0x14, 0x70, 0x2e, 0x82, 0x3e, 0x07, 0xf5, 0xaf,
0x39, 0x7e, 0xeb, 0x1e, 0x0b, 0x22, 0x5f, 0xa3, 0x9f, 0x42, 0x29, 0x62, 0x11, 0x35, 0xb3, 0xc0,
0x0f, 0x56, 0xa5, 0x54, 0xbb, 0xeb, 0x17, 0xb0, 0x22, 0xa1, 0x63, 0xd8, 0x61, 0xa9, 0x18, 0x0b,
0x36, 0xce, 0x43, 0x52, 0x7a, 0x73, 0x48, 0xfa, 0x05, 0x5c, 0x67, 0xa9, 0x18, 0xb1, 0xbc, 0x30,
0xbe, 0x84, 0x07, 0x52, 0x87, 0x2c, 0xe0, 0xb9, 0x96, 0x8d, 0xef, 0xd4, 0x22, 0x2f, 0xfe, 0x32,
0x61, 0x61, 0x06, 0x1d, 0x03, 0x54, 0x58, 0x2a, 0xae, 0x58, 0x1a, 0x79, 0xce, 0xbf, 0x2d, 0x78,
0xb8, 0x14, 0x57, 0xd3, 0x1f, 0x7f, 0x05, 0x36, 0xbb, 0x31, 0x21, 0x7d, 0xbc, 0xaa, 0x7c, 0x8d,
0x40, 0xfb, 0xf2, 0xa6, 0x5f, 0xc0, 0x36, 0xbb, 0x41, 0x87, 0x8b, 0xf9, 0xab, 0x1d, 0x7c, 0x74,
0x9f, 0x65, 0xaa, 0x46, 0xe4, 0x78, 0xa5, 0xd8, 0xad, 0x5f, 0x83, 0x7d, 0x79, 0x83, 0x9e, 0x43,
0x4d, 0x76, 0xc3, 0xb1, 0x20, 0x57, 0x41, 0x3e, 0xe5, 0x7d, 0xb0, 0xee, 0xfe, 0x91, 0x64, 0x60,
0xe0, 0xd9, 0x92, 0x4b, 0xb7, 0x12, 0x63, 0x8d, 0xf3, 0x2f, 0x0b, 0xe0, 0x98, 0x70, 0xdf, 0x95,
0x54, 0x8e, 0x3e, 0x81, 0x3a, 0x4f, 0x5d, 0x97, 0x72, 0x3e, 0x56, 0x63, 0x9e, 0x72, 0xac, 0x84,
0xb7, 0x0c, 0xd8, 0x95, 0x98, 0x24, 0x5d, 0x13, 0x3f, 0x48, 0x13, 0x6a, 0x48, 0xb6, 0x26, 0x19,
0x50, 0x93, 0x3e, 0x95, 0x6f, 0x41, 0xd0, 0xc8, 0x9d, 0x8d, 0x43, 0x3e, 0x8e, 0x0f, 0xf7, 0x55,
0xfa, 0x4b, 0x78, 0xcb, 0xa0, 0xe7, 0x7c, 0x70, 0xb8, 0xbf, 0xca, 0x3a, 0x3a, 0x54, 0xc9, 0x5e,
0x62, 0x1d, 0x1d, 0xde, 0x61, 0x1d, 0xa9, 0x64, 0x2e, 0xb3, 0x8e, 0x9c, 0xbf, 0x15, 0xa1, 0x9a,
0x3b, 0x8c, 0x3a, 0x50, 0x8d, 0x99, 0x37, 0x56, 0x7f, 0xd8, 0x26, 0x3d, 0xce, 0xbd, 0xe1, 0x91,
0x7f, 0x63, 0x2f, 0x25, 0xb3, 0x5f, 0xc0, 0x95, 0xd8, 0xac, 0x5b, 0xff, 0xb4, 0xa1, 0x92, 0x1d,
0xa0, 0xe7, 0x50, 0x4a, 0xd8, 0x6d, 0x16, 0xe9, 0xc7, 0xdf, 0xad, 0xaa, 0x8d, 0xd9, 0x2d, 0x56,
0x32, 0xad, 0xff, 0x59, 0x50, 0xc4, 0xec, 0xf6, 0x1d, 0xdf, 0xf9, 0xf7, 0x7a, 0x7b, 0x7b, 0xd0,
0x08, 0x29, 0x9f, 0x52, 0x6f, 0x2c, 0xa3, 0xa1, 0xd3, 0xa5, 0x13, 0xb1, 0xad, 0xf1, 0x01, 0xf3,
0x74, 0xc2, 0x1e, 0xc3, 0x8e, 0x60, 0x82, 0x04, 0x0b, 0x44, 0x9d, 0x8b, 0xba, 0x82, 0x73, 0xde,
0x3e, 0x6c, 0xc8, 0x5a, 0xe2, 0xe6, 0x41, 0xdd, 0x31, 0x64, 0x5e, 0x4d, 0x58, 0x13, 0xe5, 0x54,
0xaf, 0xca, 0xf4, 0xc9, 0x0b, 0x80, 0xf9, 0xec, 0x86, 0x1a, 0xb0, 0x85, 0x7b, 0xbf, 0x79, 0xd5,
0x1b, 0x8e, 0xc6, 0xb8, 0x33, 0xea, 0x35, 0x0a, 0xa8, 0x06, 0xe5, 0xb3, 0xce, 0xa8, 0x77, 0xd1,
0xfd, 0xa6, 0x61, 0xc9, 0xe3, 0xe1, 0xab, 0x6e, 0xb7, 0x37, 0x1c, 0xea, 0x63, 0xfb, 0x49, 0x07,
0x60, 0xee, 0xa5, 0x24, 0x8f, 0x7a, 0x17, 0xe3, 0x61, 0xaf, 0xab, 0x25, 0x2f, 0x2f, 0x7a, 0xe3,
0xf3, 0xd3, 0x8b, 0x86, 0x95, 0x9d, 0xc8, 0x8d, 0x8d, 0xb6, 0xa0, 0x22, 0x4f, 0xfa, 0x97, 0xaf,
0x70, 0xa3, 0xf8, 0xa4, 0x03, 0x3b, 0x2b, 0x33, 0x1d, 0x7a, 0x00, 0xf5, 0x51, 0x07, 0xbf, 0xec,
0x8d, 0xc6, 0x27, 0xbd, 0xc1, 0xd9, 0xe5, 0x37, 0x8d, 0x82, 0x84, 0x86, 0x97, 0xaf, 0x70, 0xb7,
0x97, 0x41, 0x16, 0xaa, 0x40, 0xe9, 0xbc, 0x37, 0xec, 0x37, 0xec, 0x27, 0x2f, 0x16, 0xbe, 0xe2,
0xd4, 0x67, 0x19, 0x2a, 0x43, 0x51, 0xde, 0x55, 0x90, 0x8b, 0xc1, 0xe1, 0x7e, 0xc3, 0x52, 0x8b,
0xa3, 0xc3, 0x86, 0xad, 0x17, 0x47, 0x8d, 0xa2, 0xe2, 0x74, 0xbe, 0x6e, 0x94, 0x0e, 0xfe, 0x5b,
0x84, 0x62, 0x27, 0xf6, 0xd1, 0x4b, 0x28, 0xc9, 0x20, 0xa1, 0x8f, 0xd6, 0xcf, 0x8d, 0xa6, 0x6f,
0xb7, 0x1e, 0xdd, 0x77, 0x6c, 0xde, 0x6f, 0x01, 0x7d, 0x0d, 0xb5, 0x85, 0x36, 0x83, 0x9c, 0x37,
0xf6, 0x20, 0xad, 0xf4, 0x93, 0xb7, 0xe8, 0x53, 0x4e, 0x01, 0x7d, 0x01, 0xe5, 0x6c, 0xbe, 0x5c,
0xdf, 0xb4, 0x5b, 0x77, 0x3e, 0xc2, 0x16, 0x26, 0x56, 0xa7, 0x80, 0x7a, 0x50, 0xc9, 0xe6, 0xc9,
0xfb, 0x34, 0xec, 0xae, 0xc2, 0xab, 0x03, 0xa8, 0x53, 0x40, 0x7f, 0x80, 0xea, 0x90, 0x06, 0xd7,
0x5d, 0xf9, 0x29, 0x8d, 0x7e, 0x96, 0x0b, 0x98, 0x2f, 0xf0, 0xc5, 0xef, 0xec, 0x9c, 0x96, 0x79,
0xfa, 0xf3, 0xb7, 0x64, 0x2f, 0xf8, 0x5c, 0x1c, 0x91, 0x18, 0xdd, 0x7d, 0x5e, 0xf9, 0xf8, 0xd6,
0x6a, 0xae, 0xea, 0x1c, 0x91, 0xb8, 0xf7, 0x5a, 0x7e, 0x16, 0x15, 0xf6, 0xad, 0xab, 0x4d, 0x35,
0x65, 0xfe, 0xf2, 0xff, 0x01, 0x00, 0x00, 0xff, 0xff, 0xec, 0x4b, 0xec, 0x2d, 0x6a, 0x10, 0x00,
0x00,
}

View File

@ -166,7 +166,8 @@ message BasicStats {
uint64 success_count = 1;
uint64 failure_count = 2;
uint64 latency_ms_p50 = 3;
uint64 latency_ms_p90 = 4;
uint64 latency_ms_p95 = 4;
uint64 latency_ms_p99 = 5;
}
message StatTable {

View File

@ -1,5 +1,5 @@
## compile proxy-init utility
FROM gcr.io/runconduit/go-deps:787ece88 as golang
FROM gcr.io/runconduit/go-deps:bccd0b8c as golang
WORKDIR /go/src/github.com/runconduit/conduit
COPY ./proxy-init ./proxy-init
RUN CGO_ENABLED=0 GOOS=linux go install -v -installsuffix cgo ./proxy-init/

View File

@ -12,7 +12,7 @@ RUN $HOME/.yarn/bin/yarn install --pure-lockfile
RUN $HOME/.yarn/bin/yarn webpack
## compile go server
FROM gcr.io/runconduit/go-deps:787ece88 as golang
FROM gcr.io/runconduit/go-deps:bccd0b8c as golang
ARG CONDUIT_VERSION
WORKDIR /go/src/github.com/runconduit/conduit
COPY web web