carno-php /
tracing
| 1 | <?php |
||
| 2 | /** |
||
| 3 | * Spans creator |
||
| 4 | * User: moyo |
||
| 5 | * Date: 19/12/2017 |
||
| 6 | * Time: 4:52 PM |
||
| 7 | */ |
||
| 8 | |||
| 9 | namespace Carno\Tracing\Utils; |
||
| 10 | |||
| 11 | use Carno\Container\DI; |
||
| 12 | use Carno\Coroutine\Context; |
||
| 13 | use Carno\Promise\Promised; |
||
| 14 | use Carno\Tracing\Chips\Timestamp; |
||
| 15 | use Carno\Tracing\Contracts\Platform; |
||
| 16 | use Carno\Tracing\Contracts\Vars\CTX; |
||
| 17 | use Carno\Tracing\Contracts\Vars\FMT; |
||
| 18 | use Carno\Tracing\Contracts\Vars\LOG; |
||
| 19 | use Carno\Tracing\Contracts\Vars\TAG; |
||
| 20 | use Carno\Tracing\Standard\Span; |
||
| 21 | use Carno\Tracing\Standard\Tracer; |
||
| 22 | use OpenTracing\Exceptions\SpanContextNotFound; |
||
| 23 | use OpenTracing\SpanContext; |
||
| 24 | use OpenTracing\SpanOptions; |
||
| 25 | use Throwable; |
||
| 26 | |||
| 27 | trait SpansCreator |
||
| 28 | { |
||
| 29 | use Timestamp; |
||
| 30 | |||
| 31 | /** |
||
| 32 | * @return bool |
||
| 33 | */ |
||
| 34 | protected function traced() : bool |
||
| 35 | { |
||
| 36 | /** |
||
| 37 | * @var Platform $platform |
||
| 38 | */ |
||
| 39 | |||
| 40 | if (DI::has(Platform::class) && $platform = DI::get(Platform::class)) { |
||
| 41 | return $platform->joined(); |
||
| 42 | } |
||
| 43 | |||
| 44 | return false; |
||
| 45 | } |
||
| 46 | |||
| 47 | /** |
||
| 48 | * @param Context $context |
||
| 49 | * @param string $name |
||
| 50 | * @param array $tags |
||
| 51 | * @param array $log |
||
| 52 | * @param string $exaFormat |
||
| 53 | * @param mixed $exaCarrier |
||
| 54 | * @param SpanContext $exaContext |
||
| 55 | * @param Platform $platform |
||
| 56 | * @param int $timestamp |
||
| 57 | */ |
||
| 58 | protected function newSpan( |
||
| 59 | Context $context, |
||
| 60 | string $name, |
||
| 61 | array $tags = [], |
||
| 62 | array $log = [], |
||
| 63 | string $exaFormat = null, |
||
| 64 | $exaCarrier = null, |
||
| 65 | SpanContext $exaContext = null, |
||
| 66 | Platform $platform = null, |
||
| 67 | int $timestamp = null |
||
| 68 | ) : void { |
||
| 69 | if (is_null($platform)) { |
||
| 70 | if (DI::has(Platform::class)) { |
||
| 71 | $platform = DI::get(Platform::class); |
||
| 72 | } else { |
||
| 73 | // missing platform support |
||
| 74 | return; |
||
| 75 | } |
||
| 76 | } |
||
| 77 | |||
| 78 | // check platform is ready |
||
| 79 | if (!$platform->joined()) { |
||
| 80 | return; |
||
| 81 | } |
||
| 82 | |||
| 83 | // get/set tracer |
||
| 84 | if ($context->has(CTX::G_TRACER)) { |
||
| 85 | $tracer = $context->get(CTX::G_TRACER); |
||
| 86 | } else { |
||
| 87 | $context->set(CTX::G_TRACER, $tracer = new Tracer($platform)); |
||
| 88 | } |
||
| 89 | |||
| 90 | // options |
||
| 91 | $options = [ |
||
| 92 | 'start_time' => $timestamp ?? $this->microseconds(), |
||
| 93 | 'tags' => array_merge($platform->env()->tags(), $tags), |
||
| 94 | ]; |
||
| 95 | |||
| 96 | // inherit from root |
||
| 97 | if (is_null($exaFormat) && $context->has(CTX::G_ROOT)) { |
||
| 98 | $exaFormat = FMT::PREV_CTX; |
||
| 99 | $exaCarrier = $context->get(CTX::G_ROOT); |
||
| 100 | } |
||
| 101 | |||
| 102 | // extracting |
||
| 103 | if ($exaFormat) { |
||
| 104 | try { |
||
| 105 | // check reference |
||
| 106 | if ($exaContext) { |
||
| 107 | $tracer->inject($exaContext, $exaFormat, $exaCarrier); |
||
| 108 | $options['child_of'] = $exaContext; |
||
| 109 | } else { |
||
| 110 | $options['child_of'] = $tracer->extract($exaFormat, $exaCarrier); |
||
| 111 | } |
||
| 112 | } catch (SpanContextNotFound $e) { |
||
| 113 | // root span |
||
| 114 | } |
||
| 115 | } |
||
| 116 | |||
| 117 | // is root |
||
| 118 | $root = ! $context->has(CTX::G_SPAN); |
||
| 119 | |||
| 120 | // new span |
||
| 121 | $context->set(CTX::G_SPAN, $span = $tracer->startSpan($name, SpanOptions::create($options))); |
||
| 122 | |||
| 123 | // root ctx |
||
| 124 | $root && $context->set(CTX::G_ROOT, $span->getContext()); |
||
| 125 | |||
| 126 | // some log |
||
| 127 | $span->log($log); |
||
| 128 | } |
||
| 129 | |||
| 130 | /** |
||
| 131 | * @param Promised $finished |
||
| 132 | * @param Context $traced |
||
| 133 | * @return Promised |
||
| 134 | */ |
||
| 135 | protected function finishSpan(Promised $finished, Context $traced = null) : Promised |
||
| 136 | { |
||
| 137 | $traced && $finished->then(function () use ($traced) { |
||
| 138 | $this->closeSpan($traced); |
||
| 139 | }, function (Throwable $e) use ($traced) { |
||
| 140 | $this->errorSpan($traced, $e); |
||
| 141 | }); |
||
| 142 | return $finished; |
||
| 143 | } |
||
| 144 | |||
| 145 | /** |
||
| 146 | * @param Context $context |
||
| 147 | * @param array $tags |
||
| 148 | * @param int $time |
||
| 149 | */ |
||
| 150 | protected function closeSpan(Context $context, array $tags = [], int $time = null) : void |
||
| 151 | { |
||
| 152 | if ($context->has(CTX::G_SPAN)) { |
||
| 153 | /** |
||
| 154 | * @var Span $span |
||
| 155 | */ |
||
| 156 | $span = $context->get(CTX::G_SPAN); |
||
| 157 | $span->setTags($tags); |
||
| 158 | $span->finish($time); |
||
| 159 | $this->endingSpan($context); |
||
| 160 | } |
||
| 161 | } |
||
| 162 | |||
| 163 | /** |
||
| 164 | * @param Context $context |
||
| 165 | * @param Throwable $err |
||
| 166 | * @param array $tags |
||
| 167 | * @param int $time |
||
| 168 | */ |
||
| 169 | protected function errorSpan(Context $context, Throwable $err = null, array $tags = [], int $time = null) : void |
||
| 170 | { |
||
| 171 | if ($context->has(CTX::G_SPAN)) { |
||
| 172 | /** |
||
| 173 | * @var Span $span |
||
| 174 | */ |
||
| 175 | $span = $context->get(CTX::G_SPAN); |
||
| 176 | $span->setTags(array_merge([TAG::ERROR => true], $tags)); |
||
| 177 | $span->log([ |
||
| 178 | LOG::EVENT => TAG::ERROR, |
||
| 179 | LOG::ERROR_KIND => get_class($err), |
||
| 180 | LOG::ERROR_OBJECT => $err, |
||
| 181 | LOG::MESSAGE => $err->getMessage(), |
||
|
0 ignored issues
–
show
|
|||
| 182 | LOG::STACK => $err->getTraceAsString(), |
||
| 183 | ]); |
||
| 184 | $span->finish($time); |
||
| 185 | $this->endingSpan($context); |
||
| 186 | } |
||
| 187 | } |
||
| 188 | |||
| 189 | /** |
||
| 190 | * @param Context $context |
||
| 191 | */ |
||
| 192 | private function endingSpan(Context $context) : void |
||
| 193 | { |
||
| 194 | if ($context->has(CTX::G_TRACER)) { |
||
| 195 | /** |
||
| 196 | * @var Tracer $tracer |
||
| 197 | */ |
||
| 198 | $tracer = $context->get(CTX::G_TRACER); |
||
| 199 | $tracer->flush(); |
||
| 200 | } |
||
| 201 | } |
||
| 202 | } |
||
| 203 |
This check looks for calls to methods that do not seem to exist on a given type. It looks for the method on the type itself as well as in inherited classes or implemented interfaces.
This is most likely a typographical error or the method has been renamed.