Code Monkey home page Code Monkey logo

tracing-laravel's Issues

Are we considering supporting `QueueReport`?

Using a queue can speed up the response time of your site and reduce a lot of risks. For example, if zipkin crashes, it won't affect the site.

It can be supported with very few code changes, I can provide a PR.

The reporter can be obtained through dependency injection.

tracing-laravel/src/Drivers/Zipkin/ZipkinTracer.php

protected function createReporter(): Reporter
{
    if (!$this->reporter) {
        return new HttpReporter([
            'endpoint_url' => sprintf('http://%s:%s/api/v2/spans', $this->host, $this->port),
            'timeout' => $this->requestTimeout,
        ]);
    }

    return $this->reporter;
}
class QueueReporter implements Reporter
{
    public function report(array $spans): void
    {
        if (count($spans) === 0) {
            return;
        }

        $reporterJob = new ReporterJob(
            config('tracing.zipkin.host'),
            config('tracing.zipkin.port'),
            config('tracing.zipkin.options.request_timeout', 1),
            $spans
        );
        dispatch($reporterJob)->onQueue();
    }
}

Tracing db queries

How can i set span duration?
Method "finish" in interface Vinelab\Tracing\Contracts\Span don't have parameters, but same method in Interface Zipkin\Span has parameter $timestamp.

Migrate to Zipkin 2.0

Zipkin PHP 2.0 is out and brought support for PHP 7.1+ avoiding type checks with almost no breaking changes. Consider upgrading.

'Vinelab\Tracing\Contracts\Tracer' is not Instantiable

Running on:

  • Laravel 8.15
  • PHP v7.4
  • Phpunit v9.4.3

We are adding a Phpunit functionality to provide some test coverage html page running the following command:
./vendor/bin/phpunit --coverage-html html

We get the following error:
Screenshot 2020-11-24 at 17 51 46

It is worth mentioning that we have in the same project a number of RabbitMq consumers running with Tracing enabled with no issues. And running the phpunit test suit goes as expected.

Once thing to mention is that to suppress Tracing while runing phpunit test we add the following to the phpunit.xml file:
<server name="TRACING_DRIVER" value="'null'"/>

Could this issue be pointing to a particular caveat within the service provider?

Update
Removing the null Tracing driver from phpunit.xml apparently circumvent the above issue.

Drop support for some older versions of PHP and Laravel in the next major release

At the moment our versions constraints are brittle and its getting harder to anticipate where things might break due to wide range of supported software.

I suggest to limit support to the following versions to ease maintenance burden:

  • PHP >= 7.4 (support for PHP 7.3 will end on December 6)
  • Laravel >= 6.0 (this is the last version that still receives security fixes)

This also allows us to clean up some other dependencies a bit:

  • "openzipkin/zipkin": "~2.0.2|~3.0" => "~3.0"
  • "phpunit/phpunit": "~7.0|~8.0" => "~9.0"

Users of older PHP/Laravel can still avail of older versions of the package.

Opinions? @Mulkave @KinaneD

Too few arguments to function 'Illuminate\Support\Manager::createDriver()'

Running on:

  • Laravel 8.15
  • PHP v7.4
  • Phpunit v9.4.3

In previous Laravel installations 5.8.*, to silence tracing while running phpunit tests we adapt our phpunit.xml as such:

    <php>
       ...
        <env name="TRACING_DRIVER" value="null"/>
    </php>

Doing this same in this installation result with the following error:

ArgumentCountError: Too few arguments to function Illuminate\Support\Manager::createDriver(), 0 passed in /code/vendor/laravel/framework/src/Illuminate/Support/Manager.php on line 105 and exactly 1 expected
/code/vendor/laravel/framework/src/Illuminate/Support/Manager.php:94
/code/vendor/laravel/framework/src/Illuminate/Support/Manager.php:105
/code/vendor/laravel/framework/src/Illuminate/Support/Manager.php:80
/code/vendor/vinelab/tracing-laravel/src/TracingServiceProvider.php:75
/code/vendor/laravel/framework/src/Illuminate/Container/Container.php:805
/code/vendor/laravel/framework/src/Illuminate/Container/Container.php:691
/code/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:796
/code/vendor/laravel/framework/src/Illuminate/Container/Container.php:637
/code/vendor/laravel/framework/src/Illuminate/Foundation/Application.php:781
/code/vendor/laravel/framework/src/Illuminate/Container/Container.php:1280
/code/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:198
/code/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:166
/code/vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php:255
/code/vendor/vinelab/tracing-laravel/src/Integration/Concerns/TracesLucidArchitecture.php:67
/code/vendor/vinelab/tracing-laravel/src/Integration/Concerns/TracesLucidArchitecture.php:55
/code/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php:391
/code/vendor/laravel/framework/src/Illuminate/Events/Dispatcher.php:236
/code/vendor/laravel/framework/src/Illuminate/Foundation/helpers.php:432

