@@ -1157,3 +1157,104 @@ func TestDisabledMetrics(t *testing.T) {
11571157 require .NoError (t , err , "failed to count metrics" )
11581158 require .Zero (t , count , "metrics should be missing" )
11591159}
1160+
1161+ func TestWorkerRestart (t * testing.T ) {
1162+ var wg sync.WaitGroup
1163+ tester := caddytest .NewTester (t )
1164+ tester .InitServer (`
1165+ {
1166+ skip_install_trust
1167+ admin localhost:2999
1168+ http_port ` + testPort + `
1169+ https_port 9443
1170+
1171+ metrics
1172+ frankenphp {
1173+ worker {
1174+ name service
1175+ file ../testdata/worker-restart.php
1176+ num 1
1177+ # restart every 3 requests
1178+ env EVERY 3
1179+ }
1180+ }
1181+ }
1182+
1183+ localhost:` + testPort + ` {
1184+ route {
1185+ php {
1186+ root ../testdata
1187+ }
1188+ }
1189+ }
1190+ ` , "caddyfile" )
1191+
1192+ ctx := caddy .ActiveContext ()
1193+
1194+ resp , err := http .Get ("http://localhost:2999/metrics" )
1195+ require .NoError (t , err , "failed to fetch metrics" )
1196+ defer resp .Body .Close ()
1197+
1198+ // Read and parse metrics
1199+ metrics := new (bytes.Buffer )
1200+ _ , err = metrics .ReadFrom (resp .Body )
1201+ require .NoError (t , err , "failed to read metrics" )
1202+
1203+ // frankenphp_worker_restarts should be missing
1204+ count , err := testutil .GatherAndCount (
1205+ ctx .GetMetricsRegistry (),
1206+ "frankenphp_worker_restarts" ,
1207+ )
1208+ require .NoError (t , err , "failed to count metrics" )
1209+ require .Zero (t , count , "metrics should be missing" )
1210+
1211+ // Check metrics
1212+ expectedMetrics := `
1213+ # HELP frankenphp_ready_workers Running workers that have successfully called frankenphp_handle_request at least once
1214+ # TYPE frankenphp_ready_workers gauge
1215+ frankenphp_ready_workers{worker="service"} 1
1216+ # HELP frankenphp_total_workers Total number of PHP workers for this worker
1217+ # TYPE frankenphp_total_workers gauge
1218+ frankenphp_total_workers{worker="service"} 1
1219+ `
1220+
1221+ require .NoError (t ,
1222+ testutil .GatherAndCompare (
1223+ ctx .GetMetricsRegistry (),
1224+ strings .NewReader (expectedMetrics ),
1225+ "frankenphp_total_workers" ,
1226+ "frankenphp_ready_workers" ,
1227+ ))
1228+
1229+ // Make some requests
1230+ for i := 0 ; i < 10 ; i ++ {
1231+ wg .Add (1 )
1232+ go func (i int ) {
1233+ tester .AssertGetResponse (fmt .Sprintf ("http://localhost:" + testPort + "/worker-restart.php?i=%d" , i ), http .StatusOK , fmt .Sprintf ("Counter (%d)" , i ))
1234+ wg .Done ()
1235+ }(i )
1236+ }
1237+ wg .Wait ()
1238+
1239+ // frankenphp_ready_workers should be back to 1 even after worker restarts
1240+ expectedMetrics = `
1241+ # HELP frankenphp_ready_workers Running workers that have successfully called frankenphp_handle_request at least once
1242+ # TYPE frankenphp_ready_workers gauge
1243+ frankenphp_ready_workers{worker="service"} 1
1244+ # HELP frankenphp_total_workers Total number of PHP workers for this worker
1245+ # TYPE frankenphp_total_workers gauge
1246+ frankenphp_total_workers{worker="service"} 1
1247+ # HELP frankenphp_worker_restarts Number of PHP worker restarts for this worker
1248+ # TYPE frankenphp_worker_restarts counter
1249+ frankenphp_worker_restarts{worker="service"} 3
1250+ `
1251+
1252+ require .NoError (t ,
1253+ testutil .GatherAndCompare (
1254+ ctx .GetMetricsRegistry (),
1255+ strings .NewReader (expectedMetrics ),
1256+ "frankenphp_total_workers" ,
1257+ "frankenphp_ready_workers" ,
1258+ "frankenphp_worker_restarts" ,
1259+ ))
1260+ }
0 commit comments