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
data/docs/OVERVIEW.md
ADDED
@@ -0,0 +1,552 @@
|
|
1
|
+
# System Overview
|
2
|
+
|
3
|
+
## 🎉 PRODUCTION-READY WORKFLOW ORCHESTRATION ENGINE
|
4
|
+
|
5
|
+
**MASSIVE BREAKTHROUGH**: Registry System Consolidation **SUCCESSFULLY COMPLETED**! Tasker now features enterprise-grade registry architecture with 100% test success (1,479/1,479 tests passing) and comprehensive thread-safe operations.
|
6
|
+
|
7
|
+
### 🎯 Current Status: ENTERPRISE READY
|
8
|
+
- ✅ **Registry System Consolidation Complete** - Thread-safe operations with structured logging
|
9
|
+
- ✅ **100% Test Success** - 1,479/1,479 tests passing with comprehensive validation
|
10
|
+
- ✅ **Thread-Safe Architecture** - All registry systems use `Concurrent::Hash` storage
|
11
|
+
- ✅ **Structured Logging** - Correlation IDs and JSON formatting for observability
|
12
|
+
- ✅ **Interface Validation** - Fail-fast validation with detailed error messages
|
13
|
+
- ✅ **Production Resilience** - Exponential backoff and comprehensive error handling
|
14
|
+
|
15
|
+
Tasker now features:
|
16
|
+
|
17
|
+
- **Enterprise Registry Architecture** - Thread-safe registry systems with structured logging
|
18
|
+
- **Unified Event System** - Single `Events::Publisher` with standardized event payloads
|
19
|
+
- **Complete Step Error Persistence** - Atomic transactions ensuring zero data loss
|
20
|
+
- **Production-Ready OpenTelemetry Integration** - Full observability stack with safety mechanisms
|
21
|
+
- **Memory-Safe Operation** - Database connection pooling and leak prevention
|
22
|
+
- **Developer-Friendly API** - Clean `EventPublisher` concern for easy integration
|
23
|
+
|
24
|
+
## Registry System Architecture
|
25
|
+
|
26
|
+
Tasker's registry systems have been completely modernized with enterprise-grade capabilities:
|
27
|
+
|
28
|
+
### Thread-Safe Registry Operations
|
29
|
+
|
30
|
+
All registry systems now use `Concurrent::Hash` for thread-safe operations:
|
31
|
+
|
32
|
+
```ruby
|
33
|
+
# HandlerFactory - Thread-safe task handler management
|
34
|
+
Tasker::HandlerFactory.instance.register(
|
35
|
+
'payment_processor',
|
36
|
+
PaymentHandler,
|
37
|
+
namespace_name: 'payments',
|
38
|
+
version: '2.1.0',
|
39
|
+
replace: true # Graceful conflict resolution
|
40
|
+
)
|
41
|
+
|
42
|
+
# PluginRegistry - Format-based plugin discovery
|
43
|
+
Tasker::Telemetry::PluginRegistry.register(
|
44
|
+
'custom_exporter',
|
45
|
+
CustomExporter,
|
46
|
+
format: :json,
|
47
|
+
replace: true
|
48
|
+
)
|
49
|
+
|
50
|
+
# SubscriberRegistry - Event subscriber management
|
51
|
+
Tasker::Registry::SubscriberRegistry.register(
|
52
|
+
'notification_subscriber',
|
53
|
+
NotificationSubscriber,
|
54
|
+
events: ['task.completed', 'task.failed']
|
55
|
+
)
|
56
|
+
```
|
57
|
+
|
58
|
+
### Structured Logging with Correlation IDs
|
59
|
+
|
60
|
+
Every registry operation includes comprehensive structured logging:
|
61
|
+
|
62
|
+
```json
|
63
|
+
{
|
64
|
+
"timestamp": "2024-01-15T10:30:45Z",
|
65
|
+
"correlation_id": "tsk_abc123_def456",
|
66
|
+
"component": "handler_factory",
|
67
|
+
"message": "Registry item registered",
|
68
|
+
"environment": "production",
|
69
|
+
"tasker_version": "2.4.1",
|
70
|
+
"process_id": 12345,
|
71
|
+
"thread_id": "abc123",
|
72
|
+
"entity_type": "task_handler",
|
73
|
+
"entity_id": "payments/payment_processor/2.1.0",
|
74
|
+
"entity_class": "PaymentHandler",
|
75
|
+
"registry_name": "handler_factory",
|
76
|
+
"options": {
|
77
|
+
"namespace_name": "payments",
|
78
|
+
"version": "2.1.0",
|
79
|
+
"replace": true
|
80
|
+
},
|
81
|
+
"event_type": "registered"
|
82
|
+
}
|
83
|
+
```
|
84
|
+
|
85
|
+
### Interface Validation & Error Handling
|
86
|
+
|
87
|
+
Comprehensive validation prevents runtime errors:
|
88
|
+
|
89
|
+
```ruby
|
90
|
+
# Fail-fast validation with detailed error messages
|
91
|
+
begin
|
92
|
+
Tasker::HandlerFactory.instance.register('invalid_handler', InvalidClass)
|
93
|
+
rescue Tasker::Registry::ValidationError => e
|
94
|
+
# Detailed error with context and suggestions
|
95
|
+
puts e.message
|
96
|
+
# => "Handler validation failed: InvalidClass does not implement required method 'process'.
|
97
|
+
# Required methods: [process, initialize_task!].
|
98
|
+
# Suggestion: Inherit from Tasker::TaskHandler::Base"
|
99
|
+
end
|
100
|
+
```
|
101
|
+
|
102
|
+
### Registry Statistics & Health Monitoring
|
103
|
+
|
104
|
+
Built-in monitoring and statistics:
|
105
|
+
|
106
|
+
```ruby
|
107
|
+
# Comprehensive registry statistics
|
108
|
+
stats = Tasker::HandlerFactory.instance.stats
|
109
|
+
# => {
|
110
|
+
# total_handlers: 45,
|
111
|
+
# namespaces: ["payments", "inventory", "notifications"],
|
112
|
+
# versions: ["1.0.0", "1.1.0", "2.0.0"],
|
113
|
+
# thread_safe: true,
|
114
|
+
# last_registration: "2024-01-15T10:30:45Z"
|
115
|
+
# }
|
116
|
+
|
117
|
+
# Health check integration
|
118
|
+
health = Tasker::HandlerFactory.instance.health_check
|
119
|
+
# => { status: "healthy", registry_size: 45, thread_safe: true }
|
120
|
+
```
|
121
|
+
|
122
|
+
## Event System Architecture
|
123
|
+
|
124
|
+
Tasker features a comprehensive event-driven architecture that provides both deep observability and powerful developer integration capabilities:
|
125
|
+
|
126
|
+
### Event Categories
|
127
|
+
|
128
|
+
- **Task Events** (`Tasker::Constants::TaskEvents`) - Task lifecycle events (started, completed, failed)
|
129
|
+
- **Step Events** (`Tasker::Constants::StepEvents`) - Step execution events with error context
|
130
|
+
- **Workflow Events** (`Tasker::Constants::WorkflowEvents`) - Orchestration and dependency management
|
131
|
+
- **Observability Events** (`Tasker::Constants::ObservabilityEvents`) - Performance monitoring and metrics
|
132
|
+
|
133
|
+
### Developer-Friendly Event Discovery
|
134
|
+
|
135
|
+
The event system includes a comprehensive catalog for discovering and understanding events:
|
136
|
+
|
137
|
+
```ruby
|
138
|
+
# Discover all available events
|
139
|
+
Tasker::Events.catalog.keys
|
140
|
+
# => ["task.started", "task.completed", "task.failed", "step.started", ...]
|
141
|
+
|
142
|
+
# Get detailed event information
|
143
|
+
Tasker::Events.event_info('task.completed')
|
144
|
+
# => {
|
145
|
+
# name: "task.completed",
|
146
|
+
# category: "task",
|
147
|
+
# description: "Fired when a task completes successfully",
|
148
|
+
# payload_schema: { task_id: String, execution_duration: Float },
|
149
|
+
# example_payload: { task_id: "task_123", execution_duration: 45.2 },
|
150
|
+
# fired_by: ["TaskFinalizer", "TaskHandler"]
|
151
|
+
# }
|
152
|
+
```
|
153
|
+
|
154
|
+
### Custom Event Subscribers
|
155
|
+
|
156
|
+
Create custom integrations with external services using the subscriber generator:
|
157
|
+
|
158
|
+
```bash
|
159
|
+
# Generate a subscriber with specific events
|
160
|
+
rails generate tasker:subscriber notification --events task.completed task.failed step.failed
|
161
|
+
```
|
162
|
+
|
163
|
+
This creates a complete subscriber class with automatic method routing:
|
164
|
+
|
165
|
+
```ruby
|
166
|
+
class NotificationSubscriber < Tasker::Events::Subscribers::BaseSubscriber
|
167
|
+
subscribe_to 'task.completed', 'task.failed', 'step.failed'
|
168
|
+
|
169
|
+
def handle_task_completed(event)
|
170
|
+
task_id = safe_get(event, :task_id)
|
171
|
+
NotificationService.send_success_email(task_id: task_id)
|
172
|
+
end
|
173
|
+
|
174
|
+
def handle_task_failed(event)
|
175
|
+
task_id = safe_get(event, :task_id)
|
176
|
+
error_message = safe_get(event, :error_message, 'Unknown error')
|
177
|
+
AlertService.send_failure_alert(task_id: task_id, error: error_message)
|
178
|
+
end
|
179
|
+
end
|
180
|
+
```
|
181
|
+
|
182
|
+
### Publishing Events
|
183
|
+
|
184
|
+
```ruby
|
185
|
+
class MyStepHandler
|
186
|
+
include Tasker::Concerns::EventPublisher
|
187
|
+
|
188
|
+
def handle(task, sequence, step)
|
189
|
+
# Clean step started event
|
190
|
+
publish_step_started(step)
|
191
|
+
|
192
|
+
# Your business logic here
|
193
|
+
result = perform_operation(task.context)
|
194
|
+
step.results = { data: result }
|
195
|
+
|
196
|
+
# Clean completion event with additional context
|
197
|
+
publish_step_completed(step, operation_count: result.size)
|
198
|
+
end
|
199
|
+
end
|
200
|
+
```
|
201
|
+
|
202
|
+
### Integration Examples
|
203
|
+
|
204
|
+
The system includes comprehensive integration examples in `spec/lib/tasker/events/subscribers/examples/`:
|
205
|
+
|
206
|
+
- **SentrySubscriber** - Error tracking with intelligent fingerprinting
|
207
|
+
- **PagerDutySubscriber** - Critical alerting with business logic filtering
|
208
|
+
- **SlackSubscriber** - Rich team notifications with environment routing
|
209
|
+
- **MetricsSubscriber** - Analytics and performance tracking
|
210
|
+
- **ComprehensiveSubscriber** - Multi-service integration patterns
|
211
|
+
|
212
|
+
For complete documentation, see [EVENT_SYSTEM.md](EVENT_SYSTEM.md).
|
213
|
+
|
214
|
+
### OpenTelemetry Integration
|
215
|
+
|
216
|
+
Full observability stack including:
|
217
|
+
|
218
|
+
- **Database Query Monitoring** - PostgreSQL instrumentation with connection safety
|
219
|
+
- **Background Job Tracking** - Sidekiq, Redis, and concurrent processing
|
220
|
+
- **API Call Tracing** - HTTP requests with proper error handling
|
221
|
+
- **State Machine Transitions** - Complete audit trail of workflow state changes
|
222
|
+
|
223
|
+
For detailed telemetry configuration, see [TELEMETRY.md](TELEMETRY.md).
|
224
|
+
|
225
|
+
## Example of a Configured Task Handler
|
226
|
+
|
227
|
+
Here's an example YAML file for an e-commerce API integration task handler:
|
228
|
+
|
229
|
+
```yaml
|
230
|
+
---
|
231
|
+
name: api_task/integration_yaml_example
|
232
|
+
module_namespace: ApiTask
|
233
|
+
task_handler_class: IntegrationYamlExample
|
234
|
+
|
235
|
+
default_dependent_system: ecommerce_system
|
236
|
+
|
237
|
+
named_steps:
|
238
|
+
- fetch_cart
|
239
|
+
- fetch_products
|
240
|
+
- validate_products
|
241
|
+
- create_order
|
242
|
+
- publish_event
|
243
|
+
|
244
|
+
schema:
|
245
|
+
type: object
|
246
|
+
required:
|
247
|
+
- cart_id
|
248
|
+
properties:
|
249
|
+
cart_id:
|
250
|
+
type: integer
|
251
|
+
|
252
|
+
step_templates:
|
253
|
+
- name: fetch_cart
|
254
|
+
description: Fetch cart details from e-commerce system
|
255
|
+
handler_class: ApiTask::StepHandler::CartFetchStepHandler
|
256
|
+
handler_config:
|
257
|
+
type: api
|
258
|
+
url: https://api.ecommerce.com/cart
|
259
|
+
params:
|
260
|
+
cart_id: 1
|
261
|
+
|
262
|
+
- name: fetch_products
|
263
|
+
description: Fetch product details from product catalog
|
264
|
+
handler_class: ApiTask::StepHandler::ProductsFetchStepHandler
|
265
|
+
handler_config:
|
266
|
+
type: api
|
267
|
+
url: https://api.ecommerce.com/products
|
268
|
+
|
269
|
+
- name: validate_products
|
270
|
+
description: Validate product availability
|
271
|
+
depends_on_steps:
|
272
|
+
- fetch_products
|
273
|
+
- fetch_cart
|
274
|
+
handler_class: ApiTask::StepHandler::ProductsValidateStepHandler
|
275
|
+
|
276
|
+
- name: create_order
|
277
|
+
description: Create order from validated cart
|
278
|
+
depends_on_step: validate_products
|
279
|
+
handler_class: ApiTask::StepHandler::CreateOrderStepHandler
|
280
|
+
|
281
|
+
- name: publish_event
|
282
|
+
description: Publish order created event
|
283
|
+
depends_on_step: create_order
|
284
|
+
handler_class: ApiTask::StepHandler::PublishEventStepHandler
|
285
|
+
|
286
|
+
environments:
|
287
|
+
development:
|
288
|
+
step_templates:
|
289
|
+
- name: fetch_cart
|
290
|
+
handler_config:
|
291
|
+
url: http://localhost:3000/api/cart
|
292
|
+
params:
|
293
|
+
cart_id: 1
|
294
|
+
debug: true
|
295
|
+
|
296
|
+
- name: fetch_products
|
297
|
+
handler_config:
|
298
|
+
url: http://localhost:3000/api/products
|
299
|
+
params:
|
300
|
+
debug: true
|
301
|
+
|
302
|
+
test:
|
303
|
+
step_templates:
|
304
|
+
- name: fetch_cart
|
305
|
+
handler_config:
|
306
|
+
url: http://test-api.ecommerce.com/cart
|
307
|
+
params:
|
308
|
+
cart_id: 1
|
309
|
+
test_mode: true
|
310
|
+
|
311
|
+
- name: fetch_products
|
312
|
+
handler_config:
|
313
|
+
url: http://test-api.ecommerce.com/products
|
314
|
+
params:
|
315
|
+
test_mode: true
|
316
|
+
|
317
|
+
production:
|
318
|
+
step_templates:
|
319
|
+
- name: fetch_cart
|
320
|
+
handler_config:
|
321
|
+
url: https://api.ecommerce.com/cart
|
322
|
+
params:
|
323
|
+
cart_id: 1
|
324
|
+
api_key: ${ECOMMERCE_API_KEY}
|
325
|
+
|
326
|
+
- name: fetch_products
|
327
|
+
handler_config:
|
328
|
+
url: https://api.ecommerce.com/products
|
329
|
+
params:
|
330
|
+
api_key: ${ECOMMERCE_API_KEY}
|
331
|
+
```
|
332
|
+
|
333
|
+
## Environment-Specific Configuration
|
334
|
+
|
335
|
+
Tasker supports environment-specific configuration overrides in YAML files. This allows you to:
|
336
|
+
|
337
|
+
1. Define a base configuration that works across all environments
|
338
|
+
2. Override specific settings for each environment (development, test, production)
|
339
|
+
|
340
|
+
The configuration is merged at runtime, with environment-specific settings taking precedence over the base configuration. This is particularly useful for:
|
341
|
+
|
342
|
+
- Using different API endpoints per environment
|
343
|
+
- Enabling debug mode in development
|
344
|
+
- Using test mode in test environments
|
345
|
+
|
346
|
+
To use environment-specific configuration:
|
347
|
+
|
348
|
+
1. Add environment-specific sections to your YAML file
|
349
|
+
2. Override only the settings that need to change per environment
|
350
|
+
3. The TaskBuilder will automatically merge the configurations based on the current Rails environment
|
351
|
+
|
352
|
+
## API Task Example
|
353
|
+
|
354
|
+
See the [spec/dummy/app/tasks/api_task](./spec/dummy/app/tasks/api_task) directory for an example of a task handler that processes an e-commerce order through a series of steps, interacting with external systems, and handling errors and retries. You can read more about the example [here](./spec/dummy/app/tasks/api_task/README.md).
|
355
|
+
|
356
|
+
### API Routes
|
357
|
+
|
358
|
+
Tasker provides a RESTful API for managing tasks. Here are the available endpoints:
|
359
|
+
|
360
|
+
#### Tasks
|
361
|
+
|
362
|
+
- `GET /tasker/tasks` - List all tasks
|
363
|
+
- `POST /tasker/tasks` - Create and enqueue a new task
|
364
|
+
- `GET /tasker/tasks/{task_id}` - Get task details
|
365
|
+
- `PATCH/PUT /tasker/tasks/{task_id}` - Update task
|
366
|
+
- `DELETE /tasker/tasks/{task_id}` - Cancel task
|
367
|
+
|
368
|
+
#### Workflow Steps
|
369
|
+
|
370
|
+
- `GET /tasker/tasks/{task_id}/workflow_steps` - List steps for a task
|
371
|
+
- `GET /tasker/tasks/{task_id}/workflow_steps/{step_id}` - Get step details
|
372
|
+
- `PATCH/PUT /tasker/tasks/{task_id}/workflow_steps/{step_id}` - Update step
|
373
|
+
- `DELETE /tasker/tasks/{task_id}/workflow_steps/{step_id}` - Cancel step
|
374
|
+
|
375
|
+
#### Task Diagrams
|
376
|
+
|
377
|
+
- `GET /tasker/tasks/{task_id}/diagram` - Get a diagram for a task
|
378
|
+
|
379
|
+
### Creating a Task via API
|
380
|
+
|
381
|
+
Example of creating a task using curl:
|
382
|
+
|
383
|
+
```bash
|
384
|
+
curl -X POST https://www.example.com/tasker/tasks \
|
385
|
+
-H "Content-Type: application/json" \
|
386
|
+
-d '{
|
387
|
+
"name": "api_integration_task",
|
388
|
+
"context": {
|
389
|
+
"cart_id": 123
|
390
|
+
},
|
391
|
+
"initiator": "web_interface",
|
392
|
+
"reason": "Process new order",
|
393
|
+
"source_system": "ecommerce",
|
394
|
+
"tags": ["order_processing", "api_integration"]
|
395
|
+
}'
|
396
|
+
```
|
397
|
+
|
398
|
+
The request body must include:
|
399
|
+
|
400
|
+
- `name`: The name of the task handler to use
|
401
|
+
- `context`: A JSON object containing the task's context data
|
402
|
+
- `initiator`: Who/what initiated the task
|
403
|
+
- `reason`: Why the task was created
|
404
|
+
- `source_system`: The system that created the task
|
405
|
+
- `tags`: (Optional) Array of tags for categorization
|
406
|
+
|
407
|
+
## Workflow & Retry Mechanism
|
408
|
+
|
409
|
+
```mermaid
|
410
|
+
graph TD
|
411
|
+
Start([Task Initialization]) --> FindRoots[Find Root Steps]
|
412
|
+
FindRoots --> QueueRoots[Queue Root Steps]
|
413
|
+
QueueRoots --> ParallelExec{Parallel Execution}
|
414
|
+
|
415
|
+
ParallelExec --> RootA[Root Step A]
|
416
|
+
ParallelExec --> RootB[Root Step B]
|
417
|
+
|
418
|
+
RootA --> |Running| A[Step Ready for Execution]
|
419
|
+
RootB --> |Running| A
|
420
|
+
|
421
|
+
A --> B{Step Succeeded?}
|
422
|
+
B -->|Yes| C[Mark Step Complete]
|
423
|
+
B -->|No| D{Retryable Error?}
|
424
|
+
D -->|No| E[Mark as Failed]
|
425
|
+
D -->|Yes| F{Attempts < Max?}
|
426
|
+
F -->|No| E
|
427
|
+
F -->|Yes| G[Calculate Backoff]
|
428
|
+
|
429
|
+
G --> H[Apply Exponential Backoff with Jitter]
|
430
|
+
H --> I[Wait for Backoff Period]
|
431
|
+
I --> J[Increment Attempt Count]
|
432
|
+
J --> A
|
433
|
+
|
434
|
+
C --> K{Find Dependent Steps}
|
435
|
+
K --> DepCheck{For Each Dependent Step}
|
436
|
+
DepCheck --> DependenciesMet{All Dependencies\nComplete?}
|
437
|
+
DependenciesMet -->|Yes| QueueStep[Queue Step for Execution]
|
438
|
+
QueueStep --> ParallelExec
|
439
|
+
DependenciesMet -->|No| Wait[Step Remains Pending]
|
440
|
+
|
441
|
+
E --> TaskCheck{Any Step\nFailed?}
|
442
|
+
TaskCheck -->|Yes| FailTask[Mark Task as Failed]
|
443
|
+
|
444
|
+
Wait -.- DepMonitor[Dependency Monitor]
|
445
|
+
DepMonitor -.- DependenciesMet
|
446
|
+
|
447
|
+
C --> CompleteCheck{All Steps\nComplete?}
|
448
|
+
CompleteCheck -->|Yes| CompleteTask[Mark Task as Complete]
|
449
|
+
CompleteCheck -->|No| Continue[Continue Processing]
|
450
|
+
|
451
|
+
subgraph DAG Traversal
|
452
|
+
FindRoots
|
453
|
+
QueueRoots
|
454
|
+
ParallelExec
|
455
|
+
RootA
|
456
|
+
RootB
|
457
|
+
K
|
458
|
+
DepCheck
|
459
|
+
DependenciesMet
|
460
|
+
QueueStep
|
461
|
+
Wait
|
462
|
+
DepMonitor
|
463
|
+
end
|
464
|
+
|
465
|
+
subgraph Exponential Backoff
|
466
|
+
G
|
467
|
+
H
|
468
|
+
I
|
469
|
+
J
|
470
|
+
end
|
471
|
+
|
472
|
+
subgraph Task Status Management
|
473
|
+
E
|
474
|
+
TaskCheck
|
475
|
+
FailTask
|
476
|
+
CompleteCheck
|
477
|
+
CompleteTask
|
478
|
+
end
|
479
|
+
|
480
|
+
%% Initialize with dark borders and light fills
|
481
|
+
style Start fill:#ffffff,stroke:#444444,stroke-width:2px
|
482
|
+
style FindRoots fill:#f6f6f6,stroke:#444444
|
483
|
+
style QueueRoots fill:#f6f6f6,stroke:#444444
|
484
|
+
style ParallelExec fill:#f6f6f6,stroke:#444444,stroke-width:2px
|
485
|
+
|
486
|
+
%% Root steps (slightly lighter gray)
|
487
|
+
style RootA fill:#e8e8e8,stroke:#666666
|
488
|
+
style RootB fill:#e8e8e8,stroke:#666666
|
489
|
+
|
490
|
+
%% Standard flow components (white with medium gray borders)
|
491
|
+
style A fill:#ffffff,stroke:#666666
|
492
|
+
style B fill:#ffffff,stroke:#666666
|
493
|
+
style C fill:#ffffff,stroke:#666666
|
494
|
+
style D fill:#ffffff,stroke:#666666
|
495
|
+
style F fill:#ffffff,stroke:#666666
|
496
|
+
style CompleteCheck fill:#ffffff,stroke:#666666
|
497
|
+
style Continue fill:#ffffff,stroke:#666666
|
498
|
+
style TaskCheck fill:#ffffff,stroke:#666666
|
499
|
+
|
500
|
+
%% Exponential backoff (light gray)
|
501
|
+
style G fill:#f0f0f0,stroke:#666666
|
502
|
+
style H fill:#f0f0f0,stroke:#666666
|
503
|
+
style I fill:#f0f0f0,stroke:#666666
|
504
|
+
style J fill:#f0f0f0,stroke:#666666
|
505
|
+
|
506
|
+
%% DAG specific components (slightly darker gray)
|
507
|
+
style K fill:#e0e0e0,stroke:#444444
|
508
|
+
style DepCheck fill:#e0e0e0,stroke:#444444
|
509
|
+
style DependenciesMet fill:#e0e0e0,stroke:#444444,stroke-width:2px
|
510
|
+
style QueueStep fill:#e0e0e0,stroke:#444444
|
511
|
+
style Wait fill:#e0e0e0,stroke:#444444,stroke-dasharray: 5 5
|
512
|
+
style DepMonitor fill:#e0e0e0,stroke:#444444,stroke-dasharray: 5 5
|
513
|
+
|
514
|
+
%% Success and failure states (dark and medium grays)
|
515
|
+
style CompleteTask fill:#d0d0d0,stroke:#222222,stroke-width:2px
|
516
|
+
style FailTask fill:#b0b0b0,stroke:#222222,stroke-width:2px
|
517
|
+
style E fill:#b0b0b0,stroke:#222222
|
518
|
+
```
|
519
|
+
|
520
|
+
The system implements advanced workflow traversal with parallel execution, sophisticated retry logic, and production-ready error handling:
|
521
|
+
|
522
|
+
### 📖 Detailed Orchestration Documentation
|
523
|
+
|
524
|
+
For comprehensive understanding of Tasker's sophisticated orchestration patterns, including the dual finalization strategy and execution control flow, see:
|
525
|
+
|
526
|
+
**[Task Execution Control Flow](TASK_EXECUTION_CONTROL_FLOW.md)** - Deep dive into workflow orchestration patterns, synchronous vs asynchronous finalization, and the coordination between WorkflowCoordinator and TaskFinalizer components.
|
527
|
+
|
528
|
+
- **DAG Traversal & Parallel Execution**
|
529
|
+
- Initial identification and queueing of root steps (no dependencies)
|
530
|
+
- Parallel execution of independent steps at each level
|
531
|
+
- Dynamic discovery of next executable steps as dependencies are satisfied
|
532
|
+
- Continuous monitoring of dependency status to activate pending steps
|
533
|
+
- Automatic task completion detection when all steps are finished
|
534
|
+
|
535
|
+
- **Industry Standard Exponential Backoff**
|
536
|
+
- Base delay that doubles with each attempt: `base_delay * (2^attempt)`
|
537
|
+
- Random jitter to prevent thundering herd problems
|
538
|
+
- Configurable maximum delay cap (30 seconds)
|
539
|
+
- Respects server-provided Retry-After headers when available
|
540
|
+
|
541
|
+
- **Production-Ready Error Handling & Persistence**
|
542
|
+
- **Complete Step Error Persistence** - All step failures saved with full error context, backtrace, and attempt tracking
|
543
|
+
- **Atomic Transactions** - Save-first, transition-second pattern ensures data integrity and idempotency
|
544
|
+
- **Memory-Safe Processing** - Database connection pooling and explicit cleanup prevents connection leaks
|
545
|
+
- **Comprehensive Event Publishing** - Both success and error paths publish standardized events for observability
|
546
|
+
- **Zero Data Loss** - All step executions (success/error) properly persisted with complete context
|
547
|
+
|
548
|
+
- **Task Status Management**
|
549
|
+
- Real-time monitoring of all step statuses with unified event system
|
550
|
+
- Early failure detection and propagation with comprehensive error data
|
551
|
+
- Graceful handling of unrecoverable errors with full audit trail
|
552
|
+
- OpenTelemetry integration for complete observability
|