3
3
namespace Utopia ;
4
4
5
5
use Utopia \Telemetry \Adapter as Telemetry ;
6
- use Utopia \Telemetry \Adapter \Noop as NoopTelemetry ;
6
+ use Utopia \Telemetry \Adapter \None as NoTelemetry ;
7
+ use Utopia \Telemetry \Histogram ;
8
+ use Utopia \Telemetry \UpDownCounter ;
7
9
8
10
class App
9
11
{
@@ -114,7 +116,10 @@ class App
114
116
protected int $ compressionMinSize = App::COMPRESSION_MIN_SIZE_DEFAULT ;
115
117
protected mixed $ compressionSupported = [];
116
118
117
- protected Metrics $ metrics ;
119
+ private Histogram $ requestDuration ;
120
+ private UpDownCounter $ activeRequests ;
121
+ private Histogram $ requestBodySize ;
122
+ private Histogram $ responseBodySize ;
118
123
119
124
/**
120
125
* App
@@ -124,7 +129,7 @@ class App
124
129
public function __construct (string $ timezone )
125
130
{
126
131
\date_default_timezone_set ($ timezone );
127
- $ this ->metrics = new Metrics (new NoopTelemetry ());
132
+ $ this ->setTelemetry (new NoTelemetry ());
128
133
}
129
134
130
135
/**
@@ -159,7 +164,20 @@ public function setCompressionSupported(mixed $compressionSupported)
159
164
*/
160
165
public function setTelemetry (Telemetry $ telemetry )
161
166
{
162
- $ this ->metrics = new Metrics ($ telemetry );
167
+ // https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#metric-httpserverrequestduration
168
+ $ this ->requestDuration = $ telemetry ->createHistogram (
169
+ 'http.server.request.duration ' ,
170
+ 's ' ,
171
+ null ,
172
+ ['ExplicitBucketBoundaries ' => [0.005 , 0.01 , 0.025 , 0.05 , 0.075 , 0.1 , 0.25 , 0.5 , 0.75 , 1 , 2.5 , 5 , 7.5 , 10 ]]
173
+ );
174
+
175
+ // https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#metric-httpserveractive_requests
176
+ $ this ->activeRequests = $ telemetry ->createUpDownCounter ('http.server.active_requests ' , '{request} ' );
177
+ // https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#metric-httpserverrequestbodysize
178
+ $ this ->requestBodySize = $ telemetry ->createHistogram ('http.server.request.body.size ' , 'By ' );
179
+ // https://opentelemetry.io/docs/specs/semconv/http/http-metrics/#metric-httpserverresponsebodysize
180
+ $ this ->responseBodySize = $ telemetry ->createHistogram ('http.server.response.body.size ' , 'By ' );
163
181
}
164
182
165
183
/**
@@ -686,14 +704,28 @@ protected function getArguments(Hook $hook, array $values, array $requestParams)
686
704
*/
687
705
public function run (Request $ request , Response $ response ): static
688
706
{
689
- $ this ->metrics ->increaseActiveRequest ($ request );
707
+ $ this ->activeRequests ->add (1 , [
708
+ 'http.request.method ' => $ request ->getMethod (),
709
+ 'url.scheme ' => $ request ->getProtocol (),
710
+ ]);
690
711
691
712
$ start = microtime (true );
692
713
$ result = $ this ->runInternal ($ request , $ response );
693
714
694
715
$ requestDuration = microtime (true ) - $ start ;
695
- $ this ->metrics ->recordMetrics ($ request , $ response , $ this ->getRoute (), $ requestDuration );
696
- $ this ->metrics ->decreaseActiveRequest ($ request );
716
+ $ attributes = [
717
+ 'url.scheme ' => $ request ->getProtocol (),
718
+ 'http.request.method ' => $ request ->getMethod (),
719
+ 'http.route ' => $ this ->getRoute ()?->getPath(),
720
+ 'http.response.status_code ' => $ response ->getStatusCode (),
721
+ ];
722
+ $ this ->requestDuration ->record ($ requestDuration , $ attributes );
723
+ $ this ->requestBodySize ->record ($ request ->getSize (), $ attributes );
724
+ $ this ->responseBodySize ->record ($ response ->getSize (), $ attributes );
725
+ $ this ->activeRequests ->add (-1 , [
726
+ 'http.request.method ' => $ request ->getMethod (),
727
+ 'url.scheme ' => $ request ->getProtocol (),
728
+ ]);
697
729
698
730
return $ result ;
699
731
}
0 commit comments