Skip to content

Commit c2e063a

Browse files
committed
tests: add tests for aiohttp logger
1 parent ff292a9 commit c2e063a

File tree

2 files changed

+127
-1
lines changed

2 files changed

+127
-1
lines changed
Lines changed: 127 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,127 @@
1+
import json
2+
import logging
3+
4+
from _pytest.capture import CaptureFixture
5+
from aiohttp.pytest_plugin import AiohttpClient, AiohttpRawServer
6+
from aiohttp.web import Request, Response
7+
from assertpy import assert_that
8+
from opentelemetry import trace
9+
from structlog import get_logger
10+
11+
from asgi_monitor.logging import configure_logging
12+
from asgi_monitor.logging.aiohttp import TraceAccessLogger
13+
from tests.integration.factory import build_aiohttp_tracing_config
14+
from tests.utils import read_json_logs
15+
16+
logger = logging.getLogger(__name__)
17+
struct_logger = get_logger(structlog_name="structlog")
18+
19+
20+
async def log_in_controller(request: Request) -> Response:
21+
with trace.get_tracer("aiohttp").start_as_current_span("GET /") as span:
22+
if "log" in request.url.path:
23+
request.span = span
24+
25+
struct_logger.info("trace info")
26+
27+
with trace.get_tracer("aiohttp").start_as_current_span("test"):
28+
logger.info("trace error")
29+
30+
return Response(body=json.dumps({"status": "ok"}))
31+
32+
33+
async def test_aiohttp_logs_with_trace_in_controller_format_json(
34+
aiohttp_raw_server: AiohttpRawServer,
35+
aiohttp_client: AiohttpClient,
36+
capfd: CaptureFixture,
37+
) -> None:
38+
# Arrange
39+
build_aiohttp_tracing_config()
40+
configure_logging(level=logging.INFO, json_format=True, include_trace=True)
41+
kwargs = {"access_log_class": TraceAccessLogger, "logger": logger}
42+
server = await aiohttp_raw_server(log_in_controller, **kwargs) # type: ignore[arg-type]
43+
cli = await aiohttp_client(server)
44+
45+
# Act
46+
await cli.get("/log")
47+
48+
# Assert
49+
access_log = read_json_logs(capfd)[-1]
50+
assert_that(access_log).contains_key(
51+
"span_id",
52+
"trace_id",
53+
"service.name",
54+
)
55+
assert_that(access_log).does_not_contain_key("parent_span_id")
56+
57+
58+
async def test_aiohttp_logs_with_trace_in_controller_format_json_parent(
59+
aiohttp_raw_server: AiohttpRawServer,
60+
aiohttp_client: AiohttpClient,
61+
capfd: CaptureFixture,
62+
) -> None:
63+
# Arrange
64+
build_aiohttp_tracing_config()
65+
configure_logging(level=logging.INFO, json_format=True, include_trace=True)
66+
67+
with trace.get_tracer("aiohttp").start_as_current_span("parent"):
68+
kwargs = {"access_log_class": TraceAccessLogger, "logger": logger}
69+
server = await aiohttp_raw_server(log_in_controller, **kwargs) # type: ignore[arg-type]
70+
cli = await aiohttp_client(server)
71+
72+
# Act
73+
await cli.get("/log")
74+
75+
# Assert
76+
access_log = read_json_logs(capfd)[-1]
77+
assert_that(access_log).contains_key(
78+
"span_id",
79+
"trace_id",
80+
"service.name",
81+
"parent_span_id",
82+
)
83+
84+
85+
async def test_aiohttp_logs_with_trace_in_controller_format_json_error(
86+
aiohttp_raw_server: AiohttpRawServer,
87+
aiohttp_client: AiohttpClient,
88+
capfd: CaptureFixture,
89+
) -> None:
90+
# Arrange
91+
build_aiohttp_tracing_config()
92+
configure_logging(level=logging.INFO, json_format=True, include_trace=True)
93+
kwargs = {"access_log_class": TraceAccessLogger, "logger": logger}
94+
server = await aiohttp_raw_server(log_in_controller, **kwargs) # type: ignore[arg-type]
95+
cli = await aiohttp_client(server)
96+
97+
# Act
98+
await cli.get("/error")
99+
100+
# Assert
101+
error_log = read_json_logs(capfd)[-1]
102+
assert_that(error_log).does_not_contain_key(
103+
"structlog_name",
104+
"span_id",
105+
"trace_id",
106+
"service.name",
107+
)
108+
109+
110+
async def test_aiohttp_logs_with_trace_in_controller_format_json_critical_level(
111+
aiohttp_raw_server: AiohttpRawServer,
112+
aiohttp_client: AiohttpClient,
113+
capfd: CaptureFixture,
114+
) -> None:
115+
# Arrange
116+
build_aiohttp_tracing_config()
117+
configure_logging(level=logging.CRITICAL, json_format=True, include_trace=True)
118+
kwargs = {"access_log_class": TraceAccessLogger, "logger": logger}
119+
server = await aiohttp_raw_server(log_in_controller, **kwargs) # type: ignore[arg-type]
120+
cli = await aiohttp_client(server)
121+
122+
# Act
123+
await cli.get("/log")
124+
125+
# Assert
126+
out, _ = capfd.readouterr()
127+
assert len(out) == 0

tests/integration/uvicorn/test_log_config.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,6 @@ async def test_uvicorn_logs_with_trace_format_json(capfd: CaptureFixture) -> Non
207207
logs = read_json_logs(capfd)
208208
request_log = logs[4]
209209

210-
assert_that([request_log]).extracting("service.name").contains_only("aiohttp")
211210
assert_that(request_log).contains_key(
212211
"event",
213212
"filename",

0 commit comments

Comments
 (0)