We were able to work around this by adding a single quote for the null driver:
<server name="TRACING_DRIVER" value="'null'"/>

Is this an exepcted behaviour?

Why does `sampler` not support `PercentageSampler`

Can we consider making a configuration option to support PercentageSampler?
Sampling may be employed to reduce the data collected and reported out of process.
https://github.com/openzipkin/zipkin-php#sampling

    public function createZipkinDriver()
    {
        $tracer = new ZipkinTracer(
            $this->config->get('tracing.service_name'),
            $this->config->get('tracing.zipkin.host'),
            $this->config->get('tracing.zipkin.port'),
            $this->config->get('tracing.zipkin.options.128bit'),
            $this->config->get('tracing.zipkin.options.request_timeout', 5)
        );

        ZipkinTracer::setMaxTagLen(
            $this->config->get('tracing.zipkin.options.max_tag_len', ZipkinTracer::getMaxTagLen())
        );

        return $tracer->init();
    }
    public function init(): Tracer
    {
        $this->tracing = TracingBuilder::create()
            ->havingLocalEndpoint($this->createEndpoint())
            ->havingTraceId128bits($this->usesTraceId128bits)
            ->havingSampler($this->createSampler())
            ->havingReporter($this->createReporter())
            ->build();

        $this->registerDefaultExtractionFormats();
        $this->registerDefaultInjectionFormats();

        return $this;
    }
    protected function createSampler(): Sampler
    {
        return BinarySampler::createAsAlwaysSample();
    }

Has anyone considered adding more events to Laravel?

I would be great if Laravel had more events that we could use to start and finish spans. Like QueryStarted in addition to QueryExecuted, CacheQueryStarted in addition to CacheHit and CacheMissed, etc. Maybe even some new events for the HTTP client.

Do you know if anyone has tried this already? I'm willing to work on it, but if someone has already tried and got their PR rejected, I may want to save myself the effort.

Lumen Support

I'm trying to use this package on Lumen 8.0 but I'm getting a lot of missing function or method errors. Is it possible to add support for Lumen? Thank you.

Consider using idiomatic zipkin tags

Currently there are a couple of things that don't follow idiomatic naming in zipkin.

First, we usually use VERB /path/for/route as span names instead of a fixed name as it is less useful when it comes to search for an specific operation. E.g. GET /images/{image_id}. Notice the usage of {image_id} instead of the actual ID as high cardinality on this can make your span search struggle.

Second, there are a bunch of idiomatic zipkin tags that I would recommend to use instead of custom ones in https://github.com/Vinelab/tracing-laravel/blob/master/src/Middleware/TraceRequests.php#L75. See:
https://github.com/openzipkin/zipkin-php/blob/master/src/Zipkin/Tags.php

FInally I am concerned about the automatic adding request_headers into the tags, sensitive information like JWT can be carried here and at most you want ti to be optional and a concious decision because it implies some privacy issues. Also not sure https://github.com/Vinelab/tracing-laravel/blob/master/src/Middleware/TraceRequests.php#L80 includes query parameters, they also can carry sensitive information like api_key.

Lumen with Vinelab/tracing-laravel plugin raised error

Trying to add logger tool
https://github.com/Vinelab/tracing-laravel#usage-with-lumen

