MCPcopy Create free account
hub / github.com/dagger/dagger / pprofDump

Method pprofDump

toolchains/engine-dev/pprof.go:99–159  ·  view source on GitHub ↗

Dump pprof data from the given test container and service endpoint

(
	ctx context.Context,
	testContainer *dagger.Container,
	debugEndpoint string,
	opts *dumpOpts,
)

Source from the content-addressed store, hash-verified

97
98// Dump pprof data from the given test container and service endpoint
99func (dev *EngineDev) pprofDump(
100 ctx context.Context,
101 testContainer *dagger.Container,
102 debugEndpoint string,
103 opts *dumpOpts,
104) (*dagger.Directory, error) {
105 dumps := dag.Directory()
106 baseFileName := strings.ReplaceAll(opts.route, "/", "-")
107 dumpCount := 0 // not strictly necessary, but a nice sanity check and less faff than using dumps.Entries()
108
109 cancelCtx, cancel := context.WithCancel(ctx)
110 eg := errgroup.Group{}
111 wait := opts.delay
112 eg.Go(func() error {
113 var dumpErr error
114 for {
115 select {
116 case <-cancelCtx.Done():
117 return dumpErr
118 case <-time.After(wait):
119 heapData, err := fetchDump(ctx, debugEndpoint, opts.route)
120 dumpErr = errors.Join(dumpErr, err)
121 if err == nil {
122 fileName := fmt.Sprintf("%s-%d.pprof", baseFileName, dumpCount)
123 dumps = dumps.WithFile(fileName, heapData)
124 dumpCount++
125 }
126 if opts.interval < 0 {
127 return dumpErr
128 }
129 wait = opts.interval
130 }
131 }
132 })
133
134 _, testErr := testContainer.Sync(ctx)
135 cancel()
136 dumpErr := eg.Wait()
137
138 if !opts.noFinal {
139 heapData, finalDumpErr := fetchDump(ctx, debugEndpoint, opts.route)
140 dumpErr = errors.Join(dumpErr, finalDumpErr)
141 if finalDumpErr == nil {
142 fileName := fmt.Sprintf("%s-final.pprof", baseFileName)
143 dumps = dumps.WithFile(fileName, heapData)
144 dumpCount++
145 }
146 }
147
148 if testErr != nil {
149 if dumpCount == 0 {
150 return nil, fmt.Errorf("no dumps collected and test failed: %w, %w", testErr, dumpErr)
151 }
152 return dumps, testErr
153 }
154
155 if dumpCount == 0 {
156 return nil, fmt.Errorf("test passed, but no dumps collected: %w", dumpErr)

Callers 2

benchDumpMethod · 0.95
TestDumpMethod · 0.95

Calls 8

fetchDumpFunction · 0.85
DirectoryMethod · 0.65
DoneMethod · 0.65
SyncMethod · 0.65
WaitMethod · 0.65
GoMethod · 0.45
AfterMethod · 0.45
WithFileMethod · 0.45

Tested by

no test coverage detected