What it does: Central decisions (PDP) + per-field obligations at resolve time (PEP).
Unifies: Identity + data policy—same query, different answers by role/attrs/risk.
Analyst AI is disabled by policy; Admin can see AI-enabled responses when permitted.
Field-level masking & actions in the AIGQLUnify control plane UI. The same PDP decision that hides email for an analyst also denies the destructive Delete Order action.
DSAR export call traced via OpenTelemetry in Jaeger. A /compliance/.../dsar POST
completes in ~1.5 ms with all HTTP and network tags attached for audit and SRE debugging.
End-to-end trace view for a GraphQL POST: control plane (cp) and data plane (dp)
spans on the same timeline. Here are the traces of CP and DP, each tagged with PDP decisions and DSAR metadata,
so you can see policy and latency together at a glance.
Service-level telemetry in Jaeger: pick the apigql-data-plane service, choose a lookback
window (for example, the last 5 minutes), and slice by duration or tags. Lots of options for narrowing
down noisy traffic while staying inside the same Zero-Trust, DSAR-aware trace surface.
AIGQLUnify keeps zero-trust and DSAR readiness in the path, but it’s designed so that PDP calls, masking, and OpenTelemetry add predictable, bounded overhead rather than surprise tax.
The control plane acts as your Policy Decision Point via a decidePdp function that evaluates:
subject (who is calling), action (read, create, delete, invoke for AI),
resource (GraphQuery, DSAR, orders, etc.), and rich context such as the
exact GraphQL selections requested.
allow: false — a zero-trust baseline.create, delete,
and introspection; DSAR actions are limited to admin / privacy roles.isAnalyst && isAI can be refused up front.read, the PDP returns
obligations.mask = ["userEmail", …] instead of just allow: true.The same decision is enforced at two layers so you don’t have to re-implement security in every microservice:
enforcePdp first.
If the decision is not allowed, the request ends with 403 Forbidden before any
backend is touched. A global onRequest hook verifies JWTs when enabled.obligations.mask to redact or drop fields
as it resolves data — field-level PEP at the gateway / subgraph layer.Security is in the hot path, but the design keeps latency under control:
Observability is wired to the same decisions, without putting the collector on your critical path:
tagPdpDecision and tagDsarSpan
attach the decision (allow flag, reason, resource, obligations) as attributes on every OpenTelemetry span.Net effect: you get zero-trust by default, field-level masking, and DSAR-ready traces with a security cost that is designed to be small, predictable, and explainable to both your SREs and your auditors.