Overview
Create an internal HTTP client for the Campus audit service that follows Campus API schema conventions. This client enables campus.auth and campus.api deployments to send trace spans to campus.audit via HTTP.
Background
The tracing middleware (issue #428) needs to send trace data to the audit service. Since the middleware runs in separate deployment processes (campus.auth, campus.api), it cannot import audit resources directly and must use HTTP.
Design
Follows campus-api-python structure with:
ResourceCollection for collections (e.g., Traces)
- Nested classes for individual items (e.g.,
Traces.Trace)
- Standard verbs:
new(), list(), search(), get()
- Bracket access for IDs:
client.traces[trace_id]
- Property access for named sub-resources:
client.traces[trace_id].spans
- Uses
campus.common.http.DefaultClient for HTTP
Implementation
Files Created
campus/audit/client/__init__.py - AuditClient entry point
campus/audit/client/interface.py - ResourceRoot, ResourceCollection, Resource base classes
campus/audit/client/v1/__init__.py - v1 API module
campus/audit/client/v1/root.py - AuditRoot resource
campus/audit/client/v1/traces.py - Traces, Trace, Spans, Span resources
tests/unit/audit/test_client.py - Client initialization tests
tests/unit/audit/test_interface.py - Base resource class tests
tests/unit/audit/test_traces.py - Traces resource tests
API Usage
from campus.audit.client import AuditClient
client = AuditClient()
# Ingest spans
client.traces.new(span_data) # Single
client.traces.new(s1, s2, s3) # Batch
# List/search traces
client.traces.list(limit=10)
client.traces.search(path="/api/v1/users")
# Get trace tree
tree = client.traces[trace_id].get_tree()
# Get span
span = client.traces[trace_id].spans[span_id].get()
Related Issues
Acceptance Criteria
Testing
Overview
Create an internal HTTP client for the Campus audit service that follows Campus API schema conventions. This client enables
campus.authandcampus.apideployments to send trace spans tocampus.auditvia HTTP.Background
The tracing middleware (issue #428) needs to send trace data to the audit service. Since the middleware runs in separate deployment processes (campus.auth, campus.api), it cannot import audit resources directly and must use HTTP.
Design
Follows
campus-api-pythonstructure with:ResourceCollectionfor collections (e.g.,Traces)Traces.Trace)new(),list(),search(),get()client.traces[trace_id]client.traces[trace_id].spanscampus.common.http.DefaultClientfor HTTPImplementation
Files Created
campus/audit/client/__init__.py-AuditCliententry pointcampus/audit/client/interface.py-ResourceRoot,ResourceCollection,Resourcebase classescampus/audit/client/v1/__init__.py- v1 API modulecampus/audit/client/v1/root.py-AuditRootresourcecampus/audit/client/v1/traces.py-Traces,Trace,Spans,Spanresourcestests/unit/audit/test_client.py- Client initialization teststests/unit/audit/test_interface.py- Base resource class teststests/unit/audit/test_traces.py- Traces resource testsAPI Usage
Related Issues
Acceptance Criteria
campus.common.http.DefaultClientfor HTTPnew(),list(),search(),get())Testing