omnibase_infra 0.2.1__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- omnibase_infra/__init__.py +101 -0
- omnibase_infra/cli/__init__.py +1 -0
- omnibase_infra/cli/commands.py +216 -0
- omnibase_infra/clients/__init__.py +0 -0
- omnibase_infra/contracts/handlers/filesystem/handler_contract.yaml +261 -0
- omnibase_infra/contracts/handlers/mcp/handler_contract.yaml +138 -0
- omnibase_infra/decorators/__init__.py +29 -0
- omnibase_infra/decorators/allow_any.py +109 -0
- omnibase_infra/dlq/__init__.py +90 -0
- omnibase_infra/dlq/constants_dlq.py +57 -0
- omnibase_infra/dlq/models/__init__.py +26 -0
- omnibase_infra/dlq/models/enum_replay_status.py +37 -0
- omnibase_infra/dlq/models/model_dlq_replay_record.py +135 -0
- omnibase_infra/dlq/models/model_dlq_tracking_config.py +184 -0
- omnibase_infra/dlq/service_dlq_tracking.py +611 -0
- omnibase_infra/enums/__init__.py +123 -0
- omnibase_infra/enums/enum_any_type_violation.py +104 -0
- omnibase_infra/enums/enum_backend_type.py +27 -0
- omnibase_infra/enums/enum_capture_outcome.py +42 -0
- omnibase_infra/enums/enum_capture_state.py +88 -0
- omnibase_infra/enums/enum_chain_violation_type.py +119 -0
- omnibase_infra/enums/enum_circuit_state.py +51 -0
- omnibase_infra/enums/enum_confirmation_event_type.py +27 -0
- omnibase_infra/enums/enum_contract_type.py +84 -0
- omnibase_infra/enums/enum_dedupe_strategy.py +46 -0
- omnibase_infra/enums/enum_dispatch_status.py +191 -0
- omnibase_infra/enums/enum_environment.py +46 -0
- omnibase_infra/enums/enum_execution_shape_violation.py +103 -0
- omnibase_infra/enums/enum_handler_error_type.py +101 -0
- omnibase_infra/enums/enum_handler_loader_error.py +178 -0
- omnibase_infra/enums/enum_handler_source_type.py +87 -0
- omnibase_infra/enums/enum_handler_type.py +77 -0
- omnibase_infra/enums/enum_handler_type_category.py +61 -0
- omnibase_infra/enums/enum_infra_transport_type.py +73 -0
- omnibase_infra/enums/enum_introspection_reason.py +154 -0
- omnibase_infra/enums/enum_message_category.py +213 -0
- omnibase_infra/enums/enum_node_archetype.py +74 -0
- omnibase_infra/enums/enum_node_output_type.py +185 -0
- omnibase_infra/enums/enum_non_retryable_error_category.py +224 -0
- omnibase_infra/enums/enum_policy_type.py +32 -0
- omnibase_infra/enums/enum_registration_state.py +261 -0
- omnibase_infra/enums/enum_registration_status.py +33 -0
- omnibase_infra/enums/enum_registry_response_status.py +28 -0
- omnibase_infra/enums/enum_response_status.py +26 -0
- omnibase_infra/enums/enum_retry_error_category.py +98 -0
- omnibase_infra/enums/enum_security_rule_id.py +103 -0
- omnibase_infra/enums/enum_selection_strategy.py +91 -0
- omnibase_infra/enums/enum_topic_standard.py +42 -0
- omnibase_infra/enums/enum_validation_severity.py +78 -0
- omnibase_infra/errors/__init__.py +156 -0
- omnibase_infra/errors/error_architecture_violation.py +152 -0
- omnibase_infra/errors/error_chain_propagation.py +188 -0
- omnibase_infra/errors/error_compute_registry.py +92 -0
- omnibase_infra/errors/error_consul.py +132 -0
- omnibase_infra/errors/error_container_wiring.py +243 -0
- omnibase_infra/errors/error_event_bus_registry.py +102 -0
- omnibase_infra/errors/error_infra.py +608 -0
- omnibase_infra/errors/error_message_type_registry.py +101 -0
- omnibase_infra/errors/error_policy_registry.py +112 -0
- omnibase_infra/errors/error_vault.py +123 -0
- omnibase_infra/event_bus/__init__.py +72 -0
- omnibase_infra/event_bus/configs/kafka_event_bus_config.yaml +86 -0
- omnibase_infra/event_bus/event_bus_inmemory.py +743 -0
- omnibase_infra/event_bus/event_bus_kafka.py +1658 -0
- omnibase_infra/event_bus/mixin_kafka_broadcast.py +184 -0
- omnibase_infra/event_bus/mixin_kafka_dlq.py +765 -0
- omnibase_infra/event_bus/models/__init__.py +29 -0
- omnibase_infra/event_bus/models/config/__init__.py +20 -0
- omnibase_infra/event_bus/models/config/model_kafka_event_bus_config.py +725 -0
- omnibase_infra/event_bus/models/model_dlq_event.py +206 -0
- omnibase_infra/event_bus/models/model_dlq_metrics.py +304 -0
- omnibase_infra/event_bus/models/model_event_headers.py +115 -0
- omnibase_infra/event_bus/models/model_event_message.py +60 -0
- omnibase_infra/event_bus/topic_constants.py +376 -0
- omnibase_infra/handlers/__init__.py +75 -0
- omnibase_infra/handlers/filesystem/__init__.py +48 -0
- omnibase_infra/handlers/filesystem/enum_file_system_operation.py +35 -0
- omnibase_infra/handlers/filesystem/model_file_system_request.py +298 -0
- omnibase_infra/handlers/filesystem/model_file_system_result.py +166 -0
- omnibase_infra/handlers/handler_consul.py +787 -0
- omnibase_infra/handlers/handler_db.py +1039 -0
- omnibase_infra/handlers/handler_filesystem.py +1478 -0
- omnibase_infra/handlers/handler_graph.py +1154 -0
- omnibase_infra/handlers/handler_http.py +920 -0
- omnibase_infra/handlers/handler_manifest_persistence.contract.yaml +184 -0
- omnibase_infra/handlers/handler_manifest_persistence.py +1539 -0
- omnibase_infra/handlers/handler_mcp.py +748 -0
- omnibase_infra/handlers/handler_qdrant.py +1076 -0
- omnibase_infra/handlers/handler_vault.py +422 -0
- omnibase_infra/handlers/mcp/__init__.py +19 -0
- omnibase_infra/handlers/mcp/adapter_onex_to_mcp.py +446 -0
- omnibase_infra/handlers/mcp/protocols.py +178 -0
- omnibase_infra/handlers/mcp/transport_streamable_http.py +352 -0
- omnibase_infra/handlers/mixins/__init__.py +42 -0
- omnibase_infra/handlers/mixins/mixin_consul_initialization.py +349 -0
- omnibase_infra/handlers/mixins/mixin_consul_kv.py +337 -0
- omnibase_infra/handlers/mixins/mixin_consul_service.py +277 -0
- omnibase_infra/handlers/mixins/mixin_vault_initialization.py +338 -0
- omnibase_infra/handlers/mixins/mixin_vault_retry.py +412 -0
- omnibase_infra/handlers/mixins/mixin_vault_secrets.py +450 -0
- omnibase_infra/handlers/mixins/mixin_vault_token.py +365 -0
- omnibase_infra/handlers/models/__init__.py +286 -0
- omnibase_infra/handlers/models/consul/__init__.py +81 -0
- omnibase_infra/handlers/models/consul/enum_consul_operation_type.py +57 -0
- omnibase_infra/handlers/models/consul/model_consul_deregister_payload.py +51 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_config.py +153 -0
- omnibase_infra/handlers/models/consul/model_consul_handler_payload.py +89 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_found_payload.py +55 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_not_found_payload.py +49 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_get_recurse_payload.py +50 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_item.py +33 -0
- omnibase_infra/handlers/models/consul/model_consul_kv_put_payload.py +41 -0
- omnibase_infra/handlers/models/consul/model_consul_register_payload.py +53 -0
- omnibase_infra/handlers/models/consul/model_consul_retry_config.py +66 -0
- omnibase_infra/handlers/models/consul/model_payload_consul.py +66 -0
- omnibase_infra/handlers/models/consul/registry_payload_consul.py +214 -0
- omnibase_infra/handlers/models/graph/__init__.py +35 -0
- omnibase_infra/handlers/models/graph/enum_graph_operation_type.py +20 -0
- omnibase_infra/handlers/models/graph/model_graph_execute_payload.py +38 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_config.py +54 -0
- omnibase_infra/handlers/models/graph/model_graph_handler_payload.py +44 -0
- omnibase_infra/handlers/models/graph/model_graph_query_payload.py +40 -0
- omnibase_infra/handlers/models/graph/model_graph_record.py +22 -0
- omnibase_infra/handlers/models/http/__init__.py +50 -0
- omnibase_infra/handlers/models/http/enum_http_operation_type.py +29 -0
- omnibase_infra/handlers/models/http/model_http_body_content.py +45 -0
- omnibase_infra/handlers/models/http/model_http_get_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_http_handler_payload.py +90 -0
- omnibase_infra/handlers/models/http/model_http_post_payload.py +88 -0
- omnibase_infra/handlers/models/http/model_payload_http.py +66 -0
- omnibase_infra/handlers/models/http/registry_payload_http.py +212 -0
- omnibase_infra/handlers/models/mcp/__init__.py +23 -0
- omnibase_infra/handlers/models/mcp/enum_mcp_operation_type.py +24 -0
- omnibase_infra/handlers/models/mcp/model_mcp_handler_config.py +40 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_call.py +32 -0
- omnibase_infra/handlers/models/mcp/model_mcp_tool_result.py +45 -0
- omnibase_infra/handlers/models/model_consul_handler_response.py +96 -0
- omnibase_infra/handlers/models/model_db_describe_response.py +83 -0
- omnibase_infra/handlers/models/model_db_query_payload.py +95 -0
- omnibase_infra/handlers/models/model_db_query_response.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_config.py +98 -0
- omnibase_infra/handlers/models/model_filesystem_delete_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_delete_result.py +77 -0
- omnibase_infra/handlers/models/model_filesystem_directory_entry.py +75 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_payload.py +54 -0
- omnibase_infra/handlers/models/model_filesystem_ensure_directory_result.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_payload.py +60 -0
- omnibase_infra/handlers/models/model_filesystem_list_directory_result.py +68 -0
- omnibase_infra/handlers/models/model_filesystem_read_payload.py +62 -0
- omnibase_infra/handlers/models/model_filesystem_read_result.py +61 -0
- omnibase_infra/handlers/models/model_filesystem_write_payload.py +70 -0
- omnibase_infra/handlers/models/model_filesystem_write_result.py +55 -0
- omnibase_infra/handlers/models/model_graph_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_handler_response.py +103 -0
- omnibase_infra/handlers/models/model_http_handler_response.py +101 -0
- omnibase_infra/handlers/models/model_manifest_metadata.py +75 -0
- omnibase_infra/handlers/models/model_manifest_persistence_config.py +62 -0
- omnibase_infra/handlers/models/model_manifest_query_payload.py +90 -0
- omnibase_infra/handlers/models/model_manifest_query_result.py +97 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_payload.py +44 -0
- omnibase_infra/handlers/models/model_manifest_retrieve_result.py +98 -0
- omnibase_infra/handlers/models/model_manifest_store_payload.py +47 -0
- omnibase_infra/handlers/models/model_manifest_store_result.py +67 -0
- omnibase_infra/handlers/models/model_operation_context.py +187 -0
- omnibase_infra/handlers/models/model_qdrant_handler_response.py +98 -0
- omnibase_infra/handlers/models/model_retry_state.py +162 -0
- omnibase_infra/handlers/models/model_vault_handler_response.py +98 -0
- omnibase_infra/handlers/models/qdrant/__init__.py +44 -0
- omnibase_infra/handlers/models/qdrant/enum_qdrant_operation_type.py +26 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_collection_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_delete_payload.py +36 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_config.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_handler_payload.py +54 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_payload.py +42 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_search_result.py +30 -0
- omnibase_infra/handlers/models/qdrant/model_qdrant_upsert_payload.py +36 -0
- omnibase_infra/handlers/models/vault/__init__.py +69 -0
- omnibase_infra/handlers/models/vault/enum_vault_operation_type.py +35 -0
- omnibase_infra/handlers/models/vault/model_payload_vault.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_delete_payload.py +57 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_config.py +148 -0
- omnibase_infra/handlers/models/vault/model_vault_handler_payload.py +101 -0
- omnibase_infra/handlers/models/vault/model_vault_list_payload.py +58 -0
- omnibase_infra/handlers/models/vault/model_vault_renew_token_payload.py +67 -0
- omnibase_infra/handlers/models/vault/model_vault_retry_config.py +66 -0
- omnibase_infra/handlers/models/vault/model_vault_secret_payload.py +106 -0
- omnibase_infra/handlers/models/vault/model_vault_write_payload.py +66 -0
- omnibase_infra/handlers/models/vault/registry_payload_vault.py +213 -0
- omnibase_infra/handlers/registration_storage/__init__.py +43 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_mock.py +392 -0
- omnibase_infra/handlers/registration_storage/handler_registration_storage_postgres.py +915 -0
- omnibase_infra/handlers/registration_storage/models/__init__.py +23 -0
- omnibase_infra/handlers/registration_storage/models/model_delete_registration_request.py +58 -0
- omnibase_infra/handlers/registration_storage/models/model_update_registration_request.py +73 -0
- omnibase_infra/handlers/registration_storage/protocol_registration_persistence.py +191 -0
- omnibase_infra/handlers/service_discovery/__init__.py +43 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_consul.py +747 -0
- omnibase_infra/handlers/service_discovery/handler_service_discovery_mock.py +258 -0
- omnibase_infra/handlers/service_discovery/models/__init__.py +22 -0
- omnibase_infra/handlers/service_discovery/models/model_discovery_result.py +64 -0
- omnibase_infra/handlers/service_discovery/models/model_registration_result.py +138 -0
- omnibase_infra/handlers/service_discovery/models/model_service_info.py +99 -0
- omnibase_infra/handlers/service_discovery/protocol_discovery_operations.py +170 -0
- omnibase_infra/idempotency/__init__.py +94 -0
- omnibase_infra/idempotency/models/__init__.py +43 -0
- omnibase_infra/idempotency/models/model_idempotency_check_result.py +85 -0
- omnibase_infra/idempotency/models/model_idempotency_guard_config.py +130 -0
- omnibase_infra/idempotency/models/model_idempotency_record.py +86 -0
- omnibase_infra/idempotency/models/model_idempotency_store_health_check_result.py +81 -0
- omnibase_infra/idempotency/models/model_idempotency_store_metrics.py +140 -0
- omnibase_infra/idempotency/models/model_postgres_idempotency_store_config.py +299 -0
- omnibase_infra/idempotency/protocol_idempotency_store.py +184 -0
- omnibase_infra/idempotency/store_inmemory.py +265 -0
- omnibase_infra/idempotency/store_postgres.py +923 -0
- omnibase_infra/infrastructure/__init__.py +0 -0
- omnibase_infra/mixins/__init__.py +71 -0
- omnibase_infra/mixins/mixin_async_circuit_breaker.py +655 -0
- omnibase_infra/mixins/mixin_dict_like_accessors.py +146 -0
- omnibase_infra/mixins/mixin_envelope_extraction.py +119 -0
- omnibase_infra/mixins/mixin_node_introspection.py +2465 -0
- omnibase_infra/mixins/mixin_retry_execution.py +386 -0
- omnibase_infra/mixins/protocol_circuit_breaker_aware.py +133 -0
- omnibase_infra/models/__init__.py +136 -0
- omnibase_infra/models/corpus/__init__.py +17 -0
- omnibase_infra/models/corpus/model_capture_config.py +133 -0
- omnibase_infra/models/corpus/model_capture_result.py +86 -0
- omnibase_infra/models/discovery/__init__.py +42 -0
- omnibase_infra/models/discovery/model_dependency_spec.py +319 -0
- omnibase_infra/models/discovery/model_discovered_capabilities.py +50 -0
- omnibase_infra/models/discovery/model_introspection_config.py +311 -0
- omnibase_infra/models/discovery/model_introspection_performance_metrics.py +169 -0
- omnibase_infra/models/discovery/model_introspection_task_config.py +116 -0
- omnibase_infra/models/dispatch/__init__.py +147 -0
- omnibase_infra/models/dispatch/model_dispatch_context.py +439 -0
- omnibase_infra/models/dispatch/model_dispatch_error.py +336 -0
- omnibase_infra/models/dispatch/model_dispatch_log_context.py +400 -0
- omnibase_infra/models/dispatch/model_dispatch_metadata.py +228 -0
- omnibase_infra/models/dispatch/model_dispatch_metrics.py +496 -0
- omnibase_infra/models/dispatch/model_dispatch_outcome.py +317 -0
- omnibase_infra/models/dispatch/model_dispatch_outputs.py +231 -0
- omnibase_infra/models/dispatch/model_dispatch_result.py +436 -0
- omnibase_infra/models/dispatch/model_dispatch_route.py +279 -0
- omnibase_infra/models/dispatch/model_dispatcher_metrics.py +275 -0
- omnibase_infra/models/dispatch/model_dispatcher_registration.py +352 -0
- omnibase_infra/models/dispatch/model_parsed_topic.py +135 -0
- omnibase_infra/models/dispatch/model_topic_parser.py +725 -0
- omnibase_infra/models/dispatch/model_tracing_context.py +285 -0
- omnibase_infra/models/errors/__init__.py +45 -0
- omnibase_infra/models/errors/model_handler_validation_error.py +594 -0
- omnibase_infra/models/errors/model_infra_error_context.py +99 -0
- omnibase_infra/models/errors/model_message_type_registry_error_context.py +71 -0
- omnibase_infra/models/errors/model_timeout_error_context.py +110 -0
- omnibase_infra/models/handlers/__init__.py +37 -0
- omnibase_infra/models/handlers/model_contract_discovery_result.py +80 -0
- omnibase_infra/models/handlers/model_handler_descriptor.py +185 -0
- omnibase_infra/models/handlers/model_handler_identifier.py +215 -0
- omnibase_infra/models/health/__init__.py +9 -0
- omnibase_infra/models/health/model_health_check_result.py +40 -0
- omnibase_infra/models/lifecycle/__init__.py +39 -0
- omnibase_infra/models/logging/__init__.py +51 -0
- omnibase_infra/models/logging/model_log_context.py +756 -0
- omnibase_infra/models/model_retry_error_classification.py +78 -0
- omnibase_infra/models/projection/__init__.py +43 -0
- omnibase_infra/models/projection/model_capability_fields.py +112 -0
- omnibase_infra/models/projection/model_registration_projection.py +434 -0
- omnibase_infra/models/projection/model_registration_snapshot.py +322 -0
- omnibase_infra/models/projection/model_sequence_info.py +182 -0
- omnibase_infra/models/projection/model_snapshot_topic_config.py +590 -0
- omnibase_infra/models/projectors/__init__.py +41 -0
- omnibase_infra/models/projectors/model_projector_column.py +289 -0
- omnibase_infra/models/projectors/model_projector_discovery_result.py +65 -0
- omnibase_infra/models/projectors/model_projector_index.py +270 -0
- omnibase_infra/models/projectors/model_projector_schema.py +415 -0
- omnibase_infra/models/projectors/model_projector_validation_error.py +63 -0
- omnibase_infra/models/projectors/util_sql_identifiers.py +115 -0
- omnibase_infra/models/registration/__init__.py +59 -0
- omnibase_infra/models/registration/commands/__init__.py +15 -0
- omnibase_infra/models/registration/commands/model_node_registration_acked.py +108 -0
- omnibase_infra/models/registration/events/__init__.py +56 -0
- omnibase_infra/models/registration/events/model_node_became_active.py +103 -0
- omnibase_infra/models/registration/events/model_node_liveness_expired.py +103 -0
- omnibase_infra/models/registration/events/model_node_registration_accepted.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_received.py +98 -0
- omnibase_infra/models/registration/events/model_node_registration_ack_timed_out.py +112 -0
- omnibase_infra/models/registration/events/model_node_registration_initiated.py +107 -0
- omnibase_infra/models/registration/events/model_node_registration_rejected.py +104 -0
- omnibase_infra/models/registration/model_introspection_metrics.py +253 -0
- omnibase_infra/models/registration/model_node_capabilities.py +179 -0
- omnibase_infra/models/registration/model_node_heartbeat_event.py +126 -0
- omnibase_infra/models/registration/model_node_introspection_event.py +175 -0
- omnibase_infra/models/registration/model_node_metadata.py +79 -0
- omnibase_infra/models/registration/model_node_registration.py +162 -0
- omnibase_infra/models/registration/model_node_registration_record.py +162 -0
- omnibase_infra/models/registry/__init__.py +29 -0
- omnibase_infra/models/registry/model_domain_constraint.py +202 -0
- omnibase_infra/models/registry/model_message_type_entry.py +271 -0
- omnibase_infra/models/resilience/__init__.py +9 -0
- omnibase_infra/models/resilience/model_circuit_breaker_config.py +227 -0
- omnibase_infra/models/routing/__init__.py +25 -0
- omnibase_infra/models/routing/model_routing_entry.py +52 -0
- omnibase_infra/models/routing/model_routing_subcontract.py +70 -0
- omnibase_infra/models/runtime/__init__.py +40 -0
- omnibase_infra/models/runtime/model_contract_security_config.py +41 -0
- omnibase_infra/models/runtime/model_discovery_error.py +81 -0
- omnibase_infra/models/runtime/model_discovery_result.py +162 -0
- omnibase_infra/models/runtime/model_discovery_warning.py +74 -0
- omnibase_infra/models/runtime/model_failed_plugin_load.py +63 -0
- omnibase_infra/models/runtime/model_handler_contract.py +280 -0
- omnibase_infra/models/runtime/model_loaded_handler.py +120 -0
- omnibase_infra/models/runtime/model_plugin_load_context.py +93 -0
- omnibase_infra/models/runtime/model_plugin_load_summary.py +124 -0
- omnibase_infra/models/security/__init__.py +50 -0
- omnibase_infra/models/security/classification_levels.py +99 -0
- omnibase_infra/models/security/model_environment_policy.py +145 -0
- omnibase_infra/models/security/model_handler_security_policy.py +107 -0
- omnibase_infra/models/security/model_security_error.py +81 -0
- omnibase_infra/models/security/model_security_validation_result.py +328 -0
- omnibase_infra/models/security/model_security_warning.py +67 -0
- omnibase_infra/models/snapshot/__init__.py +27 -0
- omnibase_infra/models/snapshot/model_field_change.py +65 -0
- omnibase_infra/models/snapshot/model_snapshot.py +270 -0
- omnibase_infra/models/snapshot/model_snapshot_diff.py +203 -0
- omnibase_infra/models/snapshot/model_subject_ref.py +81 -0
- omnibase_infra/models/types/__init__.py +71 -0
- omnibase_infra/models/validation/__init__.py +89 -0
- omnibase_infra/models/validation/model_any_type_validation_result.py +118 -0
- omnibase_infra/models/validation/model_any_type_violation.py +141 -0
- omnibase_infra/models/validation/model_category_match_result.py +345 -0
- omnibase_infra/models/validation/model_chain_violation.py +166 -0
- omnibase_infra/models/validation/model_coverage_metrics.py +316 -0
- omnibase_infra/models/validation/model_execution_shape_rule.py +159 -0
- omnibase_infra/models/validation/model_execution_shape_validation.py +208 -0
- omnibase_infra/models/validation/model_execution_shape_validation_result.py +294 -0
- omnibase_infra/models/validation/model_execution_shape_violation.py +122 -0
- omnibase_infra/models/validation/model_localhandler_validation_result.py +139 -0
- omnibase_infra/models/validation/model_localhandler_violation.py +100 -0
- omnibase_infra/models/validation/model_output_validation_params.py +74 -0
- omnibase_infra/models/validation/model_validate_and_raise_params.py +84 -0
- omnibase_infra/models/validation/model_validation_error_params.py +84 -0
- omnibase_infra/models/validation/model_validation_outcome.py +287 -0
- omnibase_infra/nodes/__init__.py +48 -0
- omnibase_infra/nodes/architecture_validator/__init__.py +79 -0
- omnibase_infra/nodes/architecture_validator/contract.yaml +252 -0
- omnibase_infra/nodes/architecture_validator/contract_architecture_validator.yaml +208 -0
- omnibase_infra/nodes/architecture_validator/mixins/__init__.py +16 -0
- omnibase_infra/nodes/architecture_validator/mixins/mixin_file_path_rule.py +92 -0
- omnibase_infra/nodes/architecture_validator/models/__init__.py +36 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_request.py +56 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_validation_result.py +311 -0
- omnibase_infra/nodes/architecture_validator/models/model_architecture_violation.py +163 -0
- omnibase_infra/nodes/architecture_validator/models/model_rule_check_result.py +265 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_request.py +105 -0
- omnibase_infra/nodes/architecture_validator/models/model_validation_result.py +314 -0
- omnibase_infra/nodes/architecture_validator/node.py +262 -0
- omnibase_infra/nodes/architecture_validator/node_architecture_validator.py +383 -0
- omnibase_infra/nodes/architecture_validator/protocols/__init__.py +9 -0
- omnibase_infra/nodes/architecture_validator/protocols/protocol_architecture_rule.py +225 -0
- omnibase_infra/nodes/architecture_validator/registry/__init__.py +28 -0
- omnibase_infra/nodes/architecture_validator/registry/registry_infra_architecture_validator.py +99 -0
- omnibase_infra/nodes/architecture_validator/validators/__init__.py +104 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_direct_dispatch.py +422 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_handler_publishing.py +481 -0
- omnibase_infra/nodes/architecture_validator/validators/validator_no_orchestrator_fsm.py +491 -0
- omnibase_infra/nodes/effects/README.md +358 -0
- omnibase_infra/nodes/effects/__init__.py +26 -0
- omnibase_infra/nodes/effects/contract.yaml +172 -0
- omnibase_infra/nodes/effects/models/__init__.py +32 -0
- omnibase_infra/nodes/effects/models/model_backend_result.py +190 -0
- omnibase_infra/nodes/effects/models/model_effect_idempotency_config.py +92 -0
- omnibase_infra/nodes/effects/models/model_registry_request.py +132 -0
- omnibase_infra/nodes/effects/models/model_registry_response.py +263 -0
- omnibase_infra/nodes/effects/protocol_consul_client.py +89 -0
- omnibase_infra/nodes/effects/protocol_effect_idempotency_store.py +143 -0
- omnibase_infra/nodes/effects/protocol_postgres_adapter.py +96 -0
- omnibase_infra/nodes/effects/registry_effect.py +525 -0
- omnibase_infra/nodes/effects/store_effect_idempotency_inmemory.py +425 -0
- omnibase_infra/nodes/node_registration_orchestrator/README.md +542 -0
- omnibase_infra/nodes/node_registration_orchestrator/__init__.py +120 -0
- omnibase_infra/nodes/node_registration_orchestrator/contract.yaml +475 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/__init__.py +53 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_introspected.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_node_registration_acked.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/dispatchers/dispatcher_runtime_tick.py +373 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/__init__.py +62 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_heartbeat.py +376 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_introspected.py +609 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_node_registration_acked.py +458 -0
- omnibase_infra/nodes/node_registration_orchestrator/handlers/handler_runtime_tick.py +364 -0
- omnibase_infra/nodes/node_registration_orchestrator/introspection_event_router.py +544 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/__init__.py +75 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_intent_payload.py +194 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_consul_registration_intent.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_intent_execution_result.py +50 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_node_liveness_expired.py +107 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_config.py +67 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_input.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_orchestrator_output.py +166 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_intent_payload.py +235 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_postgres_upsert_intent.py +68 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_execution_result.py +384 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_reducer_state.py +60 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registration_intent.py +177 -0
- omnibase_infra/nodes/node_registration_orchestrator/models/model_registry_intent.py +247 -0
- omnibase_infra/nodes/node_registration_orchestrator/node.py +195 -0
- omnibase_infra/nodes/node_registration_orchestrator/plugin.py +909 -0
- omnibase_infra/nodes/node_registration_orchestrator/protocols.py +439 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_orchestrator/registry/registry_infra_node_registration_orchestrator.py +525 -0
- omnibase_infra/nodes/node_registration_orchestrator/timeout_coordinator.py +392 -0
- omnibase_infra/nodes/node_registration_orchestrator/wiring.py +742 -0
- omnibase_infra/nodes/node_registration_reducer/__init__.py +15 -0
- omnibase_infra/nodes/node_registration_reducer/contract.yaml +301 -0
- omnibase_infra/nodes/node_registration_reducer/models/__init__.py +38 -0
- omnibase_infra/nodes/node_registration_reducer/models/model_validation_result.py +113 -0
- omnibase_infra/nodes/node_registration_reducer/node.py +139 -0
- omnibase_infra/nodes/node_registration_reducer/registry/__init__.py +9 -0
- omnibase_infra/nodes/node_registration_reducer/registry/registry_infra_node_registration_reducer.py +79 -0
- omnibase_infra/nodes/node_registration_storage_effect/__init__.py +41 -0
- omnibase_infra/nodes/node_registration_storage_effect/contract.yaml +225 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/__init__.py +44 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_delete_result.py +132 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_record.py +199 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_registration_update.py +155 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_details.py +123 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_health_check_result.py +117 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_query.py +100 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_storage_result.py +136 -0
- omnibase_infra/nodes/node_registration_storage_effect/models/model_upsert_result.py +127 -0
- omnibase_infra/nodes/node_registration_storage_effect/node.py +109 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/__init__.py +22 -0
- omnibase_infra/nodes/node_registration_storage_effect/protocols/protocol_registration_persistence.py +333 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/__init__.py +23 -0
- omnibase_infra/nodes/node_registration_storage_effect/registry/registry_infra_registration_storage.py +194 -0
- omnibase_infra/nodes/node_registry_effect/__init__.py +85 -0
- omnibase_infra/nodes/node_registry_effect/contract.yaml +682 -0
- omnibase_infra/nodes/node_registry_effect/handlers/__init__.py +70 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_deregister.py +211 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_consul_register.py +212 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_partial_retry.py +416 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_deactivate.py +215 -0
- omnibase_infra/nodes/node_registry_effect/handlers/handler_postgres_upsert.py +208 -0
- omnibase_infra/nodes/node_registry_effect/models/__init__.py +43 -0
- omnibase_infra/nodes/node_registry_effect/models/model_partial_retry_request.py +92 -0
- omnibase_infra/nodes/node_registry_effect/node.py +165 -0
- omnibase_infra/nodes/node_registry_effect/registry/__init__.py +27 -0
- omnibase_infra/nodes/node_registry_effect/registry/registry_infra_registry_effect.py +196 -0
- omnibase_infra/nodes/node_service_discovery_effect/__init__.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/contract.yaml +246 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/__init__.py +67 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_health_status.py +72 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/enum_service_discovery_operation.py +58 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_query.py +99 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_discovery_result.py +98 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_health_check_config.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_query_metadata.py +63 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_registration_result.py +130 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_details.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_discovery_health_check_result.py +119 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_info.py +106 -0
- omnibase_infra/nodes/node_service_discovery_effect/models/model_service_registration.py +121 -0
- omnibase_infra/nodes/node_service_discovery_effect/node.py +111 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/__init__.py +14 -0
- omnibase_infra/nodes/node_service_discovery_effect/protocols/protocol_discovery_operations.py +279 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/__init__.py +13 -0
- omnibase_infra/nodes/node_service_discovery_effect/registry/registry_infra_service_discovery.py +214 -0
- omnibase_infra/nodes/reducers/__init__.py +30 -0
- omnibase_infra/nodes/reducers/models/__init__.py +32 -0
- omnibase_infra/nodes/reducers/models/model_payload_consul_register.py +76 -0
- omnibase_infra/nodes/reducers/models/model_payload_postgres_upsert_registration.py +60 -0
- omnibase_infra/nodes/reducers/models/model_registration_confirmation.py +166 -0
- omnibase_infra/nodes/reducers/models/model_registration_state.py +433 -0
- omnibase_infra/nodes/reducers/registration_reducer.py +1137 -0
- omnibase_infra/observability/__init__.py +143 -0
- omnibase_infra/observability/constants_metrics.py +91 -0
- omnibase_infra/observability/factory_observability_sink.py +525 -0
- omnibase_infra/observability/handlers/__init__.py +118 -0
- omnibase_infra/observability/handlers/handler_logging_structured.py +967 -0
- omnibase_infra/observability/handlers/handler_metrics_prometheus.py +1120 -0
- omnibase_infra/observability/handlers/model_logging_handler_config.py +71 -0
- omnibase_infra/observability/handlers/model_logging_handler_response.py +77 -0
- omnibase_infra/observability/handlers/model_metrics_handler_config.py +172 -0
- omnibase_infra/observability/handlers/model_metrics_handler_payload.py +135 -0
- omnibase_infra/observability/handlers/model_metrics_handler_response.py +101 -0
- omnibase_infra/observability/hooks/__init__.py +74 -0
- omnibase_infra/observability/hooks/hook_observability.py +1223 -0
- omnibase_infra/observability/models/__init__.py +30 -0
- omnibase_infra/observability/models/enum_required_log_context_key.py +77 -0
- omnibase_infra/observability/models/model_buffered_log_entry.py +117 -0
- omnibase_infra/observability/models/model_logging_sink_config.py +73 -0
- omnibase_infra/observability/models/model_metrics_sink_config.py +156 -0
- omnibase_infra/observability/sinks/__init__.py +69 -0
- omnibase_infra/observability/sinks/sink_logging_structured.py +809 -0
- omnibase_infra/observability/sinks/sink_metrics_prometheus.py +710 -0
- omnibase_infra/plugins/__init__.py +27 -0
- omnibase_infra/plugins/examples/__init__.py +28 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer.py +271 -0
- omnibase_infra/plugins/examples/plugin_json_normalizer_error_handling.py +210 -0
- omnibase_infra/plugins/models/__init__.py +21 -0
- omnibase_infra/plugins/models/model_plugin_context.py +76 -0
- omnibase_infra/plugins/models/model_plugin_input_data.py +58 -0
- omnibase_infra/plugins/models/model_plugin_output_data.py +62 -0
- omnibase_infra/plugins/plugin_compute_base.py +435 -0
- omnibase_infra/projectors/__init__.py +30 -0
- omnibase_infra/projectors/contracts/__init__.py +63 -0
- omnibase_infra/projectors/contracts/registration_projector.yaml +370 -0
- omnibase_infra/projectors/projection_reader_registration.py +1559 -0
- omnibase_infra/projectors/snapshot_publisher_registration.py +1329 -0
- omnibase_infra/protocols/__init__.py +99 -0
- omnibase_infra/protocols/protocol_capability_projection.py +253 -0
- omnibase_infra/protocols/protocol_capability_query.py +251 -0
- omnibase_infra/protocols/protocol_event_bus_like.py +127 -0
- omnibase_infra/protocols/protocol_event_projector.py +96 -0
- omnibase_infra/protocols/protocol_idempotency_store.py +142 -0
- omnibase_infra/protocols/protocol_message_dispatcher.py +247 -0
- omnibase_infra/protocols/protocol_message_type_registry.py +306 -0
- omnibase_infra/protocols/protocol_plugin_compute.py +368 -0
- omnibase_infra/protocols/protocol_projector_schema_validator.py +82 -0
- omnibase_infra/protocols/protocol_registry_metrics.py +215 -0
- omnibase_infra/protocols/protocol_snapshot_publisher.py +396 -0
- omnibase_infra/protocols/protocol_snapshot_store.py +567 -0
- omnibase_infra/runtime/__init__.py +296 -0
- omnibase_infra/runtime/binding_config_resolver.py +2706 -0
- omnibase_infra/runtime/chain_aware_dispatch.py +467 -0
- omnibase_infra/runtime/contract_handler_discovery.py +582 -0
- omnibase_infra/runtime/contract_loaders/__init__.py +42 -0
- omnibase_infra/runtime/contract_loaders/handler_routing_loader.py +464 -0
- omnibase_infra/runtime/dispatch_context_enforcer.py +427 -0
- omnibase_infra/runtime/enums/__init__.py +18 -0
- omnibase_infra/runtime/enums/enum_config_ref_scheme.py +33 -0
- omnibase_infra/runtime/enums/enum_scheduler_status.py +170 -0
- omnibase_infra/runtime/envelope_validator.py +179 -0
- omnibase_infra/runtime/handler_contract_source.py +669 -0
- omnibase_infra/runtime/handler_plugin_loader.py +2029 -0
- omnibase_infra/runtime/handler_registry.py +321 -0
- omnibase_infra/runtime/invocation_security_enforcer.py +427 -0
- omnibase_infra/runtime/kernel.py +40 -0
- omnibase_infra/runtime/mixin_policy_validation.py +522 -0
- omnibase_infra/runtime/mixin_semver_cache.py +378 -0
- omnibase_infra/runtime/mixins/__init__.py +17 -0
- omnibase_infra/runtime/mixins/mixin_projector_sql_operations.py +757 -0
- omnibase_infra/runtime/models/__init__.py +192 -0
- omnibase_infra/runtime/models/model_batch_lifecycle_result.py +217 -0
- omnibase_infra/runtime/models/model_binding_config.py +168 -0
- omnibase_infra/runtime/models/model_binding_config_cache_stats.py +135 -0
- omnibase_infra/runtime/models/model_binding_config_resolver_config.py +329 -0
- omnibase_infra/runtime/models/model_cached_secret.py +138 -0
- omnibase_infra/runtime/models/model_compute_key.py +138 -0
- omnibase_infra/runtime/models/model_compute_registration.py +97 -0
- omnibase_infra/runtime/models/model_config_cache_entry.py +61 -0
- omnibase_infra/runtime/models/model_config_ref.py +331 -0
- omnibase_infra/runtime/models/model_config_ref_parse_result.py +125 -0
- omnibase_infra/runtime/models/model_domain_plugin_config.py +92 -0
- omnibase_infra/runtime/models/model_domain_plugin_result.py +270 -0
- omnibase_infra/runtime/models/model_duplicate_response.py +54 -0
- omnibase_infra/runtime/models/model_enabled_protocols_config.py +61 -0
- omnibase_infra/runtime/models/model_event_bus_config.py +54 -0
- omnibase_infra/runtime/models/model_failed_component.py +55 -0
- omnibase_infra/runtime/models/model_health_check_response.py +168 -0
- omnibase_infra/runtime/models/model_health_check_result.py +228 -0
- omnibase_infra/runtime/models/model_lifecycle_result.py +245 -0
- omnibase_infra/runtime/models/model_logging_config.py +42 -0
- omnibase_infra/runtime/models/model_optional_correlation_id.py +167 -0
- omnibase_infra/runtime/models/model_optional_string.py +94 -0
- omnibase_infra/runtime/models/model_optional_uuid.py +110 -0
- omnibase_infra/runtime/models/model_policy_context.py +100 -0
- omnibase_infra/runtime/models/model_policy_key.py +138 -0
- omnibase_infra/runtime/models/model_policy_registration.py +139 -0
- omnibase_infra/runtime/models/model_policy_result.py +103 -0
- omnibase_infra/runtime/models/model_policy_type_filter.py +157 -0
- omnibase_infra/runtime/models/model_projector_plugin_loader_config.py +47 -0
- omnibase_infra/runtime/models/model_protocol_registration_config.py +65 -0
- omnibase_infra/runtime/models/model_retry_policy.py +105 -0
- omnibase_infra/runtime/models/model_runtime_config.py +150 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_config.py +624 -0
- omnibase_infra/runtime/models/model_runtime_scheduler_metrics.py +233 -0
- omnibase_infra/runtime/models/model_runtime_tick.py +193 -0
- omnibase_infra/runtime/models/model_secret_cache_stats.py +82 -0
- omnibase_infra/runtime/models/model_secret_mapping.py +63 -0
- omnibase_infra/runtime/models/model_secret_resolver_config.py +107 -0
- omnibase_infra/runtime/models/model_secret_resolver_metrics.py +111 -0
- omnibase_infra/runtime/models/model_secret_source_info.py +72 -0
- omnibase_infra/runtime/models/model_secret_source_spec.py +66 -0
- omnibase_infra/runtime/models/model_shutdown_batch_result.py +75 -0
- omnibase_infra/runtime/models/model_shutdown_config.py +94 -0
- omnibase_infra/runtime/projector_plugin_loader.py +1462 -0
- omnibase_infra/runtime/projector_schema_manager.py +565 -0
- omnibase_infra/runtime/projector_shell.py +1102 -0
- omnibase_infra/runtime/protocol_contract_descriptor.py +92 -0
- omnibase_infra/runtime/protocol_contract_source.py +92 -0
- omnibase_infra/runtime/protocol_domain_plugin.py +474 -0
- omnibase_infra/runtime/protocol_handler_discovery.py +221 -0
- omnibase_infra/runtime/protocol_handler_plugin_loader.py +327 -0
- omnibase_infra/runtime/protocol_lifecycle_executor.py +435 -0
- omnibase_infra/runtime/protocol_policy.py +366 -0
- omnibase_infra/runtime/protocols/__init__.py +27 -0
- omnibase_infra/runtime/protocols/protocol_runtime_scheduler.py +468 -0
- omnibase_infra/runtime/registry/__init__.py +93 -0
- omnibase_infra/runtime/registry/mixin_message_type_query.py +326 -0
- omnibase_infra/runtime/registry/mixin_message_type_registration.py +354 -0
- omnibase_infra/runtime/registry/registry_event_bus_binding.py +268 -0
- omnibase_infra/runtime/registry/registry_message_type.py +542 -0
- omnibase_infra/runtime/registry/registry_protocol_binding.py +444 -0
- omnibase_infra/runtime/registry_compute.py +1143 -0
- omnibase_infra/runtime/registry_dispatcher.py +678 -0
- omnibase_infra/runtime/registry_policy.py +1502 -0
- omnibase_infra/runtime/runtime_scheduler.py +1070 -0
- omnibase_infra/runtime/secret_resolver.py +2110 -0
- omnibase_infra/runtime/security_metadata_validator.py +776 -0
- omnibase_infra/runtime/service_kernel.py +1573 -0
- omnibase_infra/runtime/service_message_dispatch_engine.py +1805 -0
- omnibase_infra/runtime/service_runtime_host_process.py +2260 -0
- omnibase_infra/runtime/util_container_wiring.py +1123 -0
- omnibase_infra/runtime/util_validation.py +314 -0
- omnibase_infra/runtime/util_version.py +98 -0
- omnibase_infra/runtime/util_wiring.py +566 -0
- omnibase_infra/schemas/schema_registration_projection.sql +320 -0
- omnibase_infra/services/__init__.py +68 -0
- omnibase_infra/services/corpus_capture.py +678 -0
- omnibase_infra/services/service_capability_query.py +945 -0
- omnibase_infra/services/service_health.py +897 -0
- omnibase_infra/services/service_node_selector.py +530 -0
- omnibase_infra/services/service_timeout_emitter.py +682 -0
- omnibase_infra/services/service_timeout_scanner.py +390 -0
- omnibase_infra/services/snapshot/__init__.py +31 -0
- omnibase_infra/services/snapshot/service_snapshot.py +647 -0
- omnibase_infra/services/snapshot/store_inmemory.py +637 -0
- omnibase_infra/services/snapshot/store_postgres.py +1279 -0
- omnibase_infra/shared/__init__.py +8 -0
- omnibase_infra/testing/__init__.py +10 -0
- omnibase_infra/testing/utils.py +23 -0
- omnibase_infra/types/__init__.py +48 -0
- omnibase_infra/types/type_cache_info.py +49 -0
- omnibase_infra/types/type_dsn.py +173 -0
- omnibase_infra/types/type_infra_aliases.py +60 -0
- omnibase_infra/types/typed_dict/__init__.py +21 -0
- omnibase_infra/types/typed_dict/typed_dict_introspection_cache.py +128 -0
- omnibase_infra/types/typed_dict/typed_dict_performance_metrics_cache.py +140 -0
- omnibase_infra/types/typed_dict_capabilities.py +64 -0
- omnibase_infra/utils/__init__.py +89 -0
- omnibase_infra/utils/correlation.py +208 -0
- omnibase_infra/utils/util_datetime.py +372 -0
- omnibase_infra/utils/util_dsn_validation.py +333 -0
- omnibase_infra/utils/util_env_parsing.py +264 -0
- omnibase_infra/utils/util_error_sanitization.py +457 -0
- omnibase_infra/utils/util_pydantic_validators.py +477 -0
- omnibase_infra/utils/util_semver.py +233 -0
- omnibase_infra/validation/__init__.py +307 -0
- omnibase_infra/validation/enums/__init__.py +11 -0
- omnibase_infra/validation/enums/enum_contract_violation_severity.py +13 -0
- omnibase_infra/validation/infra_validators.py +1486 -0
- omnibase_infra/validation/linter_contract.py +907 -0
- omnibase_infra/validation/mixin_any_type_classification.py +120 -0
- omnibase_infra/validation/mixin_any_type_exemption.py +580 -0
- omnibase_infra/validation/mixin_any_type_reporting.py +106 -0
- omnibase_infra/validation/mixin_execution_shape_violation_checks.py +596 -0
- omnibase_infra/validation/mixin_node_archetype_detection.py +254 -0
- omnibase_infra/validation/models/__init__.py +15 -0
- omnibase_infra/validation/models/model_contract_lint_result.py +101 -0
- omnibase_infra/validation/models/model_contract_violation.py +41 -0
- omnibase_infra/validation/service_validation_aggregator.py +395 -0
- omnibase_infra/validation/validation_exemptions.yaml +1710 -0
- omnibase_infra/validation/validator_any_type.py +715 -0
- omnibase_infra/validation/validator_chain_propagation.py +839 -0
- omnibase_infra/validation/validator_execution_shape.py +465 -0
- omnibase_infra/validation/validator_localhandler.py +261 -0
- omnibase_infra/validation/validator_registration_security.py +410 -0
- omnibase_infra/validation/validator_routing_coverage.py +1020 -0
- omnibase_infra/validation/validator_runtime_shape.py +915 -0
- omnibase_infra/validation/validator_security.py +410 -0
- omnibase_infra/validation/validator_topic_category.py +1152 -0
- omnibase_infra-0.2.1.dist-info/METADATA +197 -0
- omnibase_infra-0.2.1.dist-info/RECORD +675 -0
- omnibase_infra-0.2.1.dist-info/WHEEL +4 -0
- omnibase_infra-0.2.1.dist-info/entry_points.txt +4 -0
- omnibase_infra-0.2.1.dist-info/licenses/LICENSE +21 -0
|
@@ -0,0 +1,496 @@
|
|
|
1
|
+
# SPDX-License-Identifier: MIT
|
|
2
|
+
# Copyright (c) 2025 OmniNode Team
|
|
3
|
+
"""
|
|
4
|
+
Dispatch Metrics Model.
|
|
5
|
+
|
|
6
|
+
Aggregate metrics for the message dispatch engine including dispatch counts,
|
|
7
|
+
latency histograms, and per-dispatcher/per-category breakdowns.
|
|
8
|
+
|
|
9
|
+
Design Pattern:
|
|
10
|
+
ModelDispatchMetrics is a comprehensive metrics container that aggregates:
|
|
11
|
+
- Overall dispatch statistics (counts, latency)
|
|
12
|
+
- Per-dispatcher metrics (via ModelDispatcherMetrics)
|
|
13
|
+
- Per-category metrics (event, command, intent, projection counts)
|
|
14
|
+
- Latency histogram buckets for distribution analysis
|
|
15
|
+
|
|
16
|
+
Copy-on-Write Pattern:
|
|
17
|
+
Unlike most ONEX models, this model is NOT frozen (no `frozen=True` in
|
|
18
|
+
model_config) to allow Pydantic validation of nested dictionary updates.
|
|
19
|
+
However, update methods like `record_dispatch()` return NEW instances
|
|
20
|
+
rather than mutating in place, following the copy-on-write pattern:
|
|
21
|
+
|
|
22
|
+
```python
|
|
23
|
+
# Copy-on-write: returns new instance, does not mutate
|
|
24
|
+
metrics = metrics.record_dispatch(duration_ms=45.2, success=True)
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
This provides the benefits of immutability (predictable state, thread-safe
|
|
28
|
+
sharing of snapshots) while still allowing the model to be non-frozen for
|
|
29
|
+
Pydantic's internal validation requirements.
|
|
30
|
+
|
|
31
|
+
Thread Safety:
|
|
32
|
+
Individual ModelDispatchMetrics instances are safe to share across threads
|
|
33
|
+
since update operations return new instances. The MessageDispatchEngine
|
|
34
|
+
uses a lock (`_metrics_lock`) to ensure atomic read-modify-write cycles
|
|
35
|
+
when updating the shared metrics reference.
|
|
36
|
+
|
|
37
|
+
Example:
|
|
38
|
+
>>> from omnibase_infra.models.dispatch import ModelDispatchMetrics
|
|
39
|
+
>>> from omnibase_infra.enums import EnumMessageCategory
|
|
40
|
+
>>>
|
|
41
|
+
>>> metrics = ModelDispatchMetrics()
|
|
42
|
+
>>> metrics = metrics.record_dispatch(
|
|
43
|
+
... duration_ms=45.2,
|
|
44
|
+
... success=True,
|
|
45
|
+
... category=EnumMessageCategory.EVENT,
|
|
46
|
+
... dispatcher_id="user-dispatcher",
|
|
47
|
+
... )
|
|
48
|
+
>>> print(f"Success rate: {metrics.success_rate:.1%}")
|
|
49
|
+
|
|
50
|
+
See Also:
|
|
51
|
+
omnibase_infra.models.dispatch.ModelDispatcherMetrics: Per-dispatcher metrics
|
|
52
|
+
omnibase_core.runtime.MessageDispatchEngine: Uses these for observability
|
|
53
|
+
"""
|
|
54
|
+
|
|
55
|
+
from pydantic import BaseModel, ConfigDict, Field
|
|
56
|
+
|
|
57
|
+
from omnibase_infra.enums import EnumMessageCategory
|
|
58
|
+
from omnibase_infra.models.dispatch.model_dispatcher_metrics import (
|
|
59
|
+
ModelDispatcherMetrics,
|
|
60
|
+
)
|
|
61
|
+
|
|
62
|
+
# Histogram bucket boundaries in milliseconds
|
|
63
|
+
LATENCY_HISTOGRAM_BUCKETS: tuple[float, ...] = (
|
|
64
|
+
1.0,
|
|
65
|
+
5.0,
|
|
66
|
+
10.0,
|
|
67
|
+
25.0,
|
|
68
|
+
50.0,
|
|
69
|
+
100.0,
|
|
70
|
+
250.0,
|
|
71
|
+
500.0,
|
|
72
|
+
1000.0,
|
|
73
|
+
2500.0,
|
|
74
|
+
5000.0,
|
|
75
|
+
10000.0,
|
|
76
|
+
)
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
class ModelDispatchMetrics(BaseModel):
|
|
80
|
+
"""
|
|
81
|
+
Aggregate metrics for the message dispatch engine.
|
|
82
|
+
|
|
83
|
+
Provides comprehensive observability including:
|
|
84
|
+
- Overall dispatch counts and success/error rates
|
|
85
|
+
- Latency statistics (average, min, max)
|
|
86
|
+
- Latency histogram for distribution analysis
|
|
87
|
+
- Per-dispatcher metrics breakdown
|
|
88
|
+
- Per-category metrics breakdown
|
|
89
|
+
|
|
90
|
+
Memory Considerations:
|
|
91
|
+
The dispatcher_metrics dictionary size is bounded by the number
|
|
92
|
+
of registered dispatchers. Under the freeze-after-init pattern,
|
|
93
|
+
dispatchers are registered during initialization and then frozen,
|
|
94
|
+
ensuring predictable memory usage.
|
|
95
|
+
|
|
96
|
+
Specifically:
|
|
97
|
+
- dispatcher_metrics: Bounded by registered dispatcher count (fixed after freeze)
|
|
98
|
+
- category_metrics: Fixed 4 keys (event, command, intent, projection)
|
|
99
|
+
- latency_histogram: Fixed 13 buckets
|
|
100
|
+
|
|
101
|
+
The freeze-after-init pattern guarantees that after engine.freeze()
|
|
102
|
+
is called, no new dispatchers can be registered. This means the
|
|
103
|
+
dispatcher_metrics dictionary has a known maximum size equal to
|
|
104
|
+
the number of dispatchers registered during initialization.
|
|
105
|
+
|
|
106
|
+
For production deployments, typical dispatcher counts are:
|
|
107
|
+
- Small systems: 5-20 dispatchers
|
|
108
|
+
- Medium systems: 20-100 dispatchers
|
|
109
|
+
- Large systems: 100-500 dispatchers
|
|
110
|
+
|
|
111
|
+
Each ModelDispatcherMetrics instance is approximately 200-500 bytes,
|
|
112
|
+
so even large systems with 500 dispatchers use under 250KB for
|
|
113
|
+
dispatcher metrics.
|
|
114
|
+
|
|
115
|
+
Attributes:
|
|
116
|
+
total_dispatches: Total number of dispatch operations.
|
|
117
|
+
successful_dispatches: Number of successful dispatches.
|
|
118
|
+
failed_dispatches: Number of failed dispatches.
|
|
119
|
+
no_dispatcher_count: Dispatches with no matching dispatcher.
|
|
120
|
+
category_mismatch_count: Dispatches with category validation failures.
|
|
121
|
+
total_latency_ms: Cumulative latency across all dispatches.
|
|
122
|
+
min_latency_ms: Minimum observed dispatch latency.
|
|
123
|
+
max_latency_ms: Maximum observed dispatch latency.
|
|
124
|
+
latency_histogram: Histogram buckets for latency distribution.
|
|
125
|
+
dispatcher_metrics: Per-dispatcher metrics keyed by dispatcher_id.
|
|
126
|
+
category_metrics: Per-category dispatch counts.
|
|
127
|
+
|
|
128
|
+
Example:
|
|
129
|
+
>>> metrics = ModelDispatchMetrics()
|
|
130
|
+
>>> print(f"Total dispatches: {metrics.total_dispatches}")
|
|
131
|
+
>>> print(f"Success rate: {metrics.success_rate:.1%}")
|
|
132
|
+
"""
|
|
133
|
+
|
|
134
|
+
model_config = ConfigDict(
|
|
135
|
+
extra="forbid",
|
|
136
|
+
from_attributes=True,
|
|
137
|
+
validate_assignment=True,
|
|
138
|
+
)
|
|
139
|
+
|
|
140
|
+
# ---- Dispatch Counts ----
|
|
141
|
+
total_dispatches: int = Field(
|
|
142
|
+
default=0,
|
|
143
|
+
description="Total number of dispatch operations.",
|
|
144
|
+
ge=0,
|
|
145
|
+
)
|
|
146
|
+
successful_dispatches: int = Field(
|
|
147
|
+
default=0,
|
|
148
|
+
description="Number of successful dispatches.",
|
|
149
|
+
ge=0,
|
|
150
|
+
)
|
|
151
|
+
failed_dispatches: int = Field(
|
|
152
|
+
default=0,
|
|
153
|
+
description="Number of failed dispatches.",
|
|
154
|
+
ge=0,
|
|
155
|
+
)
|
|
156
|
+
no_dispatcher_count: int = Field(
|
|
157
|
+
default=0,
|
|
158
|
+
description="Dispatches with no matching dispatcher.",
|
|
159
|
+
ge=0,
|
|
160
|
+
)
|
|
161
|
+
category_mismatch_count: int = Field(
|
|
162
|
+
default=0,
|
|
163
|
+
description="Dispatches with category validation failures.",
|
|
164
|
+
ge=0,
|
|
165
|
+
)
|
|
166
|
+
|
|
167
|
+
# ---- Dispatcher Execution Counts ----
|
|
168
|
+
dispatcher_execution_count: int = Field(
|
|
169
|
+
default=0,
|
|
170
|
+
description="Total number of dispatcher executions (may exceed dispatch count for fan-out).",
|
|
171
|
+
ge=0,
|
|
172
|
+
)
|
|
173
|
+
dispatcher_error_count: int = Field(
|
|
174
|
+
default=0,
|
|
175
|
+
description="Total number of dispatcher execution failures.",
|
|
176
|
+
ge=0,
|
|
177
|
+
)
|
|
178
|
+
routes_matched_count: int = Field(
|
|
179
|
+
default=0,
|
|
180
|
+
description="Total number of route matches.",
|
|
181
|
+
ge=0,
|
|
182
|
+
)
|
|
183
|
+
|
|
184
|
+
# ---- Latency Statistics ----
|
|
185
|
+
total_latency_ms: float = Field(
|
|
186
|
+
default=0.0,
|
|
187
|
+
description="Cumulative latency across all dispatches in milliseconds.",
|
|
188
|
+
ge=0,
|
|
189
|
+
)
|
|
190
|
+
min_latency_ms: float | None = Field(
|
|
191
|
+
default=None,
|
|
192
|
+
description="Minimum observed dispatch latency in milliseconds.",
|
|
193
|
+
)
|
|
194
|
+
max_latency_ms: float | None = Field(
|
|
195
|
+
default=None,
|
|
196
|
+
description="Maximum observed dispatch latency in milliseconds.",
|
|
197
|
+
)
|
|
198
|
+
|
|
199
|
+
# ---- Latency Histogram ----
|
|
200
|
+
latency_histogram: dict[str, int] = Field(
|
|
201
|
+
default_factory=lambda: {
|
|
202
|
+
"le_1ms": 0,
|
|
203
|
+
"le_5ms": 0,
|
|
204
|
+
"le_10ms": 0,
|
|
205
|
+
"le_25ms": 0,
|
|
206
|
+
"le_50ms": 0,
|
|
207
|
+
"le_100ms": 0,
|
|
208
|
+
"le_250ms": 0,
|
|
209
|
+
"le_500ms": 0,
|
|
210
|
+
"le_1000ms": 0,
|
|
211
|
+
"le_2500ms": 0,
|
|
212
|
+
"le_5000ms": 0,
|
|
213
|
+
"le_10000ms": 0,
|
|
214
|
+
"gt_10000ms": 0,
|
|
215
|
+
},
|
|
216
|
+
description="Histogram buckets for latency distribution.",
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
# ---- Per-Dispatcher Metrics ----
|
|
220
|
+
dispatcher_metrics: dict[str, ModelDispatcherMetrics] = Field(
|
|
221
|
+
default_factory=dict,
|
|
222
|
+
description=(
|
|
223
|
+
"Per-dispatcher metrics keyed by dispatcher_id. "
|
|
224
|
+
"Memory is bounded by freeze-after-init pattern: only dispatchers "
|
|
225
|
+
"registered before freeze() will have metrics entries, ensuring "
|
|
226
|
+
"no unbounded growth after initialization. The dictionary size equals "
|
|
227
|
+
"the number of registered dispatchers (typically 5-500 depending on "
|
|
228
|
+
"system scale). For long-running services, consider periodically "
|
|
229
|
+
"exporting metrics to an external system (Prometheus, StatsD) and "
|
|
230
|
+
"using reset_metrics() or create_empty() to prevent counter overflow "
|
|
231
|
+
"in extreme cases. Note: counter overflow is theoretical (requires "
|
|
232
|
+
">9 quintillion dispatches for int64), but periodic metrics export "
|
|
233
|
+
"enables historical trend analysis and reduces memory pressure from "
|
|
234
|
+
"accumulated per-dispatcher statistics."
|
|
235
|
+
),
|
|
236
|
+
)
|
|
237
|
+
|
|
238
|
+
# ---- Per-Category Metrics ----
|
|
239
|
+
category_metrics: dict[str, int] = Field(
|
|
240
|
+
default_factory=lambda: {
|
|
241
|
+
"event": 0,
|
|
242
|
+
"command": 0,
|
|
243
|
+
"intent": 0,
|
|
244
|
+
"projection": 0,
|
|
245
|
+
},
|
|
246
|
+
description="Per-category dispatch counts.",
|
|
247
|
+
)
|
|
248
|
+
|
|
249
|
+
@property
|
|
250
|
+
def avg_latency_ms(self) -> float:
|
|
251
|
+
"""
|
|
252
|
+
Calculate average latency across all dispatches.
|
|
253
|
+
|
|
254
|
+
Returns:
|
|
255
|
+
Average latency in milliseconds, or 0.0 if no dispatches.
|
|
256
|
+
"""
|
|
257
|
+
if self.total_dispatches == 0:
|
|
258
|
+
return 0.0
|
|
259
|
+
return self.total_latency_ms / self.total_dispatches
|
|
260
|
+
|
|
261
|
+
@property
|
|
262
|
+
def success_rate(self) -> float:
|
|
263
|
+
"""
|
|
264
|
+
Calculate success rate as a fraction (0.0 to 1.0).
|
|
265
|
+
|
|
266
|
+
Returns:
|
|
267
|
+
Success rate as a decimal, or 1.0 if no dispatches.
|
|
268
|
+
"""
|
|
269
|
+
if self.total_dispatches == 0:
|
|
270
|
+
return 1.0
|
|
271
|
+
return self.successful_dispatches / self.total_dispatches
|
|
272
|
+
|
|
273
|
+
@property
|
|
274
|
+
def error_rate(self) -> float:
|
|
275
|
+
"""
|
|
276
|
+
Calculate error rate as a fraction (0.0 to 1.0).
|
|
277
|
+
|
|
278
|
+
Returns:
|
|
279
|
+
Error rate as a decimal, or 0.0 if no dispatches.
|
|
280
|
+
"""
|
|
281
|
+
if self.total_dispatches == 0:
|
|
282
|
+
return 0.0
|
|
283
|
+
return self.failed_dispatches / self.total_dispatches
|
|
284
|
+
|
|
285
|
+
def _get_histogram_bucket(self, duration_ms: float) -> str:
|
|
286
|
+
"""Get the histogram bucket key for a given latency.
|
|
287
|
+
|
|
288
|
+
Uses LATENCY_HISTOGRAM_BUCKETS to ensure consistency between
|
|
289
|
+
bucket thresholds and bucket key generation.
|
|
290
|
+
"""
|
|
291
|
+
# Iterate through bucket thresholds in order
|
|
292
|
+
for threshold in LATENCY_HISTOGRAM_BUCKETS:
|
|
293
|
+
if duration_ms <= threshold:
|
|
294
|
+
return f"le_{int(threshold)}ms"
|
|
295
|
+
# Exceeds all bucket thresholds
|
|
296
|
+
return f"gt_{int(LATENCY_HISTOGRAM_BUCKETS[-1])}ms"
|
|
297
|
+
|
|
298
|
+
def record_dispatch(
|
|
299
|
+
self,
|
|
300
|
+
duration_ms: float,
|
|
301
|
+
success: bool,
|
|
302
|
+
category: EnumMessageCategory | None = None,
|
|
303
|
+
dispatcher_id: str | None = None,
|
|
304
|
+
no_dispatcher: bool = False,
|
|
305
|
+
category_mismatch: bool = False,
|
|
306
|
+
handler_error: bool = False,
|
|
307
|
+
routes_matched: int = 0,
|
|
308
|
+
topic: str | None = None,
|
|
309
|
+
error_message: str | None = None,
|
|
310
|
+
) -> "ModelDispatchMetrics":
|
|
311
|
+
"""
|
|
312
|
+
Record a dispatch operation and return updated metrics.
|
|
313
|
+
|
|
314
|
+
Creates a new ModelDispatchMetrics instance with updated statistics.
|
|
315
|
+
|
|
316
|
+
Args:
|
|
317
|
+
duration_ms: Dispatch duration in milliseconds.
|
|
318
|
+
success: Whether the dispatch was successful.
|
|
319
|
+
category: Optional message category for per-category metrics.
|
|
320
|
+
dispatcher_id: Optional dispatcher ID for per-dispatcher metrics.
|
|
321
|
+
no_dispatcher: Whether no dispatcher was found.
|
|
322
|
+
category_mismatch: Whether category validation failed.
|
|
323
|
+
handler_error: Whether a dispatcher execution error occurred.
|
|
324
|
+
routes_matched: Number of routes that matched.
|
|
325
|
+
topic: Optional topic for dispatcher metrics.
|
|
326
|
+
error_message: Optional error message for dispatcher metrics.
|
|
327
|
+
|
|
328
|
+
Returns:
|
|
329
|
+
New ModelDispatchMetrics with updated statistics.
|
|
330
|
+
"""
|
|
331
|
+
# Update latency statistics
|
|
332
|
+
new_min = (
|
|
333
|
+
duration_ms
|
|
334
|
+
if self.min_latency_ms is None
|
|
335
|
+
else min(self.min_latency_ms, duration_ms)
|
|
336
|
+
)
|
|
337
|
+
new_max = (
|
|
338
|
+
duration_ms
|
|
339
|
+
if self.max_latency_ms is None
|
|
340
|
+
else max(self.max_latency_ms, duration_ms)
|
|
341
|
+
)
|
|
342
|
+
|
|
343
|
+
# Update histogram
|
|
344
|
+
new_histogram = dict(self.latency_histogram)
|
|
345
|
+
bucket = self._get_histogram_bucket(duration_ms)
|
|
346
|
+
new_histogram[bucket] = new_histogram.get(bucket, 0) + 1
|
|
347
|
+
|
|
348
|
+
# Update category metrics
|
|
349
|
+
new_category_metrics = dict(self.category_metrics)
|
|
350
|
+
if category is not None:
|
|
351
|
+
category_key = category.value.lower()
|
|
352
|
+
new_category_metrics[category_key] = (
|
|
353
|
+
new_category_metrics.get(category_key, 0) + 1
|
|
354
|
+
)
|
|
355
|
+
|
|
356
|
+
# Update dispatcher metrics
|
|
357
|
+
new_dispatcher_metrics = dict(self.dispatcher_metrics)
|
|
358
|
+
if dispatcher_id is not None:
|
|
359
|
+
existing = new_dispatcher_metrics.get(dispatcher_id)
|
|
360
|
+
if existing is None:
|
|
361
|
+
existing = ModelDispatcherMetrics(dispatcher_id=dispatcher_id)
|
|
362
|
+
new_dispatcher_metrics[dispatcher_id] = existing.record_execution(
|
|
363
|
+
duration_ms=duration_ms,
|
|
364
|
+
success=success and not handler_error,
|
|
365
|
+
topic=topic,
|
|
366
|
+
error_message=error_message,
|
|
367
|
+
)
|
|
368
|
+
|
|
369
|
+
# Use model_copy to prevent field drift when new fields are added
|
|
370
|
+
return self.model_copy(
|
|
371
|
+
update={
|
|
372
|
+
"total_dispatches": self.total_dispatches + 1,
|
|
373
|
+
"successful_dispatches": self.successful_dispatches
|
|
374
|
+
+ (1 if success else 0),
|
|
375
|
+
"failed_dispatches": self.failed_dispatches + (0 if success else 1),
|
|
376
|
+
"no_dispatcher_count": self.no_dispatcher_count
|
|
377
|
+
+ (1 if no_dispatcher else 0),
|
|
378
|
+
"category_mismatch_count": self.category_mismatch_count
|
|
379
|
+
+ (1 if category_mismatch else 0),
|
|
380
|
+
"dispatcher_execution_count": self.dispatcher_execution_count
|
|
381
|
+
+ (1 if dispatcher_id else 0),
|
|
382
|
+
"dispatcher_error_count": self.dispatcher_error_count
|
|
383
|
+
+ (1 if handler_error else 0),
|
|
384
|
+
"routes_matched_count": self.routes_matched_count + routes_matched,
|
|
385
|
+
"total_latency_ms": self.total_latency_ms + duration_ms,
|
|
386
|
+
"min_latency_ms": new_min,
|
|
387
|
+
"max_latency_ms": new_max,
|
|
388
|
+
"latency_histogram": new_histogram,
|
|
389
|
+
"dispatcher_metrics": new_dispatcher_metrics,
|
|
390
|
+
"category_metrics": new_category_metrics,
|
|
391
|
+
}
|
|
392
|
+
)
|
|
393
|
+
|
|
394
|
+
def get_dispatcher_metrics(
|
|
395
|
+
self, dispatcher_id: str
|
|
396
|
+
) -> ModelDispatcherMetrics | None:
|
|
397
|
+
"""
|
|
398
|
+
Get metrics for a specific dispatcher.
|
|
399
|
+
|
|
400
|
+
Args:
|
|
401
|
+
dispatcher_id: The dispatcher's unique identifier.
|
|
402
|
+
|
|
403
|
+
Returns:
|
|
404
|
+
ModelDispatcherMetrics for the dispatcher, or None if not found.
|
|
405
|
+
"""
|
|
406
|
+
return self.dispatcher_metrics.get(dispatcher_id)
|
|
407
|
+
|
|
408
|
+
def update_dispatcher_metrics(
|
|
409
|
+
self,
|
|
410
|
+
dispatcher_id: str,
|
|
411
|
+
metrics: ModelDispatcherMetrics,
|
|
412
|
+
) -> "ModelDispatchMetrics":
|
|
413
|
+
"""
|
|
414
|
+
Efficiently update a single dispatcher's metrics.
|
|
415
|
+
|
|
416
|
+
Uses model_copy() for efficient copy-on-write update instead of
|
|
417
|
+
reconstructing the entire object with all parameters. This is
|
|
418
|
+
significantly more efficient when only updating dispatcher metrics
|
|
419
|
+
without changing aggregate statistics.
|
|
420
|
+
|
|
421
|
+
Args:
|
|
422
|
+
dispatcher_id: The dispatcher ID to update metrics for.
|
|
423
|
+
metrics: The new metrics for the dispatcher.
|
|
424
|
+
|
|
425
|
+
Returns:
|
|
426
|
+
New ModelDispatchMetrics with updated dispatcher metrics.
|
|
427
|
+
|
|
428
|
+
Example:
|
|
429
|
+
>>> old_metrics = ModelDispatchMetrics()
|
|
430
|
+
>>> dispatcher_metrics = ModelDispatcherMetrics(
|
|
431
|
+
... dispatcher_id="my-dispatcher"
|
|
432
|
+
... )
|
|
433
|
+
>>> new_metrics = old_metrics.update_dispatcher_metrics(
|
|
434
|
+
... "my-dispatcher",
|
|
435
|
+
... dispatcher_metrics
|
|
436
|
+
... )
|
|
437
|
+
"""
|
|
438
|
+
new_dict = dict(self.dispatcher_metrics)
|
|
439
|
+
new_dict[dispatcher_id] = metrics
|
|
440
|
+
return self.model_copy(update={"dispatcher_metrics": new_dict})
|
|
441
|
+
|
|
442
|
+
def get_category_count(self, category: EnumMessageCategory) -> int:
|
|
443
|
+
"""
|
|
444
|
+
Get dispatch count for a specific category.
|
|
445
|
+
|
|
446
|
+
Args:
|
|
447
|
+
category: The message category.
|
|
448
|
+
|
|
449
|
+
Returns:
|
|
450
|
+
Number of dispatches for this category.
|
|
451
|
+
"""
|
|
452
|
+
category_key = category.value.lower()
|
|
453
|
+
return self.category_metrics.get(category_key, 0)
|
|
454
|
+
|
|
455
|
+
def to_dict(self) -> dict[str, object]:
|
|
456
|
+
"""
|
|
457
|
+
Convert to dictionary with computed properties included.
|
|
458
|
+
|
|
459
|
+
Returns:
|
|
460
|
+
Dictionary with all metrics including computed properties.
|
|
461
|
+
"""
|
|
462
|
+
return {
|
|
463
|
+
"total_dispatches": self.total_dispatches,
|
|
464
|
+
"successful_dispatches": self.successful_dispatches,
|
|
465
|
+
"failed_dispatches": self.failed_dispatches,
|
|
466
|
+
"no_dispatcher_count": self.no_dispatcher_count,
|
|
467
|
+
"category_mismatch_count": self.category_mismatch_count,
|
|
468
|
+
"dispatcher_execution_count": self.dispatcher_execution_count,
|
|
469
|
+
"dispatcher_error_count": self.dispatcher_error_count,
|
|
470
|
+
"routes_matched_count": self.routes_matched_count,
|
|
471
|
+
"avg_latency_ms": self.avg_latency_ms,
|
|
472
|
+
"min_latency_ms": self.min_latency_ms,
|
|
473
|
+
"max_latency_ms": self.max_latency_ms,
|
|
474
|
+
"success_rate": self.success_rate,
|
|
475
|
+
"error_rate": self.error_rate,
|
|
476
|
+
"total_latency_ms": self.total_latency_ms,
|
|
477
|
+
"latency_histogram": self.latency_histogram,
|
|
478
|
+
"category_metrics": self.category_metrics,
|
|
479
|
+
"dispatcher_metrics": {
|
|
480
|
+
dispatcher_id: metrics.to_dict()
|
|
481
|
+
for dispatcher_id, metrics in self.dispatcher_metrics.items()
|
|
482
|
+
},
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
@classmethod
|
|
486
|
+
def create_empty(cls) -> "ModelDispatchMetrics":
|
|
487
|
+
"""
|
|
488
|
+
Create a new empty metrics instance.
|
|
489
|
+
|
|
490
|
+
Returns:
|
|
491
|
+
New ModelDispatchMetrics with all counters at zero.
|
|
492
|
+
"""
|
|
493
|
+
return cls()
|
|
494
|
+
|
|
495
|
+
|
|
496
|
+
__all__ = ["LATENCY_HISTOGRAM_BUCKETS", "ModelDispatchMetrics"]
|