|
1 | 1 | package metrics |
2 | 2 |
|
3 | | -import ( |
4 | | - "time" |
| 3 | +type Value interface{} |
5 | 4 |
|
6 | | - "github.com/benchttp/engine/runner/internal/recorder" |
| 5 | +type Source string |
| 6 | + |
| 7 | +const ( |
| 8 | + ResponseTimeAvg Source = "AVG" |
| 9 | + ResponseTimeMin Source = "MIN" |
| 10 | + ResponseTimeMax Source = "MAX" |
| 11 | + RequestFailCount Source = "FAILURE_COUNT" |
| 12 | + RequestSuccessCount Source = "SUCCESS_COUNT" |
| 13 | + RequestCount Source = "TOTAL_COUNT" |
7 | 14 | ) |
8 | 15 |
|
9 | | -// Aggregate is an aggregate of metrics resulting from |
10 | | -// from recorded requests. |
11 | | -type Aggregate struct { |
12 | | - Min, Max, Avg time.Duration |
13 | | - SuccessCount, FailureCount, TotalCount int |
14 | | - // Median, StdDev time.Duration |
15 | | - // Deciles map[int]float64 |
16 | | - // StatusCodeDistribution map[string]int |
17 | | - // RequestEventsDistribution map[recorder.Event]int |
| 16 | +func (agg Aggregate) MetricOf(src Source) Metric { |
| 17 | + var v interface{} |
| 18 | + switch src { |
| 19 | + case ResponseTimeAvg: |
| 20 | + v = agg.Avg |
| 21 | + case ResponseTimeMin: |
| 22 | + v = agg.Min |
| 23 | + case ResponseTimeMax: |
| 24 | + v = agg.Max |
| 25 | + case RequestFailCount: |
| 26 | + v = agg.FailureCount |
| 27 | + case RequestSuccessCount: |
| 28 | + v = agg.SuccessCount |
| 29 | + case RequestCount: |
| 30 | + v = agg.TotalCount |
| 31 | + default: |
| 32 | + panic("metrics.Aggregate.MetricOf: unknown Source: " + src) |
| 33 | + } |
| 34 | + return Metric{Source: src, Value: v} |
18 | 35 | } |
19 | 36 |
|
20 | | -// Compute computes and aggregates metrics from the given |
21 | | -// requests records. |
22 | | -func Compute(records []recorder.Record) (agg Aggregate) { |
23 | | - if len(records) == 0 { |
24 | | - return |
25 | | - } |
| 37 | +type Metric struct { |
| 38 | + Source Source |
| 39 | + Value Value |
| 40 | +} |
26 | 41 |
|
27 | | - agg.TotalCount = len(records) |
28 | | - agg.Min, agg.Max = records[0].Time, records[0].Time |
29 | | - for _, rec := range records { |
30 | | - if rec.Error != "" { |
31 | | - agg.FailureCount++ |
32 | | - } |
33 | | - if rec.Time < agg.Min { |
34 | | - agg.Min = rec.Time |
35 | | - } |
36 | | - if rec.Time > agg.Max { |
37 | | - agg.Max = rec.Time |
38 | | - } |
39 | | - agg.Avg += rec.Time / time.Duration(len(records)) |
40 | | - } |
41 | | - agg.SuccessCount = agg.TotalCount - agg.FailureCount |
42 | | - return |
| 42 | +func (m Metric) Compare(to Metric) ComparisonResult { |
| 43 | + return compareMetrics(m, to) |
43 | 44 | } |
0 commit comments