fix negative frankenphp_ready_workers metrics (#1491)

This commit is contained in:
Indra Gunawan
2025-05-01 08:05:23 +08:00
committed by GitHub
parent 6f1b4f3bae
commit a6e1d3554d
3 changed files with 118 additions and 0 deletions

View File

@@ -1052,3 +1052,104 @@ func TestDisabledMetrics(t *testing.T) {
require.NoError(t, err, "failed to count metrics")
require.Zero(t, count, "metrics should be missing")
}
func TestWorkerRestart(t *testing.T) {
var wg sync.WaitGroup
tester := caddytest.NewTester(t)
tester.InitServer(`
{
skip_install_trust
admin localhost:2999
http_port `+testPort+`
https_port 9443
metrics
frankenphp {
worker {
name service
file ../testdata/worker-restart.php
num 1
# restart every 3 requests
env EVERY 3
}
}
}
localhost:`+testPort+` {
route {
php {
root ../testdata
}
}
}
`, "caddyfile")
ctx := caddy.ActiveContext()
resp, err := http.Get("http://localhost:2999/metrics")
require.NoError(t, err, "failed to fetch metrics")
defer resp.Body.Close()
// Read and parse metrics
metrics := new(bytes.Buffer)
_, err = metrics.ReadFrom(resp.Body)
require.NoError(t, err, "failed to read metrics")
// frankenphp_worker_restarts should be missing
count, err := testutil.GatherAndCount(
ctx.GetMetricsRegistry(),
"frankenphp_worker_restarts",
)
require.NoError(t, err, "failed to count metrics")
require.Zero(t, count, "metrics should be missing")
// Check metrics
expectedMetrics := `
# HELP frankenphp_ready_workers Running workers that have successfully called frankenphp_handle_request at least once
# TYPE frankenphp_ready_workers gauge
frankenphp_ready_workers{worker="service"} 1
# HELP frankenphp_total_workers Total number of PHP workers for this worker
# TYPE frankenphp_total_workers gauge
frankenphp_total_workers{worker="service"} 1
`
require.NoError(t,
testutil.GatherAndCompare(
ctx.GetMetricsRegistry(),
strings.NewReader(expectedMetrics),
"frankenphp_total_workers",
"frankenphp_ready_workers",
))
// Make some requests
for i := 0; i < 10; i++ {
wg.Add(1)
go func(i int) {
tester.AssertGetResponse(fmt.Sprintf("http://localhost:"+testPort+"/worker-restart.php?i=%d", i), http.StatusOK, fmt.Sprintf("Counter (%d)", i))
wg.Done()
}(i)
}
wg.Wait()
// frankenphp_ready_workers should be back to 1 even after worker restarts
expectedMetrics = `
# HELP frankenphp_ready_workers Running workers that have successfully called frankenphp_handle_request at least once
# TYPE frankenphp_ready_workers gauge
frankenphp_ready_workers{worker="service"} 1
# HELP frankenphp_total_workers Total number of PHP workers for this worker
# TYPE frankenphp_total_workers gauge
frankenphp_total_workers{worker="service"} 1
# HELP frankenphp_worker_restarts Number of PHP worker restarts for this worker
# TYPE frankenphp_worker_restarts counter
frankenphp_worker_restarts{worker="service"} 3
`
require.NoError(t,
testutil.GatherAndCompare(
ctx.GetMetricsRegistry(),
strings.NewReader(expectedMetrics),
"frankenphp_total_workers",
"frankenphp_ready_workers",
"frankenphp_worker_restarts",
))
}

13
testdata/worker-restart.php vendored Normal file
View File

@@ -0,0 +1,13 @@
<?php
$fn = static function () {
echo sprintf("Counter (%s)", $_GET['i'] ?? 'i not set');
};
$loopMax = $_SERVER['EVERY'] ?? 10;
$loops = 0;
do {
$ret = \frankenphp_handle_request($fn);
} while ($ret && (-1 === $loopMax || ++$loops < $loopMax));
exit(0);

View File

@@ -77,6 +77,10 @@ func setupWorkerScript(handler *workerThread, worker *worker) {
handler.backoff.wait()
metrics.StartWorker(worker.name)
if handler.state.is(stateReady) {
metrics.ReadyWorker(handler.worker.name)
}
// Create a dummy request to set up the worker
fc, err := newDummyContext(
filepath.Base(worker.fileName),