mirror of
https://github.com/caddyserver/caddy.git
synced 2025-05-31 12:15:56 -04: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 {
|
if r.responseRecorder != nil {
|
||||||
r.replacements["{status}"] = func() string { return strconv.Itoa(r.responseRecorder.status) }
|
r.replacements["{status}"] = func() string { return strconv.Itoa(r.responseRecorder.status) }
|
||||||
r.replacements["{size}"] = func() string { return strconv.Itoa(r.responseRecorder.size) }
|
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
|
// Include custom placeholders, overwriting existing ones if necessary
|
||||||
@ -187,6 +190,36 @@ func (r *replacer) Replace(s string) string {
|
|||||||
return s
|
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.
|
// Set sets key to value in the r.customReplacements map.
|
||||||
func (r *replacer) Set(key, value string) {
|
func (r *replacer) Set(key, value string) {
|
||||||
r.customReplacements["{"+key+"}"] = func() string { return value }
|
r.customReplacements["{"+key+"}"] = func() string { return value }
|
||||||
|
@ -6,6 +6,7 @@ import (
|
|||||||
"os"
|
"os"
|
||||||
"strings"
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
func TestNewReplacer(t *testing.T) {
|
func TestNewReplacer(t *testing.T) {
|
||||||
@ -140,3 +141,23 @@ func TestSet(t *testing.T) {
|
|||||||
t.Error("Expected variable replacement failed")
|
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…
x
Reference in New Issue
Block a user