@@ -113,6 +113,7 @@ def reset_observability_state() -> None:
113113 observability_enabled = True ,
114114 observability_sink_name = DEFAULT_CONTROL_EVENT_SINK_NAME ,
115115 observability_sink_config = {},
116+ api_key_header = "X-API-Key" ,
116117 )
117118 with obs ._external_event_sinks_lock :
118119 obs ._external_event_sinks .clear ()
@@ -126,6 +127,7 @@ class TestEventBatcherInit:
126127 def test_init_default_values (self ):
127128 """Test EventBatcher initializes with default values."""
128129 batcher = EventBatcher ()
130+ assert batcher .api_key_header == get_settings ().api_key_header
129131 assert batcher .batch_size == get_settings ().batch_size
130132 assert batcher .flush_interval == get_settings ().flush_interval
131133 assert batcher .shutdown_join_timeout == get_settings ().shutdown_join_timeout
@@ -139,32 +141,37 @@ def test_init_custom_values(self):
139141 batcher = EventBatcher (
140142 server_url = "http://custom:9000" ,
141143 api_key = "test-key" ,
144+ api_key_header = "X-Custom-API-Key" ,
142145 batch_size = 50 ,
143146 flush_interval = 5.0 ,
144147 )
145148 assert batcher .server_url == "http://custom:9000"
146149 assert batcher .api_key == "test-key"
150+ assert batcher .api_key_header == "X-Custom-API-Key"
147151 assert batcher .batch_size == 50
148152 assert batcher .flush_interval == 5.0
149153
150154 def test_init_from_settings (self ):
151155 """Test EventBatcher reads from settings."""
152156 from agent_control .settings import configure_settings
153157
154- # Save original values
155- original_url = get_settings ().url
156- original_api_key = get_settings ().api_key
158+ original_settings = get_settings ().model_dump ()
157159
158160 try :
159161 # Configure settings programmatically
160- configure_settings (url = "http://configured-server:8080" , api_key = "configured-api-key" )
162+ configure_settings (
163+ url = "http://configured-server:8080" ,
164+ api_key = "configured-api-key" ,
165+ api_key_header = "X-Custom-API-Key" ,
166+ )
161167
162168 batcher = EventBatcher ()
163169 assert batcher .server_url == "http://configured-server:8080"
164170 assert batcher .api_key == "configured-api-key"
171+ assert batcher .api_key_header == "X-Custom-API-Key"
165172 finally :
166173 # Restore original settings
167- configure_settings (url = original_url , api_key = original_api_key )
174+ configure_settings (** original_settings )
168175
169176
170177class TestEventBatcherStartStop :
@@ -547,6 +554,46 @@ def test_send_batch_sync_returns_true_on_202(self):
547554 assert result is True
548555 client_ctor .assert_called_once_with (timeout = 30.0 )
549556 client .post .assert_called_once ()
557+ assert client .post .call_args .kwargs ["headers" ]["X-API-Key" ] == "test-key"
558+
559+ def test_send_batch_sync_uses_configured_api_key_header (self ):
560+ batcher = EventBatcher (
561+ server_url = "http://test:8000" ,
562+ api_key = "test-key" ,
563+ api_key_header = "X-Custom-API-Key" ,
564+ )
565+ response = MagicMock (status_code = 202 , text = "accepted" )
566+ client = MagicMock ()
567+ client .post .return_value = response
568+ client_context = MagicMock ()
569+ client_context .__enter__ .return_value = client
570+
571+ with patch (
572+ "agent_control.observability.httpx.Client" ,
573+ return_value = client_context ,
574+ ):
575+ result = batcher ._send_batch_sync ([create_mock_event ()])
576+
577+ assert result is True
578+ headers = client .post .call_args .kwargs ["headers" ]
579+ assert headers ["X-Custom-API-Key" ] == "test-key"
580+ assert "X-API-Key" not in headers
581+
582+ def test_build_batch_request_uses_settings_api_key_header (self ):
583+ original_settings = get_settings ().model_dump ()
584+ try :
585+ configure_settings (
586+ api_key = "settings-key" ,
587+ api_key_header = "X-Custom-API-Key" ,
588+ )
589+ batcher = EventBatcher ()
590+
591+ _ , headers , _ = batcher ._build_batch_request ([create_mock_event ()])
592+
593+ assert headers ["X-Custom-API-Key" ] == "settings-key"
594+ assert "X-API-Key" not in headers
595+ finally :
596+ configure_settings (** original_settings )
550597
551598 def test_send_batch_sync_returns_false_on_401_without_retry (self ):
552599 batcher = EventBatcher ()
@@ -1056,10 +1103,12 @@ def test_init_enabled_creates_batcher(self):
10561103 result = init_observability (
10571104 server_url = "http://test:8000" ,
10581105 api_key = "test-key" ,
1106+ api_key_header = "X-Custom-API-Key" ,
10591107 enabled = True ,
10601108 )
10611109 assert result is not None
10621110 assert isinstance (result , EventBatcher )
1111+ assert result .api_key_header == "X-Custom-API-Key"
10631112 assert result ._running is True
10641113 assert get_event_sink () is not None
10651114
0 commit comments