· 5 years ago · May 14, 2020, 01:42 AM
1diff --git a/composer.json b/composer.json
2index 0c24262b2..9208029bf 100644
3--- a/composer.json
4+++ b/composer.json
5@@ -85,7 +85,9 @@
6 "zendframework/zendframework1": "1.12.20",
7 "acpmasquerade/sms-counter-php": "1.0.5",
8 "onelogin/php-saml": "dev-3.0.0-namespaceless",
9- "composer/semver": "^1.5"
10+ "composer/semver": "^1.5",
11+ "open-telemetry/opentelemetry": "dev-master",
12+ "openzipkin/zipkin": "^1.3"
13 },
14 "require-dev": {
15 "davedevelopment/phpmig": "^1.1",
16diff --git a/composer.lock b/composer.lock
17index 920467bc3..8db582fca 100644
18--- a/composer.lock
19+++ b/composer.lock
20@@ -4,7 +4,7 @@
21 "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
22 "This file is @generated automatically"
23 ],
24- "content-hash": "5c6fbc74d4c9821a6d038a949add7030",
25+ "content-hash": "bfd9f8c6c05da07fc751bb2018f6eab8",
26 "packages": [
27 {
28 "name": "acpmasquerade/sms-counter-php",
29@@ -2227,6 +2227,116 @@
30 ],
31 "time": "2018-03-07T14:03:46+00:00"
32 },
33+ {
34+ "name": "open-telemetry/opentelemetry",
35+ "version": "dev-master",
36+ "source": {
37+ "type": "git",
38+ "url": "https://github.com/open-telemetry/opentelemetry-php.git",
39+ "reference": "926f9116d783989aca2834021fa20caeaca249f8"
40+ },
41+ "dist": {
42+ "type": "zip",
43+ "url": "https://api.github.com/repos/open-telemetry/opentelemetry-php/zipball/926f9116d783989aca2834021fa20caeaca249f8",
44+ "reference": "926f9116d783989aca2834021fa20caeaca249f8",
45+ "shasum": ""
46+ },
47+ "require": {
48+ "ext-json": "*",
49+ "php": "^7.2"
50+ },
51+ "require-dev": {
52+ "composer/xdebug-handler": "^1.3",
53+ "friendsofphp/php-cs-fixer": "^2.16",
54+ "phan/phan": "^2.4",
55+ "phpunit/phpunit": "^7.5.16"
56+ },
57+ "type": "library",
58+ "autoload": {
59+ "psr-4": {
60+ "OpenTelemetry\\Trace\\": "api/Trace",
61+ "OpenTelemetry\\Sdk\\Internal\\": "sdk/Internal",
62+ "OpenTelemetry\\Sdk\\Trace\\": "sdk/Trace"
63+ }
64+ },
65+ "notification-url": "https://packagist.org/downloads/",
66+ "license": [
67+ "Apache-2.0"
68+ ],
69+ "authors": [
70+ {
71+ "name": "Bob Strecansky",
72+ "email": "bob.strecansky@gmail.com"
73+ },
74+ {
75+ "name": "Dmitry Krokhin",
76+ "email": "nekufa@gmail.com"
77+ },
78+ {
79+ "name": "Levi Morrison",
80+ "email": "levim@php.net"
81+ }
82+ ],
83+ "description": "OpenTelemetry makes robust, portable telemetry a built-in feature of cloud-native software.",
84+ "time": "2020-04-28T04:01:20+00:00"
85+ },
86+ {
87+ "name": "openzipkin/zipkin",
88+ "version": "1.3.5",
89+ "source": {
90+ "type": "git",
91+ "url": "https://github.com/openzipkin/zipkin-php.git",
92+ "reference": "7df3e2b5aead71711dd496eae300c6ff861ee690"
93+ },
94+ "dist": {
95+ "type": "zip",
96+ "url": "https://api.github.com/repos/openzipkin/zipkin-php/zipball/7df3e2b5aead71711dd496eae300c6ff861ee690",
97+ "reference": "7df3e2b5aead71711dd496eae300c6ff861ee690",
98+ "shasum": ""
99+ },
100+ "require": {
101+ "ext-curl": "*",
102+ "php": "^5.6 || ^7.0",
103+ "psr/http-message": "~1.0",
104+ "psr/log": "^1.0"
105+ },
106+ "require-dev": {
107+ "guzzlehttp/psr7": "^1.4",
108+ "jcchavezs/httptest": "~0.2",
109+ "phpunit/phpunit": "~5.7.19",
110+ "squizlabs/php_codesniffer": "3.*"
111+ },
112+ "type": "library",
113+ "autoload": {
114+ "psr-4": {
115+ "Zipkin\\": "./src/Zipkin/"
116+ },
117+ "files": [
118+ "./src/Zipkin/Propagation/Id.php",
119+ "./src/Zipkin/Timestamp.php",
120+ "./src/Zipkin/Kind.php",
121+ "./src/Zipkin/Tags.php",
122+ "./src/Zipkin/Annotations.php"
123+ ]
124+ },
125+ "notification-url": "https://packagist.org/downloads/",
126+ "license": [
127+ "MIT"
128+ ],
129+ "authors": [
130+ {
131+ "name": "José Carlos Chávez",
132+ "email": "jcchavezs@gmail.com"
133+ }
134+ ],
135+ "description": "A Zipkin instrumentation for PHP",
136+ "keywords": [
137+ "openzipkin",
138+ "tracing",
139+ "zipkin"
140+ ],
141+ "time": "2020-04-24T10:54:22+00:00"
142+ },
143 {
144 "name": "paragonie/random_compat",
145 "version": "v9.99.99",
146@@ -6887,6 +6997,7 @@
147 "stability-flags": {
148 "facebook/php-sdk": 0,
149 "onelogin/php-saml": 20,
150+ "open-telemetry/opentelemetry": 20,
151 "nowait/libphnowait": 20,
152 "jetbrains/phpstorm-stubs": 20
153 },
154@@ -6895,5 +7006,6 @@
155 "platform": {
156 "php": ">=7.2"
157 },
158- "platform-dev": []
159+ "platform-dev": [],
160+ "plugin-api-version": "1.1.0"
161 }
162diff --git a/env/businessAPI/account/checkForUpdates.php b/env/businessAPI/account/checkForUpdates.php
163index d77347a63..bb3c66d01 100644
164--- a/env/businessAPI/account/checkForUpdates.php
165+++ b/env/businessAPI/account/checkForUpdates.php
166@@ -2,9 +2,20 @@
167
168 use NW\App\Common\Model\ComponentRevisionCache;
169 use NW\Container;
170+use NW\YelpZipkinTracer;
171+use Zipkin\Kind;
172+use Zipkin\Tags;
173
174 /* require_once(dirname(__FILE__) . '/API/includes.php'); */
175
176+$tracer = YelpZipkinTracer::getTracer();
177+$span = $tracer->newTrace();
178+$span->setName(basename(__FILE__, '.php'));
179+$span->setKind(Kind\SERVER);
180+$span->tag(Tags\HTTP_PATH, '/api');
181+$span->start();
182+$tracer->openScope($span);
183+
184 connect();
185 $parameters = $_REQUEST;
186
187@@ -14,3 +25,6 @@ $result = $componentRevisionsCache->getRevisionNumbers();
188 $data = arrayToXML([$result], 'revisions');
189 sendXMLResponse('0', '', $data);
190 disconnect();
191+
192+$span->finish();
193+$tracer->flush();
194diff --git a/src/NW/App/Common/Model/ComponentRevisionCache.php b/src/NW/App/Common/Model/ComponentRevisionCache.php
195index f2bd69406..f34db3af2 100644
196--- a/src/NW/App/Common/Model/ComponentRevisionCache.php
197+++ b/src/NW/App/Common/Model/ComponentRevisionCache.php
198@@ -3,6 +3,7 @@
199 namespace NW\App\Common\Model;
200
201 use NW\Lib\Cache\NwCache;
202+use NW\YelpZipkinTracer;
203
204 class ComponentRevisionCache extends \ComponentRevisionsManager
205 {
206@@ -42,6 +43,12 @@ class ComponentRevisionCache extends \ComponentRevisionsManager
207
208 public function getRevisionNumbers()
209 {
210+ $tracer = YelpZipkinTracer::getTracer();
211+ $current = $tracer->getCurrentSpan();
212+ $span = $tracer->newChild($current->getContext());
213+ $span->setName('getRevisionNumbers');
214+ $span->start();
215+
216 $key = $this->cacheKey($this->biz_id);
217 $componentRevision = $this->cacheClient->fetch($key);
218
219@@ -51,6 +58,7 @@ class ComponentRevisionCache extends \ComponentRevisionsManager
220 $this->cacheClient->store($key, $componentRevision, $this->getExpiry());
221 }
222 }
223+ $span->finish();
224
225 return $componentRevision;
226 }
227diff --git a/src/NW/YelpTracer.php b/src/NW/YelpTracer.php
228new file mode 100644
229index 000000000..3c1770abd
230--- /dev/null
231+++ b/src/NW/YelpTracer.php
232@@ -0,0 +1,42 @@
233+<?php
234+
235+namespace NW;
236+
237+use OpenTelemetry\Sdk\Trace\AlwaysOnSampler;
238+use OpenTelemetry\Sdk\Trace\Attributes;
239+use OpenTelemetry\Sdk\Trace\SamplingResult;
240+use OpenTelemetry\Sdk\Trace\SimpleSpanProcessor;
241+use OpenTelemetry\Sdk\Trace\Tracer;
242+use OpenTelemetry\Sdk\Trace\ZipkinExporter;
243+use OpenTelemetry\Sdk\Trace\SpanContext;
244+
245+
246+class YelpTracer extends Tracer {
247+ // Hold the class instance.
248+ private static $instance = null;
249+
250+ // The constructor is private
251+ // to prevent initiation with outer code.
252+ private function __construct()
253+ {
254+ $spanContext = SpanContext::generate();
255+ $zipkinExporter = new ZipkinExporter(
256+ 'nowait-server',
257+ 'http://169.254.255.254:20060/api/v2/spans'
258+ );
259+ $processors = [new SimpleSpanProcessor($zipkinExporter)];
260+
261+ parent::__construct($processors, $spanContext);
262+ $sampler = new AlwaysOnSampler();
263+ }
264+
265+ public static function getTracer()
266+ {
267+ if (self::$instance == null)
268+ {
269+ self::$instance = new YelpTracer();
270+ }
271+
272+ return self::$instance;
273+ }
274+}
275diff --git a/src/NW/YelpZipkinTracer.php b/src/NW/YelpZipkinTracer.php
276new file mode 100644
277index 000000000..b9cc0b628
278--- /dev/null
279+++ b/src/NW/YelpZipkinTracer.php
280@@ -0,0 +1,43 @@
281+<?php
282+
283+namespace NW;
284+
285+use Zipkin\Annotation;
286+use Zipkin\Endpoint;
287+use Zipkin\Samplers\BinarySampler;
288+use Zipkin\TracingBuilder;
289+use Zipkin\Reporters\Http;
290+use Zipkin\Reporters\Http\CurlFactory;
291+
292+
293+class YelpZipkinTracer {
294+ // Hold the class instance.
295+ private static $instance = null;
296+ public $tracing = null;
297+
298+ // The constructor is private
299+ // to prevent initiation with outer code.
300+ private function __construct()
301+ {
302+ // First we create the endpoint that describes our service
303+ $endpoint = Endpoint::create('nowait-server');
304+
305+ $reporter = new Http(CurlFactory::create(), ['endpoint_url' => 'http://169.254.255.254:20060/api/v2/spans']);
306+ $sampler = BinarySampler::createAsAlwaysSample();
307+ $this->tracing = TracingBuilder::create()
308+ ->havingLocalEndpoint($endpoint)
309+ ->havingSampler($sampler)
310+ ->havingReporter($reporter)
311+ ->build();
312+ }
313+
314+ public static function getTracer()
315+ {
316+ if (self::$instance == null)
317+ {
318+ self::$instance = new YelpZipkinTracer();
319+ }
320+
321+ return self::$instance->tracing->getTracer();
322+ }
323+}