summaryrefslogtreecommitdiffstats
path: root/modules/pprof/pprof.go
diff options
context:
space:
mode:
authorDaniel Baumann <daniel@debian.org>2024-10-18 20:33:49 +0200
committerDaniel Baumann <daniel@debian.org>2024-10-18 20:33:49 +0200
commitdd136858f1ea40ad3c94191d647487fa4f31926c (patch)
tree58fec94a7b2a12510c9664b21793f1ed560c6518 /modules/pprof/pprof.go
parentInitial commit. (diff)
downloadforgejo-dd136858f1ea40ad3c94191d647487fa4f31926c.tar.xz
forgejo-dd136858f1ea40ad3c94191d647487fa4f31926c.zip
Adding upstream version 9.0.0.HEADupstream/9.0.0upstreamdebian
Signed-off-by: Daniel Baumann <daniel@debian.org>
Diffstat (limited to '')
-rw-r--r--modules/pprof/pprof.go45
1 files changed, 45 insertions, 0 deletions
diff --git a/modules/pprof/pprof.go b/modules/pprof/pprof.go
new file mode 100644
index 0000000..c611c14
--- /dev/null
+++ b/modules/pprof/pprof.go
@@ -0,0 +1,45 @@
+// Copyright 2018 The Gitea Authors. All rights reserved.
+// SPDX-License-Identifier: MIT
+
+package pprof
+
+import (
+ "fmt"
+ "os"
+ "runtime"
+ "runtime/pprof"
+
+ "code.gitea.io/gitea/modules/log"
+)
+
+// DumpMemProfileForUsername dumps a memory profile at pprofDataPath as memprofile_<username>_<temporary id>
+func DumpMemProfileForUsername(pprofDataPath, username string) error {
+ f, err := os.CreateTemp(pprofDataPath, fmt.Sprintf("memprofile_%s_", username))
+ if err != nil {
+ return err
+ }
+ defer f.Close()
+ runtime.GC() // get up-to-date statistics
+ return pprof.WriteHeapProfile(f)
+}
+
+// DumpCPUProfileForUsername dumps a CPU profile at pprofDataPath as cpuprofile_<username>_<temporary id>
+// the stop function it returns stops, writes and closes the CPU profile file
+func DumpCPUProfileForUsername(pprofDataPath, username string) (func(), error) {
+ f, err := os.CreateTemp(pprofDataPath, fmt.Sprintf("cpuprofile_%s_", username))
+ if err != nil {
+ return nil, err
+ }
+
+ err = pprof.StartCPUProfile(f)
+ if err != nil {
+ log.Fatal("StartCPUProfile: %v", err)
+ }
+ return func() {
+ pprof.StopCPUProfile()
+ err = f.Close()
+ if err != nil {
+ log.Fatal("StopCPUProfile Close: %v", err)
+ }
+ }, nil
+}