List of Observable wrappers generated by the [GenerateObservablePort] Source Generator.
Original Class Observable Wrapper Port AIModelRepositoryInMemory AIModelRepositoryInMemoryObservable IAIModelRepository DeploymentRepositoryInMemory DeploymentRepositoryInMemoryObservable IDeploymentRepository AssessmentRepositoryInMemory AssessmentRepositoryInMemoryObservable IAssessmentRepository IncidentRepositoryInMemory IncidentRepositoryInMemoryObservable IIncidentRepository UnitOfWorkInMemory UnitOfWorkInMemoryObservable IUnitOfWork
Original Class Observable Wrapper Port AIModelRepositoryEfCore AIModelRepositoryEfCoreObservable IAIModelRepository DeploymentRepositoryEfCore DeploymentRepositoryEfCoreObservable IDeploymentRepository AssessmentRepositoryEfCore AssessmentRepositoryEfCoreObservable IAssessmentRepository IncidentRepositoryEfCore IncidentRepositoryEfCoreObservable IIncidentRepository UnitOfWorkEfCore UnitOfWorkEfCoreObservable IUnitOfWork
Original Class Observable Wrapper Port AIModelQueryInMemory AIModelQueryInMemoryObservable IAIModelQuery AIModelDetailQueryInMemory AIModelDetailQueryInMemoryObservable IModelDetailQuery DeploymentQueryInMemory DeploymentQueryInMemoryObservable IDeploymentQuery DeploymentDetailQueryInMemory DeploymentDetailQueryInMemoryObservable IDeploymentDetailQuery IncidentQueryInMemory IncidentQueryInMemoryObservable IIncidentQuery
Original Class IO Pattern Port ModelHealthCheckService Timeout + Catch IModelHealthCheckService ModelMonitoringService Retry + Schedule IModelMonitoringService ParallelComplianceCheckService Fork + awaitAll IParallelComplianceCheckService ModelRegistryService Bracket IModelRegistryService
Observable Port Total: 19 (InMemory Repository 5 + EfCore Repository 5 + Query 5 + External Service 4)
The Functorium Pipeline’s UseCtxEnricher() middleware automatically propagates properties of Command/Query Requests and DomainEvents as ctx.* fields.
Command ctx.* Field Pillar RegisterModelCommand ctx.register_model_command.request.nameDefault(L+T) ctx.register_model_command.request.versionDefault(L+T) ctx.register_model_command.request.purposeLogging CreateDeploymentCommand ctx.create_deployment_command.request.model_idDefault(L+T) ctx.create_deployment_command.request.environmentAll(L+T+M) ctx.create_deployment_command.request.drift_thresholdDefault+MetricsValue ReportIncidentCommand ctx.report_incident_command.request.severityAll(L+T+M) ctx.report_incident_command.request.descriptionLogging
Event ctx.* Field Pillar AIModel.RiskClassifiedEvent ctx.risk_classified_event.model_idDefault(L+T) ctx.risk_classified_event.new_risk_tierDefault(L+T) ModelIncident.ReportedEvent ctx.reported_event.severityAll(L+T+M) ctx.reported_event.deployment_idDefault(L+T)
. RegisterOpenTelemetry (configuration, AssemblyReference . Assembly )
. ConfigurePipelines (pipelines => pipelines
. UseObservability () // Batch enable CtxEnricher + Metrics + Tracing + Logging
UseObservability() batch enables all 4 observability types. The remaining pipelines are registered via explicit opt-in:
Order Middleware Collection Target Output 1 UseObservability() -> MetricsCounter(requests, responses), Histogram(duration) Prometheus / OTLP 2 UseObservability() -> TracingActivity Span (entry/exit/tags) Jaeger / OTLP 3 UseObservability() -> CtxEnricherRequest/Response/Event properties LogContext + Activity.SetTag + MetricsTagContext 4 UseObservability() -> LoggingStructured logs (Serilog) Console / OTLP 5 UseValidation()FluentValidation-based request validation Validation Error 6 UseException()Exception -> DomainError/AdapterError conversion error.type, error.code tags
services . AddMediator (options =>
options . ServiceLifetime = ServiceLifetime . Scoped ;
options . NotificationPublisherType =
typeof (ObservableDomainEventNotificationPublisher);
services . RegisterDomainEventPublisher ();
services . RegisterDomainEventHandlersFromAssembly (
AiGovernance . Application . AssemblyReference . Assembly );
ObservableDomainEventNotificationPublisher automatically performs metrics, tracing, and logging when publishing DomainEvents. EventHandler observability is provided through Mediator’s NotificationPublisherType.
IO patterns and observability integration status for the 4 external services.
IO.liftAsync -> .Timeout(10s) -> .Catch(TimedOut -> fallback) -> .Catch(Exceptional -> error)
[GenerateObservablePort] -> Observable wrapper auto-generated
adapter.external_service.requests (Counter)
adapter.external_service.duration (Histogram)
adapter.external_service.responses (Counter + error.type)
IO.liftAsync -> .Retry(exponential|jitter|recurs|maxDelay) -> .Catch(Exceptional -> error)
Observable wrapper: observes only the final result
Retry attempt count tracked via internal logging
CriterionNames.Map(name => CheckSingle(name).Fork()) -> awaitAll(forks) -> .Map(aggregate)
Observable wrapper: observes the entire parallel check result as a single call
Individual criterion checks execute inside Fork (not individually observed)
acquireSession.Bracket(Use: lookupModel, Fin: releaseSession) -> .Catch(Exceptional -> error)
Observable wrapper: observes the entire Bracket as a single call
Acquire/Use/Release sub-steps tracked via internal logging
Item Count Observable Port (InMemory Repository) 5 Observable Port (EfCore Repository) 5 Observable Port (Query) 5 Observable Port (External Service) 4 Observable Port Total 19 Pipeline Middleware 5 (Metrics, Tracing, CtxEnricher, Logging, Exception) DomainEvent Observability ObservableDomainEventNotificationPublisher ctx.* MetricsTag Fields 2 (Environment, Severity) ctx.* MetricsValue Fields 1 (DriftThreshold) ctx.* Default(L+T) Fields 8+ (ModelId, DeploymentId, Name, Version, etc.) ctx.* Logging Only Fields 2 (Purpose, Description)