11# Copyright (c) Microsoft Corporation. All rights reserved.
2+ import asyncio
23import os
34import unittest
45
56import tests .protos as protos
67
78from azure_functions_runtime .handle_event import otel_manager , worker_init_request
8- from azure_functions_runtime .otel import (initialize_azure_monitor ,
9+ from azure_functions_runtime .otel import (configure_opentelemetry ,
10+ initialize_azure_monitor ,
911 update_opentelemetry_status ,
1012 OTelManager )
1113from azure_functions_runtime .logging import logger
1921
2022class TestOpenTelemetry (unittest .TestCase ):
2123
24+ def setUp (self ):
25+ self ._otel_manager_state = (
26+ otel_manager .get_azure_monitor_available (),
27+ otel_manager .get_otel_libs_available (),
28+ otel_manager .get_context_api (),
29+ otel_manager .get_trace_context_propagator (),
30+ )
31+
32+ def tearDown (self ):
33+ (azure_monitor_available ,
34+ otel_libs_available ,
35+ context_api ,
36+ trace_context_propagator ) = self ._otel_manager_state
37+ otel_manager .set_azure_monitor_available (azure_monitor_available )
38+ otel_manager .set_otel_libs_available (otel_libs_available )
39+ otel_manager .set_context_api (context_api )
40+ otel_manager .set_trace_context_propagator (trace_context_propagator )
41+
2242 def test_update_opentelemetry_status_import_error (self ):
2343 with patch .dict ('sys.modules' , {
2444 'opentelemetry' : None ,
@@ -43,6 +63,12 @@ def test_update_opentelemetry_status_success(
4363 self .assertIsNotNone (otel_manager .get_context_api ())
4464 self .assertIsNotNone (otel_manager .get_trace_context_propagator ())
4565
66+ def test_configure_opentelemetry_noops_when_not_initialized (self ):
67+ otel_manager .set_context_api (None )
68+ otel_manager .set_trace_context_propagator (None )
69+
70+ configure_opentelemetry (MagicMock ())
71+
4672 @patch ('builtins.__import__' )
4773 @patch ("azure_functions_runtime.otel.update_opentelemetry_status" )
4874 def test_initialize_azure_monitor_success (
@@ -146,7 +172,7 @@ async def test_init_request_initialize_azure_monitor_disabled_app_setting(
146172 self .assertNotIn ("WorkerOpenTelemetryEnabled" , capabilities )
147173
148174 @patch .dict (os .environ , {'PYTHON_ENABLE_OPENTELEMETRY' : 'true' })
149- async def test_init_request_enable_opentelemetry_enabled_app_setting (
175+ def test_init_request_enable_opentelemetry_enabled_app_setting (
150176 self ,
151177 ):
152178 worker_request = WorkerRequest (name = 'worker_init_request' ,
@@ -155,13 +181,15 @@ async def test_init_request_enable_opentelemetry_enabled_app_setting(
155181 FUNCTION_APP_DIRECTORY )),
156182 properties = {'host' : '123' ,
157183 'protos' : protos })
158- init_response = await worker_init_request (worker_request )
184+ init_response = asyncio . run ( worker_init_request (worker_request ) )
159185
160186 self .assertEqual (init_response .result .status ,
161187 protos .StatusResult .Success )
162188
163- # Verify otel_libs_available is set to True
164- self .assertTrue (otel_manager .get_azure_monitor_available ())
189+ # Verify OpenTelemetry propagation is initialized
190+ self .assertTrue (otel_manager .get_otel_libs_available ())
191+ self .assertIsNotNone (otel_manager .get_context_api ())
192+ self .assertIsNotNone (otel_manager .get_trace_context_propagator ())
165193 # Verify that WorkerOpenTelemetryEnabled capability is set to _TRUE
166194 capabilities = init_response .capabilities
167195 self .assertIn ("WorkerOpenTelemetryEnabled" , capabilities )
0 commit comments