46
46
_expected_metric_names = [
47
47
"http.server.active_requests" ,
48
48
"http.server.duration" ,
49
+ "http.server.response.size" ,
50
+ "http.server.request.size" ,
49
51
]
50
52
_recommended_attrs = {
51
53
"http.server.active_requests" : _active_requests_count_attrs ,
52
54
"http.server.duration" : _duration_attrs ,
55
+ "http.server.response.size" : _duration_attrs ,
56
+ "http.server.request.size" : _duration_attrs ,
53
57
}
54
58
55
59
56
60
async def http_app (scope , receive , send ):
57
61
message = await receive ()
62
+ scope ["headers" ] = [(b"content-length" , b"128" )]
58
63
assert scope ["type" ] == "http"
59
64
if message .get ("type" ) == "http.request" :
60
65
await send (
61
66
{
62
67
"type" : "http.response.start" ,
63
68
"status" : 200 ,
64
- "headers" : [[b"Content-Type" , b"text/plain" ]],
69
+ "headers" : [
70
+ [b"Content-Type" , b"text/plain" ],
71
+ [b"content-length" , b"1024" ],
72
+ ],
65
73
}
66
74
)
67
75
await send ({"type" : "http.response.body" , "body" : b"*" })
@@ -94,6 +102,7 @@ async def error_asgi(scope, receive, send):
94
102
assert isinstance (scope , dict )
95
103
assert scope ["type" ] == "http"
96
104
message = await receive ()
105
+ scope ["headers" ] = [(b"content-length" , b"128" )]
97
106
if message .get ("type" ) == "http.request" :
98
107
try :
99
108
raise ValueError
@@ -103,7 +112,10 @@ async def error_asgi(scope, receive, send):
103
112
{
104
113
"type" : "http.response.start" ,
105
114
"status" : 200 ,
106
- "headers" : [[b"Content-Type" , b"text/plain" ]],
115
+ "headers" : [
116
+ [b"Content-Type" , b"text/plain" ],
117
+ [b"content-length" , b"1024" ],
118
+ ],
107
119
}
108
120
)
109
121
await send ({"type" : "http.response.body" , "body" : b"*" })
@@ -126,7 +138,8 @@ def validate_outputs(self, outputs, error=None, modifiers=None):
126
138
# Check http response start
127
139
self .assertEqual (response_start ["status" ], 200 )
128
140
self .assertEqual (
129
- response_start ["headers" ], [[b"Content-Type" , b"text/plain" ]]
141
+ response_start ["headers" ],
142
+ [[b"Content-Type" , b"text/plain" ], [b"content-length" , b"1024" ]],
130
143
)
131
144
132
145
exc_info = self .scope .get ("hack_exc_info" )
@@ -352,6 +365,7 @@ def test_traceresponse_header(self):
352
365
response_start ["headers" ],
353
366
[
354
367
[b"Content-Type" , b"text/plain" ],
368
+ [b"content-length" , b"1024" ],
355
369
[b"traceresponse" , f"{ traceresponse } " .encode ()],
356
370
[b"access-control-expose-headers" , b"traceresponse" ],
357
371
],
@@ -565,6 +579,7 @@ def test_basic_metric_success(self):
565
579
"http.flavor" : "1.0" ,
566
580
}
567
581
metrics_list = self .memory_metrics_reader .get_metrics_data ()
582
+ # pylint: disable=too-many-nested-blocks
568
583
for resource_metric in metrics_list .resource_metrics :
569
584
for scope_metrics in resource_metric .scope_metrics :
570
585
for metric in scope_metrics .metrics :
@@ -575,9 +590,14 @@ def test_basic_metric_success(self):
575
590
dict (point .attributes ),
576
591
)
577
592
self .assertEqual (point .count , 1 )
578
- self .assertAlmostEqual (
579
- duration , point .sum , delta = 5
580
- )
593
+ if metric .name == "http.server.duration" :
594
+ self .assertAlmostEqual (
595
+ duration , point .sum , delta = 5
596
+ )
597
+ elif metric .name == "http.server.response.size" :
598
+ self .assertEqual (1024 , point .sum )
599
+ elif metric .name == "http.server.request.size" :
600
+ self .assertEqual (128 , point .sum )
581
601
elif isinstance (point , NumberDataPoint ):
582
602
self .assertDictEqual (
583
603
expected_requests_count_attributes ,
@@ -602,13 +622,12 @@ async def target_asgi(scope, receive, send):
602
622
app = otel_asgi .OpenTelemetryMiddleware (target_asgi )
603
623
self .seed_app (app )
604
624
self .send_default_request ()
605
-
606
625
metrics_list = self .memory_metrics_reader .get_metrics_data ()
607
626
assertions = 0
608
627
for resource_metric in metrics_list .resource_metrics :
609
628
for scope_metrics in resource_metric .scope_metrics :
610
629
for metric in scope_metrics .metrics :
611
- if metric .name != "http.server.duration " :
630
+ if metric .name == "http.server.active_requests " :
612
631
continue
613
632
for point in metric .data .data_points :
614
633
if isinstance (point , HistogramDataPoint ):
@@ -617,7 +636,7 @@ async def target_asgi(scope, receive, send):
617
636
expected_target ,
618
637
)
619
638
assertions += 1
620
- self .assertEqual (assertions , 1 )
639
+ self .assertEqual (assertions , 3 )
621
640
622
641
def test_no_metric_for_websockets (self ):
623
642
self .scope = {
0 commit comments