code.gitea.io/gitea@v1.21.7/routers/web/admin/diagnosis.go (about) 1 // Copyright 2023 The Gitea Authors. 2 // SPDX-License-Identifier: MIT 3 4 package admin 5 6 import ( 7 "archive/zip" 8 "fmt" 9 "runtime/pprof" 10 "time" 11 12 "code.gitea.io/gitea/modules/context" 13 "code.gitea.io/gitea/modules/httplib" 14 ) 15 16 func MonitorDiagnosis(ctx *context.Context) { 17 seconds := ctx.FormInt64("seconds") 18 if seconds <= 5 { 19 seconds = 5 20 } 21 if seconds > 300 { 22 seconds = 300 23 } 24 25 httplib.ServeSetHeaders(ctx.Resp, &httplib.ServeHeaderOptions{ 26 ContentType: "application/zip", 27 Disposition: "attachment", 28 Filename: fmt.Sprintf("gitea-diagnosis-%s.zip", time.Now().Format("20060102-150405")), 29 }) 30 31 zipWriter := zip.NewWriter(ctx.Resp) 32 defer zipWriter.Close() 33 34 f, err := zipWriter.CreateHeader(&zip.FileHeader{Name: "goroutine-before.txt", Method: zip.Deflate, Modified: time.Now()}) 35 if err != nil { 36 ctx.ServerError("Failed to create zip file", err) 37 return 38 } 39 _ = pprof.Lookup("goroutine").WriteTo(f, 1) 40 41 f, err = zipWriter.CreateHeader(&zip.FileHeader{Name: "cpu-profile.dat", Method: zip.Deflate, Modified: time.Now()}) 42 if err != nil { 43 ctx.ServerError("Failed to create zip file", err) 44 return 45 } 46 47 err = pprof.StartCPUProfile(f) 48 if err == nil { 49 time.Sleep(time.Duration(seconds) * time.Second) 50 pprof.StopCPUProfile() 51 } else { 52 _, _ = f.Write([]byte(err.Error())) 53 } 54 55 f, err = zipWriter.CreateHeader(&zip.FileHeader{Name: "goroutine-after.txt", Method: zip.Deflate, Modified: time.Now()}) 56 if err != nil { 57 ctx.ServerError("Failed to create zip file", err) 58 return 59 } 60 _ = pprof.Lookup("goroutine").WriteTo(f, 1) 61 62 f, err = zipWriter.CreateHeader(&zip.FileHeader{Name: "heap.dat", Method: zip.Deflate, Modified: time.Now()}) 63 if err != nil { 64 ctx.ServerError("Failed to create zip file", err) 65 return 66 } 67 _ = pprof.Lookup("heap").WriteTo(f, 0) 68 }