Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 3 additions & 9 deletions metrics/resetting_timer.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,10 @@ package metrics

import (
"math"
"sort"
"sync"
"time"

"golang.org/x/exp/slices"
)

// Initial slice capacity for the values stored in a ResettingTimer
Expand Down Expand Up @@ -186,7 +187,7 @@ func (t *ResettingTimerSnapshot) Mean() float64 {
}

func (t *ResettingTimerSnapshot) calc(percentiles []float64) {
sort.Sort(Int64Slice(t.values))
slices.Sort(t.values)

count := len(t.values)
if count > 0 {
Expand Down Expand Up @@ -232,10 +233,3 @@ func (t *ResettingTimerSnapshot) calc(percentiles []float64) {

t.calculated = true
}

// Int64Slice attaches the methods of sort.Interface to []int64, sorting in increasing order.
type Int64Slice []int64

func (s Int64Slice) Len() int { return len(s) }
func (s Int64Slice) Less(i, j int) bool { return s[i] < s[j] }
func (s Int64Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] }
15 changes: 5 additions & 10 deletions metrics/sample.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,10 @@ package metrics
import (
"math"
"math/rand"
"sort"
"sync"
"time"

"golang.org/x/exp/slices"
)

const rescaleThreshold = time.Hour
Expand Down Expand Up @@ -282,17 +283,17 @@ func SampleMin(values []int64) int64 {
}

// SamplePercentiles returns an arbitrary percentile of the slice of int64.
func SamplePercentile(values int64Slice, p float64) float64 {
func SamplePercentile(values []int64, p float64) float64 {
return SamplePercentiles(values, []float64{p})[0]
}

// SamplePercentiles returns a slice of arbitrary percentiles of the slice of
// int64.
func SamplePercentiles(values int64Slice, ps []float64) []float64 {
func SamplePercentiles(values []int64, ps []float64) []float64 {
scores := make([]float64, len(ps))
size := len(values)
if size > 0 {
sort.Sort(values)
slices.Sort(values)
for i, p := range ps {
pos := p * float64(size+1)
if pos < 1.0 {
Expand Down Expand Up @@ -633,9 +634,3 @@ func (h *expDecaySampleHeap) down(i, n int) {
i = j
}
}

type int64Slice []int64

func (p int64Slice) Len() int { return len(p) }
func (p int64Slice) Less(i, j int) bool { return p[i] < p[j] }
func (p int64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
18 changes: 6 additions & 12 deletions metrics/writer.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,9 @@ package metrics
import (
"fmt"
"io"
"sort"
"time"

"golang.org/x/exp/slices"
)

// Write sorts writes each metric in the given registry periodically to the
Expand All @@ -18,12 +19,12 @@ func Write(r Registry, d time.Duration, w io.Writer) {
// WriteOnce sorts and writes metrics in the given registry to the given
// io.Writer.
func WriteOnce(r Registry, w io.Writer) {
var namedMetrics namedMetricSlice
var namedMetrics []namedMetric
r.Each(func(name string, i interface{}) {
namedMetrics = append(namedMetrics, namedMetric{name, i})
})

sort.Sort(namedMetrics)
slices.SortFunc(namedMetrics, namedMetric.less)
for _, namedMetric := range namedMetrics {
switch metric := namedMetric.m.(type) {
case Counter:
Expand Down Expand Up @@ -91,13 +92,6 @@ type namedMetric struct {
m interface{}
}

// namedMetricSlice is a slice of namedMetrics that implements sort.Interface.
type namedMetricSlice []namedMetric

func (nms namedMetricSlice) Len() int { return len(nms) }

func (nms namedMetricSlice) Swap(i, j int) { nms[i], nms[j] = nms[j], nms[i] }

func (nms namedMetricSlice) Less(i, j int) bool {
return nms[i].name < nms[j].name
func (m namedMetric) less(other namedMetric) bool {
return m.name < other.name
}
7 changes: 4 additions & 3 deletions metrics/writer_test.go
Original file line number Diff line number Diff line change
@@ -1,19 +1,20 @@
package metrics

import (
"sort"
"testing"

"golang.org/x/exp/slices"
)

func TestMetricsSorting(t *testing.T) {
var namedMetrics = namedMetricSlice{
var namedMetrics = []namedMetric{
{name: "zzz"},
{name: "bbb"},
{name: "fff"},
{name: "ggg"},
}

sort.Sort(namedMetrics)
slices.SortFunc(namedMetrics, namedMetric.less)
for i, name := range []string{"bbb", "fff", "ggg", "zzz"} {
if namedMetrics[i].name != name {
t.Fail()
Expand Down