@@ -59,7 +59,9 @@ async def error_asgi(scope, receive, send):
59
59
60
60
61
61
class TestAsgiApplication (AsgiTestBase ):
62
- def validate_outputs (self , outputs , error = None ):
62
+ def validate_outputs (self , outputs , error = None , modifiers = None ):
63
+ # Ensure modifiers is a list
64
+ modifiers = modifiers or []
63
65
# Check for expected outputs
64
66
self .assertEqual (len (outputs ), 2 )
65
67
response_start = outputs [0 ]
@@ -89,25 +91,25 @@ def validate_outputs(self, outputs, error=None):
89
91
self .assertEqual (len (span_list ), 4 )
90
92
expected = [
91
93
{
92
- "name" : "/ (http.request)" ,
94
+ "name" : "HTTP GET (http.request)" ,
93
95
"kind" : trace_api .SpanKind .INTERNAL ,
94
96
"attributes" : {"type" : "http.request" },
95
97
},
96
98
{
97
- "name" : "/ (http.response.start)" ,
99
+ "name" : "HTTP GET (http.response.start)" ,
98
100
"kind" : trace_api .SpanKind .INTERNAL ,
99
101
"attributes" : {
100
102
"http.status_code" : 200 ,
101
103
"type" : "http.response.start" ,
102
104
},
103
105
},
104
106
{
105
- "name" : "/ (http.response.body)" ,
107
+ "name" : "HTTP GET (http.response.body)" ,
106
108
"kind" : trace_api .SpanKind .INTERNAL ,
107
109
"attributes" : {"type" : "http.response.body" },
108
110
},
109
111
{
110
- "name" : "/ " ,
112
+ "name" : "HTTP GET (connection) " ,
111
113
"kind" : trace_api .SpanKind .SERVER ,
112
114
"attributes" : {
113
115
"component" : "http" ,
@@ -124,25 +126,50 @@ def validate_outputs(self, outputs, error=None):
124
126
},
125
127
},
126
128
]
129
+ # Run our expected modifiers
130
+ for modifier in modifiers :
131
+ expected = modifier (expected )
132
+ # Check that output matches
127
133
for span , expected in zip (span_list , expected ):
128
134
self .assertEqual (span .name , expected ["name" ])
129
135
self .assertEqual (span .kind , expected ["kind" ])
130
136
self .assertEqual (span .attributes , expected ["attributes" ])
131
137
132
138
def test_basic_asgi_call (self ):
139
+ """Test that spans are emitted as expected."""
133
140
app = otel_asgi .OpenTelemetryMiddleware (simple_asgi )
134
141
self .seed_app (app )
135
142
self .send_default_request ()
136
143
outputs = self .get_all_output ()
137
144
self .validate_outputs (outputs )
138
145
139
146
def test_asgi_exc_info (self ):
147
+ """Test that exception information is emitted as expected."""
140
148
app = otel_asgi .OpenTelemetryMiddleware (error_asgi )
141
149
self .seed_app (app )
142
150
self .send_default_request ()
143
151
outputs = self .get_all_output ()
144
152
self .validate_outputs (outputs , error = ValueError )
145
153
154
+ def test_override_span_name (self ):
155
+ """Test that span_names can be overwritten by our callback function."""
156
+ span_name = "Dymaxion"
157
+ def get_predefined_span_name (scope ):
158
+ return span_name
159
+ def update_expected_span_name (expected ):
160
+ for entry in expected :
161
+ entry ['name' ] = " " .join (
162
+ [span_name ] + entry ['name' ].split (' ' )[- 1 :]
163
+ )
164
+ return expected
165
+ app = otel_asgi .OpenTelemetryMiddleware (
166
+ simple_asgi , name_callback = get_predefined_span_name
167
+ )
168
+ self .seed_app (app )
169
+ self .send_default_request ()
170
+ outputs = self .get_all_output ()
171
+ self .validate_outputs (outputs , modifiers = [update_expected_span_name ])
172
+
146
173
147
174
class TestAsgiAttributes (unittest .TestCase ):
148
175
def setUp (self ):
0 commit comments