Skip to content

nadi-pro/nadi-php

Repository files navigation

Build Status

Nadi PHP Client

Nadi is a simple issue tracker for monitoring your application crashes. This package developed for PHP.

Installation

composer require nadi-pro/nadi-php

Adding New Metric

You can add a new metric as you see fit to your application / framework.

Do take note, all metrics will be converted to associative array.

In order to create your own metrics, you need to extends the class Nadi\Metric\Base and implement your metrics details in metrics() method which always return an array. You may need to define as a dot notation in your metric.

However, Nadi will convert to the associative array.

Following is an example for capture Http request for Laravel framework.

<?php

namespace App\Metric;

use Nadi\Support\Arr;
use Nadi\Metric\Base;
use Illuminate\Support\Str;

class Http extends Base
{
    public function metrics(): array
    {
        $startTime = defined('LARAVEL_START') ? LARAVEL_START : request()->server('REQUEST_TIME_FLOAT');

        return [
            'http.client.duration' => $startTime ? floor((microtime(true) - $startTime) * 1000) : null,
            'http.scheme' => request()->getScheme(),
            'http.route' => request()->getRequestUri(),
            'http.method' => request()->getMethod(),
            'http.status_code' => http_response_code(),
            'http.query' => request()->getQueryString(),
            'http.uri' => str_replace(request()->root(), '', request()->fullUrl()) ?: '/',
            'http.headers' => Arr::undot(collect(request()->headers->all())
                ->map(function ($header) {
                    return $header[0];
                })
                ->reject(function ($header, $key) {
                    return in_array($key, [
                        'authorization', config('nadi.header-key'), 'nadi-key',
                    ]);
                })
                ->toArray()),
        ];
    }
}

Once you have declared your metric, you can use in your application:

use App\Metrics\Http;
use Nadi\Metric\Metric;

$metric = new Metric();

$metric->add(new Http());

$metric->toArray();

If you are adding from Laravel framework, you can simply just add in config/nadi.php:

'metrics' => [
    \App\Metrics\Http::class,
];

Class Diagram

Sampling

Following are the sampling strategy provided by default:

  1. Base Sampling
  2. Fix Rate Sampling
  3. Interval Sampling
  4. Peak Load Sampling
  5. Dynamic Rate Sampling

Usage

The Sample Config can be construct as following:

use Nadi\Sampling\Config;

$config = new Config(
    samplingRate: 0.1,
    baseRate: 0.05,
    loadFactor: 1.0,
    intervalSeconds: 60
);

Then based on available sampling strategy, contruct the sampling object:

use Nadi\Sampling\FixedRateSampling;

$samplingStrategy = new FixedRateSampling($config);

You can use directly the sampling:

if($samplingStrategy->shouldSample()) {
    // do something
}

Or you require Sampling Manager:

use Nadi\Sampling\SamplingManager;

$samplingManager = new SamplingManager($samplingStrategy);

if($samplingManager->shouldSample()) {
    // do something
}

Use Sampling Manager if you rely on dynamic use of sampling stategy.

Create Your Own Sample Strategy

To create your own sampling strategy:

namespace App\Sampling;

use Nadi\Sampling\Contract;
use Nadi\Sampling\Config;

class CustomSampling implements Contract
{
    public function __construct(protected Config $config) {}

    public function shouldSample(): bool
    {
        // do your logic hhere

        return true;
    }
}