Skip to content

Commit 82f8fd7

Browse files
committed
improve
1 parent 5f29893 commit 82f8fd7

File tree

7 files changed

+65
-19
lines changed

7 files changed

+65
-19
lines changed

cmd/web.go

+4
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@ import (
1818

1919
"code.gitea.io/gitea/modules/container"
2020
"code.gitea.io/gitea/modules/graceful"
21+
"code.gitea.io/gitea/modules/gtprof"
2122
"code.gitea.io/gitea/modules/log"
2223
"code.gitea.io/gitea/modules/process"
2324
"code.gitea.io/gitea/modules/public"
2425
"code.gitea.io/gitea/modules/setting"
26+
"code.gitea.io/gitea/modules/util"
2527
"code.gitea.io/gitea/routers"
2628
"code.gitea.io/gitea/routers/install"
2729

@@ -218,6 +220,8 @@ func serveInstalled(ctx *cli.Context) error {
218220
}
219221
}
220222

223+
gtprof.EnableBuiltinTracer(util.Iif(setting.IsProd, 2000*time.Millisecond, 100*time.Millisecond))
224+
221225
// Set up Chi routes
222226
webRoutes := routers.NormalRoutes()
223227
err := listen(webRoutes, true)

modules/gtprof/trace_builtin.go

+29-9
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"context"
88
"fmt"
99
"strings"
10+
"sync/atomic"
1011
"time"
1112

