mirror of
https://github.com/caddyserver/caddy.git
synced 2024-11-25 17:56:34 +08:00
Rounding the latency in certain scenarios (#1005)
* Rounding the latency in certain scenarios * run gofmt
This commit is contained in:
parent
de7bf4f241
commit
4d76ccb1c4
|
@ -144,7 +144,10 @@ func (r *replacer) Replace(s string) string {
|
|||
if r.responseRecorder != nil {
|
||||
r.replacements["{status}"] = func() string { return strconv.Itoa(r.responseRecorder.status) }
|
||||
r.replacements["{size}"] = func() string { return strconv.Itoa(r.responseRecorder.size) }
|
||||
r.replacements["{latency}"] = func() string { return time.Since(r.responseRecorder.start).String() }
|
||||
r.replacements["{latency}"] = func() string {
|
||||
dur := time.Since(r.responseRecorder.start)
|
||||
return roundDuration(dur).String()
|
||||
}
|
||||
}
|
||||
|
||||
// Include custom placeholders, overwriting existing ones if necessary
|
||||
|
@ -187,6 +190,36 @@ func (r *replacer) Replace(s string) string {
|
|||
return s
|
||||
}
|
||||
|
||||
func roundDuration(d time.Duration) time.Duration {
|
||||
if d >= time.Millisecond {
|
||||
return round(d, time.Millisecond)
|
||||
} else if d >= time.Microsecond {
|
||||
return round(d, time.Microsecond)
|
||||
}
|
||||
|
||||
return d
|
||||
}
|
||||
|
||||
// round rounds d to the nearest r
|
||||
func round(d, r time.Duration) time.Duration {
|
||||
if r <= 0 {
|
||||
return d
|
||||
}
|
||||
neg := d < 0
|
||||
if neg {
|
||||
d = -d
|
||||
}
|
||||
if m := d % r; m+m < r {
|
||||
d = d - m
|
||||
} else {
|
||||
d = d + r - m
|
||||
}
|
||||
if neg {
|
||||
return -d
|
||||
}
|
||||
return d
|
||||
}
|
||||
|
||||
// Set sets key to value in the r.customReplacements map.
|
||||
func (r *replacer) Set(key, value string) {
|
||||
r.customReplacements["{"+key+"}"] = func() string { return value }
|
||||
|
|
|
@ -6,6 +6,7 @@ import (
|
|||
"os"
|
||||
"strings"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
func TestNewReplacer(t *testing.T) {
|
||||
|
@ -140,3 +141,23 @@ func TestSet(t *testing.T) {
|
|||
t.Error("Expected variable replacement failed")
|
||||
}
|
||||
}
|
||||
|
||||
func TestRound(t *testing.T) {
|
||||
var tests = map[time.Duration]time.Duration{
|
||||
// 599.935µs -> 560µs
|
||||
559935 * time.Nanosecond: 560 * time.Microsecond,
|
||||
// 1.55ms -> 2ms
|
||||
1550 * time.Microsecond: 2 * time.Millisecond,
|
||||
// 1.5555s -> 1.556s
|
||||
1555500 * time.Microsecond: 1556 * time.Millisecond,
|
||||
// 1m2.0035s -> 1m2.004s
|
||||
62003500 * time.Microsecond: 62004 * time.Millisecond,
|
||||
}
|
||||
|
||||
for dur, expected := range tests {
|
||||
rounded := roundDuration(dur)
|
||||
if rounded != expected {
|
||||
t.Errorf("Expected %v, Got %v", expected, rounded)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user