Metryki Prometheus
OxPHP udostępnia metryki zgodne z Prometheus w tekstowym formacie ekspozycji pod GET /metrics na serwerze wewnętrznym. Obejmują one przepustowość żądań, czasy odpowiedzi, stan połączeń, kondycję puli workerów, buforowanie plików statycznych, wydajność kompresji oraz wydajność trybu worker.
Włączanie metryk
Ustaw INTERNAL_ADDR, aby uruchomić serwer wewnętrzny:
INTERNAL_ADDR=127.0.0.1:9090Następnie zbieraj dane z Prometheusa lub dowolnego kompatybilnego kolektora:
curl http://localhost:9090/metricsMetryki serwera
| Metric | Type | Description |
|---|---|---|
oxphp_uptime_seconds |
gauge | Liczba sekund od uruchomienia procesu serwera |
oxphp_requests_total |
counter | Łączna liczba żądań HTTP odebranych na porcie głównym |
Metryki żądań
| Metric | Type | Description |
|---|---|---|
oxphp_requests_by_method_total |
counter | Żądania według metody HTTP. Etykieta: method (GET, POST, PUT, DELETE, PATCH, HEAD, OPTIONS, CONNECT, QUERY, OTHER) |
oxphp_responses_by_status_total |
counter | Odpowiedzi według klasy statusu. Etykieta: status (1xx, 2xx, 3xx, 4xx, 5xx) |
oxphp_request_bytes_total |
counter | Łączna liczba odebranych bajtów treści żądań |
oxphp_response_bytes_total |
counter | Łączna liczba wysłanych bajtów treści odpowiedzi |
oxphp_request_cancelled_total |
counter | Anulowane żądania według przyczyny. Etykieta: reason (client_abort, timeout, shutdown). Zawsze emitowana |
Emitowane są tylko metody i klasy statusów, dla których zarejestrowano co najmniej jedno zdarzenie. Etykiety o zerowej liczbie są pomijane.
Histogram czasu trwania żądania
| Metric | Type | Description |
|---|---|---|
oxphp_request_duration_us |
histogram | Czas trwania żądania end-to-end w mikrosekundach dla wszystkich żądań (pliki statyczne i PHP) |
Granice przedziałów (mikrosekundy): 100, 500, 1000, 2500, 5000, 10000, 25000, 50000, 100000, 250000, 500000, 1000000, +Inf.
Użyj tego histogramu, aby śledzić ogólne opóźnienia, identyfikować wolne endpointy i mierzyć percentyle opóźnień ogona.
Metryki połączeń
| Metric | Type | Description |
|---|---|---|
oxphp_active_connections |
gauge | Aktualnie otwarte połączenia TCP na porcie głównym |
oxphp_pending_requests |
gauge | Żądania aktualnie skierowane do workerów PHP (w kolejce i w trakcie realizacji) |
oxphp_dropped_requests_total |
counter | Żądania, w których worker PHP zawiódł po przyjęciu żądania |
Metryki puli workerów
| Metric | Type | Description |
|---|---|---|
oxphp_workers_current |
gauge | Bieżąca liczba wątków workerów PHP |
oxphp_workers_min |
gauge | Minimalna liczba workerów (równa liczbie bieżącej w trybie statycznym) |
oxphp_workers_max |
gauge | Maksymalna liczba workerów (równa liczbie bieżącej w trybie statycznym) |
oxphp_workers_idle |
gauge | Workery, które aktualnie nie przetwarzają żadnego żądania |
oxphp_busy_workers |
gauge | Workery aktualnie przetwarzające żądanie |
oxphp_workers_spawned_total |
counter | Łączna liczba workerów utworzonych od uruchomienia (wliczając workery początkowe) |
oxphp_workers_retired_total |
counter | Łączna liczba workerów wycofanych z powodu limitu czasu bezczynności (tylko tryb dynamiczny) |
Metryki nadzorcy workerów
Obserwowalność na poziomie pojedynczego workera emitowana przez nadzorcę workerów. Każda seria niesie etykietę worker_id (indeks slotu). Pojawiają się one, gdy nadzorca śledzi stan poszczególnych workerów.
| Metric | Type | Description |
|---|---|---|
oxphp_worker_request_age_seconds |
gauge | Wiek żądania w trakcie realizacji na każdym workerze, w sekundach. Etykieta: worker_id |
oxphp_worker_long_running_total |
counter | Skany nadzorcy, które zaobserwowały żądanie starsze niż próg zablokowania. Etykieta: worker_id |
oxphp_worker_stuck_total |
counter | Licznik klasyfikacji zablokowania na workera. Etykiety: worker_id, kind (io, c_call, cpu) |
Histogram czasu oczekiwania w kolejce
| Metric | Type | Description |
|---|---|---|
oxphp_queue_wait_us |
histogram | Czas, przez jaki żądanie czeka w kolejce, zanim podejmie je worker, w mikrosekundach |
Granice przedziałów (mikrosekundy): 50, 100, 250, 500, 1000, 2500, 5000, 10000, 50000, +Inf.
Wysokie czasy oczekiwania w kolejce wskazują, że wszystkie workery są zajęte i należy zwiększyć PHP_WORKERS lub QUEUE_CAPACITY.
Metryki ograniczania liczby żądań
| Metric | Type | Description |
|---|---|---|
oxphp_rate_limited_total |
counter | Żądania odrzucone przez ogranicznik liczby żądań (zwrócono 429) |
oxphp_php_deny_total |
counter | Żądania zablokowane przez PHP_DENY_PATHS (odmowa wykonania .php). Zobacz Lista blokowania wykonywania PHP |
Metryki pamięci podręcznej plików statycznych
| Metric | Type | Description |
|---|---|---|
oxphp_static_cache_hits_total |
counter | Żądania plików statycznych obsłużone z pamięci podręcznej w pamięci operacyjnej |
oxphp_static_cache_misses_total |
counter | Żądania plików statycznych, które wymagały odczytu z dysku |
Metryki kompresji
| Metric | Type | Description |
|---|---|---|
oxphp_compressed_responses_total |
counter | Odpowiedzi skompresowane algorytmem Brotli |
oxphp_compression_bytes_saved_total |
counter | Łączna liczba bajtów zaoszczędzonych dzięki kompresji (rozmiar oryginalny minus rozmiar skompresowany) |
Metryki trybu worker
Te metryki są emitowane tylko wtedy, gdy tryb worker jest aktywny (WORKER_MODE_ENABLED=true).
Liczniki globalne
| Metric | Type | Description |
|---|---|---|
oxphp_worker_mode_enabled |
gauge | Zawsze 1, gdy tryb worker jest aktywny |
oxphp_worker_requests_handled_total |
counter | Łączna liczba żądań przetworzonych przez trwałe workery |
oxphp_worker_recycles_total |
counter | Łączna liczba recyklingów workerów (worker zakończył działanie i został ponownie uruchomiony) |
oxphp_worker_recycles_by_reason_total |
counter | Recyklingi według przyczyny. Etykieta: reason (scheduled, max_memory, error) |
oxphp_worker_soft_resets_total |
counter | Łączna liczba miękkich resetów wykonanych pomiędzy żądaniami |
Wskaźniki na poziomie workera
| Metric | Type | Description |
|---|---|---|
oxphp_worker_memory_bytes |
gauge | Bieżące zużycie sterty PHP na workera. Etykieta: worker (indeks slotu, np. "0", "1") |
oxphp_worker_uptime_seconds |
gauge | Liczba sekund od utworzenia każdego workera. Etykieta: worker |
oxphp_worker_requests_count |
gauge | Liczba żądań obsłużonych przez każdą instancję workera. Etykieta: worker |
Histogram czasu trwania żądania workera
| Metric | Type | Description |
|---|---|---|
oxphp_worker_request_duration_us |
histogram | Czas wykonania handlera PHP na żądanie w mikrosekundach (tylko tryb worker) |
Granice przedziałów (mikrosekundy): 100, 250, 500, 1000, 2500, 5000, 10000, 25000, 50000, +Inf.
Ten histogram mierzy czas spędzony wewnątrz callbacka handlera PHP, z wyłączeniem czasu oczekiwania w kolejce. Użyj go, aby identyfikować wolne handlery i śledzić opóźnienia ogona w trybie worker.
Metryki puli asynchronicznej
Te metryki wymagają ustawienia ASYNC_WORKERS na wartość niezerową, a każda ma własną bramkę emisji: liczniki pojawiają się dopiero po tym, jak co najmniej jedno zadanie zostało wysłane lub odrzucone, wskaźniki _in_flight / _in_flight_limit pojawiają się, gdy pula podłączy swój licznik zadań w trakcie realizacji, a oxphp_async_output_discarded_bytes_total pojawia się dopiero po odrzuceniu jakiegoś wyjścia.
| Metric | Type | Description |
|---|---|---|
oxphp_async_tasks_dispatched_total |
counter | Łączna liczba zadań asynchronicznych wysłanych do puli w tle |
oxphp_async_tasks_completed_total |
counter | Zadania asynchroniczne, które zakończyły się pomyślnie |
oxphp_async_tasks_failed_total |
counter | Zadania asynchroniczne, które rzuciły wyjątek |
oxphp_async_tasks_cancelled_total |
counter | Zadania asynchroniczne, które zostały anulowane |
oxphp_async_tasks_rejected_total |
counter | Zadania asynchroniczne odrzucone przy wysyłaniu — ponieważ kolejka puli była pełna lub osiągnięto limit zadań w trakcie realizacji (ASYNC_MAX_FIBERS × ASYNC_WORKERS) |
oxphp_async_tasks_stranded_total |
counter | Workery pozostawione działające po upływie limitu czasu await_race / await_any. Każde osierocone zadanie może wydłużyć RSHUTDOWN nawet o 5 sekund. |
oxphp_async_tasks_in_flight |
gauge | Zadania asynchroniczne aktualnie w kolejce lub uruchomione (emitowane, gdy pula podłączy swój licznik zadań w trakcie realizacji) |
oxphp_async_tasks_in_flight_limit |
gauge | Maksymalna liczba równoczesnych zadań asynchronicznych (ASYNC_MAX_FIBERS × ASYNC_WORKERS) |
oxphp_async_output_discarded_bytes_total |
counter | Bajty wyjścia zadań asynchronicznych odrzucone przy bezczynności workera (echo w zadaniu asynchronicznym nie ma klienta, który mógłby je odebrać) |
Wskazówki do dashboardu Grafany
Poniższe zapytania PromQL są przydatne przy budowaniu dashboardów:
Częstotliwość żądań (żądania na sekundę):
rate(oxphp_requests_total[5m])Średni czas odpowiedzi (milisekundy):
rate(oxphp_request_duration_us_sum[5m])
/ rate(oxphp_requests_total[5m]) / 1000Czas trwania żądania p99 (milisekundy):
histogram_quantile(0.99, rate(oxphp_request_duration_us_bucket[5m])) / 1000Częstotliwość błędów (odpowiedzi 5xx jako procent):
rate(oxphp_responses_by_status_total{status="5xx"}[5m])
/ rate(oxphp_requests_total[5m]) * 100Wykorzystanie puli workerów:
oxphp_busy_workers / oxphp_workers_currentNasycenie kolejki (częstotliwość odrzuceń na sekundę):
rate(oxphp_dropped_requests_total[5m])Czas oczekiwania w kolejce p99 (mikrosekundy):
histogram_quantile(0.99, rate(oxphp_queue_wait_us_bucket[5m]))Współczynnik trafień pamięci podręcznej plików statycznych:
rate(oxphp_static_cache_hits_total[5m])
/ (rate(oxphp_static_cache_hits_total[5m]) + rate(oxphp_static_cache_misses_total[5m]))Bajty zaoszczędzone dzięki kompresji na sekundę:
rate(oxphp_compression_bytes_saved_total[5m])Opóźnienie p99 trybu worker (mikrosekundy):
histogram_quantile(0.99, rate(oxphp_worker_request_duration_us_bucket[5m]))Częstotliwość recyklingu workerów (na minutę):
rate(oxphp_worker_recycles_total[5m]) * 60Średnie zużycie pamięci przez workera:
avg(oxphp_worker_memory_bytes)Konfiguracja scrape'owania Prometheus
Dodaj zadanie scrape'owania do swojego pliku prometheus.yml:
scrape_configs:
- job_name: "oxphp"
scrape_interval: 15s
static_configs:
- targets: ["oxphp:9090"]Dla wykrywania usług w Kubernetes:
scrape_configs:
- job_name: "oxphp"
kubernetes_sd_configs:
- role: pod
relabel_configs:
- source_labels: [__meta_kubernetes_pod_label_app]
regex: oxphp
action: keep
- source_labels: [__meta_kubernetes_pod_ip]
target_label: __address__
replacement: "$1:9090"Zobacz również
- Kontrole stanu — endpointy
/healthi/configna serwerze wewnętrznym - Dokumentacja konfiguracji — wszystkie zmienne środowiskowe, w tym
INTERNAL_ADDR - Łagodne zamknięcie — jak drenowanie połączeń wpływa na
oxphp_active_connections - Tryb worker — trwałe workery i emitowane przez nie metryki