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  }