1213
"code.gitea.io/gitea/modules/tailmsg"
@@ -29,16 +30,28 @@ func (t *traceBuiltinSpan) toString(out *strings.Builder, indent int) {
2930
if t.ts.endTime.IsZero() {
3031
out.WriteString(" duration: (not ended)")
3132
} else {
32-
out.WriteString(fmt.Sprintf(" duration: %.4fs", t.ts.endTime.Sub(t.ts.startTime).Seconds()))
33+
out.WriteString(fmt.Sprintf(" duration=%.4fs", t.ts.endTime.Sub(t.ts.startTime).Seconds()))
3334
}
34-
out.WriteString("\n")
3535
for _, a := range t.ts.attributes {
36-
out.WriteString(strings.Repeat(" ", indent+2))
36+
out.WriteString(" ")
3737
out.WriteString(a.Key)
38-
out.WriteString(": ")
39-
out.WriteString(a.Value.AsString())
40-
out.WriteString("\n")
38+
out.WriteString("=")
39+
value := a.Value.AsString()
40+
if strings.Contains(value, " ") {
41+
quoted := false
42+
for _, c := range "\"'`" {
43+
if quoted = !strings.Contains(value, string(c)); quoted {
44+
value = string(c) + value + string(c)
45+
break
46+
}
47+
}
48+
if !quoted {
49+
value = fmt.Sprintf("%q", value)
50+
}
51+
}
52+
out.WriteString(value)
4153
}
54+
out.WriteString("\n")
4255
for _, c := range t.ts.children {
4356
span := c.internalSpans[t.internalSpanIdx].(*traceBuiltinSpan)
4457
span.toString(out, indent+2)
@@ -47,9 +60,10 @@ func (t *traceBuiltinSpan) toString(out *strings.Builder, indent int) {
4760

4861
func (t *traceBuiltinSpan) end() {
4962
if t.ts.parent == nil {
50-
// FIXME: debug purpose only
51-
// FIXME: it should distinguish between http response network lag and actual processing time
52-
if len(t.ts.children) > 3 || t.ts.endTime.Sub(t.ts.startTime) > 100*time.Millisecond {
63+
// TODO: debug purpose only
64+
// TODO: it should distinguish between http response network lag and actual processing time
65+
threshold := time.Duration(traceBuiltinThreshold.Load())
66+
if threshold != 0 && t.ts.endTime.Sub(t.ts.startTime) > threshold {
5367
sb := &strings.Builder{}
5468
t.toString(sb, 0)
5569
tailmsg.GetManager().GetTraceRecorder().Record(sb.String())
@@ -64,3 +78,9 @@ func (t *traceBuiltinStarter) start(ctx context.Context, traceSpan *TraceSpan, i
6478
func init() {
6579
globalTraceStarters = append(globalTraceStarters, &traceBuiltinStarter{})
6680
}
81+
82+
var traceBuiltinThreshold atomic.Int64
83+
84+
func EnableBuiltinTracer(threshold time.Duration) {
85+
traceBuiltinThreshold.Store(int64(threshold))
86+
}

routers/web/admin/diagnosis.go

+16-2
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ package admin
55

66
import (
77
"archive/zip"
8+
"code.gitea.io/gitea/modules/tailmsg"
9+
"code.gitea.io/gitea/modules/util"
810
"fmt"
911
"runtime/pprof"
1012
"time"
@@ -15,8 +17,8 @@ import (
1517

1618
func MonitorDiagnosis(ctx *context.Context) {
1719
seconds := ctx.FormInt64("seconds")
18-
if seconds <= 5 {
19-
seconds = 5
20+
if seconds <= 1 {
21+
seconds = 1
2022
}
2123
if seconds > 300 {
2224
seconds = 300
@@ -65,4 +67,16 @@ func MonitorDiagnosis(ctx *context.Context) {
6567
return
6668
}
6769
_ = pprof.Lookup("heap").WriteTo(f, 0)
70+
71+
f, err = zipWriter.CreateHeader(&zip.FileHeader{Name: "perftrace.txt", Method: zip.Deflate, Modified: time.Now()})
72+
if err != nil {
73+
ctx.ServerError("Failed to create zip file", err)
74+
return
75+
}
76+
for _, record := range tailmsg.GetManager().GetTraceRecorder().GetRecords() {
77+
_, _ = f.Write(util.UnsafeStringToBytes(record.Time.Format(time.RFC3339)))
78+
_, _ = f.Write([]byte(" "))
79+
_, _ = f.Write(util.UnsafeStringToBytes((record.Content)))
80+
_, _ = f.Write([]byte("\n\n"))
81+
}
6882
}

routers/web/admin/perftrace.go

+1-2
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ import (
1111
)
1212

1313
func PerfTrace(ctx *context.Context) {
14-
ctx.Data["Title"] = ctx.Tr("admin.monitor")
15-
ctx.Data["PageIsAdminMonitorTrace"] = true
14+
monitorTraceCommon(ctx)
1615
ctx.Data["PageIsAdminMonitorPerfTrace"] = true
1716
ctx.Data["PerfTraceRecords"] = tailmsg.GetManager().GetTraceRecorder().GetRecords()
1817
ctx.HTML(http.StatusOK, tplPerfTrace)

routers/web/admin/stacktrace.go

+9-2
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,17 @@ import (
1212
"code.gitea.io/gitea/services/context"
1313
)
1414

15-
// Stacktrace show admin monitor goroutines page
16-
func Stacktrace(ctx *context.Context) {
15+
func monitorTraceCommon(ctx *context.Context) {
1716
ctx.Data["Title"] = ctx.Tr("admin.monitor")
1817
ctx.Data["PageIsAdminMonitorTrace"] = true
18+
// Hide the performance trace tab in production, because it shows a lot of SQLs and is not that useful for end users.
19+
// To avoid confusing end users, do not let them know this tab. End users should "download diagnosis report" instead.
20+
ctx.Data["ShowAdminPerformanceTraceTab"] = !setting.IsProd
21+
}
22+
23+
// Stacktrace show admin monitor goroutines page
24+
func Stacktrace(ctx *context.Context) {
25+
monitorTraceCommon(ctx)
1926

2027
ctx.Data["GoroutineCount"] = runtime.NumGoroutine()
2128

templates/admin/perftrace.tmpl

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@
44
{{template "admin/trace_tabs" .}}
55

66
{{range $record := .PerfTraceRecords}}
7-
<div class="ui segment tw-overflow-auto">
8-
<pre>{{$record.Content}}</pre>
7+
<div class="ui segment">
8+
<pre class="tw-w-full tw-overflow-scroll tw-whitespace-pre">{{$record.Content}}</pre>
99
</div>
1010
{{end}}
1111
</div>

templates/admin/trace_tabs.tmpl

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
<div class="flex-text-block">
22
<div class="tw-flex-1">
33
<div class="ui compact small menu">
4+
{{if .ShowAdminPerformanceTraceTab}}
45
<a class="item {{Iif .PageIsAdminMonitorPerfTrace "active"}}" href="{{AppSubUrl}}/-/admin/monitor/perftrace">{{ctx.Locale.Tr "admin.monitor.performance_logs"}}</a>
5-
<a class="item {{Iif (eq .ShowGoroutineList "process") "active"}}" href="?show=process">{{ctx.Locale.Tr "admin.monitor.process"}}</a>
6-
<a class="item {{Iif (eq .ShowGoroutineList "stacktrace") "active"}}" href="?show=stacktrace">{{ctx.Locale.Tr "admin.monitor.stacktrace"}}</a>
6+
{{end}}
7+
<a class="item {{Iif (eq .ShowGoroutineList "process") "active"}}" href="{{AppSubUrl}}/-/admin/monitor/stacktrace?show=process">{{ctx.Locale.Tr "admin.monitor.process"}}</a>
8+
<a class="item {{Iif (eq .ShowGoroutineList "stacktrace") "active"}}" href="{{AppSubUrl}}/-/admin/monitor/stacktrace?show=stacktrace">{{ctx.Locale.Tr "admin.monitor.stacktrace"}}</a>
79
</div>
810
</div>
911
<form target="_blank" action="{{AppSubUrl}}/-/admin/monitor/diagnosis" class="ui form">

0 commit comments

Comments
 (0)