From 8f3646a9c93a06f76f6abb31020fdb74b4b1fc59 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Sun, 9 Apr 2023 20:50:33 +0300 Subject: exp: jaeger tracing --- vendor/jonahgeorge/jaeger-client-php/.editorconfig | 16 + .../jaeger-client-php/.github/workflows/main.yaml | 44 ++ vendor/jonahgeorge/jaeger-client-php/.gitignore | 17 + .../jonahgeorge/jaeger-client-php/CONTRIBUTING.md | 3 + vendor/jonahgeorge/jaeger-client-php/LICENSE | 21 + vendor/jonahgeorge/jaeger-client-php/README.md | 219 ++++++++++ .../jonahgeorge/jaeger-client-php/build/.gitignore | 2 + vendor/jonahgeorge/jaeger-client-php/composer.json | 62 +++ .../jaeger-client-php/examples/config.php | 26 ++ .../jaeger-client-php/examples/jaeger.php | 51 +++ .../jonahgeorge/jaeger-client-php/phpcs.xml.dist | 37 ++ .../jonahgeorge/jaeger-client-php/phpunit.xml.dist | 47 ++ .../jaeger-client-php/scripts/thrift-gen.sh | 27 ++ .../src/Jaeger/AgentClient/HttpAgentClient.php | 27 ++ .../src/Jaeger/Codec/BinaryCodec.php | 39 ++ .../src/Jaeger/Codec/CodecInterface.php | 36 ++ .../src/Jaeger/Codec/CodecUtility.php | 41 ++ .../src/Jaeger/Codec/TextCodec.php | 184 ++++++++ .../src/Jaeger/Codec/ZipkinCodec.php | 85 ++++ .../jaeger-client-php/src/Jaeger/Config.php | 390 +++++++++++++++++ .../jaeger-client-php/src/Jaeger/Constants.php | 100 +++++ .../src/Jaeger/Mapper/SpanToJaegerMapper.php | 171 ++++++++ .../src/Jaeger/Reporter/CompositeReporter.php | 51 +++ .../src/Jaeger/Reporter/InMemoryReporter.php | 47 ++ .../src/Jaeger/Reporter/JaegerReporter.php | 35 ++ .../src/Jaeger/Reporter/LoggingReporter.php | 51 +++ .../src/Jaeger/Reporter/NullReporter.php | 32 ++ .../src/Jaeger/Reporter/RemoteReporter.php | 46 ++ .../src/Jaeger/Reporter/ReporterInterface.php | 28 ++ .../ReporterFactory/AbstractReporterFactory.php | 23 + .../ReporterFactory/JaegerHttpReporterFactory.php | 35 ++ .../ReporterFactory/JaegerReporterFactory.php | 44 ++ .../ReporterFactory/ReporterFactoryInterface.php | 10 + .../ReporterFactory/ZipkinReporterFactory.php | 46 ++ .../src/Jaeger/Sampler/ConstSampler.php | 68 +++ .../src/Jaeger/Sampler/ProbabilisticSampler.php | 88 ++++ .../src/Jaeger/Sampler/RateLimitingSampler.php | 62 +++ .../src/Jaeger/Sampler/SamplerInterface.php | 29 ++ .../jaeger-client-php/src/Jaeger/Scope.php | 71 +++ .../jaeger-client-php/src/Jaeger/ScopeManager.php | 45 ++ .../src/Jaeger/Sender/JaegerSender.php | 236 ++++++++++ .../src/Jaeger/Sender/SenderInterface.php | 12 + .../src/Jaeger/Sender/UdpSender.php | 305 +++++++++++++ .../jaeger-client-php/src/Jaeger/Span.php | 476 +++++++++++++++++++++ .../jaeger-client-php/src/Jaeger/SpanContext.php | 120 ++++++ .../src/Jaeger/Thrift/Agent/AgentClient.php | 76 ++++ .../src/Jaeger/Thrift/Agent/AgentIf.php | 30 ++ .../Jaeger/Thrift/Agent/Agent_emitBatch_args.php | 56 +++ .../Thrift/Agent/Agent_emitZipkinBatch_args.php | 60 +++ .../Thrift/Agent/AggregationValidatorClient.php | 83 ++++ .../Jaeger/Thrift/Agent/AggregationValidatorIf.php | 27 ++ .../AggregationValidator_validateTrace_args.php | 55 +++ .../AggregationValidator_validateTrace_result.php | 56 +++ .../src/Jaeger/Thrift/Agent/BaggageRestriction.php | 65 +++ .../Agent/BaggageRestrictionManagerClient.php | 83 ++++ .../Thrift/Agent/BaggageRestrictionManagerIf.php | 31 ++ ...trictionManager_getBaggageRestrictions_args.php | 55 +++ ...ictionManager_getBaggageRestrictions_result.php | 60 +++ .../src/Jaeger/Thrift/Agent/Dependencies.php | 61 +++ .../src/Jaeger/Thrift/Agent/DependencyClient.php | 105 +++++ .../src/Jaeger/Thrift/Agent/DependencyIf.php | 31 ++ .../src/Jaeger/Thrift/Agent/DependencyLink.php | 74 ++++ .../Dependency_getDependenciesForTrace_args.php | 55 +++ .../Dependency_getDependenciesForTrace_result.php | 56 +++ .../Agent/Dependency_saveDependencies_args.php | 56 +++ .../Thrift/Agent/OperationSamplingStrategy.php | 66 +++ .../Agent/PerOperationSamplingStrategies.php | 88 ++++ .../Thrift/Agent/ProbabilisticSamplingStrategy.php | 56 +++ .../Thrift/Agent/RateLimitingSamplingStrategy.php | 56 +++ .../Jaeger/Thrift/Agent/SamplingManagerClient.php | 83 ++++ .../src/Jaeger/Thrift/Agent/SamplingManagerIf.php | 27 ++ .../SamplingManager_getSamplingStrategy_args.php | 55 +++ .../SamplingManager_getSamplingStrategy_result.php | 56 +++ .../Thrift/Agent/SamplingStrategyResponse.php | 86 ++++ .../Jaeger/Thrift/Agent/SamplingStrategyType.php | 28 ++ .../Jaeger/Thrift/Agent/ValidateTraceResponse.php | 65 +++ .../src/Jaeger/Thrift/Agent/Zipkin/Annotation.php | 87 ++++ .../Jaeger/Thrift/Agent/Zipkin/AnnotationType.php | 38 ++ .../Thrift/Agent/Zipkin/BinaryAnnotation.php | 106 +++++ .../src/Jaeger/Thrift/Agent/Zipkin/Constant.php | 246 +++++++++++ .../src/Jaeger/Thrift/Agent/Zipkin/Endpoint.php | 108 +++++ .../src/Jaeger/Thrift/Agent/Zipkin/Response.php | 56 +++ .../src/Jaeger/Thrift/Agent/Zipkin/Span.php | 190 ++++++++ .../Thrift/Agent/Zipkin/ZipkinCollectorClient.php | 83 ++++ .../Thrift/Agent/Zipkin/ZipkinCollectorIf.php | 27 ++ .../ZipkinCollector_submitZipkinBatch_args.php | 60 +++ .../ZipkinCollector_submitZipkinBatch_result.php | 60 +++ .../jaeger-client-php/src/Jaeger/Thrift/Batch.php | 71 +++ .../src/Jaeger/Thrift/BatchSubmitResponse.php | 56 +++ .../src/Jaeger/Thrift/CollectorClient.php | 83 ++++ .../src/Jaeger/Thrift/CollectorIf.php | 27 ++ .../Jaeger/Thrift/Collector_submitBatches_args.php | 60 +++ .../Thrift/Collector_submitBatches_result.php | 60 +++ .../src/Jaeger/Thrift/Crossdock/Downstream.php | 102 +++++ .../Jaeger/Thrift/Crossdock/JoinTraceRequest.php | 66 +++ .../src/Jaeger/Thrift/Crossdock/ObservedSpan.php | 74 ++++ .../Jaeger/Thrift/Crossdock/StartTraceRequest.php | 84 ++++ .../src/Jaeger/Thrift/Crossdock/TraceResponse.php | 82 ++++ .../Thrift/Crossdock/TracedServiceClient.php | 134 ++++++ .../Jaeger/Thrift/Crossdock/TracedServiceIf.php | 40 ++ .../Crossdock/TracedService_joinTrace_args.php | 56 +++ .../Crossdock/TracedService_joinTrace_result.php | 56 +++ .../Crossdock/TracedService_startTrace_args.php | 56 +++ .../Crossdock/TracedService_startTrace_result.php | 56 +++ .../src/Jaeger/Thrift/Crossdock/Transport.php | 30 ++ .../jaeger-client-php/src/Jaeger/Thrift/Log.php | 70 +++ .../src/Jaeger/Thrift/Process.php | 70 +++ .../jaeger-client-php/src/Jaeger/Thrift/Span.php | 161 +++++++ .../src/Jaeger/Thrift/SpanRef.php | 83 ++++ .../src/Jaeger/Thrift/SpanRefType.php | 28 ++ .../jaeger-client-php/src/Jaeger/Thrift/Tag.php | 110 +++++ .../src/Jaeger/Thrift/TagType.php | 34 ++ .../src/Jaeger/ThriftUdpTransport.php | 151 +++++++ .../jaeger-client-php/src/Jaeger/Tracer.php | 420 ++++++++++++++++++ .../src/Jaeger/Util/RateLimiter.php | 128 ++++++ .../tests/Jaeger/Codec/TextCodecTest.php | 170 ++++++++ .../tests/Jaeger/Codec/ZipkinCodecTest.php | 104 +++++ .../jaeger-client-php/tests/Jaeger/ConfigTest.php | 257 +++++++++++ .../tests/Jaeger/Logger/StackLogger.php | 30 ++ .../tests/Jaeger/Mapper/SpanToJaegerMapperTest.php | 169 ++++++++ .../Jaeger/Reporter/CompositeReporterTest.php | 52 +++ .../tests/Jaeger/Reporter/InMemoryReporterTest.php | 24 ++ .../tests/Jaeger/Reporter/LoggingReporterTest.php | 31 ++ .../tests/Jaeger/Reporter/NullReporterTest.php | 29 ++ .../tests/Jaeger/Reporter/RemoteReporterTest.php | 46 ++ .../tests/Jaeger/Sampler/ConstSamplerTest.php | 43 ++ .../Jaeger/Sampler/ProbablisticSamplerTest.php | 68 +++ .../tests/Jaeger/Sampler/RateLimitSamplerTest.php | 48 +++ .../tests/Jaeger/ScopeManagerTest.php | 49 +++ .../jaeger-client-php/tests/Jaeger/ScopeTest.php | 58 +++ .../tests/Jaeger/Sender/JaegerThriftSenderTest.php | 126 ++++++ .../tests/Jaeger/Sender/UdpSenderTest.php | 116 +++++ .../tests/Jaeger/SpanContextTest.php | 37 ++ .../jaeger-client-php/tests/Jaeger/SpanTest.php | 293 +++++++++++++ .../tests/Jaeger/ThriftUdpTransportTest.php | 166 +++++++ .../jaeger-client-php/tests/Jaeger/TracerTest.php | 262 ++++++++++++ .../jonahgeorge/jaeger-client-php/tests/README.md | 48 +++ .../jaeger-client-php/tests/php-test.sh | 64 +++ 138 files changed, 11245 insertions(+) create mode 100644 vendor/jonahgeorge/jaeger-client-php/.editorconfig create mode 100644 vendor/jonahgeorge/jaeger-client-php/.github/workflows/main.yaml create mode 100644 vendor/jonahgeorge/jaeger-client-php/.gitignore create mode 100644 vendor/jonahgeorge/jaeger-client-php/CONTRIBUTING.md create mode 100644 vendor/jonahgeorge/jaeger-client-php/LICENSE create mode 100644 vendor/jonahgeorge/jaeger-client-php/README.md create mode 100644 vendor/jonahgeorge/jaeger-client-php/build/.gitignore create mode 100644 vendor/jonahgeorge/jaeger-client-php/composer.json create mode 100644 vendor/jonahgeorge/jaeger-client-php/examples/config.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/examples/jaeger.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/phpcs.xml.dist create mode 100644 vendor/jonahgeorge/jaeger-client-php/phpunit.xml.dist create mode 100644 vendor/jonahgeorge/jaeger-client-php/scripts/thrift-gen.sh create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/AgentClient/HttpAgentClient.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Codec/BinaryCodec.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Codec/CodecInterface.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Codec/CodecUtility.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Codec/TextCodec.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Codec/ZipkinCodec.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Config.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Constants.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Mapper/SpanToJaegerMapper.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/CompositeReporter.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/InMemoryReporter.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/JaegerReporter.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/LoggingReporter.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/NullReporter.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/RemoteReporter.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/ReporterInterface.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ReporterFactory/AbstractReporterFactory.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ReporterFactory/JaegerHttpReporterFactory.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ReporterFactory/JaegerReporterFactory.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ReporterFactory/ReporterFactoryInterface.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ReporterFactory/ZipkinReporterFactory.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sampler/ConstSampler.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sampler/ProbabilisticSampler.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sampler/RateLimitingSampler.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sampler/SamplerInterface.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Scope.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ScopeManager.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sender/JaegerSender.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sender/SenderInterface.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sender/UdpSender.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Span.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/SpanContext.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AgentClient.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AgentIf.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Agent_emitBatch_args.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Agent_emitZipkinBatch_args.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AggregationValidatorClient.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AggregationValidatorIf.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AggregationValidator_validateTrace_args.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AggregationValidator_validateTrace_result.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/BaggageRestriction.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/BaggageRestrictionManagerClient.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/BaggageRestrictionManagerIf.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/BaggageRestrictionManager_getBaggageRestrictions_args.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/BaggageRestrictionManager_getBaggageRestrictions_result.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Dependencies.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/DependencyClient.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/DependencyIf.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/DependencyLink.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Dependency_getDependenciesForTrace_args.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Dependency_getDependenciesForTrace_result.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Dependency_saveDependencies_args.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/OperationSamplingStrategy.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/PerOperationSamplingStrategies.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/ProbabilisticSamplingStrategy.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/RateLimitingSamplingStrategy.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingManagerClient.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingManagerIf.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingManager_getSamplingStrategy_args.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingManager_getSamplingStrategy_result.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingStrategyResponse.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingStrategyType.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/ValidateTraceResponse.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/Annotation.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/AnnotationType.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/BinaryAnnotation.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/Constant.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/Endpoint.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/Response.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/Span.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/ZipkinCollectorClient.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/ZipkinCollectorIf.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/ZipkinCollector_submitZipkinBatch_args.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/ZipkinCollector_submitZipkinBatch_result.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Batch.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/BatchSubmitResponse.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/CollectorClient.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/CollectorIf.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Collector_submitBatches_args.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Collector_submitBatches_result.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/Downstream.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/JoinTraceRequest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/ObservedSpan.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/StartTraceRequest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TraceResponse.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedServiceClient.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedServiceIf.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedService_joinTrace_args.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedService_joinTrace_result.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedService_startTrace_args.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedService_startTrace_result.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/Transport.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Log.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Process.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Span.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/SpanRef.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/SpanRefType.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Tag.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/TagType.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ThriftUdpTransport.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Tracer.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Util/RateLimiter.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Codec/TextCodecTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Codec/ZipkinCodecTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/ConfigTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Logger/StackLogger.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Mapper/SpanToJaegerMapperTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/CompositeReporterTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/InMemoryReporterTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/LoggingReporterTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/NullReporterTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/RemoteReporterTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sampler/ConstSamplerTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sampler/ProbablisticSamplerTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sampler/RateLimitSamplerTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/ScopeManagerTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/ScopeTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sender/JaegerThriftSenderTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sender/UdpSenderTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/SpanContextTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/SpanTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/ThriftUdpTransportTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/TracerTest.php create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/README.md create mode 100644 vendor/jonahgeorge/jaeger-client-php/tests/php-test.sh (limited to 'vendor/jonahgeorge/jaeger-client-php') diff --git a/vendor/jonahgeorge/jaeger-client-php/.editorconfig b/vendor/jonahgeorge/jaeger-client-php/.editorconfig new file mode 100644 index 000000000..1492202b4 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/.editorconfig @@ -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 diff --git a/vendor/jonahgeorge/jaeger-client-php/.github/workflows/main.yaml b/vendor/jonahgeorge/jaeger-client-php/.github/workflows/main.yaml new file mode 100644 index 000000000..d0e5dc1f5 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/.github/workflows/main.yaml @@ -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 diff --git a/vendor/jonahgeorge/jaeger-client-php/.gitignore b/vendor/jonahgeorge/jaeger-client-php/.gitignore new file mode 100644 index 000000000..07dc555db --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/.gitignore @@ -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 diff --git a/vendor/jonahgeorge/jaeger-client-php/CONTRIBUTING.md b/vendor/jonahgeorge/jaeger-client-php/CONTRIBUTING.md new file mode 100644 index 000000000..e5ec5ed4f --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/CONTRIBUTING.md @@ -0,0 +1,3 @@ +# How to Contribute to Jaeger + +We'd love your help! diff --git a/vendor/jonahgeorge/jaeger-client-php/LICENSE b/vendor/jonahgeorge/jaeger-client-php/LICENSE new file mode 100644 index 000000000..8e37af0cb --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/LICENSE @@ -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. diff --git a/vendor/jonahgeorge/jaeger-client-php/README.md b/vendor/jonahgeorge/jaeger-client-php/README.md new file mode 100644 index 000000000..6396bb70f --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/README.md @@ -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 + [ + '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 diff --git a/vendor/jonahgeorge/jaeger-client-php/build/.gitignore b/vendor/jonahgeorge/jaeger-client-php/build/.gitignore new file mode 100644 index 000000000..d6b7ef32c --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/build/.gitignore @@ -0,0 +1,2 @@ +* +!.gitignore diff --git a/vendor/jonahgeorge/jaeger-client-php/composer.json b/vendor/jonahgeorge/jaeger-client-php/composer.json new file mode 100644 index 000000000..a9bb99a06 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/composer.json @@ -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" + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/examples/config.php b/vendor/jonahgeorge/jaeger-client-php/examples/config.php new file mode 100644 index 000000000..5c4726165 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/examples/config.php @@ -0,0 +1,26 @@ + [ + '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, +]; diff --git a/vendor/jonahgeorge/jaeger-client-php/examples/jaeger.php b/vendor/jonahgeorge/jaeger-client-php/examples/jaeger.php new file mode 100644 index 000000000..ed9304fe2 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/examples/jaeger.php @@ -0,0 +1,51 @@ +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(); diff --git a/vendor/jonahgeorge/jaeger-client-php/phpcs.xml.dist b/vendor/jonahgeorge/jaeger-client-php/phpcs.xml.dist new file mode 100644 index 000000000..7d5db0974 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/phpcs.xml.dist @@ -0,0 +1,37 @@ + + + + + The coding standard for Jaeger Client + + + + + + + + + + + + src + + + src/Jaeger/Thrift/* + diff --git a/vendor/jonahgeorge/jaeger-client-php/phpunit.xml.dist b/vendor/jonahgeorge/jaeger-client-php/phpunit.xml.dist new file mode 100644 index 000000000..d6795d99b --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/phpunit.xml.dist @@ -0,0 +1,47 @@ + + + + + src/Jaeger + + src/ + src/Jaeger/Constants.php + src/Jaeger/Thrift/Agent/AgentIf.php + src/Jaeger/Thrift/Agent/AggregationValidatorIf.php + src/Jaeger/Thrift/Agent/BaggageRestrictionManagerIf.php + src/Jaeger/Thrift/Agent/DependencyIf.php + src/Jaeger/Thrift/Agent/SamplingManagerIf.php + src/Jaeger/Thrift/CollectorIf.php + src/Jaeger/Thrift/Crossdock/TracedServiceIf.php + + + + + + + tests/Jaeger + + + + + + + + + + + + + + + diff --git a/vendor/jonahgeorge/jaeger-client-php/scripts/thrift-gen.sh b/vendor/jonahgeorge/jaeger-client-php/scripts/thrift-gen.sh new file mode 100644 index 000000000..7420f915f --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/scripts/thrift-gen.sh @@ -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 diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/AgentClient/HttpAgentClient.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/AgentClient/HttpAgentClient.php new file mode 100644 index 000000000..e270b76ac --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/AgentClient/HttpAgentClient.php @@ -0,0 +1,27 @@ +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(); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Codec/BinaryCodec.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Codec/BinaryCodec.php new file mode 100644 index 000000000..36c2ffe2c --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Codec/BinaryCodec.php @@ -0,0 +1,39 @@ +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; + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Codec/ZipkinCodec.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Codec/ZipkinCodec.php new file mode 100644 index 000000000..1ea5d7c0b --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Codec/ZipkinCodec.php @@ -0,0 +1,85 @@ +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; + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Config.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Config.php new file mode 100644 index 000000000..28fb972da --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Config.php @@ -0,0 +1,390 @@ +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']; + } + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Constants.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Constants.php new file mode 100644 index 000000000..1e4be65f5 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Constants.php @@ -0,0 +1,100 @@ +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 + ]); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/CompositeReporter.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/CompositeReporter.php new file mode 100644 index 000000000..78533cc76 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/CompositeReporter.php @@ -0,0 +1,51 @@ +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(); + } + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/InMemoryReporter.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/InMemoryReporter.php new file mode 100644 index 000000000..8aabe2ee8 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/InMemoryReporter.php @@ -0,0 +1,47 @@ +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 + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/JaegerReporter.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/JaegerReporter.php new file mode 100644 index 000000000..999d69e0a --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/JaegerReporter.php @@ -0,0 +1,35 @@ +sender = $sender; + } + + public function reportSpan(Span $span) + { + $this->sender->append($span); + } + + public function close() + { + $this->sender->flush(); + $this->sender->close(); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/LoggingReporter.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/LoggingReporter.php new file mode 100644 index 000000000..264ea94c5 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/LoggingReporter.php @@ -0,0 +1,51 @@ +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 + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/NullReporter.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/NullReporter.php new file mode 100644 index 000000000..84a953bef --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/NullReporter.php @@ -0,0 +1,32 @@ +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(); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/ReporterInterface.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/ReporterInterface.php new file mode 100644 index 000000000..fea8a8713 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Reporter/ReporterInterface.php @@ -0,0 +1,28 @@ +config = $config; + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ReporterFactory/JaegerHttpReporterFactory.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ReporterFactory/JaegerHttpReporterFactory.php new file mode 100644 index 000000000..038e81161 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ReporterFactory/JaegerHttpReporterFactory.php @@ -0,0 +1,35 @@ +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); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ReporterFactory/JaegerReporterFactory.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ReporterFactory/JaegerReporterFactory.php new file mode 100644 index 000000000..9865884b5 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ReporterFactory/JaegerReporterFactory.php @@ -0,0 +1,44 @@ +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); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ReporterFactory/ReporterFactoryInterface.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ReporterFactory/ReporterFactoryInterface.php new file mode 100644 index 000000000..4bfd3204f --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ReporterFactory/ReporterFactoryInterface.php @@ -0,0 +1,10 @@ +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); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sampler/ConstSampler.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sampler/ConstSampler.php new file mode 100644 index 000000000..7c6ba3d62 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sampler/ConstSampler.php @@ -0,0 +1,68 @@ +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 + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sampler/ProbabilisticSampler.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sampler/ProbabilisticSampler.php new file mode 100644 index 000000000..cb265d01e --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sampler/ProbabilisticSampler.php @@ -0,0 +1,88 @@ +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 + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sampler/RateLimitingSampler.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sampler/RateLimitingSampler.php new file mode 100644 index 000000000..d0ea0f180 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sampler/RateLimitingSampler.php @@ -0,0 +1,62 @@ +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 + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sampler/SamplerInterface.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sampler/SamplerInterface.php new file mode 100644 index 000000000..b6d44e783 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sampler/SamplerInterface.php @@ -0,0 +1,29 @@ +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; + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ScopeManager.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ScopeManager.php new file mode 100644 index 000000000..eb5c27676 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ScopeManager.php @@ -0,0 +1,45 @@ +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; + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sender/JaegerSender.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sender/JaegerSender.php new file mode 100644 index 000000000..dfce510b8 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sender/JaegerSender.php @@ -0,0 +1,236 @@ +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() + { + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sender/SenderInterface.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sender/SenderInterface.php new file mode 100644 index 000000000..24dc4fbfa --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Sender/SenderInterface.php @@ -0,0 +1,12 @@ +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; + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Span.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Span.php new file mode 100644 index 000000000..abcb07c89 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Span.php @@ -0,0 +1,476 @@ +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, + ]); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/SpanContext.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/SpanContext.php new file mode 100644 index 000000000..447ffd1a5 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/SpanContext.php @@ -0,0 +1,120 @@ +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); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AgentClient.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AgentClient.php new file mode 100644 index 000000000..640df4598 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AgentClient.php @@ -0,0 +1,76 @@ +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(); + } + } +} + + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AgentIf.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AgentIf.php new file mode 100644 index 000000000..30efc8cf3 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AgentIf.php @@ -0,0 +1,30 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Agent_emitZipkinBatch_args.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Agent_emitZipkinBatch_args.php new file mode 100644 index 000000000..cc58527bb --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Agent_emitZipkinBatch_args.php @@ -0,0 +1,60 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AggregationValidatorClient.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AggregationValidatorClient.php new file mode 100644 index 000000000..73825978a --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AggregationValidatorClient.php @@ -0,0 +1,83 @@ +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"); + } + +} + + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AggregationValidatorIf.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AggregationValidatorIf.php new file mode 100644 index 000000000..853cd2a4f --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AggregationValidatorIf.php @@ -0,0 +1,27 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AggregationValidator_validateTrace_result.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AggregationValidator_validateTrace_result.php new file mode 100644 index 000000000..6060c5ae3 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/AggregationValidator_validateTrace_result.php @@ -0,0 +1,56 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/BaggageRestriction.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/BaggageRestriction.php new file mode 100644 index 000000000..27593c4c1 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/BaggageRestriction.php @@ -0,0 +1,65 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/BaggageRestrictionManagerClient.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/BaggageRestrictionManagerClient.php new file mode 100644 index 000000000..379153534 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/BaggageRestrictionManagerClient.php @@ -0,0 +1,83 @@ +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"); + } + +} + + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/BaggageRestrictionManagerIf.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/BaggageRestrictionManagerIf.php new file mode 100644 index 000000000..010bda741 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/BaggageRestrictionManagerIf.php @@ -0,0 +1,31 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/BaggageRestrictionManager_getBaggageRestrictions_result.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/BaggageRestrictionManager_getBaggageRestrictions_result.php new file mode 100644 index 000000000..a3c52b37c --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/BaggageRestrictionManager_getBaggageRestrictions_result.php @@ -0,0 +1,60 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Dependencies.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Dependencies.php new file mode 100644 index 000000000..4295b9798 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Dependencies.php @@ -0,0 +1,61 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/DependencyClient.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/DependencyClient.php new file mode 100644 index 000000000..2c247633d --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/DependencyClient.php @@ -0,0 +1,105 @@ +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(); + } + } +} + + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/DependencyIf.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/DependencyIf.php new file mode 100644 index 000000000..c9432e7d8 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/DependencyIf.php @@ -0,0 +1,31 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Dependency_getDependenciesForTrace_args.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Dependency_getDependenciesForTrace_args.php new file mode 100644 index 000000000..5100ea77b --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Dependency_getDependenciesForTrace_args.php @@ -0,0 +1,55 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Dependency_getDependenciesForTrace_result.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Dependency_getDependenciesForTrace_result.php new file mode 100644 index 000000000..ebdd1303e --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Dependency_getDependenciesForTrace_result.php @@ -0,0 +1,56 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Dependency_saveDependencies_args.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Dependency_saveDependencies_args.php new file mode 100644 index 000000000..0d250c297 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Dependency_saveDependencies_args.php @@ -0,0 +1,56 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/OperationSamplingStrategy.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/OperationSamplingStrategy.php new file mode 100644 index 000000000..7532a7b50 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/OperationSamplingStrategy.php @@ -0,0 +1,66 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/PerOperationSamplingStrategies.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/PerOperationSamplingStrategies.php new file mode 100644 index 000000000..2a6ae8a61 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/PerOperationSamplingStrategies.php @@ -0,0 +1,88 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/ProbabilisticSamplingStrategy.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/ProbabilisticSamplingStrategy.php new file mode 100644 index 000000000..708ceb9a4 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/ProbabilisticSamplingStrategy.php @@ -0,0 +1,56 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/RateLimitingSamplingStrategy.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/RateLimitingSamplingStrategy.php new file mode 100644 index 000000000..d5502e8ee --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/RateLimitingSamplingStrategy.php @@ -0,0 +1,56 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingManagerClient.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingManagerClient.php new file mode 100644 index 000000000..9f5494a91 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingManagerClient.php @@ -0,0 +1,83 @@ +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"); + } + +} + + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingManagerIf.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingManagerIf.php new file mode 100644 index 000000000..ef17cf308 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingManagerIf.php @@ -0,0 +1,27 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingManager_getSamplingStrategy_result.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingManager_getSamplingStrategy_result.php new file mode 100644 index 000000000..79e6dce58 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingManager_getSamplingStrategy_result.php @@ -0,0 +1,56 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingStrategyResponse.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingStrategyResponse.php new file mode 100644 index 000000000..bc807a57d --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingStrategyResponse.php @@ -0,0 +1,86 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingStrategyType.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingStrategyType.php new file mode 100644 index 000000000..c8dff918a --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/SamplingStrategyType.php @@ -0,0 +1,28 @@ + 'PROBABILISTIC', + 1 => 'RATE_LIMITING', + ); +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/ValidateTraceResponse.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/ValidateTraceResponse.php new file mode 100644 index 000000000..226f61e80 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/ValidateTraceResponse.php @@ -0,0 +1,65 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/Annotation.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/Annotation.php new file mode 100644 index 000000000..e7e48dade --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/Annotation.php @@ -0,0 +1,87 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/AnnotationType.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/AnnotationType.php new file mode 100644 index 000000000..e21c0b0d8 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/AnnotationType.php @@ -0,0 +1,38 @@ + 'BOOL', + 1 => 'BYTES', + 2 => 'I16', + 3 => 'I32', + 4 => 'I64', + 5 => 'DOUBLE', + 6 => 'STRING', + ); +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/BinaryAnnotation.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/BinaryAnnotation.php new file mode 100644 index 000000000..806a74831 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/BinaryAnnotation.php @@ -0,0 +1,106 @@ + 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); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/Constant.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/Constant.php new file mode 100644 index 000000000..ebfcebe48 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/Constant.php @@ -0,0 +1,246 @@ + array( + 'var' => 'ipv4', + 'isRequired' => false, + 'type' => TType::I32, + ), + 2 => array( + 'var' => 'port', + 'isRequired' => false, + 'type' => TType::I16, + ), + 3 => array( + 'var' => 'service_name', + 'isRequired' => false, + 'type' => TType::STRING, + ), + 4 => array( + 'var' => 'ipv6', + 'isRequired' => false, + 'type' => TType::STRING, + ), + ); + + /** + * IPv4 host address packed into 4 bytes. + * + * Ex for the ip 1.2.3.4, it would be (1 << 24) | (2 << 16) | (3 << 8) | 4 + * + * @var int + */ + public $ipv4 = null; + /** + * IPv4 port + * + * Note: this is to be treated as an unsigned integer, so watch for negatives. + * + * Conventionally, when the port isn't known, port = 0. + * + * @var int + */ + public $port = null; + /** + * Service name in lowercase, such as "memcache" or "zipkin-web" + * + * Conventionally, when the service name isn't known, service_name = "unknown". + * + * @var string + */ + public $service_name = null; + /** + * IPv6 host address packed into 16 bytes. Ex Inet6Address.getBytes() + * + * @var string + */ + public $ipv6 = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'Endpoint'; + } + + public function read($input) + { + return $this->_read('Endpoint', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('Endpoint', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/Response.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/Response.php new file mode 100644 index 000000000..88c7f5e5d --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/Response.php @@ -0,0 +1,56 @@ + array( + 'var' => 'ok', + 'isRequired' => true, + 'type' => TType::BOOL, + ), + ); + + /** + * @var bool + */ + public $ok = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'Response'; + } + + public function read($input) + { + return $this->_read('Response', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('Response', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/Span.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/Span.php new file mode 100644 index 000000000..32a69b645 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/Span.php @@ -0,0 +1,190 @@ + array( + 'var' => 'trace_id', + 'isRequired' => false, + 'type' => TType::I64, + ), + 3 => array( + 'var' => 'name', + 'isRequired' => false, + 'type' => TType::STRING, + ), + 4 => array( + 'var' => 'id', + 'isRequired' => false, + 'type' => TType::I64, + ), + 5 => array( + 'var' => 'parent_id', + 'isRequired' => false, + 'type' => TType::I64, + ), + 6 => array( + 'var' => 'annotations', + 'isRequired' => false, + 'type' => TType::LST, + 'etype' => TType::STRUCT, + 'elem' => array( + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Agent\Zipkin\Annotation', + ), + ), + 8 => array( + 'var' => 'binary_annotations', + 'isRequired' => false, + 'type' => TType::LST, + 'etype' => TType::STRUCT, + 'elem' => array( + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Agent\Zipkin\BinaryAnnotation', + ), + ), + 9 => array( + 'var' => 'debug', + 'isRequired' => false, + 'type' => TType::BOOL, + ), + 10 => array( + 'var' => 'timestamp', + 'isRequired' => false, + 'type' => TType::I64, + ), + 11 => array( + 'var' => 'duration', + 'isRequired' => false, + 'type' => TType::I64, + ), + 12 => array( + 'var' => 'trace_id_high', + 'isRequired' => false, + 'type' => TType::I64, + ), + ); + + /** + * @var int + */ + public $trace_id = null; + /** + * Span name in lowercase, rpc method for example + * + * Conventionally, when the span name isn't known, name = "unknown". + * + * @var string + */ + public $name = null; + /** + * @var int + */ + public $id = null; + /** + * @var int + */ + public $parent_id = null; + /** + * @var \Jaeger\Thrift\Agent\Zipkin\Annotation[] + */ + public $annotations = null; + /** + * @var \Jaeger\Thrift\Agent\Zipkin\BinaryAnnotation[] + */ + public $binary_annotations = null; + /** + * @var bool + */ + public $debug = false; + /** + * Microseconds from epoch of the creation of this span. + * + * This value should be set directly by instrumentation, using the most + * precise value possible. For example, gettimeofday or syncing nanoTime + * against a tick of currentTimeMillis. + * + * For compatibilty with instrumentation that precede this field, collectors + * or span stores can derive this via Annotation.timestamp. + * For example, SERVER_RECV.timestamp or CLIENT_SEND.timestamp. + * + * This field is optional for compatibility with old data: first-party span + * stores are expected to support this at time of introduction. + * + * @var int + */ + public $timestamp = null; + /** + * Measurement of duration in microseconds, used to support queries. + * + * This value should be set directly, where possible. Doing so encourages + * precise measurement decoupled from problems of clocks, such as skew or NTP + * updates causing time to move backwards. + * + * For compatibilty with instrumentation that precede this field, collectors + * or span stores can derive this by subtracting Annotation.timestamp. + * For example, SERVER_SEND.timestamp - SERVER_RECV.timestamp. + * + * If this field is persisted as unset, zipkin will continue to work, except + * duration query support will be implementation-specific. Similarly, setting + * this field non-atomically is implementation-specific. + * + * This field is i64 vs i32 to support spans longer than 35 minutes. + * + * @var int + */ + public $duration = null; + /** + * Optional unique 8-byte additional identifier for a trace. If non zero, this + * means the trace uses 128 bit traceIds instead of 64 bit. + * + * @var int + */ + public $trace_id_high = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'Span'; + } + + public function read($input) + { + return $this->_read('Span', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('Span', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/ZipkinCollectorClient.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/ZipkinCollectorClient.php new file mode 100644 index 000000000..2978675c4 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/ZipkinCollectorClient.php @@ -0,0 +1,83 @@ +input_ = $input; + $this->output_ = $output ? $output : $input; + } + + public function submitZipkinBatch(array $spans) + { + $this->send_submitZipkinBatch($spans); + return $this->recv_submitZipkinBatch(); + } + + public function send_submitZipkinBatch(array $spans) + { + $args = new \Jaeger\Thrift\Agent\Zipkin\ZipkinCollector_submitZipkinBatch_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_, 'submitZipkinBatch', TMessageType::CALL, $args, $this->seqid_, $this->output_->isStrictWrite()); + } + else + { + $this->output_->writeMessageBegin('submitZipkinBatch', TMessageType::CALL, $this->seqid_); + $args->write($this->output_); + $this->output_->writeMessageEnd(); + $this->output_->getTransport()->flush(); + } + } + + public function recv_submitZipkinBatch() + { + $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\Zipkin\ZipkinCollector_submitZipkinBatch_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\Zipkin\ZipkinCollector_submitZipkinBatch_result(); + $result->read($this->input_); + $this->input_->readMessageEnd(); + } + if ($result->success !== null) { + return $result->success; + } + throw new \Exception("submitZipkinBatch failed: unknown result"); + } + +} + + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/ZipkinCollectorIf.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/ZipkinCollectorIf.php new file mode 100644 index 000000000..83abf8119 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/ZipkinCollectorIf.php @@ -0,0 +1,27 @@ + 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 'ZipkinCollector_submitZipkinBatch_args'; + } + + public function read($input) + { + return $this->_read('ZipkinCollector_submitZipkinBatch_args', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('ZipkinCollector_submitZipkinBatch_args', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/ZipkinCollector_submitZipkinBatch_result.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/ZipkinCollector_submitZipkinBatch_result.php new file mode 100644 index 000000000..faf165446 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Agent/Zipkin/ZipkinCollector_submitZipkinBatch_result.php @@ -0,0 +1,60 @@ + array( + 'var' => 'success', + 'isRequired' => false, + 'type' => TType::LST, + 'etype' => TType::STRUCT, + 'elem' => array( + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Agent\Zipkin\Response', + ), + ), + ); + + /** + * @var \Jaeger\Thrift\Agent\Zipkin\Response[] + */ + public $success = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'ZipkinCollector_submitZipkinBatch_result'; + } + + public function read($input) + { + return $this->_read('ZipkinCollector_submitZipkinBatch_result', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('ZipkinCollector_submitZipkinBatch_result', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Batch.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Batch.php new file mode 100644 index 000000000..56e9e5206 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Batch.php @@ -0,0 +1,71 @@ + array( + 'var' => 'process', + 'isRequired' => true, + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Process', + ), + 2 => array( + 'var' => 'spans', + 'isRequired' => true, + 'type' => TType::LST, + 'etype' => TType::STRUCT, + 'elem' => array( + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Span', + ), + ), + ); + + /** + * @var \Jaeger\Thrift\Process + */ + public $process = null; + /** + * @var \Jaeger\Thrift\Span[] + */ + public $spans = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'Batch'; + } + + public function read($input) + { + return $this->_read('Batch', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('Batch', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/BatchSubmitResponse.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/BatchSubmitResponse.php new file mode 100644 index 000000000..7ddc25eb5 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/BatchSubmitResponse.php @@ -0,0 +1,56 @@ + array( + 'var' => 'ok', + 'isRequired' => true, + 'type' => TType::BOOL, + ), + ); + + /** + * @var bool + */ + public $ok = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'BatchSubmitResponse'; + } + + public function read($input) + { + return $this->_read('BatchSubmitResponse', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('BatchSubmitResponse', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/CollectorClient.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/CollectorClient.php new file mode 100644 index 000000000..e3c6e14c1 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/CollectorClient.php @@ -0,0 +1,83 @@ +input_ = $input; + $this->output_ = $output ? $output : $input; + } + + public function submitBatches(array $batches) + { + $this->send_submitBatches($batches); + return $this->recv_submitBatches(); + } + + public function send_submitBatches(array $batches) + { + $args = new \Jaeger\Thrift\Collector_submitBatches_args(); + $args->batches = $batches; + $bin_accel = ($this->output_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary'); + if ($bin_accel) + { + thrift_protocol_write_binary($this->output_, 'submitBatches', TMessageType::CALL, $args, $this->seqid_, $this->output_->isStrictWrite()); + } + else + { + $this->output_->writeMessageBegin('submitBatches', TMessageType::CALL, $this->seqid_); + $args->write($this->output_); + $this->output_->writeMessageEnd(); + $this->output_->getTransport()->flush(); + } + } + + public function recv_submitBatches() + { + $bin_accel = ($this->input_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_read_binary'); + if ($bin_accel) $result = thrift_protocol_read_binary($this->input_, '\Jaeger\Thrift\Collector_submitBatches_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\Collector_submitBatches_result(); + $result->read($this->input_); + $this->input_->readMessageEnd(); + } + if ($result->success !== null) { + return $result->success; + } + throw new \Exception("submitBatches failed: unknown result"); + } + +} + + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/CollectorIf.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/CollectorIf.php new file mode 100644 index 000000000..da4f023ec --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/CollectorIf.php @@ -0,0 +1,27 @@ + array( + 'var' => 'batches', + 'isRequired' => false, + 'type' => TType::LST, + 'etype' => TType::STRUCT, + 'elem' => array( + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Batch', + ), + ), + ); + + /** + * @var \Jaeger\Thrift\Batch[] + */ + public $batches = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'Collector_submitBatches_args'; + } + + public function read($input) + { + return $this->_read('Collector_submitBatches_args', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('Collector_submitBatches_args', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Collector_submitBatches_result.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Collector_submitBatches_result.php new file mode 100644 index 000000000..aae083707 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Collector_submitBatches_result.php @@ -0,0 +1,60 @@ + array( + 'var' => 'success', + 'isRequired' => false, + 'type' => TType::LST, + 'etype' => TType::STRUCT, + 'elem' => array( + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\BatchSubmitResponse', + ), + ), + ); + + /** + * @var \Jaeger\Thrift\BatchSubmitResponse[] + */ + public $success = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'Collector_submitBatches_result'; + } + + public function read($input) + { + return $this->_read('Collector_submitBatches_result', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('Collector_submitBatches_result', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/Downstream.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/Downstream.php new file mode 100644 index 000000000..92b269aa6 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/Downstream.php @@ -0,0 +1,102 @@ + array( + 'var' => 'serviceName', + 'isRequired' => true, + 'type' => TType::STRING, + ), + 2 => array( + 'var' => 'serverRole', + 'isRequired' => true, + 'type' => TType::STRING, + ), + 3 => array( + 'var' => 'host', + 'isRequired' => true, + 'type' => TType::STRING, + ), + 4 => array( + 'var' => 'port', + 'isRequired' => true, + 'type' => TType::STRING, + ), + 5 => array( + 'var' => 'transport', + 'isRequired' => true, + 'type' => TType::I32, + ), + 6 => array( + 'var' => 'downstream', + 'isRequired' => false, + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Crossdock\Downstream', + ), + ); + + /** + * @var string + */ + public $serviceName = null; + /** + * @var string + */ + public $serverRole = null; + /** + * @var string + */ + public $host = null; + /** + * @var string + */ + public $port = null; + /** + * @var int + */ + public $transport = null; + /** + * @var \Jaeger\Thrift\Crossdock\Downstream + */ + public $downstream = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'Downstream'; + } + + public function read($input) + { + return $this->_read('Downstream', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('Downstream', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/JoinTraceRequest.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/JoinTraceRequest.php new file mode 100644 index 000000000..39e6242b7 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/JoinTraceRequest.php @@ -0,0 +1,66 @@ + array( + 'var' => 'serverRole', + 'isRequired' => true, + 'type' => TType::STRING, + ), + 2 => array( + 'var' => 'downstream', + 'isRequired' => false, + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Crossdock\Downstream', + ), + ); + + /** + * @var string + */ + public $serverRole = null; + /** + * @var \Jaeger\Thrift\Crossdock\Downstream + */ + public $downstream = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'JoinTraceRequest'; + } + + public function read($input) + { + return $this->_read('JoinTraceRequest', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('JoinTraceRequest', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/ObservedSpan.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/ObservedSpan.php new file mode 100644 index 000000000..d60331851 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/ObservedSpan.php @@ -0,0 +1,74 @@ + array( + 'var' => 'traceId', + 'isRequired' => true, + 'type' => TType::STRING, + ), + 2 => array( + 'var' => 'sampled', + 'isRequired' => true, + 'type' => TType::BOOL, + ), + 3 => array( + 'var' => 'baggage', + 'isRequired' => true, + 'type' => TType::STRING, + ), + ); + + /** + * @var string + */ + public $traceId = null; + /** + * @var bool + */ + public $sampled = null; + /** + * @var string + */ + public $baggage = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'ObservedSpan'; + } + + public function read($input) + { + return $this->_read('ObservedSpan', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('ObservedSpan', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/StartTraceRequest.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/StartTraceRequest.php new file mode 100644 index 000000000..50b9c6668 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/StartTraceRequest.php @@ -0,0 +1,84 @@ + array( + 'var' => 'serverRole', + 'isRequired' => true, + 'type' => TType::STRING, + ), + 2 => array( + 'var' => 'sampled', + 'isRequired' => true, + 'type' => TType::BOOL, + ), + 3 => array( + 'var' => 'baggage', + 'isRequired' => true, + 'type' => TType::STRING, + ), + 4 => array( + 'var' => 'downstream', + 'isRequired' => true, + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Crossdock\Downstream', + ), + ); + + /** + * @var string + */ + public $serverRole = null; + /** + * @var bool + */ + public $sampled = null; + /** + * @var string + */ + public $baggage = null; + /** + * @var \Jaeger\Thrift\Crossdock\Downstream + */ + public $downstream = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'StartTraceRequest'; + } + + public function read($input) + { + return $this->_read('StartTraceRequest', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('StartTraceRequest', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TraceResponse.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TraceResponse.php new file mode 100644 index 000000000..107d4e26d --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TraceResponse.php @@ -0,0 +1,82 @@ + array( + 'var' => 'span', + 'isRequired' => false, + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Crossdock\ObservedSpan', + ), + 2 => array( + 'var' => 'downstream', + 'isRequired' => false, + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Crossdock\TraceResponse', + ), + 3 => array( + 'var' => 'notImplementedError', + 'isRequired' => true, + 'type' => TType::STRING, + ), + ); + + /** + * @var \Jaeger\Thrift\Crossdock\ObservedSpan + */ + public $span = null; + /** + * @var \Jaeger\Thrift\Crossdock\TraceResponse + */ + public $downstream = null; + /** + * @var string + */ + public $notImplementedError = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'TraceResponse'; + } + + public function read($input) + { + return $this->_read('TraceResponse', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('TraceResponse', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedServiceClient.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedServiceClient.php new file mode 100644 index 000000000..2fd8b4fc9 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedServiceClient.php @@ -0,0 +1,134 @@ +input_ = $input; + $this->output_ = $output ? $output : $input; + } + + public function startTrace(\Jaeger\Thrift\Crossdock\StartTraceRequest $request) + { + $this->send_startTrace($request); + return $this->recv_startTrace(); + } + + public function send_startTrace(\Jaeger\Thrift\Crossdock\StartTraceRequest $request) + { + $args = new \Jaeger\Thrift\Crossdock\TracedService_startTrace_args(); + $args->request = $request; + $bin_accel = ($this->output_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary'); + if ($bin_accel) + { + thrift_protocol_write_binary($this->output_, 'startTrace', TMessageType::CALL, $args, $this->seqid_, $this->output_->isStrictWrite()); + } + else + { + $this->output_->writeMessageBegin('startTrace', TMessageType::CALL, $this->seqid_); + $args->write($this->output_); + $this->output_->writeMessageEnd(); + $this->output_->getTransport()->flush(); + } + } + + public function recv_startTrace() + { + $bin_accel = ($this->input_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_read_binary'); + if ($bin_accel) $result = thrift_protocol_read_binary($this->input_, '\Jaeger\Thrift\Crossdock\TracedService_startTrace_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\Crossdock\TracedService_startTrace_result(); + $result->read($this->input_); + $this->input_->readMessageEnd(); + } + if ($result->success !== null) { + return $result->success; + } + throw new \Exception("startTrace failed: unknown result"); + } + + public function joinTrace(\Jaeger\Thrift\Crossdock\JoinTraceRequest $request) + { + $this->send_joinTrace($request); + return $this->recv_joinTrace(); + } + + public function send_joinTrace(\Jaeger\Thrift\Crossdock\JoinTraceRequest $request) + { + $args = new \Jaeger\Thrift\Crossdock\TracedService_joinTrace_args(); + $args->request = $request; + $bin_accel = ($this->output_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_write_binary'); + if ($bin_accel) + { + thrift_protocol_write_binary($this->output_, 'joinTrace', TMessageType::CALL, $args, $this->seqid_, $this->output_->isStrictWrite()); + } + else + { + $this->output_->writeMessageBegin('joinTrace', TMessageType::CALL, $this->seqid_); + $args->write($this->output_); + $this->output_->writeMessageEnd(); + $this->output_->getTransport()->flush(); + } + } + + public function recv_joinTrace() + { + $bin_accel = ($this->input_ instanceof TBinaryProtocolAccelerated) && function_exists('thrift_protocol_read_binary'); + if ($bin_accel) $result = thrift_protocol_read_binary($this->input_, '\Jaeger\Thrift\Crossdock\TracedService_joinTrace_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\Crossdock\TracedService_joinTrace_result(); + $result->read($this->input_); + $this->input_->readMessageEnd(); + } + if ($result->success !== null) { + return $result->success; + } + throw new \Exception("joinTrace failed: unknown result"); + } + +} + + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedServiceIf.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedServiceIf.php new file mode 100644 index 000000000..e2dd9a8eb --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedServiceIf.php @@ -0,0 +1,40 @@ + array( + 'var' => 'request', + 'isRequired' => false, + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Crossdock\JoinTraceRequest', + ), + ); + + /** + * @var \Jaeger\Thrift\Crossdock\JoinTraceRequest + */ + public $request = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'TracedService_joinTrace_args'; + } + + public function read($input) + { + return $this->_read('TracedService_joinTrace_args', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('TracedService_joinTrace_args', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedService_joinTrace_result.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedService_joinTrace_result.php new file mode 100644 index 000000000..26ebd7124 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedService_joinTrace_result.php @@ -0,0 +1,56 @@ + array( + 'var' => 'success', + 'isRequired' => false, + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Crossdock\TraceResponse', + ), + ); + + /** + * @var \Jaeger\Thrift\Crossdock\TraceResponse + */ + public $success = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'TracedService_joinTrace_result'; + } + + public function read($input) + { + return $this->_read('TracedService_joinTrace_result', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('TracedService_joinTrace_result', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedService_startTrace_args.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedService_startTrace_args.php new file mode 100644 index 000000000..cabc260ea --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedService_startTrace_args.php @@ -0,0 +1,56 @@ + array( + 'var' => 'request', + 'isRequired' => false, + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Crossdock\StartTraceRequest', + ), + ); + + /** + * @var \Jaeger\Thrift\Crossdock\StartTraceRequest + */ + public $request = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'TracedService_startTrace_args'; + } + + public function read($input) + { + return $this->_read('TracedService_startTrace_args', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('TracedService_startTrace_args', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedService_startTrace_result.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedService_startTrace_result.php new file mode 100644 index 000000000..f4b114e64 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/TracedService_startTrace_result.php @@ -0,0 +1,56 @@ + array( + 'var' => 'success', + 'isRequired' => false, + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Crossdock\TraceResponse', + ), + ); + + /** + * @var \Jaeger\Thrift\Crossdock\TraceResponse + */ + public $success = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'TracedService_startTrace_result'; + } + + public function read($input) + { + return $this->_read('TracedService_startTrace_result', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('TracedService_startTrace_result', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/Transport.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/Transport.php new file mode 100644 index 000000000..1b71e686b --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Crossdock/Transport.php @@ -0,0 +1,30 @@ + 'HTTP', + 1 => 'TCHANNEL', + 2 => 'DUMMY', + ); +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Log.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Log.php new file mode 100644 index 000000000..809a92d7c --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Log.php @@ -0,0 +1,70 @@ + array( + 'var' => 'timestamp', + 'isRequired' => true, + 'type' => TType::I64, + ), + 2 => array( + 'var' => 'fields', + 'isRequired' => true, + 'type' => TType::LST, + 'etype' => TType::STRUCT, + 'elem' => array( + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Tag', + ), + ), + ); + + /** + * @var int + */ + public $timestamp = null; + /** + * @var \Jaeger\Thrift\Tag[] + */ + public $fields = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'Log'; + } + + public function read($input) + { + return $this->_read('Log', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('Log', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Process.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Process.php new file mode 100644 index 000000000..3b925220a --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Process.php @@ -0,0 +1,70 @@ + array( + 'var' => 'serviceName', + 'isRequired' => true, + 'type' => TType::STRING, + ), + 2 => array( + 'var' => 'tags', + 'isRequired' => false, + 'type' => TType::LST, + 'etype' => TType::STRUCT, + 'elem' => array( + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Tag', + ), + ), + ); + + /** + * @var string + */ + public $serviceName = null; + /** + * @var \Jaeger\Thrift\Tag[] + */ + public $tags = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'Process'; + } + + public function read($input) + { + return $this->_read('Process', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('Process', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Span.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Span.php new file mode 100644 index 000000000..cff0c324d --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Span.php @@ -0,0 +1,161 @@ + array( + 'var' => 'traceIdLow', + 'isRequired' => true, + 'type' => TType::I64, + ), + 2 => array( + 'var' => 'traceIdHigh', + 'isRequired' => true, + 'type' => TType::I64, + ), + 3 => array( + 'var' => 'spanId', + 'isRequired' => true, + 'type' => TType::I64, + ), + 4 => array( + 'var' => 'parentSpanId', + 'isRequired' => true, + 'type' => TType::I64, + ), + 5 => array( + 'var' => 'operationName', + 'isRequired' => true, + 'type' => TType::STRING, + ), + 6 => array( + 'var' => 'references', + 'isRequired' => false, + 'type' => TType::LST, + 'etype' => TType::STRUCT, + 'elem' => array( + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\SpanRef', + ), + ), + 7 => array( + 'var' => 'flags', + 'isRequired' => true, + 'type' => TType::I32, + ), + 8 => array( + 'var' => 'startTime', + 'isRequired' => true, + 'type' => TType::I64, + ), + 9 => array( + 'var' => 'duration', + 'isRequired' => true, + 'type' => TType::I64, + ), + 10 => array( + 'var' => 'tags', + 'isRequired' => false, + 'type' => TType::LST, + 'etype' => TType::STRUCT, + 'elem' => array( + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Tag', + ), + ), + 11 => array( + 'var' => 'logs', + 'isRequired' => false, + 'type' => TType::LST, + 'etype' => TType::STRUCT, + 'elem' => array( + 'type' => TType::STRUCT, + 'class' => '\Jaeger\Thrift\Log', + ), + ), + ); + + /** + * @var int + */ + public $traceIdLow = null; + /** + * @var int + */ + public $traceIdHigh = null; + /** + * @var int + */ + public $spanId = null; + /** + * @var int + */ + public $parentSpanId = null; + /** + * @var string + */ + public $operationName = null; + /** + * @var \Jaeger\Thrift\SpanRef[] + */ + public $references = null; + /** + * @var int + */ + public $flags = null; + /** + * @var int + */ + public $startTime = null; + /** + * @var int + */ + public $duration = null; + /** + * @var \Jaeger\Thrift\Tag[] + */ + public $tags = null; + /** + * @var \Jaeger\Thrift\Log[] + */ + public $logs = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'Span'; + } + + public function read($input) + { + return $this->_read('Span', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('Span', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/SpanRef.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/SpanRef.php new file mode 100644 index 000000000..cb5ee78db --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/SpanRef.php @@ -0,0 +1,83 @@ + array( + 'var' => 'refType', + 'isRequired' => true, + 'type' => TType::I32, + ), + 2 => array( + 'var' => 'traceIdLow', + 'isRequired' => true, + 'type' => TType::I64, + ), + 3 => array( + 'var' => 'traceIdHigh', + 'isRequired' => true, + 'type' => TType::I64, + ), + 4 => array( + 'var' => 'spanId', + 'isRequired' => true, + 'type' => TType::I64, + ), + ); + + /** + * @var int + */ + public $refType = null; + /** + * @var int + */ + public $traceIdLow = null; + /** + * @var int + */ + public $traceIdHigh = null; + /** + * @var int + */ + public $spanId = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'SpanRef'; + } + + public function read($input) + { + return $this->_read('SpanRef', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('SpanRef', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/SpanRefType.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/SpanRefType.php new file mode 100644 index 000000000..d6d6f20c3 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/SpanRefType.php @@ -0,0 +1,28 @@ + 'CHILD_OF', + 1 => 'FOLLOWS_FROM', + ); +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Tag.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Tag.php new file mode 100644 index 000000000..06af59939 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/Tag.php @@ -0,0 +1,110 @@ + array( + 'var' => 'key', + 'isRequired' => true, + 'type' => TType::STRING, + ), + 2 => array( + 'var' => 'vType', + 'isRequired' => true, + 'type' => TType::I32, + ), + 3 => array( + 'var' => 'vStr', + 'isRequired' => false, + 'type' => TType::STRING, + ), + 4 => array( + 'var' => 'vDouble', + 'isRequired' => false, + 'type' => TType::DOUBLE, + ), + 5 => array( + 'var' => 'vBool', + 'isRequired' => false, + 'type' => TType::BOOL, + ), + 6 => array( + 'var' => 'vLong', + 'isRequired' => false, + 'type' => TType::I64, + ), + 7 => array( + 'var' => 'vBinary', + 'isRequired' => false, + 'type' => TType::STRING, + ), + ); + + /** + * @var string + */ + public $key = null; + /** + * @var int + */ + public $vType = null; + /** + * @var string + */ + public $vStr = null; + /** + * @var double + */ + public $vDouble = null; + /** + * @var bool + */ + public $vBool = null; + /** + * @var int + */ + public $vLong = null; + /** + * @var string + */ + public $vBinary = null; + + public function __construct($vals=null) { + if (is_array($vals)) { + parent::__construct(self::$_TSPEC, $vals); + } + } + + public function getName() { + return 'Tag'; + } + + public function read($input) + { + return $this->_read('Tag', self::$_TSPEC, $input); + } + + public function write($output) { + return $this->_write('Tag', self::$_TSPEC, $output); + } + +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/TagType.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/TagType.php new file mode 100644 index 000000000..3b1f69f9f --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Thrift/TagType.php @@ -0,0 +1,34 @@ + 'STRING', + 1 => 'DOUBLE', + 2 => 'BOOL', + 3 => 'LONG', + 4 => 'BINARY', + ); +} + diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ThriftUdpTransport.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ThriftUdpTransport.php new file mode 100644 index 000000000..babc689dc --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/ThriftUdpTransport.php @@ -0,0 +1,151 @@ +setLogger($logger); + + $this->config = $config; + + $ipProtocol = $this->ipProtocolVersion(); + $this->socket = $this->createSocket($ipProtocol); + + $this->host = $host; + $this->port = $port; + } + + protected function setLogger($logger) + { + $this->logger = $logger ?? new NullLogger(); + } + + protected function createSocket(string $ipProtocol) + { + $socketDomain = AF_INET; + if ($ipProtocol === Config::IPV6) { + $socketDomain = AF_INET6; + } + + $socket = @socket_create($socketDomain, SOCK_DGRAM, SOL_UDP); + if ($socket === false) { + $this->handleSocketError("socket_create failed"); + } + return $socket; + } + + protected function ipProtocolVersion() + { + if (!empty($this->config)) { + return $this->config->ipProtocolVersion(); + } + return ""; + } + + /** + * Whether this transport is open. + * + * @return boolean true if open + */ + public function isOpen() + { + return $this->socket !== null; + } + + /** + * Open the transport for reading/writing + */ + public function open() + { + $ok = @socket_connect($this->socket, $this->host, $this->port); + if ($ok === false) { + $this->handleSocketError('socket_connect failed'); + } + } + + /** + * Close the transport. + */ + public function close() + { + if (is_null($this->socket)) { + $this->logger->warning("can't close empty socket"); + return ; + } + + @socket_close($this->socket); + $this->socket = null; + } + + /** + * Read some data into the array. + * + * @todo + * + * @param int $len How much to read + * @return string The data that has been read + */ + public function read($len) + { + } + + /** + * Writes the given data out. + * + * @param string $buf The data to write + */ + public function write($buf) + { + if (!$this->isOpen()) { + $this->logger->warning('transport is closed'); + return ; + } + + $ok = @socket_write($this->socket, $buf); + if ($ok === false) { + $this->handleSocketError("socket_write failed"); + } + } + + public function handleSocketError($msg) + { + $errorCode = socket_last_error($this->socket); + $errorMsg = socket_strerror($errorCode); + + $this->logger->warning(sprintf('%s: [code - %d] %s', $msg, $errorCode, $errorMsg)); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Tracer.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Tracer.php new file mode 100644 index 000000000..bb0649a0b --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Tracer.php @@ -0,0 +1,420 @@ +serviceName = $serviceName; + $this->reporter = $reporter; + $this->sampler = $sampler; + $this->oneSpanPerRpc = $oneSpanPerRpc; + + $this->logger = $logger ?? new NullLogger(); + $this->scopeManager = $scopeManager ?? new ScopeManager(); + + $this->debugIdHeader = $debugIdHeader; + + $this->codecs = [ + TEXT_MAP => new TextCodec( + false, + $traceIdHeader, + $baggageHeaderPrefix, + $debugIdHeader + ), + HTTP_HEADERS => new TextCodec( + true, + $traceIdHeader, + $baggageHeaderPrefix, + $debugIdHeader + ), + BINARY => new BinaryCodec(), + ZIPKIN_SPAN_FORMAT => new ZipkinCodec(), + ]; + + $this->tags = [ + JAEGER_VERSION_TAG_KEY => JAEGER_CLIENT_VERSION, + ]; + if ($tags !== null) { + $this->tags = array_merge($this->tags, $tags); + } + + $hostname = $this->getHostName(); + $this->ipAddress = $this->getHostByName($hostname); + + if (!empty($hostname)) { + $this->tags[JAEGER_HOSTNAME_TAG_KEY] = $hostname; + } + } + + /** + * @return string[] + */ + public function getTags(): array + { + return $this->tags; + } + + /** + * {@inheritdoc} + */ + public function startSpan(string $operationName, $options = []): OTSpan + { + if (!($options instanceof StartSpanOptions)) { + $options = StartSpanOptions::create($options); + } + + $parent = $this->getParentSpanContext($options); + $tags = $options->getTags(); + + $rpcServer = ($tags[SPAN_KIND] ?? null) == SPAN_KIND_RPC_SERVER; + + if ($parent == null || $parent->isDebugIdContainerOnly()) { + $traceId = $this->randomId(); + $spanId = $traceId; + $parentId = null; + $flags = 0; + $baggage = null; + if ($parent == null) { + list($sampled, $samplerTags) = $this->sampler->isSampled($traceId, $operationName); + if ($sampled) { + $flags = SAMPLED_FLAG; + $tags = $tags ?? []; + foreach ($samplerTags as $key => $value) { + $tags[$key] = $value; + } + } + } else { // have debug id + $flags = SAMPLED_FLAG | DEBUG_FLAG; + $tags = $tags ?? []; + $tags[$this->debugIdHeader] = $parent->getDebugId(); + } + } else { + $traceId = $parent->getTraceId(); + if ($rpcServer && $this->oneSpanPerRpc) { + // Zipkin-style one-span-per-RPC + $spanId = $parent->getSpanId(); + $parentId = $parent->getParentId(); + } else { + $spanId = $this->randomId(); + $parentId = $parent->getSpanId(); + } + + $flags = $parent->getFlags(); + $baggage = $parent->getBaggage(); + } + + $spanContext = new SpanContext( + $traceId, + $spanId, + $parentId, + $flags, + $baggage + ); + + $span = new Span( + $spanContext, + $this, + $operationName, + $tags ?? [], + $options->getStartTime() + ); + + $mergedTags = array_merge($this->tags, $tags); + $span->setTags($mergedTags); + + return $span; + } + + /** + * {@inheritdoc} + * + * @param SpanContext $spanContext + * @param string $format + * @param mixed $carrier + * @return void + * + * @throws UnsupportedFormat + */ + public function inject(OTSpanContext $spanContext, string $format, &$carrier): void + { + if ($spanContext instanceof SpanContext) { + $codec = $this->codecs[$format] ?? null; + + if ($codec == null) { + throw UnsupportedFormatException::forFormat(is_scalar($format) ? $format : gettype($format)); + } + + + $codec->inject($spanContext, $carrier); + return; + } + + $message = sprintf( + 'Invalid span context. Expected Jaeger\SpanContext, got %s.', + is_object($spanContext) ? get_class($spanContext) : gettype($spanContext) + ); + + $this->logger->warning($message); + } + + /** + * {@inheritdoc} + * + * @param mixed $carrier + * @return SpanContext|null + * + * @throws UnsupportedFormat + */ + public function extract(string $format, $carrier): ?OTSpanContext + { + $codec = $this->codecs[$format] ?? null; + + if ($codec == null) { + throw UnsupportedFormatException::forFormat(is_scalar($format) ? $format : gettype($format)); + } + + try { + return $codec->extract($carrier); + } catch (\Throwable $e) { + $this->logger->warning($e->getMessage()); + + return null; + } + } + + /** + * {@inheritdoc} + */ + public function flush(): void + { + $this->sampler->close(); + $this->reporter->close(); + } + + public function reportSpan(Span $span) + { + $this->reporter->reportSpan($span); + } + + /** + * {@inheritdoc} + */ + public function getScopeManager(): OTScopeManager + { + return $this->scopeManager; + } + + /** + * {@inheritdoc} + */ + public function getActiveSpan(): ?OTSpan + { + $activeScope = $this->getScopeManager()->getActive(); + if ($activeScope === null) { + return null; + } + + return $activeScope->getSpan(); + } + + /** + * {@inheritdoc} + */ + public function startActiveSpan(string $operationName, $options = []): OTScope + { + if (!$options instanceof StartSpanOptions) { + $options = StartSpanOptions::create($options); + } + + if (!$this->getParentSpanContext($options) && $this->getActiveSpan() !== null) { + $parent = $this->getActiveSpan()->getContext(); + $options = $options->withParent($parent); + } + + $span = $this->startSpan($operationName, $options); + $scope = $this->scopeManager->activate($span, $options->shouldFinishSpanOnClose()); + + return $scope; + } + + /** + * Gets parent span context (if any). + * + * @param StartSpanOptions $options + * @return null|OTSpanContext|SpanContext + */ + private function getParentSpanContext(StartSpanOptions $options) + { + $references = $options->getReferences(); + foreach ($references as $ref) { + if ($ref->isType(Reference::CHILD_OF)) { + return $ref->getSpanContext(); + } + } + + return null; + } + + /** + * @return string + * @throws Exception + */ + private function randomId(): string + { + return (string) random_int(0, PHP_INT_MAX); + } + + /** + * The facade to get the host name. + * + * @return string + */ + protected function getHostName() + { + return gethostname(); + } + + /** + * The facade to get IPv4 address corresponding to a given Internet host name. + * + * NOTE: DNS Resolution may take too long, and during this time your script is NOT being executed. + * + * @param string|null $hostname + * @return string + */ + protected function getHostByName($hostname) + { + if (empty($hostname)) { + $this->logger->error('Unable to determine host name'); + return '127.0.0.1'; + } + + return gethostbyname($hostname); + } + + /** + * @param SamplerInterface $sampler + * @return $this + */ + public function setSampler(SamplerInterface $sampler) + { + $this->sampler = $sampler; + + return $this; + } + + /** + * @return string + */ + public function getServiceName() + { + return $this->serviceName; + } + + /** + * @return string + */ + public function getIpAddress() + { + return $this->ipAddress; + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Util/RateLimiter.php b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Util/RateLimiter.php new file mode 100644 index 000000000..d767ad40f --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/src/Jaeger/Util/RateLimiter.php @@ -0,0 +1,128 @@ +cache = $cache; + $this->balance = $this->cache->getItem($currentBalanceKey); + $this->lastTick = $this->cache->getItem($lastTickKey); + } + + /** + * @param $itemCost + * @return bool + */ + public function checkCredit($itemCost) + { + if (!$this->creditsPerNanosecond) { + return false; + } + + list($lastTick, $balance) = $this->getState(); + + if (!$lastTick) { + $this->saveState(hrtime(true), 0); + return true; + } + + $currentTick = hrtime(true); + $elapsedTime = $currentTick - $lastTick; + $balance += $elapsedTime * $this->creditsPerNanosecond; + if ($balance > $this->maxBalance) { + $balance = $this->maxBalance; + } + + $result = false; + if ($balance >= $itemCost) { + $balance -= $itemCost; + $result = true; + } + + $this->saveState($currentTick, $balance); + + return $result; + } + + + /** + * Initializes limiter costs and boundaries + * + * @param float $creditsPerNanosecond + * @param float $maxBalance + */ + public function initialize(float $creditsPerNanosecond, float $maxBalance) + { + $this->creditsPerNanosecond = $creditsPerNanosecond; + $this->maxBalance = $maxBalance; + } + + /** + * Method loads last tick and current balance from cache + * + * @return array [$lastTick, $balance] + */ + private function getState() : array + { + return [ + $this->lastTick->get(), + $this->balance->get() + ]; + } + + /** + * Method saves last tick and current balance into cache + * + * @param integer $lastTick + * @param float $balance + */ + private function saveState($lastTick, $balance) + { + $this->lastTick->set($lastTick); + $this->balance->set($balance); + $this->cache->saveDeferred($this->lastTick); + $this->cache->saveDeferred($this->balance); + $this->cache->commit(); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Codec/TextCodecTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Codec/TextCodecTest.php new file mode 100644 index 000000000..79a1dd96f --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Codec/TextCodecTest.php @@ -0,0 +1,170 @@ +textCodec = new TextCodec(); + } + + public function testCanInjectSimpleContextInCarrier(): void + { + $context = new SpanContext('trace-id', 'span-id', null, null); + $carrier = []; + + $this->textCodec->inject($context, $carrier); + + $this->assertCount(1 , $carrier); + $this->assertArrayHasKey(TRACE_ID_HEADER, $carrier); + } + + /** + * @dataProvider contextDataProvider + * @param bool $urlEncode + * @param $baggage + */ + public function testCanInjectContextBaggageInCarrier(bool $urlEncode, $baggage, $injectedBaggage): void + { + $carrier = []; + + $context = new SpanContext('trace-id', 'span-id', null, null, $baggage); + $textCodec = new TextCodec($urlEncode); + $textCodec->inject($context, $carrier); + + $this->assertCount(1 + count($baggage) , $carrier); + $this->assertArrayHasKey(TRACE_ID_HEADER, $carrier); + foreach ($injectedBaggage as $key => $value) { + $this->assertArrayHasKey(BAGGAGE_HEADER_PREFIX . $key, $carrier); + $this->assertEquals($carrier[BAGGAGE_HEADER_PREFIX . $key], $value); + } + } + + public function contextDataProvider() + { + return [ + [false, ['baggage-1' => 'baggage value'], ['baggage-1' => 'baggage value']], + [false, ['baggage-1' => 'https://testdomain.sk'], ['baggage-1' => 'https://testdomain.sk']], + [true, ['baggage-1' => 'https://testdomain.sk'], ['baggage-1' => 'https%3A%2F%2Ftestdomain.sk']], + ]; + } + + /** + * @dataProvider carrierDataProvider + * @param $urlEncode + * @param $carrier + * @param $traceId + * @param $spanId + * @param $parentId + * @param $flags + * @param $baggage + * @throws \Exception + */ + public function testSpanContextParsingFromHeader($urlEncode, $carrier, $traceId, $spanId, $parentId, $flags, $baggage): void + { + $textCodec = new TextCodec($urlEncode); + $spanContext = $textCodec->extract($carrier); + + $this->assertEquals($traceId, $spanContext->getTraceId()); + $this->assertEquals($spanId, $spanContext->getSpanId()); + $this->assertEquals($parentId, $spanContext->getParentId()); + $this->assertEquals($flags, $spanContext->getFlags()); + $this->assertCount(count($baggage), $spanContext->getBaggage() ? $spanContext->getBaggage() : []); + foreach ($baggage as $key => $value) { + $this->assertEquals($value, $spanContext->getBaggageItem($key)); + } + } + + public function carrierDataProvider(): array + { + return [ + [ + false, + [ + TRACE_ID_HEADER => '32834e4115071776:f7802330248418d:f123456789012345:1' + ], + "3639838965278119798", + "1114643325879075213", + "-1070935975401544891", + 1, + [] + ], + [ + false, + [ + TRACE_ID_HEADER => '32834e4115071776:f7802330248418d:f123456789012345:1', + BAGGAGE_HEADER_PREFIX . 'baggage-1' => 'https://testdomain.sk', + ], + "3639838965278119798", + "1114643325879075213", + "-1070935975401544891", + 1, + ['baggage-1' => 'https://testdomain.sk'] + ], + [ + true, + [ + TRACE_ID_HEADER => '32834e4115071776:f7802330248418d:f123456789012345:1', + BAGGAGE_HEADER_PREFIX . 'baggage-1' => 'https%3A%2F%2Ftestdomain.sk', + ], + "3639838965278119798", + "1114643325879075213", + "-1070935975401544891", + 1, + ['baggage-1' => 'https://testdomain.sk'] + ] + ]; + } + + public function testBaggageWithoutTraceContext(): void + { + $carrier = [BAGGAGE_HEADER_PREFIX.'test' => 'some data']; + + $this->expectException(Exception::class); + $this->expectExceptionMessage('baggage without trace ctx'); + + $this->textCodec->extract($carrier); + } + + public function testInvalidSpanContextParsingFromHeader(): void + { + $carrier = [TRACE_ID_HEADER => 'invalid_data']; + + $this->expectException(Exception::class); + $this->expectExceptionMessage('Malformed tracer state string.'); + + $this->textCodec->extract($carrier); + } + + public function testExtractDebugSpanContext(): void + { + $carrier = [DEBUG_ID_HEADER_KEY => 'debugId']; + + $spanContext = $this->textCodec->extract($carrier); + + $this->assertEquals('debugId', $spanContext->getDebugId()); + $this->assertNull($spanContext->getTraceId()); + $this->assertNull($spanContext->getSpanId()); + $this->assertNull($spanContext->getParentId()); + $this->assertNull($spanContext->getFlags()); + } + + + public function testExtractEmptySpanContext(): void + { + $spanContext = $this->textCodec->extract([]); + $this->assertNull($spanContext); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Codec/ZipkinCodecTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Codec/ZipkinCodecTest.php new file mode 100644 index 000000000..047caac2e --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Codec/ZipkinCodecTest.php @@ -0,0 +1,104 @@ +codec = new ZipkinCodec; + } + + function testInject() + { + // Given + $traceId = 123; + $spanId = 456; + $parentId = 789; + + $spanContext = new SpanContext( + $traceId, + $spanId, + $parentId, + SAMPLED_FLAG + ); + $carrier = []; + + // When + $this->codec->inject($spanContext, $carrier); + + // Then + $this->assertEquals('7b', $carrier['X-B3-TraceId']); + $this->assertEquals('1c8', $carrier['X-B3-SpanId']); + $this->assertEquals('315', $carrier['X-B3-ParentSpanId']); + $this->assertSame(1, $carrier['X-B3-Flags']); + } + + function testExtract() + { + // Given + $carrier = [ + 'x-b3-traceid' => 'a53bf337d7e455e1', + 'x-b3-spanid' => '153bf227d1f455a1', + 'x-b3-parentspanid' => 'a53bf337d7e455e1', + 'x-b3-flags' => '1', + ]; + + // When + $spanContext = $this->codec->extract($carrier); + + // Then + $this->assertEquals(new SpanContext( + '-6540366612654696991', + '1530082751262512545', + '-6540366612654696991', + DEBUG_FLAG + ), $spanContext); + } + + function testExtractWithoutParentSpanId() + { + // Given + $carrier = [ + 'x-b3-traceid' => '8d824d69da5f50d9', + 'x-b3-spanid' => '8d824d69da5f50d9', + 'x-b3-flags' => '1', + ]; + + // When + $spanContext = $this->codec->extract($carrier); + + // Then + $this->assertEquals(new SpanContext( + '-8249946450358742823', + '-8249946450358742823', + '0', + DEBUG_FLAG + ), $spanContext); + } + + function testExtractInvalidHeader() + { + // Given + $carrier = [ + 'x-b3-traceid' => 'zzzz', + 'x-b3-spanid' => '463ac35c9f6413ad48485a3953bb6124', + 'x-b3-flags' => '1', + ]; + + // When + $spanContext = $this->codec->extract($carrier); + + // Then + $this->assertEquals(null, $spanContext); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/ConfigTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/ConfigTest.php new file mode 100644 index 000000000..da1a9781e --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/ConfigTest.php @@ -0,0 +1,257 @@ +config = new Config([], $this->serviceName); + $this->reporter = $this->createMock(ReporterInterface::class); + $this->sampler = $this->createmock(SamplerInterface::class); + } + + function testCreateTracer() + { + $tracer = $this->config->createTracer($this->reporter, $this->sampler); + + $this->assertEquals(Tracer::class, get_class($tracer)); + $this->assertEquals($this->serviceName, $tracer->getServiceName()); + } + + function testThrowExceptionWhenServiceNameIsNotDefined() + { + $this->expectException(Exception::class); + $this->expectExceptionMessage('service_name required in the config or param.'); + + new Config([]); + } + + function testSetServiceNameFromConfig() + { + $config = new Config(['service_name' => 'test-service-name-from-config']); + + $serviceName = $config->getServiceName(); + + $this->assertEquals('test-service-name-from-config', $serviceName); + } + + /** + * @test + */ + public function shouldSetGlobalTracerAfterInitialize() + { + //given + $config = new Config(['service_name' => 'test-service-name']); + + //when + $config->initializeTracer(); + + //then + $tracer = GlobalTracer::get(); + $this->assertInstanceOf(Tracer::class, $tracer); + } + + /** @test */ + public function shouldThrowExceptionWhenCreatingNotSupportedSampler() + { + $config = new Config(['service_name' => 'test-service-name', 'sampler' => ['type' => 'unsupportedSampler']]); + + $this->expectException(Exception::class); + $this->expectExceptionMessage('Unknown sampler type unsupportedSampler'); + + $config->initializeTracer(); + } + + /** @test */ + public function shouldThrowExceptionWhenCreatingRateLimitingSamplerWithoutCacheComponent() + { + $config = new Config([ + 'service_name' => 'test-service-name', + 'sampler' => ['type' => \Jaeger\SAMPLER_TYPE_RATE_LIMITING] + ]); + + $this->expectException(Exception::class); + $this->expectExceptionMessage('You cannot use RateLimitingSampler without cache component'); + + $config->initializeTracer(); + } + + /** @test */ + public function shouldPassDifferentDispatchMode() { + foreach (Config::getAvailableDispatchModes() as $dispatchMode) { + $config = new Config( + [ + 'sampler' => [ + 'type' => SAMPLER_TYPE_CONST, + 'param' => true, + ], + 'logging' => false, + "local_agent" => [ + "reporting_host" => "localhost", + ], + 'dispatch_mode' => $dispatchMode, + ], + 'your-app-name' + ); + $config->initializeTracer(); + $this->expectNotToPerformAssertions(); + } + } + + /** @test */ + public function shouldPassConfiguredTagsToTracer() + { + $tags = [ + 'bar' => 'a-value', + 'other.tag' => 'foo', + ]; + + $config = new Config([ + 'sampler' => [ + 'type' => SAMPLER_TYPE_CONST, + 'param' => true, + ], + 'service_name' => 'test-service-name', + 'tags' => $tags, + ]); + + $tracer = $config->initializeTracer(); + $span = $tracer->startSpan('test-span'); + $spanTags = $span->getTags(); + + foreach ($tags as $name => $value) { + $this->assertArrayHasKey($name, $spanTags, "Tag '$name' should be set on span"); + $this->assertEquals($value, $spanTags[$name]->value, "Tag '$name' should have configured value"); + } + } + + /** + * @test + * @dataProvider shouldSetConfigPropertiesFromEnvVarsProvider + */ + public function shouldSetConfigPropertiesFromEnvVars($varName, $varVal, $initialConfig, $valueGetter, $expectedVal) + { + $_ENV[$varName] = $varVal; + + $config = new Config([]); + $configProperty = (new \ReflectionObject($config))->getProperty('config'); + $configProperty->setAccessible('true'); + $configArray = $configProperty->getValue($config); + + $this->assertSame($expectedVal, $valueGetter($configArray)); + } + + /** + * @test + * @dataProvider shouldSetConfigPropertiesFromEnvVarsProvider + */ + public function shouldNotSetConfigPropertiesFromEnvVars($varName, $varVal, $initialConfig, $valueGetter, $expectedVal) + { + $_ENV[$varName] = $varVal; + + $config = new Config($initialConfig); + $configProperty = (new \ReflectionObject($config))->getProperty('config'); + $configProperty->setAccessible('true'); + $configArray = $configProperty->getValue($config); + + $this->assertNotEquals($expectedVal, $valueGetter($configArray)); + } + + /** + * 0 -> varName + * 1 -> varVal + * 2 -> initialConfig + * 3 -> valueGetter + * 4 -> expectedVal + */ + public function shouldSetConfigPropertiesFromEnvVarsProvider() { + return [ + [ + 'JAEGER_SERVICE_NAME', + 'some-str', + ['service_name' => 'some-other-str'], + function ($a) { return $a['service_name']; }, + 'some-str', + ], + [ + 'JAEGER_TAGS', + 'some-str', + ['tags' => 'some-other-str'], + function ($a) { return $a['tags']; }, + 'some-str', + ], + [ + 'JAEGER_AGENT_HOST', + 'some-str', + ['local_agent' => ['reporting_host' => 'some-other-str']], + function ($a) { return $a['local_agent']['reporting_host'];}, + 'some-str', + ], + [ + 'JAEGER_AGENT_PORT', + '2222', + ['local_agent' => ['reporting_port' => 1111]], + function ($a) { return $a['local_agent']['reporting_port']; }, + 2222, + ], + [ + 'JAEGER_REPORTER_LOG_SPANS', + 'true', + ['logging' => false], + function ($a) { return $a['logging']; }, + true, + ], + [ + 'JAEGER_REPORTER_MAX_QUEUE_SIZE', + '2222', + ['max_buffer_length' => 1111], + function ($a) { return $a['max_buffer_length']; }, + 2222, + ], + [ + 'JAEGER_SAMPLER_TYPE', + 'some-str', + ['sampler' => ['type' => 'some-other-str']], + function ($a) { return $a['sampler']['type']; }, + 'some-str', + ], + [ + 'JAEGER_SAMPLER_PARAM', + 'some-str', + ['sampler' => ['param' => 'some-other-str']], + function ($a) { return $a['sampler']['param']; }, + 'some-str', + ], + ]; + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Logger/StackLogger.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Logger/StackLogger.php new file mode 100644 index 000000000..fd8789dc3 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Logger/StackLogger.php @@ -0,0 +1,30 @@ +messagesStack[] = $message; + } + + public function getLastMessage() { + return array_pop($this->messagesStack); + } + + public function getMessagesCount() { + return count($this->messagesStack); + } + + public function clear() { + $this->messagesStack = []; + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Mapper/SpanToJaegerMapperTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Mapper/SpanToJaegerMapperTest.php new file mode 100644 index 000000000..d536cb63a --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Mapper/SpanToJaegerMapperTest.php @@ -0,0 +1,169 @@ +tracer = new Tracer($this->serviceName, new NullReporter, new ConstSampler); + $this->context = new SpanContext(0, 0, 0, SAMPLED_FLAG); + } + + /** + * {@inheritdoc} + */ + protected function tearDown(): void + { + $this->tracer = null; + $this->context = null; + } + + /** @test */ + public function shouldProperlyInitializeAtConstructTime(): void + { + $span = new Span($this->context, $this->tracer, 'test-operation'); + $span->setTags([ + "tag-bool1" => true, + "tag-bool2" => false, + "tag-int" => 1234567, + "tag-float" => 1.23456, + "tag-string" => "hello-world" + ]); + + $mapper = new SpanToJaegerMapper(); + $thriftSpan = $mapper->mapSpanToJaeger($span); + + $index = 0; + $this->assertEquals($thriftSpan->tags[$index]->key, "component"); + $this->assertEquals($thriftSpan->tags[$index]->vType, TagType::STRING); + $this->assertEquals($thriftSpan->tags[$index]->vStr, $this->serviceName); + $index++; + + $this->assertEquals($thriftSpan->tags[$index]->key, "tag-bool1"); + $this->assertEquals($thriftSpan->tags[$index]->vType, TagType::BOOL); + $this->assertEquals($thriftSpan->tags[$index]->vBool, true); + $index++; + + $this->assertEquals($thriftSpan->tags[$index]->key, "tag-bool2"); + $this->assertEquals($thriftSpan->tags[$index]->vType, TagType::BOOL); + $this->assertEquals($thriftSpan->tags[$index]->vBool, false); + $index++; + + $this->assertEquals($thriftSpan->tags[$index]->key, "tag-int"); + $this->assertEquals($thriftSpan->tags[$index]->vType, TagType::LONG); + $this->assertEquals($thriftSpan->tags[$index]->vLong, 1234567); + $index++; + + $this->assertEquals($thriftSpan->tags[$index]->key, "tag-float"); + $this->assertEquals($thriftSpan->tags[$index]->vType, TagType::DOUBLE); + $this->assertEquals($thriftSpan->tags[$index]->vDouble, 1.23456); + $index++; + + $this->assertEquals($thriftSpan->tags[$index]->key, "tag-string"); + $this->assertEquals($thriftSpan->tags[$index]->vType, TagType::STRING); + $this->assertEquals($thriftSpan->tags[$index]->vStr, "hello-world"); + $index++; + } + + /** + * @dataProvider specialTagProvider + * @param array $tags + * @return void + */ + public function testSpecialTagsAreAdded(array $tags): void + { + $span = new Span($this->context, $this->tracer, 'test-operation'); + $span->setTags($tags); + + // The component tag is always added, even if it's not specified in tags + $expectedTagValues = array_merge([COMPONENT => $this->serviceName], $tags); + + $mapper = new SpanToJaegerMapper(); + $thriftSpan = $mapper->mapSpanToJaeger($span); + + $foundTags = []; + + foreach ($thriftSpan->tags as $tag) { + $foundTags[] = $tag->key; + + switch ($tag->key) { + case PEER_SERVICE: + case PEER_HOST_IPV4: + case SPAN_KIND: + case COMPONENT: + $this->assertEquals(TagType::STRING, $tag->vType, 'Incorrect tag value type'); + $this->assertEquals($expectedTagValues[$tag->key], $tag->vStr, 'Incorrect tag value'); + break; + case PEER_PORT: + $this->assertEquals(TagType::LONG, $tag->vType, 'Incorrect tag value type'); + $this->assertEquals($expectedTagValues[$tag->key], $tag->vLong, 'Incorrect tag value'); + break; + } + } + + $this->assertEqualsCanonicalizing(array_keys($expectedTagValues), $foundTags, 'Some of the tags are missing'); + } + + public function specialTagProvider(): array + { + return [ + [ + [ + 'bool_tag' => true, + PEER_SERVICE => 'my_service', + PEER_HOST_IPV4 => '127.0.0.1', + PEER_PORT => 443, + SPAN_KIND => SPAN_KIND_RPC_CLIENT, + COMPONENT => 'grpc', + ], + ], + [ + [ + 'int_tag' => 5, + PEER_HOST_IPV4 => '192.168.0.1', + PEER_PORT => 80, + ], + ], + [ + [ + 'string_tag' => 'testing-tag', + PEER_PORT => 80, + COMPONENT => 'grpc', + ], + ], + [ + [ + 'string_tag' => 'testing-tag', + ], + ], + ]; + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/CompositeReporterTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/CompositeReporterTest.php new file mode 100644 index 000000000..ef95ebfe7 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/CompositeReporterTest.php @@ -0,0 +1,52 @@ +childReporter1 = $this->createMock(ReporterInterface::class); + $this->childReporter2 = $this->createMock(ReporterInterface::class); + + $this->reporter = new CompositeReporter($this->childReporter1, $this->childReporter2); + } + + /** @test */ + public function shouldReportSpan() + { + /** @var \Jaeger\Span|\PHPUnit\Framework\MockObject\MockObject $span */ + $span = $this->createMock(Span::class); + + $this->childReporter1->expects($this->once())->method('reportSpan')->with($span); + $this->childReporter2->expects($this->once())->method('reportSpan')->with($span); + + $this->reporter->reportSpan($span); + } + + /** @test */ + public function shouldCloseReporter() + { + $this->childReporter1->expects($this->once())->method('close'); + $this->childReporter2->expects($this->once())->method('close'); + + $this->reporter->close(); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/InMemoryReporterTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/InMemoryReporterTest.php new file mode 100644 index 000000000..966a62fa4 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/InMemoryReporterTest.php @@ -0,0 +1,24 @@ +createMock(Span::class); + $reporter = new InMemoryReporter(); + + $reporter->reportSpan($span); + $reporter->close(); + + $spans = $reporter->getSpans(); + $this->assertEquals([$span], $spans); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/LoggingReporterTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/LoggingReporterTest.php new file mode 100644 index 000000000..dc7c490d2 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/LoggingReporterTest.php @@ -0,0 +1,31 @@ +createMock(NullLogger::class); + $span = $this->createMock(Span::class); + + $reporter = new LoggingReporter($logger); + + $logger->expects($this->once()) + ->method('debug') + ->with($this->stringStartsWith('Reporting span')); + + $reporter->reportSpan($span); + $reporter->close(); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/NullReporterTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/NullReporterTest.php new file mode 100644 index 000000000..e6a66cb8a --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/NullReporterTest.php @@ -0,0 +1,29 @@ +createMock(Span::class); + + $reporter = new NullReporter(); + + $reporter->reportSpan($span); + $reporter->close(); + + // Only needed to avoid PhpUnit message: "This test did not perform any assertions" + $this->assertTrue(true); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/RemoteReporterTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/RemoteReporterTest.php new file mode 100644 index 000000000..0b85f06d0 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Reporter/RemoteReporterTest.php @@ -0,0 +1,46 @@ +transport = $this->createMock(UdpSender::class); + $this->reporter = new RemoteReporter($this->transport); + } + + /** @test */ + public function shouldReportSpan() + { + /** @var Span|\PHPUnit\Framework\MockObject\MockObject $span */ + $span = $this->createMock(Span::class); + + $this->transport->expects($this->once())->method('append')->with($span); + + $this->reporter->reportSpan($span); + } + + /** @test */ + public function shouldCloseReporter() + { + $this->transport->expects($this->once())->method('flush'); + $this->transport->expects($this->once())->method('close'); + + $this->reporter->close(); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sampler/ConstSamplerTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sampler/ConstSamplerTest.php new file mode 100644 index 000000000..85cb80504 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sampler/ConstSamplerTest.php @@ -0,0 +1,43 @@ +isSampled($traceId); + + $this->assertEquals($decision, $sampled); + $this->assertEquals([ + SAMPLER_TYPE_TAG_KEY => SAMPLER_TYPE_CONST, + SAMPLER_PARAM_TAG_KEY => $decision, + ], $tags); + + $sampler->close(); + } + + public function samplerProvider() + { + return [ + [true, 1], + [true, PHP_INT_MAX], + [false, 1], + [false, PHP_INT_MAX], + ]; + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sampler/ProbablisticSamplerTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sampler/ProbablisticSamplerTest.php new file mode 100644 index 000000000..2840ebf8c --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sampler/ProbablisticSamplerTest.php @@ -0,0 +1,68 @@ +isSampled($traceId); + + $this->assertEquals($decision, $sampled); + $this->assertEquals([ + SAMPLER_TYPE_TAG_KEY => SAMPLER_TYPE_PROBABILISTIC, + SAMPLER_PARAM_TAG_KEY => $rate, + ], $tags); + + $sampler->close(); + } + + public function samplerProvider() + { + return [ + [1.0, PHP_INT_MAX-1, true], + [0, 0, false], + [0.5, PHP_INT_MIN + 10, true], + [0.5, PHP_INT_MAX - 10, false], + ]; + } + + /** + * @test + * @dataProvider rateProvider + * @param mixed $rate + */ + public function shouldThrowOutOfBoundsExceptionInCaseOfInvalidRate($rate) + { + $this->expectException(OutOfBoundsException::class); + $this->expectExceptionMessage('Sampling rate must be between 0.0 and 1.0.'); + + new ProbabilisticSampler($rate); + } + + public function rateProvider() + { + return [ + [1.1], + [-0.1], + [PHP_INT_MAX], + [PHP_INT_MIN], + ]; + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sampler/RateLimitSamplerTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sampler/RateLimitSamplerTest.php new file mode 100644 index 000000000..4f6b8a632 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sampler/RateLimitSamplerTest.php @@ -0,0 +1,48 @@ +isSampled(); + list($sampled, $tags) = $sampler->isSampled(); + $this->assertEquals($decision, $sampled); + $this->assertEquals([ + SAMPLER_TYPE_TAG_KEY => SAMPLER_TYPE_RATE_LIMITING, + SAMPLER_PARAM_TAG_KEY => $maxTracesPerSecond, + ], $tags); + + $sampler->close(); + } + + public function maxRateProvider() + { + return [ + [1000000, true], + [1, false], + [0, false], + ]; + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/ScopeManagerTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/ScopeManagerTest.php new file mode 100644 index 000000000..43a303642 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/ScopeManagerTest.php @@ -0,0 +1,49 @@ +scopeManager = new ScopeManager(); + } + + function testActivate() + { + $span = $this->createMock(Span::class); + + $scope = $this->scopeManager->activate($span, true); + + $this->assertEquals($scope->getSpan(), $span); + } + + function testAbleGetActiveScope() + { + $span = $this->createMock(Span::class); + + $this->assertNull($this->scopeManager->getActive()); + $scope = $this->scopeManager->activate($span, false); + + $this->assertEquals($scope, $this->scopeManager->getActive()); + } + + function testScopeClosingDeactivates() + { + $span = $this->createMock(Span::class); + + $scope = $this->scopeManager->activate($span, false); + $scope->close(); + + $this->assertNull($this->scopeManager->getActive()); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/ScopeTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/ScopeTest.php new file mode 100644 index 000000000..e36a8de3d --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/ScopeTest.php @@ -0,0 +1,58 @@ +scopeManager = $this->createMock(ScopeManager::class); + $this->span = $this->createMock(Span::class); + } + + function testCloseDoNotFinishSpanOnClose() + { + $scope = new Scope($this->scopeManager, $this->span, false); + + $this->scopeManager->method('getActive')->willReturn($scope); + $this->scopeManager->expects($this->once())->method('getActive'); + $this->span->expects($this->never())->method('finish'); + $this->scopeManager->expects($this->once())->method('setActive'); + + $scope->close(); + } + + function testCloseFinishSpanOnClose() + { + $scope = new Scope($this->scopeManager, $this->span, true); + + $this->scopeManager->method('getActive')->willReturn($scope); + $this->scopeManager->expects($this->once())->method('getActive'); + $this->span->expects($this->once())->method('finish'); + $this->scopeManager->expects($this->once())->method('setActive'); + + $scope->close(); + } + + function testGetSpan() + { + $scope = new Scope($this->scopeManager, $this->span, false); + + $this->assertEquals($this->span, $scope->getSpan()); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sender/JaegerThriftSenderTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sender/JaegerThriftSenderTest.php new file mode 100644 index 000000000..5bd6d0a7b --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sender/JaegerThriftSenderTest.php @@ -0,0 +1,126 @@ +createMock(Tracer::class); + $tracer->method('getIpAddress')->willReturn(''); + $tracer->method('getServiceName')->willReturn(''); + + $this->tracer = $tracer; + + $context = $this->createMock(SpanContext::class); + $this->context = $context; + } + + public function testFlush(): void + { + + $span = $this->createMock(Span::class); + $span->method('getOperationName')->willReturn('dummy-operation'); + $span->method('getTracer')->willReturn($this->tracer); + $span->method('getContext')->willReturn($this->context); + + $client = $this->createMock(AgentClient::class); + $sender = new JaegerSender($client); + $sender->setMaxBufferLength(64000); + + $client + ->expects(self::exactly(1)) + ->method('emitBatch'); + + $sender->append($span); + $sender->append($span); + $sender->append($span); + + self::assertEquals(3, $sender->flush()); + } + + public function testEmitBatch() { + $client = $this->createMock(AgentClient::class); + $sender = new JaegerSender($client); + $sender->setMaxBufferLength(64000); + + $span = $this->createMock(Span::class); + $span->method('getOperationName')->willReturn('dummy-operation'); + $span->method('getTracer')->willReturn($this->tracer); + $span->method('getContext')->willReturn($this->context); + + $client + ->expects($this->once()) + ->method('emitBatch') + ->with($this->callback(function ($batch) { + /** @var Batch $batch */ + $this->assertInstanceOf(Batch::class, $batch); + $this->assertCount(1, $batch->spans); + + /** @var \Jaeger\Thrift\Span $span */ + $span = $batch->spans[0]; + $this->assertInstanceOf(\Jaeger\Thrift\Span::class, $span); + $this->assertSame("dummy-operation", $span->operationName); + + return true; + + })); + + $sender->append($span); + $this->assertEquals(1, $sender->flush()); + } + + public function testMaxBufferLength() { + $tracer = $this->createMock(Tracer::class); + $tracer->method('getIpAddress')->willReturn(''); + $tracer->method('getServiceName')->willReturn(''); + + $context = $this->createMock(SpanContext::class); + + $span = $this->createMock(Span::class); + $span->method('getOperationName')->willReturn('dummy-operation'); + $span->method('getTracer')->willReturn($tracer); + $span->method('getContext')->willReturn($context); + + $client = $this->createMock(AgentClient::class); + + $mockBuilder = $this->getMockBuilder(JaegerSender::class); + $mockMethods = ['emitJaegerBatch']; + if (method_exists($mockBuilder, "onlyMethods")) { + $mockBuilder = $mockBuilder->onlyMethods($mockMethods); + } else { + $mockBuilder = $mockBuilder->setMethods($mockMethods); + } + $sender = $mockBuilder->setConstructorArgs([$client])->getMock(); + $sender->setMaxBufferLength(800); + $sender->expects(self::exactly(2)) + ->method('emitJaegerBatch') + ->withConsecutive( + [self::countOf(2)], + [self::countOf(1)] + ); + + // jaeger batch overhead parameter = 512 + $sender->append($span); // 512 + 143 < 800 - chunk 1 + $sender->append($span); // 512 + 143*2 => 798 < 800 - chunk 1 + $sender->append($span); // 512 + 143*3 > 800 - chunk 2 + + self::assertEquals(3, $sender->flush()); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sender/UdpSenderTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sender/UdpSenderTest.php new file mode 100644 index 000000000..9011d00e3 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/Sender/UdpSenderTest.php @@ -0,0 +1,116 @@ +client = $this->createMock(AgentClient::class); + $this->sender = new UdpSender($this->client, 64000); + } + + public function testMaxBufferLength(): void + { + $tracer = $this->createMock(Tracer::class); + $tracer->method('getIpAddress')->willReturn(''); + $tracer->method('getServiceName')->willReturn(''); + + $context = $this->createMock(SpanContext::class); + + $span = $this->createMock(Span::class); + $span->method('getOperationName')->willReturn('dummy-operation'); + $span->method('getTracer')->willReturn($tracer); + $span->method('getContext')->willReturn($context); + + $sender = new UdpSender($this->client, 100); + + $this->client + ->expects(self::exactly(2)) + ->method('emitZipkinBatch') + ->withConsecutive( + [self::countOf(2)], + [self::countOf(1)] + ); + + // one span has a length of ~25 + $sender->append($span); // 30 + 25 < 100 - chunk 1 + $sender->append($span); // 30 + 25 * 2 < 100 - chunk 1 + $sender->append($span); // 30 + 25 * 3 > 100 - chunk 2 + + self::assertEquals(3, $sender->flush()); + } + + public function testFlush(): void + { + $this->assertEquals(0, $this->sender->flush()); + + $logTimeStamp = (int) (microtime(true) * 1000000); + + $tracer = $this->createMock(Tracer::class); + $tracer->method('getIpAddress')->willReturn(''); + $tracer->method('getServiceName')->willReturn(''); + $context = $this->createMock(SpanContext::class); + $span = $this->createMock(Span::class); + $span->method('getTracer')->willReturn($tracer); + $span->method('getContext')->willReturn($context); + $span + ->expects($this->atLeastOnce()) + ->method('getLogs') + ->willReturn([ + [ + 'timestamp' => $logTimeStamp, + 'fields' => [ + 'foo' => 'bar', + ], + ], + ]); + + $this->client + ->expects($this->once()) + ->method('emitZipkinBatch') + ->with($this->callback(function ($spans) use ($logTimeStamp) { + $this->assertCount(1, $spans); + + /* @var $annotation ZipkinSpan */ + $span = $spans[0]; + $this->assertInstanceOf(ZipkinSpan::class, $span); + $this->assertCount(1, $span->annotations); + + /* @var $annotation ZipkinAnnotation */ + $annotation = $span->annotations[0]; + $this->assertInstanceOf(ZipkinAnnotation::class, $annotation); + $this->assertSame($logTimeStamp, $annotation->timestamp); + $this->assertSame( + json_encode([ + 'foo' => 'bar', + ]), + $annotation->value + ); + + return true; + })); + + $this->sender->append($span); + $this->assertEquals(1, $this->sender->flush()); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/SpanContextTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/SpanContextTest.php new file mode 100644 index 000000000..998061088 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/SpanContextTest.php @@ -0,0 +1,37 @@ +assertTrue($ctx->isDebugIdContainerOnly()); + $this->assertEquals($ctx->getDebugId(), 'value1'); + + $ctx = new SpanContext(1, 2, 3, 1); + $this->assertFalse($ctx->isDebugIdContainerOnly()); + } + + /** + * @dataProvider contextDataProvider + */ + public function testBaggageInit($traceId, $spanId, $parentId, $flags, $baggage, $expected) + { + $ctx = new SpanContext($traceId, $spanId, $parentId, $flags, $baggage); + $this->assertEquals($expected, $ctx->getBaggage()); + } + + public function contextDataProvider() + { + return [ + [null, null, null, null, [], []], + [null, null, null, null, null, []], + [null, null, null, null, ['key' => 'val'], ['key' => 'val']], + ]; + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/SpanTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/SpanTest.php new file mode 100644 index 000000000..d23879680 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/SpanTest.php @@ -0,0 +1,293 @@ +tracer = new Tracer('test-service', new NullReporter, new ConstSampler); + $this->context = new SpanContext(0, 0,0, SAMPLED_FLAG); + } + + /** + * {@inheritdoc} + */ + protected function tearDown(): void + { + $this->tracer = null; + $this->context = null; + } + + /** @test */ + public function shouldProperlyInitializeAtConstructTime(): void + { + $tags = [ + 'foo-1' => 'test-component-1', + 'foo-2' => 'test-component-2', + 'foo-3' => 'test-component-3', + ]; + + $span = new Span($this->context, $this->tracer, 'test-operation', $tags); + + $this->assertEquals( 3, count($span->getTags())); + $this->assertEquals($this->tracer, $span->getTracer()); + $this->assertEquals(false, $span->isDebug()); + $this->assertEquals(null, $span->getEndTime()); + } + + /** @test */ + public function shouldSetComponentThroughTag(): void + { + $span = new Span($this->context, $this->tracer, 'test-operation'); + + $span->setTag('component', 'libredis'); + + $spanReflection = new \ReflectionClass(Span::class); + $component = $spanReflection->getProperty('component'); + $component->setAccessible(true); + + $this->assertEquals( 0, count($span->getTags())); + $this->assertEquals( 'libredis', $component->getValue($span)); + $this->assertEquals( 'libredis', $span->getComponent()); + } + + /** @test */ + public function shouldSetTags(): void + { + $span = new Span($this->context, $this->tracer, 'test-operation'); + + $this->assertEquals( 0, count($span->getTags())); + + $span->setTags([ + 'foo-1' => 'test-component-1', + 'foo-2' => 'test-component-2', + 'foo-3' => 'test-component-3', + ]); + + $this->assertEquals( 3, count($span->getTags())); + } + + /** @test */ + public function shouldSetDifferentTypeOfTags() { + $span = new Span($this->context, $this->tracer, 'test-operation'); + + $this->assertEquals( 0, count($span->getTags())); + + $span->setTags([ + 'tag-bool1' => true, + 'tag-bool2' => false, + 'tag-int' => 1234567, + 'tag-float' => 1.23456, + 'tag-string' => "hello-world" + ]); + + $tags = array_values($span->getTags()); + $this->assertEquals( 5, count($tags)); + + $index = 0; + $this->assertTrue($tags[$index]->annotation_type === AnnotationType::BOOL); + $this->assertTrue($tags[$index]->value === true); + $this->assertTrue($tags[$index]->key === 'tag-bool1'); + $index++; + + $this->assertTrue($tags[$index]->annotation_type === AnnotationType::BOOL); + $this->assertTrue($tags[$index]->value === false); + $this->assertTrue($tags[$index]->key === 'tag-bool2'); + $index++; + + $this->assertTrue($tags[$index]->annotation_type === AnnotationType::I64); + $this->assertTrue($tags[$index]->value === 1234567); + $this->assertTrue($tags[$index]->key === 'tag-int'); + $index++; + + $this->assertTrue($tags[$index]->annotation_type === AnnotationType::DOUBLE); + $this->assertTrue($tags[$index]->value === 1.23456); + $this->assertTrue($tags[$index]->key === 'tag-float'); + $index++; + + $this->assertTrue($tags[$index]->annotation_type === AnnotationType::STRING); + $this->assertTrue($tags[$index]->value === "hello-world"); + $this->assertTrue($tags[$index]->key === 'tag-string'); + } + + /** @test */ + public function shouldOverwriteTheSameTag(): void + { + // Given + $span = new Span($this->context, $this->tracer, 'test-operation'); + + // When + $span->setTag('foo', 'test-component-1'); + $span->setTag('foo', 'test-component-2'); + + // Then + $this->assertEquals( 1, count($span->getTags())); + $this->assertEquals( 'test-component-2', $span->getTags()['foo']->value); + } + /** @test */ + public function shouldAddLogRecordsToTheSpan(): void + { + $span = new Span($this->context, $this->tracer, 'test-operation'); + + $fields01 = [ + 'event' => 'error', + 'message' => 'dummy error message', + ]; + $fields02 = [ + 'foo' => 'bar', + ]; + + $dateTime01 = new \DateTime('+5 seconds'); + $dateTime02 = $dateTime01->getTimestamp(); + $dateTime03 = microtime(true) + 5; + + $span->log($fields01, $dateTime01); + $span->log($fields02, $dateTime01->getTimestamp()*1000000); + $span->log($fields02, $dateTime03); + $span->log($fields02); + + $logs = $span->getLogs(); + + $this->assertCount(4, $logs); + + $this->assertIsInt($logs[0]['timestamp']); + $this->assertEquals((int)($dateTime01->format('U.u')*1000000), $logs[0]['timestamp']); + $this->assertSame($fields01, $logs[0]['fields']); + + $this->assertIsInt($logs[1]['timestamp']); + $this->assertSame($dateTime02*1000000, $logs[1]['timestamp']); + $this->assertSame($fields02, $logs[1]['fields']); + + $this->assertIsInt($logs[2]['timestamp']); + $this->assertSame((int) ($dateTime03 * 1000000), $logs[2]['timestamp']); + $this->assertSame($fields02, $logs[2]['fields']); + + $this->assertIsInt($logs[3]['timestamp']); + $this->assertSame($fields02, $logs[3]['fields']); + } + + /** @test */ + public function timingDefaultTimes(): void + { + $span = new Span($this->context, $this->tracer, 'test-operation'); + $span->finish(); + + $this->assertEquals(0.0, round(($span->getEndTime() - $span->getStartTime()) / 1000000)); + } + + /** @test */ + public function timingSetStartTimeAsDateTime(): void + { + $span = new Span($this->context, $this->tracer, 'test-operation', [], new \DateTime('-2 seconds')); + $span->finish(); + + $this->assertSpanDuration($span); + } + + /** @test */ + public function timingSetEndTimeAsDateTime(): void + { + $span = new Span($this->context, $this->tracer, 'test-operation'); + + $endTime = new \DateTime('+2 seconds'); + // add microseconds because php < 7.1 has a bug + // https://bugs.php.net/bug.php?id=48225 + if (version_compare(phpversion(), '7.1', '<')) { + list($usec) = explode(' ', microtime()); + $endTime = \DateTime::createFromFormat('U.u', $endTime->format('U')+$usec); + } + $span->finish($endTime); + + $this->assertSpanDuration($span); + } + + /** @test */ + public function timingSetStartTimeAsInt(): void + { + $span = new Span($this->context, $this->tracer, 'test-operation', [], (int) round((microtime(true) - 2) * 1000000)); + $span->finish(); + + $this->assertSpanDuration($span); + } + + /** @test */ + public function timingSetEndTimeAsInt(): void + { + $span = new Span($this->context, $this->tracer, 'test-operation'); + $span->finish((int) round((microtime(true) + 2) * 1000000)); + + $this->assertSpanDuration($span); + } + + /** @test */ + public function timingSetStartTimeAsFloat(): void + { + $span = new Span($this->context, $this->tracer, 'test-operation', [], microtime(true) - 2); + $span->finish(); + + $this->assertSpanDuration($span); + } + + /** @test */ + public function timingSetEndTimeAsFloat(): void + { + $span = new Span($this->context, $this->tracer, 'test-operation'); + $span->finish(microtime(true) + 2); + + $this->assertSpanDuration($span); + } + + /** @test */ + public function timingSetMixedTimes(): void + { + $span = new Span($this->context, $this->tracer, 'test-operation', [], new \DateTime()); + $span->finish(microtime(true) + 2); + + $this->assertSpanDuration($span); + } + + protected function assertSpanDuration(Span $span): void + { + $this->assertEquals(2, (int)(($span->getEndTime() - $span->getStartTime()) / 1000000)); + } + + /** @test */ + public function invalidStartTime(): void + { + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('Time should be one of the types int|float|DateTime|null, got string.'); + $span = new Span($this->context, $this->tracer, 'test-operation', [], 'string'); + } + + /** @test */ + public function invalidEndTime(): void + { + $span = new Span($this->context, $this->tracer, 'test-operation'); + $this->expectException(\InvalidArgumentException::class); + $this->expectExceptionMessage('Time should be one of the types int|float|DateTime|null, got array.'); + $span->finish([]); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/ThriftUdpTransportTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/ThriftUdpTransportTest.php new file mode 100644 index 000000000..abc4e32aa --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/ThriftUdpTransportTest.php @@ -0,0 +1,166 @@ +logger = new StackLogger(); + $this->transport = new ThriftUdpTransport('127.0.0.1', 12345, $this->logger); + } + + public function testisOpenWhenOpen() + { + $this->assertEquals($this->logger->getMessagesCount(), 0); + $this->assertTrue($this->transport->isOpen()); + $this->assertEquals($this->logger->getMessagesCount(), 0); + } + + public function testisOpenWhenClosed() + { + $this->assertEquals($this->logger->getMessagesCount(), 0); + $this->transport->close(); + $this->assertFalse($this->transport->isOpen()); + $this->assertEquals($this->logger->getMessagesCount(), 0); + } + + public function testClose() + { + $this->assertEquals($this->logger->getMessagesCount(), 0); + $this->transport->close(); + + $this->assertEquals($this->logger->getMessagesCount(), 0); + $this->transport->write('hello'); + $this->assertEquals($this->logger->getMessagesCount(), 1); + $this->assertEquals($this->logger->getLastMessage(), 'transport is closed'); + $this->assertEquals($this->logger->getMessagesCount(), 0); + } + + public function testDoubleClose() + { + $this->assertEquals($this->logger->getMessagesCount(), 0); + $this->transport->close(); + $this->assertEquals($this->logger->getMessagesCount(), 0); + $this->transport->close(); + $this->assertEquals($this->logger->getMessagesCount(), 1); + $this->assertEquals( + $this->logger->getLastMessage(), + "can't close empty socket" + ); + } + + public function testException() + { + $this->assertEquals($this->logger->getMessagesCount(), 0); + $this->transport->open(); + $this->assertEquals($this->logger->getMessagesCount(), 0); + + $this->transport->write(str_repeat("some string", 10000)); + + $this->assertEquals($this->logger->getMessagesCount(), 1); + $msg = $this->logger->getLastMessage(); + $pattern = "/socket_write failed: \[code - \d+\] Message too long/"; + + if (method_exists($this, "assertMatchesRegularExpression")) { + $this->assertMatchesRegularExpression($pattern, $msg); + } else { + $this->assertRegExp($pattern, $msg); + } + } + + public function testProtocolVersionIPv4() + { + $config = new Config([ + Config::IP_VERSION => Config::IPV4 + ], "testServiceName"); + + $transport = new ThriftUdpTransport('127.0.0.1', 12345, $this->logger, $config); + + $reflectionTransport = new \ReflectionClass($transport); + $ipProtocolVersionMethod = $reflectionTransport->getMethod("ipProtocolVersion"); + $ipProtocolVersionMethod->setAccessible(true); + + $this->assertEquals(Config::IPV4, $ipProtocolVersionMethod->invoke($transport)); + } + + public function testProtocolVersionIPv6() + { + $config = new Config([ + Config::IP_VERSION => Config::IPV6 + ], "testServiceName"); + + $transport = new ThriftUdpTransport('127.0.0.1', 12345, $this->logger, $config); +// + $reflectionTransport = new \ReflectionClass($transport); + $ipProtocolVersionMethod = $reflectionTransport->getMethod("ipProtocolVersion"); + $ipProtocolVersionMethod->setAccessible(true); +// + $this->assertEquals(Config::IPV6, $ipProtocolVersionMethod->invoke($transport)); + } + + public function testProtocolVersionDefault() + { + $config = new Config([ + ], "testServiceName"); + + $transport = new ThriftUdpTransport('127.0.0.1', 12345, $this->logger, $config); + + $reflectionTransport = new \ReflectionClass($transport); + $ipProtocolVersionMethod = $reflectionTransport->getMethod("ipProtocolVersion"); + $ipProtocolVersionMethod->setAccessible(true); + + $this->assertEquals(Config::IPV4, $ipProtocolVersionMethod->invoke($transport)); + } + + public function testCreateSocket() + { + $transport = $this->getMockBuilder(ThriftUdpTransport::class) + ->disableOriginalConstructor() + ->getMock(); + + $reflectionClass = new \ReflectionClass($transport); + $method = $reflectionClass->getMethod("setLogger"); + $method->setAccessible(true); + $method->invokeArgs($transport, [$this->logger]); + + $method = $reflectionClass->getMethod("createSocket"); + $method->setAccessible(true); + $res = $method->invokeArgs($transport, [Config::IPV6]); + + $this->assertNotFalse($res); + + + $transport = $this->getMockBuilder(ThriftUdpTransport::class) + ->disableOriginalConstructor() + ->getMock(); + + $reflectionClass = new \ReflectionClass($transport); + $method = $reflectionClass->getMethod("setLogger"); + $method->setAccessible(true); + $method->invokeArgs($transport, [$this->logger]); + + $method = $reflectionClass->getMethod("createSocket"); + $method->setAccessible(true); + $res = $method->invokeArgs($transport, [Config::IPV4]); + + $this->assertNotFalse($res); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/TracerTest.php b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/TracerTest.php new file mode 100644 index 000000000..3e7b4c05f --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/Jaeger/TracerTest.php @@ -0,0 +1,262 @@ +scopeManager = $this->createMock(ScopeManager::class); + $this->sampler = $this->createMock(SamplerInterface::class); + $this->reporter = $this->createMock(ReporterInterface::class); + $this->logger = new NullLogger(); + + $this->tracer = new Tracer($this->serviceName, $this->reporter, $this->sampler, true, $this->logger, $this->scopeManager); + } + + public function testStartSpan(): void + { + $span = $this->tracer->startSpan($this->operationName); + + $this->assertEquals($this->operationName, $span->getOperationName()); + } + + public function testStartActiveSpan(): void + { + $tracer = new Tracer($this->serviceName, $this->reporter, $this->sampler); + + $tracer->startActiveSpan('test-operation1'); + $this->assertEquals('test-operation1', $tracer->getActiveSpan()->getOperationName()); + + $scope = $tracer->startActiveSpan('test-operation2'); + $this->assertEquals('test-operation2', $tracer->getActiveSpan()->getOperationName()); + $scope->close(); + + $this->assertEquals('test-operation1', $tracer->getActiveSpan()->getOperationName()); + } + + /** @test */ + public function shouldAddConfiguredTagsToStartedSpanWhenSampled(): void + { + $this->sampler->expects($this->any()) + ->method('isSampled') + ->willReturn([true, []]); + + $tags = [ + 'bar' => 'a-value', + 'other.tag' => 'foo', + ]; + + $tracer = new Tracer( + $this->serviceName, + $this->reporter, + $this->sampler, + true, + $this->logger, + $this->scopeManager, + TRACE_ID_HEADER, + BAGGAGE_HEADER_PREFIX, + DEBUG_ID_HEADER_KEY, + $tags + ); + + $span = $tracer->startSpan('test-span'); + $spanTags = $span->getTags(); + + foreach ($tags as $name => $value) { + $this->assertArrayHasKey($name, $spanTags, "Tag '$name' should be set on span"); + $this->assertEquals($value, $spanTags[$name]->value, "Tag '$name' should have configured value"); + } + } + + /** @test */ + public function shouldAddNoConfiguredTagsToStartedSpanWhenNotSampled(): void + { + $this->sampler->expects($this->any()) + ->method('isSampled') + ->willReturn([false, []]); + + $tags = [ + 'bar' => 'a-value', + 'other.tag' => 'foo', + ]; + + $tracer = new Tracer( + $this->serviceName, + $this->reporter, + $this->sampler, + true, + $this->logger, + $this->scopeManager, + TRACE_ID_HEADER, + BAGGAGE_HEADER_PREFIX, + DEBUG_ID_HEADER_KEY, + $tags + ); + + $span = $tracer->startSpan('test-span'); + + $this->assertEquals([], $span->getTags(), 'No tags should be set when not sampled'); + } + + /** @test */ + public function shouldThrowExceptionOnInvalidFormat(): void + { + $spanContext = new SpanContext(0, 0, 0, 0); + $carrier = []; + + $this->expectException(UnsupportedFormatException::class); + $this->expectExceptionMessage('The format "bad-format" is not supported.'); + + $this->tracer->inject($spanContext, 'bad-format', $carrier); + $this->assertSame([], $carrier); + } + + /** @test */ + public function shouldNotThrowExceptionOnInvalidContext(): void + { + $spanContext = new NoopSpanContext(); + $carrier = []; + + $this->tracer->inject($spanContext, ZIPKIN_SPAN_FORMAT, $carrier); + $this->assertSame([], $carrier); + } + + /** @test */ + public function shouldInjectSpanContextToCarrier(): void + { + $spanContext = new SpanContext(0, 0, 0, 0); + $carrier = []; + + $this->tracer->inject($spanContext, TEXT_MAP, $carrier); + + $this->assertCount(1, $carrier); + $this->assertEquals('0:0:0:0', $carrier[TRACE_ID_HEADER]); + } + + /** @test */ + public function shouldThrowExceptionOnExtractInvalidFormat(): void + { + $this->expectException(UnsupportedFormatException::class); + $this->expectExceptionMessage('The format "bad-format" is not supported.'); + + $this->tracer->extract('bad-format', []); + } + + /** @test */ + public function shouldNotThrowExceptionOnExtractFromMalformedState(): void + { + $this->assertNull($this->tracer->extract(TEXT_MAP, ['uber-trace-id' => ''])); + } + + /** @test */ + public function shouldExtractSpanContextFromCarrier(): void + { + $carrier = ['uber-trace-id' => '32834e4115071776:f7802330248418d:f123456789012345:1']; + + $this->assertInstanceOf(SpanContext::class, $this->tracer->extract(TEXT_MAP, $carrier)); + } + + public function testGetScopeManager() + { + $this->assertEquals($this->scopeManager, $this->tracer->getScopeManager()); + } + + public function testGetActiveSpan(): void + { + $span = $this->createMock(Span::class); + $scope = $this->createMock(Scope::class); + $scope->expects($this->once())->method('getSpan')->willReturn($span); + + $this->scopeManager->expects($this->once())->method('getActive')->willReturn($scope); + + $this->assertEquals($span, $this->tracer->getActiveSpan()); + } + + public function testGetActiveSpanNull(): void + { + $this->scopeManager->expects($this->once())->method('getActive')->willReturn(null); + + $this->assertEquals(null, $this->tracer->getActiveSpan()); + } + + public function testFlush(): void + { + $this->reporter->expects($this->once())->method('close'); + + $this->tracer->flush(); + } + + /** @test */ + public function shouldHandleEmptyHostName(): void + { + $tracer = new \ReflectionClass(Tracer::class); + + $getHostByName = $tracer->getMethod('getHostByName'); + $getHostByName->setAccessible(true); + + $stub = $this->getMockBuilder(Tracer::class) + ->disableOriginalConstructor() + ->getMockForAbstractClass(); + + $logger = $tracer->getProperty('logger'); + $logger->setAccessible(true); + $logger->setValue($stub, $this->logger); + + $this->assertEquals('127.0.0.1', $getHostByName->invokeArgs($stub, [null])); + } +} diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/README.md b/vendor/jonahgeorge/jaeger-client-php/tests/README.md new file mode 100644 index 000000000..aa828030f --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/README.md @@ -0,0 +1,48 @@ +# Jaeger Bindings for PHP OpenTracing API: Unit Tests + +Welcome to the Jaeger Testing Suite. + +This folder includes all the unit tests that test Jaeger components, ensuring that you enjoy a bug free library. + +## Current PHP Support + +| version | status | +|---------|--------| +| 7.0 | ✔ | +| 7.1 | ✔ | +| 7.2 | ✔ | + + +## Getting Started + +This testing suite uses [Travis CI](https://travis-ci.org/) for each run. +Every commit pushed to this repository will queue a build into the continuous integration service and will run all tests +to ensure that everything is going well and the project is stable. + +The testing suite can be run on your own machine. The main dependency is [PHPUnit](https://phpunit.de/) +which can be installed using [Composer](https://getcomposer.org/): + +```bash +# run this command from project root +$ composer install +``` + +Then run the tests by calling command from the terminal as follows: + +```bash +$ composer test +``` + +## Run Tests for Supported Versions + +There is also an ability to run tests for different PHP versions. To achieve this we offer use +[docker](https://docs.docker.com/install/)-based approach: + +```bash + +$ docker run --rm -it -v $(pwd):/usr/app php:7.0 ./usr/app/tests/php-test.sh + +$ docker run --rm -it -v $(pwd):/usr/app php:7.1 ./usr/app/tests/php-test.sh + +$ docker run --rm -it -v $(pwd):/usr/app php:7.2 ./usr/app/tests/php-test.sh +``` diff --git a/vendor/jonahgeorge/jaeger-client-php/tests/php-test.sh b/vendor/jonahgeorge/jaeger-client-php/tests/php-test.sh new file mode 100644 index 000000000..99a522856 --- /dev/null +++ b/vendor/jonahgeorge/jaeger-client-php/tests/php-test.sh @@ -0,0 +1,64 @@ +#!/usr/bin/env bash + +# trace ERR through pipes +set -o pipefail + +# trace ERR through 'time command' and other functions +set -o errtrace + +# set -u : exit the script if you try to use an uninitialised variable +set -o nounset + +# set -e : exit the script if any statement returns a non-true return value +set -o errexit + +# to avoid message: +# "Do not run Composer as root/super user! See https://getcomposer.org/root for details" +export COMPOSER_ALLOW_SUPERUSER=1 + +export TERM=xterm-256color + +echo "[INFO]: Install OS dependencies..." +apt-get update -yq > /dev/null 2>&1 +apt-get install -yq git wget unzip zip > /dev/null 2>&1 + +echo "[INFO]: Install PHP extensions..." +docker-php-ext-install bcmath sockets > /dev/null 2>&1 +pecl install hrtime > /dev/null 2>&1 +docker-php-ext-enable hrtime > /dev/null 2>&1 + +echo "[INFO]: Install Xdebug to enable code coverage..." +pecl install xdebug > /dev/null 2>&1 +docker-php-ext-enable xdebug > /dev/null 2>&1 + +cd /tmp + +echo "[INFO]: Install Composer..." +EXPECTED_SIGNATURE="$(wget -q -O - https://composer.github.io/installer.sig)" +php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" +ACTUAL_SIGNATURE="$(php -r "echo hash_file('SHA384', 'composer-setup.php');")" + +if [ "$EXPECTED_SIGNATURE" != "$ACTUAL_SIGNATURE" ]; then + >&2 echo '[ERROR]: Invalid installer signature' + rm composer-setup.php + exit 1 +fi + +php composer-setup.php --quiet +rm composer-setup.php + +# this step is required to be able to overwrite composer.lock +cp -R /usr/app /usr/tests + +cd /usr/tests +rm -f composer.lock + +echo "[INFO]: Install library dependencies..." +php /tmp/composer.phar install \ + --no-interaction \ + --no-ansi \ + --no-progress \ + --no-suggest + +echo -e "[INFO]: Run tests...\n" +/tmp/composer.phar test -- cgit v1.2.3