From 411bb359b6dac6a1dee3fc43e02e5f13a1fa73b9 Mon Sep 17 00:00:00 2001 From: manasachinta Date: Thu, 28 Dec 2023 15:34:20 -0500 Subject: [PATCH] Added failure list code, tested --- api/types/metric.go | 2 ++ cmd/kperf/commands/runner/runner.go | 5 +++++ metrics/request.go | 15 +++++++++------ metrics/request_test.go | 2 +- request/schedule.go | 5 +++-- tmp/xx.yaml | 17 +++++++++++++++++ 6 files changed, 37 insertions(+), 9 deletions(-) create mode 100644 tmp/xx.yaml diff --git a/api/types/metric.go b/api/types/metric.go index d6eb2c1..a5f91be 100644 --- a/api/types/metric.go +++ b/api/types/metric.go @@ -8,6 +8,8 @@ type ResponseStats struct { Total int // Failures represents number of failure request. Failures int + // List of failures + FailureList []error // Duration means the time of benchmark. Duration time.Duration // PercentileLatencies represents the latency distribution in seconds. diff --git a/cmd/kperf/commands/runner/runner.go b/cmd/kperf/commands/runner/runner.go index 0acea61..67e1043 100644 --- a/cmd/kperf/commands/runner/runner.go +++ b/cmd/kperf/commands/runner/runner.go @@ -116,6 +116,11 @@ func printResponseStats(stats *types.ResponseStats) { fmt.Println("Response stat:") fmt.Printf(" Total: %v\n", stats.Total) fmt.Printf(" Failures: %v\n", stats.Failures) + fmt.Println("==========================") + for i, v := range stats.FailureList { + fmt.Printf(" Failure %d: %v\n", i+1, v) + } + fmt.Println("==========================") fmt.Printf(" Duration: %v\n", stats.Duration) fmt.Printf(" Requests/sec: %.2f\n", float64(stats.Total)/stats.Duration.Seconds()) diff --git a/metrics/request.go b/metrics/request.go index 374c929..5efd275 100644 --- a/metrics/request.go +++ b/metrics/request.go @@ -13,20 +13,22 @@ type ResponseMetric interface { // ObserveLatency observes latency. ObserveLatency(seconds float64) // ObserveFailure observes failure response. - ObserveFailure() + ObserveFailure(err error) // Gather returns the summary. - Gather() (latencies []float64, percentileLatencies map[float64]float64, failure int) + Gather() (latencies []float64, percentileLatencies map[float64]float64, failure int, failureList []error) } type responseMetricImpl struct { mu sync.Mutex failureCount int64 + failureList []error latencies *list.List } func NewResponseMetric() ResponseMetric { return &responseMetricImpl{ - latencies: list.New(), + latencies: list.New(), + failureList: []error{}, } } @@ -38,15 +40,16 @@ func (m *responseMetricImpl) ObserveLatency(seconds float64) { } // ObserveFailure implements ResponseMetric. -func (m *responseMetricImpl) ObserveFailure() { +func (m *responseMetricImpl) ObserveFailure(err error) { + m.failureList = append(m.failureList, err) atomic.AddInt64(&m.failureCount, 1) } // Gather implements ResponseMetric. -func (m *responseMetricImpl) Gather() ([]float64, map[float64]float64, int) { +func (m *responseMetricImpl) Gather() ([]float64, map[float64]float64, int, []error) { latencies := m.dumpLatencies() - return latencies, buildPercentileLatencies(latencies), int(atomic.LoadInt64(&m.failureCount)) + return latencies, buildPercentileLatencies(latencies), int(atomic.LoadInt64(&m.failureCount)), m.failureList } func (m *responseMetricImpl) dumpLatencies() []float64 { diff --git a/metrics/request_test.go b/metrics/request_test.go index 2cd8e15..eb4ad27 100644 --- a/metrics/request_test.go +++ b/metrics/request_test.go @@ -38,7 +38,7 @@ func TestResponseMetric(t *testing.T) { c.ObserveLatency(float64(i)) } - _, res, _ := c.Gather() + _, res, _, _ := c.Gather() assert.Equal(t, float64(1), res[0]) assert.Equal(t, float64(50), res[50]) assert.Equal(t, float64(90), res[90]) diff --git a/request/schedule.go b/request/schedule.go index 246fcc1..5f171bd 100644 --- a/request/schedule.go +++ b/request/schedule.go @@ -65,7 +65,7 @@ func Schedule(ctx context.Context, spec *types.LoadProfileSpec, restCli []rest.I _, err = io.Copy(io.Discard, respBody) } if err != nil { - respMetric.ObserveFailure() + respMetric.ObserveFailure(err) } }() } @@ -80,10 +80,11 @@ func Schedule(ctx context.Context, spec *types.LoadProfileSpec, restCli []rest.I totalDuration := time.Since(start) - _, percentileLatencies, failures := respMetric.Gather() + _, percentileLatencies, failures, failureList := respMetric.Gather() return &types.ResponseStats{ Total: spec.Total, Failures: failures, + FailureList: failureList, Duration: totalDuration, PercentileLatencies: percentileLatencies, }, nil diff --git a/tmp/xx.yaml b/tmp/xx.yaml new file mode 100644 index 0000000..23da4f1 --- /dev/null +++ b/tmp/xx.yaml @@ -0,0 +1,17 @@ +version: 1 +description: test +spec: + rate: 100 + total: 10 + conns: 10 + requests: + - staleList: + version: v1 + resource: pods + limit: 500 + shares: 100 + - quorumList: + version: v1 + resource: pods + limit: 1000 + shares: 150