Skip to content

Commit 1f6b376

Browse files
authored
[Azure Monitor] [OTEL Exporter] Fix azure monitor redirect error logging (Azure#27321)
1 parent 1846d23 commit 1f6b376

File tree

2 files changed

+41
-11
lines changed

2 files changed

+41
-11
lines changed

sdk/monitor/azure-monitor-opentelemetry-exporter/azure/monitor/opentelemetry/exporter/export/_base.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -206,18 +206,22 @@ def _transmit(self, envelopes: List[TelemetryItem]) -> ExportResult:
206206
self._consecutive_redirects = self._consecutive_redirects + 1
207207
if self._consecutive_redirects < self.client._config.redirect_policy.max_redirects: # pylint: disable=W0212
208208
if response_error.response and response_error.response.headers:
209+
redirect_has_headers = True
209210
location = response_error.response.headers.get("location")
210-
if location:
211-
url = urlparse(location)
212-
if url.scheme and url.netloc:
213-
# Change the host to the new redirected host
214-
self.client._config.host = "{}://{}".format(url.scheme, url.netloc) # pylint: disable=W0212
215-
# Attempt to export again
216-
result = self._transmit(envelopes)
217-
if not self._is_stats_exporter():
218-
logger.error(
219-
"Error parsing redirect information."
220-
)
211+
url = urlparse(location)
212+
else:
213+
redirect_has_headers = False
214+
if redirect_has_headers and url.scheme and url.netloc:
215+
# Change the host to the new redirected host
216+
self.client._config.host = "{}://{}".format(url.scheme, url.netloc) # pylint: disable=W0212
217+
# Attempt to export again
218+
result = self._transmit(envelopes)
219+
else:
220+
if not self._is_stats_exporter():
221+
logger.error(
222+
"Error parsing redirect information.",
223+
)
224+
result = ExportResult.FAILED_NOT_RETRYABLE
221225
else:
222226
if not self._is_stats_exporter():
223227
logger.error(

sdk/monitor/azure-monitor-opentelemetry-exporter/tests/test_base_exporter.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,6 +192,32 @@ def test_transmit_http_error_redirect(self):
192192
self._base.client._config.redirect_policy.max_redirects = prev_redirects
193193
self._base.client._config.host = prev_host
194194

195+
def test_transmit_http_error_redirect_missing_headers(self):
196+
response = HttpResponse(None, None)
197+
response.status_code = 307
198+
response.headers = None
199+
error = HttpResponseError(response=response)
200+
prev_host = self._base.client._config.host
201+
with mock.patch.object(AzureMonitorClient, 'track') as post:
202+
post.side_effect = error
203+
result = self._base._transmit(self._envelopes_to_export)
204+
self.assertEqual(result, ExportResult.FAILED_NOT_RETRYABLE)
205+
self.assertEqual(post.call_count, 1)
206+
self.assertEqual(self._base.client._config.host, prev_host)
207+
208+
def test_transmit_http_error_redirect_invalid_location_header(self):
209+
response = HttpResponse(None, None)
210+
response.status_code = 307
211+
response.headers = {"location":"123"}
212+
error = HttpResponseError(response=response)
213+
prev_host = self._base.client._config.host
214+
with mock.patch.object(AzureMonitorClient, 'track') as post:
215+
post.side_effect = error
216+
result = self._base._transmit(self._envelopes_to_export)
217+
self.assertEqual(result, ExportResult.FAILED_NOT_RETRYABLE)
218+
self.assertEqual(post.call_count, 1)
219+
self.assertEqual(self._base.client._config.host, prev_host)
220+
195221
def test_transmit_request_error(self):
196222
with mock.patch.object(AzureMonitorClient, 'track', throw(ServiceRequestError, message="error")):
197223
result = self._base._transmit(self._envelopes_to_export)

0 commit comments

Comments
 (0)