diff --git a/Gopkg.lock b/Gopkg.lock index f43aa6430..94d1e1c7a 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -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 diff --git a/cli/Dockerfile-bin b/cli/Dockerfile-bin index bfb21ceff..de41dbbf5 100644 --- a/cli/Dockerfile-bin +++ b/cli/Dockerfile-bin @@ -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 diff --git a/cli/cmd/stat_summary.go b/cli/cmd/stat_summary.go index ca5b8220d..d07ae793c 100644 --- a/cli/cmd/stat_summary.go +++ b/cli/cmd/stat_summary.go @@ -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, ) } diff --git a/controller/Dockerfile b/controller/Dockerfile index 8131a0c71..643d30fcb 100644 --- a/controller/Dockerfile +++ b/controller/Dockerfile @@ -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 diff --git a/controller/api/public/stat_summary.go b/controller/api/public/stat_summary.go index c1ee7e2ed..1d7cb9191 100644 --- a/controller/api/public/stat_summary.go +++ b/controller/api/public/stat_summary.go @@ -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) { diff --git a/controller/api/public/stat_summary_test.go b/controller/api/public/stat_summary_test.go index bb19aa618..1ba21eb97 100644 --- a/controller/api/public/stat_summary_test.go +++ b/controller/api/public/stat_summary_test.go @@ -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 { diff --git a/controller/gen/public/api.pb.go b/controller/gen/public/api.pb.go index 285e21b73..ad6e9ecc7 100644 --- a/controller/gen/public/api.pb.go +++ b/controller/gen/public/api.pb.go @@ -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, } diff --git a/proto/public/api.proto b/proto/public/api.proto index b97d71a9a..794f8992e 100644 --- a/proto/public/api.proto +++ b/proto/public/api.proto @@ -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 { diff --git a/proxy-init/Dockerfile b/proxy-init/Dockerfile index 57f70242e..f8b6ec931 100644 --- a/proxy-init/Dockerfile +++ b/proxy-init/Dockerfile @@ -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/ diff --git a/web/Dockerfile b/web/Dockerfile index 36ccde204..e3bd75fe4 100644 --- a/web/Dockerfile +++ b/web/Dockerfile @@ -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