|
@@ -21,11 +21,6 @@ import (
|
|
|
"time"
|
|
|
)
|
|
|
|
|
|
-var eventsTmpl = template.Must(template.New("events").Funcs(template.FuncMap{
|
|
|
- "elapsed": elapsed,
|
|
|
- "trimSpace": strings.TrimSpace,
|
|
|
-}).Parse(eventsHTML))
|
|
|
-
|
|
|
const maxEventsPerLog = 100
|
|
|
|
|
|
type bucket struct {
|
|
@@ -101,7 +96,7 @@ func RenderEvents(w http.ResponseWriter, req *http.Request, sensitive bool) {
|
|
|
|
|
|
famMu.RLock()
|
|
|
defer famMu.RUnlock()
|
|
|
- if err := eventsTmpl.Execute(w, data); err != nil {
|
|
|
+ if err := eventsTmpl().Execute(w, data); err != nil {
|
|
|
log.Printf("net/trace: Failed executing template: %v", err)
|
|
|
}
|
|
|
}
|
|
@@ -421,6 +416,19 @@ func freeEventLog(el *eventLog) {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+var eventsTmplCache *template.Template
|
|
|
+var eventsTmplOnce sync.Once
|
|
|
+
|
|
|
+func eventsTmpl() *template.Template {
|
|
|
+ eventsTmplOnce.Do(func() {
|
|
|
+ eventsTmplCache = template.Must(template.New("events").Funcs(template.FuncMap{
|
|
|
+ "elapsed": elapsed,
|
|
|
+ "trimSpace": strings.TrimSpace,
|
|
|
+ }).Parse(eventsHTML))
|
|
|
+ })
|
|
|
+ return eventsTmplCache
|
|
|
+}
|
|
|
+
|
|
|
const eventsHTML = `
|
|
|
<html>
|
|
|
<head>
|