to lumen app and I followed all steps under “Usage With Lumen” section.
Running request I got error :

 "message": "Call to undefined method Laravel\\Lumen\\Application::terminating()",
    "exception": "Error",
    "file": "/mnt/_work_sdb8/wwwroot/LumenProjects/PublishPagesAPI/vendor/vinelab/tracing-laravel/src/TracingServiceProvider.php",
    "line": 55,
    "trace": [
        {
            "file": "/mnt/_work_sdb8/wwwroot/LumenProjects/PublishPagesAPI/vendor/illuminate/container/BoundMethod.php",
            "line": 36,
            "function": "boot",
            "class": "Vinelab\\Tracing\\TracingServiceProvider",
            "type": "->"
        },
        {
            "file": "/mnt/_work_sdb8/wwwroot/LumenProjects/PublishPagesAPI/vendor/illuminate/container/Util.php",
            "line": 40,
            "function": "Illuminate\\Container\\{closure}",
            "class": "Illuminate\\Container\\BoundMethod",
            "type": "::"
        },
        {
            "file": "/mnt/_work_sdb8/wwwroot/LumenProjects/PublishPagesAPI/vendor/illuminate/container/BoundMethod.php",
            "line": 93,
            "function": "unwrapIfClosure",
            "class": "Illuminate\\Container\\Util",
            "type": "::"
        },
        {
            "file": "/mnt/_work_sdb8/wwwroot/LumenProjects/PublishPagesAPI/vendor/illuminate/container/BoundMethod.php",
            "line": 37,
            "function": "callBoundMethod",
            "class": "Illuminate\\Container\\BoundMethod",
            "type": "::"
        },
        {
            "file": "/mnt/_work_sdb8/wwwroot/LumenProjects/PublishPagesAPI/vendor/illuminate/container/Container.php",
            "line": 653,
            "function": "call",
            "class": "Illuminate\\Container\\BoundMethod",
            "type": "::"
        },
        {
            "file": "/mnt/_work_sdb8/wwwroot/LumenProjects/PublishPagesAPI/vendor/laravel/lumen-framework/src/Application.php",
            "line": 277,
            "function": "call",
            "class": "Illuminate\\Container\\Container",
            "type": "->"
        },
        {
            "file": "/mnt/_work_sdb8/wwwroot/LumenProjects/PublishPagesAPI/vendor/laravel/lumen-framework/src/Application.php",
            "line": 262,
            "function": "bootProvider",
            "class": "Laravel\\Lumen\\Application",
            "type": "->"
        },
        {
        
I upgrated all packages in my composer.json :
{
    "name": "laravel/lumen",
    "description": "The Laravel Lumen Framework.",
    "keywords": ["framework", "laravel", "lumen"],
    "license": "MIT",
    "type": "project",
    "require": {
        "php": "^7.3|^8.0",
        "anik/form-request": "^4.3",
        "cviebrock/eloquent-sluggable": "^8.0.8",
        "dusterio/lumen-passport": "^0.3.4",
        "flipbox/lumen-generator": "^8.2.2",
        "illuminate/mail": "^8.70.2",
        "illuminate/notifications": "^8.70.2",
        "intervention/image": "^2.7.0",
        "laravel/lumen-framework": "^8.3.1",
        "league/flysystem": " ~1.1.5",
        "openzipkin/zipkin": "^2.0.2",
        "vinelab/tracing-laravel": "^2.0.2"
    },
    "require-dev": {
        "barryvdh/laravel-debugbar": "^3.6.4",
        "fakerphp/faker": "^1.16.0",
        "mockery/mockery": "^1.4.4",
        "phpunit/phpunit": "^9.5.10"
    },
    "autoload": {
        "files": [
            "app/library/helper.php"
        ],
        "psr-4": {
            "App\\": "app/",
            "Database\\Factories\\": "database/factories/",
            "Database\\Seeders\\": "database/seeders/"
        }
    },
    "autoload-dev": {
        "classmap": [
            "tests/"
        ]
    },
    "config": {
        "preferred-install": "dist",
        "sort-packages": true,
        "optimize-autoloader": true
    },
    "minimum-stability": "dev",
    "prefer-stable": true,
    "scripts": {
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ]
    }
}

How this error can be fixed?

Thanks!

🐞 Bug - v2.3.2 - Invalid sampler class. Expected `BinarySampler` or `PercentageSampler`, got 0.000000

Issue Description

Since updating to the new v2.3.2 release,
following error log gets spammed in the laravel.log file:

[2023-11-09 10:32:47] testing.ERROR: Invalid sampler class. Expected `BinarySampler` or `PercentageSampler`, got 0.000000 {

    "exception":"[object] (InvalidArgumentException(code: 0): Invalid sampler class. Expected `BinarySampler` or `PercentageSampler`, got 0.000000 at /vendor/vinelab/tracing-laravel/src/TracingDriverManager.php:83)

    [stacktrace]
    #0  /vendor/vinelab/tracing-laravel/src/TracingDriverManager.php(60): Vinelab\\Tracing\\TracingDriverManager->getZipkinSampler()
    #1  /vendor/laravel/framework/src/Illuminate/Support/Manager.php(106): Vinelab\\Tracing\\TracingDriverManager->createZipkinDriver()
    #2  /vendor/laravel/framework/src/Illuminate/Support/Manager.php(80): Illuminate\\Support\\Manager->createDriver()
    #3  /vendor/vinelab/tracing-laravel/src/TracingServiceProvider.php(77): Illuminate\\Support\\Manager->driver()
    #4  /vendor/laravel/framework/src/Illuminate/Container/Container.php(908): Vinelab\\Tracing\\TracingServiceProvider->Vinelab\\Tracing\\{closure}()
    #5  /vendor/laravel/framework/src/Illuminate/Container/Container.php(795): Illuminate\\Container\\Container->build()
    #6  /vendor/laravel/framework/src/Illuminate/Foundation/Application.php(955): Illuminate\\Container\\Container->resolve()
    #7  /vendor/laravel/framework/src/Illuminate/Container/Container.php(731): Illuminate\\Foundation\\Application->resolve()
    #8  /vendor/laravel/framework/src/Illuminate/Foundation/Application.php(940): Illuminate\\Container\\Container->make()
    #9  /vendor/laravel/framework/src/Illuminate/Container/Container.php(1454): Illuminate\\Foundation\\Application->make()
    #10 /vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(236): Illuminate\\Container\\Container->offsetGet()
    #11 /vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(207): Illuminate\\Support\\Facades\\Facade::resolveFacadeInstance()
    #12 /vendor/laravel/framework/src/Illuminate/Support/Facades/Facade.php(347): Illuminate\\Support\\Facades\\Facade::getFacadeRoot()
    #13 /vendor/vinelab/tracing-laravel/src/TracingServiceProvider.php(57): Illuminate\\Support\\Facades\\Facade::__callStatic()
    #14 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(36): Vinelab\\Tracing\\TracingServiceProvider->Vinelab\\Tracing\\{closure}()
    #15 /vendor/laravel/framework/src/Illuminate/Container/Util.php(41): Illuminate\\Container\\BoundMethod::Illuminate\\Container\\{closure}()
    #16 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(81): Illuminate\\Container\\Util::unwrapIfClosure()
    #17 /vendor/laravel/framework/src/Illuminate/Container/BoundMethod.php(37): Illuminate\\Container\\BoundMethod::callBoundMethod()
    #18 /vendor/laravel/framework/src/Illuminate/Container/Container.php(662): Illuminate\\Container\\BoundMethod::call()
    #19 /vendor/laravel/framework/src/Illuminate/Foundation/Application.php(1272): Illuminate\\Container\\Container->call()
    #20 /vendor/laravel/framework/src/Illuminate/Foundation/Console/Kernel.php(220): Illuminate\\Foundation\\Application->terminate()
    #21 /artisan(49): Illuminate\\Foundation\\Console\\Kernel->terminate()
    #22 {main}"
}

Workaround

Manually add the new tracing.zipkin.sampler_class settings to config/tracing:

'sampler_class' => \Zipkin\Samplers\BinarySampler::class,
'percentage_sampler_rate' => env('ZIPKIN_PERCENTAGE_SAMPLER_RATE', 0.2),

PR #49 - Diff of config/tracing

Fix Suggestion

  • Populate the new tracing.zipkin.sampler_class settings in config/tracing with default values if not set.
  • Document config/tracing changes in the ChangeLog of new releases

PR #49 - Review

Linked Issues/PRs

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.