Skip to content

Commit 75b3b93

Browse files
committed
feat: capture peak memory usage at the of request and expose it to via context and caddy replacer vars
This captures peak memory usage similar to FPM and Apache2 SAPIs. To propagate this back to Go we store it in FrankenPHP context first, before retrieving it in embedder / runtime (e.g. Caddy) from context. Using in Caddy: ``` log_append memory_usage {http.frankenphp.memory_usage} log_append script {http.frankenphp.script} ```
1 parent e01e40f commit 75b3b93

File tree

5 files changed

+41
-1
lines changed

5 files changed

+41
-1
lines changed

caddy/module.go

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,17 @@ func (f *FrankenPHPModule) ServeHTTP(w http.ResponseWriter, r *http.Request, _ c
235235

236236
// TODO: set caddyhttp.ServerHeader when https://github.com/caddyserver/caddy/pull/7338 will be released
237237
w.Header()["Server"] = serverHeader
238-
if err = frankenphp.ServeHTTP(w, fr); err != nil && !errors.As(err, &frankenphp.ErrRejected{}) {
238+
err = frankenphp.ServeHTTP(w, fr)
239+
240+
// Retrieve and add stats to the Caddy Replacer
241+
stats, ok := frankenphp.StatusFromContext(fr.Context())
242+
if ok {
243+
repl.Set("http.frankenphp.memory_usage", stats.MemoryUsage)
244+
repl.Set("http.frankenphp.script", stats.Script)
245+
repl.Set("http.frankenphp.script_filename", stats.ScriptFilename)
246+
}
247+
248+
if err != nil && !errors.As(err, &frankenphp.ErrRejected{}) {
239249
return caddyhttp.Error(http.StatusInternalServerError, err)
240250
}
241251

context.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,14 @@ type frankenPHPContext struct {
3838

3939
done chan any
4040
startedAt time.Time
41+
42+
memoryUsage uint64
43+
}
44+
45+
type Stats struct {
46+
MemoryUsage uint64
47+
Script string
48+
ScriptFilename string
4149
}
4250

4351
type contextHolder struct {

frankenphp.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -609,6 +609,8 @@ static zend_module_entry frankenphp_module = {
609609
STANDARD_MODULE_PROPERTIES};
610610

611611
static void frankenphp_request_shutdown() {
612+
go_frankenphp_set_memory_peak_usage(thread_index, zend_memory_peak_usage(1));
613+
612614
frankenphp_free_request_context();
613615
php_request_shutdown((void *)0);
614616
}

frankenphp.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,19 @@ func Shutdown() {
382382
resetGlobals()
383383
}
384384

385+
// Stats returns FrankenPHP-specific execution stats from the given context.
386+
func StatusFromContext(ctx context.Context) (Stats, bool) {
387+
fc, ok := fromContext(ctx)
388+
if !ok {
389+
return Stats{}, false
390+
}
391+
return Stats{
392+
MemoryUsage: fc.memoryUsage,
393+
Script: fc.scriptName,
394+
ScriptFilename: fc.scriptFilename,
395+
}, true
396+
}
397+
385398
// ServeHTTP executes a PHP script according to the given context.
386399
func ServeHTTP(responseWriter http.ResponseWriter, request *http.Request) error {
387400
h := responseWriter.Header()

phpthread.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -173,6 +173,13 @@ func go_frankenphp_after_script_execution(threadIndex C.uintptr_t, exitStatus C.
173173
thread.Unpin()
174174
}
175175

176+
//export go_frankenphp_set_memory_peak_usage
177+
func go_frankenphp_set_memory_peak_usage(threadIndex C.uintptr_t, memoryPeakUsage C.uint64_t) {
178+
thread := phpThreads[threadIndex]
179+
fc := thread.frankenPHPContext()
180+
fc.memoryUsage = uint64(memoryPeakUsage)
181+
}
182+
176183
//export go_frankenphp_on_thread_shutdown
177184
func go_frankenphp_on_thread_shutdown(threadIndex C.uintptr_t) {
178185
thread := phpThreads[threadIndex]

0 commit comments

Comments
 (0)