tasker-engine 1.0.0
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.
- checksums.yaml +7 -0
- data/LICENSE +22 -0
- data/README.md +443 -0
- data/Rakefile +10 -0
- data/app/controllers/tasker/analytics_controller.rb +179 -0
- data/app/controllers/tasker/application_controller.rb +45 -0
- data/app/controllers/tasker/graphql_controller.rb +193 -0
- data/app/controllers/tasker/handlers_controller.rb +217 -0
- data/app/controllers/tasker/health_controller.rb +229 -0
- data/app/controllers/tasker/metrics_controller.rb +111 -0
- data/app/controllers/tasker/page_sort.rb +97 -0
- data/app/controllers/tasker/task_diagrams_controller.rb +30 -0
- data/app/controllers/tasker/tasks_controller.rb +123 -0
- data/app/controllers/tasker/workflow_steps_controller.rb +69 -0
- data/app/graphql/examples/all_tasks.graphql +22 -0
- data/app/graphql/examples/pending_tasks.graphql +23 -0
- data/app/graphql/tasker/graph_ql_types/annotation_type.rb +14 -0
- data/app/graphql/tasker/graph_ql_types/base_argument.rb +9 -0
- data/app/graphql/tasker/graph_ql_types/base_connection.rb +11 -0
- data/app/graphql/tasker/graph_ql_types/base_edge.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_enum.rb +9 -0
- data/app/graphql/tasker/graph_ql_types/base_field.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_input_object.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_interface.rb +14 -0
- data/app/graphql/tasker/graph_ql_types/base_object.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_scalar.rb +9 -0
- data/app/graphql/tasker/graph_ql_types/base_union.rb +11 -0
- data/app/graphql/tasker/graph_ql_types/dependent_system_object_map_type.rb +18 -0
- data/app/graphql/tasker/graph_ql_types/dependent_system_type.rb +13 -0
- data/app/graphql/tasker/graph_ql_types/mutation_type.rb +16 -0
- data/app/graphql/tasker/graph_ql_types/named_step_type.rb +16 -0
- data/app/graphql/tasker/graph_ql_types/named_task_type.rb +14 -0
- data/app/graphql/tasker/graph_ql_types/named_tasks_named_step_type.rb +19 -0
- data/app/graphql/tasker/graph_ql_types/node_type.rb +12 -0
- data/app/graphql/tasker/graph_ql_types/query_type.rb +20 -0
- data/app/graphql/tasker/graph_ql_types/task_annotation_type.rb +17 -0
- data/app/graphql/tasker/graph_ql_types/task_interface.rb +17 -0
- data/app/graphql/tasker/graph_ql_types/task_type.rb +26 -0
- data/app/graphql/tasker/graph_ql_types/workflow_step_type.rb +154 -0
- data/app/graphql/tasker/graph_ql_types.rb +42 -0
- data/app/graphql/tasker/mutations/base_mutation.rb +13 -0
- data/app/graphql/tasker/mutations/cancel_step.rb +29 -0
- data/app/graphql/tasker/mutations/cancel_task.rb +29 -0
- data/app/graphql/tasker/mutations/create_task.rb +52 -0
- data/app/graphql/tasker/mutations/update_step.rb +36 -0
- data/app/graphql/tasker/mutations/update_task.rb +41 -0
- data/app/graphql/tasker/queries/all_annotation_types.rb +17 -0
- data/app/graphql/tasker/queries/all_tasks.rb +23 -0
- data/app/graphql/tasker/queries/base_query.rb +9 -0
- data/app/graphql/tasker/queries/helpers.rb +16 -0
- data/app/graphql/tasker/queries/one_step.rb +24 -0
- data/app/graphql/tasker/queries/one_task.rb +18 -0
- data/app/graphql/tasker/queries/tasks_by_annotation.rb +31 -0
- data/app/graphql/tasker/queries/tasks_by_status.rb +30 -0
- data/app/graphql/tasker/tasker_rails_schema.rb +52 -0
- data/app/jobs/tasker/application_job.rb +8 -0
- data/app/jobs/tasker/metrics_export_job.rb +252 -0
- data/app/jobs/tasker/task_runner_job.rb +224 -0
- data/app/models/tasker/annotation_type.rb +26 -0
- data/app/models/tasker/application_record.rb +70 -0
- data/app/models/tasker/dependent_system.rb +26 -0
- data/app/models/tasker/dependent_system_object_map.rb +64 -0
- data/app/models/tasker/diagram/edge.rb +106 -0
- data/app/models/tasker/diagram/flowchart.rb +137 -0
- data/app/models/tasker/diagram/node.rb +99 -0
- data/app/models/tasker/named_step.rb +41 -0
- data/app/models/tasker/named_task.rb +121 -0
- data/app/models/tasker/named_tasks_named_step.rb +82 -0
- data/app/models/tasker/step_dag_relationship.rb +65 -0
- data/app/models/tasker/step_readiness_status.rb +59 -0
- data/app/models/tasker/task.rb +424 -0
- data/app/models/tasker/task_annotation.rb +36 -0
- data/app/models/tasker/task_diagram.rb +332 -0
- data/app/models/tasker/task_execution_context.rb +29 -0
- data/app/models/tasker/task_namespace.rb +41 -0
- data/app/models/tasker/task_transition.rb +235 -0
- data/app/models/tasker/workflow_step.rb +461 -0
- data/app/models/tasker/workflow_step_edge.rb +94 -0
- data/app/models/tasker/workflow_step_transition.rb +434 -0
- data/app/serializers/tasker/annotation_type_serializer.rb +8 -0
- data/app/serializers/tasker/handler_serializer.rb +109 -0
- data/app/serializers/tasker/task_annotation_serializer.rb +32 -0
- data/app/serializers/tasker/task_serializer.rb +168 -0
- data/app/serializers/tasker/workflow_step_serializer.rb +27 -0
- data/app/services/tasker/analytics_service.rb +409 -0
- data/app/views/tasker/task/_diagram.html.erb +32 -0
- data/config/initializers/dry_struct.rb +11 -0
- data/config/initializers/statesman.rb +6 -0
- data/config/initializers/tasker_orchestration.rb +17 -0
- data/config/initializers/time_formats.rb +4 -0
- data/config/routes.rb +34 -0
- data/config/tasker/subscriptions/example_integrations.yml +67 -0
- data/config/tasker/system_events.yml +305 -0
- data/db/functions/calculate_dependency_levels_v01.sql +45 -0
- data/db/functions/get_analytics_metrics_v01.sql +137 -0
- data/db/functions/get_slowest_steps_v01.sql +82 -0
- data/db/functions/get_slowest_tasks_v01.sql +96 -0
- data/db/functions/get_step_readiness_status_batch_v01.sql +140 -0
- data/db/functions/get_step_readiness_status_v01.sql +139 -0
- data/db/functions/get_system_health_counts_v01.sql +108 -0
- data/db/functions/get_task_execution_context_v01.sql +108 -0
- data/db/functions/get_task_execution_contexts_batch_v01.sql +104 -0
- data/db/init/schema.sql +2277 -0
- data/db/migrate/20250701165431_initial_tasker_schema.rb +116 -0
- data/db/views/tasker_step_dag_relationships_v01.sql +69 -0
- data/docs/APPLICATION_GENERATOR.md +384 -0
- data/docs/AUTH.md +1780 -0
- data/docs/CIRCUIT_BREAKER.md +224 -0
- data/docs/DEVELOPER_GUIDE.md +2665 -0
- data/docs/EVENT_SYSTEM.md +637 -0
- data/docs/EXECUTION_CONFIGURATION.md +341 -0
- data/docs/FLOW_CHART.md +149 -0
- data/docs/HEALTH.md +542 -0
- data/docs/METRICS.md +731 -0
- data/docs/OPTIMIZATION_PLAN.md +1479 -0
- data/docs/OVERVIEW.md +552 -0
- data/docs/QUICK_START.md +270 -0
- data/docs/REGISTRY_SYSTEMS.md +373 -0
- data/docs/REST_API.md +632 -0
- data/docs/ROADMAP.md +221 -0
- data/docs/SQL_FUNCTIONS.md +1408 -0
- data/docs/TASK_DIAGRAM.md +252 -0
- data/docs/TASK_EXECUTION_CONTROL_FLOW.md +237 -0
- data/docs/TELEMETRY.md +795 -0
- data/docs/TROUBLESHOOTING.md +756 -0
- data/docs/TaskHandlerGenerator.html +255 -0
- data/docs/Tasker/Analysis/RuntimeGraphAnalyzer.html +907 -0
- data/docs/Tasker/Analysis/TemplateGraphAnalyzer.html +1236 -0
- data/docs/Tasker/Analysis.html +117 -0
- data/docs/Tasker/AnalyticsController.html +450 -0
- data/docs/Tasker/AnalyticsService/BottleneckAnalytics.html +816 -0
- data/docs/Tasker/AnalyticsService/PerformanceAnalytics.html +586 -0
- data/docs/Tasker/AnalyticsService.html +2221 -0
- data/docs/Tasker/AnnotationType.html +137 -0
- data/docs/Tasker/AnnotationTypeSerializer.html +124 -0
- data/docs/Tasker/ApplicationController.html +147 -0
- data/docs/Tasker/ApplicationJob.html +128 -0
- data/docs/Tasker/ApplicationRecord.html +378 -0
- data/docs/Tasker/Authentication/AuthenticationError.html +124 -0
- data/docs/Tasker/Authentication/ConfigurationError.html +124 -0
- data/docs/Tasker/Authentication/Coordinator.html +242 -0
- data/docs/Tasker/Authentication/Interface.html +560 -0
- data/docs/Tasker/Authentication/InterfaceError.html +124 -0
- data/docs/Tasker/Authentication/NoneAuthenticator.html +338 -0
- data/docs/Tasker/Authentication.html +119 -0
- data/docs/Tasker/Authorization/AuthorizationError.html +139 -0
- data/docs/Tasker/Authorization/BaseCoordinator.html +927 -0
- data/docs/Tasker/Authorization/ConfigurationError.html +153 -0
- data/docs/Tasker/Authorization/ResourceConstants/ACTIONS.html +428 -0
- data/docs/Tasker/Authorization/ResourceConstants/RESOURCES.html +365 -0
- data/docs/Tasker/Authorization/ResourceConstants.html +146 -0
- data/docs/Tasker/Authorization/ResourceRegistry.html +882 -0
- data/docs/Tasker/Authorization/UnauthorizedError.html +153 -0
- data/docs/Tasker/Authorization.html +582 -0
- data/docs/Tasker/CacheCapabilities.html +167 -0
- data/docs/Tasker/CacheStrategy.html +1297 -0
- data/docs/Tasker/Concerns/Authenticatable.html +116 -0
- data/docs/Tasker/Concerns/Authorizable/AdminStatusChecker.html +256 -0
- data/docs/Tasker/Concerns/Authorizable.html +816 -0
- data/docs/Tasker/Concerns/ControllerAuthorizable.html +157 -0
- data/docs/Tasker/Concerns/EventPublisher.html +4023 -0
- data/docs/Tasker/Concerns/IdempotentStateTransitions.html +806 -0
- data/docs/Tasker/Concerns/LifecycleEventHelpers.html +129 -0
- data/docs/Tasker/Concerns/OrchestrationPublisher.html +129 -0
- data/docs/Tasker/Concerns/StateMachineBase/ClassMethods.html +1075 -0
- data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase/ClassMethods.html +191 -0
- data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase.html +126 -0
- data/docs/Tasker/Concerns/StateMachineBase.html +153 -0
- data/docs/Tasker/Concerns/StructuredLogging.html +1413 -0
- data/docs/Tasker/Concerns.html +117 -0
- data/docs/Tasker/Configuration/AuthConfiguration.html +1023 -0
- data/docs/Tasker/Configuration/ConfigurationProxy.html +581 -0
- data/docs/Tasker/Configuration/DatabaseConfiguration.html +475 -0
- data/docs/Tasker/Configuration/EngineConfiguration.html +1265 -0
- data/docs/Tasker/Configuration/HealthConfiguration.html +791 -0
- data/docs/Tasker/Configuration/TelemetryConfiguration.html +1308 -0
- data/docs/Tasker/Configuration/TelemetryConfigurationProxy.html +388 -0
- data/docs/Tasker/Configuration.html +1669 -0
- data/docs/Tasker/ConfigurationError.html +143 -0
- data/docs/Tasker/ConfiguredTask.html +514 -0
- data/docs/Tasker/Constants/EventDefinitions.html +590 -0
- data/docs/Tasker/Constants/LifecycleEvents.html +137 -0
- data/docs/Tasker/Constants/ObservabilityEvents/Step.html +152 -0
- data/docs/Tasker/Constants/ObservabilityEvents/Task.html +142 -0
- data/docs/Tasker/Constants/ObservabilityEvents.html +126 -0
- data/docs/Tasker/Constants/RegistryEvents.html +285 -0
- data/docs/Tasker/Constants/StepEvents.html +177 -0
- data/docs/Tasker/Constants/TaskEvents.html +167 -0
- data/docs/Tasker/Constants/TaskExecution/ExecutionStatus.html +207 -0
- data/docs/Tasker/Constants/TaskExecution/HealthStatus.html +191 -0
- data/docs/Tasker/Constants/TaskExecution/RecommendedAction.html +207 -0
- data/docs/Tasker/Constants/TaskExecution.html +126 -0
- data/docs/Tasker/Constants/TaskFinalization/ErrorMessages.html +132 -0
- data/docs/Tasker/Constants/TaskFinalization/PendingReasons.html +207 -0
- data/docs/Tasker/Constants/TaskFinalization/ReenqueueReasons.html +239 -0
- data/docs/Tasker/Constants/TaskFinalization.html +126 -0
- data/docs/Tasker/Constants/TaskStatuses.html +223 -0
- data/docs/Tasker/Constants/TestEvents.html +163 -0
- data/docs/Tasker/Constants/WorkflowEvents.html +222 -0
- data/docs/Tasker/Constants/WorkflowStepStatuses.html +223 -0
- data/docs/Tasker/Constants.html +561 -0
- data/docs/Tasker/DependentSystem.html +137 -0
- data/docs/Tasker/DependentSystemObjectMap.html +250 -0
- data/docs/Tasker/DetectorRegistry.html +598 -0
- data/docs/Tasker/Diagram/Edge.html +1191 -0
- data/docs/Tasker/Diagram/Flowchart.html +1539 -0
- data/docs/Tasker/Diagram/Node.html +1165 -0
- data/docs/Tasker/Diagram.html +117 -0
- data/docs/Tasker/Engine.html +215 -0
- data/docs/Tasker/Error.html +139 -0
- data/docs/Tasker/Events/Bus.html +1226 -0
- data/docs/Tasker/Events/Catalog/CatalogPrinter.html +258 -0
- data/docs/Tasker/Events/Catalog/CustomEventRegistrar.html +276 -0
- data/docs/Tasker/Events/Catalog/ExamplePayloadGenerator.html +294 -0
- data/docs/Tasker/Events/Catalog.html +1291 -0
- data/docs/Tasker/Events/CustomRegistry.html +943 -0
- data/docs/Tasker/Events/DefinitionLoader.html +575 -0
- data/docs/Tasker/Events/EventPayloadBuilder/ErrorInfoExtractor.html +286 -0
- data/docs/Tasker/Events/EventPayloadBuilder/StepPayloadBuilder.html +312 -0
- data/docs/Tasker/Events/EventPayloadBuilder.html +664 -0
- data/docs/Tasker/Events/Publisher.html +365 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer/ErrorTypeClassifier.html +1128 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer.html +270 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/MetricTagsExtractor.html +266 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber.html +2556 -0
- data/docs/Tasker/Events/Subscribers/MetricsSubscriber.html +723 -0
- data/docs/Tasker/Events/Subscribers/TelemetrySubscriber.html +2251 -0
- data/docs/Tasker/Events/Subscribers.html +117 -0
- data/docs/Tasker/Events/SubscriptionLoader.html +493 -0
- data/docs/Tasker/Events.html +294 -0
- data/docs/Tasker/EventsGenerator.html +459 -0
- data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics/AnalyticsMetrics.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics.html +412 -0
- data/docs/Tasker/Functions/FunctionBasedDependencyLevels.html +598 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestSteps/SlowestStep.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestSteps.html +453 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestTasks/SlowestTask.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestTasks.html +453 -0
- data/docs/Tasker/Functions/FunctionBasedStepReadinessStatus.html +1457 -0
- data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts/HealthMetrics.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts.html +370 -0
- data/docs/Tasker/Functions/FunctionBasedTaskExecutionContext.html +1250 -0
- data/docs/Tasker/Functions/FunctionWrapper.html +479 -0
- data/docs/Tasker/Functions.html +117 -0
- data/docs/Tasker/Generators/AuthenticatorGenerator/UsageInstructionsFormatter.html +244 -0
- data/docs/Tasker/Generators/AuthenticatorGenerator.html +373 -0
- data/docs/Tasker/Generators/AuthorizationCoordinatorGenerator.html +430 -0
- data/docs/Tasker/Generators/SubscriberGenerator.html +377 -0
- data/docs/Tasker/Generators/TaskHandlerGenerator.html +263 -0
- data/docs/Tasker/Generators.html +117 -0
- data/docs/Tasker/GraphQLTypes/AnnotationType.html +132 -0
- data/docs/Tasker/GraphQLTypes/BaseArgument.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseConnection.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseEdge.html +130 -0
- data/docs/Tasker/GraphQLTypes/BaseEnum.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseField.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseInputObject.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseInterface.html +116 -0
- data/docs/Tasker/GraphQLTypes/BaseObject.html +128 -0
- data/docs/Tasker/GraphQLTypes/BaseScalar.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseUnion.html +124 -0
- data/docs/Tasker/GraphQLTypes/DependentSystemObjectMapType.html +132 -0
- data/docs/Tasker/GraphQLTypes/DependentSystemType.html +132 -0
- data/docs/Tasker/GraphQLTypes/MutationType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NamedStepType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NamedTaskType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NamedTasksNamedStepType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NodeType.html +118 -0
- data/docs/Tasker/GraphQLTypes/QueryType.html +139 -0
- data/docs/Tasker/GraphQLTypes/TaskAnnotationType.html +132 -0
- data/docs/Tasker/GraphQLTypes/TaskInterface.html +111 -0
- data/docs/Tasker/GraphQLTypes/TaskType.html +201 -0
- data/docs/Tasker/GraphQLTypes/WorkflowStepType.html +694 -0
- data/docs/Tasker/GraphQLTypes.html +130 -0
- data/docs/Tasker/GraphqlController.html +251 -0
- data/docs/Tasker/HandlerFactory.html +1518 -0
- data/docs/Tasker/HandlerSerializer.html +682 -0
- data/docs/Tasker/HandlersController.html +574 -0
- data/docs/Tasker/HashIdentityStrategy.html +278 -0
- data/docs/Tasker/Health/ReadinessChecker.html +712 -0
- data/docs/Tasker/Health/StatusChecker.html +653 -0
- data/docs/Tasker/Health.html +117 -0
- data/docs/Tasker/HealthController.html +523 -0
- data/docs/Tasker/IdentityStrategy.html +276 -0
- data/docs/Tasker/InvalidTaskHandlerConfig.html +135 -0
- data/docs/Tasker/LifecycleEvents/Events/Step.html +162 -0
- data/docs/Tasker/LifecycleEvents/Events/Task.html +162 -0
- data/docs/Tasker/LifecycleEvents/Events.html +204 -0
- data/docs/Tasker/LifecycleEvents/Publisher.html +132 -0
- data/docs/Tasker/LifecycleEvents.html +799 -0
- data/docs/Tasker/Logging/CorrelationIdGenerator.html +688 -0
- data/docs/Tasker/Logging.html +115 -0
- data/docs/Tasker/MetricsController.html +293 -0
- data/docs/Tasker/MetricsExportJob.html +414 -0
- data/docs/Tasker/Mutations/BaseMutation.html +128 -0
- data/docs/Tasker/Mutations/CancelStep.html +219 -0
- data/docs/Tasker/Mutations/CancelTask.html +221 -0
- data/docs/Tasker/Mutations/CreateTask.html +243 -0
- data/docs/Tasker/Mutations/UpdateStep.html +243 -0
- data/docs/Tasker/Mutations/UpdateTask.html +243 -0
- data/docs/Tasker/Mutations.html +117 -0
- data/docs/Tasker/NamedStep.html +216 -0
- data/docs/Tasker/NamedTask.html +910 -0
- data/docs/Tasker/NamedTasksNamedStep.html +435 -0
- data/docs/Tasker/Orchestration/BackoffCalculator.html +404 -0
- data/docs/Tasker/Orchestration/ConnectionBuilder/ConfigValidator.html +258 -0
- data/docs/Tasker/Orchestration/ConnectionBuilder.html +435 -0
- data/docs/Tasker/Orchestration/ConnectionPoolIntelligence.html +513 -0
- data/docs/Tasker/Orchestration/Coordinator.html +641 -0
- data/docs/Tasker/Orchestration/FutureStateAnalyzer.html +1045 -0
- data/docs/Tasker/Orchestration/Orchestrator.html +679 -0
- data/docs/Tasker/Orchestration/PluginIntegration.html +1127 -0
- data/docs/Tasker/Orchestration/ResponseProcessor.html +504 -0
- data/docs/Tasker/Orchestration/RetryHeaderParser.html +304 -0
- data/docs/Tasker/Orchestration/StepExecutor.html +995 -0
- data/docs/Tasker/Orchestration/StepSequenceFactory.html +644 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/BlockageChecker.html +264 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/ContextManager.html +254 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/DelayCalculator.html +556 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationDecisionMaker.html +348 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationProcessor.html +286 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/ReasonDeterminer.html +432 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/ReenqueueManager.html +296 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/UnclearStateHandler.html +314 -0
- data/docs/Tasker/Orchestration/TaskFinalizer.html +1212 -0
- data/docs/Tasker/Orchestration/TaskInitializer.html +766 -0
- data/docs/Tasker/Orchestration/TaskReenqueuer.html +506 -0
- data/docs/Tasker/Orchestration/ViableStepDiscovery.html +442 -0
- data/docs/Tasker/Orchestration/WorkflowCoordinator.html +510 -0
- data/docs/Tasker/Orchestration.html +130 -0
- data/docs/Tasker/PageSort/PageSortParamsBuilder.html +296 -0
- data/docs/Tasker/PageSort.html +247 -0
- data/docs/Tasker/PermanentError.html +518 -0
- data/docs/Tasker/ProceduralError.html +147 -0
- data/docs/Tasker/Queries/AllAnnotationTypes.html +217 -0
- data/docs/Tasker/Queries/AllTasks.html +221 -0
- data/docs/Tasker/Queries/BaseQuery.html +128 -0
- data/docs/Tasker/Queries/Helpers.html +187 -0
- data/docs/Tasker/Queries/OneStep.html +225 -0
- data/docs/Tasker/Queries/OneTask.html +217 -0
- data/docs/Tasker/Queries/TasksByAnnotation.html +231 -0
- data/docs/Tasker/Queries/TasksByStatus.html +233 -0
- data/docs/Tasker/Queries.html +119 -0
- data/docs/Tasker/Railtie.html +124 -0
- data/docs/Tasker/Registry/BaseRegistry.html +1690 -0
- data/docs/Tasker/Registry/EventPublisher.html +667 -0
- data/docs/Tasker/Registry/InterfaceValidator.html +569 -0
- data/docs/Tasker/Registry/RegistrationError.html +132 -0
- data/docs/Tasker/Registry/RegistryError.html +139 -0
- data/docs/Tasker/Registry/StatisticsCollector.html +841 -0
- data/docs/Tasker/Registry/SubscriberRegistry.html +1504 -0
- data/docs/Tasker/Registry/ValidationError.html +132 -0
- data/docs/Tasker/Registry.html +119 -0
- data/docs/Tasker/RetryableError.html +515 -0
- data/docs/Tasker/StateMachine/Compatibility.html +282 -0
- data/docs/Tasker/StateMachine/InvalidStateTransition.html +135 -0
- data/docs/Tasker/StateMachine/StepStateMachine/StandardizedPayloadBuilder.html +260 -0
- data/docs/Tasker/StateMachine/StepStateMachine.html +2215 -0
- data/docs/Tasker/StateMachine/TaskStateMachine.html +734 -0
- data/docs/Tasker/StateMachine.html +602 -0
- data/docs/Tasker/StepDagRelationship.html +657 -0
- data/docs/Tasker/StepHandler/Api/Config.html +1091 -0
- data/docs/Tasker/StepHandler/Api.html +884 -0
- data/docs/Tasker/StepHandler/AutomaticEventPublishing.html +321 -0
- data/docs/Tasker/StepHandler/Base.html +970 -0
- data/docs/Tasker/StepHandler.html +119 -0
- data/docs/Tasker/StepReadinessStatus.html +836 -0
- data/docs/Tasker/Task.html +2575 -0
- data/docs/Tasker/TaskAnnotation.html +137 -0
- data/docs/Tasker/TaskAnnotationSerializer.html +124 -0
- data/docs/Tasker/TaskBuilder/StepNameValidator.html +264 -0
- data/docs/Tasker/TaskBuilder/StepTemplateDefiner.html +264 -0
- data/docs/Tasker/TaskBuilder.html +764 -0
- data/docs/Tasker/TaskDiagram/StepToStepEdgeBuilder.html +260 -0
- data/docs/Tasker/TaskDiagram/TaskToRootStepEdgeBuilder.html +290 -0
- data/docs/Tasker/TaskDiagram.html +548 -0
- data/docs/Tasker/TaskDiagramsController.html +240 -0
- data/docs/Tasker/TaskExecutionContext.html +469 -0
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/ClassBasedEventRegistrar.html +238 -0
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/YamlEventRegistrar.html +254 -0
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner.html +988 -0
- data/docs/Tasker/TaskHandler/ClassMethods.html +357 -0
- data/docs/Tasker/TaskHandler/InstanceMethods.html +1396 -0
- data/docs/Tasker/TaskHandler/StepGroup.html +1748 -0
- data/docs/Tasker/TaskHandler.html +271 -0
- data/docs/Tasker/TaskNamespace.html +312 -0
- data/docs/Tasker/TaskRunnerJob.html +406 -0
- data/docs/Tasker/TaskSerializer.html +474 -0
- data/docs/Tasker/TaskTransition.html +1517 -0
- data/docs/Tasker/TaskWorkflowSummary.html +988 -0
- data/docs/Tasker/TaskerRailsSchema/InvalidObjectTypeError.html +132 -0
- data/docs/Tasker/TaskerRailsSchema/TypeResolutionError.html +139 -0
- data/docs/Tasker/TaskerRailsSchema/UnknownInterfaceError.html +132 -0
- data/docs/Tasker/TaskerRailsSchema.html +384 -0
- data/docs/Tasker/TasksController.html +595 -0
- data/docs/Tasker/Telemetry/EventMapping.html +1307 -0
- data/docs/Tasker/Telemetry/EventRouter.html +2178 -0
- data/docs/Tasker/Telemetry/Events/ExportEvents.html +246 -0
- data/docs/Tasker/Telemetry/Events.html +115 -0
- data/docs/Tasker/Telemetry/ExportCoordinator/DistributedLockTimeoutError.html +135 -0
- data/docs/Tasker/Telemetry/ExportCoordinator.html +2137 -0
- data/docs/Tasker/Telemetry/IntelligentCacheManager.html +1083 -0
- data/docs/Tasker/Telemetry/LogBackend.html +1088 -0
- data/docs/Tasker/Telemetry/MetricTypes/Counter.html +1054 -0
- data/docs/Tasker/Telemetry/MetricTypes/Gauge.html +1270 -0
- data/docs/Tasker/Telemetry/MetricTypes/Histogram.html +1492 -0
- data/docs/Tasker/Telemetry/MetricTypes.html +153 -0
- data/docs/Tasker/Telemetry/MetricsBackend.html +2510 -0
- data/docs/Tasker/Telemetry/MetricsExportService.html +578 -0
- data/docs/Tasker/Telemetry/PluginRegistry.html +1774 -0
- data/docs/Tasker/Telemetry/Plugins/BaseExporter.html +1835 -0
- data/docs/Tasker/Telemetry/Plugins/CsvExporter.html +768 -0
- data/docs/Tasker/Telemetry/Plugins/JsonExporter.html +747 -0
- data/docs/Tasker/Telemetry/Plugins.html +117 -0
- data/docs/Tasker/Telemetry/PrometheusExporter.html +481 -0
- data/docs/Tasker/Telemetry/TraceBackend.html +891 -0
- data/docs/Tasker/Telemetry.html +130 -0
- data/docs/Tasker/Types/AuthConfig.html +886 -0
- data/docs/Tasker/Types/BackoffConfig.html +1063 -0
- data/docs/Tasker/Types/BaseConfig.html +227 -0
- data/docs/Tasker/Types/CacheConfig.html +1731 -0
- data/docs/Tasker/Types/DatabaseConfig.html +388 -0
- data/docs/Tasker/Types/DependencyGraph.html +526 -0
- data/docs/Tasker/Types/DependencyGraphConfig.html +753 -0
- data/docs/Tasker/Types/EngineConfig.html +1181 -0
- data/docs/Tasker/Types/ExecutionConfig.html +1963 -0
- data/docs/Tasker/Types/GraphEdge.html +517 -0
- data/docs/Tasker/Types/GraphMetadata.html +781 -0
- data/docs/Tasker/Types/GraphNode.html +694 -0
- data/docs/Tasker/Types/HealthConfig.html +784 -0
- data/docs/Tasker/Types/StepSequence.html +353 -0
- data/docs/Tasker/Types/StepTemplate.html +1193 -0
- data/docs/Tasker/Types/TaskRequest.html +1179 -0
- data/docs/Tasker/Types/TelemetryConfig.html +2746 -0
- data/docs/Tasker/Types.html +154 -0
- data/docs/Tasker/WorkflowStep/StepFinder.html +282 -0
- data/docs/Tasker/WorkflowStep.html +2724 -0
- data/docs/Tasker/WorkflowStepEdge.html +304 -0
- data/docs/Tasker/WorkflowStepSerializer.html +305 -0
- data/docs/Tasker/WorkflowStepTransition/TransitionDescriptionFormatter.html +282 -0
- data/docs/Tasker/WorkflowStepTransition.html +2201 -0
- data/docs/Tasker/WorkflowStepsController.html +462 -0
- data/docs/Tasker.html +452 -0
- data/docs/VISION.md +584 -0
- data/docs/WHY.md +21 -0
- data/docs/_index.html +2375 -0
- data/docs/class_list.html +54 -0
- data/docs/css/common.css +1 -0
- data/docs/css/full_list.css +58 -0
- data/docs/css/style.css +503 -0
- data/docs/events/migration_plan_outcomes.md +80 -0
- data/docs/file.README.html +541 -0
- data/docs/file_list.html +59 -0
- data/docs/frames.html +22 -0
- data/docs/index.html +541 -0
- data/docs/js/app.js +344 -0
- data/docs/js/full_list.js +242 -0
- data/docs/js/jquery.js +4 -0
- data/docs/method_list.html +9182 -0
- data/docs/top-level-namespace.html +110 -0
- data/lib/generators/tasker/authenticator_generator.rb +301 -0
- data/lib/generators/tasker/authorization_coordinator_generator.rb +139 -0
- data/lib/generators/tasker/events_generator.rb +91 -0
- data/lib/generators/tasker/subscriber_generator.rb +107 -0
- data/lib/generators/tasker/task_handler_generator.rb +138 -0
- data/lib/generators/tasker/templates/api_token_authenticator.rb.erb +113 -0
- data/lib/generators/tasker/templates/api_token_authenticator_spec.rb.erb +144 -0
- data/lib/generators/tasker/templates/authorization_coordinator.rb.erb +95 -0
- data/lib/generators/tasker/templates/authorization_coordinator_spec.rb.erb +142 -0
- data/lib/generators/tasker/templates/custom_authenticator.rb.erb +108 -0
- data/lib/generators/tasker/templates/custom_authenticator_spec.rb.erb +162 -0
- data/lib/generators/tasker/templates/custom_events.yml.erb +62 -0
- data/lib/generators/tasker/templates/custom_subscriber.rb.erb +72 -0
- data/lib/generators/tasker/templates/devise_authenticator.rb.erb +101 -0
- data/lib/generators/tasker/templates/devise_authenticator_spec.rb.erb +126 -0
- data/lib/generators/tasker/templates/initialize.rb.erb +202 -0
- data/lib/generators/tasker/templates/jwt_authenticator.rb.erb +144 -0
- data/lib/generators/tasker/templates/jwt_authenticator_spec.rb.erb +298 -0
- data/lib/generators/tasker/templates/metrics_subscriber.rb.erb +258 -0
- data/lib/generators/tasker/templates/metrics_subscriber_spec.rb.erb +308 -0
- data/lib/generators/tasker/templates/omniauth_authenticator.rb.erb +135 -0
- data/lib/generators/tasker/templates/omniauth_authenticator_spec.rb.erb +196 -0
- data/lib/generators/tasker/templates/opentelemetry_initializer.rb +52 -0
- data/lib/generators/tasker/templates/subscriber.rb.erb +64 -0
- data/lib/generators/tasker/templates/subscriber_spec.rb.erb +80 -0
- data/lib/generators/tasker/templates/task_config.yaml.erb +117 -0
- data/lib/generators/tasker/templates/task_handler.rb.erb +59 -0
- data/lib/generators/tasker/templates/task_handler_spec.rb.erb +159 -0
- data/lib/tasker/analysis/runtime_graph_analyzer.rb +1168 -0
- data/lib/tasker/analysis/template_graph_analyzer.rb +328 -0
- data/lib/tasker/authentication/coordinator.rb +78 -0
- data/lib/tasker/authentication/errors.rb +9 -0
- data/lib/tasker/authentication/interface.rb +36 -0
- data/lib/tasker/authentication/none_authenticator.rb +26 -0
- data/lib/tasker/authorization/base_coordinator.rb +112 -0
- data/lib/tasker/authorization/errors.rb +26 -0
- data/lib/tasker/authorization/resource_constants.rb +74 -0
- data/lib/tasker/authorization/resource_registry.rb +143 -0
- data/lib/tasker/authorization.rb +75 -0
- data/lib/tasker/cache_capabilities.rb +131 -0
- data/lib/tasker/cache_strategy.rb +469 -0
- data/lib/tasker/concerns/authenticatable.rb +41 -0
- data/lib/tasker/concerns/authorizable.rb +204 -0
- data/lib/tasker/concerns/controller_authorizable.rb +124 -0
- data/lib/tasker/concerns/event_publisher.rb +716 -0
- data/lib/tasker/concerns/idempotent_state_transitions.rb +128 -0
- data/lib/tasker/concerns/state_machine_base.rb +218 -0
- data/lib/tasker/concerns/structured_logging.rb +387 -0
- data/lib/tasker/configuration.rb +325 -0
- data/lib/tasker/constants/event_definitions.rb +147 -0
- data/lib/tasker/constants/registry_events.rb +54 -0
- data/lib/tasker/constants.rb +417 -0
- data/lib/tasker/engine.rb +90 -0
- data/lib/tasker/errors.rb +90 -0
- data/lib/tasker/events/catalog.rb +432 -0
- data/lib/tasker/events/custom_registry.rb +175 -0
- data/lib/tasker/events/definition_loader.rb +199 -0
- data/lib/tasker/events/event_payload_builder.rb +461 -0
- data/lib/tasker/events/publisher.rb +149 -0
- data/lib/tasker/events/subscribers/base_subscriber.rb +601 -0
- data/lib/tasker/events/subscribers/metrics_subscriber.rb +120 -0
- data/lib/tasker/events/subscribers/telemetry_subscriber.rb +462 -0
- data/lib/tasker/events/subscription_loader.rb +161 -0
- data/lib/tasker/events.rb +37 -0
- data/lib/tasker/functions/function_based_analytics_metrics.rb +103 -0
- data/lib/tasker/functions/function_based_dependency_levels.rb +54 -0
- data/lib/tasker/functions/function_based_slowest_steps.rb +84 -0
- data/lib/tasker/functions/function_based_slowest_tasks.rb +84 -0
- data/lib/tasker/functions/function_based_step_readiness_status.rb +183 -0
- data/lib/tasker/functions/function_based_system_health_counts.rb +94 -0
- data/lib/tasker/functions/function_based_task_execution_context.rb +148 -0
- data/lib/tasker/functions/function_wrapper.rb +42 -0
- data/lib/tasker/functions.rb +12 -0
- data/lib/tasker/handler_factory.rb +322 -0
- data/lib/tasker/health/readiness_checker.rb +186 -0
- data/lib/tasker/health/status_checker.rb +203 -0
- data/lib/tasker/identity_strategy.rb +38 -0
- data/lib/tasker/logging/correlation_id_generator.rb +120 -0
- data/lib/tasker/orchestration/backoff_calculator.rb +184 -0
- data/lib/tasker/orchestration/connection_builder.rb +122 -0
- data/lib/tasker/orchestration/connection_pool_intelligence.rb +177 -0
- data/lib/tasker/orchestration/coordinator.rb +119 -0
- data/lib/tasker/orchestration/future_state_analyzer.rb +137 -0
- data/lib/tasker/orchestration/plugin_integration.rb +124 -0
- data/lib/tasker/orchestration/response_processor.rb +168 -0
- data/lib/tasker/orchestration/retry_header_parser.rb +78 -0
- data/lib/tasker/orchestration/step_executor.rb +941 -0
- data/lib/tasker/orchestration/step_sequence_factory.rb +67 -0
- data/lib/tasker/orchestration/task_finalizer.rb +564 -0
- data/lib/tasker/orchestration/task_initializer.rb +140 -0
- data/lib/tasker/orchestration/task_reenqueuer.rb +71 -0
- data/lib/tasker/orchestration/viable_step_discovery.rb +65 -0
- data/lib/tasker/orchestration/workflow_coordinator.rb +294 -0
- data/lib/tasker/orchestration.rb +45 -0
- data/lib/tasker/railtie.rb +9 -0
- data/lib/tasker/registry/base_registry.rb +177 -0
- data/lib/tasker/registry/event_publisher.rb +91 -0
- data/lib/tasker/registry/interface_validator.rb +140 -0
- data/lib/tasker/registry/statistics_collector.rb +381 -0
- data/lib/tasker/registry/subscriber_registry.rb +285 -0
- data/lib/tasker/registry.rb +22 -0
- data/lib/tasker/state_machine/step_state_machine.rb +508 -0
- data/lib/tasker/state_machine/task_state_machine.rb +192 -0
- data/lib/tasker/state_machine.rb +83 -0
- data/lib/tasker/step_handler/api.rb +410 -0
- data/lib/tasker/step_handler/base.rb +206 -0
- data/lib/tasker/task_builder.rb +432 -0
- data/lib/tasker/task_handler/class_methods.rb +324 -0
- data/lib/tasker/task_handler/instance_methods.rb +293 -0
- data/lib/tasker/task_handler/step_group.rb +182 -0
- data/lib/tasker/task_handler.rb +43 -0
- data/lib/tasker/telemetry/event_mapping.rb +126 -0
- data/lib/tasker/telemetry/event_router.rb +318 -0
- data/lib/tasker/telemetry/events/export_events.rb +38 -0
- data/lib/tasker/telemetry/export_coordinator.rb +497 -0
- data/lib/tasker/telemetry/intelligent_cache_manager.rb +508 -0
- data/lib/tasker/telemetry/log_backend.rb +224 -0
- data/lib/tasker/telemetry/metric_types.rb +368 -0
- data/lib/tasker/telemetry/metrics_backend.rb +1227 -0
- data/lib/tasker/telemetry/metrics_export_service.rb +392 -0
- data/lib/tasker/telemetry/plugin_registry.rb +333 -0
- data/lib/tasker/telemetry/plugins/base_exporter.rb +246 -0
- data/lib/tasker/telemetry/plugins/csv_exporter.rb +198 -0
- data/lib/tasker/telemetry/plugins/json_exporter.rb +141 -0
- data/lib/tasker/telemetry/prometheus_exporter.rb +249 -0
- data/lib/tasker/telemetry/trace_backend.rb +186 -0
- data/lib/tasker/telemetry.rb +59 -0
- data/lib/tasker/types/auth_config.rb +81 -0
- data/lib/tasker/types/backoff_config.rb +142 -0
- data/lib/tasker/types/cache_config.rb +257 -0
- data/lib/tasker/types/database_config.rb +39 -0
- data/lib/tasker/types/dependency_graph.rb +225 -0
- data/lib/tasker/types/dependency_graph_config.rb +149 -0
- data/lib/tasker/types/engine_config.rb +131 -0
- data/lib/tasker/types/execution_config.rb +289 -0
- data/lib/tasker/types/health_config.rb +84 -0
- data/lib/tasker/types/step_sequence.rb +24 -0
- data/lib/tasker/types/step_template.rb +63 -0
- data/lib/tasker/types/task_request.rb +60 -0
- data/lib/tasker/types/telemetry_config.rb +273 -0
- data/lib/tasker/types.rb +64 -0
- data/lib/tasker/version.rb +7 -0
- data/lib/tasker.rb +82 -0
- data/lib/tasks/tasker_tasks.rake +302 -0
- metadata +958 -0
@@ -0,0 +1,508 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tasker
|
4
|
+
module Telemetry
|
5
|
+
# Intelligent cache management with adaptive TTL and distributed coordination
|
6
|
+
#
|
7
|
+
# This class implements a strategic constants vs configuration approach:
|
8
|
+
# - CONSTANTS: Infrastructure naming for consistency across deployments
|
9
|
+
# - CONFIGURABLE: Algorithm parameters for workload-specific tuning
|
10
|
+
#
|
11
|
+
# **Phase 2.1 Enhancement: Distributed Coordination**
|
12
|
+
# Leverages proven MetricsBackend patterns for multi-container coordination:
|
13
|
+
# - Instance ID generation (hostname-pid pattern)
|
14
|
+
# - Cache capability detection with adaptive strategies
|
15
|
+
# - Multi-strategy coordination (distributed_atomic, distributed_basic, local_only)
|
16
|
+
# - Atomic operations with fallback strategies
|
17
|
+
#
|
18
|
+
# Features:
|
19
|
+
# - Kubernetes-ready distributed cache coordination
|
20
|
+
# - Rails.cache abstraction (works with Redis, Memcached, File, Memory)
|
21
|
+
# - Configurable smoothing factors for different workload patterns
|
22
|
+
# - Comprehensive performance tracking with structured logging
|
23
|
+
#
|
24
|
+
# @example Basic usage
|
25
|
+
# manager = IntelligentCacheManager.new
|
26
|
+
# result = manager.intelligent_fetch('expensive_key') { expensive_computation }
|
27
|
+
#
|
28
|
+
# @example With custom configuration
|
29
|
+
# config = Tasker::Types::CacheConfig.new(hit_rate_smoothing_factor: 0.95)
|
30
|
+
# manager = IntelligentCacheManager.new(config)
|
31
|
+
# result = manager.intelligent_fetch('key', base_ttl: 600) { data }
|
32
|
+
#
|
33
|
+
class IntelligentCacheManager
|
34
|
+
include Tasker::Concerns::StructuredLogging
|
35
|
+
|
36
|
+
# ✅ CONSTANTS: Infrastructure naming (consistency across deployments)
|
37
|
+
CACHE_PERFORMANCE_KEY_PREFIX = 'tasker:cache_perf'
|
38
|
+
DASHBOARD_CACHE_KEY_PREFIX = 'tasker:dashboard'
|
39
|
+
WORKFLOW_CACHE_KEY_PREFIX = 'tasker:workflow'
|
40
|
+
PERFORMANCE_RETENTION_PERIOD = 1.hour
|
41
|
+
COORDINATION_RETRY_ATTEMPTS = 3
|
42
|
+
|
43
|
+
# ✅ CONSTANTS: Coordination strategy thresholds (algorithmic, not configurable)
|
44
|
+
ATOMIC_OPERATION_TIMEOUT = 5.seconds
|
45
|
+
BASIC_COORDINATION_TIMEOUT = 10.seconds
|
46
|
+
LOCAL_COORDINATION_TIMEOUT = 1.second
|
47
|
+
|
48
|
+
attr_reader :config, :instance_id, :cache_capabilities, :coordination_strategy
|
49
|
+
|
50
|
+
# Initialize intelligent cache manager with distributed coordination
|
51
|
+
#
|
52
|
+
# @param config [Tasker::Types::CacheConfig, nil] Cache configuration
|
53
|
+
def initialize(config = nil)
|
54
|
+
@config = config || Tasker.configuration.cache
|
55
|
+
|
56
|
+
# Use unified cache strategy for capability detection
|
57
|
+
@cache_strategy = Tasker::CacheStrategy.detect
|
58
|
+
@instance_id = @cache_strategy.instance_id
|
59
|
+
@coordination_strategy = @cache_strategy.coordination_mode
|
60
|
+
|
61
|
+
# Extract capabilities for backward compatibility
|
62
|
+
@cache_capabilities = @cache_strategy.export_capabilities
|
63
|
+
@coordination_config = configure_coordination_parameters
|
64
|
+
|
65
|
+
log_structured(:info, 'IntelligentCacheManager initialized',
|
66
|
+
coordination_strategy: @coordination_strategy,
|
67
|
+
cache_store: @cache_strategy.store_class_name,
|
68
|
+
instance_id: @instance_id,
|
69
|
+
adaptive_ttl_enabled: @config.adaptive_ttl_enabled,
|
70
|
+
performance_tracking_enabled: @config.performance_tracking_enabled)
|
71
|
+
end
|
72
|
+
|
73
|
+
# Main intelligent cache method with distributed coordination
|
74
|
+
#
|
75
|
+
# @param cache_key [String] The cache key
|
76
|
+
# @param base_ttl [Integer] Base TTL in seconds
|
77
|
+
# @yield Block that generates the value if cache miss
|
78
|
+
# @return [Object] The cached or generated value
|
79
|
+
def intelligent_fetch(cache_key, base_ttl: @config.default_ttl, &)
|
80
|
+
case @coordination_strategy
|
81
|
+
when :distributed_atomic
|
82
|
+
intelligent_fetch_with_atomic_coordination(cache_key, base_ttl, &)
|
83
|
+
when :distributed_basic
|
84
|
+
intelligent_fetch_with_basic_coordination(cache_key, base_ttl, &)
|
85
|
+
when :local_only
|
86
|
+
intelligent_fetch_with_local_tracking(cache_key, base_ttl, &)
|
87
|
+
else
|
88
|
+
# Fallback to basic Rails.cache behavior
|
89
|
+
Rails.cache.fetch(cache_key, expires_in: base_ttl, &)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
|
93
|
+
# Clear performance data for a specific cache key
|
94
|
+
#
|
95
|
+
# @param cache_key [String] The cache key to clear performance data for
|
96
|
+
# @return [Boolean] Success status
|
97
|
+
def clear_performance_data(cache_key)
|
98
|
+
performance_key = build_performance_key(cache_key)
|
99
|
+
Rails.cache.delete(performance_key)
|
100
|
+
|
101
|
+
log_structured(:debug, 'Cache performance data cleared',
|
102
|
+
cache_key: cache_key,
|
103
|
+
performance_key: performance_key,
|
104
|
+
coordination_strategy: @coordination_strategy)
|
105
|
+
|
106
|
+
true
|
107
|
+
rescue StandardError => e
|
108
|
+
log_structured(:error, 'Failed to clear cache performance data',
|
109
|
+
cache_key: cache_key,
|
110
|
+
error: e.message,
|
111
|
+
coordination_strategy: @coordination_strategy)
|
112
|
+
false
|
113
|
+
end
|
114
|
+
|
115
|
+
# Export cache performance metrics for observability
|
116
|
+
#
|
117
|
+
# @return [Hash] Performance metrics summary
|
118
|
+
def export_performance_metrics
|
119
|
+
case @coordination_strategy
|
120
|
+
when :distributed_atomic, :distributed_basic
|
121
|
+
export_distributed_performance_metrics
|
122
|
+
when :local_only
|
123
|
+
export_local_performance_metrics
|
124
|
+
else
|
125
|
+
{ strategy: @coordination_strategy, metrics: {} }
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
private
|
130
|
+
|
131
|
+
# Distributed atomic coordination (Redis with full features)
|
132
|
+
#
|
133
|
+
# @param cache_key [String] The cache key
|
134
|
+
# @param base_ttl [Integer] Base TTL in seconds
|
135
|
+
# @yield Block that generates the value
|
136
|
+
# @return [Object] The cached or generated value
|
137
|
+
def intelligent_fetch_with_atomic_coordination(cache_key, base_ttl, &)
|
138
|
+
# Get performance data atomically (no race conditions)
|
139
|
+
performance_data = fetch_atomic_performance_data(cache_key)
|
140
|
+
adaptive_ttl = @config.calculate_adaptive_ttl(base_ttl, **performance_data)
|
141
|
+
|
142
|
+
# Execute cache fetch with performance tracking
|
143
|
+
result = execute_tracked_fetch(cache_key, adaptive_ttl, &)
|
144
|
+
|
145
|
+
# Update performance metrics atomically
|
146
|
+
update_atomic_performance_metrics(cache_key, result[:hit], result[:duration])
|
147
|
+
|
148
|
+
result[:value]
|
149
|
+
end
|
150
|
+
|
151
|
+
# Distributed basic coordination (Memcached with read-modify-write)
|
152
|
+
#
|
153
|
+
# @param cache_key [String] The cache key
|
154
|
+
# @param base_ttl [Integer] Base TTL in seconds
|
155
|
+
# @yield Block that generates the value
|
156
|
+
# @return [Object] The cached or generated value
|
157
|
+
def intelligent_fetch_with_basic_coordination(cache_key, base_ttl, &)
|
158
|
+
# Get performance data with read-modify-write pattern
|
159
|
+
performance_data = fetch_basic_performance_data(cache_key)
|
160
|
+
adaptive_ttl = @config.calculate_adaptive_ttl(base_ttl, **performance_data)
|
161
|
+
|
162
|
+
# Execute cache fetch with performance tracking
|
163
|
+
result = execute_tracked_fetch(cache_key, adaptive_ttl, &)
|
164
|
+
|
165
|
+
# Update performance metrics with coordination
|
166
|
+
update_basic_performance_metrics(cache_key, result[:hit], result[:duration])
|
167
|
+
|
168
|
+
result[:value]
|
169
|
+
end
|
170
|
+
|
171
|
+
# Local-only tracking (Memory/File stores)
|
172
|
+
#
|
173
|
+
# @param cache_key [String] The cache key
|
174
|
+
# @param base_ttl [Integer] Base TTL in seconds
|
175
|
+
# @yield Block that generates the value
|
176
|
+
# @return [Object] The cached or generated value
|
177
|
+
def intelligent_fetch_with_local_tracking(cache_key, base_ttl, &)
|
178
|
+
# Get instance-specific performance data
|
179
|
+
performance_data = fetch_local_performance_data(cache_key)
|
180
|
+
adaptive_ttl = @config.calculate_adaptive_ttl(base_ttl, **performance_data)
|
181
|
+
|
182
|
+
# Execute cache fetch with local tracking
|
183
|
+
result = execute_tracked_fetch(cache_key, adaptive_ttl, &)
|
184
|
+
|
185
|
+
# Update local performance metrics
|
186
|
+
update_local_performance_metrics(cache_key, result[:hit], result[:duration])
|
187
|
+
|
188
|
+
result[:value]
|
189
|
+
end
|
190
|
+
|
191
|
+
# Execute cache fetch with comprehensive tracking
|
192
|
+
#
|
193
|
+
# @param cache_key [String] The cache key
|
194
|
+
# @param adaptive_ttl [Integer] Calculated adaptive TTL
|
195
|
+
# @yield Block that generates the value
|
196
|
+
# @return [Hash] Result with hit status, duration, and value
|
197
|
+
def execute_tracked_fetch(cache_key, adaptive_ttl)
|
198
|
+
fetch_start = Time.current
|
199
|
+
cache_miss = false
|
200
|
+
|
201
|
+
value = Rails.cache.fetch(cache_key, expires_in: adaptive_ttl) do
|
202
|
+
cache_miss = true # This is a miss since we're in the block
|
203
|
+
yield
|
204
|
+
end
|
205
|
+
|
206
|
+
# Cache hit is the opposite of cache miss
|
207
|
+
cache_hit = !cache_miss
|
208
|
+
|
209
|
+
fetch_duration = Time.current - fetch_start
|
210
|
+
|
211
|
+
log_structured(:debug, 'Intelligent cache fetch completed',
|
212
|
+
cache_key: cache_key,
|
213
|
+
adaptive_ttl: adaptive_ttl,
|
214
|
+
cache_hit: cache_hit,
|
215
|
+
fetch_duration_ms: (fetch_duration * 1000).round(2),
|
216
|
+
coordination_strategy: @coordination_strategy)
|
217
|
+
|
218
|
+
{
|
219
|
+
value: value,
|
220
|
+
hit: cache_hit,
|
221
|
+
duration: fetch_duration
|
222
|
+
}
|
223
|
+
end
|
224
|
+
|
225
|
+
# Build performance key with strategic process isolation
|
226
|
+
#
|
227
|
+
# @param cache_key [String] The original cache key
|
228
|
+
# @return [String] Performance tracking key
|
229
|
+
def build_performance_key(cache_key)
|
230
|
+
case @coordination_strategy
|
231
|
+
when :distributed_atomic, :distributed_basic
|
232
|
+
# GLOBAL: Shared performance data across containers for system-wide optimization
|
233
|
+
"#{CACHE_PERFORMANCE_KEY_PREFIX}:#{cache_key}"
|
234
|
+
when :local_only
|
235
|
+
# LOCAL: Instance-specific performance data for single-process stores
|
236
|
+
"#{CACHE_PERFORMANCE_KEY_PREFIX}:#{@instance_id}:#{cache_key}"
|
237
|
+
else
|
238
|
+
"#{CACHE_PERFORMANCE_KEY_PREFIX}:fallback:#{cache_key}"
|
239
|
+
end
|
240
|
+
end
|
241
|
+
|
242
|
+
# Fetch performance data using atomic operations (Redis)
|
243
|
+
#
|
244
|
+
# @param cache_key [String] The cache key
|
245
|
+
# @return [Hash] Performance data for adaptive TTL calculation
|
246
|
+
def fetch_atomic_performance_data(cache_key)
|
247
|
+
performance_key = build_performance_key(cache_key)
|
248
|
+
|
249
|
+
# Use atomic operations to get consistent performance data
|
250
|
+
performance_data = Rails.cache.read(performance_key) || initialize_performance_data
|
251
|
+
|
252
|
+
# Return data in format expected by calculate_adaptive_ttl
|
253
|
+
{
|
254
|
+
hit_rate: performance_data[:hit_rate] || 0.0,
|
255
|
+
generation_time: performance_data[:avg_generation_time] || 0.0,
|
256
|
+
access_frequency: performance_data[:access_frequency] || 0
|
257
|
+
}
|
258
|
+
rescue StandardError => e
|
259
|
+
log_structured(:error, 'Failed to fetch atomic performance data',
|
260
|
+
cache_key: cache_key,
|
261
|
+
error: e.message)
|
262
|
+
default_performance_data
|
263
|
+
end
|
264
|
+
|
265
|
+
# Fetch performance data using basic read-modify-write (Memcached)
|
266
|
+
#
|
267
|
+
# @param cache_key [String] The cache key
|
268
|
+
# @return [Hash] Performance data for adaptive TTL calculation
|
269
|
+
def fetch_basic_performance_data(cache_key)
|
270
|
+
performance_key = build_performance_key(cache_key)
|
271
|
+
|
272
|
+
performance_data = Rails.cache.read(performance_key) || initialize_performance_data
|
273
|
+
|
274
|
+
{
|
275
|
+
hit_rate: performance_data[:hit_rate] || 0.0,
|
276
|
+
generation_time: performance_data[:avg_generation_time] || 0.0,
|
277
|
+
access_frequency: performance_data[:access_frequency] || 0
|
278
|
+
}
|
279
|
+
rescue StandardError => e
|
280
|
+
log_structured(:error, 'Failed to fetch basic performance data',
|
281
|
+
cache_key: cache_key,
|
282
|
+
error: e.message)
|
283
|
+
default_performance_data
|
284
|
+
end
|
285
|
+
|
286
|
+
# Fetch local performance data (Memory/File stores)
|
287
|
+
#
|
288
|
+
# @param cache_key [String] The cache key
|
289
|
+
# @return [Hash] Performance data for adaptive TTL calculation
|
290
|
+
def fetch_local_performance_data(cache_key)
|
291
|
+
performance_key = build_performance_key(cache_key)
|
292
|
+
|
293
|
+
performance_data = Rails.cache.read(performance_key) || initialize_performance_data
|
294
|
+
|
295
|
+
{
|
296
|
+
hit_rate: performance_data[:hit_rate] || 0.0,
|
297
|
+
generation_time: performance_data[:avg_generation_time] || 0.0,
|
298
|
+
access_frequency: performance_data[:access_frequency] || 0
|
299
|
+
}
|
300
|
+
rescue StandardError => e
|
301
|
+
log_structured(:error, 'Failed to fetch local performance data',
|
302
|
+
cache_key: cache_key,
|
303
|
+
error: e.message)
|
304
|
+
default_performance_data
|
305
|
+
end
|
306
|
+
|
307
|
+
# Update performance metrics using atomic operations
|
308
|
+
#
|
309
|
+
# @param cache_key [String] The cache key
|
310
|
+
# @param cache_hit [Boolean] Whether this was a cache hit
|
311
|
+
# @param duration [Float] Fetch duration in seconds
|
312
|
+
def update_atomic_performance_metrics(cache_key, cache_hit, duration)
|
313
|
+
performance_key = build_performance_key(cache_key)
|
314
|
+
|
315
|
+
# Use atomic operations for thread-safe updates
|
316
|
+
performance_data = Rails.cache.read(performance_key) || initialize_performance_data
|
317
|
+
updated_data = calculate_updated_performance_data(performance_data, cache_hit, duration)
|
318
|
+
|
319
|
+
Rails.cache.write(performance_key, updated_data, expires_in: PERFORMANCE_RETENTION_PERIOD)
|
320
|
+
rescue StandardError => e
|
321
|
+
log_structured(:error, 'Failed to update atomic performance metrics',
|
322
|
+
cache_key: cache_key,
|
323
|
+
error: e.message)
|
324
|
+
end
|
325
|
+
|
326
|
+
# Update performance metrics using basic coordination
|
327
|
+
#
|
328
|
+
# @param cache_key [String] The cache key
|
329
|
+
# @param cache_hit [Boolean] Whether this was a cache hit
|
330
|
+
# @param duration [Float] Fetch duration in seconds
|
331
|
+
def update_basic_performance_metrics(cache_key, cache_hit, duration)
|
332
|
+
performance_key = build_performance_key(cache_key)
|
333
|
+
|
334
|
+
# Read-modify-write pattern for basic coordination
|
335
|
+
performance_data = Rails.cache.read(performance_key) || initialize_performance_data
|
336
|
+
updated_data = calculate_updated_performance_data(performance_data, cache_hit, duration)
|
337
|
+
|
338
|
+
Rails.cache.write(performance_key, updated_data, expires_in: PERFORMANCE_RETENTION_PERIOD)
|
339
|
+
rescue StandardError => e
|
340
|
+
log_structured(:error, 'Failed to update basic performance metrics',
|
341
|
+
cache_key: cache_key,
|
342
|
+
error: e.message)
|
343
|
+
end
|
344
|
+
|
345
|
+
# Update local performance metrics
|
346
|
+
#
|
347
|
+
# @param cache_key [String] The cache key
|
348
|
+
# @param cache_hit [Boolean] Whether this was a cache hit
|
349
|
+
# @param duration [Float] Fetch duration in seconds
|
350
|
+
def update_local_performance_metrics(cache_key, cache_hit, duration)
|
351
|
+
performance_key = build_performance_key(cache_key)
|
352
|
+
|
353
|
+
performance_data = Rails.cache.read(performance_key) || initialize_performance_data
|
354
|
+
updated_data = calculate_updated_performance_data(performance_data, cache_hit, duration)
|
355
|
+
|
356
|
+
Rails.cache.write(performance_key, updated_data, expires_in: PERFORMANCE_RETENTION_PERIOD)
|
357
|
+
rescue StandardError => e
|
358
|
+
log_structured(:error, 'Failed to update local performance metrics',
|
359
|
+
cache_key: cache_key,
|
360
|
+
error: e.message)
|
361
|
+
end
|
362
|
+
|
363
|
+
# Calculate updated performance data with smoothing
|
364
|
+
#
|
365
|
+
# @param current_data [Hash] Current performance data
|
366
|
+
# @param cache_hit [Boolean] Whether this was a cache hit
|
367
|
+
# @param duration [Float] Fetch duration in seconds
|
368
|
+
# @return [Hash] Updated performance data
|
369
|
+
def calculate_updated_performance_data(current_data, cache_hit, duration)
|
370
|
+
# Apply smoothing factors from configuration
|
371
|
+
smoothing_factor = @config.hit_rate_smoothing_factor
|
372
|
+
decay_rate = @config.access_frequency_decay_rate
|
373
|
+
|
374
|
+
# Ensure current_data has required keys with defaults
|
375
|
+
current_hit_rate = current_data[:hit_rate] || 0.0
|
376
|
+
current_avg_generation_time = current_data[:avg_generation_time] || 0.0
|
377
|
+
current_access_frequency = current_data[:access_frequency] || 0
|
378
|
+
current_total_accesses = current_data[:total_accesses] || 0
|
379
|
+
current_cache_hits = current_data[:cache_hits] || 0
|
380
|
+
current_cache_misses = current_data[:cache_misses] || 0
|
381
|
+
|
382
|
+
# Update hit rate with exponential smoothing
|
383
|
+
hit_value = cache_hit ? 1.0 : 0.0
|
384
|
+
new_hit_rate = (current_hit_rate * smoothing_factor) + (hit_value * (1 - smoothing_factor))
|
385
|
+
|
386
|
+
# Update average generation time (only for misses)
|
387
|
+
new_avg_generation_time = if cache_hit
|
388
|
+
current_avg_generation_time * decay_rate
|
389
|
+
else
|
390
|
+
(current_avg_generation_time * smoothing_factor) + (duration * (1 - smoothing_factor))
|
391
|
+
end
|
392
|
+
|
393
|
+
# Update access frequency with decay
|
394
|
+
new_access_frequency = (current_access_frequency * decay_rate) + 1
|
395
|
+
|
396
|
+
{
|
397
|
+
hit_rate: new_hit_rate.clamp(0.0, 1.0),
|
398
|
+
avg_generation_time: new_avg_generation_time,
|
399
|
+
access_frequency: new_access_frequency,
|
400
|
+
last_updated: Time.current,
|
401
|
+
total_accesses: current_total_accesses + 1,
|
402
|
+
cache_hits: current_cache_hits + (cache_hit ? 1 : 0),
|
403
|
+
cache_misses: current_cache_misses + (cache_hit ? 0 : 1)
|
404
|
+
}
|
405
|
+
end
|
406
|
+
|
407
|
+
# Initialize performance data structure
|
408
|
+
#
|
409
|
+
# @return [Hash] Initial performance data
|
410
|
+
def initialize_performance_data
|
411
|
+
{
|
412
|
+
hit_rate: 0.0,
|
413
|
+
avg_generation_time: 0.0,
|
414
|
+
access_frequency: 0,
|
415
|
+
last_updated: Time.current,
|
416
|
+
total_accesses: 0,
|
417
|
+
cache_hits: 0,
|
418
|
+
cache_misses: 0
|
419
|
+
}
|
420
|
+
end
|
421
|
+
|
422
|
+
# Default performance data for error cases
|
423
|
+
#
|
424
|
+
# @return [Hash] Safe default performance data
|
425
|
+
def default_performance_data
|
426
|
+
{
|
427
|
+
hit_rate: 0.0,
|
428
|
+
generation_time: 0.0,
|
429
|
+
access_frequency: 0
|
430
|
+
}
|
431
|
+
end
|
432
|
+
|
433
|
+
# Export distributed performance metrics
|
434
|
+
#
|
435
|
+
# @return [Hash] Distributed performance metrics
|
436
|
+
def export_distributed_performance_metrics
|
437
|
+
{
|
438
|
+
strategy: @coordination_strategy,
|
439
|
+
instance_id: @instance_id,
|
440
|
+
cache_store: @cache_capabilities[:store_class],
|
441
|
+
coordination_config: @coordination_config,
|
442
|
+
metrics: gather_distributed_metrics
|
443
|
+
}
|
444
|
+
end
|
445
|
+
|
446
|
+
# Export local performance metrics
|
447
|
+
#
|
448
|
+
# @return [Hash] Local performance metrics
|
449
|
+
def export_local_performance_metrics
|
450
|
+
{
|
451
|
+
strategy: @coordination_strategy,
|
452
|
+
instance_id: @instance_id,
|
453
|
+
cache_store: @cache_capabilities[:store_class],
|
454
|
+
metrics: gather_local_metrics,
|
455
|
+
warning: 'Local-only metrics - not shared across containers'
|
456
|
+
}
|
457
|
+
end
|
458
|
+
|
459
|
+
# Gather distributed metrics from shared cache
|
460
|
+
#
|
461
|
+
# @return [Hash] Gathered metrics
|
462
|
+
def gather_distributed_metrics
|
463
|
+
# Implementation would scan for performance keys and aggregate
|
464
|
+
# For now, return basic structure
|
465
|
+
{
|
466
|
+
total_keys_tracked: 0,
|
467
|
+
avg_hit_rate: 0.0,
|
468
|
+
coordination_overhead: 'minimal'
|
469
|
+
}
|
470
|
+
end
|
471
|
+
|
472
|
+
# Gather local metrics from instance cache
|
473
|
+
#
|
474
|
+
# @return [Hash] Local metrics
|
475
|
+
def gather_local_metrics
|
476
|
+
{
|
477
|
+
total_keys_tracked: 0,
|
478
|
+
avg_hit_rate: 0.0,
|
479
|
+
instance_specific: true
|
480
|
+
}
|
481
|
+
end
|
482
|
+
|
483
|
+
# Configure coordination parameters based on strategy
|
484
|
+
#
|
485
|
+
# @return [Hash] Coordination configuration
|
486
|
+
def configure_coordination_parameters
|
487
|
+
{
|
488
|
+
retry_attempts: COORDINATION_RETRY_ATTEMPTS,
|
489
|
+
timeout: coordination_timeout_for_strategy,
|
490
|
+
retention_window: PERFORMANCE_RETENTION_PERIOD,
|
491
|
+
batch_size: @config.respond_to?(:coordination_batch_size) ? @config.coordination_batch_size : 50
|
492
|
+
}
|
493
|
+
end
|
494
|
+
|
495
|
+
# Get appropriate timeout for coordination strategy
|
496
|
+
#
|
497
|
+
# @return [Integer] Timeout in seconds
|
498
|
+
def coordination_timeout_for_strategy
|
499
|
+
case @coordination_strategy
|
500
|
+
when :distributed_atomic then ATOMIC_OPERATION_TIMEOUT
|
501
|
+
when :distributed_basic then BASIC_COORDINATION_TIMEOUT
|
502
|
+
when :local_only then LOCAL_COORDINATION_TIMEOUT
|
503
|
+
else 5.seconds
|
504
|
+
end
|
505
|
+
end
|
506
|
+
end
|
507
|
+
end
|
508
|
+
end
|