From 153ebc31d715f65226cf0851bba65f4056eb1817 Mon Sep 17 00:00:00 2001 From: Ben Schumacher Date: Mon, 25 Sep 2023 09:46:15 +0200 Subject: [PATCH] [MM-54289] Add heap profile to support package (#24476) --- server/channels/app/support_packet.go | 18 ++++++++++++++++++ server/channels/app/support_packet_test.go | 4 ++-- 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/server/channels/app/support_packet.go b/server/channels/app/support_packet.go index 90bd7a5631..899bfe1c35 100644 --- a/server/channels/app/support_packet.go +++ b/server/channels/app/support_packet.go @@ -4,9 +4,11 @@ package app import ( + "bytes" "encoding/json" "os" "runtime" + "runtime/pprof" "strings" "github.com/hashicorp/go-multierror" @@ -33,6 +35,7 @@ func (a *App) GenerateSupportPacket(c *request.Context) []model.FileData { "config": a.createSanitizedConfigFile, "mattermost log": a.getMattermostLog, "notification log": a.getNotificationsLog, + "heap profile": a.createHeapProfile, } for name, fn := range functions { @@ -290,3 +293,18 @@ func (a *App) createSanitizedConfigFile(_ *request.Context) (*model.FileData, er } return fileData, nil } + +func (a *App) createHeapProfile(*request.Context) (*model.FileData, error) { + var b bytes.Buffer + + err := pprof.Lookup("heap").WriteTo(&b, 0) + if err != nil { + return nil, errors.Wrap(err, "failed to lookup heap profile") + } + + fileData := &model.FileData{ + Filename: "heap.prof", + Body: b.Bytes(), + } + return fileData, nil +} diff --git a/server/channels/app/support_packet_test.go b/server/channels/app/support_packet_test.go index 306e570aa4..44b43bf8b9 100644 --- a/server/channels/app/support_packet_test.go +++ b/server/channels/app/support_packet_test.go @@ -102,7 +102,7 @@ func TestGenerateSupportPacket(t *testing.T) { fileDatas := th.App.GenerateSupportPacket(ctx) var rFileNames []string - testFiles := []string{"support_packet.yaml", "plugins.json", "sanitized_config.json", "mattermost.log", "notifications.log"} + testFiles := []string{"support_packet.yaml", "plugins.json", "sanitized_config.json", "mattermost.log", "notifications.log", "heap.prof"} for _, fileData := range fileDatas { require.NotNil(t, fileData) assert.Positive(t, len(fileData.Body)) @@ -117,7 +117,7 @@ func TestGenerateSupportPacket(t *testing.T) { err = os.Remove("mattermost.log") require.NoError(t, err) fileDatas = th.App.GenerateSupportPacket(ctx) - testFiles = []string{"support_packet.yaml", "plugins.json", "sanitized_config.json", "warning.txt"} + testFiles = []string{"support_packet.yaml", "plugins.json", "sanitized_config.json", "heap.prof", "warning.txt"} rFileNames = nil for _, fileData := range fileDatas { require.NotNil(t, fileData)