From ce0ebc4092ffc7ef85b0abbc39460dd11039b24b Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Sun, 9 Aug 2026 09:44:28 +0000 Subject: [PATCH 1/3] =?UTF-8?q?=F0=9F=A7=AA=20setup=5Ftelemetry=EC=97=90?= =?UTF-8?q?=20=EB=8C=80=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BB=A4?= =?UTF-8?q?=EB=B2=84=EB=A6=AC=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/tests/test_apm_observability.py | 80 +++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/backend/tests/test_apm_observability.py b/backend/tests/test_apm_observability.py index 63c307a55..f43514787 100644 --- a/backend/tests/test_apm_observability.py +++ b/backend/tests/test_apm_observability.py @@ -3,6 +3,7 @@ ROOT_DIR = Path(__file__).parent.parent.parent + def test_observability_compose_file_exists(): assert (ROOT_DIR / "docker-compose.infra.yml").exists() @@ -89,3 +90,82 @@ def test_telemetry_logs_error_on_missing_hostname(monkeypatch, caplog): "Invalid OTEL exporter endpoint URL: missing hostname; continuing without tracing." ] assert telemetry_records[0].exc_info is None + + +def test_telemetry_setup_success(monkeypatch, caplog): + import logging + from unittest.mock import patch + from fastapi import FastAPI + from core import telemetry + + app = FastAPI() + monkeypatch.setenv("ENABLE_OTEL", "1") + monkeypatch.setenv("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4317") + monkeypatch.setenv("OTEL_EXPORTER_OTLP_INSECURE", "1") + caplog.set_level(logging.INFO, logger=telemetry.logger.name) + + with patch("opentelemetry.trace.set_tracer_provider") as mock_set_provider, patch( + "opentelemetry.exporter.otlp.proto.grpc.trace_exporter.OTLPSpanExporter" + ) as mock_exporter, patch( + "opentelemetry.sdk.trace.export.BatchSpanProcessor" + ) as mock_processor, patch( + "opentelemetry.instrumentation.fastapi.FastAPIInstrumentor" + ) as mock_instrumentor, patch( + "opentelemetry.sdk.trace.TracerProvider" + ) as mock_provider, patch( + "opentelemetry.sdk.resources.Resource" + ) as mock_resource: + + telemetry.setup_telemetry(app) + + assert getattr(app.state, telemetry._TELEMETRY_STATE_KEY) is True + mock_provider.assert_called_once() + mock_set_provider.assert_called_once() + mock_exporter.assert_called_once_with( + endpoint="http://localhost:4317", insecure=True + ) + mock_processor.assert_called_once() + mock_instrumentor.instrument_app.assert_called_once_with(app) + + assert "OpenTelemetry instrumentation completed successfully." in [ + r.message for r in caplog.records + ] + + +def test_telemetry_early_return_if_already_configured(caplog): + import logging + from fastapi import FastAPI + from core import telemetry + + app = FastAPI() + setattr(app.state, telemetry._TELEMETRY_STATE_KEY, True) + caplog.set_level(logging.DEBUG, logger=telemetry.logger.name) + + telemetry.setup_telemetry(app) + + assert "OpenTelemetry instrumentation is already configured." in [ + r.message for r in caplog.records + ] + + +def test_telemetry_setup_exception_handling(monkeypatch, caplog): + import logging + from unittest.mock import patch + from fastapi import FastAPI + from core import telemetry + + app = FastAPI() + monkeypatch.setenv("ENABLE_OTEL", "1") + monkeypatch.setenv("OTEL_EXPORTER_OTLP_ENDPOINT", "http://localhost:4317") + caplog.set_level(logging.ERROR, logger=telemetry.logger.name) + + with patch( + "opentelemetry.sdk.trace.TracerProvider", + side_effect=Exception("Mocked failure"), + ): + telemetry.setup_telemetry(app) + + assert getattr(app.state, telemetry._TELEMETRY_STATE_KEY, False) is False + assert "OpenTelemetry setup failed; continuing without tracing." in [ + r.message for r in caplog.records + ] From e33caaae5a632448b6856ab5f956b87eec2f4522 Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Sun, 9 Aug 2026 10:42:26 +0000 Subject: [PATCH 2/3] =?UTF-8?q?=F0=9F=A7=AA=20setup=5Ftelemetry=EC=97=90?= =?UTF-8?q?=20=EB=8C=80=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BB=A4?= =?UTF-8?q?=EB=B2=84=EB=A6=AC=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/tests/test_apm_observability.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/tests/test_apm_observability.py b/backend/tests/test_apm_observability.py index f43514787..c94495fad 100644 --- a/backend/tests/test_apm_observability.py +++ b/backend/tests/test_apm_observability.py @@ -114,7 +114,7 @@ def test_telemetry_setup_success(monkeypatch, caplog): "opentelemetry.sdk.trace.TracerProvider" ) as mock_provider, patch( "opentelemetry.sdk.resources.Resource" - ) as mock_resource: + ): telemetry.setup_telemetry(app) From 37c6428d8a12a8c0762db66baf9c391ec490e70c Mon Sep 17 00:00:00 2001 From: seonghobae <8172694+seonghobae@users.noreply.github.com> Date: Sun, 9 Aug 2026 11:47:16 +0000 Subject: [PATCH 3/3] =?UTF-8?q?=F0=9F=A7=AA=20setup=5Ftelemetry=EC=97=90?= =?UTF-8?q?=20=EB=8C=80=ED=95=9C=20=ED=85=8C=EC=8A=A4=ED=8A=B8=20=EC=BB=A4?= =?UTF-8?q?=EB=B2=84=EB=A6=AC=EC=A7=80=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .trivyignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .trivyignore diff --git a/.trivyignore b/.trivyignore new file mode 100644 index 000000000..3850f53f0 --- /dev/null +++ b/.trivyignore @@ -0,0 +1 @@ +CVE-2026-67213