Skip to content

Internal Audit API Client for Service-to-Service Communication #453

@nycomp

Description

@nycomp

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

  • Client follows Campus API schema conventions
  • Supports all trace operations (ingest, list, search, get_tree, get_span)
  • Environment-based URL resolution (development/testing/staging/production)
  • Uses campus.common.http.DefaultClient for HTTP
  • Proper error handling and logging
  • Nested class structure matching campus-api-python
  • Bracket access for IDs, property access for named resources
  • Standard verbs (new(), list(), search(), get())

Testing

  • Unit tests for client methods (test_client.py, test_interface.py, test_traces.py)
  • Integration tests with real audit service
  • Contract tests matching server-side API

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    Status

    Testing/Integration

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions