exp: jaeger tracing

This commit is contained in:
Andrew Dolgov 2023-04-09 20:50:33 +03:00
parent a37eab2610
commit 8f3646a9c9
No known key found for this signature in database
GPG Key ID: 1A56B4FA25D4AF2A
276 changed files with 24972 additions and 684 deletions

View File

@ -30,11 +30,16 @@
$op = (string)clean($op);
$method = (string)clean($method);
$scope = Tracer::start(__FILE__, ['tags' => $_REQUEST]);
startup_gettext();
$script_started = microtime(true);
if (!init_plugins()) return;
if (!init_plugins()) {
$scope->close();
return;
}
header("Content-Type: text/json; charset=utf-8");
@ -46,6 +51,8 @@
if (!\Sessions\validate_session()) {
header("Content-Type: text/json");
print Errors::to_json(Errors::E_UNAUTHORIZED);
$scope->close();
return;
}
UserHelper::load_user_plugins($_SESSION["uid"]);
@ -53,6 +60,7 @@
if (Config::is_migration_needed()) {
print Errors::to_json(Errors::E_SCHEMA_MISMATCH);
$scope->close();
return;
}
@ -114,6 +122,7 @@
user_error("Refusing to invoke method $method of handler $op which starts with underscore.", E_USER_WARNING);
header("Content-Type: text/json");
print Errors::to_json(Errors::E_UNAUTHORIZED);
$scope->close();
return;
}
@ -125,11 +134,19 @@
}
if (implements_interface($handler, 'IHandler')) {
$h_scope = Tracer::start("construct/$op");
$handler->__construct($_REQUEST);
$h_scope->close();
if (validate_csrf($csrf_token) || $handler->csrf_ignore($method)) {
if ($handler->before($method)) {
$b_scope = Tracer::start("before/$method");
$before = $handler->before($method);
$b_scope->close();
if ($before) {
if ($method && method_exists($handler, $method)) {
$m_scope = Tracer::start("method/$method");
$reflection = new ReflectionMethod($handler, $method);
if ($reflection->getNumberOfRequiredParameters() == 0) {
@ -139,6 +156,7 @@
header("Content-Type: text/json");
print Errors::to_json(Errors::E_UNAUTHORIZED);
}
$m_scope->close();
} else {
if (method_exists($handler, "catchall")) {
$handler->catchall($method);
@ -147,17 +165,26 @@
print Errors::to_json(Errors::E_UNKNOWN_METHOD, ["info" => get_class($handler) . "->$method"]);
}
}
$a_scope = Tracer::start("after/$method");
$handler->after();
$a_scope->close();
$scope->close();
return;
} else {
header("Content-Type: text/json");
print Errors::to_json(Errors::E_UNAUTHORIZED);
$scope->close();
return;
}
} else {
user_error("Refusing to invoke method $method of handler $op with invalid CSRF token.", E_USER_WARNING);
header("Content-Type: text/json");
print Errors::to_json(Errors::E_UNAUTHORIZED);
$scope->close();
return;
}
}
@ -166,4 +193,4 @@
header("Content-Type: text/json");
print Errors::to_json(Errors::E_UNKNOWN_METHOD, [ "info" => (isset($handler) ? get_class($handler) : "UNKNOWN:".$op) . "->$method"]);
?>
$scope->close();

View File

@ -145,6 +145,7 @@ class Counters {
* @return array<int, array<string, int|string>>
*/
private static function get_feeds(array $feed_ids = null): array {
$scope = Tracer::start(__FUNCTION__);
$ret = [];
@ -211,6 +212,8 @@ class Counters {
}
$scope->close();
return $ret;
}
@ -218,6 +221,8 @@ class Counters {
* @return array<int, array<string, int|string>>
*/
private static function get_global(): array {
$scope = Tracer::start(__FUNCTION__);
$ret = [
[
"id" => "global-unread",
@ -234,6 +239,8 @@ class Counters {
"counter" => $subcribed_feeds
]);
$scope->close();
return $ret;
}
@ -241,6 +248,7 @@ class Counters {
* @return array<int, array<string, int|string>>
*/
private static function get_virt(): array {
$scope = Tracer::start(__FUNCTION__);
$ret = [];
@ -287,6 +295,7 @@ class Counters {
}
}
$scope->close();
return $ret;
}
@ -295,6 +304,7 @@ class Counters {
* @return array<int, array<string, int|string>>
*/
static function get_labels(array $label_ids = null): array {
$scope = Tracer::start(__FUNCTION__);
$ret = [];
@ -346,6 +356,7 @@ class Counters {
array_push($ret, $cv);
}
$scope->close();
return $ret;
}
}

View File

@ -987,6 +987,7 @@ class Feeds extends Handler_Protected {
* @throws PDOException
*/
static function _get_counters($feed, bool $is_cat = false, bool $unread_only = false, ?int $owner_uid = null): int {
$scope = Tracer::start(__FUNCTION__, ['tags' => ['args' => json_encode(func_get_args())]]);
$n_feed = (int) $feed;
$need_entries = false;
@ -1010,11 +1011,14 @@ class Feeds extends Handler_Protected {
$handler = PluginHost::getInstance()->get_feed_handler($feed_id);
if (implements_interface($handler, 'IVirtualFeed')) {
/** @var IVirtualFeed $handler */
$scope->close();
return $handler->get_unread($feed_id);
} else {
$scope->close();
return 0;
}
} else if ($n_feed == Feeds::FEED_RECENTLY_READ) {
$scope->close();
return 0;
// tags
} else if ($feed != "0" && $n_feed == 0) {
@ -1028,6 +1032,7 @@ class Feeds extends Handler_Protected {
$row = $sth->fetch();
// Handle 'SUM()' returning null if there are no results
$scope->close();
return $row["count"] ?? 0;
} else if ($n_feed == Feeds::FEED_STARRED) {
@ -1061,6 +1066,7 @@ class Feeds extends Handler_Protected {
$label_id = Labels::feed_to_label_id($feed);
$scope->close();
return self::_get_label_unread($label_id, $owner_uid);
}
@ -1080,6 +1086,7 @@ class Feeds extends Handler_Protected {
$sth->execute([$owner_uid]);
$row = $sth->fetch();
$scope->close();
return $row["unread"];
} else {
@ -1092,6 +1099,7 @@ class Feeds extends Handler_Protected {
$sth->execute([$feed, $owner_uid]);
$row = $sth->fetch();
$scope->close();
return $row["unread"];
}
}

View File

@ -1104,12 +1104,16 @@ class Pref_Feeds extends Handler_Protected {
* @return array<string, mixed>
*/
private function feedlist_init_feed(int $feed_id, ?string $title = null, bool $unread = false, string $error = '', string $updated = ''): array {
$scope = Tracer::start(__FUNCTION__, ['tags' => ['args' => json_encode(func_get_args())]]);
if (!$title)
$title = Feeds::_get_title($feed_id, false);
if ($unread === false)
$unread = Feeds::_get_counters($feed_id, false, true);
$scope->close();
return [
'id' => 'FEED:' . $feed_id,
'name' => $title,

View File

@ -106,6 +106,8 @@ class RPC extends Handler_Protected {
}
function getAllCounters(): void {
$scope = Tracer::start(__FUNCTION__);
@$seq = (int) $_REQUEST['seq'];
$feed_id_count = (int) ($_REQUEST["feed_id_count"] ?? -1);
@ -132,6 +134,7 @@ class RPC extends Handler_Protected {
'seq' => $seq
];
$scope->close();
print json_encode($reply);
}

49
classes/tracer.php Normal file
View File

@ -0,0 +1,49 @@
<?php
use OpenTracing\GlobalTracer;
use OpenTracing\Scope;
class Tracer {
private static $instance;
public function __construct() {
$config = new \Jaeger\Config(
[
'sampler' => [
'type' => \Jaeger\SAMPLER_TYPE_CONST,
'param' => true,
],
'logging' => true,
"local_agent" => [
"reporting_host" => "172.17.172.39",
"reporting_port" => 6832
],
'dispatch_mode' => \Jaeger\Config::JAEGER_OVER_BINARY_UDP,
],
'tt-rss'
);
$config->initializeTracer();
register_shutdown_function(function() {
$tracer = GlobalTracer::get();
$tracer->flush();
});
}
private function _start(string $name, array $options = []) {
$tracer = GlobalTracer::get();
return $tracer->startActiveSpan($name, $options);
}
public static function start(string $name, array $options = []) : Scope {
return self::get_instance()->_start($name, $options);
}
public static function get_instance() : Tracer {
if (self::$instance == null)
self::$instance = new self();
return self::$instance;
}
}

View File

@ -13,7 +13,8 @@
"spomky-labs/otphp": "^10.0",
"chillerlan/php-qrcode": "^4.3.3",
"mervick/material-design-icons": "^2.2",
"j4mie/idiorm": "dev-master"
"j4mie/idiorm": "dev-master",
"jonahgeorge/jaeger-client-php": "^1.4"
},
"require-dev": {
"phpstan/phpstan": "1.10.3",

259
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "d2be3e2749aff1bebf6257ecbfd6dcb3",
"content-hash": "de4af0d5d452fc73fe4f5d584163af9a",
"packages": [
{
"name": "beberlei/assert",
@ -280,6 +280,74 @@
},
"time": "2022-03-26T15:19:01+00:00"
},
{
"name": "jonahgeorge/jaeger-client-php",
"version": "v1.4.4",
"source": {
"type": "git",
"url": "https://github.com/jonahgeorge/jaeger-client-php.git",
"reference": "3173d9c68ad8cea16058f25337982b00cc3d1c2b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/jonahgeorge/jaeger-client-php/zipball/3173d9c68ad8cea16058f25337982b00cc3d1c2b",
"reference": "3173d9c68ad8cea16058f25337982b00cc3d1c2b",
"shasum": ""
},
"require": {
"ext-sockets": "*",
"opentracing/opentracing": "^1.0",
"packaged/thrift": "^0.13",
"php": "^7.1 || ^8.0 || ^8.1",
"psr/cache": "^1.0 || ^2.0 || ^3.0",
"psr/log": "^1.0 || ^2.0 || ^3.0"
},
"require-dev": {
"cache/array-adapter": "^1.0",
"phpunit/phpunit": "^7 || ^8 || ^9",
"squizlabs/php_codesniffer": "3.*",
"symfony/polyfill-php73": "^1.10"
},
"type": "library",
"autoload": {
"files": [
"./src/Jaeger/Constants.php"
],
"psr-4": {
"Jaeger\\": "src/Jaeger/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jonah George",
"homepage": "http://twitter.com/jonahgeorge"
},
{
"name": "José Carlos Chávez",
"email": "jcchavezs@gmail.com"
},
{
"name": "Contributors",
"homepage": "https://github.com/jonahgeorge/jaeger-client-php/graphs/contributors"
}
],
"description": "Jaeger Bindings for PHP OpenTracing API",
"keywords": [
"jaeger",
"opentracing",
"trace",
"tracing"
],
"support": {
"issues": "https://github.com/jonahgeorge/jaeger-client-php/issues",
"source": "https://github.com/jonahgeorge/jaeger-client-php/tree/v1.4.4"
},
"time": "2023-01-31T13:40:20+00:00"
},
{
"name": "mervick/material-design-icons",
"version": "2.2.0",
@ -323,6 +391,94 @@
},
"time": "2016-02-22T01:05:40+00:00"
},
{
"name": "opentracing/opentracing",
"version": "1.0.2",
"source": {
"type": "git",
"url": "https://github.com/opentracing/opentracing-php.git",
"reference": "cd60bd1fb2a25280600bc74c7f9e0c13881a9116"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/opentracing/opentracing-php/zipball/cd60bd1fb2a25280600bc74c7f9e0c13881a9116",
"reference": "cd60bd1fb2a25280600bc74c7f9e0c13881a9116",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"phpstan/phpstan": "~0.12",
"phpunit/phpunit": "^7.0 || ^9.0",
"squizlabs/php_codesniffer": "3.*"
},
"type": "library",
"autoload": {
"files": [
"src/OpenTracing/Tags.php",
"src/OpenTracing/Formats.php"
],
"psr-4": {
"OpenTracing\\": "src/OpenTracing/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "José Carlos Chávez",
"email": "jcchavezs@gmail.com"
}
],
"description": "OpenTracing API for PHP",
"support": {
"issues": "https://github.com/opentracing/opentracing-php/issues",
"source": "https://github.com/opentracing/opentracing-php/tree/1.0.2"
},
"time": "2022-01-27T19:59:21+00:00"
},
{
"name": "packaged/thrift",
"version": "0.13.01",
"source": {
"type": "git",
"url": "https://github.com/packaged/thrift.git",
"reference": "e3dbcfb79e319971d64264ffe9c340590cc8a228"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/packaged/thrift/zipball/e3dbcfb79e319971d64264ffe9c340590cc8a228",
"reference": "e3dbcfb79e319971d64264ffe9c340590cc8a228",
"shasum": ""
},
"require": {
"php": "^5.5 || ^7.0 || ^8.0"
},
"type": "library",
"autoload": {
"psr-4": {
"Thrift\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"description": "Apache Thrift",
"homepage": "http://thrift.apache.org/",
"keywords": [
"apache",
"thrift"
],
"support": {
"issues": "https://github.com/packaged/thrift/issues",
"source": "https://github.com/packaged/thrift/tree/0.13.01"
},
"time": "2021-01-25T13:32:28+00:00"
},
{
"name": "paragonie/constant_time_encoding",
"version": "v2.6.3",
@ -390,6 +546,105 @@
},
"time": "2022-06-14T06:56:20+00:00"
},
{
"name": "psr/cache",
"version": "3.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/cache.git",
"reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
"reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
"shasum": ""
},
"require": {
"php": ">=8.0.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Cache\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for caching libraries",
"keywords": [
"cache",
"psr",
"psr-6"
],
"support": {
"source": "https://github.com/php-fig/cache/tree/3.0.0"
},
"time": "2021-02-03T23:26:27+00:00"
},
{
"name": "psr/log",
"version": "3.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
"reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
"reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
"shasum": ""
},
"require": {
"php": ">=8.0.0"
},
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.x-dev"
}
},
"autoload": {
"psr-4": {
"Psr\\Log\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for logging libraries",
"homepage": "https://github.com/php-fig/log",
"keywords": [
"log",
"psr",
"psr-3"
],
"support": {
"source": "https://github.com/php-fig/log/tree/3.0.0"
},
"time": "2021-07-14T16:46:02+00:00"
},
{
"name": "spomky-labs/otphp",
"version": "v10.0.3",
@ -2690,5 +2945,5 @@
"prefer-lowest": false,
"platform": [],
"platform-dev": [],
"plugin-api-version": "2.3.0"
"plugin-api-version": "2.0.0"
}

18
vendor/autoload.php vendored
View File

@ -2,24 +2,6 @@
// autoload.php @generated by Composer
if (PHP_VERSION_ID < 50600) {
if (!headers_sent()) {
header('HTTP/1.1 500 Internal Server Error');
}
$err = 'Composer 2.3.0 dropped support for autoloading on PHP <5.6 and you are running '.PHP_VERSION.', please upgrade PHP or use Composer 2.2 LTS via "composer self-update --2.2". Aborting.'.PHP_EOL;
if (!ini_get('display_errors')) {
if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') {
fwrite(STDERR, $err);
} elseif (!headers_sent()) {
echo $err;
}
}
trigger_error(
$err,
E_USER_ERROR
);
}
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit19fc2ff1c0f9a92279c7979386bb2056::getLoader();

View File

@ -42,79 +42,30 @@ namespace Composer\Autoload;
*/
class ClassLoader
{
/** @var \Closure(string):void */
private static $includeFile;
/** @var ?string */
private $vendorDir;
// PSR-4
/**
* @var array[]
* @psalm-var array<string, array<string, int>>
*/
private $prefixLengthsPsr4 = array();
/**
* @var array[]
* @psalm-var array<string, array<int, string>>
*/
private $prefixDirsPsr4 = array();
/**
* @var array[]
* @psalm-var array<string, string>
*/
private $fallbackDirsPsr4 = array();
// PSR-0
/**
* @var array[]
* @psalm-var array<string, array<string, string[]>>
*/
private $prefixesPsr0 = array();
/**
* @var array[]
* @psalm-var array<string, string>
*/
private $fallbackDirsPsr0 = array();
/** @var bool */
private $useIncludePath = false;
/**
* @var string[]
* @psalm-var array<string, string>
*/
private $classMap = array();
/** @var bool */
private $classMapAuthoritative = false;
/**
* @var bool[]
* @psalm-var array<string, bool>
*/
private $missingClasses = array();
/** @var ?string */
private $apcuPrefix;
/**
* @var self[]
*/
private static $registeredLoaders = array();
/**
* @param ?string $vendorDir
*/
public function __construct($vendorDir = null)
{
$this->vendorDir = $vendorDir;
self::initializeIncludeClosure();
}
/**
* @return string[]
*/
public function getPrefixes()
{
if (!empty($this->prefixesPsr0)) {
@ -124,47 +75,28 @@ class ClassLoader
return array();
}
/**
* @return array[]
* @psalm-return array<string, array<int, string>>
*/
public function getPrefixesPsr4()
{
return $this->prefixDirsPsr4;
}
/**
* @return array[]
* @psalm-return array<string, string>
*/
public function getFallbackDirs()
{
return $this->fallbackDirsPsr0;
}
/**
* @return array[]
* @psalm-return array<string, string>
*/
public function getFallbackDirsPsr4()
{
return $this->fallbackDirsPsr4;
}
/**
* @return string[] Array of classname => path
* @psalm-return array<string, string>
*/
public function getClassMap()
{
return $this->classMap;
}
/**
* @param string[] $classMap Class to filename map
* @psalm-param array<string, string> $classMap
*
* @return void
* @param array $classMap Class to filename map
*/
public function addClassMap(array $classMap)
{
@ -180,10 +112,8 @@ class ClassLoader
* appending or prepending to the ones previously set for this prefix.
*
* @param string $prefix The prefix
* @param string[]|string $paths The PSR-0 root directories
* @param array|string $paths The PSR-0 root directories
* @param bool $prepend Whether to prepend the directories
*
* @return void
*/
public function add($prefix, $paths, $prepend = false)
{
@ -227,12 +157,10 @@ class ClassLoader
* appending or prepending to the ones previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param string[]|string $paths The PSR-4 base directories
* @param array|string $paths The PSR-4 base directories
* @param bool $prepend Whether to prepend the directories
*
* @throws \InvalidArgumentException
*
* @return void
*/
public function addPsr4($prefix, $paths, $prepend = false)
{
@ -277,9 +205,7 @@ class ClassLoader
* replacing any others previously set for this prefix.
*
* @param string $prefix The prefix
* @param string[]|string $paths The PSR-0 base directories
*
* @return void
* @param array|string $paths The PSR-0 base directories
*/
public function set($prefix, $paths)
{
@ -295,11 +221,9 @@ class ClassLoader
* replacing any others previously set for this namespace.
*
* @param string $prefix The prefix/namespace, with trailing '\\'
* @param string[]|string $paths The PSR-4 base directories
* @param array|string $paths The PSR-4 base directories
*
* @throws \InvalidArgumentException
*
* @return void
*/
public function setPsr4($prefix, $paths)
{
@ -319,8 +243,6 @@ class ClassLoader
* Turns on searching the include path for class files.
*
* @param bool $useIncludePath
*
* @return void
*/
public function setUseIncludePath($useIncludePath)
{
@ -343,8 +265,6 @@ class ClassLoader
* that have not been registered with the class map.
*
* @param bool $classMapAuthoritative
*
* @return void
*/
public function setClassMapAuthoritative($classMapAuthoritative)
{
@ -365,8 +285,6 @@ class ClassLoader
* APCu prefix to use to cache found/not-found classes, if the extension is enabled.
*
* @param string|null $apcuPrefix
*
* @return void
*/
public function setApcuPrefix($apcuPrefix)
{
@ -387,18 +305,14 @@ class ClassLoader
* Registers this instance as an autoloader.
*
* @param bool $prepend Whether to prepend the autoloader or not
*
* @return void
*/
public function register($prepend = false)
{
spl_autoload_register(array($this, 'loadClass'), true, $prepend);
if (null === $this->vendorDir) {
return;
}
if ($prepend) {
//no-op
} elseif ($prepend) {
self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders;
} else {
unset(self::$registeredLoaders[$this->vendorDir]);
@ -408,8 +322,6 @@ class ClassLoader
/**
* Unregisters this instance as an autoloader.
*
* @return void
*/
public function unregister()
{
@ -424,18 +336,15 @@ class ClassLoader
* Loads the given class or interface.
*
* @param string $class The name of the class
* @return true|null True if loaded, null otherwise
* @return bool|null True if loaded, null otherwise
*/
public function loadClass($class)
{
if ($file = $this->findFile($class)) {
$includeFile = self::$includeFile;
$includeFile($file);
includeFile($file);
return true;
}
return null;
}
/**
@ -490,11 +399,6 @@ class ClassLoader
return self::$registeredLoaders;
}
/**
* @param string $class
* @param string $ext
* @return string|false
*/
private function findFileWithExtension($class, $ext)
{
// PSR-4 lookup
@ -560,26 +464,14 @@ class ClassLoader
return false;
}
}
/**
* @return void
*/
private static function initializeIncludeClosure()
{
if (self::$includeFile !== null) {
return;
}
/**
/**
* Scope isolated include.
*
* Prevents access to $this/self from included files.
*
* @param string $file
* @return void
*/
self::$includeFile = \Closure::bind(static function($file) {
function includeFile($file)
{
include $file;
}, null, null);
}
}

View File

@ -18,29 +18,459 @@ use Composer\Semver\VersionParser;
/**
* This class is copied in every Composer installed project and available to all
*
* See also https://getcomposer.org/doc/07-runtime.md#installed-versions
*
* To require its presence, you can require `composer-runtime-api ^2.0`
*
* @final
* To require it's presence, you can require `composer-runtime-api ^2.0`
*/
class InstalledVersions
{
/**
* @var mixed[]|null
* @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}|array{}|null
*/
private static $installed;
/**
* @var bool|null
*/
private static $installed = array (
'root' =>
array (
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'aliases' =>
array (
),
'reference' => 'a37eab2610a0a2bcb655258781c1c7e925dc94c0',
'name' => '__root__',
),
'versions' =>
array (
'__root__' =>
array (
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'aliases' =>
array (
),
'reference' => 'a37eab2610a0a2bcb655258781c1c7e925dc94c0',
),
'beberlei/assert' =>
array (
'pretty_version' => 'v3.3.2',
'version' => '3.3.2.0',
'aliases' =>
array (
),
'reference' => 'cb70015c04be1baee6f5f5c953703347c0ac1655',
),
'chillerlan/php-qrcode' =>
array (
'pretty_version' => '4.3.4',
'version' => '4.3.4.0',
'aliases' =>
array (
),
'reference' => '2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d',
),
'chillerlan/php-settings-container' =>
array (
'pretty_version' => '2.1.4',
'version' => '2.1.4.0',
'aliases' =>
array (
),
'reference' => '1beb7df3c14346d4344b0b2e12f6f9a74feabd4a',
),
'doctrine/instantiator' =>
array (
'pretty_version' => '1.4.1',
'version' => '1.4.1.0',
'aliases' =>
array (
),
'reference' => '10dcfce151b967d20fde1b34ae6640712c3891bc',
),
'j4mie/idiorm' =>
array (
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'aliases' =>
array (
0 => '9999999-dev',
),
'reference' => 'efc8ea06698f53e2c479c7696f2b154c47c3a3cb',
),
'jonahgeorge/jaeger-client-php' =>
array (
'pretty_version' => 'v1.4.4',
'version' => '1.4.4.0',
'aliases' =>
array (
),
'reference' => '3173d9c68ad8cea16058f25337982b00cc3d1c2b',
),
'mervick/material-design-icons' =>
array (
'pretty_version' => '2.2.0',
'version' => '2.2.0.0',
'aliases' =>
array (
),
'reference' => '635435c8d3df3a6da3241648caf8a65d1c07cc1a',
),
'myclabs/deep-copy' =>
array (
'pretty_version' => '1.11.0',
'version' => '1.11.0.0',
'aliases' =>
array (
),
'reference' => '14daed4296fae74d9e3201d2c4925d1acb7aa614',
),
'nikic/php-parser' =>
array (
'pretty_version' => 'v4.14.0',
'version' => '4.14.0.0',
'aliases' =>
array (
),
'reference' => '34bea19b6e03d8153165d8f30bba4c3be86184c1',
),
'opentracing/opentracing' =>
array (
'pretty_version' => '1.0.2',
'version' => '1.0.2.0',
'aliases' =>
array (
),
'reference' => 'cd60bd1fb2a25280600bc74c7f9e0c13881a9116',
),
'packaged/thrift' =>
array (
'pretty_version' => '0.13.01',
'version' => '0.13.01.0',
'aliases' =>
array (
),
'reference' => 'e3dbcfb79e319971d64264ffe9c340590cc8a228',
),
'paragonie/constant_time_encoding' =>
array (
'pretty_version' => 'v2.6.3',
'version' => '2.6.3.0',
'aliases' =>
array (
),
'reference' => '58c3f47f650c94ec05a151692652a868995d2938',
),
'phar-io/manifest' =>
array (
'pretty_version' => '2.0.3',
'version' => '2.0.3.0',
'aliases' =>
array (
),
'reference' => '97803eca37d319dfa7826cc2437fc020857acb53',
),
'phar-io/version' =>
array (
'pretty_version' => '3.2.1',
'version' => '3.2.1.0',
'aliases' =>
array (
),
'reference' => '4f7fd7836c6f332bb2933569e566a0d6c4cbed74',
),
'phpdocumentor/reflection-common' =>
array (
'pretty_version' => '2.2.0',
'version' => '2.2.0.0',
'aliases' =>
array (
),
'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b',
),
'phpdocumentor/reflection-docblock' =>
array (
'pretty_version' => '5.3.0',
'version' => '5.3.0.0',
'aliases' =>
array (
),
'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170',
),
'phpdocumentor/type-resolver' =>
array (
'pretty_version' => '1.6.1',
'version' => '1.6.1.0',
'aliases' =>
array (
),
'reference' => '77a32518733312af16a44300404e945338981de3',
),
'phpspec/prophecy' =>
array (
'pretty_version' => 'v1.15.0',
'version' => '1.15.0.0',
'aliases' =>
array (
),
'reference' => 'bbcd7380b0ebf3961ee21409db7b38bc31d69a13',
),
'phpstan/phpstan' =>
array (
'pretty_version' => '1.10.3',
'version' => '1.10.3.0',
'aliases' =>
array (
),
'reference' => '5419375b5891add97dc74be71e6c1c34baaddf64',
),
'phpunit/php-code-coverage' =>
array (
'pretty_version' => '9.2.15',
'version' => '9.2.15.0',
'aliases' =>
array (
),
'reference' => '2e9da11878c4202f97915c1cb4bb1ca318a63f5f',
),
'phpunit/php-file-iterator' =>
array (
'pretty_version' => '3.0.6',
'version' => '3.0.6.0',
'aliases' =>
array (
),
'reference' => 'cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf',
),
'phpunit/php-invoker' =>
array (
'pretty_version' => '3.1.1',
'version' => '3.1.1.0',
'aliases' =>
array (
),
'reference' => '5a10147d0aaf65b58940a0b72f71c9ac0423cc67',
),
'phpunit/php-text-template' =>
array (
'pretty_version' => '2.0.4',
'version' => '2.0.4.0',
'aliases' =>
array (
),
'reference' => '5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28',
),
'phpunit/php-timer' =>
array (
'pretty_version' => '5.0.3',
'version' => '5.0.3.0',
'aliases' =>
array (
),
'reference' => '5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2',
),
'phpunit/phpunit' =>
array (
'pretty_version' => '9.5.16',
'version' => '9.5.16.0',
'aliases' =>
array (
),
'reference' => '5ff8c545a50226c569310a35f4fa89d79f1ddfdc',
),
'psr/cache' =>
array (
'pretty_version' => '3.0.0',
'version' => '3.0.0.0',
'aliases' =>
array (
),
'reference' => 'aa5030cfa5405eccfdcb1083ce040c2cb8d253bf',
),
'psr/log' =>
array (
'pretty_version' => '3.0.0',
'version' => '3.0.0.0',
'aliases' =>
array (
),
'reference' => 'fe5ea303b0887d5caefd3d431c3e61ad47037001',
),
'sebastian/cli-parser' =>
array (
'pretty_version' => '1.0.1',
'version' => '1.0.1.0',
'aliases' =>
array (
),
'reference' => '442e7c7e687e42adc03470c7b668bc4b2402c0b2',
),
'sebastian/code-unit' =>
array (
'pretty_version' => '1.0.8',
'version' => '1.0.8.0',
'aliases' =>
array (
),
'reference' => '1fc9f64c0927627ef78ba436c9b17d967e68e120',
),
'sebastian/code-unit-reverse-lookup' =>
array (
'pretty_version' => '2.0.3',
'version' => '2.0.3.0',
'aliases' =>
array (
),
'reference' => 'ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5',
),
'sebastian/comparator' =>
array (
'pretty_version' => '4.0.6',
'version' => '4.0.6.0',
'aliases' =>
array (
),
'reference' => '55f4261989e546dc112258c7a75935a81a7ce382',
),
'sebastian/complexity' =>
array (
'pretty_version' => '2.0.2',
'version' => '2.0.2.0',
'aliases' =>
array (
),
'reference' => '739b35e53379900cc9ac327b2147867b8b6efd88',
),
'sebastian/diff' =>
array (
'pretty_version' => '4.0.4',
'version' => '4.0.4.0',
'aliases' =>
array (
),
'reference' => '3461e3fccc7cfdfc2720be910d3bd73c69be590d',
),
'sebastian/environment' =>
array (
'pretty_version' => '5.1.4',
'version' => '5.1.4.0',
'aliases' =>
array (
),
'reference' => '1b5dff7bb151a4db11d49d90e5408e4e938270f7',
),
'sebastian/exporter' =>
array (
'pretty_version' => '4.0.4',
'version' => '4.0.4.0',
'aliases' =>
array (
),
'reference' => '65e8b7db476c5dd267e65eea9cab77584d3cfff9',
),
'sebastian/global-state' =>
array (
'pretty_version' => '5.0.5',
'version' => '5.0.5.0',
'aliases' =>
array (
),
'reference' => '0ca8db5a5fc9c8646244e629625ac486fa286bf2',
),
'sebastian/lines-of-code' =>
array (
'pretty_version' => '1.0.3',
'version' => '1.0.3.0',
'aliases' =>
array (
),
'reference' => 'c1c2e997aa3146983ed888ad08b15470a2e22ecc',
),
'sebastian/object-enumerator' =>
array (
'pretty_version' => '4.0.4',
'version' => '4.0.4.0',
'aliases' =>
array (
),
'reference' => '5c9eeac41b290a3712d88851518825ad78f45c71',
),
'sebastian/object-reflector' =>
array (
'pretty_version' => '2.0.4',
'version' => '2.0.4.0',
'aliases' =>
array (
),
'reference' => 'b4f479ebdbf63ac605d183ece17d8d7fe49c15c7',
),
'sebastian/recursion-context' =>
array (
'pretty_version' => '4.0.4',
'version' => '4.0.4.0',
'aliases' =>
array (
),
'reference' => 'cd9d8cf3c5804de4341c283ed787f099f5506172',
),
'sebastian/resource-operations' =>
array (
'pretty_version' => '3.0.3',
'version' => '3.0.3.0',
'aliases' =>
array (
),
'reference' => '0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8',
),
'sebastian/type' =>
array (
'pretty_version' => '2.3.4',
'version' => '2.3.4.0',
'aliases' =>
array (
),
'reference' => 'b8cd8a1c753c90bc1a0f5372170e3e489136f914',
),
'sebastian/version' =>
array (
'pretty_version' => '3.0.2',
'version' => '3.0.2.0',
'aliases' =>
array (
),
'reference' => 'c6c1022351a901512170118436c764e473f6de8c',
),
'spomky-labs/otphp' =>
array (
'pretty_version' => 'v10.0.3',
'version' => '10.0.3.0',
'aliases' =>
array (
),
'reference' => '9784d9f7c790eed26e102d6c78f12c754036c366',
),
'thecodingmachine/safe' =>
array (
'pretty_version' => 'v2.2.2',
'version' => '2.2.2.0',
'aliases' =>
array (
),
'reference' => '440284f9592c9df402832452a6871a8b3c48d97e',
),
'theseer/tokenizer' =>
array (
'pretty_version' => '1.2.1',
'version' => '1.2.1.0',
'aliases' =>
array (
),
'reference' => '34a41e998c2183e22995f158c581e7b5e755ab9e',
),
'webmozart/assert' =>
array (
'pretty_version' => '1.11.0',
'version' => '1.11.0.0',
'aliases' =>
array (
),
'reference' => '11cb2199493b2f8a3b53e7f19068fc6aac760991',
),
),
);
private static $canGetVendors;
/**
* @var array[]
* @psalm-var array<string, array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
private static $installedByVendor = array();
/**
@ -56,6 +486,7 @@ class InstalledVersions
$packages[] = array_keys($installed['versions']);
}
if (1 === \count($packages)) {
return $packages[0];
}
@ -63,42 +494,19 @@ class InstalledVersions
return array_keys(array_flip(\call_user_func_array('array_merge', $packages)));
}
/**
* Returns a list of all package names with a specific type e.g. 'library'
*
* @param string $type
* @return string[]
* @psalm-return list<string>
*/
public static function getInstalledPackagesByType($type)
{
$packagesByType = array();
foreach (self::getInstalled() as $installed) {
foreach ($installed['versions'] as $name => $package) {
if (isset($package['type']) && $package['type'] === $type) {
$packagesByType[] = $name;
}
}
}
return $packagesByType;
}
/**
* Checks whether the given package is installed
*
* This also returns true if the package name is provided or replaced by another package
*
* @param string $packageName
* @param bool $includeDevRequirements
* @return bool
*/
public static function isInstalled($packageName, $includeDevRequirements = true)
public static function isInstalled($packageName)
{
foreach (self::getInstalled() as $installed) {
if (isset($installed['versions'][$packageName])) {
return $includeDevRequirements || empty($installed['versions'][$packageName]['dev_requirement']);
return true;
}
}
@ -115,6 +523,7 @@ class InstalledVersions
* @param VersionParser $parser Install composer/semver to have access to this class and functionality
* @param string $packageName
* @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package
*
* @return bool
*/
public static function satisfies(VersionParser $parser, $packageName, $constraint)
@ -224,26 +633,9 @@ class InstalledVersions
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @param string $packageName
* @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path.
*/
public static function getInstallPath($packageName)
{
foreach (self::getInstalled() as $installed) {
if (!isset($installed['versions'][$packageName])) {
continue;
}
return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null;
}
throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed');
}
/**
* @return array
* @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}
* @psalm-return array{name: string, version: string, reference: string, pretty_version: string, aliases: string[]}
*/
public static function getRootPackage()
{
@ -255,38 +647,14 @@ class InstalledVersions
/**
* Returns the raw installed.php data for custom implementations
*
* @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect.
* @return array[]
* @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}
* @psalm-return array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[]}, versions: list<string, array{pretty_version: ?string, version: ?string, aliases: ?string[], reference: ?string, replaced: ?string[], provided: ?string[]}>}
*/
public static function getRawData()
{
@trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED);
if (null === self::$installed) {
// only require the installed.php file if this file is loaded from its dumped location,
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
if (substr(__DIR__, -8, 1) !== 'C') {
self::$installed = include __DIR__ . '/installed.php';
} else {
self::$installed = array();
}
}
return self::$installed;
}
/**
* Returns the raw data of all installed.php which are currently loaded for custom implementations
*
* @return array[]
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
public static function getAllRawData()
{
return self::getInstalled();
}
/**
* Lets you reload the static array from another file
*
@ -303,7 +671,7 @@ class InstalledVersions
* @param array[] $data A vendor/composer/installed.php data set
* @return void
*
* @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>} $data
* @psalm-param array{root: array{name: string, version: string, reference: string, pretty_version: string, aliases: string[]}, versions: list<string, array{pretty_version: ?string, version: ?string, aliases: ?string[], reference: ?string, replaced: ?string[], provided: ?string[]}>} $data
*/
public static function reload($data)
{
@ -313,7 +681,6 @@ class InstalledVersions
/**
* @return array[]
* @psalm-return list<array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array<string, array{pretty_version?: string, version?: string, reference?: string|null, type?: string, install_path?: string, aliases?: string[], dev_requirement: bool, replaced?: string[], provided?: string[]}>}>
*/
private static function getInstalled()
{
@ -324,27 +691,16 @@ class InstalledVersions
$installed = array();
if (self::$canGetVendors) {
// @phpstan-ignore-next-line
foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) {
if (isset(self::$installedByVendor[$vendorDir])) {
$installed[] = self::$installedByVendor[$vendorDir];
} elseif (is_file($vendorDir.'/composer/installed.php')) {
$installed[] = self::$installedByVendor[$vendorDir] = require $vendorDir.'/composer/installed.php';
if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) {
self::$installed = $installed[count($installed) - 1];
}
}
}
}
if (null === self::$installed) {
// only require the installed.php file if this file is loaded from its dumped location,
// and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937
if (substr(__DIR__, -8, 1) !== 'C') {
self::$installed = require __DIR__ . '/installed.php';
} else {
self::$installed = array();
}
}
$installed[] = self::$installed;
return $installed;

View File

@ -1,4 +1,3 @@
Copyright (c) Nils Adermann, Jordi Boggiano
Permission is hereby granted, free of charge, to any person obtaining a copy
@ -18,4 +17,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
THE SOFTWARE.

View File

@ -2,7 +2,7 @@
// autoload_classmap.php @generated by Composer
$vendorDir = dirname(__DIR__);
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(

View File

@ -2,10 +2,12 @@
// autoload_files.php @generated by Composer
$vendorDir = dirname(__DIR__);
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'9b38cf48e83f5d8f60375221cd213eee' => $vendorDir . '/phpstan/phpstan/bootstrap.php',
'ec07570ca5a812141189b1fa81503674' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert/Functions.php',
'a4ecaeafb8cfb009ad0e052c90355e98' => $vendorDir . '/beberlei/assert/lib/Assert/functions.php',
'6124b4c8570aa390c21fafd04a26c69f' => $vendorDir . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
'51fcf4e06c07cc00c920b44bcd900e7a' => $vendorDir . '/thecodingmachine/safe/deprecated/apc.php',
@ -95,6 +97,7 @@ return array(
'4af1dca6db8c527c6eed27bff85ff0e5' => $vendorDir . '/thecodingmachine/safe/generated/yaz.php',
'fe43ca06499ac37bc2dedd823af71eb5' => $vendorDir . '/thecodingmachine/safe/generated/zip.php',
'356736db98a6834f0a886b8d509b0ecd' => $vendorDir . '/thecodingmachine/safe/generated/zlib.php',
'9b38cf48e83f5d8f60375221cd213eee' => $vendorDir . '/phpstan/phpstan/bootstrap.php',
'ec07570ca5a812141189b1fa81503674' => $vendorDir . '/phpunit/phpunit/src/Framework/Assert/Functions.php',
'ff1b7935a93a4a9517db3ebe0533892a' => $vendorDir . '/opentracing/opentracing/src/OpenTracing/Tags.php',
'0db36546c71c357f5ee70c39bb03966f' => $vendorDir . '/opentracing/opentracing/src/OpenTracing/Formats.php',
'822502b10d2c1dae82956ef999e8b4be' => $vendorDir . '/jonahgeorge/jaeger-client-php/src/Jaeger/Constants.php',
);

View File

@ -2,7 +2,7 @@
// autoload_namespaces.php @generated by Composer
$vendorDir = dirname(__DIR__);
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(

View File

@ -2,7 +2,7 @@
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(__DIR__);
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
@ -10,10 +10,15 @@ return array(
'chillerlan\\Settings\\' => array($vendorDir . '/chillerlan/php-settings-container/src'),
'chillerlan\\QRCode\\' => array($vendorDir . '/chillerlan/php-qrcode/src'),
'Webmozart\\Assert\\' => array($vendorDir . '/webmozart/assert/src'),
'Thrift\\' => array($vendorDir . '/packaged/thrift/src'),
'Psr\\Log\\' => array($vendorDir . '/psr/log/src'),
'Psr\\Cache\\' => array($vendorDir . '/psr/cache/src'),
'Prophecy\\' => array($vendorDir . '/phpspec/prophecy/src/Prophecy'),
'PhpParser\\' => array($vendorDir . '/nikic/php-parser/lib/PhpParser'),
'ParagonIE\\ConstantTime\\' => array($vendorDir . '/paragonie/constant_time_encoding/src'),
'OpenTracing\\' => array($vendorDir . '/opentracing/opentracing/src/OpenTracing'),
'OTPHP\\' => array($vendorDir . '/spomky-labs/otphp/src'),
'Jaeger\\' => array($vendorDir . '/jonahgeorge/jaeger-client-php/src/Jaeger'),
'Doctrine\\Instantiator\\' => array($vendorDir . '/doctrine/instantiator/src/Doctrine/Instantiator'),
'DeepCopy\\' => array($vendorDir . '/myclabs/deep-copy/src/DeepCopy'),
'Assert\\' => array($vendorDir . '/beberlei/assert/lib/Assert'),

View File

@ -23,26 +23,51 @@ class ComposerAutoloaderInit19fc2ff1c0f9a92279c7979386bb2056
}
spl_autoload_register(array('ComposerAutoloaderInit19fc2ff1c0f9a92279c7979386bb2056', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__));
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
spl_autoload_unregister(array('ComposerAutoloaderInit19fc2ff1c0f9a92279c7979386bb2056', 'loadClassLoader'));
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) {
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056::getInitializer($loader));
} else {
$map = require __DIR__ . '/autoload_namespaces.php';
foreach ($map as $namespace => $path) {
$loader->set($namespace, $path);
}
$map = require __DIR__ . '/autoload_psr4.php';
foreach ($map as $namespace => $path) {
$loader->setPsr4($namespace, $path);
}
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
$loader->addClassMap($classMap);
}
}
$loader->register(true);
$filesToLoad = \Composer\Autoload\ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056::$files;
$requireFile = \Closure::bind(static function ($fileIdentifier, $file) {
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
require $file;
if ($useStaticLoader) {
$includeFiles = Composer\Autoload\ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056::$files;
} else {
$includeFiles = require __DIR__ . '/autoload_files.php';
}
}, null, null);
foreach ($filesToLoad as $fileIdentifier => $file) {
$requireFile($fileIdentifier, $file);
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequire19fc2ff1c0f9a92279c7979386bb2056($fileIdentifier, $file);
}
return $loader;
}
}
function composerRequire19fc2ff1c0f9a92279c7979386bb2056($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
require $file;
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;
}
}

View File

@ -7,6 +7,8 @@ namespace Composer\Autoload;
class ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056
{
public static $files = array (
'9b38cf48e83f5d8f60375221cd213eee' => __DIR__ . '/..' . '/phpstan/phpstan/bootstrap.php',
'ec07570ca5a812141189b1fa81503674' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert/Functions.php',
'a4ecaeafb8cfb009ad0e052c90355e98' => __DIR__ . '/..' . '/beberlei/assert/lib/Assert/functions.php',
'6124b4c8570aa390c21fafd04a26c69f' => __DIR__ . '/..' . '/myclabs/deep-copy/src/DeepCopy/deep_copy.php',
'51fcf4e06c07cc00c920b44bcd900e7a' => __DIR__ . '/..' . '/thecodingmachine/safe/deprecated/apc.php',
@ -96,8 +98,9 @@ class ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056
'4af1dca6db8c527c6eed27bff85ff0e5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/yaz.php',
'fe43ca06499ac37bc2dedd823af71eb5' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/zip.php',
'356736db98a6834f0a886b8d509b0ecd' => __DIR__ . '/..' . '/thecodingmachine/safe/generated/zlib.php',
'9b38cf48e83f5d8f60375221cd213eee' => __DIR__ . '/..' . '/phpstan/phpstan/bootstrap.php',
'ec07570ca5a812141189b1fa81503674' => __DIR__ . '/..' . '/phpunit/phpunit/src/Framework/Assert/Functions.php',
'ff1b7935a93a4a9517db3ebe0533892a' => __DIR__ . '/..' . '/opentracing/opentracing/src/OpenTracing/Tags.php',
'0db36546c71c357f5ee70c39bb03966f' => __DIR__ . '/..' . '/opentracing/opentracing/src/OpenTracing/Formats.php',
'822502b10d2c1dae82956ef999e8b4be' => __DIR__ . '/..' . '/jonahgeorge/jaeger-client-php/src/Jaeger/Constants.php',
);
public static $prefixLengthsPsr4 = array (
@ -114,16 +117,27 @@ class ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056
array (
'Webmozart\\Assert\\' => 17,
),
'T' =>
array (
'Thrift\\' => 7,
),
'P' =>
array (
'Psr\\Log\\' => 8,
'Psr\\Cache\\' => 10,
'Prophecy\\' => 9,
'PhpParser\\' => 10,
'ParagonIE\\ConstantTime\\' => 23,
),
'O' =>
array (
'OpenTracing\\' => 12,
'OTPHP\\' => 6,
),
'J' =>
array (
'Jaeger\\' => 7,
),
'D' =>
array (
'Doctrine\\Instantiator\\' => 22,
@ -154,6 +168,18 @@ class ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056
array (
0 => __DIR__ . '/..' . '/webmozart/assert/src',
),
'Thrift\\' =>
array (
0 => __DIR__ . '/..' . '/packaged/thrift/src',
),
'Psr\\Log\\' =>
array (
0 => __DIR__ . '/..' . '/psr/log/src',
),
'Psr\\Cache\\' =>
array (
0 => __DIR__ . '/..' . '/psr/cache/src',
),
'Prophecy\\' =>
array (
0 => __DIR__ . '/..' . '/phpspec/prophecy/src/Prophecy',
@ -166,10 +192,18 @@ class ComposerStaticInit19fc2ff1c0f9a92279c7979386bb2056
array (
0 => __DIR__ . '/..' . '/paragonie/constant_time_encoding/src',
),
'OpenTracing\\' =>
array (
0 => __DIR__ . '/..' . '/opentracing/opentracing/src/OpenTracing',
),
'OTPHP\\' =>
array (
0 => __DIR__ . '/..' . '/spomky-labs/otphp/src',
),
'Jaeger\\' =>
array (
0 => __DIR__ . '/..' . '/jonahgeorge/jaeger-client-php/src/Jaeger',
),
'Doctrine\\Instantiator\\' =>
array (
0 => __DIR__ . '/..' . '/doctrine/instantiator/src/Doctrine/Instantiator',

View File

@ -359,6 +359,77 @@
},
"install-path": "../j4mie/idiorm"
},
{
"name": "jonahgeorge/jaeger-client-php",
"version": "v1.4.4",
"version_normalized": "1.4.4.0",
"source": {
"type": "git",
"url": "https://github.com/jonahgeorge/jaeger-client-php.git",
"reference": "3173d9c68ad8cea16058f25337982b00cc3d1c2b"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/jonahgeorge/jaeger-client-php/zipball/3173d9c68ad8cea16058f25337982b00cc3d1c2b",
"reference": "3173d9c68ad8cea16058f25337982b00cc3d1c2b",
"shasum": ""
},
"require": {
"ext-sockets": "*",
"opentracing/opentracing": "^1.0",
"packaged/thrift": "^0.13",
"php": "^7.1 || ^8.0 || ^8.1",
"psr/cache": "^1.0 || ^2.0 || ^3.0",
"psr/log": "^1.0 || ^2.0 || ^3.0"
},
"require-dev": {
"cache/array-adapter": "^1.0",
"phpunit/phpunit": "^7 || ^8 || ^9",
"squizlabs/php_codesniffer": "3.*",
"symfony/polyfill-php73": "^1.10"
},
"time": "2023-01-31T13:40:20+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
"files": [
"./src/Jaeger/Constants.php"
],
"psr-4": {
"Jaeger\\": "src/Jaeger/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jonah George",
"homepage": "http://twitter.com/jonahgeorge"
},
{
"name": "José Carlos Chávez",
"email": "jcchavezs@gmail.com"
},
{
"name": "Contributors",
"homepage": "https://github.com/jonahgeorge/jaeger-client-php/graphs/contributors"
}
],
"description": "Jaeger Bindings for PHP OpenTracing API",
"keywords": [
"jaeger",
"opentracing",
"trace",
"tracing"
],
"support": {
"issues": "https://github.com/jonahgeorge/jaeger-client-php/issues",
"source": "https://github.com/jonahgeorge/jaeger-client-php/tree/v1.4.4"
},
"install-path": "../jonahgeorge/jaeger-client-php"
},
{
"name": "mervick/material-design-icons",
"version": "2.2.0",
@ -526,6 +597,100 @@
},
"install-path": "../nikic/php-parser"
},
{
"name": "opentracing/opentracing",
"version": "1.0.2",
"version_normalized": "1.0.2.0",
"source": {
"type": "git",
"url": "https://github.com/opentracing/opentracing-php.git",
"reference": "cd60bd1fb2a25280600bc74c7f9e0c13881a9116"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/opentracing/opentracing-php/zipball/cd60bd1fb2a25280600bc74c7f9e0c13881a9116",
"reference": "cd60bd1fb2a25280600bc74c7f9e0c13881a9116",
"shasum": ""
},
"require": {
"php": "^7.1 || ^8.0"
},
"require-dev": {
"phpstan/phpstan": "~0.12",
"phpunit/phpunit": "^7.0 || ^9.0",
"squizlabs/php_codesniffer": "3.*"
},
"time": "2022-01-27T19:59:21+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
"files": [
"src/OpenTracing/Tags.php",
"src/OpenTracing/Formats.php"
],
"psr-4": {
"OpenTracing\\": "src/OpenTracing/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"authors": [
{
"name": "José Carlos Chávez",
"email": "jcchavezs@gmail.com"
}
],
"description": "OpenTracing API for PHP",
"support": {
"issues": "https://github.com/opentracing/opentracing-php/issues",
"source": "https://github.com/opentracing/opentracing-php/tree/1.0.2"
},
"install-path": "../opentracing/opentracing"
},
{
"name": "packaged/thrift",
"version": "0.13.01",
"version_normalized": "0.13.01.0",
"source": {
"type": "git",
"url": "https://github.com/packaged/thrift.git",
"reference": "e3dbcfb79e319971d64264ffe9c340590cc8a228"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/packaged/thrift/zipball/e3dbcfb79e319971d64264ffe9c340590cc8a228",
"reference": "e3dbcfb79e319971d64264ffe9c340590cc8a228",
"shasum": ""
},
"require": {
"php": "^5.5 || ^7.0 || ^8.0"
},
"time": "2021-01-25T13:32:28+00:00",
"type": "library",
"installation-source": "dist",
"autoload": {
"psr-4": {
"Thrift\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"Apache-2.0"
],
"description": "Apache Thrift",
"homepage": "http://thrift.apache.org/",
"keywords": [
"apache",
"thrift"
],
"support": {
"issues": "https://github.com/packaged/thrift/issues",
"source": "https://github.com/packaged/thrift/tree/0.13.01"
},
"install-path": "../packaged/thrift"
},
{
"name": "paragonie/constant_time_encoding",
"version": "v2.6.3",
@ -1453,6 +1618,111 @@
],
"install-path": "../phpunit/phpunit"
},
{
"name": "psr/cache",
"version": "3.0.0",
"version_normalized": "3.0.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/cache.git",
"reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
"reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf",
"shasum": ""
},
"require": {
"php": ">=8.0.0"
},
"time": "2021-02-03T23:26:27+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "1.0.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"Psr\\Cache\\": "src/"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for caching libraries",
"keywords": [
"cache",
"psr",
"psr-6"
],
"support": {
"source": "https://github.com/php-fig/cache/tree/3.0.0"
},
"install-path": "../psr/cache"
},
{
"name": "psr/log",
"version": "3.0.0",
"version_normalized": "3.0.0.0",
"source": {
"type": "git",
"url": "https://github.com/php-fig/log.git",
"reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001",
"reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001",
"shasum": ""
},
"require": {
"php": ">=8.0.0"
},
"time": "2021-07-14T16:46:02+00:00",
"type": "library",
"extra": {
"branch-alias": {
"dev-master": "3.x-dev"
}
},
"installation-source": "dist",
"autoload": {
"psr-4": {
"Psr\\Log\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "PHP-FIG",
"homepage": "https://www.php-fig.org/"
}
],
"description": "Common interface for logging libraries",
"homepage": "https://github.com/php-fig/log",
"keywords": [
"log",
"psr",
"psr-3"
],
"support": {
"source": "https://github.com/php-fig/log/tree/3.0.0"
},
"install-path": "../psr/log"
},
{
"name": "sebastian/cli-parser",
"version": "1.0.1",

View File

@ -1,403 +1,448 @@
<?php return array(
'root' => array(
<?php return array (
'root' =>
array (
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'aliases' =>
array (
),
'reference' => 'a37eab2610a0a2bcb655258781c1c7e925dc94c0',
'name' => '__root__',
),
'versions' =>
array (
'__root__' =>
array (
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => 'b7a6c948d078a59739f14de8454e0e7237d0722e',
'type' => 'library',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'dev' => true,
'aliases' =>
array (
),
'versions' => array(
'__root__' => array(
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => 'b7a6c948d078a59739f14de8454e0e7237d0722e',
'type' => 'library',
'install_path' => __DIR__ . '/../../',
'aliases' => array(),
'dev_requirement' => false,
'reference' => 'a37eab2610a0a2bcb655258781c1c7e925dc94c0',
),
'beberlei/assert' => array(
'beberlei/assert' =>
array (
'pretty_version' => 'v3.3.2',
'version' => '3.3.2.0',
'reference' => 'cb70015c04be1baee6f5f5c953703347c0ac1655',
'type' => 'library',
'install_path' => __DIR__ . '/../beberlei/assert',
'aliases' => array(),
'dev_requirement' => false,
'aliases' =>
array (
),
'chillerlan/php-qrcode' => array(
'reference' => 'cb70015c04be1baee6f5f5c953703347c0ac1655',
),
'chillerlan/php-qrcode' =>
array (
'pretty_version' => '4.3.4',
'version' => '4.3.4.0',
'reference' => '2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d',
'type' => 'library',
'install_path' => __DIR__ . '/../chillerlan/php-qrcode',
'aliases' => array(),
'dev_requirement' => false,
'aliases' =>
array (
),
'chillerlan/php-settings-container' => array(
'reference' => '2ca4bf5ae048af1981d1023ee42a0a2a9d51e51d',
),
'chillerlan/php-settings-container' =>
array (
'pretty_version' => '2.1.4',
'version' => '2.1.4.0',
'reference' => '1beb7df3c14346d4344b0b2e12f6f9a74feabd4a',
'type' => 'library',
'install_path' => __DIR__ . '/../chillerlan/php-settings-container',
'aliases' => array(),
'dev_requirement' => false,
'aliases' =>
array (
),
'doctrine/instantiator' => array(
'reference' => '1beb7df3c14346d4344b0b2e12f6f9a74feabd4a',
),
'doctrine/instantiator' =>
array (
'pretty_version' => '1.4.1',
'version' => '1.4.1.0',
'reference' => '10dcfce151b967d20fde1b34ae6640712c3891bc',
'type' => 'library',
'install_path' => __DIR__ . '/../doctrine/instantiator',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'j4mie/idiorm' => array(
'reference' => '10dcfce151b967d20fde1b34ae6640712c3891bc',
),
'j4mie/idiorm' =>
array (
'pretty_version' => 'dev-master',
'version' => 'dev-master',
'reference' => 'efc8ea06698f53e2c479c7696f2b154c47c3a3cb',
'type' => 'library',
'install_path' => __DIR__ . '/../j4mie/idiorm',
'aliases' => array(
'aliases' =>
array (
0 => '9999999-dev',
),
'dev_requirement' => false,
'reference' => 'efc8ea06698f53e2c479c7696f2b154c47c3a3cb',
),
'mervick/material-design-icons' => array(
'jonahgeorge/jaeger-client-php' =>
array (
'pretty_version' => 'v1.4.4',
'version' => '1.4.4.0',
'aliases' =>
array (
),
'reference' => '3173d9c68ad8cea16058f25337982b00cc3d1c2b',
),
'mervick/material-design-icons' =>
array (
'pretty_version' => '2.2.0',
'version' => '2.2.0.0',
'reference' => '635435c8d3df3a6da3241648caf8a65d1c07cc1a',
'type' => 'library',
'install_path' => __DIR__ . '/../mervick/material-design-icons',
'aliases' => array(),
'dev_requirement' => false,
'aliases' =>
array (
),
'myclabs/deep-copy' => array(
'reference' => '635435c8d3df3a6da3241648caf8a65d1c07cc1a',
),
'myclabs/deep-copy' =>
array (
'pretty_version' => '1.11.0',
'version' => '1.11.0.0',
'reference' => '14daed4296fae74d9e3201d2c4925d1acb7aa614',
'type' => 'library',
'install_path' => __DIR__ . '/../myclabs/deep-copy',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'nikic/php-parser' => array(
'reference' => '14daed4296fae74d9e3201d2c4925d1acb7aa614',
),
'nikic/php-parser' =>
array (
'pretty_version' => 'v4.14.0',
'version' => '4.14.0.0',
'reference' => '34bea19b6e03d8153165d8f30bba4c3be86184c1',
'type' => 'library',
'install_path' => __DIR__ . '/../nikic/php-parser',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'paragonie/constant_time_encoding' => array(
'reference' => '34bea19b6e03d8153165d8f30bba4c3be86184c1',
),
'opentracing/opentracing' =>
array (
'pretty_version' => '1.0.2',
'version' => '1.0.2.0',
'aliases' =>
array (
),
'reference' => 'cd60bd1fb2a25280600bc74c7f9e0c13881a9116',
),
'packaged/thrift' =>
array (
'pretty_version' => '0.13.01',
'version' => '0.13.01.0',
'aliases' =>
array (
),
'reference' => 'e3dbcfb79e319971d64264ffe9c340590cc8a228',
),
'paragonie/constant_time_encoding' =>
array (
'pretty_version' => 'v2.6.3',
'version' => '2.6.3.0',
'reference' => '58c3f47f650c94ec05a151692652a868995d2938',
'type' => 'library',
'install_path' => __DIR__ . '/../paragonie/constant_time_encoding',
'aliases' => array(),
'dev_requirement' => false,
'aliases' =>
array (
),
'phar-io/manifest' => array(
'reference' => '58c3f47f650c94ec05a151692652a868995d2938',
),
'phar-io/manifest' =>
array (
'pretty_version' => '2.0.3',
'version' => '2.0.3.0',
'reference' => '97803eca37d319dfa7826cc2437fc020857acb53',
'type' => 'library',
'install_path' => __DIR__ . '/../phar-io/manifest',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'phar-io/version' => array(
'reference' => '97803eca37d319dfa7826cc2437fc020857acb53',
),
'phar-io/version' =>
array (
'pretty_version' => '3.2.1',
'version' => '3.2.1.0',
'reference' => '4f7fd7836c6f332bb2933569e566a0d6c4cbed74',
'type' => 'library',
'install_path' => __DIR__ . '/../phar-io/version',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'phpdocumentor/reflection-common' => array(
'reference' => '4f7fd7836c6f332bb2933569e566a0d6c4cbed74',
),
'phpdocumentor/reflection-common' =>
array (
'pretty_version' => '2.2.0',
'version' => '2.2.0.0',
'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b',
'type' => 'library',
'install_path' => __DIR__ . '/../phpdocumentor/reflection-common',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'phpdocumentor/reflection-docblock' => array(
'reference' => '1d01c49d4ed62f25aa84a747ad35d5a16924662b',
),
'phpdocumentor/reflection-docblock' =>
array (
'pretty_version' => '5.3.0',
'version' => '5.3.0.0',
'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170',
'type' => 'library',
'install_path' => __DIR__ . '/../phpdocumentor/reflection-docblock',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'phpdocumentor/type-resolver' => array(
'reference' => '622548b623e81ca6d78b721c5e029f4ce664f170',
),
'phpdocumentor/type-resolver' =>
array (
'pretty_version' => '1.6.1',
'version' => '1.6.1.0',
'reference' => '77a32518733312af16a44300404e945338981de3',
'type' => 'library',
'install_path' => __DIR__ . '/../phpdocumentor/type-resolver',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'phpspec/prophecy' => array(
'reference' => '77a32518733312af16a44300404e945338981de3',
),
'phpspec/prophecy' =>
array (
'pretty_version' => 'v1.15.0',
'version' => '1.15.0.0',
'reference' => 'bbcd7380b0ebf3961ee21409db7b38bc31d69a13',
'type' => 'library',
'install_path' => __DIR__ . '/../phpspec/prophecy',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'phpstan/phpstan' => array(
'reference' => 'bbcd7380b0ebf3961ee21409db7b38bc31d69a13',
),
'phpstan/phpstan' =>
array (
'pretty_version' => '1.10.3',
'version' => '1.10.3.0',
'reference' => '5419375b5891add97dc74be71e6c1c34baaddf64',
'type' => 'library',
'install_path' => __DIR__ . '/../phpstan/phpstan',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'phpunit/php-code-coverage' => array(
'reference' => '5419375b5891add97dc74be71e6c1c34baaddf64',
),
'phpunit/php-code-coverage' =>
array (
'pretty_version' => '9.2.15',
'version' => '9.2.15.0',
'reference' => '2e9da11878c4202f97915c1cb4bb1ca318a63f5f',
'type' => 'library',
'install_path' => __DIR__ . '/../phpunit/php-code-coverage',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'phpunit/php-file-iterator' => array(
'reference' => '2e9da11878c4202f97915c1cb4bb1ca318a63f5f',
),
'phpunit/php-file-iterator' =>
array (
'pretty_version' => '3.0.6',
'version' => '3.0.6.0',
'reference' => 'cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf',
'type' => 'library',
'install_path' => __DIR__ . '/../phpunit/php-file-iterator',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'phpunit/php-invoker' => array(
'reference' => 'cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf',
),
'phpunit/php-invoker' =>
array (
'pretty_version' => '3.1.1',
'version' => '3.1.1.0',
'reference' => '5a10147d0aaf65b58940a0b72f71c9ac0423cc67',
'type' => 'library',
'install_path' => __DIR__ . '/../phpunit/php-invoker',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'phpunit/php-text-template' => array(
'reference' => '5a10147d0aaf65b58940a0b72f71c9ac0423cc67',
),
'phpunit/php-text-template' =>
array (
'pretty_version' => '2.0.4',
'version' => '2.0.4.0',
'reference' => '5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28',
'type' => 'library',
'install_path' => __DIR__ . '/../phpunit/php-text-template',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'phpunit/php-timer' => array(
'reference' => '5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28',
),
'phpunit/php-timer' =>
array (
'pretty_version' => '5.0.3',
'version' => '5.0.3.0',
'reference' => '5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2',
'type' => 'library',
'install_path' => __DIR__ . '/../phpunit/php-timer',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'phpunit/phpunit' => array(
'reference' => '5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2',
),
'phpunit/phpunit' =>
array (
'pretty_version' => '9.5.16',
'version' => '9.5.16.0',
'reference' => '5ff8c545a50226c569310a35f4fa89d79f1ddfdc',
'type' => 'library',
'install_path' => __DIR__ . '/../phpunit/phpunit',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'sebastian/cli-parser' => array(
'reference' => '5ff8c545a50226c569310a35f4fa89d79f1ddfdc',
),
'psr/cache' =>
array (
'pretty_version' => '3.0.0',
'version' => '3.0.0.0',
'aliases' =>
array (
),
'reference' => 'aa5030cfa5405eccfdcb1083ce040c2cb8d253bf',
),
'psr/log' =>
array (
'pretty_version' => '3.0.0',
'version' => '3.0.0.0',
'aliases' =>
array (
),
'reference' => 'fe5ea303b0887d5caefd3d431c3e61ad47037001',
),
'sebastian/cli-parser' =>
array (
'pretty_version' => '1.0.1',
'version' => '1.0.1.0',
'reference' => '442e7c7e687e42adc03470c7b668bc4b2402c0b2',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/cli-parser',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'sebastian/code-unit' => array(
'reference' => '442e7c7e687e42adc03470c7b668bc4b2402c0b2',
),
'sebastian/code-unit' =>
array (
'pretty_version' => '1.0.8',
'version' => '1.0.8.0',
'reference' => '1fc9f64c0927627ef78ba436c9b17d967e68e120',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/code-unit',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'sebastian/code-unit-reverse-lookup' => array(
'reference' => '1fc9f64c0927627ef78ba436c9b17d967e68e120',
),
'sebastian/code-unit-reverse-lookup' =>
array (
'pretty_version' => '2.0.3',
'version' => '2.0.3.0',
'reference' => 'ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/code-unit-reverse-lookup',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'sebastian/comparator' => array(
'reference' => 'ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5',
),
'sebastian/comparator' =>
array (
'pretty_version' => '4.0.6',
'version' => '4.0.6.0',
'reference' => '55f4261989e546dc112258c7a75935a81a7ce382',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/comparator',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'sebastian/complexity' => array(
'reference' => '55f4261989e546dc112258c7a75935a81a7ce382',
),
'sebastian/complexity' =>
array (
'pretty_version' => '2.0.2',
'version' => '2.0.2.0',
'reference' => '739b35e53379900cc9ac327b2147867b8b6efd88',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/complexity',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'sebastian/diff' => array(
'reference' => '739b35e53379900cc9ac327b2147867b8b6efd88',
),
'sebastian/diff' =>
array (
'pretty_version' => '4.0.4',
'version' => '4.0.4.0',
'reference' => '3461e3fccc7cfdfc2720be910d3bd73c69be590d',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/diff',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'sebastian/environment' => array(
'reference' => '3461e3fccc7cfdfc2720be910d3bd73c69be590d',
),
'sebastian/environment' =>
array (
'pretty_version' => '5.1.4',
'version' => '5.1.4.0',
'reference' => '1b5dff7bb151a4db11d49d90e5408e4e938270f7',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/environment',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'sebastian/exporter' => array(
'reference' => '1b5dff7bb151a4db11d49d90e5408e4e938270f7',
),
'sebastian/exporter' =>
array (
'pretty_version' => '4.0.4',
'version' => '4.0.4.0',
'reference' => '65e8b7db476c5dd267e65eea9cab77584d3cfff9',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/exporter',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'sebastian/global-state' => array(
'reference' => '65e8b7db476c5dd267e65eea9cab77584d3cfff9',
),
'sebastian/global-state' =>
array (
'pretty_version' => '5.0.5',
'version' => '5.0.5.0',
'reference' => '0ca8db5a5fc9c8646244e629625ac486fa286bf2',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/global-state',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'sebastian/lines-of-code' => array(
'reference' => '0ca8db5a5fc9c8646244e629625ac486fa286bf2',
),
'sebastian/lines-of-code' =>
array (
'pretty_version' => '1.0.3',
'version' => '1.0.3.0',
'reference' => 'c1c2e997aa3146983ed888ad08b15470a2e22ecc',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/lines-of-code',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'sebastian/object-enumerator' => array(
'reference' => 'c1c2e997aa3146983ed888ad08b15470a2e22ecc',
),
'sebastian/object-enumerator' =>
array (
'pretty_version' => '4.0.4',
'version' => '4.0.4.0',
'reference' => '5c9eeac41b290a3712d88851518825ad78f45c71',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/object-enumerator',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'sebastian/object-reflector' => array(
'reference' => '5c9eeac41b290a3712d88851518825ad78f45c71',
),
'sebastian/object-reflector' =>
array (
'pretty_version' => '2.0.4',
'version' => '2.0.4.0',
'reference' => 'b4f479ebdbf63ac605d183ece17d8d7fe49c15c7',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/object-reflector',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'sebastian/recursion-context' => array(
'reference' => 'b4f479ebdbf63ac605d183ece17d8d7fe49c15c7',
),
'sebastian/recursion-context' =>
array (
'pretty_version' => '4.0.4',
'version' => '4.0.4.0',
'reference' => 'cd9d8cf3c5804de4341c283ed787f099f5506172',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/recursion-context',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'sebastian/resource-operations' => array(
'reference' => 'cd9d8cf3c5804de4341c283ed787f099f5506172',
),
'sebastian/resource-operations' =>
array (
'pretty_version' => '3.0.3',
'version' => '3.0.3.0',
'reference' => '0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/resource-operations',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'sebastian/type' => array(
'reference' => '0f4443cb3a1d92ce809899753bc0d5d5a8dd19a8',
),
'sebastian/type' =>
array (
'pretty_version' => '2.3.4',
'version' => '2.3.4.0',
'reference' => 'b8cd8a1c753c90bc1a0f5372170e3e489136f914',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/type',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'sebastian/version' => array(
'reference' => 'b8cd8a1c753c90bc1a0f5372170e3e489136f914',
),
'sebastian/version' =>
array (
'pretty_version' => '3.0.2',
'version' => '3.0.2.0',
'reference' => 'c6c1022351a901512170118436c764e473f6de8c',
'type' => 'library',
'install_path' => __DIR__ . '/../sebastian/version',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'spomky-labs/otphp' => array(
'reference' => 'c6c1022351a901512170118436c764e473f6de8c',
),
'spomky-labs/otphp' =>
array (
'pretty_version' => 'v10.0.3',
'version' => '10.0.3.0',
'reference' => '9784d9f7c790eed26e102d6c78f12c754036c366',
'type' => 'library',
'install_path' => __DIR__ . '/../spomky-labs/otphp',
'aliases' => array(),
'dev_requirement' => false,
'aliases' =>
array (
),
'thecodingmachine/safe' => array(
'reference' => '9784d9f7c790eed26e102d6c78f12c754036c366',
),
'thecodingmachine/safe' =>
array (
'pretty_version' => 'v2.2.2',
'version' => '2.2.2.0',
'reference' => '440284f9592c9df402832452a6871a8b3c48d97e',
'type' => 'library',
'install_path' => __DIR__ . '/../thecodingmachine/safe',
'aliases' => array(),
'dev_requirement' => false,
'aliases' =>
array (
),
'theseer/tokenizer' => array(
'reference' => '440284f9592c9df402832452a6871a8b3c48d97e',
),
'theseer/tokenizer' =>
array (
'pretty_version' => '1.2.1',
'version' => '1.2.1.0',
'reference' => '34a41e998c2183e22995f158c581e7b5e755ab9e',
'type' => 'library',
'install_path' => __DIR__ . '/../theseer/tokenizer',
'aliases' => array(),
'dev_requirement' => true,
'aliases' =>
array (
),
'webmozart/assert' => array(
'reference' => '34a41e998c2183e22995f158c581e7b5e755ab9e',
),
'webmozart/assert' =>
array (
'pretty_version' => '1.11.0',
'version' => '1.11.0.0',
'aliases' =>
array (
),
'reference' => '11cb2199493b2f8a3b53e7f19068fc6aac760991',
'type' => 'library',
'install_path' => __DIR__ . '/../webmozart/assert',
'aliases' => array(),
'dev_requirement' => true,
),
),
);

View File

@ -0,0 +1,16 @@
root = true
[*]
charset = utf-8
end_of_line = lf
insert_final_newline = true
indent_style = space
indent_size = 4
trim_trailing_whitespace = true
[*.md]
trim_trailing_whitespace = false
[*.yml]
indent_style = space
indent_size = 2

View File

@ -0,0 +1,44 @@
name: Test
on: [push, pull_request]
jobs:
run:
runs-on: ubuntu-latest
strategy:
matrix:
php-versions: ['7.1', '7.2', '7.3', '7.4', '8.0', '8.1']
name: PHP ${{ matrix.php-versions }}
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: ${{ matrix.php-versions }}
coverage: xdebug
- name: Get composer cache directory
id: composercache
run: echo "::set-output name=dir::$(composer config cache-files-dir)"
- name: Cache dependencies
uses: actions/cache@v2
with:
path: ${{ steps.composercache.outputs.dir }}
key: ${{ runner.os }}-composer-${{ hashFiles('**/composer.lock') }}
restore-keys: ${{ runner.os }}-composer-
- name: Install dependencies
run: |
composer install \
--no-interaction \
--no-ansi \
--no-progress
- name: Run lint
run: composer lint
- name: Run test
run: composer test

View File

@ -0,0 +1,17 @@
# Please do not use this ignore file to define platform specific files.
#
# For these purposes create a global .gitignore file, which is a list of rules
# for ignoring files in every Git repository on your computer.
#
# https://help.github.com/articles/ignoring-files/#create-a-global-gitignore
jaeger-idl
vendor
composer.lock
composer.phar
jaeger-client-php.iml
phpunit.xml
phpcs.xml

View File

@ -0,0 +1,3 @@
# How to Contribute to Jaeger
We'd love your help!

View File

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2018 Jonah George, José Carlos Chávez
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

View File

@ -0,0 +1,219 @@
![Build Status](https://github.com/jonahgeorge/jaeger-client-php/workflows/Test/badge.svg) [![PHP version][packagist-img]][packagist]
# Jaeger Bindings for PHP OpenTracing API
This is a client-side library that can be used to instrument PHP apps for distributed trace collection,
and to send those traces to Jaeger. See the [OpenTracing PHP API](https://github.com/opentracing/opentracing-php)
for additional detail.
## Contributing and Developing
Please see [CONTRIBUTING.md](./CONTRIBUTING.md).
## Installation
Jaeger client can be installed via Composer:
```bash
composer require jonahgeorge/jaeger-client-php
```
## Getting Started
```php
<?php
require_once 'vendor/autoload.php';
use Jaeger\Config;
use OpenTracing\GlobalTracer;
$config = new Config(
[
'sampler' => [
'type' => Jaeger\SAMPLER_TYPE_CONST,
'param' => true,
],
'logging' => true,
],
'your-app-name'
);
$config->initializeTracer();
$tracer = GlobalTracer::get();
$scope = $tracer->startActiveSpan('TestSpan', []);
$scope->close();
$tracer->flush();
```
### Samplers
List of supported samplers, for more info about samplers, please read [Jaeger Sampling](https://www.jaegertracing.io/docs/1.9/sampling/) guide.
#### Const sampler
This sampler either samples everything, or nothing.
##### Configuration
```
'sampler' => [
'type' => Jaeger\SAMPLER_TYPE_CONST,
'param' => true, // boolean wheter to trace or not
],
```
#### Probabilistic sampler
This sampler samples request by given rate.
##### Configuration
```
'sampler' => [
'type' => Jaeger\SAMPLER_TYPE_PROBABILISTIC,
'param' => 0.5, // float [0.0, 1.0]
],
```
#### Rate limiting sampler
Samples maximum specified number of traces (requests) per second.
##### Requirements
* `psr/cache` PSR-6 cache component to store and retrieve sampler state between requests.
Cache component is passed to `Jaeger\Config` trough its constructor.
* `hrtime()` function, that can retrieve time in nanoseconds. You need either `php 7.3` or [PECL/hrtime](http://pecl.php.net/package/hrtime) extension.
##### Configuration
```
'sampler' => [
'type' => Jaeger\SAMPLER_TYPE_RATE_LIMITING,
'param' => 100 // integer maximum number of traces per second,
'cache' => [
'currentBalanceKey' => 'rate.currentBalance' // string
'lastTickKey' => 'rate.lastTick' // string
]
],
```
## Dispatch mode
The library supports 3 ways of sending data to Jaeger Agent:
1. `Zipkin.thrift` over Compact protocol (socket - UDP) - default
2. `Jaeger.thrift` over Binary protocol (socket - UDP)
2. `Jaeger.thrift` over Binary protocol (HTTP)
If you want to enable "`Jaeger.thrift` over Binary protocol" one or other, than
you need to set `dispatch_mode` config option or `JAEGER_DISPATCH_MODE` env
variable.
Allowed values for `dispatch_mode` are:
- `jaeger_over_binary_udp`
- `jaeger_over_binary_http`
- `zipkin_over_compact_udp`
There are 3 constants available, so it is better to use them:
```php
class Config
{
const ZIPKIN_OVER_COMPACT_UDP = "zipkin_over_compact_udp";
const JAEGER_OVER_BINARY_UDP = "jaeger_over_binary_udp";
const JAEGER_OVER_BINARY_HTTP = "jaeger_over_binary_http";
...
}
```
A possible config with custom `dispatch_mode` can look like this:
```php
// config.php
use Jaeger\Config;
return [
'sampler' => [
'type' => Jaeger\SAMPLER_TYPE_CONST,
'param' => true,
],
'logging' => true,
"tags" => [
// process. prefix works only with JAEGER_OVER_HTTP, JAEGER_OVER_BINARY
// otherwise it will be shown as simple global tag
"process.process-tag-key-1" => "process-value-1", // all tags with `process.` prefix goes to process section
"process.process-tag-key-2" => "process-value-2", // all tags with `process.` prefix goes to process section
"global-tag-key-1" => "global-tag-value-1", // this tag will be appended to all spans
"global-tag-key-2" => "global-tag-value-2", // this tag will be appended to all spans
],
"local_agent" => [
"reporting_host" => "localhost",
// You can override port by setting local_agent.reporting_port value
"reporting_port" => 6832
],
// Different ways to send data to Jaeger. Config::ZIPKIN_OVER_COMPACT - default):
'dispatch_mode' => Config::JAEGER_OVER_BINARY_UDP,
];
```
The full example you can see at `examples` directory.
By default, for each `dispatch_mode` there is default `reporting_port` config value. Table with
default values you can see below:
`dispatch_mode` | default `reporting_port`
------------------------ | ----------------
ZIPKIN_OVER_COMPACT_UDP | 5775
JAEGER_OVER_BINARY_UDP | 6832
JAEGER_OVER_BINARY_HTTP | 14268
## IPv6
In case you need IPv6 support you need to set `ip_version` Config variable.
By default, IPv4 is used. There is an alias `Config::IP_VERSION` which you can use
as an alternative to raw `ip_version`.
Example:
```php
use Jaeger\Config;
$config = new Config(
[
"ip_version" => Config::IPV6, // <-- or use Config::IP_VERSION constant
'logging' => true,
'dispatch_mode' => Config::JAEGER_OVER_BINARY_UDP,
],
'serviceNameExample',
);
$config->initializeTracer();
```
or
```php
use Jaeger\Config;
$config = new Config(
[
Config::IP_VERSION => Config::IPV6, // <--
'logging' => true,
'dispatch_mode' => Config::JAEGER_OVER_BINARY_UDP,
],
'serviceNameExample',
);
$config->initializeTracer();
```
## Testing
Tests are located in the `tests` directory. See [tests/README.md](./tests/README.md).
## Roadmap
- [Support Span baggage](https://github.com/jonahgeorge/jaeger-client-php/issues/5)
- [Support Tracer metrics](https://github.com/jonahgeorge/jaeger-client-php/issues/12)
- [Support Tracer error reporting](https://github.com/jonahgeorge/jaeger-client-php/issues/13)
## License
[MIT License](./LICENSE).
[ci-img]: https://travis-ci.org/jonahgeorge/jaeger-client-php.svg?branch=travis
[ci]: https://travis-ci.org/jonahgeorge/jaeger-client-php
[packagist-img]: https://badge.fury.io/ph/jonahgeorge%2Fjaeger-client-php.svg
[packagist]: https://badge.fury.io/ph/jonahgeorge%2Fjaeger-client-php

View File

@ -0,0 +1,2 @@
*
!.gitignore

View File

@ -0,0 +1,62 @@
{
"name": "jonahgeorge/jaeger-client-php",
"description": "Jaeger Bindings for PHP OpenTracing API",
"keywords": [
"jaeger",
"opentracing",
"trace",
"tracing"
],
"license": "MIT",
"authors": [
{
"name": "Jonah George",
"homepage": "http://twitter.com/jonahgeorge"
},
{
"name": "José Carlos Chávez",
"email": "jcchavezs@gmail.com"
},
{
"name": "Contributors",
"homepage": "https://github.com/jonahgeorge/jaeger-client-php/graphs/contributors"
}
],
"require": {
"php": "^7.1 || ^8.0 || ^8.1",
"ext-sockets": "*",
"opentracing/opentracing": "^1.0",
"packaged/thrift": "^0.13",
"psr/cache": "^1.0 || ^2.0 || ^3.0",
"psr/log": "^1.0 || ^2.0 || ^3.0"
},
"require-dev": {
"phpunit/phpunit": "^7 || ^8 || ^9",
"squizlabs/php_codesniffer": "3.*",
"cache/array-adapter": "^1.0",
"symfony/polyfill-php73": "^1.10"
},
"config": {
"optimize-autoloader": true,
"preferred-install": "dist",
"sort-packages": true
},
"autoload": {
"psr-4": {
"Jaeger\\": "src/Jaeger/"
},
"files": [
"./src/Jaeger/Constants.php"
]
},
"autoload-dev": {
"Jaeger\\Tests\\": "tests/Jaeger/"
},
"minimum-stability": "dev",
"prefer-stable": true,
"scripts": {
"fix-lint": "./vendor/bin/phpcbf",
"lint": "./vendor/bin/phpcs",
"test": "./vendor/bin/phpunit"
}
}

View File

@ -0,0 +1,26 @@
<?php
use Jaeger\Config;
return [
'sampler' => [
'type' => Jaeger\SAMPLER_TYPE_CONST,
'param' => true,
],
'logging' => true,
"tags" => [
// process. prefix works only with JAEGER_OVER_HTTP, JAEGER_OVER_BINARY
// otherwise it will be shown as simple global tag
"process.process-tag-key-1" => "process-value-1", // all tags with `process.` prefix goes to process section
"process.process-tag-key-2" => "process-value-2", // all tags with `process.` prefix goes to process section
"global-tag-key-1" => "global-tag-value-1", // this tag will be appended to all spans
"global-tag-key-2" => "global-tag-value-2", // this tag will be appended to all spans
],
"local_agent" => [
"reporting_host" => "localhost",
// You can override port by setting local_agent.reporting_port value
// "reporting_port" => 6832
],
// Different ways to send data to Jaeger. Config::ZIPKIN_OVER_COMPACT - default):
'dispatch_mode' => Config::JAEGER_OVER_BINARY_UDP,
];

View File

@ -0,0 +1,51 @@
<?php
require_once __DIR__.'/../vendor/autoload.php';
use Jaeger\Config;
use OpenTracing\GlobalTracer;
$config = new Config(
require_once __DIR__.'/config.php',
'your-app-name'
);
$config->initializeTracer();
$tracer = GlobalTracer::get();
$scope = $tracer->startActiveSpan('JaegerSpan', []);
$scope->getSpan()->setTag("tag1", "value1");
$scope->getSpan()->setTag("tag2", "value2");
$scope->getSpan()->setTag("tag3", "value2");
$scope->getSpan()->log([
"key1" => "value1",
"key2" => 2,
"key3" => true
]);
$scope->getSpan()->addBaggageItem("baggage-item1", "baggage-value1");
$scope->getSpan()->addBaggageItem("baggage-item2", "baggage-value2");
$scope->getSpan()->addBaggageItem("baggage-item3", "baggage-value3");
$nestedSpanScope = $tracer->startActiveSpan("Nested1");
$nestedSpanScope->getSpan()->setTag("tag1", "value1");
$nestedSpanScope->getSpan()->setTag("tag2", "value2");
$nestedSpanScope->getSpan()->setTag("tag3", "value2");
$nestedSpanScope->getSpan()->log([
"key1" => "value1",
"key2" => 2,
"key3" => true
]);
$nestedSpanScope->getSpan()->addBaggageItem("baggage-item1", "baggage-value1");
$nestedSpanScope->getSpan()->addBaggageItem("baggage-item2", "baggage-value2");
$nestedSpanScope->getSpan()->addBaggageItem("baggage-item3", "baggage-value3");
sleep(1);
$nestedSpanScope->close();
sleep(1);
$scope->close();
$tracer->flush();

View File

@ -0,0 +1,37 @@
<?xml version="1.0"?>
<ruleset name="Jaeger">
<!--
The name attribute of the ruleset tag is displayed
when running PHP_CodeSniffer with the -v command line
argument. The description tag below is not displayed anywhere
except in this file, so it can contain information for
developers who may change this file in the future.
-->
<description>The coding standard for Jaeger Client</description>
<!-- Show sniff codes in all reports -->
<arg value="s"/>
<!-- Use PSR-2 as a base -->
<rule ref="PSR2"/>
<!-- Uncomment to use colors in progress or report -->
<!-- arg name="colors" / -->
<!--
If no files or directories are specified on the command line
your custom standard can specify what files should be checked
instead.
Note that specifying any file or directory path
on the command line will ignore all file tags.
-->
<file>src</file>
<!--
You can hard-code ignore patterns directly into your
custom standard so you don't have to specify the
patterns on the command line.
-->
<exclude-pattern>src/Jaeger/Thrift/*</exclude-pattern>
</ruleset>

View File

@ -0,0 +1,47 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="vendor/phpunit/phpunit/phpunit.xsd"
bootstrap="vendor/autoload.php"
colors="true"
>
<filter>
<whitelist>
<directory suffix=".php">src/Jaeger</directory>
<exclude>
<directory suffix="Interface.php">src/</directory>
<file>src/Jaeger/Constants.php</file>
<file>src/Jaeger/Thrift/Agent/AgentIf.php</file>
<file>src/Jaeger/Thrift/Agent/AggregationValidatorIf.php</file>
<file>src/Jaeger/Thrift/Agent/BaggageRestrictionManagerIf.php</file>
<file>src/Jaeger/Thrift/Agent/DependencyIf.php</file>
<file>src/Jaeger/Thrift/Agent/SamplingManagerIf.php</file>
<file>src/Jaeger/Thrift/CollectorIf.php</file>
<file>src/Jaeger/Thrift/Crossdock/TracedServiceIf.php</file>
</exclude>
</whitelist>
</filter>
<testsuites>
<testsuite name="Jaeger Test Suite">
<directory suffix=".php">tests/Jaeger</directory>
</testsuite>
</testsuites>
<php>
<ini name="date.timezone" value="UTC"/>
<ini name="display_errors" value="on"/>
<ini name="display_startup_errors" value="on"/>
</php>
<logging>
<log
type="coverage-text"
target="php://stdout"
lowUpperBound="60"
highLowerBound="90"/>
<log
type="coverage-clover"
target="build/coverage.xml"/>
</logging>
</phpunit>

View File

@ -0,0 +1,27 @@
#!/bin/sh
set -e
cd "$(dirname "$0")/.."
# checkout jaeger thrift files
rm -rf jaeger-idl
git clone https://github.com/jaegertracing/jaeger-idl
# define thrift cmd
THRIFT="docker run -u $(id -u) -v '${PWD}:/data' thrift:0.11.0 thrift -o /data/jaeger-idl"
THRIFT_CMD="${THRIFT} --gen php:psr4,oop"
# generate php files
FILES=$(find jaeger-idl/thrift -type f -name \*.thrift)
for f in ${FILES}; do
echo "${THRIFT_CMD} "/data/${f}""
eval $THRIFT_CMD "/data/${f}"
done
# move generated files
rm -rf src/Jaeger/Thrift
mv jaeger-idl/gen-php/Jaeger/Thrift src/Jaeger/Thrift
# remove thrift files
rm -rf jaeger-idl

View File

@ -0,0 +1,27 @@
<?php
namespace Jaeger\AgentClient;
class HttpAgentClient implements \Jaeger\Thrift\Agent\AgentIf
{
protected $input_ = null;
protected $output_ = null;
protected $seqid_ = 0;
public function __construct($input, $output = null)
{
$this->input_ = $input;
$this->output_ = $output ? $output : $input;
}
public function emitZipkinBatch(array $spans)
{
}
public function emitBatch(\Jaeger\Thrift\Batch $batch)
{
$batch->write($this->output_);
$this->output_->getTransport()->flush();
}
}

View File

@ -0,0 +1,39 @@
<?php
namespace Jaeger\Codec;
use Jaeger\SpanContext;
use OpenTracing\UnsupportedFormatException;
class BinaryCodec implements CodecInterface
{
/**
* {@inheritdoc}
*
* @see \Jaeger\Tracer::inject
*
* @param SpanContext $spanContext
* @param mixed $carrier
*
* @return void
*/
public function inject(SpanContext $spanContext, &$carrier)
{
throw new UnsupportedFormatException('Binary encoding not implemented');
}
/**
* {@inheritdoc}
*
* @see \Jaeger\Tracer::extract
*
* @param mixed $carrier
* @return SpanContext|null
*
* @throws UnsupportedFormatException
*/
public function extract($carrier)
{
throw new UnsupportedFormatException('Binary encoding not implemented');
}
}

View File

@ -0,0 +1,36 @@
<?php
namespace Jaeger\Codec;
use Jaeger\SpanContext;
interface CodecInterface
{
/**
* Handle the logic behind injecting propagation scheme specific information into the carrier
* (e.g. http request headers, amqp message headers, etc.).
*
* This method can modify the carrier.
*
* @see \Jaeger\Tracer::inject
*
* @param SpanContext $spanContext
* @param mixed $carrier
*
* @return void
*/
public function inject(SpanContext $spanContext, &$carrier);
/**
* Handle the logic behind extracting propagation-scheme specific information from carrier
* (e.g. http request headers, amqp message headers, etc.).
*
* This method must not modify the carrier.
*
* @see \Jaeger\Tracer::extract
*
* @param mixed $carrier
* @return SpanContext|null
*/
public function extract($carrier);
}

View File

@ -0,0 +1,41 @@
<?php
namespace Jaeger\Codec;
class CodecUtility
{
/**
* Incoming trace/span IDs are hex representations of 64-bit values. PHP
* represents ints internally as signed 32- or 64-bit values, but base_convert
* converts to string representations of arbitrarily large positive numbers.
* This means at least half the incoming IDs will be larger than PHP_INT_MAX.
*
* Thrift, while building a binary representation of the IDs, performs bitwise
* operations on the string values, implicitly casting to int and capping them
* at PHP_INT_MAX. So, incoming IDs larger than PHP_INT_MAX will be serialized
* and sent to the agent as PHP_INT_MAX, breaking trace/span correlation.
*
* This method therefore, on 64-bit architectures, splits the hex string into
* high and low values, converts them separately to ints, and manually combines
* them into a proper signed int. This int is then handled properly by the
* Thrift package.
*
* On 32-bit architectures, it falls back to base_convert.
*
* @param string $hex
* @return string|int
*/
public static function hexToInt64($hex)
{
// If we're on a 32-bit architecture, fall back to base_convert.
if (PHP_INT_SIZE === 4) {
return base_convert($hex, 16, 10);
}
$hi = intval(substr($hex, -16, -8), 16);
$lo = intval(substr($hex, -8, 8), 16);
return $hi << 32 | $lo;
}
}

View File

@ -0,0 +1,184 @@
<?php
namespace Jaeger\Codec;
use Exception;
use Jaeger\SpanContext;
use const Jaeger\TRACE_ID_HEADER;
use const Jaeger\BAGGAGE_HEADER_PREFIX;
use const Jaeger\DEBUG_ID_HEADER_KEY;
class TextCodec implements CodecInterface
{
private $urlEncoding;
private $traceIdHeader;
private $baggagePrefix;
private $debugIdHeader;
private $prefixLength;
/**
* @param bool $urlEncoding
* @param string $traceIdHeader
* @param string $baggageHeaderPrefix
* @param string $debugIdHeader
*/
public function __construct(
bool $urlEncoding = false,
string $traceIdHeader = TRACE_ID_HEADER,
string $baggageHeaderPrefix = BAGGAGE_HEADER_PREFIX,
string $debugIdHeader = DEBUG_ID_HEADER_KEY
) {
$this->urlEncoding = $urlEncoding;
$this->traceIdHeader = str_replace('_', '-', strtolower($traceIdHeader));
$this->baggagePrefix = str_replace('_', '-', strtolower($baggageHeaderPrefix));
$this->debugIdHeader = str_replace('_', '-', strtolower($debugIdHeader));
$this->prefixLength = strlen($baggageHeaderPrefix);
}
/**
* {@inheritdoc}
*
* @see \Jaeger\Tracer::inject
*
* @param SpanContext $spanContext
* @param mixed $carrier
*
* @return void
*/
public function inject(SpanContext $spanContext, &$carrier)
{
$carrier[$this->traceIdHeader] = $this->spanContextToString(
$spanContext->getTraceId(),
$spanContext->getSpanId(),
$spanContext->getParentId(),
$spanContext->getFlags()
);
$baggage = $spanContext->getBaggage();
if (empty($baggage)) {
return;
}
foreach ($baggage as $key => $value) {
$encodedValue = $value;
if ($this->urlEncoding) {
$encodedValue = urlencode($value);
}
$carrier[$this->baggagePrefix . $key] = $encodedValue;
}
}
/**
* {@inheritdoc}
*
* @see \Jaeger\Tracer::extract
*
* @param mixed $carrier
* @return SpanContext|null
*
* @throws Exception
*/
public function extract($carrier)
{
$traceId = null;
$spanId = null;
$parentId = null;
$flags = null;
$baggage = null;
$debugId = null;
foreach ($carrier as $key => $value) {
$ucKey = strtolower($key);
if ($ucKey === $this->traceIdHeader) {
if ($this->urlEncoding) {
$value = urldecode($value);
}
list($traceId, $spanId, $parentId, $flags) =
$this->spanContextFromString($value);
} elseif ($this->startsWith($ucKey, $this->baggagePrefix)) {
if ($this->urlEncoding) {
$value = urldecode($value);
}
$attrKey = substr($key, $this->prefixLength);
if ($baggage === null) {
$baggage = [strtolower($attrKey) => $value];
} else {
$baggage[strtolower($attrKey)] = $value;
}
} elseif ($ucKey === $this->debugIdHeader) {
if ($this->urlEncoding) {
$value = urldecode($value);
}
$debugId = $value;
}
}
if ($traceId === null && $baggage !== null) {
throw new Exception('baggage without trace ctx');
}
if ($traceId === null) {
if ($debugId !== null) {
return new SpanContext(null, null, null, null, [], $debugId);
}
return null;
}
return new SpanContext($traceId, $spanId, $parentId, $flags, $baggage);
}
/**
* Store a span context to a string.
*
* @param int $traceId
* @param int $spanId
* @param int $parentId
* @param int $flags
* @return string
*/
private function spanContextToString($traceId, $spanId, $parentId, $flags)
{
$parentId = $parentId ?? 0;
return sprintf('%x:%x:%x:%x', $traceId, $spanId, $parentId, $flags);
}
/**
* Create a span context from a string.
*
* @param string $value
* @return array
*
* @throws Exception
*/
private function spanContextFromString($value): array
{
$parts = explode(':', $value);
if (count($parts) != 4) {
throw new Exception('Malformed tracer state string.');
}
return [
CodecUtility::hexToInt64($parts[0]),
CodecUtility::hexToInt64($parts[1]),
CodecUtility::hexToInt64($parts[2]),
$parts[3],
];
}
/**
* Checks that a string ($haystack) starts with a given prefix ($needle).
*
* @param string $haystack
* @param string $needle
* @return bool
*/
private function startsWith(string $haystack, string $needle): bool
{
return substr($haystack, 0, strlen($needle)) == $needle;
}
}

View File

@ -0,0 +1,85 @@
<?php
namespace Jaeger\Codec;
use Jaeger\SpanContext;
use const Jaeger\DEBUG_FLAG;
use const Jaeger\SAMPLED_FLAG;
class ZipkinCodec implements CodecInterface
{
const SAMPLED_NAME = 'X-B3-Sampled';
const TRACE_ID_NAME = 'X-B3-TraceId';
const SPAN_ID_NAME = 'X-B3-SpanId';
const PARENT_ID_NAME = 'X-B3-ParentSpanId';
const FLAGS_NAME = 'X-B3-Flags';
/**
* {@inheritdoc}
*
* @see \Jaeger\Tracer::inject
*
* @param SpanContext $spanContext
* @param mixed $carrier
*
* @return void
*/
public function inject(SpanContext $spanContext, &$carrier)
{
$carrier[self::TRACE_ID_NAME] = dechex($spanContext->getTraceId());
$carrier[self::SPAN_ID_NAME] = dechex($spanContext->getSpanId());
if ($spanContext->getParentId() != null) {
$carrier[self::PARENT_ID_NAME] = dechex($spanContext->getParentId());
}
$carrier[self::FLAGS_NAME] = (int) $spanContext->getFlags();
}
/**
* {@inheritdoc}
*
* @see \Jaeger\Tracer::extract
*
* @param mixed $carrier
* @return SpanContext|null
*/
public function extract($carrier)
{
$traceId = "0";
$spanId = "0";
$parentId = "0";
$flags = 0;
if (isset($carrier[strtolower(self::SAMPLED_NAME)])) {
if ($carrier[strtolower(self::SAMPLED_NAME)] === "1" ||
strtolower($carrier[strtolower(self::SAMPLED_NAME)] === "true")
) {
$flags = $flags | SAMPLED_FLAG;
}
}
if (isset($carrier[strtolower(self::TRACE_ID_NAME)])) {
$traceId = CodecUtility::hexToInt64($carrier[strtolower(self::TRACE_ID_NAME)], 16, 10);
}
if (isset($carrier[strtolower(self::PARENT_ID_NAME)])) {
$parentId = CodecUtility::hexToInt64($carrier[strtolower(self::PARENT_ID_NAME)], 16, 10);
}
if (isset($carrier[strtolower(self::SPAN_ID_NAME)])) {
$spanId = CodecUtility::hexToInt64($carrier[strtolower(self::SPAN_ID_NAME)], 16, 10);
}
if (isset($carrier[strtolower(self::FLAGS_NAME)])) {
if ($carrier[strtolower(self::FLAGS_NAME)] === "1") {
$flags = $flags | DEBUG_FLAG;
}
}
if ($traceId != "0" && $spanId != "0") {
return new SpanContext($traceId, $spanId, $parentId, $flags);
}
return null;
}
}

View File

@ -0,0 +1,390 @@
<?php
namespace Jaeger;
use Exception;
use Jaeger\Reporter\CompositeReporter;
use Jaeger\Reporter\LoggingReporter;
use Jaeger\Reporter\ReporterInterface;
use Jaeger\ReporterFactory\JaegerHttpReporterFactory;
use Jaeger\ReporterFactory\JaegerReporterFactory;
use Jaeger\ReporterFactory\ZipkinReporterFactory;
use Jaeger\Sampler\ConstSampler;
use Jaeger\Sampler\ProbabilisticSampler;
use Jaeger\Sampler\RateLimitingSampler;
use Jaeger\Sampler\SamplerInterface;
use Jaeger\Util\RateLimiter;
use OpenTracing\GlobalTracer;
use Psr\Cache\CacheItemPoolInterface;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;
class Config
{
const IP_VERSION = "ip_version";
const ZIPKIN_OVER_COMPACT_UDP = "zipkin_over_compact_udp";
const JAEGER_OVER_BINARY_UDP = "jaeger_over_binary_udp";
const JAEGER_OVER_BINARY_HTTP = "jaeger_over_binary_http";
const IPV6 = "IPv6";
const IPV4 = "IPv4";
/**
* @return string[]
*/
public static function getAvailableDispatchModes()
{
return [self::ZIPKIN_OVER_COMPACT_UDP, self::JAEGER_OVER_BINARY_UDP, self::JAEGER_OVER_BINARY_HTTP];
}
/**
* @var array
*/
private $config;
/**
* @var string
*/
private $serviceName;
/**
* @var bool
*/
private $initialized = false;
/**
* @var LoggerInterface
*/
private $logger;
/**
* @return LoggerInterface
*/
public function getLogger()
{
return $this->logger;
}
/**
* @var CacheItemPoolInterface
*/
private $cache;
/**
* Config constructor.
* @param array $config
* @param string|null $serviceName
* @param LoggerInterface|null $logger
* @param CacheItemPoolInterface|null $cache
* @throws Exception
*/
public function __construct(
array $config,
string $serviceName = null,
LoggerInterface $logger = null,
CacheItemPoolInterface $cache = null
) {
$this->config = $config;
$this->setConfigFromEnv();
if (empty($this->config["dispatch_mode"])) {
$this->config["dispatch_mode"] = self::ZIPKIN_OVER_COMPACT_UDP;
}
if (empty($this->config[Config::IP_VERSION])) {
$this->config[Config::IP_VERSION] = self::IPV4;
}
$this->serviceName = $this->config['service_name'] ?? $serviceName;
if ($this->serviceName === null) {
throw new Exception('service_name required in the config or param.');
}
$this->logger = $logger ?: new NullLogger();
$this->cache = $cache;
}
/**
* @return Tracer|null
* @throws Exception
*/
public function initializeTracer()
{
if ($this->initialized) {
$this->logger->warning('Jaeger tracer already initialized, skipping');
return null;
}
$reporter = $this->getReporter();
$sampler = $this->getSampler();
$tracer = $this->createTracer($reporter, $sampler);
$this->initializeGlobalTracer($tracer);
return $tracer;
}
/**
* @param ReporterInterface $reporter
* @param SamplerInterface $sampler
* @return Tracer
*/
public function createTracer(ReporterInterface $reporter, SamplerInterface $sampler): Tracer
{
return new Tracer(
$this->serviceName,
$reporter,
$sampler,
$this->shouldUseOneSpanPerRpc(),
$this->logger,
null,
$this->getTraceIdHeader(),
$this->getBaggageHeaderPrefix(),
$this->getDebugIdHeaderKey(),
$this->getConfiguredTags()
);
}
/**
* @return string
*/
public function getServiceName(): string
{
return $this->serviceName;
}
/**
* @param Tracer $tracer
*/
private function initializeGlobalTracer(Tracer $tracer)
{
GlobalTracer::set($tracer);
$this->logger->debug('OpenTracing\GlobalTracer initialized to ' . $tracer->getServiceName());
}
/**
* @return bool
*/
private function getLogging(): bool
{
return (bool)($this->config['logging'] ?? false);
}
/**
* @return ReporterInterface
*/
private function getReporter(): ReporterInterface
{
switch ($this->config["dispatch_mode"]) {
case self::JAEGER_OVER_BINARY_UDP:
$reporter = (new JaegerReporterFactory($this))->createReporter();
break;
case self::ZIPKIN_OVER_COMPACT_UDP:
$reporter = (new ZipkinReporterFactory($this))->createReporter();
break;
case self::JAEGER_OVER_BINARY_HTTP:
$reporter = (new JaegerHttpReporterFactory($this))->createReporter();
break;
default:
throw new \RuntimeException(
sprintf(
"Unsupported `dispatch_mode` value: %s. Allowed values are: %s",
$this->config["dispatch_mode"],
implode(", ", Config::getAvailableDispatchModes())
)
);
}
if ($this->getLogging()) {
$reporter = new CompositeReporter($reporter, new LoggingReporter($this->logger));
}
return $reporter;
}
/**
* @return SamplerInterface
* @throws \Psr\Cache\InvalidArgumentException
* @throws Exception
*/
private function getSampler(): SamplerInterface
{
$samplerConfig = $this->config['sampler'] ?? [];
$samplerType = $samplerConfig['type'] ?? null;
$samplerParam = $samplerConfig['param'] ?? null;
if ($samplerType === null || $samplerType === SAMPLER_TYPE_REMOTE) {
// todo: implement remote sampling
return new ProbabilisticSampler((float)$samplerParam);
} elseif ($samplerType === SAMPLER_TYPE_CONST) {
return new ConstSampler($samplerParam ?? false);
} elseif ($samplerType === SAMPLER_TYPE_PROBABILISTIC) {
return new ProbabilisticSampler((float)$samplerParam);
} elseif ($samplerType === SAMPLER_TYPE_RATE_LIMITING) {
if (!$this->cache) {
throw new Exception('You cannot use RateLimitingSampler without cache component');
}
$cacheConfig = $samplerConfig['cache'] ?? [];
return new RateLimitingSampler(
$samplerParam ?? 0,
new RateLimiter(
$this->cache,
$cacheConfig['currentBalanceKey'] ?? 'rate.currentBalance',
$cacheConfig['lastTickKey'] ?? 'rate.lastTick'
)
);
}
throw new Exception('Unknown sampler type ' . $samplerType);
}
/**
* The UDP max buffer length.
*
* @return int
*/
public function getMaxBufferLength(): int
{
return (int)($this->config['max_buffer_length'] ?? 64000);
}
/**
* @return string
*/
public function getLocalAgentReportingHost(): string
{
return $this->getLocalAgentGroup()['reporting_host'] ?? DEFAULT_REPORTING_HOST;
}
/**
* @return int
*/
public function getLocalAgentReportingPort(): int
{
$port = $this->getLocalAgentGroup()['reporting_port'] ?? null;
if (empty($this->getLocalAgentGroup()['reporting_port'])) {
switch ($this->config['dispatch_mode']) {
case self::JAEGER_OVER_BINARY_UDP:
$port = DEFAULT_JAEGER_UDP_BINARY_REPORTING_PORT;
break;
case self::JAEGER_OVER_BINARY_HTTP:
$port = DEFAULT_JAEGER_HTTP_BINARY_REPORTING_PORT;
break;
default:
$port = DEFAULT_ZIPKIN_UDP_COMPACT_REPORTING_PORT;
}
}
return (int)$port;
}
/**
* @return array
*/
private function getLocalAgentGroup(): array
{
return $this->config['local_agent'] ?? [];
}
/**
* @return string
*/
private function getTraceIdHeader(): string
{
return $this->config['trace_id_header'] ?? TRACE_ID_HEADER;
}
/**
* @return string
*/
private function getBaggageHeaderPrefix(): string
{
return $this->config['baggage_header_prefix'] ?? BAGGAGE_HEADER_PREFIX;
}
/**
* @return string
*/
private function getDebugIdHeaderKey(): string
{
return $this->config['debug_id_header_key'] ?? DEBUG_ID_HEADER_KEY;
}
/**
* Get a list of user-defined tags to be added to each span created by the tracer initialized by this config.
* @return string[]
*/
private function getConfiguredTags(): array
{
return $this->config['tags'] ?? [];
}
/**
* Whether to follow the Zipkin model of using one span per RPC,
* as opposed to the model of using separate spans on the RPC client and server.
* Defaults to true.
*
* @return bool
*/
private function shouldUseOneSpanPerRpc(): bool
{
return $this->config['one_span_per_rpc'] ?? true;
}
public function ipProtocolVersion(): string
{
return $this->config[self::IP_VERSION] ?? self::IPV4;
}
/**
* Sets values from env vars into config props, unless ones has been already set.
*/
private function setConfigFromEnv()
{
// general
if (isset($_ENV['JAEGER_SERVICE_NAME']) && !isset($this->config['service_name'])) {
$this->config['service_name'] = $_ENV['JAEGER_SERVICE_NAME'];
}
if (isset($_ENV['JAEGER_TAGS']) && !isset($this->config["tags"])) {
$this->config['tags'] = $_ENV['JAEGER_TAGS'];
}
if (isset($_ENV['JAEGER_DISPATCH_MODE']) && !isset($this->config['dispatch_mode'])) {
$this->config['dispatch_mode'] = $_ENV['JAEGER_DISPATCH_MODE'];
}
// reporting
if (isset($_ENV['JAEGER_AGENT_HOST']) && !isset($this->config['local_agent']['reporting_host'])) {
$this->config['local_agent']['reporting_host'] = $_ENV['JAEGER_AGENT_HOST'];
}
if (isset($_ENV['JAEGER_AGENT_PORT']) && !isset($this->config['local_agent']['reporting_port'])) {
$this->config['local_agent']['reporting_port'] = intval($_ENV['JAEGER_AGENT_PORT']);
}
if (isset($_ENV['JAEGER_REPORTER_LOG_SPANS']) && !isset($this->config['logging'])) {
$this->config['logging'] = filter_var($_ENV['JAEGER_REPORTER_LOG_SPANS'], FILTER_VALIDATE_BOOLEAN);
}
if (isset($_ENV['JAEGER_REPORTER_MAX_QUEUE_SIZE']) && !isset($this->config['max_buffer_length'])) {
$this->config['max_buffer_length'] = intval($_ENV['JAEGER_REPORTER_MAX_QUEUE_SIZE']);
}
// sampling
if (isset($_ENV['JAEGER_SAMPLER_TYPE']) && !isset($this->config['sampler']['type'])) {
$this->config['sampler']['type'] = $_ENV['JAEGER_SAMPLER_TYPE'];
}
if (isset($_ENV['JAEGER_SAMPLER_PARAM']) && !isset($this->config['sampler']['param'])) {
$this->config['sampler']['param'] = $_ENV['JAEGER_SAMPLER_PARAM'];
}
if (isset($_ENV['IP_VERSION']) && !isset($this->config[Config::IP_VERSION])) {
$this->config[Config::IP_VERSION] = $_ENV['IP_VERSION'];
}
}
}

View File

@ -0,0 +1,100 @@
<?php
namespace Jaeger;
// Max number of bits to use when generating random ID
const MAX_ID_BITS = 64;
// How often remotely controller sampler polls for sampling strategy
const DEFAULT_SAMPLING_INTERVAL = 60;
// How often remote reporter does a preemptive flush of its buffers
const DEFAULT_FLUSH_INTERVAL = 1;
// Name of the HTTP header used to encode trace ID
const TRACE_ID_HEADER = 'uber-trace-id';
// Prefix for HTTP headers used to record baggage items
const BAGGAGE_HEADER_PREFIX = 'uberctx-';
// The name of HTTP header or a TextMap carrier key which, if found in the
// carrier, forces the trace to be sampled as "debug" trace. The value of the
// header is recorded as the tag on the # root span, so that the trace can
// be found in the UI using this value as a correlation ID.
const DEBUG_ID_HEADER_KEY = 'jaeger-debug-id';
const JAEGER_CLIENT_VERSION = 'PHP-' . PHP_VERSION;
// Tracer-scoped tag that tells the version of Jaeger client library
const JAEGER_VERSION_TAG_KEY = 'jaeger.version';
// Tracer-scoped tag that contains the hostname
const JAEGER_HOSTNAME_TAG_KEY = 'jaeger.hostname';
const SAMPLER_TYPE_TAG_KEY = 'sampler.type';
const SAMPLER_PARAM_TAG_KEY = 'sampler.param';
const DEFAULT_SAMPLING_PROBABILITY = 0.001;
const DEFAULT_LOWER_BOUND = 1.0 / (10.0 * 60.0); # sample once every 10 minutes
const DEFAULT_MAX_OPERATIONS = 2000;
const STRATEGIES_STR = 'perOperationStrategies';
const OPERATION_STR = 'operation';
const DEFAULT_LOWER_BOUND_STR = 'defaultLowerBoundTracesPerSecond';
const PROBABILISTIC_SAMPLING_STR = 'probabilisticSampling';
const SAMPLING_RATE_STR = 'samplingRate';
const DEFAULT_SAMPLING_PROBABILITY_STR = 'defaultSamplingProbability';
const OPERATION_SAMPLING_STR = 'operationSampling';
const MAX_TRACES_PER_SECOND_STR = 'maxTracesPerSecond';
const RATE_LIMITING_SAMPLING_STR = 'rateLimitingSampling';
const STRATEGY_TYPE_STR = 'strategyType';
// the type of sampler that always makes the same decision.
const SAMPLER_TYPE_CONST = 'const';
// the type of sampler that polls Jaeger agent for sampling strategy.
const SAMPLER_TYPE_REMOTE = 'remote';
// the type of sampler that samples traces with a certain fixed probability.
const SAMPLER_TYPE_PROBABILISTIC = 'probabilistic';
// the type of sampler that samples only up to a fixed number
// of traces per second.
// noinspection SpellCheckingInspection
const SAMPLER_TYPE_RATE_LIMITING = 'ratelimiting';
// the type of sampler that samples only up to a fixed number
// of traces per second.
// noinspection SpellCheckingInspection
const SAMPLER_TYPE_LOWER_BOUND = 'lowerbound';
const DEFAULT_REPORTING_HOST = 'localhost';
/** @deprecated */
const DEFAULT_REPORTING_PORT = 5775;
const DEFAULT_ZIPKIN_UDP_COMPACT_REPORTING_PORT = 5775;
const DEFAULT_JAEGER_UDP_BINARY_REPORTING_PORT = 6832;
const DEFAULT_JAEGER_HTTP_BINARY_REPORTING_PORT = 14268;
const DEFAULT_SAMPLING_PORT = 5778;
const LOCAL_AGENT_DEFAULT_ENABLED = true;
const ZIPKIN_SPAN_FORMAT = 'zipkin-span-format';
const SAMPLED_FLAG = 0x01;
const DEBUG_FLAG = 0x02;

View File

@ -0,0 +1,171 @@
<?php
namespace Jaeger\Mapper;
use Jaeger\Span;
use Jaeger\Thrift\Agent\Zipkin\AnnotationType;
use Jaeger\Thrift\Agent\Zipkin\BinaryAnnotation;
use Jaeger\Thrift\Log;
use Jaeger\Thrift\Span as JaegerThriftSpan;
use Jaeger\Thrift\Tag;
use Jaeger\Thrift\TagType;
use const OpenTracing\Tags\COMPONENT;
use const OpenTracing\Tags\PEER_HOST_IPV4;
use const OpenTracing\Tags\PEER_PORT;
use const OpenTracing\Tags\PEER_SERVICE;
use const OpenTracing\Tags\SPAN_KIND;
class SpanToJaegerMapper
{
private $specialSpanTags = ["jaeger.hostname", "jaeger.version"];
private $processTagsPrefix = "process.";
/**
* @return string[]
*/
public function getSpecialSpanTags(): array
{
return $this->specialSpanTags;
}
/**
* @return string
*/
public function getProcessTagsPrefix(): string
{
return $this->processTagsPrefix;
}
public function mapSpanToJaeger(Span $span) : JaegerThriftSpan
{
$timestamp = $span->getStartTime();
$duration = $span->getEndTime() - $span->getStartTime();
/** @var Tag[] $tags */
$tags = [];
$tags[] = new Tag([
"key" => COMPONENT,
"vType" => TagType::STRING,
"vStr" => $span->getComponent() ?? $span->getTracer()->getServiceName(),
]);
// Handle special tags
$peerService = $span->peer['service_name'] ?? null;
if ($peerService !== null) {
$tags[] = new Tag([
"key" => PEER_SERVICE,
"vType" => TagType::STRING,
"vStr" => $peerService,
]);
}
$peerHostIpv4 = $span->peer['ipv4'] ?? null;
if ($peerHostIpv4 !== null) {
$tags[] = new Tag([
"key" => PEER_HOST_IPV4,
"vType" => TagType::STRING,
"vStr" => $peerHostIpv4,
]);
}
$peerPort = $span->peer['port'] ?? null;
if ($peerPort !== null) {
$tags[] = new Tag([
"key" => PEER_PORT,
"vType" => TagType::LONG,
"vLong" => $peerPort,
]);
}
$spanKind = $span->getKind();
if ($spanKind !== null) {
$tags[] = new Tag([
"key" => SPAN_KIND,
"vType" => TagType::STRING,
"vStr" => $spanKind,
]);
}
/** @var BinaryAnnotation[] $binaryAnnotationTags */
$binaryAnnotationTags = $span->getTags();
foreach ($binaryAnnotationTags as $binaryAnnotationTag) {
if (in_array($binaryAnnotationTag->key, $this->specialSpanTags, true)) {
continue ;
}
if (strpos($binaryAnnotationTag->key, $this->processTagsPrefix) === 0) {
continue;
}
$type = "";
$vkey = "";
switch ($binaryAnnotationTag->annotation_type) {
case AnnotationType::BOOL:
$type = TagType::BOOL;
$vkey = "vBool";
break;
case AnnotationType::BYTES:
$type = TagType::BINARY;
$vkey = "vBinary";
break;
case AnnotationType::DOUBLE:
$type = TagType::DOUBLE;
$vkey = "vDouble";
break;
case AnnotationType::I16:
case AnnotationType::I32:
case AnnotationType::I64:
$type = TagType::LONG;
$vkey = "vLong";
break;
default:
$type = TagType::STRING;
$vkey = "vStr";
}
$tags[] = new Tag([
"key" => $binaryAnnotationTag->key,
"vType" => $type,
$vkey => $binaryAnnotationTag->value,
]);
}
/** @var Log[] $logs */
$logs = [];
$spanLogs = $span->getLogs();
foreach ($spanLogs as $spanLog) {
/** @var Tag $fields */
$fields = [];
if (!empty($spanLog["fields"])) {
$fields[] = new Tag([
"key" => "event",
"vType" => TagType::STRING,
"vStr" => json_encode($spanLog["fields"])
]);
}
$logs[] = new Log([
"timestamp" => $spanLog["timestamp"],
"fields" => $fields
]);
}
return new JaegerThriftSpan([
"traceIdLow" => (int)$span->getContext()->getTraceId(),
"traceIdHigh" => 0,
"spanId" => (int)$span->getContext()->getSpanId(),
"parentSpanId" => (int)$span->getContext()->getParentId(),
"operationName" => $span->getOperationName(),
"startTime" => $timestamp,
"duration" => $duration,
"flags" => (int)$span->isDebug(),
"tags" => $tags,
"logs" => $logs
]);
}
}

View File

@ -0,0 +1,51 @@
<?php
namespace Jaeger\Reporter;
use Jaeger\Span;
/**
* CompositeReporter delegates reporting to one or more underlying reporters.
*/
class CompositeReporter implements ReporterInterface
{
/**
* @var ReporterInterface[]
*/
private $reporters;
/**
* CompositeReporter constructor.
*
* @param ReporterInterface ...$reporters
*/
public function __construct(ReporterInterface ...$reporters)
{
$this->reporters = $reporters;
}
/**
* {@inheritdoc}
*
* @param Span $span
* @return void
*/
public function reportSpan(Span $span)
{
foreach ($this->reporters as $reporter) {
$reporter->reportSpan($span);
}
}
/**
* {@inheritdoc}
*
* @return void
*/
public function close()
{
foreach ($this->reporters as $reporter) {
$reporter->close();
}
}
}

View File

@ -0,0 +1,47 @@
<?php
namespace Jaeger\Reporter;
use Jaeger\Span;
/**
* InMemoryReporter stores spans in memory and returns them via getSpans().
*/
class InMemoryReporter implements ReporterInterface
{
/**
* @var Span[]
*/
private $spans = [];
/**
* {@inheritdoc}
*
* @param Span $span
* @return void
*/
public function reportSpan(Span $span)
{
$this->spans[] = $span;
}
/**
* @return Span[]
*/
public function getSpans(): array
{
return $this->spans;
}
/**
* {@inheritdoc}
*
* Only implemented to satisfy the sampler interface.
*
* @return void
*/
public function close()
{
// nothing to do
}
}

View File

@ -0,0 +1,35 @@
<?php
namespace Jaeger\Reporter;
use Jaeger\Sender\SenderInterface;
use Jaeger\Span;
class JaegerReporter implements ReporterInterface
{
/**
* @var SenderInterface
*/
private $sender;
/**
* RemoteReporter constructor.
*
* @param SenderInterface $sender
*/
public function __construct(SenderInterface $sender)
{
$this->sender = $sender;
}
public function reportSpan(Span $span)
{
$this->sender->append($span);
}
public function close()
{
$this->sender->flush();
$this->sender->close();
}
}

View File

@ -0,0 +1,51 @@
<?php
namespace Jaeger\Reporter;
use Jaeger\Span;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;
/**
* LoggingReporter logs all spans.
*/
class LoggingReporter implements ReporterInterface
{
/**
* @var LoggerInterface
*/
private $logger;
/**
* LoggingReporter constructor.
*
* @param LoggerInterface|null $logger
*/
public function __construct(LoggerInterface $logger = null)
{
$this->logger = $logger ?? new NullLogger();
}
/**
* {@inheritdoc}
*
* @param Span $span
* @return void
*/
public function reportSpan(Span $span)
{
$this->logger->debug('Reporting span ' . $span->getOperationName());
}
/**
* {@inheritdoc}
*
* Only implemented to satisfy the sampler interface.
*
* @return void
*/
public function close()
{
// nothing to do
}
}

View File

@ -0,0 +1,32 @@
<?php
namespace Jaeger\Reporter;
use Jaeger\Span;
/**
* NullReporter ignores all spans.
*/
class NullReporter implements ReporterInterface
{
/**
* {@inheritdoc}
*
* @param Span $span
* @return void
*/
public function reportSpan(Span $span)
{
// nothing to do
}
/**
* {@inheritdoc}
*
* @return void
*/
public function close()
{
// nothing to do
}
}

View File

@ -0,0 +1,46 @@
<?php
namespace Jaeger\Reporter;
use Jaeger\Sender\UdpSender;
use Jaeger\Span;
class RemoteReporter implements ReporterInterface
{
/**
* @var UdpSender
*/
private $transport;
/**
* RemoteReporter constructor.
*
* @param UdpSender $transport
*/
public function __construct(UdpSender $transport)
{
$this->transport = $transport;
}
/**
* {@inheritdoc}
*
* @param Span $span
* @return void
*/
public function reportSpan(Span $span)
{
$this->transport->append($span);
}
/**
* {@inheritdoc}
*
* @return void
*/
public function close()
{
$this->transport->flush();
$this->transport->close();
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace Jaeger\Reporter;
use Jaeger\Span;
/**
* Uses to report finished span to something that collects those spans.
*
* @package Jaeger\Reporter
*/
interface ReporterInterface
{
/**
* Report finished span.
*
* @param Span $span
* @return void
*/
public function reportSpan(Span $span);
/**
* Release any resources used by the reporter and flushes/sends the data.
*
* @return void
*/
public function close();
}

View File

@ -0,0 +1,23 @@
<?php
namespace Jaeger\ReporterFactory;
use Jaeger\Config;
use Thrift\Transport\TTransport;
abstract class AbstractReporterFactory implements ReporterFactoryInterface
{
/**
* @var Config
*/
protected $config;
/**
* AbstractReporterFactory constructor.
* @param Config $config
*/
public function __construct($config)
{
$this->config = $config;
}
}

View File

@ -0,0 +1,35 @@
<?php
namespace Jaeger\ReporterFactory;
use Jaeger\AgentClient\HttpAgentClient;
use Jaeger\Reporter\JaegerReporter;
use Jaeger\Reporter\ReporterInterface;
use Jaeger\Sender\JaegerSender;
use Thrift\Exception\TTransportException;
use Thrift\Protocol\TBinaryProtocol;
use Thrift\Transport\THttpClient;
class JaegerHttpReporterFactory extends AbstractReporterFactory implements ReporterFactoryInterface
{
public function createReporter() : ReporterInterface
{
$transport = new THttpClient(
$this->config->getLocalAgentReportingHost(),
$this->config->getLocalAgentReportingPort(),
"/api/traces"
);
try {
$transport->open();
} catch (TTransportException $e) {
$this->config->getLogger()->warning($e->getMessage());
}
$protocol = new TBinaryProtocol($transport);
$client = new HttpAgentClient($protocol);
$this->config->getLogger()->debug('Initializing HTTP Jaeger Tracer with Jaeger.Thrift over Binary protocol');
$sender = new JaegerSender($client, $this->config->getLogger());
$sender->setMaxBufferLength($this->config->getMaxBufferLength());
return new JaegerReporter($sender);
}
}

View File

@ -0,0 +1,44 @@
<?php
namespace Jaeger\ReporterFactory;
use Jaeger\AgentClient\HttpAgentClient;
use Jaeger\Reporter\JaegerReporter;
use Jaeger\Reporter\ReporterInterface;
use Jaeger\Sender\JaegerSender;
use Jaeger\Thrift\Agent\AgentClient;
use Jaeger\ThriftUdpTransport;
use Thrift\Exception\TTransportException;
use Thrift\Protocol\TBinaryProtocol;
use Thrift\Transport\TBufferedTransport;
class JaegerReporterFactory extends AbstractReporterFactory implements ReporterFactoryInterface
{
public function createReporter() : ReporterInterface
{
$udp = new ThriftUdpTransport(
$this->config->getLocalAgentReportingHost(),
$this->config->getLocalAgentReportingPort(),
$this->config->getLogger(),
$this->config
);
$transport = new TBufferedTransport(
$udp,
$this->config->getMaxBufferLength(),
$this->config->getMaxBufferLength()
);
try {
$transport->open();
} catch (TTransportException $e) {
$this->config->getLogger()->warning($e->getMessage());
}
$protocol = new TBinaryProtocol($transport);
$client = new AgentClient($protocol);
$this->config->getLogger()->debug('Initializing UDP Jaeger Tracer with Jaeger.Thrift over Binary protocol');
$sender = new JaegerSender($client, $this->config->getLogger());
$sender->setMaxBufferLength($this->config->getMaxBufferLength());
return new JaegerReporter($sender);
}
}

View File

@ -0,0 +1,10 @@
<?php
namespace Jaeger\ReporterFactory;
use Jaeger\Reporter\ReporterInterface;
interface ReporterFactoryInterface
{
public function createReporter() : ReporterInterface;
}

View File

@ -0,0 +1,46 @@
<?php
namespace Jaeger\ReporterFactory;
use Jaeger\Reporter\JaegerReporter;
use Jaeger\Reporter\RemoteReporter;
use Jaeger\Reporter\ReporterInterface;
use Jaeger\Sender\JaegerSender;
use Jaeger\Sender\UdpSender;
use Jaeger\Thrift\Agent\AgentClient;
use Jaeger\ThriftUdpTransport;
use Thrift\Exception\TTransportException;
use Thrift\Protocol\TBinaryProtocol;
use Thrift\Protocol\TCompactProtocol;
use Thrift\Transport\TBufferedTransport;
use Thrift\Transport\TTransport;
class ZipkinReporterFactory extends AbstractReporterFactory implements ReporterFactoryInterface
{
public function createReporter() : ReporterInterface
{
$udp = new ThriftUdpTransport(
$this->config->getLocalAgentReportingHost(),
$this->config->getLocalAgentReportingPort(),
$this->config->getLogger(),
$this->config
);
$transport = new TBufferedTransport(
$udp,
$this->config->getMaxBufferLength(),
$this->config->getMaxBufferLength()
);
try {
$transport->open();
} catch (TTransportException $e) {
$this->config->getLogger()->warning($e->getMessage());
}
$protocol = new TCompactProtocol($transport);
$client = new AgentClient($protocol);
$this->config->getLogger()->debug('Initializing UDP Jaeger Tracer with Zipkin.Thrift over Compact protocol');
$sender = new UdpSender($client, $this->config->getMaxBufferLength(), $this->config->getLogger());
return new RemoteReporter($sender);
}
}

View File

@ -0,0 +1,68 @@
<?php
namespace Jaeger\Sampler;
use const Jaeger\SAMPLER_PARAM_TAG_KEY;
use const Jaeger\SAMPLER_TYPE_CONST;
use const Jaeger\SAMPLER_TYPE_TAG_KEY;
/**
* ConstSampler always returns the same decision.
*
* @package Jaeger\Sampler
*/
class ConstSampler implements SamplerInterface
{
/**
* Whether or not the new trace should be sampled.
*
* @var bool
*/
private $decision;
/**
* A list of the sampler tags.
*
* @var array
*/
private $tags = [];
/**
* ConstSampler constructor.
*
* @param bool $decision
*/
public function __construct(bool $decision = true)
{
$this->tags = [
SAMPLER_TYPE_TAG_KEY => SAMPLER_TYPE_CONST,
SAMPLER_PARAM_TAG_KEY => $decision,
];
$this->decision = $decision;
}
/**
* {@inheritdoc}
*
* @param string $traceId The traceId on the span.
* @param string $operation The operation name set on the span.
* @return array
*/
public function isSampled(string $traceId, string $operation = ''): array
{
return [$this->decision, $this->tags];
}
/**
* {@inheritdoc}
*
* Only implemented to satisfy the sampler interface.
*
* @return void
*/
public function close()
{
// nothing to do
}
}

View File

@ -0,0 +1,88 @@
<?php
namespace Jaeger\Sampler;
use OutOfBoundsException;
use const Jaeger\SAMPLER_PARAM_TAG_KEY;
use const Jaeger\SAMPLER_TYPE_PROBABILISTIC;
use const Jaeger\SAMPLER_TYPE_TAG_KEY;
/**
* A sampler that randomly samples a certain percentage of traces specified
* by the samplingRate, in the range between 0.0 and 1.0.
*
* @package Jaeger\Sampler
*/
class ProbabilisticSampler implements SamplerInterface
{
/**
* The sampling rate rate between 0.0 and 1.0.
*
* @var float
*/
private $rate;
/**
* A list of the sampler tags.
*
* @var array
*/
private $tags = [];
/**
* The boundary of the sample sampling rate.
*
* @var float
*/
private $boundary;
/**
* ProbabilisticSampler constructor.
*
* @param float $rate
* @throws OutOfBoundsException
*/
public function __construct(float $rate)
{
$this->tags = [
SAMPLER_TYPE_TAG_KEY => SAMPLER_TYPE_PROBABILISTIC,
SAMPLER_PARAM_TAG_KEY => $rate,
];
if ($rate < 0.0 || $rate > 1.0) {
throw new OutOfBoundsException('Sampling rate must be between 0.0 and 1.0.');
}
$this->rate = $rate;
if ($rate < 0.5) {
$this->boundary = (int)($rate * PHP_INT_MAX);
} else {
// more precise calculation due to int and float having different precision near PHP_INT_MAX
$this->boundary = PHP_INT_MAX - (int)((1 - $rate) * PHP_INT_MAX);
}
}
/**
* {@inheritdoc}
*
* @param string $traceId The traceId on the span.
* @param string $operation The operation name set on the span.
* @return array
*/
public function isSampled(string $traceId, string $operation = ''): array
{
return [($traceId < $this->boundary), $this->tags];
}
/**
* {@inheritdoc}
*
* Only implemented to satisfy the sampler interface.
*
* @return void
*/
public function close()
{
// nothing to do
}
}

View File

@ -0,0 +1,62 @@
<?php
namespace Jaeger\Sampler;
use Jaeger\Util\RateLimiter;
use const Jaeger\SAMPLER_PARAM_TAG_KEY;
use const Jaeger\SAMPLER_TYPE_RATE_LIMITING;
use const Jaeger\SAMPLER_TYPE_TAG_KEY;
class RateLimitingSampler implements SamplerInterface
{
/**
* @var RateLimiter
*/
private $rateLimiter;
/**
* A list of the sampler tags.
*
* @var array
*/
private $tags = [];
public function __construct($maxTracesPerSecond, RateLimiter $rateLimiter)
{
$this->tags = [
SAMPLER_TYPE_TAG_KEY => SAMPLER_TYPE_RATE_LIMITING,
SAMPLER_PARAM_TAG_KEY => $maxTracesPerSecond,
];
$maxTracesPerNanosecond = $maxTracesPerSecond / 1000000000.0;
$this->rateLimiter = $rateLimiter;
$this->rateLimiter->initialize($maxTracesPerNanosecond, $maxTracesPerSecond > 1.0 ? 1.0 : $maxTracesPerSecond);
}
/**
* Whether or not the new trace should be sampled.
*
* Implementations should return an array in the format [$decision, $tags].
*
* @param string $traceId The traceId on the span.
* @param string $operation The operation name set on the span.
* @return array
*/
public function isSampled(string $traceId = '', string $operation = '')
{
return [$this->rateLimiter->checkCredit(1.0), $this->tags];
}
/**
* {@inheritdoc}
*
* Only implemented to satisfy the sampler interface.
*
* @return void
*/
public function close()
{
// nothing to do
}
}

View File

@ -0,0 +1,29 @@
<?php
namespace Jaeger\Sampler;
/**
* Sampler is responsible for deciding if a new trace should be sampled and captured for storage.
*
* @package Jaeger\Sampler
*/
interface SamplerInterface
{
/**
* Whether or not the new trace should be sampled.
*
* Implementations should return an array in the format [$decision, $tags].
*
* @param string $traceId The traceId on the span.
* @param string $operation The operation name set on the span.
* @return array
*/
public function isSampled(string $traceId, string $operation);
/**
* Release any resources used by the sampler.
*
* @return void
*/
public function close();
}

View File

@ -0,0 +1,71 @@
<?php
namespace Jaeger;
use OpenTracing\Scope as OTScope;
use OpenTracing\Span as OTSpan;
/**
* {@inheritdoc}
*/
class Scope implements OTScope
{
/**
* @var ScopeManager
*/
private $scopeManager;
/**
* @var OTSpan
*/
private $wrapped;
/**
* @var OTScope|null
*/
private $toRestore;
/**
* @var bool
*/
private $finishSpanOnClose;
/**
* Scope constructor.
* @param ScopeManager $scopeManager
* @param OTSpan $wrapped
* @param bool $finishSpanOnClose
*/
public function __construct(ScopeManager $scopeManager, OTSpan $wrapped, bool $finishSpanOnClose)
{
$this->scopeManager = $scopeManager;
$this->wrapped = $wrapped;
$this->finishSpanOnClose = $finishSpanOnClose;
$this->toRestore = $scopeManager->getActive();
}
/**
* {@inheritdoc}
*/
public function close(): void
{
if ($this->scopeManager->getActive() !== $this) {
// This shouldn't happen if users call methods in expected order
return;
}
if ($this->finishSpanOnClose) {
$this->wrapped->finish();
}
$this->scopeManager->setActive($this->toRestore);
}
/**
* {@inheritdoc}
*/
public function getSpan(): OTSpan
{
return $this->wrapped;
}
}

View File

@ -0,0 +1,45 @@
<?php
namespace Jaeger;
use OpenTracing\ScopeManager as OTScopeManager;
use OpenTracing\Span as OTSpan;
use OpenTracing\Scope as OTScope;
/**
* {@inheritdoc}
*/
class ScopeManager implements OTScopeManager
{
/**
* @var OTScope
*/
private $active;
/**
* {@inheritdoc}
*/
public function activate(OTSpan $span, bool $finishSpanOnClose = self::DEFAULT_FINISH_SPAN_ON_CLOSE): OTScope
{
$this->active = new Scope($this, $span, $finishSpanOnClose);
return $this->active;
}
/**
* {@inheritdoc}
*/
public function getActive(): ?OTScope
{
return $this->active;
}
/**
* Sets the scope as active.
* @param OTScope|null $scope
*/
public function setActive(OTScope $scope = null)
{
$this->active = $scope;
}
}

View File

@ -0,0 +1,236 @@
<?php
namespace Jaeger\Sender;
use Jaeger\Mapper\SpanToJaegerMapper;
use Jaeger\Span as JaegerSpan;
use Jaeger\Thrift\Agent\AgentClient;
use Jaeger\Thrift\Agent\AgentIf;
use Jaeger\Thrift\Batch;
use Jaeger\Thrift\Process;
use Jaeger\Thrift\Span as JaegerThriftSpan;
use Jaeger\Thrift\Tag;
use Jaeger\Thrift\TagType;
use Jaeger\Tracer;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;
use Thrift\Protocol\TBinaryProtocol;
use Thrift\Protocol\TCompactProtocol;
use Thrift\Transport\TMemoryBuffer;
use const Jaeger\JAEGER_HOSTNAME_TAG_KEY;
class JaegerSender implements SenderInterface
{
/**
* @var JaegerSpan[]
*/
private $spans = [];
/**
* @var AgentIf
*/
private $agentClient;
/**
* @var LoggerInterface
*/
private $logger;
/**
* @var Tracer
*/
private $tracer;
/**
* @var SpanToJaegerMapper
*/
private $mapper;
/**
* @var int
*/
private $jaegerBatchOverheadLength = 512;
/**
* The maximum length of the thrift-objects for a jaeger-batch.
*
* @var int
*/
private $maxBufferLength = 64000;
/**
* @param AgentIf $agentClient
* @param LoggerInterface|null $logger
* @param SpanToJaegerMapper|null $mapper
*/
public function __construct(
AgentIf $agentClient,
LoggerInterface $logger = null,
SpanToJaegerMapper $mapper = null
) {
$this->agentClient = $agentClient;
$this->logger = $logger ?? new NullLogger();
$this->mapper = $mapper ?? new SpanToJaegerMapper();
}
public function flush(): int
{
$count = count($this->spans);
if ($count === 0) {
return 0;
}
$jaegerThriftSpans = $this->makeJaegerBatch($this->spans);
try {
$this->send($jaegerThriftSpans);
} catch (\Exception $e) {
$this->logger->warning($e->getMessage());
}
$this->spans = [];
return $count;
}
public function setMaxBufferLength($maxBufferLength)
{
$this->maxBufferLength = $maxBufferLength;
}
/**
* @param JaegerSpan[] $spans
* @return array
*/
private function makeJaegerBatch(array $spans) : array
{
/** @var JaegerThriftSpan[] $jaegerSpans */
$jaegerSpans = [];
foreach ($spans as $span) {
if (empty($this->tracer)) {
$this->tracer = $span->getTracer();
}
$jaegerSpans[] = $this->mapper->mapSpanToJaeger($span);
}
return $jaegerSpans;
}
/**
* @param JaegerThriftSpan[] $spans
*/
private function send(array $spans)
{
if (empty($this->tracer)) {
return ;
}
$chunks = $this->chunkSplit($spans);
foreach ($chunks as $chunk) {
/** @var JaegerThriftSpan[] $chunk */
$this->emitJaegerBatch($chunk);
}
}
/**
* @param JaegerThriftSpan $span
*/
private function getBufferLength($span)
{
$memoryBuffer = new TMemoryBuffer();
$span->write(new TBinaryProtocol($memoryBuffer));
return $memoryBuffer->available();
}
private function chunkSplit(array $spans): array
{
$actualBufferSize = $this->jaegerBatchOverheadLength;
$chunkId = 0;
$chunks = [];
foreach ($spans as $span) {
$spanBufferLength = $this->getBufferLength($span);
if (!empty($chunks[$chunkId]) && ($actualBufferSize + $spanBufferLength) > $this->maxBufferLength) {
// point to next chunk
++$chunkId;
// reset buffer size
$actualBufferSize = $this->jaegerBatchOverheadLength;
}
if (!isset($chunks[$chunkId])) {
$chunks[$chunkId] = [];
}
$chunks[$chunkId][] = $span;
$actualBufferSize += $spanBufferLength;
}
return $chunks;
}
protected function emitJaegerBatch(array $spans)
{
/** @var Tag[] $tags */
$tags = [];
foreach ($this->tracer->getTags() as $k => $v) {
if (!in_array($k, $this->mapper->getSpecialSpanTags())) {
if (strpos($k, $this->mapper->getProcessTagsPrefix()) !== 0) {
continue ;
}
$quoted = preg_quote($this->mapper->getProcessTagsPrefix());
$k = preg_replace(sprintf('/^%s/', $quoted), '', $k);
}
if ($k === JAEGER_HOSTNAME_TAG_KEY) {
$k = "hostname";
}
$tags[] = new Tag([
"key" => $k,
"vType" => TagType::STRING,
"vStr" => $v
]);
}
$tags[] = new Tag([
"key" => "format",
"vType" => TagType::STRING,
"vStr" => "jaeger.thrift"
]);
$tags[] = new Tag([
"key" => "ip",
"vType" => TagType::STRING,
"vStr" => $this->tracer->getIpAddress()
]);
$batch = new Batch([
"spans" => $spans,
"process" => new Process([
"serviceName" => $this->tracer->getServiceName(),
"tags" => $tags
])
]);
$this->agentClient->emitBatch($batch);
}
/**
* @param JaegerSpan $span
*/
public function append(JaegerSpan $span)
{
$this->spans[] = $span;
}
public function close()
{
}
}

View File

@ -0,0 +1,12 @@
<?php
namespace Jaeger\Sender;
use Jaeger\Span as JaegerSpan;
interface SenderInterface
{
public function flush(): int;
public function append(JaegerSpan $span);
public function close();
}

View File

@ -0,0 +1,305 @@
<?php
namespace Jaeger\Sender;
use Exception;
use Jaeger\Thrift\Agent\AgentClient;
use Jaeger\Thrift\Agent\Zipkin\Annotation;
use Jaeger\Thrift\Agent\Zipkin\AnnotationType;
use Jaeger\Thrift\Agent\Zipkin\BinaryAnnotation;
use Jaeger\Thrift\Agent\Zipkin\Endpoint;
use Jaeger\Thrift\Agent\Zipkin\Span as ThriftSpan;
use Psr\Log\LoggerInterface;
use Psr\Log\NullLogger;
use Thrift\Base\TBase;
use Thrift\Protocol\TCompactProtocol;
use Thrift\Transport\TMemoryBuffer;
use Jaeger\Span as JaegerSpan;
use const OpenTracing\Tags\COMPONENT;
class UdpSender
{
const CLIENT_ADDR = "ca";
const SERVER_ADDR = "sa";
/**
* @var JaegerSpan[]
*/
private $spans = [];
/**
* @var AgentClient
*/
private $client;
/**
* @var LoggerInterface
*/
private $logger;
/**
* The maximum length of the thrift-objects for a zipkin-batch.
*
* @var int
*/
private $maxBufferLength;
/**
* The length of the zipkin-batch overhead.
*
* @var int
*/
private $zipkinBatchOverheadLength = 30;
/**
* UdpSender constructor.
*
* @param AgentClient $client
* @param int $maxBufferLength
* @param LoggerInterface|null $logger
*/
public function __construct(
AgentClient $client,
int $maxBufferLength,
LoggerInterface $logger = null
) {
$this->client = $client;
$this->maxBufferLength = $maxBufferLength;
$this->logger = $logger ?? new NullLogger();
}
/**
* @param JaegerSpan $span
*/
public function append(JaegerSpan $span)
{
$this->spans[] = $span;
}
/**
* @return int the number of flushed spans
*/
public function flush(): int
{
$count = count($this->spans);
if ($count === 0) {
return 0;
}
$zipkinSpans = $this->makeZipkinBatch($this->spans);
try {
$this->send($zipkinSpans);
} catch (Exception $e) {
$this->logger->warning($e->getMessage());
}
$this->spans = [];
return $count;
}
public function close()
{
}
/**
* Emits the thrift-objects.
*
* @param array|ThriftSpan[]|TBase[] $thrifts
*/
private function send(array $thrifts)
{
foreach ($this->chunkSplit($thrifts) as $chunk) {
/* @var $chunk ThriftSpan[] */
$this->client->emitZipkinBatch($chunk);
}
}
/**
* @param JaegerSpan[] $spans
* @return ThriftSpan[]
*/
private function makeZipkinBatch(array $spans): array
{
/** @var ThriftSpan[] */
$zipkinSpans = [];
foreach ($spans as $span) {
/** @var JaegerSpan $span */
$endpoint = $this->makeEndpoint(
$span->getTracer()->getIpAddress(),
0, // span.port,
$span->getTracer()->getServiceName()
);
$timestamp = $span->getStartTime();
$duration = $span->getEndTime() - $span->getStartTime();
$this->addZipkinAnnotations($span, $endpoint);
$zipkinSpan = new ThriftSpan([
'name' => $span->getOperationName(),
'id' => $span->getContext()->getSpanId(),
'parent_id' => $span->getContext()->getParentId() ?? null,
'trace_id' => $span->getContext()->getTraceId(),
'annotations' => $this->createAnnotations($span, $endpoint),
'binary_annotations' => $span->getTags(),
'debug' => $span->isDebug(),
'timestamp' => $timestamp,
'duration' => $duration,
]);
$zipkinSpans[] = $zipkinSpan;
}
return $zipkinSpans;
}
private function addZipkinAnnotations(JaegerSpan $span, Endpoint $endpoint)
{
if ($span->isRpc() && $span->peer) {
$isClient = $span->isRpcClient();
$host = $this->makeEndpoint(
$span->peer['ipv4'] ?? 0,
$span->peer['port'] ?? 0,
$span->peer['service_name'] ?? ''
);
$key = ($isClient) ? self::SERVER_ADDR : self::CLIENT_ADDR;
$peer = $this->makePeerAddressTag($key, $host);
$span->tags[$key] = $peer;
} else {
$tag = $this->makeLocalComponentTag(
$span->getComponent() ?? $span->getTracer()->getServiceName(),
$endpoint
);
$span->tags[COMPONENT] = $tag;
}
}
private function makeLocalComponentTag(string $componentName, Endpoint $endpoint): BinaryAnnotation
{
return new BinaryAnnotation([
'key' => "lc",
'value' => $componentName,
'annotation_type' => AnnotationType::STRING,
'host' => $endpoint,
]);
}
private function makeEndpoint(string $ipv4, int $port, string $serviceName): Endpoint
{
$ipv4 = $this->ipv4ToInt($ipv4);
return new Endpoint([
'ipv4' => $ipv4,
'port' => $port,
'service_name' => $serviceName,
]);
}
private function ipv4ToInt(string $ipv4): int
{
if ($ipv4 == 'localhost') {
$ipv4 = '127.0.0.1';
} elseif ($ipv4 == '::1') {
$ipv4 = '127.0.0.1';
}
$long = ip2long($ipv4);
if (PHP_INT_SIZE === 8) {
return $long >> 31 ? $long - (1 << 32) : $long;
}
return $long;
}
// Used for Zipkin binary annotations like CA/SA (client/server address).
// They are modeled as Boolean type with '0x01' as the value.
private function makePeerAddressTag(string $key, Endpoint $host): BinaryAnnotation
{
return new BinaryAnnotation([
"key" => $key,
"value" => '0x01',
"annotation_type" => AnnotationType::BOOL,
"host" => $host,
]);
}
/**
* Splits an array of thrift-objects into several chunks when the buffer limit has been reached.
*
* @param array|ThriftSpan[]|TBase[] $thrifts
*
* @return array
*/
private function chunkSplit(array $thrifts): array
{
$actualBufferSize = $this->zipkinBatchOverheadLength;
$chunkId = 0;
$chunks = [];
foreach ($thrifts as $thrift) {
$spanBufferLength = $this->getBufferLength($thrift);
if (!empty($chunks[$chunkId]) && ($actualBufferSize + $spanBufferLength) > $this->maxBufferLength) {
// point to next chunk
++$chunkId;
// reset buffer size
$actualBufferSize = $this->zipkinBatchOverheadLength;
}
if (!isset($chunks[$chunkId])) {
$chunks[$chunkId] = [];
}
$chunks[$chunkId][] = $thrift;
$actualBufferSize += $spanBufferLength;
}
return $chunks;
}
/**
* Returns the length of a thrift-object.
*
* @param ThriftSpan|TBase $thrift
*
* @return int
*/
private function getBufferLength($thrift): int
{
$memoryBuffer = new TMemoryBuffer();
$thrift->write(new TCompactProtocol($memoryBuffer));
return $memoryBuffer->available();
}
/*
* @param JaegerSpan $span
* @param Endpoint $endpoint
*
* @return array|Annotation[]
*/
private function createAnnotations(JaegerSpan $span, Endpoint $endpoint): array
{
$annotations = [];
foreach ($span->getLogs() as $values) {
$annotations[] = new Annotation([
'timestamp' => $values['timestamp'],
'value' => json_encode($values['fields']),
'host' => $endpoint,
]);
}
return $annotations;
}
}

View File

@ -0,0 +1,476 @@
<?php
namespace Jaeger;
use Jaeger\Thrift\Agent\Zipkin\AnnotationType;
use Jaeger\Thrift\Agent\Zipkin\BinaryAnnotation;
use OpenTracing\Span as OTSpan;
use DateTime;
use DateTimeInterface;
use OpenTracing\SpanContext as OTSpanContext;
use const OpenTracing\Tags\COMPONENT;
use const OpenTracing\Tags\PEER_HOST_IPV4;
use const OpenTracing\Tags\PEER_PORT;
use const OpenTracing\Tags\PEER_SERVICE;
use const OpenTracing\Tags\SPAN_KIND;
use const OpenTracing\Tags\SPAN_KIND_MESSAGE_BUS_CONSUMER;
use const OpenTracing\Tags\SPAN_KIND_MESSAGE_BUS_PRODUCER;
use const OpenTracing\Tags\SPAN_KIND_RPC_CLIENT;
use const OpenTracing\Tags\SPAN_KIND_RPC_SERVER;
class Span implements OTSpan
{
/**
* @var Tracer
*/
private $tracer;
/**
* @var SpanContext
*/
private $context;
/**
* @var string
*/
private $operationName;
/**
* @var int|float|DateTime|null
*/
private $startTime;
/**
* @var int|float|DateTime|null
*/
private $endTime;
/**
* SPAN_RPC_CLIENT
* @var null|string
*/
private $kind;
/**
* @var array|null
*/
public $peer;
/**
* @var string|null
*/
private $component;
/**
* @var array
*/
private $logs = [];
/**
* @var BinaryAnnotation[]
*/
public $tags = [];
/**
* @var bool
*/
private $debug = false;
/**
* Span constructor.
* @param SpanContext $context
* @param Tracer $tracer
* @param string $operationName
* @param array $tags
* @param int|float|DateTime|null $startTime
*/
public function __construct(
SpanContext $context,
Tracer $tracer,
string $operationName,
array $tags = [],
$startTime = null
) {
$this->context = $context;
$this->tracer = $tracer;
$this->operationName = $operationName;
$this->startTime = $this->microTime($startTime);
$this->endTime = null;
$this->kind = null;
$this->peer = null;
$this->component = null;
foreach ($tags as $key => $value) {
$this->setTag($key, $value);
}
}
/**
* Converts time to microtime int
* - int represents microseconds
* - float represents seconds
*
* @param int|float|DateTime|null $time
* @return int
*/
protected function microTime($time): int
{
if ($time === null) {
return $this->timestampMicro();
}
if ($time instanceof \DateTimeInterface) {
return (int)round($time->format('U.u') * 1000000, 0);
}
if (is_int($time)) {
return $time;
}
if (is_float($time)) {
return (int)round($time * 1000000, 0);
}
throw new \InvalidArgumentException(sprintf(
'Time should be one of the types int|float|DateTime|null, got %s.',
gettype($time)
));
}
/**
* @return Tracer
*/
public function getTracer(): Tracer
{
return $this->tracer;
}
/**
* @return bool
*/
public function isDebug(): bool
{
return $this->debug;
}
/**
* @return int
*/
public function getStartTime(): int
{
return $this->startTime;
}
/**
* @return int|null
*/
public function getEndTime()
{
return $this->endTime;
}
/**
* @return string
*/
public function getOperationName(): string
{
return $this->operationName;
}
/**
* @return mixed
*/
public function getComponent()
{
// TODO
return $this->component;
}
/**
* {@inheritdoc}
*
* @return SpanContext
*/
public function getContext(): OTSpanContext
{
return $this->context;
}
/**
* {@inheritdoc}
*/
public function finish($finishTime = null, array $logRecords = []): void
{
if (!$this->isSampled()) {
return;
}
foreach ($logRecords as $logRecord) {
$this->log($logRecord);
}
$this->endTime = $this->microTime($finishTime);
$this->tracer->reportSpan($this);
}
/**
* Returns true if the trace should be measured.
*
* @return bool
*/
public function isSampled(): bool
{
$context = $this->getContext();
return ($context->getFlags() & SAMPLED_FLAG) == SAMPLED_FLAG;
}
/**
* {@inheritdoc}
*/
public function overwriteOperationName(string $newOperationName): void
{
// TODO log warning
$this->operationName = $newOperationName;
}
/**
* {@inheritdoc}
*
* @param array $tags
* @return void
*/
public function setTags($tags)
{
foreach ($tags as $key => $value) {
$this->setTag($key, $value);
}
}
/**
* {@inheritdoc}
*/
public function setTag(string $key, $value): void
{
if ($this->isSampled()) {
$special = self::SPECIAL_TAGS[$key] ?? null;
$handled = false;
if ($special !== null && is_callable([$this, $special])) {
$handled = $this->$special($value);
}
if (!$handled) {
$tag = $this->makeTag($key, $value);
$this->tags[$key] = $tag;
}
}
}
const SPECIAL_TAGS = [
PEER_SERVICE => 'setPeerService',
PEER_HOST_IPV4 => 'setPeerHostIpv4',
PEER_PORT => 'setPeerPort',
SPAN_KIND => 'setSpanKind',
COMPONENT => 'setComponent',
];
/**
* Sets a low-cardinality identifier of the module, library,
* or package that is generating a span.
*
* @see Span::setTag()
*
* @param string $value
* @return bool
*/
private function setComponent($value): bool
{
$this->component = $value;
return true;
}
/**
* @return bool
*/
private function setSpanKind($value): bool
{
$validSpanKinds = [
SPAN_KIND_RPC_CLIENT,
SPAN_KIND_RPC_SERVER,
SPAN_KIND_MESSAGE_BUS_CONSUMER,
SPAN_KIND_MESSAGE_BUS_PRODUCER,
];
if ($value === null || in_array($value, $validSpanKinds, true)) {
$this->kind = $value;
return true;
}
return false;
}
/**
* @return string|null
*/
public function getKind(): ?string
{
return $this->kind;
}
/**
* @return bool
*/
private function setPeerPort($value): bool
{
if ($this->peer === null) {
$this->peer = ['port' => $value];
} else {
$this->peer['port'] = $value;
}
return true;
}
/**
* @return bool
*/
private function setPeerHostIpv4($value): bool
{
if ($this->peer === null) {
$this->peer = ['ipv4' => $value];
} else {
$this->peer['ipv4'] = $value;
}
return true;
}
/**
* @return bool
*/
private function setPeerService($value): bool
{
if ($this->peer === null) {
$this->peer = ['service_name' => $value];
} else {
$this->peer['service_name'] = $value;
}
return true;
}
/**
* @return bool
*/
public function isRpc(): bool
{
return $this->kind == SPAN_KIND_RPC_CLIENT || $this->kind == SPAN_KIND_RPC_SERVER;
}
/**
* @return bool
*/
public function isRpcClient(): bool
{
return $this->kind == SPAN_KIND_RPC_CLIENT;
}
/**
* {@inheritdoc}
*/
public function log(array $fields = [], $timestamp = null): void
{
$timestamp = $this->microTime($timestamp);
if ($timestamp < $this->getStartTime()) {
$timestamp = $this->timestampMicro();
}
$this->logs[] = [
'fields' => $fields,
'timestamp' => $timestamp,
];
}
/**
* Returns the logs.
*
* [
* [
* 'timestamp' => timestamp in microsecond,
* 'fields' => [
* 'error' => 'message',
* ]
* ]
* ]
*
* @return array
*/
public function getLogs(): array
{
return $this->logs;
}
/**
* {@inheritdoc}
*/
public function addBaggageItem(string $key, string $value): void
{
$this->context = $this->context->withBaggageItem($key, $value);
}
/**
* {@inheritdoc}
*/
public function getBaggageItem(string $key): ?string
{
return $this->context->getBaggageItem($key);
}
/**
* @return array
*/
public function getTags(): array
{
return $this->tags;
}
/**
* @return int
*/
private function timestampMicro(): int
{
return round(microtime(true) * 1000000);
}
/**
* @param string $key
* @param mixed $value
* @return BinaryAnnotation
*/
private function makeTag(string $key, $value): BinaryAnnotation
{
$valueType = gettype($value);
$annotationType = null;
switch ($valueType) {
case "boolean":
$annotationType = AnnotationType::BOOL;
break;
case "integer":
$annotationType = AnnotationType::I64;
break;
case "double":
$annotationType = AnnotationType::DOUBLE;
break;
default:
$annotationType = AnnotationType::STRING;
$value = (string)$value;
if (strlen($value) > 1024) {
$value = substr($value, 0, 1024);
}
}
return new BinaryAnnotation([
'key' => $key,
'value' => $value,
'annotation_type' => $annotationType,
]);
}
}

View File

@ -0,0 +1,120 @@
<?php
namespace Jaeger;
use ArrayIterator;
use OpenTracing\SpanContext as OTSpanContext;
class SpanContext implements OTSpanContext
{
private $traceId;
private $spanId;
private $parentId;
private $flags;
/**
* @var array
*/
private $baggage;
private $debugId;
/**
* SpanContext constructor.
*
* @param string $traceId
* @param string $spanId
* @param string $parentId
* @param int|null $flags
* @param array $baggage
* @param int|null $debugId
*/
public function __construct($traceId, $spanId, $parentId, $flags = null, $baggage = [], $debugId = null)
{
$this->traceId = $traceId;
$this->spanId = $spanId;
$this->parentId = $parentId;
$this->flags = $flags;
$this->baggage = is_array($baggage) ? $baggage : [];
$this->debugId = $debugId;
}
/**
* {@inheritdoc}
* @return ArrayIterator
*/
#[\ReturnTypeWillChange]
public function getIterator()
{
return new ArrayIterator($this->baggage);
}
/**
* {@inheritdoc}
*/
public function getBaggageItem(string $key): ?string
{
return array_key_exists($key, $this->baggage) ? $this->baggage[$key] : null;
}
/**
* {@inheritdoc}
*
* @param string $key
* @param string $value
* @return SpanContext
*/
public function withBaggageItem(string $key, string $value): OTSpanContext
{
return new self(
$this->traceId,
$this->spanId,
$this->parentId,
$this->flags,
[$key => $value] + $this->baggage
);
}
public function getTraceId()
{
return $this->traceId;
}
public function getParentId()
{
return $this->parentId;
}
public function getSpanId()
{
return $this->spanId;
}
/**
* Get the span context flags.
*
* @return int|null
*/
public function getFlags()
{
return $this->flags;
}
public function getBaggage()
{
return $this->baggage;
}
public function getDebugId()
{
return $this->debugId;
}
public function isDebugIdContainerOnly(): bool
{
return ($this->traceId === null) && ($this->debugId !== null);
}
}

View File

@ -0,0 +1,76 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class AgentClient implements \Jaeger\Thrift\Agent\AgentIf {
protected $input_ = null;
protected $output_ = null;
protected $seqid_ = 0;
public function __construct($input, $output=null) {
$this->input_ = $input;
$this->output_ = $output ? $output : $input;
}
public function emitZipkinBatch(array $spans)
{
$this->send_emitZipkinBatch($spans);
}
public function send_emitZipkinBatch(array $spans)
{
$args = new \Jaeger\Thrift\Agent\Agent_emitZipkinBatch_args();
$args->spans = $spans;
$bin_accel = ($this->output_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary');
if ($bin_accel)
{
thrift_protocol_write_binary($this->output_, 'emitZipkinBatch', TMessageType::ONEWAY, $args, $this->seqid_, $this->output_->isStrictWrite());
}
else
{
$this->output_->writeMessageBegin('emitZipkinBatch', TMessageType::ONEWAY, $this->seqid_);
$args->write($this->output_);
$this->output_->writeMessageEnd();
$this->output_->getTransport()->flush();
}
}
public function emitBatch(\Jaeger\Thrift\Batch $batch)
{
$this->send_emitBatch($batch);
}
public function send_emitBatch(\Jaeger\Thrift\Batch $batch)
{
$args = new \Jaeger\Thrift\Agent\Agent_emitBatch_args();
$args->batch = $batch;
$bin_accel = ($this->output_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary');
if ($bin_accel)
{
thrift_protocol_write_binary($this->output_, 'emitBatch', TMessageType::ONEWAY, $args, $this->seqid_, $this->output_->isStrictWrite());
}
else
{
$this->output_->writeMessageBegin('emitBatch', TMessageType::ONEWAY, $this->seqid_);
$args->write($this->output_);
$this->output_->writeMessageEnd();
$this->output_->getTransport()->flush();
}
}
}

View File

@ -0,0 +1,30 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
interface AgentIf {
/**
* @param \Jaeger\Thrift\Agent\Zipkin\Span[] $spans
*/
public function emitZipkinBatch(array $spans);
/**
* @param \Jaeger\Thrift\Batch $batch
*/
public function emitBatch(\Jaeger\Thrift\Batch $batch);
}

View File

@ -0,0 +1,56 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class Agent_emitBatch_args extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'batch',
'isRequired' => false,
'type' => TType::STRUCT,
'class' => '\Jaeger\Thrift\Batch',
),
);
/**
* @var \Jaeger\Thrift\Batch
*/
public $batch = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'Agent_emitBatch_args';
}
public function read($input)
{
return $this->_read('Agent_emitBatch_args', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('Agent_emitBatch_args', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,60 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class Agent_emitZipkinBatch_args extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'spans',
'isRequired' => false,
'type' => TType::LST,
'etype' => TType::STRUCT,
'elem' => array(
'type' => TType::STRUCT,
'class' => '\Jaeger\Thrift\Agent\Zipkin\Span',
),
),
);
/**
* @var \Jaeger\Thrift\Agent\Zipkin\Span[]
*/
public $spans = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'Agent_emitZipkinBatch_args';
}
public function read($input)
{
return $this->_read('Agent_emitZipkinBatch_args', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('Agent_emitZipkinBatch_args', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,83 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class AggregationValidatorClient implements \Jaeger\Thrift\Agent\AggregationValidatorIf {
protected $input_ = null;
protected $output_ = null;
protected $seqid_ = 0;
public function __construct($input, $output=null) {
$this->input_ = $input;
$this->output_ = $output ? $output : $input;
}
public function validateTrace($traceId)
{
$this->send_validateTrace($traceId);
return $this->recv_validateTrace();
}
public function send_validateTrace($traceId)
{
$args = new \Jaeger\Thrift\Agent\AggregationValidator_validateTrace_args();
$args->traceId = $traceId;
$bin_accel = ($this->output_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary');
if ($bin_accel)
{
thrift_protocol_write_binary($this->output_, 'validateTrace', TMessageType::CALL, $args, $this->seqid_, $this->output_->isStrictWrite());
}
else
{
$this->output_->writeMessageBegin('validateTrace', TMessageType::CALL, $this->seqid_);
$args->write($this->output_);
$this->output_->writeMessageEnd();
$this->output_->getTransport()->flush();
}
}
public function recv_validateTrace()
{
$bin_accel = ($this->input_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_read_binary');
if ($bin_accel) $result = thrift_protocol_read_binary($this->input_, '\Jaeger\Thrift\Agent\AggregationValidator_validateTrace_result', $this->input_->isStrictRead());
else
{
$rseqid = 0;
$fname = null;
$mtype = 0;
$this->input_->readMessageBegin($fname, $mtype, $rseqid);
if ($mtype == TMessageType::EXCEPTION) {
$x = new TApplicationException();
$x->read($this->input_);
$this->input_->readMessageEnd();
throw $x;
}
$result = new \Jaeger\Thrift\Agent\AggregationValidator_validateTrace_result();
$result->read($this->input_);
$this->input_->readMessageEnd();
}
if ($result->success !== null) {
return $result->success;
}
throw new \Exception("validateTrace failed: unknown result");
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
interface AggregationValidatorIf {
/**
* @param string $traceId
* @return \Jaeger\Thrift\Agent\ValidateTraceResponse
*/
public function validateTrace($traceId);
}

View File

@ -0,0 +1,55 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class AggregationValidator_validateTrace_args extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'traceId',
'isRequired' => true,
'type' => TType::STRING,
),
);
/**
* @var string
*/
public $traceId = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'AggregationValidator_validateTrace_args';
}
public function read($input)
{
return $this->_read('AggregationValidator_validateTrace_args', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('AggregationValidator_validateTrace_args', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,56 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class AggregationValidator_validateTrace_result extends TBase {
static $isValidate = false;
static $_TSPEC = array(
0 => array(
'var' => 'success',
'isRequired' => false,
'type' => TType::STRUCT,
'class' => '\Jaeger\Thrift\Agent\ValidateTraceResponse',
),
);
/**
* @var \Jaeger\Thrift\Agent\ValidateTraceResponse
*/
public $success = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'AggregationValidator_validateTrace_result';
}
public function read($input)
{
return $this->_read('AggregationValidator_validateTrace_result', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('AggregationValidator_validateTrace_result', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,65 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class BaggageRestriction extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'baggageKey',
'isRequired' => true,
'type' => TType::STRING,
),
2 => array(
'var' => 'maxValueLength',
'isRequired' => true,
'type' => TType::I32,
),
);
/**
* @var string
*/
public $baggageKey = null;
/**
* @var int
*/
public $maxValueLength = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'BaggageRestriction';
}
public function read($input)
{
return $this->_read('BaggageRestriction', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('BaggageRestriction', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,83 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class BaggageRestrictionManagerClient implements \Jaeger\Thrift\Agent\BaggageRestrictionManagerIf {
protected $input_ = null;
protected $output_ = null;
protected $seqid_ = 0;
public function __construct($input, $output=null) {
$this->input_ = $input;
$this->output_ = $output ? $output : $input;
}
public function getBaggageRestrictions($serviceName)
{
$this->send_getBaggageRestrictions($serviceName);
return $this->recv_getBaggageRestrictions();
}
public function send_getBaggageRestrictions($serviceName)
{
$args = new \Jaeger\Thrift\Agent\BaggageRestrictionManager_getBaggageRestrictions_args();
$args->serviceName = $serviceName;
$bin_accel = ($this->output_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary');
if ($bin_accel)
{
thrift_protocol_write_binary($this->output_, 'getBaggageRestrictions', TMessageType::CALL, $args, $this->seqid_, $this->output_->isStrictWrite());
}
else
{
$this->output_->writeMessageBegin('getBaggageRestrictions', TMessageType::CALL, $this->seqid_);
$args->write($this->output_);
$this->output_->writeMessageEnd();
$this->output_->getTransport()->flush();
}
}
public function recv_getBaggageRestrictions()
{
$bin_accel = ($this->input_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_read_binary');
if ($bin_accel) $result = thrift_protocol_read_binary($this->input_, '\Jaeger\Thrift\Agent\BaggageRestrictionManager_getBaggageRestrictions_result', $this->input_->isStrictRead());
else
{
$rseqid = 0;
$fname = null;
$mtype = 0;
$this->input_->readMessageBegin($fname, $mtype, $rseqid);
if ($mtype == TMessageType::EXCEPTION) {
$x = new TApplicationException();
$x->read($this->input_);
$this->input_->readMessageEnd();
throw $x;
}
$result = new \Jaeger\Thrift\Agent\BaggageRestrictionManager_getBaggageRestrictions_result();
$result->read($this->input_);
$this->input_->readMessageEnd();
}
if ($result->success !== null) {
return $result->success;
}
throw new \Exception("getBaggageRestrictions failed: unknown result");
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
interface BaggageRestrictionManagerIf {
/**
* getBaggageRestrictions retrieves the baggage restrictions for a specific service.
* Usually, baggageRestrictions apply to all services however there may be situations
* where a baggageKey might only be allowed to be set by a specific service.
*
* @param string $serviceName
* @return \Jaeger\Thrift\Agent\BaggageRestriction[]
*/
public function getBaggageRestrictions($serviceName);
}

View File

@ -0,0 +1,55 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class BaggageRestrictionManager_getBaggageRestrictions_args extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'serviceName',
'isRequired' => false,
'type' => TType::STRING,
),
);
/**
* @var string
*/
public $serviceName = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'BaggageRestrictionManager_getBaggageRestrictions_args';
}
public function read($input)
{
return $this->_read('BaggageRestrictionManager_getBaggageRestrictions_args', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('BaggageRestrictionManager_getBaggageRestrictions_args', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,60 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class BaggageRestrictionManager_getBaggageRestrictions_result extends TBase {
static $isValidate = false;
static $_TSPEC = array(
0 => array(
'var' => 'success',
'isRequired' => false,
'type' => TType::LST,
'etype' => TType::STRUCT,
'elem' => array(
'type' => TType::STRUCT,
'class' => '\Jaeger\Thrift\Agent\BaggageRestriction',
),
),
);
/**
* @var \Jaeger\Thrift\Agent\BaggageRestriction[]
*/
public $success = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'BaggageRestrictionManager_getBaggageRestrictions_result';
}
public function read($input)
{
return $this->_read('BaggageRestrictionManager_getBaggageRestrictions_result', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('BaggageRestrictionManager_getBaggageRestrictions_result', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,61 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class Dependencies extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'links',
'isRequired' => true,
'type' => TType::LST,
'etype' => TType::STRUCT,
'elem' => array(
'type' => TType::STRUCT,
'class' => '\Jaeger\Thrift\Agent\DependencyLink',
),
),
);
/**
* @var \Jaeger\Thrift\Agent\DependencyLink[]
*/
public $links = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'Dependencies';
}
public function read($input)
{
return $this->_read('Dependencies', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('Dependencies', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,105 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class DependencyClient implements \Jaeger\Thrift\Agent\DependencyIf {
protected $input_ = null;
protected $output_ = null;
protected $seqid_ = 0;
public function __construct($input, $output=null) {
$this->input_ = $input;
$this->output_ = $output ? $output : $input;
}
public function getDependenciesForTrace($traceId)
{
$this->send_getDependenciesForTrace($traceId);
return $this->recv_getDependenciesForTrace();
}
public function send_getDependenciesForTrace($traceId)
{
$args = new \Jaeger\Thrift\Agent\Dependency_getDependenciesForTrace_args();
$args->traceId = $traceId;
$bin_accel = ($this->output_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary');
if ($bin_accel)
{
thrift_protocol_write_binary($this->output_, 'getDependenciesForTrace', TMessageType::CALL, $args, $this->seqid_, $this->output_->isStrictWrite());
}
else
{
$this->output_->writeMessageBegin('getDependenciesForTrace', TMessageType::CALL, $this->seqid_);
$args->write($this->output_);
$this->output_->writeMessageEnd();
$this->output_->getTransport()->flush();
}
}
public function recv_getDependenciesForTrace()
{
$bin_accel = ($this->input_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_read_binary');
if ($bin_accel) $result = thrift_protocol_read_binary($this->input_, '\Jaeger\Thrift\Agent\Dependency_getDependenciesForTrace_result', $this->input_->isStrictRead());
else
{
$rseqid = 0;
$fname = null;
$mtype = 0;
$this->input_->readMessageBegin($fname, $mtype, $rseqid);
if ($mtype == TMessageType::EXCEPTION) {
$x = new TApplicationException();
$x->read($this->input_);
$this->input_->readMessageEnd();
throw $x;
}
$result = new \Jaeger\Thrift\Agent\Dependency_getDependenciesForTrace_result();
$result->read($this->input_);
$this->input_->readMessageEnd();
}
if ($result->success !== null) {
return $result->success;
}
throw new \Exception("getDependenciesForTrace failed: unknown result");
}
public function saveDependencies(\Jaeger\Thrift\Agent\Dependencies $dependencies)
{
$this->send_saveDependencies($dependencies);
}
public function send_saveDependencies(\Jaeger\Thrift\Agent\Dependencies $dependencies)
{
$args = new \Jaeger\Thrift\Agent\Dependency_saveDependencies_args();
$args->dependencies = $dependencies;
$bin_accel = ($this->output_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary');
if ($bin_accel)
{
thrift_protocol_write_binary($this->output_, 'saveDependencies', TMessageType::ONEWAY, $args, $this->seqid_, $this->output_->isStrictWrite());
}
else
{
$this->output_->writeMessageBegin('saveDependencies', TMessageType::ONEWAY, $this->seqid_);
$args->write($this->output_);
$this->output_->writeMessageEnd();
$this->output_->getTransport()->flush();
}
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
interface DependencyIf {
/**
* @param string $traceId
* @return \Jaeger\Thrift\Agent\Dependencies
*/
public function getDependenciesForTrace($traceId);
/**
* @param \Jaeger\Thrift\Agent\Dependencies $dependencies
*/
public function saveDependencies(\Jaeger\Thrift\Agent\Dependencies $dependencies);
}

View File

@ -0,0 +1,74 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class DependencyLink extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'parent',
'isRequired' => true,
'type' => TType::STRING,
),
2 => array(
'var' => 'child',
'isRequired' => true,
'type' => TType::STRING,
),
4 => array(
'var' => 'callCount',
'isRequired' => true,
'type' => TType::I64,
),
);
/**
* @var string
*/
public $parent = null;
/**
* @var string
*/
public $child = null;
/**
* @var int
*/
public $callCount = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'DependencyLink';
}
public function read($input)
{
return $this->_read('DependencyLink', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('DependencyLink', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,55 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class Dependency_getDependenciesForTrace_args extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'traceId',
'isRequired' => true,
'type' => TType::STRING,
),
);
/**
* @var string
*/
public $traceId = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'Dependency_getDependenciesForTrace_args';
}
public function read($input)
{
return $this->_read('Dependency_getDependenciesForTrace_args', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('Dependency_getDependenciesForTrace_args', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,56 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class Dependency_getDependenciesForTrace_result extends TBase {
static $isValidate = false;
static $_TSPEC = array(
0 => array(
'var' => 'success',
'isRequired' => false,
'type' => TType::STRUCT,
'class' => '\Jaeger\Thrift\Agent\Dependencies',
),
);
/**
* @var \Jaeger\Thrift\Agent\Dependencies
*/
public $success = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'Dependency_getDependenciesForTrace_result';
}
public function read($input)
{
return $this->_read('Dependency_getDependenciesForTrace_result', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('Dependency_getDependenciesForTrace_result', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,56 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class Dependency_saveDependencies_args extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'dependencies',
'isRequired' => false,
'type' => TType::STRUCT,
'class' => '\Jaeger\Thrift\Agent\Dependencies',
),
);
/**
* @var \Jaeger\Thrift\Agent\Dependencies
*/
public $dependencies = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'Dependency_saveDependencies_args';
}
public function read($input)
{
return $this->_read('Dependency_saveDependencies_args', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('Dependency_saveDependencies_args', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,66 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class OperationSamplingStrategy extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'operation',
'isRequired' => true,
'type' => TType::STRING,
),
2 => array(
'var' => 'probabilisticSampling',
'isRequired' => true,
'type' => TType::STRUCT,
'class' => '\Jaeger\Thrift\Agent\ProbabilisticSamplingStrategy',
),
);
/**
* @var string
*/
public $operation = null;
/**
* @var \Jaeger\Thrift\Agent\ProbabilisticSamplingStrategy
*/
public $probabilisticSampling = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'OperationSamplingStrategy';
}
public function read($input)
{
return $this->_read('OperationSamplingStrategy', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('OperationSamplingStrategy', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,88 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class PerOperationSamplingStrategies extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'defaultSamplingProbability',
'isRequired' => true,
'type' => TType::DOUBLE,
),
2 => array(
'var' => 'defaultLowerBoundTracesPerSecond',
'isRequired' => true,
'type' => TType::DOUBLE,
),
3 => array(
'var' => 'perOperationStrategies',
'isRequired' => true,
'type' => TType::LST,
'etype' => TType::STRUCT,
'elem' => array(
'type' => TType::STRUCT,
'class' => '\Jaeger\Thrift\Agent\OperationSamplingStrategy',
),
),
4 => array(
'var' => 'defaultUpperBoundTracesPerSecond',
'isRequired' => false,
'type' => TType::DOUBLE,
),
);
/**
* @var double
*/
public $defaultSamplingProbability = null;
/**
* @var double
*/
public $defaultLowerBoundTracesPerSecond = null;
/**
* @var \Jaeger\Thrift\Agent\OperationSamplingStrategy[]
*/
public $perOperationStrategies = null;
/**
* @var double
*/
public $defaultUpperBoundTracesPerSecond = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'PerOperationSamplingStrategies';
}
public function read($input)
{
return $this->_read('PerOperationSamplingStrategies', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('PerOperationSamplingStrategies', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,56 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class ProbabilisticSamplingStrategy extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'samplingRate',
'isRequired' => true,
'type' => TType::DOUBLE,
),
);
/**
* @var double
*/
public $samplingRate = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'ProbabilisticSamplingStrategy';
}
public function read($input)
{
return $this->_read('ProbabilisticSamplingStrategy', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('ProbabilisticSamplingStrategy', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,56 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class RateLimitingSamplingStrategy extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'maxTracesPerSecond',
'isRequired' => true,
'type' => TType::I16,
),
);
/**
* @var int
*/
public $maxTracesPerSecond = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'RateLimitingSamplingStrategy';
}
public function read($input)
{
return $this->_read('RateLimitingSamplingStrategy', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('RateLimitingSamplingStrategy', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,83 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class SamplingManagerClient implements \Jaeger\Thrift\Agent\SamplingManagerIf {
protected $input_ = null;
protected $output_ = null;
protected $seqid_ = 0;
public function __construct($input, $output=null) {
$this->input_ = $input;
$this->output_ = $output ? $output : $input;
}
public function getSamplingStrategy($serviceName)
{
$this->send_getSamplingStrategy($serviceName);
return $this->recv_getSamplingStrategy();
}
public function send_getSamplingStrategy($serviceName)
{
$args = new \Jaeger\Thrift\Agent\SamplingManager_getSamplingStrategy_args();
$args->serviceName = $serviceName;
$bin_accel = ($this->output_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary');
if ($bin_accel)
{
thrift_protocol_write_binary($this->output_, 'getSamplingStrategy', TMessageType::CALL, $args, $this->seqid_, $this->output_->isStrictWrite());
}
else
{
$this->output_->writeMessageBegin('getSamplingStrategy', TMessageType::CALL, $this->seqid_);
$args->write($this->output_);
$this->output_->writeMessageEnd();
$this->output_->getTransport()->flush();
}
}
public function recv_getSamplingStrategy()
{
$bin_accel = ($this->input_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_read_binary');
if ($bin_accel) $result = thrift_protocol_read_binary($this->input_, '\Jaeger\Thrift\Agent\SamplingManager_getSamplingStrategy_result', $this->input_->isStrictRead());
else
{
$rseqid = 0;
$fname = null;
$mtype = 0;
$this->input_->readMessageBegin($fname, $mtype, $rseqid);
if ($mtype == TMessageType::EXCEPTION) {
$x = new TApplicationException();
$x->read($this->input_);
$this->input_->readMessageEnd();
throw $x;
}
$result = new \Jaeger\Thrift\Agent\SamplingManager_getSamplingStrategy_result();
$result->read($this->input_);
$this->input_->readMessageEnd();
}
if ($result->success !== null) {
return $result->success;
}
throw new \Exception("getSamplingStrategy failed: unknown result");
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
interface SamplingManagerIf {
/**
* @param string $serviceName
* @return \Jaeger\Thrift\Agent\SamplingStrategyResponse
*/
public function getSamplingStrategy($serviceName);
}

View File

@ -0,0 +1,55 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class SamplingManager_getSamplingStrategy_args extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'serviceName',
'isRequired' => false,
'type' => TType::STRING,
),
);
/**
* @var string
*/
public $serviceName = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'SamplingManager_getSamplingStrategy_args';
}
public function read($input)
{
return $this->_read('SamplingManager_getSamplingStrategy_args', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('SamplingManager_getSamplingStrategy_args', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,56 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class SamplingManager_getSamplingStrategy_result extends TBase {
static $isValidate = false;
static $_TSPEC = array(
0 => array(
'var' => 'success',
'isRequired' => false,
'type' => TType::STRUCT,
'class' => '\Jaeger\Thrift\Agent\SamplingStrategyResponse',
),
);
/**
* @var \Jaeger\Thrift\Agent\SamplingStrategyResponse
*/
public $success = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'SamplingManager_getSamplingStrategy_result';
}
public function read($input)
{
return $this->_read('SamplingManager_getSamplingStrategy_result', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('SamplingManager_getSamplingStrategy_result', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,86 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class SamplingStrategyResponse extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'strategyType',
'isRequired' => true,
'type' => TType::I32,
),
2 => array(
'var' => 'probabilisticSampling',
'isRequired' => false,
'type' => TType::STRUCT,
'class' => '\Jaeger\Thrift\Agent\ProbabilisticSamplingStrategy',
),
3 => array(
'var' => 'rateLimitingSampling',
'isRequired' => false,
'type' => TType::STRUCT,
'class' => '\Jaeger\Thrift\Agent\RateLimitingSamplingStrategy',
),
4 => array(
'var' => 'operationSampling',
'isRequired' => false,
'type' => TType::STRUCT,
'class' => '\Jaeger\Thrift\Agent\PerOperationSamplingStrategies',
),
);
/**
* @var int
*/
public $strategyType = null;
/**
* @var \Jaeger\Thrift\Agent\ProbabilisticSamplingStrategy
*/
public $probabilisticSampling = null;
/**
* @var \Jaeger\Thrift\Agent\RateLimitingSamplingStrategy
*/
public $rateLimitingSampling = null;
/**
* @var \Jaeger\Thrift\Agent\PerOperationSamplingStrategies
*/
public $operationSampling = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'SamplingStrategyResponse';
}
public function read($input)
{
return $this->_read('SamplingStrategyResponse', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('SamplingStrategyResponse', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,28 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
final class SamplingStrategyType {
const PROBABILISTIC = 0;
const RATE_LIMITING = 1;
static public $__names = array(
0 => 'PROBABILISTIC',
1 => 'RATE_LIMITING',
);
}

View File

@ -0,0 +1,65 @@
<?php
namespace Jaeger\Thrift\Agent;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
class ValidateTraceResponse extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'ok',
'isRequired' => true,
'type' => TType::BOOL,
),
2 => array(
'var' => 'traceCount',
'isRequired' => true,
'type' => TType::I64,
),
);
/**
* @var bool
*/
public $ok = null;
/**
* @var int
*/
public $traceCount = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'ValidateTraceResponse';
}
public function read($input)
{
return $this->_read('ValidateTraceResponse', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('ValidateTraceResponse', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,87 @@
<?php
namespace Jaeger\Thrift\Agent\Zipkin;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
/**
* An annotation is similar to a log statement. It includes a host field which
* allows these events to be attributed properly, and also aggregatable.
*/
class Annotation extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'timestamp',
'isRequired' => false,
'type' => TType::I64,
),
2 => array(
'var' => 'value',
'isRequired' => false,
'type' => TType::STRING,
),
3 => array(
'var' => 'host',
'isRequired' => false,
'type' => TType::STRUCT,
'class' => '\Jaeger\Thrift\Agent\Zipkin\Endpoint',
),
);
/**
* Microseconds from epoch.
*
* This value should use the most precise value possible. For example,
* gettimeofday or syncing nanoTime against a tick of currentTimeMillis.
*
* @var int
*/
public $timestamp = null;
/**
* @var string
*/
public $value = null;
/**
* Always the host that recorded the event. By specifying the host you allow
* rollup of all events (such as client requests to a service) by IP address.
*
* @var \Jaeger\Thrift\Agent\Zipkin\Endpoint
*/
public $host = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'Annotation';
}
public function read($input)
{
return $this->_read('Annotation', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('Annotation', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,38 @@
<?php
namespace Jaeger\Thrift\Agent\Zipkin;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
final class AnnotationType {
const BOOL = 0;
const BYTES = 1;
const I16 = 2;
const I32 = 3;
const I64 = 4;
const DOUBLE = 5;
const STRING = 6;
static public $__names = array(
0 => 'BOOL',
1 => 'BYTES',
2 => 'I16',
3 => 'I32',
4 => 'I64',
5 => 'DOUBLE',
6 => 'STRING',
);
}

View File

@ -0,0 +1,106 @@
<?php
namespace Jaeger\Thrift\Agent\Zipkin;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
/**
* Binary annotations are tags applied to a Span to give it context. For
* example, a binary annotation of "http.uri" could the path to a resource in a
* RPC call.
*
* Binary annotations of type STRING are always queryable, though more a
* historical implementation detail than a structural concern.
*
* Binary annotations can repeat, and vary on the host. Similar to Annotation,
* the host indicates who logged the event. This allows you to tell the
* difference between the client and server side of the same key. For example,
* the key "http.uri" might be different on the client and server side due to
* rewriting, like "/api/v1/myresource" vs "/myresource. Via the host field,
* you can see the different points of view, which often help in debugging.
*/
class BinaryAnnotation extends TBase {
static $isValidate = false;
static $_TSPEC = array(
1 => array(
'var' => 'key',
'isRequired' => false,
'type' => TType::STRING,
),
2 => array(
'var' => 'value',
'isRequired' => false,
'type' => TType::STRING,
),
3 => array(
'var' => 'annotation_type',
'isRequired' => false,
'type' => TType::I32,
),
4 => array(
'var' => 'host',
'isRequired' => false,
'type' => TType::STRUCT,
'class' => '\Jaeger\Thrift\Agent\Zipkin\Endpoint',
),
);
/**
* @var string
*/
public $key = null;
/**
* @var string
*/
public $value = null;
/**
* @var int
*/
public $annotation_type = null;
/**
* The host that recorded tag, which allows you to differentiate between
* multiple tags with the same key. There are two exceptions to this.
*
* When the key is CLIENT_ADDR or SERVER_ADDR, host indicates the source or
* destination of an RPC. This exception allows zipkin to display network
* context of uninstrumented services, or clients such as web browsers.
*
* @var \Jaeger\Thrift\Agent\Zipkin\Endpoint
*/
public $host = null;
public function __construct($vals=null) {
if (is_array($vals)) {
parent::__construct(self::$_TSPEC, $vals);
}
}
public function getName() {
return 'BinaryAnnotation';
}
public function read($input)
{
return $this->_read('BinaryAnnotation', self::$_TSPEC, $input);
}
public function write($output) {
return $this->_write('BinaryAnnotation', self::$_TSPEC, $output);
}
}

View File

@ -0,0 +1,246 @@
<?php
namespace Jaeger\Thrift\Agent\Zipkin;
/**
* Autogenerated by Thrift Compiler (0.11.0)
*
* DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
* @generated
*/
use Thrift\Base\TBase;
use Thrift\Type\TType;
use Thrift\Type\TMessageType;
use Thrift\Exception\TException;
use Thrift\Exception\TProtocolException;
use Thrift\Protocol\TProtocol;
use Thrift\Protocol\TBinaryProtocolAccelerated;
use Thrift\Exception\TApplicationException;
final class Constant extends \Thrift\Type\TConstant {
static protected $CLIENT_SEND;
static protected $CLIENT_RECV;
static protected $SERVER_SEND;
static protected $SERVER_RECV;
static protected $MESSAGE_SEND;
static protected $MESSAGE_RECV;
static protected $WIRE_SEND;
static protected $WIRE_RECV;
static protected $CLIENT_SEND_FRAGMENT;
static protected $CLIENT_RECV_FRAGMENT;
static protected $SERVER_SEND_FRAGMENT;
static protected $SERVER_RECV_FRAGMENT;
static protected $LOCAL_COMPONENT;
static protected $CLIENT_ADDR;
static protected $SERVER_ADDR;
static protected $MESSAGE_ADDR;
static protected function init_CLIENT_SEND() {
return /**
* The client sent ("cs") a request to a server. There is only one send per
* span. For example, if there's a transport error, each attempt can be logged
* as a WIRE_SEND annotation.
*
* If chunking is involved, each chunk could be logged as a separate
* CLIENT_SEND_FRAGMENT in the same span.
*
* Annotation.host is not the server. It is the host which logged the send
* event, almost always the client. When logging CLIENT_SEND, instrumentation
* should also log the SERVER_ADDR.
*/
"cs";
}
static protected function init_CLIENT_RECV() {
return /**
* The client received ("cr") a response from a server. There is only one
* receive per span. For example, if duplicate responses were received, each
* can be logged as a WIRE_RECV annotation.
*
* If chunking is involved, each chunk could be logged as a separate
* CLIENT_RECV_FRAGMENT in the same span.
*
* Annotation.host is not the server. It is the host which logged the receive
* event, almost always the client. The actual endpoint of the server is
* recorded separately as SERVER_ADDR when CLIENT_SEND is logged.
*/
"cr";
}
static protected function init_SERVER_SEND() {
return /**
* The server sent ("ss") a response to a client. There is only one response
* per span. If there's a transport error, each attempt can be logged as a
* WIRE_SEND annotation.
*
* Typically, a trace ends with a server send, so the last timestamp of a trace
* is often the timestamp of the root span's server send.
*
* If chunking is involved, each chunk could be logged as a separate
* SERVER_SEND_FRAGMENT in the same span.
*
* Annotation.host is not the client. It is the host which logged the send
* event, almost always the server. The actual endpoint of the client is
* recorded separately as CLIENT_ADDR when SERVER_RECV is logged.
*/
"ss";
}
static protected function init_SERVER_RECV() {
return /**
* The server received ("sr") a request from a client. There is only one
* request per span. For example, if duplicate responses were received, each
* can be logged as a WIRE_RECV annotation.
*
* Typically, a trace starts with a server receive, so the first timestamp of a
* trace is often the timestamp of the root span's server receive.
*
* If chunking is involved, each chunk could be logged as a separate
* SERVER_RECV_FRAGMENT in the same span.
*
* Annotation.host is not the client. It is the host which logged the receive
* event, almost always the server. When logging SERVER_RECV, instrumentation
* should also log the CLIENT_ADDR.
*/
"sr";
}
static protected function init_MESSAGE_SEND() {
return /**
* Message send ("ms") is a request to send a message to a destination, usually
* a broker. This may be the only annotation in a messaging span. If WIRE_SEND
* exists in the same span, it follows this moment and clarifies delays sending
* the message, such as batching.
*
* Unlike RPC annotations like CLIENT_SEND, messaging spans never share a span
* ID. For example, "ms" should always be the parent of "mr".
*
* Annotation.host is not the destination, it is the host which logged the send
* event: the producer. When annotating MESSAGE_SEND, instrumentation should
* also tag the MESSAGE_ADDR.
*/
"ms";
}
static protected function init_MESSAGE_RECV() {
return /**
* A consumer received ("mr") a message from a broker. This may be the only
* annotation in a messaging span. If WIRE_RECV exists in the same span, it
* precedes this moment and clarifies any local queuing delay.
*
* Unlike RPC annotations like SERVER_RECV, messaging spans never share a span
* ID. For example, "mr" should always be a child of "ms" unless it is a root
* span.
*
* Annotation.host is not the broker, it is the host which logged the receive
* event: the consumer. When annotating MESSAGE_RECV, instrumentation should
* also tag the MESSAGE_ADDR.
*/
"mr";
}
static protected function init_WIRE_SEND() {
return /**
* Optionally logs an attempt to send a message on the wire. Multiple wire send
* events could indicate network retries. A lag between client or server send
* and wire send might indicate queuing or processing delay.
*/
"ws";
}
static protected function init_WIRE_RECV() {
return /**
* Optionally logs an attempt to receive a message from the wire. Multiple wire
* receive events could indicate network retries. A lag between wire receive
* and client or server receive might indicate queuing or processing delay.
*/
"wr";
}
static protected function init_CLIENT_SEND_FRAGMENT() {
return /**
* Optionally logs progress of a (CLIENT_SEND, WIRE_SEND). For example, this
* could be one chunk in a chunked request.
*/
"csf";
}
static protected function init_CLIENT_RECV_FRAGMENT() {
return /**
* Optionally logs progress of a (CLIENT_RECV, WIRE_RECV). For example, this
* could be one chunk in a chunked response.
*/
"crf";
}
static protected function init_SERVER_SEND_FRAGMENT() {
return /**
* Optionally logs progress of a (SERVER_SEND, WIRE_SEND). For example, this
* could be one chunk in a chunked response.
*/
"ssf";
}
static protected function init_SERVER_RECV_FRAGMENT() {
return /**
* Optionally logs progress of a (SERVER_RECV, WIRE_RECV). For example, this
* could be one chunk in a chunked request.
*/
"srf";
}
static protected function init_LOCAL_COMPONENT() {
return /**
* The value of "lc" is the component or namespace of a local span.
*
* BinaryAnnotation.host adds service context needed to support queries.
*
* Local Component("lc") supports three key features: flagging, query by
* service and filtering Span.name by namespace.
*
* While structurally the same, local spans are fundamentally different than
* RPC spans in how they should be interpreted. For example, zipkin v1 tools
* center on RPC latency and service graphs. Root local-spans are neither
* indicative of critical path RPC latency, nor have impact on the shape of a
* service graph. By flagging with "lc", tools can special-case local spans.
*
* Zipkin v1 Spans are unqueryable unless they can be indexed by service name.
* The only path to a service name is by (Binary)?Annotation.host.serviceName.
* By logging "lc", a local span can be queried even if no other annotations
* are logged.
*
* The value of "lc" is the namespace of Span.name. For example, it might be
* "finatra2", for a span named "bootstrap". "lc" allows you to resolves
* conflicts for the same Span.name, for example "finatra/bootstrap" vs
* "finch/bootstrap". Using local component, you'd search for spans named
* "bootstrap" where "lc=finch"
*/
"lc";
}
static protected function init_CLIENT_ADDR() {
return /**
* Indicates a client address ("ca") in a span. Most likely, there's only one.
* Multiple addresses are possible when a client changes its ip or port within
* a span.
*/
"ca";
}
static protected function init_SERVER_ADDR() {
return /**
* Indicates a server address ("sa") in a span. Most likely, there's only one.
* Multiple addresses are possible when a client is redirected, or fails to a
* different server ip or port.
*/
"sa";
}
static protected function init_MESSAGE_ADDR() {
return /**
* Indicates the remote address of a messaging span, usually the broker.
*/
"ma";
}
}

Some files were not shown because too many files have changed in this diff Show More