Skip to content

Commit 2071e1d

Browse files
authored
feat(http): adds support for route in response object for late parsing. (#180)
1 parent e247c9e commit 2071e1d

File tree

5 files changed

+61
-9
lines changed

5 files changed

+61
-9
lines changed

src/Zipkin/Instrumentation/Http/Server/DefaultHttpServerParser.php

Lines changed: 29 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
class DefaultHttpServerParser implements HttpServerParser
1818
{
1919
/**
20-
* spanName returns an appropiate span name based on the request,
20+
* spanNameFromRequest returns an appropiate span name based on the request,
2121
* usually the HTTP method is enough (e.g GET or POST) but ideally
22-
* the http.route is desired (e.g. /user/{user_id}).
22+
* the verb+route is desired (e.g. GET /user/{user_id}).
2323
*/
24-
protected function spanName(Request $request): string
24+
protected function spanNameFromRequest(Request $request): string
2525
{
2626
return $request->getMethod()
2727
. ($request->getRoute() === null ? '' : ' ' . $request->getRoute());
@@ -32,16 +32,41 @@ protected function spanName(Request $request): string
3232
*/
3333
public function request(Request $request, TraceContext $context, SpanCustomizer $span): void
3434
{
35-
$span->setName($this->spanName($request));
35+
$span->setName($this->spanNameFromRequest($request));
3636
$span->tag(Tags\HTTP_METHOD, $request->getMethod());
3737
$span->tag(Tags\HTTP_PATH, $request->getPath() ?: '/');
3838
}
3939

40+
protected function spanName(Request $request): string
41+
{
42+
return $request->getMethod()
43+
. ($request->getRoute() === null ? '' : ' ' . $request->getRoute());
44+
}
45+
46+
/**
47+
* spanNameFromResponse returns an appropiate span name based on the response's request,
48+
* usually seeking for a better name than the HTTP method (e.g. GET /user/{user_id}).
49+
*/
50+
protected function spanNameFromResponse(Response $response): ?string
51+
{
52+
if ($response->getRoute() === null || $response->getRequest() === null) {
53+
return null;
54+
}
55+
56+
return $response->getRequest()->getMethod() . ' ' . $response->getRoute();
57+
}
58+
59+
4060
/**
4161
* {@inhertidoc}
4262
*/
4363
public function response(Response $response, TraceContext $context, SpanCustomizer $span): void
4464
{
65+
$spanName = $this->spanNameFromResponse($response);
66+
if ($spanName !== null) {
67+
$span->setName($spanName);
68+
}
69+
4570
$statusCode = $response->getStatusCode();
4671
if ($statusCode < 200 || $statusCode > 299) {
4772
$span->tag(Tags\HTTP_STATUS_CODE, (string) $statusCode);

src/Zipkin/Instrumentation/Http/Server/Psr15/Response.php

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,19 @@ final class Response extends ServerResponse
2020
*/
2121
private $request;
2222

23+
/**
24+
* @var string|null
25+
*/
26+
private $route;
27+
2328
public function __construct(
2429
ResponseInterface $delegate,
25-
?Request $request = null
30+
?Request $request = null,
31+
?string $route = null
2632
) {
2733
$this->delegate = $delegate;
2834
$this->request = $request;
35+
$this->route = $route;
2936
}
3037

3138
/**
@@ -44,6 +51,14 @@ public function getStatusCode(): int
4451
return $this->delegate->getStatusCode();
4552
}
4653

54+
/**
55+
* {@inheritdoc}
56+
*/
57+
public function getRoute(): ?string
58+
{
59+
return $this->route;
60+
}
61+
4762
/**
4863
* {@inheritdoc}
4964
*/

src/Zipkin/Instrumentation/Http/Server/Response.php

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,13 @@ public function getRequest(): ?Request
1515
{
1616
return null;
1717
}
18+
19+
/**
20+
* getRoute returns the route path, sometimes known by the response time
21+
* e.g. /user/{user_id}
22+
*/
23+
public function getRoute(): ?string
24+
{
25+
return null;
26+
}
1827
}

tests/Unit/Instrumentation/Http/Server/BaseResponseTest.php

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ abstract public static function createResponse(
2121
int $statusCode,
2222
$headers = [],
2323
$body = null,
24-
?Request $request = null
24+
?Request $request = null,
25+
?string $route = null
2526
): array;
2627

2728
/**
@@ -37,9 +38,10 @@ public function testResponseIsCreatedSuccessfully(?Request $request): void
3738
/**
3839
* @var Response $response
3940
*/
40-
list($response, $delegateResponse) = static::createResponse(202, [], null, $request);
41+
list($response, $delegateResponse, $_, $route) = static::createResponse(202, [], null, $request, "/things");
4142
$this->assertEquals(202, $response->getStatusCode());
4243
$this->assertSame($request, $response->getRequest());
4344
$this->assertSame($delegateResponse, $response->unwrap());
45+
$this->assertSame($route, $response->getRoute());
4446
}
4547
}

tests/Unit/Instrumentation/Http/Server/Psr15/ResponseTest.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@ public static function createResponse(
2020
int $statusCode,
2121
$headers = [],
2222
$body = null,
23-
?Request $request = null
23+
?Request $request = null,
24+
?string $route = null
2425
): array {
2526
$delegateResponse = new Response($statusCode);
2627
$response = new Psr18Response($delegateResponse, $request);
27-
return [$response, $delegateResponse, $request];
28+
return [$response, $delegateResponse, $request, $route];
2829
}
2930

3031
/**

0 commit comments

Comments
 (0)