summaryrefslogtreecommitdiff
path: root/vendor/opentracing/opentracing/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/opentracing/opentracing/README.md')
-rw-r--r--vendor/opentracing/opentracing/README.md306
1 files changed, 306 insertions, 0 deletions
diff --git a/vendor/opentracing/opentracing/README.md b/vendor/opentracing/opentracing/README.md
new file mode 100644
index 000000000..ce03bc951
--- /dev/null
+++ b/vendor/opentracing/opentracing/README.md
@@ -0,0 +1,306 @@
+# OpenTracing API for PHP
+
+[![Build](https://github.com/opentracing/opentracing-php/actions/workflows/ci.yml/badge.svg)](https://github.com/opentracing/opentracing-php/actions/workflows/ci.yml)
+[![OpenTracing Badge](https://img.shields.io/badge/OpenTracing-enabled-blue.svg)](http://opentracing.io)
+[![Total Downloads](https://poser.pugx.org/opentracing/opentracing/downloads)](https://packagist.org/packages/opentracing/opentracing)
+[![Minimum PHP Version](https://img.shields.io/badge/php-%3E%3D%205.6-8892BF.svg)](https://php.net/)
+[![License](https://img.shields.io/github/license/opentracing/opentracing-php.svg)](https://github.com/opentracing/opentracing-php/blob/master/LICENSE)
+[![Join the chat at https://gitter.im/opentracing/opentracing-php](https://badges.gitter.im/opentracing/opentracing-php.svg)](https://gitter.im/opentracing/opentracing-php?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
+
+PHP library for the OpenTracing's API.
+
+## Required Reading
+
+In order to understand the library, one must first be familiar with the
+[OpenTracing project](http://opentracing.io) and
+[specification](http://opentracing.io/documentation/pages/spec.html) more specifically.
+
+## Installation
+
+OpenTracing-PHP can be installed via Composer:
+
+```bash
+composer require opentracing/opentracing
+```
+
+## Usage
+
+When consuming this library one really only need to worry about a couple of key
+abstractions: the `Tracer::startActiveSpan` and `Tracer::startSpan` method,
+the `Span` interface, the `Scope` interface and binding a `Tracer` at bootstrap time. Here are code snippets
+demonstrating some important use cases:
+
+### Singleton initialization
+
+The simplest starting point is to set the global tracer. As early as possible, do:
+
+```php
+use OpenTracing\GlobalTracer;
+
+GlobalTracer::set(new MyTracerImplementation());
+```
+
+### Creating a Span given an existing Request
+
+To start a new `Span`, you can use the `startSpan` method.
+
+```php
+use OpenTracing\Formats;
+use OpenTracing\GlobalTracer;
+
+...
+
+// extract the span context
+$spanContext = GlobalTracer::get()->extract(
+ Formats\HTTP_HEADERS,
+ getallheaders()
+);
+
+function doSomething() {
+ ...
+
+ // start a new span called 'my_span' and make it a child of the $spanContext
+ $span = GlobalTracer::get()->startSpan('my_span', ['child_of' => $spanContext]);
+
+ ...
+
+ // add some logs to the span
+ $span->log([
+ 'event' => 'soft error',
+ 'type' => 'cache timeout',
+ 'waiter.millis' => 1500,
+ ])
+
+ // finish the the span
+ $span->finish();
+}
+```
+
+### Starting a new trace by creating a "root span"
+
+It's always possible to create a "root" `Span` with no parent or other causal reference.
+
+```php
+$span = $tracer->startSpan('my_first_span');
+...
+$span->finish();
+```
+
+### Active Spans and Scope Manager
+
+For most use cases, it is recommended that you use the `Tracer::startActiveSpan` function for
+creating new spans.
+
+An example of a linear, two level deep span tree using active spans looks like
+this in PHP code:
+```php
+// At dispatcher level
+$scope = $tracer->startActiveSpan('request');
+...
+$scope->close();
+```
+```php
+// At controller level
+$scope = $tracer->startActiveSpan('controller');
+...
+$scope->close();
+```
+
+```php
+// At RPC calls level
+$scope = $tracer->startActiveSpan('http');
+file_get_contents('http://php.net');
+$scope->close();
+```
+
+When using the `Tracer::startActiveSpan` function the underlying tracer uses an
+abstraction called scope manager to keep track of the currently active span.
+
+Starting an active span will always use the currently active span as a parent.
+If no parent is available, then the newly created span is considered to be the
+root span of the trace.
+
+Unless you are using asynchronous code that tracks multiple spans at the same
+time, such as when using cURL Multi Exec or MySQLi Polling it is recommended that you
+use `Tracer::startActiveSpan` everywhere in your application.
+
+The currently active span gets automatically finished when you call `$scope->close()`
+as you can see in the previous examples.
+
+If you don't want a span to automatically close when `$scope->close()` is called
+then you must specify `'finish_span_on_close'=> false,` in the `$options`
+argument of `startActiveSpan`.
+
+#### Creating a child span assigning parent manually
+
+```php
+$parent = GlobalTracer::get()->startSpan('parent');
+
+$child = GlobalTracer::get()->startSpan('child', [
+ 'child_of' => $parent
+]);
+
+...
+
+$child->finish();
+
+...
+
+$parent->finish();
+```
+
+#### Creating a child span using automatic active span management
+
+Every new span will take the active span as parent and it will take its spot.
+
+```php
+$parent = GlobalTracer::get()->startActiveSpan('parent');
+
+...
+
+/*
+ * Since the parent span has been created by using startActiveSpan we don't need
+ * to pass a reference for this child span
+ */
+$child = GlobalTracer::get()->startActiveSpan('my_second_span');
+
+...
+
+$child->close();
+
+...
+
+$parent->close();
+```
+
+### Serializing to the wire
+
+```php
+use GuzzleHttp\Client;
+use OpenTracing\Formats;
+
+...
+
+$tracer = GlobalTracer::get();
+
+$spanContext = $tracer->extract(
+ Formats\HTTP_HEADERS,
+ getallheaders()
+);
+
+try {
+ $span = $tracer->startSpan('my_span', ['child_of' => $spanContext]);
+
+ $client = new Client;
+
+ $headers = [];
+
+ $tracer->inject(
+ $span->getContext(),
+ Formats\HTTP_HEADERS,
+ $headers
+ );
+
+ $request = new \GuzzleHttp\Psr7\Request('GET', 'http://myservice', $headers);
+ $client->send($request);
+ ...
+
+} catch (\Exception $e) {
+ ...
+}
+...
+```
+
+### Deserializing from the wire
+
+When using http header for context propagation you can use either the `Request` or the `$_SERVER`
+variable:
+
+```php
+use OpenTracing\GlobalTracer;
+use OpenTracing\Formats;
+
+$tracer = GlobalTracer::get();
+$spanContext = $tracer->extract(Formats\HTTP_HEADERS, getallheaders());
+$tracer->startSpan('my_span', [
+ 'child_of' => $spanContext,
+]);
+```
+
+### Flushing Spans
+
+PHP as a request scoped language has no simple means to pass the collected spans
+data to a background process without blocking the main request thread/process.
+The OpenTracing API makes no assumptions about this, but for PHP that might
+cause problems for Tracer implementations. This is why the PHP API contains a
+`flush` method that allows to trigger a span sending out of process.
+
+```php
+use OpenTracing\GlobalTracer;
+
+$application->run();
+
+register_shutdown_function(function() {
+ /* Flush the tracer to the backend */
+ $tracer = GlobalTracer::get();
+ $tracer->flush();
+});
+```
+
+This is optional, tracers can decide to immediately send finished spans to a
+backend. The flush call can be implemented as a NO-OP for these tracers.
+
+### Using `StartSpanOptions`
+
+Passing options to the pass can be done using either an array or the
+SpanOptions wrapper object. The following keys are valid:
+
+- `start_time` is a float, int or `\DateTime` representing a timestamp with arbitrary precision.
+- `child_of` is an object of type `OpenTracing\SpanContext` or `OpenTracing\Span`.
+- `references` is an array of `OpenTracing\Reference`.
+- `tags` is an array with string keys and scalar values that represent OpenTracing tags.
+- `finish_span_on_close` is a boolean that determines whether a span should be finished or not when the
+scope is closed.
+
+```php
+$span = $tracer->startActiveSpan('my_span', [
+ 'child_of' => $spanContext,
+ 'tags' => ['foo' => 'bar'],
+ 'start_time' => time(),
+]);
+```
+
+### Propagation Formats
+
+The propagation formats should be implemented consistently across all tracers.
+If you want to implement your own format, then don't reuse the existing constants.
+Tracers will throw an exception if the requested format is not handled by them.
+
+- `Tracer::FORMAT_TEXT_MAP` should represent the span context as a key value map. There is no
+ assumption about the semantics where the context is coming from and sent to.
+
+- `Tracer::FORMAT_HTTP_HEADERS` should represent the span context as HTTP header lines
+ in an array list. For two context details "Span-Id" and "Trace-Id", the
+ result would be `['Span-Id: abc123', 'Trace-Id: def456']`. This definition can be
+ passed directly to `curl` and `file_get_contents`.
+
+- `Tracer::FORMAT_BINARY` makes no assumptions about the data format other than it is
+ proprietary and each Tracer can handle it as it wants.
+
+## Mock implementation
+
+OpenTracing PHP comes with a mock implementation, it has three purposes:
+
+1. Helps to iron the API.
+2. Works as a reference implementation.
+3. Enhances vendor agnostic unit testing as it allows developers to inspect the tracing objects
+in order to do assertions about them.
+
+## Coding Style
+
+OpenTracing PHP follows the [PSR-2](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md)
+coding standard and the [PSR-4](https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-4-autoloader.md) autoloading standard.
+
+## License
+
+All the open source contributions are under the terms of the [Apache-2.0 License](https://opensource.org/licenses/Apache-2.0).