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,756 @@
|
|
1
|
+
# Tasker Troubleshooting Guide
|
2
|
+
|
3
|
+
## Overview
|
4
|
+
|
5
|
+
This guide covers common issues and solutions you may encounter when developing with Tasker and deploying Tasker-based workflows to production. It's organized into development-time issues and deployment-time issues for easy navigation.
|
6
|
+
|
7
|
+
## Development Troubleshooting
|
8
|
+
|
9
|
+
### Task Handler Issues
|
10
|
+
|
11
|
+
#### "Task handler not found" or "NameError: uninitialized constant"
|
12
|
+
|
13
|
+
**Symptoms:**
|
14
|
+
```ruby
|
15
|
+
# Error when trying to create or execute tasks
|
16
|
+
NameError: uninitialized constant OrderProcess
|
17
|
+
# or
|
18
|
+
Tasker::TaskHandler::NotFoundError: Task handler 'order_process' not found
|
19
|
+
```
|
20
|
+
|
21
|
+
**Common Causes & Solutions:**
|
22
|
+
|
23
|
+
1. **File naming mismatch**
|
24
|
+
```bash
|
25
|
+
# Ensure file name matches class name
|
26
|
+
app/tasks/order_process.rb # File name should be snake_case
|
27
|
+
class OrderProcess # Class name should be CamelCase
|
28
|
+
```
|
29
|
+
|
30
|
+
2. **YAML configuration mismatch**
|
31
|
+
```yaml
|
32
|
+
# config/tasker/tasks/order_process.yaml
|
33
|
+
name: order_process # Must match file name
|
34
|
+
task_handler_class: OrderProcess # Must match class name exactly
|
35
|
+
```
|
36
|
+
|
37
|
+
3. **Module namespace issues**
|
38
|
+
```ruby
|
39
|
+
# If using module namespaces, ensure they're consistent
|
40
|
+
# YAML: module_namespace: ECommerce
|
41
|
+
# File: app/tasks/e_commerce/order_process.rb
|
42
|
+
module ECommerce
|
43
|
+
class OrderProcess < Tasker::TaskHandler::Base
|
44
|
+
```
|
45
|
+
|
46
|
+
4. **Rails autoloading not picking up changes**
|
47
|
+
```bash
|
48
|
+
# Restart Rails server to reload task handlers
|
49
|
+
bundle exec rails server
|
50
|
+
|
51
|
+
# Or in development, force reload
|
52
|
+
Rails.application.reloader.reload!
|
53
|
+
```
|
54
|
+
|
55
|
+
#### "Step handler not found" or Step execution failures
|
56
|
+
|
57
|
+
**Symptoms:**
|
58
|
+
```ruby
|
59
|
+
# Step fails to execute or shows class loading errors
|
60
|
+
LoadError: unable to autoload constant WelcomeUser::StepHandler::ValidateUserHandler
|
61
|
+
```
|
62
|
+
|
63
|
+
**Solutions:**
|
64
|
+
|
65
|
+
1. **Check file structure and naming**
|
66
|
+
```bash
|
67
|
+
# Correct structure
|
68
|
+
app/tasks/welcome_user/step_handler/validate_user_handler.rb
|
69
|
+
|
70
|
+
# Class should be properly namespaced
|
71
|
+
module WelcomeUser
|
72
|
+
module StepHandler
|
73
|
+
class ValidateUserHandler < Tasker::StepHandler::Base
|
74
|
+
```
|
75
|
+
|
76
|
+
2. **Verify YAML step configuration**
|
77
|
+
```yaml
|
78
|
+
step_templates:
|
79
|
+
- name: validate_user
|
80
|
+
handler_class: WelcomeUser::StepHandler::ValidateUserHandler # Full namespace
|
81
|
+
```
|
82
|
+
|
83
|
+
3. **Check inheritance**
|
84
|
+
```ruby
|
85
|
+
# Step handlers must inherit from appropriate base class
|
86
|
+
class MyStepHandler < Tasker::StepHandler::Base # For general steps
|
87
|
+
class MyApiHandler < Tasker::StepHandler::Api # For API steps
|
88
|
+
```
|
89
|
+
|
90
|
+
### Step Dependency Issues
|
91
|
+
|
92
|
+
#### Steps not executing in expected order
|
93
|
+
|
94
|
+
**Symptoms:**
|
95
|
+
- Steps run simultaneously when they should be sequential
|
96
|
+
- Steps wait indefinitely for dependencies
|
97
|
+
- Circular dependency errors
|
98
|
+
|
99
|
+
**Diagnosis & Solutions:**
|
100
|
+
|
101
|
+
1. **Check dependency configuration**
|
102
|
+
```yaml
|
103
|
+
# Correct single dependency
|
104
|
+
- name: step_two
|
105
|
+
depends_on_step: step_one
|
106
|
+
|
107
|
+
# Correct multiple dependencies
|
108
|
+
- name: step_three
|
109
|
+
depends_on_steps:
|
110
|
+
- step_one
|
111
|
+
- step_two
|
112
|
+
```
|
113
|
+
|
114
|
+
2. **Verify step names match exactly**
|
115
|
+
```yaml
|
116
|
+
# Names must match exactly (case-sensitive)
|
117
|
+
- name: validate_order # Step name
|
118
|
+
- name: process_payment
|
119
|
+
depends_on_step: validate_order # Must match exactly
|
120
|
+
```
|
121
|
+
|
122
|
+
3. **Check for circular dependencies**
|
123
|
+
```ruby
|
124
|
+
# In Rails console, use the new dependency_graph method
|
125
|
+
handler = Tasker::HandlerFactory.instance.get('your_task')
|
126
|
+
graph = handler.dependency_graph
|
127
|
+
|
128
|
+
# Check for cycles
|
129
|
+
if graph[:cycles].any?
|
130
|
+
puts "Circular dependencies detected:"
|
131
|
+
graph[:cycles].each do |cycle|
|
132
|
+
puts " Cycle: #{cycle.join(' -> ')}"
|
133
|
+
end
|
134
|
+
else
|
135
|
+
puts "No circular dependencies found"
|
136
|
+
end
|
137
|
+
|
138
|
+
# Show topology and dependency structure
|
139
|
+
puts "\nExecution order: #{graph[:topology].join(' -> ')}"
|
140
|
+
puts "Root steps (no dependencies): #{graph[:roots].join(', ')}"
|
141
|
+
puts "Leaf steps (no dependents): #{graph[:leaves].join(', ')}"
|
142
|
+
puts "Max parallel branches: #{graph[:summary][:parallel_branches]}"
|
143
|
+
```
|
144
|
+
|
145
|
+
4. **Debug dependency resolution**
|
146
|
+
```ruby
|
147
|
+
# In Rails console, use runtime dependency analysis
|
148
|
+
task = Tasker::Task.find(your_task_id)
|
149
|
+
graph = task.dependency_graph
|
150
|
+
|
151
|
+
# Overall task status
|
152
|
+
puts "Task Status: #{graph[:summary][:task_state]}"
|
153
|
+
puts "Completion: #{graph[:summary][:completion_percentage]}%"
|
154
|
+
puts "Ready steps: #{graph[:ready_steps].join(', ')}"
|
155
|
+
puts "Blocked steps: #{graph[:blocked_steps].join(', ')}"
|
156
|
+
|
157
|
+
# Check for error chains
|
158
|
+
if graph[:error_chains].any?
|
159
|
+
puts "\nError Impact Analysis:"
|
160
|
+
graph[:error_chains].each do |chain|
|
161
|
+
puts " Error step '#{chain[:root_error]}' blocking #{chain[:impact_count]} steps:"
|
162
|
+
puts " Blocked: #{chain[:blocked_steps].join(', ')}"
|
163
|
+
end
|
164
|
+
end
|
165
|
+
|
166
|
+
# Detailed step analysis
|
167
|
+
puts "\nDetailed Step Status:"
|
168
|
+
graph[:nodes].each do |node|
|
169
|
+
puts "#{node[:name]}: #{node[:state]} (#{node[:attempts]}/#{node[:retry_limit]} attempts)"
|
170
|
+
puts " Dependencies: #{node[:dependencies].join(', ')}" if node[:dependencies].any?
|
171
|
+
puts " Ready: #{node[:ready_for_execution]}"
|
172
|
+
end
|
173
|
+
```
|
174
|
+
|
175
|
+
#### Diamond pattern dependency issues
|
176
|
+
|
177
|
+
**Problem:** Steps with multiple dependency paths not executing correctly
|
178
|
+
|
179
|
+
**Solution:**
|
180
|
+
```yaml
|
181
|
+
# Correct diamond pattern
|
182
|
+
- name: start_step # No dependencies
|
183
|
+
- name: branch_a
|
184
|
+
depends_on_step: start_step
|
185
|
+
- name: branch_b
|
186
|
+
depends_on_step: start_step
|
187
|
+
- name: merge_step
|
188
|
+
depends_on_steps: # Waits for BOTH branches
|
189
|
+
- branch_a
|
190
|
+
- branch_b
|
191
|
+
```
|
192
|
+
|
193
|
+
### Step Implementation Issues
|
194
|
+
|
195
|
+
#### Steps marked as failed when they should succeed
|
196
|
+
|
197
|
+
**Symptoms:**
|
198
|
+
- Step completes successfully but shows as "error" state
|
199
|
+
- Expected return values not stored in step.results
|
200
|
+
|
201
|
+
**Common Causes & Solutions:**
|
202
|
+
|
203
|
+
1. **Exception handling masking success**
|
204
|
+
```ruby
|
205
|
+
# WRONG - Catches exception but doesn't re-raise
|
206
|
+
def process(task, sequence, step)
|
207
|
+
begin
|
208
|
+
result = perform_operation()
|
209
|
+
{ success: true, data: result }
|
210
|
+
rescue => e
|
211
|
+
# This makes the step appear successful to the framework
|
212
|
+
{ success: false, error: e.message }
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
# CORRECT - Let exceptions propagate for framework handling
|
217
|
+
def process(task, sequence, step)
|
218
|
+
result = perform_operation()
|
219
|
+
{ success: true, data: result }
|
220
|
+
# Framework automatically handles exceptions
|
221
|
+
end
|
222
|
+
|
223
|
+
# OR - Re-raise after logging custom error context
|
224
|
+
def process(task, sequence, step)
|
225
|
+
begin
|
226
|
+
result = perform_operation()
|
227
|
+
{ success: true, data: result }
|
228
|
+
rescue => e
|
229
|
+
step.results = { error_context: "Additional details" }
|
230
|
+
raise # Re-raise so framework knows step failed
|
231
|
+
end
|
232
|
+
end
|
233
|
+
```
|
234
|
+
|
235
|
+
2. **Incorrect return values**
|
236
|
+
```ruby
|
237
|
+
# WRONG - Not returning anything
|
238
|
+
def process(task, sequence, step)
|
239
|
+
step.results = { data: "some value" }
|
240
|
+
# No return value - framework gets nil
|
241
|
+
end
|
242
|
+
|
243
|
+
# CORRECT - Return the results
|
244
|
+
def process(task, sequence, step)
|
245
|
+
{ data: "some value" }
|
246
|
+
end
|
247
|
+
```
|
248
|
+
|
249
|
+
#### Data not passed between steps correctly
|
250
|
+
|
251
|
+
**Symptoms:**
|
252
|
+
- Dependent steps can't access previous step results
|
253
|
+
- nil or empty results from previous steps
|
254
|
+
|
255
|
+
**Solutions:**
|
256
|
+
|
257
|
+
1. **Check step name references**
|
258
|
+
```ruby
|
259
|
+
# Make sure step names match exactly
|
260
|
+
previous_step = sequence.find_step_by_name('validate_user') # Exact name
|
261
|
+
user_data = previous_step.results['user_data']
|
262
|
+
```
|
263
|
+
|
264
|
+
2. **Verify previous step completed successfully**
|
265
|
+
```ruby
|
266
|
+
def process(task, sequence, step)
|
267
|
+
previous_step = sequence.find_step_by_name('previous_step')
|
268
|
+
|
269
|
+
unless previous_step.current_state == 'complete'
|
270
|
+
raise "Previous step not completed: #{previous_step.current_state}"
|
271
|
+
end
|
272
|
+
|
273
|
+
data = previous_step.results
|
274
|
+
end
|
275
|
+
```
|
276
|
+
|
277
|
+
3. **Handle missing or malformed results**
|
278
|
+
```ruby
|
279
|
+
def process(task, sequence, step)
|
280
|
+
previous_step = sequence.find_step_by_name('fetch_data')
|
281
|
+
|
282
|
+
unless previous_step&.results&.key?('required_field')
|
283
|
+
raise "Previous step missing required data: #{previous_step&.results}"
|
284
|
+
end
|
285
|
+
|
286
|
+
required_data = previous_step.results['required_field']
|
287
|
+
end
|
288
|
+
```
|
289
|
+
|
290
|
+
### Retry Logic Issues
|
291
|
+
|
292
|
+
#### Steps not retrying when they should
|
293
|
+
|
294
|
+
**Symptoms:**
|
295
|
+
- Failed steps go directly to error state instead of retrying
|
296
|
+
- Retry count not incrementing
|
297
|
+
|
298
|
+
**Solutions:**
|
299
|
+
|
300
|
+
1. **Check retry configuration**
|
301
|
+
```yaml
|
302
|
+
# In YAML configuration
|
303
|
+
- name: unreliable_step
|
304
|
+
handler_class: MyHandler
|
305
|
+
default_retryable: true # Must be true for retries
|
306
|
+
default_retry_limit: 3 # Set appropriate limit
|
307
|
+
```
|
308
|
+
|
309
|
+
2. **Verify exception types**
|
310
|
+
```ruby
|
311
|
+
# Some exceptions may not be retryable by default
|
312
|
+
def process(task, sequence, step)
|
313
|
+
# For custom retry logic, use specific exceptions
|
314
|
+
raise Tasker::RetryableError, "Temporary failure" # Will retry
|
315
|
+
# vs
|
316
|
+
raise ArgumentError, "Invalid input" # Won't retry
|
317
|
+
end
|
318
|
+
```
|
319
|
+
|
320
|
+
3. **Check retry state in database**
|
321
|
+
```ruby
|
322
|
+
# In Rails console
|
323
|
+
step = Tasker::WorkflowStep.find(step_id)
|
324
|
+
puts "Attempts: #{step.attempts}"
|
325
|
+
puts "Retry limit: #{step.retry_limit}"
|
326
|
+
puts "Retryable: #{step.retryable}"
|
327
|
+
puts "State: #{step.current_state}"
|
328
|
+
```
|
329
|
+
|
330
|
+
#### Infinite retry loops
|
331
|
+
|
332
|
+
**Symptoms:**
|
333
|
+
- Steps retry indefinitely
|
334
|
+
- High CPU usage from constant retrying
|
335
|
+
|
336
|
+
**Solutions:**
|
337
|
+
|
338
|
+
1. **Check retry limits**
|
339
|
+
```yaml
|
340
|
+
# Always set reasonable retry limits
|
341
|
+
default_retry_limit: 3 # Don't use overly high values
|
342
|
+
```
|
343
|
+
|
344
|
+
2. **Implement exponential backoff awareness**
|
345
|
+
```ruby
|
346
|
+
def process(task, sequence, step)
|
347
|
+
# Check attempt count to adjust behavior
|
348
|
+
if step.attempts > 2
|
349
|
+
# Use more conservative approach on later attempts
|
350
|
+
timeout = 30 * (step.attempts ** 2) # Exponential timeout
|
351
|
+
end
|
352
|
+
end
|
353
|
+
```
|
354
|
+
|
355
|
+
### JSON Schema Validation Issues
|
356
|
+
|
357
|
+
#### Task requests failing validation
|
358
|
+
|
359
|
+
**Symptoms:**
|
360
|
+
```ruby
|
361
|
+
Tasker::Types::ValidationError: Invalid task context
|
362
|
+
```
|
363
|
+
|
364
|
+
**Solutions:**
|
365
|
+
|
366
|
+
1. **Check schema definition in YAML**
|
367
|
+
```yaml
|
368
|
+
schema:
|
369
|
+
type: object
|
370
|
+
required:
|
371
|
+
- user_id
|
372
|
+
- order_id # Make sure required fields are provided
|
373
|
+
properties:
|
374
|
+
user_id:
|
375
|
+
type: integer
|
376
|
+
minimum: 1 # Add appropriate constraints
|
377
|
+
order_id:
|
378
|
+
type: integer
|
379
|
+
```
|
380
|
+
|
381
|
+
2. **Validate context before task creation**
|
382
|
+
```ruby
|
383
|
+
# Validate your context matches the schema
|
384
|
+
context = { user_id: 123, order_id: 456 }
|
385
|
+
|
386
|
+
task_request = Tasker::Types::TaskRequest.new(
|
387
|
+
name: 'order_process',
|
388
|
+
context: context
|
389
|
+
)
|
390
|
+
```
|
391
|
+
|
392
|
+
## Deployment Troubleshooting
|
393
|
+
|
394
|
+
### Observability & Monitoring
|
395
|
+
|
396
|
+
#### Tasks stuck in pending state
|
397
|
+
|
398
|
+
**Symptoms:**
|
399
|
+
- Tasks created but never progress beyond 'pending'
|
400
|
+
- No step execution occurring
|
401
|
+
|
402
|
+
**Diagnosis Steps:**
|
403
|
+
|
404
|
+
1. **Check ActiveJob backend**
|
405
|
+
```bash
|
406
|
+
# Ensure your job processor is running
|
407
|
+
bundle exec sidekiq # For Sidekiq
|
408
|
+
# or check other ActiveJob backends
|
409
|
+
```
|
410
|
+
|
411
|
+
2. **Verify database connectivity**
|
412
|
+
```ruby
|
413
|
+
# In Rails console
|
414
|
+
Tasker::Task.connection.execute("SELECT 1") # Should not raise error
|
415
|
+
```
|
416
|
+
|
417
|
+
3. **Check SQL function availability**
|
418
|
+
```ruby
|
419
|
+
# Verify SQL functions are installed
|
420
|
+
result = Tasker::Task.connection.execute(
|
421
|
+
"SELECT get_task_execution_context_v01($1)", [task_id]
|
422
|
+
)
|
423
|
+
```
|
424
|
+
|
425
|
+
4. **Monitor workflow coordination**
|
426
|
+
```ruby
|
427
|
+
# Check if coordinator is processing tasks
|
428
|
+
Tasker::Orchestration::Coordinator.new.coordinate_workflow_execution
|
429
|
+
```
|
430
|
+
|
431
|
+
#### No step execution events
|
432
|
+
|
433
|
+
**Symptoms:**
|
434
|
+
- Tasks and steps exist but no lifecycle events
|
435
|
+
- Missing telemetry data
|
436
|
+
|
437
|
+
**Solutions:**
|
438
|
+
|
439
|
+
1. **Verify event system configuration**
|
440
|
+
```ruby
|
441
|
+
# Check if events are being published
|
442
|
+
Tasker::Events.catalog.keys # Should show available events
|
443
|
+
```
|
444
|
+
|
445
|
+
2. **Check event subscribers**
|
446
|
+
```ruby
|
447
|
+
# Verify subscribers are registered
|
448
|
+
Tasker::Events::Publisher.instance.subscribers
|
449
|
+
```
|
450
|
+
|
451
|
+
3. **Enable telemetry**
|
452
|
+
```ruby
|
453
|
+
# config/initializers/tasker.rb
|
454
|
+
Tasker.configuration do |config|
|
455
|
+
config.telemetry do |tel|
|
456
|
+
tel.enabled = true
|
457
|
+
tel.service_name = 'your-app'
|
458
|
+
end
|
459
|
+
end
|
460
|
+
```
|
461
|
+
|
462
|
+
### Performance Issues
|
463
|
+
|
464
|
+
#### Slow step readiness calculations
|
465
|
+
|
466
|
+
**Symptoms:**
|
467
|
+
- Long delays between step completions and dependent step execution
|
468
|
+
- High database CPU usage
|
469
|
+
|
470
|
+
**Solutions:**
|
471
|
+
|
472
|
+
1. **Check SQL function performance**
|
473
|
+
```sql
|
474
|
+
-- Monitor SQL function execution time
|
475
|
+
EXPLAIN ANALYZE SELECT get_task_execution_context_v01(123);
|
476
|
+
```
|
477
|
+
|
478
|
+
2. **Verify database indexes**
|
479
|
+
```sql
|
480
|
+
-- Ensure proper indexes exist
|
481
|
+
\d tasker_workflow_steps; -- Check indexes on workflow_steps table
|
482
|
+
```
|
483
|
+
|
484
|
+
3. **Monitor function call frequency**
|
485
|
+
```ruby
|
486
|
+
# Check if functions are being called too frequently
|
487
|
+
# Consider caching execution context for very active tasks
|
488
|
+
```
|
489
|
+
|
490
|
+
#### Memory leaks in long-running tasks
|
491
|
+
|
492
|
+
**Symptoms:**
|
493
|
+
- Memory usage grows over time
|
494
|
+
- Application becomes unresponsive
|
495
|
+
|
496
|
+
**Solutions:**
|
497
|
+
|
498
|
+
1. **Check step result sizes**
|
499
|
+
```ruby
|
500
|
+
# Monitor step result sizes
|
501
|
+
task.workflow_steps.each do |step|
|
502
|
+
puts "#{step.name}: #{step.results.to_s.bytesize} bytes"
|
503
|
+
end
|
504
|
+
```
|
505
|
+
|
506
|
+
2. **Implement result cleanup**
|
507
|
+
```ruby
|
508
|
+
def process(task, sequence, step)
|
509
|
+
result = large_operation()
|
510
|
+
|
511
|
+
# Return only essential data
|
512
|
+
{
|
513
|
+
status: 'completed',
|
514
|
+
record_count: result.size,
|
515
|
+
# Don't return the entire large dataset
|
516
|
+
}
|
517
|
+
end
|
518
|
+
```
|
519
|
+
|
520
|
+
### Error Analysis
|
521
|
+
|
522
|
+
#### Analyzing step failure patterns
|
523
|
+
|
524
|
+
**Diagnostic Queries:**
|
525
|
+
|
526
|
+
```ruby
|
527
|
+
# Find frequently failing steps
|
528
|
+
failing_steps = Tasker::WorkflowStep
|
529
|
+
.where(current_state: 'error')
|
530
|
+
.group(:name)
|
531
|
+
.count
|
532
|
+
.sort_by { |_, count| -count }
|
533
|
+
|
534
|
+
# Analyze retry patterns
|
535
|
+
retry_analysis = Tasker::WorkflowStep
|
536
|
+
.where('attempts > 1')
|
537
|
+
.group(:name)
|
538
|
+
.average(:attempts)
|
539
|
+
|
540
|
+
# Check error types
|
541
|
+
error_patterns = Tasker::WorkflowStep
|
542
|
+
.where(current_state: 'error')
|
543
|
+
.where.not(results: {})
|
544
|
+
.map { |step| step.results['error'] }
|
545
|
+
.compact
|
546
|
+
.tally
|
547
|
+
```
|
548
|
+
|
549
|
+
#### Debugging specific task execution
|
550
|
+
|
551
|
+
```ruby
|
552
|
+
# Deep dive into specific task
|
553
|
+
task = Tasker::Task.find(task_id)
|
554
|
+
|
555
|
+
puts "Task: #{task.name} (#{task.state})"
|
556
|
+
puts "Created: #{task.created_at}"
|
557
|
+
puts "Context: #{task.context}"
|
558
|
+
|
559
|
+
task.workflow_steps.order(:created_at).each do |step|
|
560
|
+
puts "\nStep: #{step.name}"
|
561
|
+
puts " State: #{step.current_state}"
|
562
|
+
puts " Attempts: #{step.attempts}/#{step.retry_limit}"
|
563
|
+
puts " Duration: #{step.execution_duration}s" if step.execution_duration
|
564
|
+
puts " Results: #{step.results}"
|
565
|
+
|
566
|
+
if step.current_state == 'error'
|
567
|
+
puts " Error: #{step.results['error']}"
|
568
|
+
puts " Backtrace: #{step.results['backtrace']&.first(3)&.join("\n ")}"
|
569
|
+
end
|
570
|
+
end
|
571
|
+
```
|
572
|
+
|
573
|
+
### Logging & Observability Setup
|
574
|
+
|
575
|
+
#### Structured logging configuration
|
576
|
+
|
577
|
+
```ruby
|
578
|
+
# config/initializers/tasker.rb
|
579
|
+
Tasker.configuration do |config|
|
580
|
+
config.telemetry do |tel|
|
581
|
+
tel.enabled = true
|
582
|
+
tel.service_name = 'your-application'
|
583
|
+
tel.service_version = ENV['APP_VERSION'] || '1.0.0'
|
584
|
+
tel.environment = Rails.env
|
585
|
+
end
|
586
|
+
end
|
587
|
+
```
|
588
|
+
|
589
|
+
#### Custom event subscribers for monitoring
|
590
|
+
|
591
|
+
```ruby
|
592
|
+
# app/subscribers/monitoring_subscriber.rb
|
593
|
+
class MonitoringSubscriber < Tasker::Events::Subscribers::BaseSubscriber
|
594
|
+
subscribe_to 'task.failed', 'step.failed', 'step.max_retries_reached'
|
595
|
+
|
596
|
+
def handle_task_failed(event)
|
597
|
+
task_id = safe_get(event, :task_id)
|
598
|
+
error = safe_get(event, :error_message)
|
599
|
+
|
600
|
+
# Send to your monitoring system
|
601
|
+
Rails.logger.error("Task failed: #{task_id} - #{error}")
|
602
|
+
AlertingService.notify_task_failure(task_id, error)
|
603
|
+
end
|
604
|
+
|
605
|
+
def handle_step_max_retries_reached(event)
|
606
|
+
step_id = safe_get(event, :step_id)
|
607
|
+
step_name = safe_get(event, :step_name)
|
608
|
+
|
609
|
+
# Alert on retry exhaustion
|
610
|
+
AlertingService.notify_step_retry_exhaustion(step_id, step_name)
|
611
|
+
end
|
612
|
+
end
|
613
|
+
```
|
614
|
+
|
615
|
+
#### Production health checks
|
616
|
+
|
617
|
+
```ruby
|
618
|
+
# Check system health
|
619
|
+
def tasker_health_check
|
620
|
+
checks = {
|
621
|
+
database: database_connectivity_check,
|
622
|
+
sql_functions: sql_functions_check,
|
623
|
+
pending_tasks: pending_tasks_check,
|
624
|
+
failed_tasks: failed_tasks_check
|
625
|
+
}
|
626
|
+
|
627
|
+
overall_health = checks.values.all? { |check| check[:status] == 'ok' }
|
628
|
+
|
629
|
+
{
|
630
|
+
status: overall_health ? 'healthy' : 'unhealthy',
|
631
|
+
timestamp: Time.current.iso8601,
|
632
|
+
checks: checks
|
633
|
+
}
|
634
|
+
end
|
635
|
+
|
636
|
+
private
|
637
|
+
|
638
|
+
def database_connectivity_check
|
639
|
+
Tasker::Task.connection.execute("SELECT 1")
|
640
|
+
{ status: 'ok', message: 'Database connected' }
|
641
|
+
rescue => e
|
642
|
+
{ status: 'error', message: e.message }
|
643
|
+
end
|
644
|
+
|
645
|
+
def sql_functions_check
|
646
|
+
Tasker::Task.connection.execute("SELECT get_task_execution_context_v01(1)")
|
647
|
+
{ status: 'ok', message: 'SQL functions available' }
|
648
|
+
rescue => e
|
649
|
+
{ status: 'error', message: "SQL functions unavailable: #{e.message}" }
|
650
|
+
end
|
651
|
+
|
652
|
+
def pending_tasks_check
|
653
|
+
count = Tasker::Task.where(state: 'pending').where('created_at < ?', 10.minutes.ago).count
|
654
|
+
|
655
|
+
if count > 100
|
656
|
+
{ status: 'warning', message: "#{count} old pending tasks" }
|
657
|
+
else
|
658
|
+
{ status: 'ok', message: "#{count} pending tasks" }
|
659
|
+
end
|
660
|
+
end
|
661
|
+
```
|
662
|
+
|
663
|
+
## Diagnostic Tools & Commands
|
664
|
+
|
665
|
+
### Useful Rails Console Commands
|
666
|
+
|
667
|
+
```ruby
|
668
|
+
# Task status overview
|
669
|
+
def task_summary
|
670
|
+
states = Tasker::Task.group(:state).count
|
671
|
+
puts "Task States:"
|
672
|
+
states.each { |state, count| puts " #{state}: #{count}" }
|
673
|
+
end
|
674
|
+
|
675
|
+
# Step failure analysis
|
676
|
+
def step_failure_summary
|
677
|
+
failures = Tasker::WorkflowStep
|
678
|
+
.where(current_state: 'error')
|
679
|
+
.group(:name)
|
680
|
+
.count
|
681
|
+
|
682
|
+
puts "Failed Steps:"
|
683
|
+
failures.each { |name, count| puts " #{name}: #{count}" }
|
684
|
+
end
|
685
|
+
|
686
|
+
# Recent task activity
|
687
|
+
def recent_activity(hours = 24)
|
688
|
+
since = hours.hours.ago
|
689
|
+
|
690
|
+
puts "Activity since #{since}:"
|
691
|
+
puts " Tasks created: #{Tasker::Task.where('created_at > ?', since).count}"
|
692
|
+
puts " Tasks completed: #{Tasker::Task.where('updated_at > ? AND state = ?', since, 'complete').count}"
|
693
|
+
puts " Tasks failed: #{Tasker::Task.where('updated_at > ? AND state = ?', since, 'error').count}"
|
694
|
+
end
|
695
|
+
```
|
696
|
+
|
697
|
+
### Database Queries for Analysis
|
698
|
+
|
699
|
+
```sql
|
700
|
+
-- Find long-running tasks
|
701
|
+
SELECT id, name, state, created_at, updated_at,
|
702
|
+
EXTRACT(EPOCH FROM (NOW() - created_at))/3600 as hours_running
|
703
|
+
FROM tasker_tasks
|
704
|
+
WHERE state IN ('pending', 'processing')
|
705
|
+
AND created_at < NOW() - INTERVAL '1 hour'
|
706
|
+
ORDER BY created_at;
|
707
|
+
|
708
|
+
-- Find steps with high retry rates
|
709
|
+
SELECT name,
|
710
|
+
COUNT(*) as total_attempts,
|
711
|
+
AVG(attempts) as avg_attempts,
|
712
|
+
MAX(attempts) as max_attempts
|
713
|
+
FROM tasker_workflow_steps
|
714
|
+
WHERE attempts > 1
|
715
|
+
GROUP BY name
|
716
|
+
ORDER BY avg_attempts DESC;
|
717
|
+
|
718
|
+
-- Find tasks with many failed steps
|
719
|
+
SELECT t.id, t.name,
|
720
|
+
COUNT(ws.id) as total_steps,
|
721
|
+
COUNT(CASE WHEN ws.current_state = 'error' THEN 1 END) as failed_steps
|
722
|
+
FROM tasker_tasks t
|
723
|
+
JOIN tasker_workflow_steps ws ON ws.task_id = t.id
|
724
|
+
GROUP BY t.id, t.name
|
725
|
+
HAVING COUNT(CASE WHEN ws.current_state = 'error' THEN 1 END) > 0
|
726
|
+
ORDER BY failed_steps DESC;
|
727
|
+
```
|
728
|
+
|
729
|
+
## Getting Help
|
730
|
+
|
731
|
+
### Documentation Resources
|
732
|
+
- **[Quick Start Guide](QUICK_START.md)** - Basic workflow creation
|
733
|
+
- **[Developer Guide](DEVELOPER_GUIDE.md)** - Comprehensive implementation guide
|
734
|
+
- **[Event System](EVENT_SYSTEM.md)** - Observability and monitoring setup
|
735
|
+
- **[Authentication](AUTH.md)** - Security configuration
|
736
|
+
- **[System Overview](OVERVIEW.md)** - Architecture and advanced configuration
|
737
|
+
|
738
|
+
### Community & Support
|
739
|
+
- Check the GitHub issues for similar problems
|
740
|
+
- Review test examples in the `spec/` directory
|
741
|
+
- Examine example implementations in `spec/examples/`
|
742
|
+
|
743
|
+
### Debug Mode
|
744
|
+
Enable verbose logging for deeper insight:
|
745
|
+
|
746
|
+
```ruby
|
747
|
+
# config/environments/development.rb
|
748
|
+
Rails.application.configure do
|
749
|
+
config.log_level = :debug
|
750
|
+
|
751
|
+
# Enable SQL logging
|
752
|
+
ActiveRecord::Base.logger = Logger.new(STDOUT) if defined?(Rails::Console)
|
753
|
+
end
|
754
|
+
```
|
755
|
+
|
756
|
+
Remember: Tasker is designed to be resilient and self-healing. Many transient issues will resolve themselves through the retry mechanism. Focus on patterns of persistent failures rather than isolated incidents.
|