(t *testing.T)
| 122 | } |
| 123 | |
| 124 | func TestAvgOverTimeScalesResults(t *testing.T) { |
| 125 | // Test data designed to verify multiplication accuracy in weighted mean calculation |
| 126 | // The addWeigthedMean function uses: meanDelta := ((mean - currentMean.mean) * weight) / sumWeights |
| 127 | in := []Span{ |
| 128 | // Time interval 1: service=a has 2 spans with durations 100, 200 (mean=150, count=2) |
| 129 | newMockSpan(nil).WithStartTime(uint64(1*time.Second)).WithSpanString("service", "a").WithDuration(uint64(100 * time.Second)), |
| 130 | newMockSpan(nil).WithStartTime(uint64(1*time.Second)).WithSpanString("service", "a").WithDuration(uint64(200 * time.Second)), |
| 131 | |
| 132 | // Time interval 1: service=b has 3 spans with durations 300, 600, 900 (mean=600, count=3) |
| 133 | newMockSpan(nil).WithStartTime(uint64(1*time.Second)).WithSpanString("service", "b").WithDuration(uint64(300 * time.Second)), |
| 134 | newMockSpan(nil).WithStartTime(uint64(1*time.Second)).WithSpanString("service", "b").WithDuration(uint64(600 * time.Second)), |
| 135 | newMockSpan(nil).WithStartTime(uint64(1*time.Second)).WithSpanString("service", "b").WithDuration(uint64(900 * time.Second)), |
| 136 | |
| 137 | // Time interval 2: service=a has 4 spans with durations 400, 800, 1200, 1600 (mean=1000, count=4) |
| 138 | newMockSpan(nil).WithStartTime(uint64(2*time.Second)).WithSpanString("service", "a").WithDuration(uint64(400 * time.Second)), |
| 139 | newMockSpan(nil).WithStartTime(uint64(2*time.Second)).WithSpanString("service", "a").WithDuration(uint64(800 * time.Second)), |
| 140 | newMockSpan(nil).WithStartTime(uint64(2*time.Second)).WithSpanString("service", "a").WithDuration(uint64(1200 * time.Second)), |
| 141 | newMockSpan(nil).WithStartTime(uint64(2*time.Second)).WithSpanString("service", "a").WithDuration(uint64(1600 * time.Second)), |
| 142 | |
| 143 | // Time interval 2: service=b has 1 span with duration 2000 (mean=2000, count=1) |
| 144 | newMockSpan(nil).WithStartTime(uint64(2*time.Second)).WithSpanString("service", "b").WithDuration(uint64(2000 * time.Second)), |
| 145 | |
| 146 | // Time interval 3: service=a has varying precision values to test floating point accuracy |
| 147 | newMockSpan(nil).WithStartTime(uint64(3*time.Second)).WithSpanString("service", "a").WithDuration(uint64(123 * time.Second)), |
| 148 | newMockSpan(nil).WithStartTime(uint64(3*time.Second)).WithSpanString("service", "a").WithDuration(uint64(456 * time.Second)), |
| 149 | newMockSpan(nil).WithStartTime(uint64(3*time.Second)).WithSpanString("service", "a").WithDuration(uint64(789 * time.Second)), |
| 150 | } |
| 151 | |
| 152 | a := newAverageOverTimeMetricsAggregator(IntrinsicDurationAttribute, []Attribute{NewAttribute("service")}) |
| 153 | a.init(&tempopb.QueryRangeRequest{ |
| 154 | Start: 1, |
| 155 | End: uint64(3 * time.Second), |
| 156 | Step: uint64(1 * time.Second), |
| 157 | }, AggregateModeRaw) |
| 158 | |
| 159 | for _, span := range in { |
| 160 | a.observe(span) |
| 161 | } |
| 162 | |
| 163 | ss := a.result(1.0) |
| 164 | expected := []TimeSeries{ |
| 165 | { |
| 166 | Labels: Labels{ |
| 167 | Label{Name: ".service", Value: NewStaticString("a")}, |
| 168 | }, |
| 169 | Values: []float64{150.0, 1000.0, 456.0}, |
| 170 | Exemplars: []Exemplar{}, |
| 171 | }, |
| 172 | { |
| 173 | Labels: Labels{ |
| 174 | Label{Name: ".service", Value: NewStaticString("a")}, |
| 175 | Label{internalLabelMetaType, NewStaticString(internalMetaTypeCount)}, |
| 176 | }, |
| 177 | Values: []float64{2, 4, 3}, |
| 178 | }, |
| 179 | { |
| 180 | Labels: Labels{ |
| 181 | Label{Name: ".service", Value: NewStaticString("b")}, |
nothing calls this directly
no test coverage detected