Skip to content

[Privacy/Observability] Keep owner-scoped resource identifiers out of ETL failure logs #218

Description

@seonghobae

Buyer / operability gap

Protected develop@622e5e6c3d534f230c390f10e3832efadfc01825 uses the shared EtlApiProblemHandler for both synchronous ETL and owner-scoped durable-job controllers. Every covered failure historically logged request.getRequestURI(). For durable-job resources that URI contains the opaque job_record_id, so ordinary WARN/ERROR diagnostics acquired per-job high-cardinality resource identifiers even though the public HTTP Problem Details body is deliberately bounded and non-sensitive.

This is narrower than #182's base logging/sampling-profile work. #182 already requires ordinary logs/spans not to key on job IDs. This issue closes the concrete shared-handler boundary without changing response ProblemDetail.instance, authorization, controller routing, payload handling, or the local debug profile.

RCA

  • Immediate cause: handleRequestFailure, handleUnreadableBody, handleTransientTargetFailure, handleTargetFailure, and handleUnexpectedFailure interpolated the raw request URI into ordinary logs.
  • Technical root cause: client-facing resource identity and operator failure classification were coupled even though resource identity is unnecessary for distinguishing ETL failure classes.
  • Control failure: controller tests proved response confidentiality but did not capture logs for owner-scoped resource paths.
  • Risk: durable job IDs became unnecessary high-cardinality log dimensions and could be exported to centralized logs/support bundles, contradicting [Operability/Privacy] Separate local-debug observability from production-safe defaults #182's finite-cardinality/privacy contract.

Live implementation state — active PR #219

Draft PR #219, branch privacy/etl-problem-log-resource-id-622e5e6, is the bounded direct-develop owner for this issue.

RED

Test-only source 1679d0c9ad99297ba710425e700fe68c21101dd4 added EtlApiProblemHandlerLoggingTest before production changed. Hosted CI 31366659260, macOS job 93386394718, checked out synthetic merge 30ccf21c5fcde284385f9d348b35c3020f9a480a, compiled production/tests successfully and ran 276 ETL tests with exactly one failure, zero errors/skips. The failing log was:

ETL target failure path=/api/etl/jobs/0198f4cf-41c8-7f52-9e5d-private-job-marker ...

The new assertion failed only because the unique owner-scoped resource marker was present. This is valid RED at the real handler/logging boundary, not setup/import/fixture/dependency failure.

GREEN candidate

Exact current candidate 79e8e4e7d593665c99d94dfc35fe842c1e5c749f is exactly one fast-forward commit over the RED head and changes only EtlApiProblemHandler.java. It removes request-URI transport from all covered ordinary log calls while preserving stable failure/error classifications and existing exception-type metadata. RFC 9457 ProblemDetail.instance still uses the request URI, so client-visible response semantics remain unchanged.

The publication comparison is ahead 1 / behind 0, merge base exactly the RED head; no unrelated branch movement was incorporated. Current-head CI/security/SAST are running and are not counted as passing until terminal.

Acceptance / shared boundaries

Current classification: active_pr via #219. Nothing is implemented_on_develop until protected integration and protected-develop acceptance.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area: authAuthentication, authorization, identity, or tenant isolationarea: ci-cdCI, GitHub Actions, checks, release, or supply chainarea: dependenciesDependency or lockfile maintenancearea: securitySecurity boundary, hardening, or vulnerability preventionbugSomething isn't workingpriority: mediumNormal-priority or P2 workstatus: triagedOpen issue has an organization taxonomy assignmenttype: featureNew or expanded product capability

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions