PHPackages                             fogeto/laravel-server-orchestrator - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Logging &amp; Monitoring](/categories/logging)
4. /
5. fogeto/laravel-server-orchestrator

ActiveLibrary[Logging &amp; Monitoring](/categories/logging)

fogeto/laravel-server-orchestrator
==================================

Laravel Prometheus monitoring package for multi-project server orchestration. Compatible with Laravel 9-12.

v1.0.8(2mo ago)1487↓25%MITPHPPHP ^8.0

Since Feb 10Pushed 2mo agoCompare

[ Source](https://github.com/fogeto/laravel-server-orchestrator)[ Packagist](https://packagist.org/packages/fogeto/laravel-server-orchestrator)[ RSS](/packages/fogeto-laravel-server-orchestrator/feed)WikiDiscussions main Synced 1mo ago

READMEChangelog (1)Dependencies (16)Versions (10)Used By (0)

Laravel Server Orchestrator
===========================

[](#laravel-server-orchestrator)

[![Laravel 9.x-12.x](https://camo.githubusercontent.com/0e7c8fcc5ec17df765bf4888fc548bdd7237058d951427b900967440cfb303d6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c61726176656c2d392e782d2d31322e782d7265642e737667)](https://laravel.com)[![PHP 8.0+](https://camo.githubusercontent.com/d4b5fa4adf514144779a7864904c5e15236c0e798635240c7f6ce9a455657b80/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f5048502d382e302532422d626c75652e737667)](https://php.net)[![License: MIT](https://camo.githubusercontent.com/784362b26e4b3546254f1893e778ba64616e362bd6ac791991d2c9e880a3a64e/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d677265656e2e737667)](LICENSE)

Laravel 9, 10, 11 ve 12 ile uyumlu, **çoklu proje destekli** Prometheus monitoring paketi.

Aynı Redis sunucusunu paylaşan birden fazla Laravel projesini güvenle izlemenizi sağlar. Her projeye özel Redis key prefix'i ile verilerin karışması önlenir.

---

İçindekiler
-----------

[](#i̇çindekiler)

- [Özellikler](#%C3%B6zellikler)
- [Gereksinimler](#gereksinimler)
- [Kurulum](#kurulum)
    - [Yeni Proje (Sıfırdan Kurulum)](#yeni-proje-s%C4%B1f%C4%B1rdan-kurulum)
    - [Mevcut Proje (Eski Entegrasyondan Geçiş)](#mevcut-proje-eski-entegrasyondan-ge%C3%A7i%C5%9F)
- [Kullanım](#kullan%C4%B1m)
    - [Metrikleri Görüntüleme](#metrikleri-g%C3%B6r%C3%BCnt%C3%BCleme)
    - [Metrikleri Temizleme (Wipe)](#metrikleri-temizleme-wipe)
- [Toplanan Metrikler](#toplanan-metrikler)
    - [HTTP Metrikleri (Otomatik)](#http-metrikleri-otomatik)
    - [Sistem Metrikleri](#sistem-metrikleri)
- [Konfigürasyon](#konfig%C3%BCrasyon)
    - [Tüm .env Değişkenleri](#t%C3%BCm-env-de%C4%9Fi%C5%9Fkenleri)
    - [Prefix (Redis Key İzolasyonu)](#prefix-redis-key-izolasyonu)
    - [Middleware Ayarları](#middleware-ayarlar%C4%B1)
    - [Route Ayarları](#route-ayarlar%C4%B1)
    - [Histogram Bucket'ları](#histogram-bucketlar%C4%B1)
    - [Sistem Metrikleri Açma/Kapama](#sistem-metrikleri-a%C3%A7makapama)
- [Çoklu Proje Yapılandırması](#%C3%A7oklu-proje-yap%C4%B1land%C4%B1rmas%C4%B1)
- [Özel Metrik Ekleme](#%C3%B6zel-metrik-ekleme)
- [Route Koruma (Güvenlik)](#route-koruma-g%C3%BCvenlik)
- [Prometheus &amp; Grafana Entegrasyonu](#prometheus--grafana-entegrasyonu)
- [Sorun Giderme (SSS)](#sorun-giderme-sss)
- [Lisans](#lisans)

---

Özellikler
----------

[](#özellikler)

ÖzellikAçıklama🔑 **Redis Key İzolasyonu**Her proje için benzersiz prefix (`prometheus:{prefix}:*`)📊 **Otomatik HTTP Metrikleri**Request duration histogram, toplam istek sayacı, hata sayacı🖥️ **Sistem Metrikleri**PHP info, memory, uptime, DB connections, OPcache, health🔄 **Laravel 9-12 Desteği**Tek paket, tüm sürümlerle uyumlu⚡ **Sıfır Konfigürasyon**Kurup çalıştırın, ihtiyaç olursa her şey özelleştirilebilir🚫 **Wildcard Path Ignore**Telescope, Horizon, metrics gibi yolları izlemekten hariç tutun🧹 **Otomatik Migrasyon**Eski inline entegrasyonu tek komutla temizleyin---

Gereksinimler
-------------

[](#gereksinimler)

PaketVersiyonPHP^8.0Laravel^9.0 | ^10.0 | ^11.0 | ^12.0predis/predis^2.0 | ^3.0promphp/prometheus\_client\_php^2.2Redis sunucusuÇalışır durumda olmalı> **Not:** `predis/predis` ve `promphp/prometheus_client_php` otomatik olarak yüklenir. Ekstra bir şey kurmanız gerekmez.

---

Kurulum
-------

[](#kurulum)

### Yeni Proje (Sıfırdan Kurulum)

[](#yeni-proje-sıfırdan-kurulum)

Projenizde daha önce Prometheus entegrasyonu yoksa bu adımları takip edin.

#### Adım 1 — Repository Tanımlayın

[](#adım-1--repository-tanımlayın)

Paket henüz Packagist'te yayınlanmadığı için projenizin `composer.json` dosyasına repository eklemeniz gerekiyor.

**Yöntem A — Lokal Path (Geliştirme ortamı):**

Paket reposu bilgisayarınızda mevcutsa:

```
{
    "repositories": [
        {
            "type": "path",
            "url": "../laravel-server-orchestrator"
        }
    ]
}
```

> `url` değerini paket klasörünün **göreceli yoluna** göre düzenleyin.

**Yöntem B — GitHub VCS (Sunucu / production ortamı):**

```
{
    "repositories": [
        {
            "type": "vcs",
            "url": "https://github.com/fogeto/laravel-server-orchestrator"
        }
    ]
}
```

> Private repo ise sunucuda GitHub token / SSH key yapılandırması gerekir.

#### Adım 2 — Paketi Yükleyin

[](#adım-2--paketi-yükleyin)

```
# Path repository için:
composer require fogeto/laravel-server-orchestrator:@dev

# VCS repository için:
composer require fogeto/laravel-server-orchestrator:dev-main
```

> Laravel'in paket auto-discovery özelliği sayesinde ServiceProvider **otomatik** olarak kaydedilir. Ekstra bir kayıt yapmanıza gerek yoktur.

#### Adım 3 — `.env` Dosyasına Prefix Ekleyin

[](#adım-3--env-dosyasına-prefix-ekleyin)

```
ORCHESTRATOR_PREFIX=projenizin_adi
```

> ⚠️ **ZORUNLU:** Aynı Redis sunucusunu paylaşan projeler **farklı prefix** kullanmalıdır.
>
> Örnekler: `ikbackend`, `hrportal`, `crm`, `ecommerce`

#### Adım 4 — Config Dosyasını Yayınlayın (Opsiyonel)

[](#adım-4--config-dosyasını-yayınlayın-opsiyonel)

Varsayılan ayarlar çoğu proje için yeterlidir. Özelleştirmek isterseniz:

```
php artisan vendor:publish --tag=server-orchestrator-config
```

Bu komut `config/server-orchestrator.php` dosyasını oluşturur.

#### Adım 5 — Doğrulama

[](#adım-5--doğrulama)

```
# Route'ların kayıt olduğunu kontrol edin
php artisan route:list --path=metrics
```

Şu çıktıyı görmelisiniz:

```
GET|HEAD  api/metrics ........ Fogeto\ServerOrchestrator\Http\Controllers\MetricsController@index
POST      api/wipe-metrics ... Fogeto\ServerOrchestrator\Http\Controllers\MetricsController@wipe

```

**Bu kadar!** 🎉 Artık `/api/metrics` adresinden metriklere erişebilirsiniz.

---

### Mevcut Proje (Eski Entegrasyondan Geçiş)

[](#mevcut-proje-eski-entegrasyondan-geçiş)

Projenizde daha önce **inline** (elle yazılmış) Prometheus entegrasyonu varsa, `orchestrator:migrate` komutu eski dosyaları otomatik temizler.

#### Adım 1 — Repository Tanımlayın ve Paketi Yükleyin

[](#adım-1--repository-tanımlayın-ve-paketi-yükleyin)

Yukarıdaki [Yeni Proje — Adım 1](#ad%C4%B1m-1--repository-tan%C4%B1mlay%C4%B1n) ve [Adım 2](#ad%C4%B1m-2--paketi-y%C3%BCkleyin) bölümlerini uygulayın.

#### Adım 2 — Neler Değişeceğini Görün (Dry Run)

[](#adım-2--neler-değişeceğini-görün-dry-run)

```
php artisan orchestrator:migrate --dry-run
```

Bu komut hiçbir değişiklik yapmaz, sadece **ne yapacağını** gösterir:

```
╔══════════════════════════════════════════════════════════════╗
║       Server Orchestrator — Inline Migration Tool          ║
╚══════════════════════════════════════════════════════════════╝

⚡ DRY-RUN modu — hiçbir değişiklik yapılmayacak.

🔍 Eski entegrasyon dosyaları taranıyor...

Bulunan eski entegrasyon bileşenleri:
+----------+------------------------------------------+-----------------------------+
| Tür      | Konum                                    | Açıklama                    |
+----------+------------------------------------------+-----------------------------+
| Dosya    | app/Core/PredisAdapter.php               | Eski PredisAdapter          |
| Dosya    | app/Http/Middleware/PrometheusMiddleware  | Eski PrometheusMiddleware   |
| Dosya    | app/Providers/PrometheusServiceProvider   | Eski ServiceProvider        |
| Referans | app/Http/Kernel.php                      | PrometheusMiddleware ref.   |
| Referans | config/app.php                           | Eski provider kaydı         |
| Referans | routes/api.php                           | Inline metrics route'ları   |
| Eksik    | .env                                     | ORCHESTRATOR_PREFIX yok     |
+----------+------------------------------------------+-----------------------------+

```

#### Adım 3 — Migrasyonu Çalıştırın

[](#adım-3--migrasyonu-çalıştırın)

```
php artisan orchestrator:migrate --prefix=projenizin_adi
```

Komut otomatik olarak şunları yapar:

İşlemDetay🗑️ Eski dosyaları siler`PredisAdapter.php`, `PrometheusMiddleware.php`, `PrometheusServiceProvider.php`🧹 Kernel.php temizlerEski middleware referansını kaldırır🧹 config/app.php temizlerEski provider kaydını kaldırır🧹 config/services.php temizlerPrometheus config bloğunu kaldırır🧹 routes/api.php temizlerInline metrics route tanımlarını kaldırır➕ .env günceller`ORCHESTRATOR_PREFIX=...` ekler📄 Config publish eder`config/server-orchestrator.php` oluşturur#### Adım 4 — Temizlik Sonrası

[](#adım-4--temizlik-sonrası)

```
composer dump-autoload
php artisan config:clear
php artisan route:list --path=metrics
```

#### Komut Seçenekleri

[](#komut-seçenekleri)

SeçenekAçıklamaÖrnek`--prefix=`Prometheus prefix'i belirle`--prefix=ikbackend``--dry-run`Değişiklik yapmadan ne yapacağını göster`--dry-run``--force`Onay sormadan çalıştır (CI/CD için)`--force````
# Tam otomatik (CI/CD ortamı)
php artisan orchestrator:migrate --prefix=myapp --force

# Önce bak, sonra çalıştır
php artisan orchestrator:migrate --dry-run
php artisan orchestrator:migrate --prefix=myapp
```

---

Kullanım
--------

[](#kullanım)

### Metrikleri Görüntüleme

[](#metrikleri-görüntüleme)

```
# curl ile
curl http://localhost:8000/api/metrics

# PowerShell ile
Invoke-RestMethod -Uri http://localhost:8000/api/metrics

# Tarayıcıdan
# http://localhost:8000/api/metrics
```

### Metrikleri Temizleme (Wipe)

[](#metrikleri-temizleme-wipe)

Tüm Redis'teki metrik verilerini sıfırlar. Test/geliştirme ortamında kullanışlıdır.

```
curl -X POST http://localhost:8000/api/wipe-metrics
```

Yanıt:

```
{
    "success": true,
    "message": "All metrics have been wiped."
}
```

---

Toplanan Metrikler
------------------

[](#toplanan-metrikler)

### HTTP Metrikleri (Otomatik)

[](#http-metrikleri-otomatik)

Middleware tarafından her API isteğinde otomatik olarak kaydedilir.

MetrikTipAçıklama`http_request_duration_seconds`Histogramİstek süresi (saniye)`http_requests_total`CounterToplam istek sayısı`http_errors_total`CounterToplam hata sayısı (4xx + 5xx)**Label'lar:**

LabelAçıklamaÖrnek`code`HTTP durum kodu`200`, `404`, `500``method`HTTP metodu`GET`, `POST`, `PUT``controller`Controller adı`UserController``action`Method adı`index`, `store``endpoint`Normalize edilmiş URI`/api/users/{id}`> **Not:** Endpoint'lerdeki UUID ve sayısal ID'ler otomatik olarak `{uuid}` ve `{id}` ile değiştirilir. Bu, kardinellik sorununu önler.

#### Örnek HTTP Metrikleri Çıktısı

[](#örnek-http-metrikleri-çıktısı)

```
# HELP http_request_duration_seconds The duration of HTTP requests processed by a Laravel application.
# TYPE http_request_duration_seconds histogram
http_request_duration_seconds_bucket{code="200",method="GET",controller="UserController",action="index",endpoint="/api/users",le="0.005"} 12
http_request_duration_seconds_bucket{code="200",method="GET",controller="UserController",action="index",endpoint="/api/users",le="0.01"} 38
http_request_duration_seconds_bucket{code="200",method="GET",controller="UserController",action="index",endpoint="/api/users",le="0.025"} 45
http_request_duration_seconds_bucket{code="200",method="GET",controller="UserController",action="index",endpoint="/api/users",le="+Inf"} 50
http_request_duration_seconds_sum{code="200",method="GET",controller="UserController",action="index",endpoint="/api/users"} 12.345
http_request_duration_seconds_count{code="200",method="GET",controller="UserController",action="index",endpoint="/api/users"} 50

# HELP http_requests_total Total number of HTTP requests.
# TYPE http_requests_total counter
http_requests_total{code="200",method="GET",controller="UserController",action="index",endpoint="/api/users"} 50
http_requests_total{code="404",method="GET",controller="UserController",action="show",endpoint="/api/users/{id}"} 3

```

### Sistem Metrikleri

[](#sistem-metrikleri)

`/api/metrics` endpoint'i her çağrıldığında anlık olarak hesaplanır.

MetrikTipAçıklama`php_info`GaugePHP versiyonu (label: `version`)`process_uptime_seconds`GaugeProses çalışma süresi`process_memory_usage_bytes`GaugeAnlık bellek kullanımı`process_memory_peak_bytes`GaugeEn yüksek bellek kullanımı`db_connections_active`GaugeAktif MySQL bağlantı sayısı`db_connections_max`GaugeMaksimum bağlantı limiti`php_opcache_enabled`GaugeOPcache durumu (1/0)`php_opcache_hit_rate`GaugeOPcache hit oranı (%)`php_opcache_memory_used_bytes`GaugeOPcache bellek kullanımı`app_health_status`GaugeUygulama sağlığı (1=UP, 0=DOWN)> **Not:** `app_health_status` veritabanı bağlantısını kontrol eder. MySQL çalışmıyorsa `0` döner. Bağlantı testi için `fsockopen()` ile 2 saniyelik TCP timeout kullanılır, bu sayede DB timeout'ları metrik endpoint'ini yavaşlatmaz.

---

Konfigürasyon
-------------

[](#konfigürasyon)

Config dosyasını publish ettikten sonra `config/server-orchestrator.php` üzerinden tüm ayarları özelleştirebilirsiniz.

### Tüm .env Değişkenleri

[](#tüm-env-değişkenleri)

DeğişkenVarsayılanAçıklama`ORCHESTRATOR_ENABLED``true`Metrikleri tamamen açma/kapama`ORCHESTRATOR_PREFIX``APP_NAME`Redis key prefix'i (projeye özel)`ORCHESTRATOR_REDIS_CONNECTION``default`Kullanılacak Redis bağlantısı`ORCHESTRATOR_ROUTE_PREFIX``api`Metrik route'larının URL prefix'i### Prefix (Redis Key İzolasyonu)

[](#prefix-redis-key-i̇zolasyonu)

Her projeye benzersiz bir prefix verin. Redis'teki key formatı:

```
{laravel_prefix}prometheus:{ORCHESTRATOR_PREFIX}:{type}:{metric_name}

```

Örnek (`ORCHESTRATOR_PREFIX=ikbackend`):

```
laravel_database_prometheus:ikbackend:gauges:php_info
laravel_database_prometheus:ikbackend:counters:http_requests_total
laravel_database_prometheus:ikbackend:histograms:http_request_duration_seconds

```

### Middleware Ayarları

[](#middleware-ayarları)

```
// config/server-orchestrator.php

'middleware' => [
    // Middleware'i tamamen devre dışı bırak (HTTP metrikleri toplanmaz)
    'enabled' => true,

    // Hangi middleware gruplarına eklenecek
    // Laravel 9-10: app/Http/Kernel.php'deki grup adları
    // Laravel 11-12: bootstrap/app.php'deki grup adları
    'groups' => ['api'],

    // Bu path'lerden gelen istekler izlenmez
    // Wildcard (*) desteği vardır
    'ignore_paths' => [
        'api/metrics',
        'metrics',
        'api/wipe-metrics',
        'wipe-metrics',
        'telescope/*',      // Telescope istekleri
        'horizon/*',        // Horizon istekleri
        // 'api/health',    // Custom health check
    ],
],
```

### Route Ayarları

[](#route-ayarları)

```
'routes' => [
    // Route'ları otomatik kayıt et (false = kendi route'larınızı tanımlayın)
    'enabled' => true,

    // URL prefix'i: 'api' → /api/metrics, '' → /metrics
    'prefix' => env('ORCHESTRATOR_ROUTE_PREFIX', 'api'),

    // Route'a uygulanacak middleware'ler (güvenlik için)
    'middleware' => [],
    // Örnekler:
    // 'middleware' => ['auth:sanctum'],
    // 'middleware' => ['throttle:10,1'],
    // 'middleware' => [App\Http\Middleware\IpWhitelist::class],
],
```

### Histogram Bucket'ları

[](#histogram-bucketları)

İstek sürelerini gruplamak için kullanılan eşik değerleri (saniye cinsinden):

```
'histogram_buckets' => [
    0.005,  // 5ms
    0.01,   // 10ms
    0.025,  // 25ms
    0.05,   // 50ms
    0.1,    // 100ms
    0.25,   // 250ms
    0.5,    // 500ms
    1.0,    // 1s
    2.5,    // 2.5s
    5.0,    // 5s
    10.0,   // 10s
    30.0,   // 30s
],
```

> **İpucu:** API response süreleriniz genellikle 100ms altındaysa, düşük bucket'lar (`0.001`, `0.0025`) ekleyerek daha hassas ölçüm yapabilirsiniz.

### Sistem Metrikleri Açma/Kapama

[](#sistem-metrikleri-açmakapama)

İhtiyacınız olmayan metrikleri devre dışı bırakabilirsiniz:

```
'system_metrics' => [
    'php_info'  => true,   // PHP versiyon bilgisi
    'memory'    => true,   // Bellek kullanımı
    'uptime'    => true,   // Proses çalışma süresi
    'database'  => true,   // MySQL bağlantı metrikleri (SHOW STATUS)
    'opcache'   => true,   // OPcache istatistikleri
    'health'    => true,   // Uygulama sağlık durumu
],
```

---

Çoklu Proje Yapılandırması
--------------------------

[](#çoklu-proje-yapılandırması)

### Senaryo: 3 Laravel Projesi, 1 Redis Sunucusu

[](#senaryo-3-laravel-projesi-1-redis-sunucusu)

```
# Proje 1 — IK Backend (.env)
ORCHESTRATOR_PREFIX=ikbackend

# Proje 2 — HR Portal (.env)
ORCHESTRATOR_PREFIX=hrportal

# Proje 3 — CRM (.env)
ORCHESTRATOR_PREFIX=crm
```

Redis'teki key yapısı:

```
prometheus:ikbackend:gauges:php_info
prometheus:ikbackend:counters:http_requests_total
prometheus:ikbackend:histograms:http_request_duration_seconds

prometheus:hrportal:gauges:php_info
prometheus:hrportal:counters:http_requests_total

prometheus:crm:gauges:php_info
prometheus:crm:counters:http_requests_total

```

### Prometheus Scrape Config (Tüm Projeler)

[](#prometheus-scrape-config-tüm-projeler)

```
# prometheus.yml
scrape_configs:
  - job_name: 'ikbackend'
    metrics_path: '/api/metrics'
    scrape_interval: 15s
    static_configs:
      - targets: ['ikbackend.example.com']

  - job_name: 'hrportal'
    metrics_path: '/api/metrics'
    scrape_interval: 15s
    static_configs:
      - targets: ['hrportal.example.com']

  - job_name: 'crm'
    metrics_path: '/api/metrics'
    scrape_interval: 15s
    static_configs:
      - targets: ['crm.example.com']
```

---

Özel Metrik Ekleme
------------------

[](#özel-metrik-ekleme)

Paket, `CollectorRegistry` singleton'ını IoC container'a kaydeder. Kendi metriklerinizi istediğiniz yerde ekleyebilirsiniz:

### Counter (Sayaç)

[](#counter-sayaç)

```
use Prometheus\CollectorRegistry;

$registry = app(CollectorRegistry::class);

$counter = $registry->getOrRegisterCounter(
    'app',                    // Namespace
    'orders_total',           // Metrik adı
    'Total orders placed',    // Açıklama
    ['status']                // Label'lar
);

$counter->inc(['completed']);     // +1
$counter->incBy(5, ['pending']); // +5
```

### Gauge (Anlık Değer)

[](#gauge-anlık-değer)

```
$gauge = $registry->getOrRegisterGauge(
    'app', 'queue_size', 'Current queue size', ['queue']
);

$gauge->set(42, ['default']);     // Değeri ata
$gauge->inc(['emails']);          // +1
$gauge->decBy(3, ['exports']);    // -3
```

### Histogram (Dağılım)

[](#histogram-dağılım)

```
$histogram = $registry->getOrRegisterHistogram(
    'app',
    'payment_duration_seconds',
    'Payment processing time',
    ['gateway'],                    // Label'lar
    [0.1, 0.25, 0.5, 1, 2.5, 5]   // Bucket'lar
);

$histogram->observe(0.35, ['stripe']);
$histogram->observe(1.2, ['paypal']);
```

### Job/Queue Metriği Örneği

[](#jobqueue-metriği-örneği)

```
// app/Jobs/ProcessPayment.php
class ProcessPayment implements ShouldQueue
{
    public function handle(): void
    {
        $start = microtime(true);

        // ... iş mantığı ...

        $duration = microtime(true) - $start;

        $histogram = app(CollectorRegistry::class)->getOrRegisterHistogram(
            'app', 'job_duration_seconds', 'Job processing time',
            ['job'], [0.1, 0.5, 1, 5, 30, 60]
        );
        $histogram->observe($duration, ['process_payment']);
    }
}
```

---

Route Koruma (Güvenlik)
-----------------------

[](#route-koruma-güvenlik)

Metrics endpoint'ini production'da dışarıya açık bırakmayın!

### Yöntem 1: Auth Middleware

[](#yöntem-1-auth-middleware)

```
// config/server-orchestrator.php
'routes' => [
    'middleware' => ['auth:sanctum'],
],
```

### Yöntem 2: IP Kısıtlama

[](#yöntem-2-ip-kısıtlama)

```
// app/Http/Middleware/MetricsIpWhitelist.php
class MetricsIpWhitelist
{
    public function handle(Request $request, Closure $next): Response
    {
        $allowed = ['127.0.0.1', '10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16'];

        foreach ($allowed as $ip) {
            if ($request->ip() === $ip) {
                return $next($request);
            }
        }

        abort(403, 'Forbidden');
    }
}

// config/server-orchestrator.php
'routes' => [
    'middleware' => [\App\Http\Middleware\MetricsIpWhitelist::class],
],
```

### Yöntem 3: Route'ları Devre Dışı Bırakıp Kendiniz Tanımlama

[](#yöntem-3-routeları-devre-dışı-bırakıp-kendiniz-tanımlama)

```
// config/server-orchestrator.php
'routes' => [
    'enabled' => false, // Paketin route'larını kapat
],

// routes/api.php — Kendi tanımınız
Route::middleware(['auth:sanctum'])->group(function () {
    Route::get('/metrics', [\Fogeto\ServerOrchestrator\Http\Controllers\MetricsController::class, 'index']);
    Route::post('/wipe-metrics', [\Fogeto\ServerOrchestrator\Http\Controllers\MetricsController::class, 'wipe']);
});
```

---

Prometheus &amp; Grafana Entegrasyonu
-------------------------------------

[](#prometheus--grafana-entegrasyonu)

### Prometheus Scrape Config

[](#prometheus-scrape-config)

```
# prometheus.yml
scrape_configs:
  - job_name: 'laravel-app'
    metrics_path: '/api/metrics'
    scrape_interval: 15s
    static_configs:
      - targets: ['your-app.example.com']
    # Auth gerekiyorsa:
    # bearer_token: 'your-token'
```

### Faydalı Grafana Sorguları (PromQL)

[](#faydalı-grafana-sorguları-promql)

```
# Son 5 dakikadaki ortalama response süresi
rate(http_request_duration_seconds_sum[5m]) / rate(http_request_duration_seconds_count[5m])

# Saniyedeki istek sayısı (RPS)
rate(http_requests_total[5m])

# p95 response süresi
histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m]))

# p99 response süresi
histogram_quantile(0.99, rate(http_request_duration_seconds_bucket[5m]))

# Hata oranı (%)
rate(http_errors_total[5m]) / rate(http_requests_total[5m]) * 100

# En yavaş endpoint'ler (p95)
histogram_quantile(0.95, sum(rate(http_request_duration_seconds_bucket[5m])) by (endpoint, le))

# Bellek kullanımı (MB)
process_memory_usage_bytes / 1024 / 1024

# Uygulama sağlık durumu
app_health_status

```

---

Sorun Giderme (SSS)
-------------------

[](#sorun-giderme-sss)

### 1. Metriklerde sadece sistem metrikleri var, HTTP metrikleri yok

[](#1-metriklerde-sadece-sistem-metrikleri-var-http-metrikleri-yok)

**Sebep:** Wipe sonrası henüz bir HTTP isteği yapılmamıştır.

**Çözüm:** HTTP metrikleri middleware tarafından istek sırasında kaydedilir. Herhangi bir API endpoint'ine istek atın, ardından `/api/metrics`'i tekrar kontrol edin.

### 2. `/api/metrics` endpoint'i çok yavaş (10+ saniye)

[](#2-apimetrics-endpointi-çok-yavaş-10-saniye)

**Sebep:** Veritabanı sunucusu erişilemez durumda ve bağlantı timeout'u bekleniyordur.

**Çözüm:** Paket otomatik olarak `fsockopen()` ile 2 saniyelik TCP check yapar. Eğer hâlâ yavaşsa, config'den DB metriklerini kapatın:

```
'system_metrics' => [
    'database' => false,
    'health' => false,
],
```

### 3. `composer require` sırasında hata alıyorum

[](#3-composer-require-sırasında-hata-alıyorum)

**Sebep:** `predis/predis` versiyon uyumsuzluğu.

**Çözüm:** Paket `predis/predis ^2.0|^3.0` kabul eder. composer.json'ınızdaki predis versiyonunu kontrol edin:

```
composer show predis/predis
```

### 4. Route'lar görünmüyor (`route:list`'te yok)

[](#4-routelar-görünmüyor-routelistte-yok)

**Kontrol edin:**

```
# Config cache'ini temizleyin
php artisan config:clear

# Autoload'u yenileyin
composer dump-autoload

# Paketin keşfedildiğini doğrulayın
php artisan package:discover
```

### 5. Redis `wipe-metrics` çalışmıyor / Eski veriler silinmiyor

[](#5-redis-wipe-metrics-çalışmıyor--eski-veriler-silinmiyor)

**Sebep:** Redis prefix uyumsuzluğu olabilir.

**Çözüm:** Paket, Laravel'in Redis prefix'ini (`laravel_database_`) otomatik algılar ve Lua script ile doğru key'leri siler. `config/database.php`'de Redis prefix'inizi kontrol edin.

### 6. Aynı Redis'te iki projenin verileri karışıyor

[](#6-aynı-rediste-iki-projenin-verileri-karışıyor)

**Sebep:** İki proje aynı `ORCHESTRATOR_PREFIX` kullanıyordur.

**Çözüm:** Her projenin `.env` dosyasında **benzersiz** bir `ORCHESTRATOR_PREFIX` değeri olmalıdır.

### 7. `ORCHESTRATOR_ENABLED=false` yaptım ama route'lar hâlâ var

[](#7-orchestrator_enabledfalse-yaptım-ama-routelar-hâlâ-var)

**Çözüm:**

```
php artisan config:clear
php artisan route:clear
```

---

Lisans
------

[](#lisans)

MIT License — [LICENSE](LICENSE) dosyasına bakın.

---

**Fogeto** tarafından ❤️ ile geliştirilmiştir.

###  Health Score

42

—

FairBetter than 90% of packages

Maintenance85

Actively maintained with recent releases

Popularity20

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity45

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~2 days

Total

9

Last Release

77d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/85bdc3325d4158e01f16495c1069a83194ef0b5977c611de23cc5ed728c4977c?d=identicon)[mustafaoguzbaran](/maintainers/mustafaoguzbaran)

---

Top Contributors

[![mustafaoguzbaran](https://avatars.githubusercontent.com/u/53480330?v=4)](https://github.com/mustafaoguzbaran "mustafaoguzbaran (15 commits)")

---

Tags

laravelmonitoringMetricsobservabilityprometheusorchestrator

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/fogeto-laravel-server-orchestrator/health.svg)

```
[![Health](https://phpackages.com/badges/fogeto-laravel-server-orchestrator/health.svg)](https://phpackages.com/packages/fogeto-laravel-server-orchestrator)
```

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
