From ae09c6b6246d40e1f329619f11e69d1160f6bb25 Mon Sep 17 00:00:00 2001 From: Devi A S L Date: Tue, 9 Feb 2021 17:17:33 +0530 Subject: [PATCH 1/3] provide support for multiple processes while exporting spans implementation is based on prefixes of the span names Reason: we use jaeger exporter with OpenCensus php library and there is [no direct support](https://docs.google.com/spreadsheets/d/1I-rP_H9UtgqwRM863hVMTHH6AEsJbPCPXWPRy8lVzzw/edit#gid=0) for "SameProcessAsParentSpan" in Jaeger where as OpenCensus recommends it. [Source](https://github.com/jaegertracing/jaeger/issues/1770#issuecomment-529225117) --- src/JaegerExporter.php | 64 ++++++++++++++++++++++++++++++++++++------ 1 file changed, 55 insertions(+), 9 deletions(-) diff --git a/src/JaegerExporter.php b/src/JaegerExporter.php index bb995ed..74b3b4c 100644 --- a/src/JaegerExporter.php +++ b/src/JaegerExporter.php @@ -58,6 +58,11 @@ class JaegerExporter implements ExporterInterface */ private $spanConverter; + /** + * @var array + */ + private $tags; + /** * Create a new Jaeger Exporter. * @@ -82,11 +87,21 @@ public function __construct($serviceName, array $options = []) $this->host = $options['host']; $this->port = (int) $options['port']; $this->spanConverter = empty($options['spanConverter']) ? new SpanConverter() : $options['spanConverter']; - $this->process = new Process([ - 'serviceName' => $serviceName, - 'tags' => $this->spanConverter->convertTags($options['tags']) - ]); + $this->tags = $this->spanConverter->convertTags($options['tags']); $this->client = $options['client']; + + // if this option is passed, the spans with a particular prefix would be exported + // with that serviceName. + // eg. prefixServiceNameMap => ['PDO' => 'app_db', 'Predis' => 'app_redis']; + + if (array_key_exists('prefixServiceNameMap', $options)){ + $this->prefixServiceNameMap = $options['prefixServiceNameMap']; + } + else{ + $this->prefixServiceNameMap = []; + } + + $this->prefixServiceNameMap += ['_default_' => $serviceName]; } /** @@ -101,13 +116,44 @@ public function export(array $spans) return false; } + // create different span buckets for each prefix + $buckets = []; + foreach (array_keys($this->prefixServiceNameMap) as $prefix){ + $buckets[$prefix] = []; + } + + foreach ($spans as $s){ + $bucketed = false; + foreach (array_keys($buckets) as $prefix){ + // if span name starts with a particular prefix, put the span in that bucket + if (strpos($s->name, $prefix) === 0){ + $buckets[$prefix][] = $s; + $bucketed = true; + break; + } + } + if (!$bucketed){ + $buckets['_default_'][] = $s; + } + } + $client = $this->client ?: new UDPClient($this->host, $this->port); - $batch = new Batch([ - 'process' => $this->process, - 'spans' => array_map([$this->spanConverter, 'convertSpan'], $spans) - ]); - $client->emitBatch($batch); + foreach ($buckets as $prefix => $spanBucket){ + if (count($spanBucket) != 0){ + $process = new Process([ + 'serviceName' => $this->prefixServiceNameMap[$prefix], + 'tags' => $this->spanConverter->convertTags([$this->tags]) + ]); + + $batch = new Batch([ + 'process' => $process, + 'spans' => array_map([$this->spanConverter, 'convertSpan'], $spanBucket) + ]); + $client->emitBatch($batch); + } + } + return true; } } From dfdf91017afdc4210b9b637b5d9d09d01c63206a Mon Sep 17 00:00:00 2001 From: Devi A S L Date: Wed, 10 Feb 2021 11:07:20 +0530 Subject: [PATCH 2/3] fix tags --- src/JaegerExporter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/JaegerExporter.php b/src/JaegerExporter.php index 74b3b4c..93787a1 100644 --- a/src/JaegerExporter.php +++ b/src/JaegerExporter.php @@ -143,7 +143,7 @@ public function export(array $spans) if (count($spanBucket) != 0){ $process = new Process([ 'serviceName' => $this->prefixServiceNameMap[$prefix], - 'tags' => $this->spanConverter->convertTags([$this->tags]) + 'tags' => $this->tags ]); $batch = new Batch([ From 1115dff294bf357e620d9e6978a04c087d40ec30 Mon Sep 17 00:00:00 2001 From: Devi A S L Date: Thu, 11 Feb 2021 15:11:39 +0530 Subject: [PATCH 3/3] use public method rather than private var of SpanData --- src/JaegerExporter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/JaegerExporter.php b/src/JaegerExporter.php index 93787a1..2c14fed 100644 --- a/src/JaegerExporter.php +++ b/src/JaegerExporter.php @@ -126,7 +126,7 @@ public function export(array $spans) $bucketed = false; foreach (array_keys($buckets) as $prefix){ // if span name starts with a particular prefix, put the span in that bucket - if (strpos($s->name, $prefix) === 0){ + if (strpos($s->name(), $prefix) === 0){ $buckets[$prefix][] = $s; $bucketed = true; break;