|
10 | 10 | from mistralai.client.models import Security |
11 | 11 | from mistralai.client.sdkconfiguration import SDKConfiguration |
12 | 12 | from mistralai.client.utils.logger import get_default_logger |
13 | | -from mistralai.extra.observability import configure_telemetry, set_tracer_provider |
| 13 | +from mistralai.extra.observability import ( |
| 14 | + configure_telemetry, |
| 15 | + get_telemetry_tracer, |
| 16 | + set_tracer_provider, |
| 17 | +) |
| 18 | +from mistralai.extra.observability.otel import MISTRAL_SDK_OTEL_TRACER_NAME |
14 | 19 | from mistralai.extra.observability.telemetry import ( |
15 | 20 | MISTRAL_TELEMETRY_ENDPOINT, |
16 | 21 | MISTRAL_SDK_TELEMETRY_ENV, |
@@ -64,6 +69,14 @@ def _configure_for_hook( |
64 | 69 | class FakeProvider: |
65 | 70 | def __init__(self): |
66 | 71 | self.shutdown_called = False |
| 72 | + self.get_tracer_calls: list[str] = [] |
| 73 | + self.tracers: dict[str, MagicMock] = {} |
| 74 | + |
| 75 | + def get_tracer(self, name: str): |
| 76 | + self.get_tracer_calls.append(name) |
| 77 | + if name not in self.tracers: |
| 78 | + self.tracers[name] = MagicMock(name=f"tracer:{name}") |
| 79 | + return self.tracers[name] |
67 | 80 |
|
68 | 81 | def shutdown(self): |
69 | 82 | self.shutdown_called = True |
@@ -277,6 +290,63 @@ def test_configure_telemetry_dedicated_replaces_custom_without_shutdown(self): |
277 | 290 | self.assertIs(hook.tracer_provider, dedicated_provider) |
278 | 291 | self.assertIs(hook._auto_telemetry_provider, dedicated_provider) |
279 | 292 |
|
| 293 | + def test_get_telemetry_tracer_dedicated_uses_auto_provider(self): |
| 294 | + provider = FakeProvider() |
| 295 | + |
| 296 | + with patch.dict(os.environ, {}, clear=True): |
| 297 | + with patch( |
| 298 | + "mistralai.extra.observability.telemetry._create_telemetry_tracer_provider", |
| 299 | + return_value=provider, |
| 300 | + ): |
| 301 | + client = _make_client(api_key="test-key") |
| 302 | + configure_telemetry(client) |
| 303 | + tracer = get_telemetry_tracer(client) |
| 304 | + |
| 305 | + self.assertIs(tracer, provider.tracers[MISTRAL_SDK_OTEL_TRACER_NAME]) |
| 306 | + self.assertEqual(provider.get_tracer_calls, [MISTRAL_SDK_OTEL_TRACER_NAME]) |
| 307 | + |
| 308 | + def test_get_telemetry_tracer_custom_provider_uses_custom_name(self): |
| 309 | + provider = FakeProvider() |
| 310 | + client = _make_client(api_key="test-key") |
| 311 | + |
| 312 | + configure_telemetry(client, provider=cast(TracerProvider, provider)) |
| 313 | + tracer = get_telemetry_tracer(client, "my-agent") |
| 314 | + |
| 315 | + self.assertIs(tracer, provider.tracers["my-agent"]) |
| 316 | + self.assertEqual(provider.get_tracer_calls, ["my-agent"]) |
| 317 | + |
| 318 | + def test_get_telemetry_tracer_global_uses_global_provider(self): |
| 319 | + client = _make_client(api_key="test-key") |
| 320 | + configure_telemetry(client, provider="global") |
| 321 | + tracer = MagicMock() |
| 322 | + |
| 323 | + with patch( |
| 324 | + "mistralai.extra.observability.telemetry.otel_trace.get_tracer", |
| 325 | + return_value=tracer, |
| 326 | + ) as get_tracer: |
| 327 | + result = get_telemetry_tracer(client, "my-agent") |
| 328 | + |
| 329 | + self.assertIs(result, tracer) |
| 330 | + get_tracer.assert_called_once_with("my-agent") |
| 331 | + |
| 332 | + def test_get_telemetry_tracer_disabled_raises_configuration_error(self): |
| 333 | + env_cases = ({}, {MISTRAL_SDK_TELEMETRY_ENV: "false"}) |
| 334 | + |
| 335 | + for env in env_cases: |
| 336 | + with self.subTest(env=env): |
| 337 | + with patch.dict(os.environ, env, clear=True): |
| 338 | + with patch( |
| 339 | + "mistralai.extra.observability.telemetry._create_telemetry_tracer_provider" |
| 340 | + ) as create_provider: |
| 341 | + client = _make_client(api_key="test-key") |
| 342 | + with self.assertRaisesRegex( |
| 343 | + TelemetryConfigurationError, |
| 344 | + "Telemetry is not configured", |
| 345 | + ): |
| 346 | + get_telemetry_tracer(client) |
| 347 | + |
| 348 | + create_provider.assert_not_called() |
| 349 | + |
280 | 350 | def test_internal_explicit_false_overrides_env_dedicated(self): |
281 | 351 | with patch.dict( |
282 | 352 | os.environ, {MISTRAL_SDK_TELEMETRY_ENV: "dedicated"}, clear=True |
|
0 commit comments