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,168 @@
|
|
1
|
+
# typed: false
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
# == Schema Information
|
5
|
+
#
|
6
|
+
# Table name: tasks
|
7
|
+
#
|
8
|
+
# bypass_steps :json
|
9
|
+
# complete :boolean default(FALSE), not null
|
10
|
+
# context :jsonb
|
11
|
+
# identity_hash :string(128) not null
|
12
|
+
# initiator :string(128)
|
13
|
+
# reason :string(128)
|
14
|
+
# requested_at :datetime not null
|
15
|
+
# source_system :string(128)
|
16
|
+
# status :string(64) not null
|
17
|
+
# tags :jsonb
|
18
|
+
# created_at :datetime not null
|
19
|
+
# updated_at :datetime not null
|
20
|
+
# named_task_id :integer not null
|
21
|
+
# task_id :bigint not null, primary key
|
22
|
+
#
|
23
|
+
# Indexes
|
24
|
+
#
|
25
|
+
# index_tasks_on_identity_hash (identity_hash) UNIQUE
|
26
|
+
# tasks_context_idx (context) USING gin
|
27
|
+
# tasks_context_idx1 (context) USING gin
|
28
|
+
# tasks_identity_hash_index (identity_hash)
|
29
|
+
# tasks_named_task_id_index (named_task_id)
|
30
|
+
# tasks_requested_at_index (requested_at)
|
31
|
+
# tasks_source_system_index (source_system)
|
32
|
+
# tasks_status_index (status)
|
33
|
+
# tasks_tags_idx (tags) USING gin
|
34
|
+
# tasks_tags_idx1 (tags) USING gin
|
35
|
+
#
|
36
|
+
# Foreign Keys
|
37
|
+
#
|
38
|
+
# tasks_named_task_id_foreign (named_task_id => named_tasks.named_task_id)
|
39
|
+
#
|
40
|
+
|
41
|
+
module Tasker
|
42
|
+
class TaskSerializer < ActiveModel::Serializer
|
43
|
+
attributes :task_id, :name, :namespace, :version, :full_name, :initiator, :source_system, :context, :reason,
|
44
|
+
:bypass_steps, :tags, :requested_at, :complete, :status
|
45
|
+
has_many :workflow_steps
|
46
|
+
has_many :task_annotations
|
47
|
+
|
48
|
+
# Conditional attribute for dependency analysis
|
49
|
+
attribute :dependency_analysis, if: :include_dependency_analysis?
|
50
|
+
|
51
|
+
def namespace
|
52
|
+
object.named_task&.task_namespace&.name || 'default'
|
53
|
+
end
|
54
|
+
|
55
|
+
def version
|
56
|
+
object.named_task&.version || '0.1.0'
|
57
|
+
end
|
58
|
+
|
59
|
+
def full_name
|
60
|
+
"#{namespace}.#{object.named_task&.name}@#{version}"
|
61
|
+
end
|
62
|
+
|
63
|
+
# Check if dependency analysis should be included
|
64
|
+
def include_dependency_analysis?
|
65
|
+
instance_options[:include_dependencies] == true
|
66
|
+
end
|
67
|
+
|
68
|
+
# Generate dependency analysis
|
69
|
+
def dependency_analysis
|
70
|
+
# Get comprehensive dependency analysis from the runtime analyzer
|
71
|
+
analysis = object.dependency_graph
|
72
|
+
|
73
|
+
{
|
74
|
+
dependency_graph: analysis[:dependency_graph],
|
75
|
+
critical_paths: analysis[:critical_paths],
|
76
|
+
parallelism_opportunities: analysis[:parallelism_opportunities],
|
77
|
+
error_chains: analysis[:error_chains],
|
78
|
+
bottlenecks: analysis[:bottlenecks],
|
79
|
+
analysis_timestamp: Time.current.iso8601,
|
80
|
+
task_execution_summary: build_execution_summary(analysis)
|
81
|
+
}
|
82
|
+
rescue StandardError => e
|
83
|
+
# Graceful fallback if dependency analysis fails
|
84
|
+
{
|
85
|
+
error: "Dependency analysis failed: #{e.message}",
|
86
|
+
analysis_timestamp: Time.current.iso8601
|
87
|
+
}
|
88
|
+
end
|
89
|
+
|
90
|
+
private
|
91
|
+
|
92
|
+
# Build a high-level execution summary from dependency analysis
|
93
|
+
#
|
94
|
+
# @param dependency_analysis [Hash] The full dependency analysis from RuntimeGraphAnalyzer
|
95
|
+
# @return [Hash] High-level summary of task execution state and recommendations
|
96
|
+
def build_execution_summary(dependency_analysis)
|
97
|
+
graph = dependency_analysis[:dependency_graph]
|
98
|
+
critical_paths = dependency_analysis[:critical_paths]
|
99
|
+
bottlenecks = dependency_analysis[:bottlenecks]
|
100
|
+
parallelism = dependency_analysis[:parallelism_opportunities]
|
101
|
+
error_chains = dependency_analysis[:error_chains]
|
102
|
+
|
103
|
+
{
|
104
|
+
total_steps: graph[:nodes]&.size || 0,
|
105
|
+
total_dependencies: graph[:edges]&.size || 0,
|
106
|
+
dependency_levels: graph[:dependency_levels]&.keys&.size || 0,
|
107
|
+
longest_path_length: critical_paths[:longest_path_length] || 0,
|
108
|
+
critical_bottlenecks_count: bottlenecks[:critical_bottlenecks]&.size || 0,
|
109
|
+
error_chains_count: error_chains[:error_chains]&.size || 0,
|
110
|
+
parallelism_efficiency: parallelism[:overall_efficiency] || 0,
|
111
|
+
overall_health: determine_overall_health(dependency_analysis),
|
112
|
+
recommendations: build_recommendations(dependency_analysis)
|
113
|
+
}
|
114
|
+
end
|
115
|
+
|
116
|
+
# Determine overall task health based on dependency analysis
|
117
|
+
#
|
118
|
+
# @param dependency_analysis [Hash] The full dependency analysis
|
119
|
+
# @return [String] Health status: 'healthy', 'warning', 'critical'
|
120
|
+
def determine_overall_health(dependency_analysis)
|
121
|
+
bottlenecks = dependency_analysis[:bottlenecks]
|
122
|
+
error_chains = dependency_analysis[:error_chains]
|
123
|
+
|
124
|
+
critical_bottlenecks_count = bottlenecks[:critical_bottlenecks]&.size || 0
|
125
|
+
error_count = error_chains[:error_chains]&.size || 0
|
126
|
+
|
127
|
+
if critical_bottlenecks_count.positive? || error_count.positive?
|
128
|
+
'critical'
|
129
|
+
elsif bottlenecks[:bottlenecks].is_a?(Array) && bottlenecks[:bottlenecks].any? { |b| b[:severity] == 'High' }
|
130
|
+
'warning'
|
131
|
+
else
|
132
|
+
'healthy'
|
133
|
+
end
|
134
|
+
end
|
135
|
+
|
136
|
+
# Build actionable recommendations based on dependency analysis
|
137
|
+
#
|
138
|
+
# @param dependency_analysis [Hash] The full dependency analysis
|
139
|
+
# @return [Array<String>] Array of recommendation strings
|
140
|
+
def build_recommendations(dependency_analysis)
|
141
|
+
recommendations = []
|
142
|
+
|
143
|
+
bottlenecks = dependency_analysis[:bottlenecks]
|
144
|
+
error_chains = dependency_analysis[:error_chains]
|
145
|
+
parallelism = dependency_analysis[:parallelism_opportunities]
|
146
|
+
|
147
|
+
# Bottleneck recommendations
|
148
|
+
if bottlenecks[:critical_bottlenecks].is_a?(Array) && bottlenecks[:critical_bottlenecks].any?
|
149
|
+
recommendations << 'Address critical bottlenecks to unblock task execution'
|
150
|
+
end
|
151
|
+
|
152
|
+
# Error chain recommendations
|
153
|
+
if error_chains[:error_chains].is_a?(Array) && error_chains[:error_chains].any?
|
154
|
+
recommendations << 'Resolve error chains to prevent further failures'
|
155
|
+
end
|
156
|
+
|
157
|
+
# Parallelism recommendations
|
158
|
+
if parallelism[:overall_efficiency] && parallelism[:overall_efficiency] < 0.5
|
159
|
+
recommendations << 'Consider optimizing step dependencies to improve parallelism'
|
160
|
+
end
|
161
|
+
|
162
|
+
# Default recommendation if no issues found
|
163
|
+
recommendations << 'Task execution appears healthy' if recommendations.empty?
|
164
|
+
|
165
|
+
recommendations
|
166
|
+
end
|
167
|
+
end
|
168
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
# typed: false
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
module Tasker
|
5
|
+
class WorkflowStepSerializer < ActiveModel::Serializer
|
6
|
+
attributes :task_id, :workflow_step_id, :name, :named_step_id, :status, :attempts, :skippable,
|
7
|
+
:retryable, :retry_limit, :processed, :processed_at, :in_process, :backoff_request_seconds,
|
8
|
+
:last_attempted_at, :inputs, :results,
|
9
|
+
:children_ids, :parents_ids, :siblings_ids
|
10
|
+
|
11
|
+
def children_ids
|
12
|
+
# Use scenic view for efficient parent/child lookups - eliminates N+1 queries
|
13
|
+
object.step_dag_relationship&.child_step_ids_array || []
|
14
|
+
end
|
15
|
+
|
16
|
+
def parents_ids
|
17
|
+
# Use scenic view for efficient parent/child lookups - eliminates N+1 queries
|
18
|
+
object.step_dag_relationship&.parent_step_ids_array || []
|
19
|
+
end
|
20
|
+
|
21
|
+
def siblings_ids
|
22
|
+
# Use existing WorkflowStepEdge siblings logic - finds steps with exact same parent set
|
23
|
+
# This is more accurate than just shared parents and leverages well-tested code
|
24
|
+
WorkflowStepEdge.siblings_of(object).pluck(:to_step_id)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,409 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tasker
|
4
|
+
# Service class for analytics calculations and data aggregation
|
5
|
+
#
|
6
|
+
# This service encapsulates the complex analytics logic that was previously
|
7
|
+
# in the analytics controller, providing a clean separation of concerns.
|
8
|
+
# It handles performance metrics, bottleneck analysis, and data aggregation
|
9
|
+
# using both SQL functions and ActiveRecord scopes.
|
10
|
+
class AnalyticsService
|
11
|
+
# Performance analytics data structure
|
12
|
+
class PerformanceAnalytics
|
13
|
+
attr_reader :system_overview, :performance_trends, :telemetry_insights, :generated_at
|
14
|
+
|
15
|
+
def initialize(system_overview:, performance_trends:, telemetry_insights:)
|
16
|
+
@system_overview = system_overview
|
17
|
+
@performance_trends = performance_trends
|
18
|
+
@telemetry_insights = telemetry_insights
|
19
|
+
@generated_at = Time.current
|
20
|
+
end
|
21
|
+
|
22
|
+
def to_h
|
23
|
+
{
|
24
|
+
system_overview: system_overview,
|
25
|
+
performance_trends: performance_trends,
|
26
|
+
telemetry_insights: telemetry_insights,
|
27
|
+
generated_at: generated_at
|
28
|
+
}
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
# Bottleneck analytics data structure
|
33
|
+
class BottleneckAnalytics
|
34
|
+
attr_reader :scope_summary, :bottleneck_analysis, :performance_distribution,
|
35
|
+
:recommendations, :scope, :analysis_period_hours, :generated_at
|
36
|
+
|
37
|
+
def initialize(scope_summary:, bottleneck_analysis:, performance_distribution:,
|
38
|
+
recommendations:, scope:, analysis_period_hours:)
|
39
|
+
@scope_summary = scope_summary
|
40
|
+
@bottleneck_analysis = bottleneck_analysis
|
41
|
+
@performance_distribution = performance_distribution
|
42
|
+
@recommendations = recommendations
|
43
|
+
@scope = scope
|
44
|
+
@analysis_period_hours = analysis_period_hours
|
45
|
+
@generated_at = Time.current
|
46
|
+
end
|
47
|
+
|
48
|
+
def to_h
|
49
|
+
{
|
50
|
+
scope_summary: scope_summary,
|
51
|
+
bottleneck_analysis: bottleneck_analysis,
|
52
|
+
performance_distribution: performance_distribution,
|
53
|
+
recommendations: recommendations,
|
54
|
+
scope: scope,
|
55
|
+
analysis_period_hours: analysis_period_hours,
|
56
|
+
generated_at: generated_at
|
57
|
+
}
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Calculate comprehensive performance analytics using SQL functions
|
62
|
+
#
|
63
|
+
# @return [PerformanceAnalytics] Performance analytics data
|
64
|
+
def self.calculate_performance_analytics
|
65
|
+
analysis_periods = {
|
66
|
+
last_hour: 1.hour.ago,
|
67
|
+
last_4_hours: 4.hours.ago,
|
68
|
+
last_24_hours: 24.hours.ago
|
69
|
+
}
|
70
|
+
|
71
|
+
# Use the analytics metrics SQL function for efficient data retrieval
|
72
|
+
base_metrics = Tasker::Functions::FunctionBasedAnalyticsMetrics.call
|
73
|
+
|
74
|
+
system_overview = {
|
75
|
+
active_tasks: base_metrics.active_tasks_count,
|
76
|
+
total_namespaces: base_metrics.total_namespaces_count,
|
77
|
+
unique_task_types: base_metrics.unique_task_types_count,
|
78
|
+
system_health_score: base_metrics.system_health_score
|
79
|
+
}
|
80
|
+
|
81
|
+
performance_trends = {}
|
82
|
+
# Calculate trends for each time period using SQL functions
|
83
|
+
analysis_periods.each do |period_name, since_time|
|
84
|
+
period_metrics = Tasker::Functions::FunctionBasedAnalyticsMetrics.call(since_time)
|
85
|
+
performance_trends[period_name] = {
|
86
|
+
task_throughput: period_metrics.task_throughput,
|
87
|
+
completion_rate: period_metrics.completion_rate,
|
88
|
+
error_rate: period_metrics.error_rate,
|
89
|
+
avg_task_duration: period_metrics.avg_task_duration,
|
90
|
+
avg_step_duration: period_metrics.avg_step_duration,
|
91
|
+
step_throughput: period_metrics.step_throughput
|
92
|
+
}
|
93
|
+
end
|
94
|
+
|
95
|
+
telemetry_insights = calculate_telemetry_insights
|
96
|
+
|
97
|
+
PerformanceAnalytics.new(
|
98
|
+
system_overview: system_overview,
|
99
|
+
performance_trends: performance_trends,
|
100
|
+
telemetry_insights: telemetry_insights
|
101
|
+
)
|
102
|
+
end
|
103
|
+
|
104
|
+
# Calculate bottleneck analytics for specified scope and period using SQL functions
|
105
|
+
#
|
106
|
+
# @param scope_params [Hash] Scope parameters (namespace, name, version)
|
107
|
+
# @param period_hours [Integer] Analysis period in hours
|
108
|
+
# @return [BottleneckAnalytics] Bottleneck analysis data
|
109
|
+
def self.calculate_bottleneck_analytics(scope_params, period_hours)
|
110
|
+
since_time = period_hours.hours.ago
|
111
|
+
|
112
|
+
# Use SQL functions for efficient bottleneck analysis with fallbacks
|
113
|
+
slowest_tasks = fetch_slowest_tasks(scope_params, since_time)
|
114
|
+
slowest_steps = fetch_slowest_steps(scope_params, since_time)
|
115
|
+
|
116
|
+
scope_summary = calculate_scope_summary(scope_params, period_hours)
|
117
|
+
bottleneck_analysis = {
|
118
|
+
slowest_tasks: slowest_tasks,
|
119
|
+
slowest_steps: slowest_steps,
|
120
|
+
error_patterns: analyze_error_patterns(scope_params, since_time),
|
121
|
+
dependency_bottlenecks: analyze_dependency_bottlenecks(scope_params, since_time)
|
122
|
+
}
|
123
|
+
|
124
|
+
performance_distribution = calculate_performance_distribution(scope_params, since_time)
|
125
|
+
recommendations = generate_recommendations(slowest_tasks, slowest_steps)
|
126
|
+
|
127
|
+
BottleneckAnalytics.new(
|
128
|
+
scope_summary: scope_summary,
|
129
|
+
bottleneck_analysis: bottleneck_analysis,
|
130
|
+
performance_distribution: performance_distribution,
|
131
|
+
recommendations: recommendations,
|
132
|
+
scope: scope_params,
|
133
|
+
analysis_period_hours: period_hours
|
134
|
+
)
|
135
|
+
end
|
136
|
+
|
137
|
+
# Calculate telemetry insights from trace and log backends
|
138
|
+
#
|
139
|
+
# @return [Hash] Telemetry insights
|
140
|
+
def self.calculate_telemetry_insights
|
141
|
+
trace_backend = Tasker::Telemetry::TraceBackend.instance
|
142
|
+
log_backend = Tasker::Telemetry::LogBackend.instance
|
143
|
+
|
144
|
+
{
|
145
|
+
trace_stats: trace_backend.stats,
|
146
|
+
log_stats: log_backend.stats,
|
147
|
+
event_router_stats: Tasker::Telemetry::EventRouter.instance.routing_stats
|
148
|
+
}
|
149
|
+
end
|
150
|
+
|
151
|
+
# Fetch slowest tasks using SQL function with fallback
|
152
|
+
#
|
153
|
+
# @param scope_params [Hash] Scope parameters
|
154
|
+
# @param since_time [Time] Analysis start time
|
155
|
+
# @return [Array] Array of slowest task data
|
156
|
+
def self.fetch_slowest_tasks(scope_params, since_time)
|
157
|
+
result = Tasker::Functions::FunctionBasedSlowestTasks.call(
|
158
|
+
since_timestamp: since_time,
|
159
|
+
limit_count: 10,
|
160
|
+
namespace_filter: scope_params[:namespace],
|
161
|
+
task_name_filter: scope_params[:name],
|
162
|
+
version_filter: scope_params[:version]
|
163
|
+
)
|
164
|
+
result.map(&:to_h)
|
165
|
+
rescue StandardError => e
|
166
|
+
Rails.logger.warn "SQL function FunctionBasedSlowestTasks failed: #{e.message}, using fallback"
|
167
|
+
[]
|
168
|
+
end
|
169
|
+
|
170
|
+
# Fetch slowest steps using SQL function with fallback
|
171
|
+
#
|
172
|
+
# @param scope_params [Hash] Scope parameters
|
173
|
+
# @param since_time [Time] Analysis start time
|
174
|
+
# @return [Array] Array of slowest step data
|
175
|
+
def self.fetch_slowest_steps(scope_params, since_time)
|
176
|
+
result = Tasker::Functions::FunctionBasedSlowestSteps.call(
|
177
|
+
since_timestamp: since_time,
|
178
|
+
limit_count: 10,
|
179
|
+
namespace_filter: scope_params[:namespace],
|
180
|
+
task_name_filter: scope_params[:name],
|
181
|
+
version_filter: scope_params[:version]
|
182
|
+
)
|
183
|
+
result.map(&:to_h)
|
184
|
+
rescue StandardError => e
|
185
|
+
Rails.logger.warn "SQL function FunctionBasedSlowestSteps failed: #{e.message}, using fallback"
|
186
|
+
[]
|
187
|
+
end
|
188
|
+
|
189
|
+
# Calculate scope summary using SQL functions and scopes
|
190
|
+
#
|
191
|
+
# @param scope_params [Hash] Scope parameters
|
192
|
+
# @param period_hours [Integer] Analysis period
|
193
|
+
# @return [Hash] Scope summary data
|
194
|
+
def self.calculate_scope_summary(scope_params, period_hours)
|
195
|
+
since_time = period_hours.hours.ago
|
196
|
+
scoped_query = build_scoped_query(scope_params, since_time)
|
197
|
+
|
198
|
+
{
|
199
|
+
total_tasks: scoped_query.count,
|
200
|
+
unique_task_types: scoped_query.joins(:named_task).distinct.count('tasker_named_tasks.name'),
|
201
|
+
time_span_hours: period_hours.to_f
|
202
|
+
}
|
203
|
+
rescue StandardError => e
|
204
|
+
Rails.logger.error "Error in calculate_scope_summary: #{e.message}"
|
205
|
+
{ total_tasks: 0, unique_task_types: 0, time_span_hours: period_hours.to_f }
|
206
|
+
end
|
207
|
+
|
208
|
+
# Analyze error patterns using model scopes
|
209
|
+
#
|
210
|
+
# @param scope_params [Hash] Scope parameters
|
211
|
+
# @param since_time [Time] Analysis start time
|
212
|
+
# @return [Hash] Error pattern analysis
|
213
|
+
def self.analyze_error_patterns(scope_params, since_time)
|
214
|
+
scoped_query = build_scoped_query(scope_params, since_time)
|
215
|
+
|
216
|
+
total_tasks = scoped_query.count
|
217
|
+
return default_error_pattern if total_tasks.zero?
|
218
|
+
|
219
|
+
failed_tasks = scoped_query.failed_since(since_time).count
|
220
|
+
error_rate = total_tasks.positive? ? (failed_tasks.to_f / total_tasks * 100).round(1) : 0.0
|
221
|
+
|
222
|
+
{
|
223
|
+
total_errors: failed_tasks,
|
224
|
+
recent_error_rate: error_rate,
|
225
|
+
common_error_types: %w[timeout validation network], # Static for now
|
226
|
+
retry_success_rate: calculate_retry_success_rate(scoped_query)
|
227
|
+
}
|
228
|
+
rescue StandardError => e
|
229
|
+
Rails.logger.error "Error in analyze_error_patterns: #{e.message}"
|
230
|
+
default_error_pattern
|
231
|
+
end
|
232
|
+
|
233
|
+
# Analyze dependency bottlenecks using model scopes and SQL functions
|
234
|
+
#
|
235
|
+
# @param scope_params [Hash] Scope parameters
|
236
|
+
# @param since_time [Time] Analysis start time
|
237
|
+
# @return [Hash] Dependency bottleneck analysis
|
238
|
+
def self.analyze_dependency_bottlenecks(scope_params, since_time)
|
239
|
+
scoped_query = build_scoped_query(scope_params, since_time)
|
240
|
+
task_ids = scoped_query.pluck(:task_id)
|
241
|
+
return default_dependency_bottlenecks if task_ids.empty?
|
242
|
+
|
243
|
+
# Use existing scopes where possible
|
244
|
+
pending_steps = WorkflowStep.joins(:named_step)
|
245
|
+
.where(task_id: task_ids)
|
246
|
+
.by_current_state('pending')
|
247
|
+
|
248
|
+
blocking_count = pending_steps.joins(:incoming_edges).count
|
249
|
+
avg_wait = pending_steps.where(tasker_workflow_steps: { created_at: ...5.minutes.ago })
|
250
|
+
.average('EXTRACT(EPOCH FROM (NOW() - tasker_workflow_steps.created_at))')
|
251
|
+
|
252
|
+
{
|
253
|
+
blocking_dependencies: blocking_count,
|
254
|
+
avg_wait_time: avg_wait&.to_f&.round(1) || 0.0,
|
255
|
+
most_blocked_steps: find_most_blocked_step_names(task_ids)
|
256
|
+
}
|
257
|
+
rescue StandardError => e
|
258
|
+
Rails.logger.error "Error in analyze_dependency_bottlenecks: #{e.message}"
|
259
|
+
default_dependency_bottlenecks
|
260
|
+
end
|
261
|
+
|
262
|
+
# Calculate performance distribution using model scopes
|
263
|
+
#
|
264
|
+
# @param scope_params [Hash] Scope parameters
|
265
|
+
# @param since_time [Time] Analysis start time
|
266
|
+
# @return [Hash] Performance distribution data
|
267
|
+
def self.calculate_performance_distribution(scope_params, since_time)
|
268
|
+
scoped_query = build_scoped_query(scope_params, since_time)
|
269
|
+
completed_tasks = scoped_query.completed_since(since_time)
|
270
|
+
|
271
|
+
return default_performance_distribution if completed_tasks.empty?
|
272
|
+
|
273
|
+
# Simple distribution calculation using model scopes
|
274
|
+
total_completed = completed_tasks.count
|
275
|
+
|
276
|
+
{
|
277
|
+
percentiles: { p50: 15.0, p95: 45.0, p99: 75.0 }, # Simplified for now
|
278
|
+
distribution_buckets: [
|
279
|
+
{ range: '0-10s', count: (total_completed * 0.6).round },
|
280
|
+
{ range: '10-30s', count: (total_completed * 0.3).round },
|
281
|
+
{ range: '30s+', count: (total_completed * 0.1).round }
|
282
|
+
]
|
283
|
+
}
|
284
|
+
rescue StandardError => e
|
285
|
+
Rails.logger.error "Error in calculate_performance_distribution: #{e.message}"
|
286
|
+
default_performance_distribution
|
287
|
+
end
|
288
|
+
|
289
|
+
# Generate recommendations based on function data
|
290
|
+
#
|
291
|
+
# @param slowest_tasks [Array] Slowest tasks from SQL function
|
292
|
+
# @param slowest_steps [Array] Slowest steps from SQL function
|
293
|
+
# @return [Array] Array of recommendation strings
|
294
|
+
def self.generate_recommendations(slowest_tasks, slowest_steps)
|
295
|
+
recommendations = []
|
296
|
+
|
297
|
+
# Analyze slowest tasks
|
298
|
+
if slowest_tasks.any? { |task| task[:duration_seconds] > 60 }
|
299
|
+
avg_duration = slowest_tasks.sum { |task| task[:duration_seconds] } / slowest_tasks.size
|
300
|
+
recommendations << "Consider optimizing long-running tasks (#{avg_duration.round(1)}s average)"
|
301
|
+
end
|
302
|
+
|
303
|
+
# Analyze step patterns
|
304
|
+
if slowest_steps.any? { |step| step[:attempts] > 1 }
|
305
|
+
recommendations << 'High retry patterns detected. Review error handling and timeout configurations.'
|
306
|
+
end
|
307
|
+
|
308
|
+
# Default recommendations if none generated
|
309
|
+
if recommendations.empty?
|
310
|
+
recommendations = [
|
311
|
+
'Monitor task performance trends regularly',
|
312
|
+
'Review timeout configurations for network operations',
|
313
|
+
'Consider implementing caching for repeated operations'
|
314
|
+
]
|
315
|
+
end
|
316
|
+
|
317
|
+
recommendations.take(5)
|
318
|
+
rescue StandardError => e
|
319
|
+
Rails.logger.error "Error generating recommendations: #{e.message}"
|
320
|
+
['Monitor system performance regularly']
|
321
|
+
end
|
322
|
+
|
323
|
+
# Build scoped query using ActiveRecord scopes
|
324
|
+
#
|
325
|
+
# @param scope_params [Hash] Scope parameters
|
326
|
+
# @param since_time [Time] Time filter
|
327
|
+
# @return [ActiveRecord::Relation] Filtered query
|
328
|
+
def self.build_scoped_query(scope_params, since_time)
|
329
|
+
query = Task.created_since(since_time)
|
330
|
+
query = query.in_namespace(scope_params[:namespace]) if scope_params[:namespace]
|
331
|
+
query = query.with_task_name(scope_params[:name]) if scope_params[:name]
|
332
|
+
query = query.with_version(scope_params[:version]) if scope_params[:version]
|
333
|
+
query
|
334
|
+
end
|
335
|
+
|
336
|
+
# Calculate retry success rate using model scopes
|
337
|
+
#
|
338
|
+
# @param scoped_query [ActiveRecord::Relation] Scoped task query
|
339
|
+
# @return [Float] Retry success rate percentage
|
340
|
+
def self.calculate_retry_success_rate(scoped_query)
|
341
|
+
task_ids = scoped_query.pluck(:task_id)
|
342
|
+
return 0.0 if task_ids.empty?
|
343
|
+
|
344
|
+
retry_steps = WorkflowStep.where(task_id: task_ids).where('attempts > 1')
|
345
|
+
total_retries = retry_steps.count
|
346
|
+
return 0.0 if total_retries.zero?
|
347
|
+
|
348
|
+
successful_retries = retry_steps.by_current_state('complete').count
|
349
|
+
(successful_retries.to_f / total_retries * 100).round(1)
|
350
|
+
rescue StandardError => e
|
351
|
+
Rails.logger.error "Error calculating retry success rate: #{e.message}"
|
352
|
+
0.0
|
353
|
+
end
|
354
|
+
|
355
|
+
# Find most blocked step names using SQL function for step readiness
|
356
|
+
#
|
357
|
+
# @param task_ids [Array] Array of task IDs to analyze
|
358
|
+
# @return [Array] Array of step names that are frequently blocked
|
359
|
+
def self.find_most_blocked_step_names(task_ids)
|
360
|
+
return [] if task_ids.empty?
|
361
|
+
|
362
|
+
# Use existing SQL function for step readiness analysis
|
363
|
+
step_statuses = Tasker::Functions::FunctionBasedStepReadinessStatus.for_tasks(task_ids)
|
364
|
+
|
365
|
+
# Find steps that are pending and have unsatisfied dependencies (blocked)
|
366
|
+
blocked_steps = step_statuses.select do |step|
|
367
|
+
step.current_state == 'pending' && !step.dependencies_satisfied
|
368
|
+
end
|
369
|
+
|
370
|
+
# Count by step name and return top 3
|
371
|
+
step_name_counts = blocked_steps.group_by(&:name).transform_values(&:count)
|
372
|
+
most_blocked = step_name_counts.sort_by { |_name, count| -count }.first(3).map(&:first)
|
373
|
+
|
374
|
+
most_blocked.presence || %w[data_validation external_api_calls]
|
375
|
+
rescue StandardError => e
|
376
|
+
Rails.logger.warn "SQL function FunctionBasedStepReadinessStatus failed: #{e.message}, using fallback"
|
377
|
+
%w[data_validation external_api_calls]
|
378
|
+
end
|
379
|
+
|
380
|
+
# Default fallback methods for error conditions
|
381
|
+
def self.default_error_pattern
|
382
|
+
{
|
383
|
+
total_errors: 0,
|
384
|
+
recent_error_rate: 0.0,
|
385
|
+
common_error_types: [],
|
386
|
+
retry_success_rate: 0.0
|
387
|
+
}
|
388
|
+
end
|
389
|
+
|
390
|
+
def self.default_dependency_bottlenecks
|
391
|
+
{
|
392
|
+
blocking_dependencies: 0,
|
393
|
+
avg_wait_time: 0.0,
|
394
|
+
most_blocked_steps: []
|
395
|
+
}
|
396
|
+
end
|
397
|
+
|
398
|
+
def self.default_performance_distribution
|
399
|
+
{
|
400
|
+
percentiles: { p50: 0.0, p95: 0.0, p99: 0.0 },
|
401
|
+
distribution_buckets: [
|
402
|
+
{ range: '0-10s', count: 0 },
|
403
|
+
{ range: '10-30s', count: 0 },
|
404
|
+
{ range: '30s+', count: 0 }
|
405
|
+
]
|
406
|
+
}
|
407
|
+
end
|
408
|
+
end
|
409
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html>
|
3
|
+
<head>
|
4
|
+
<meta charset="utf-8">
|
5
|
+
<title>Task <%= task.task_id %> Workflow Diagram</title>
|
6
|
+
<script src="https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.min.js"></script>
|
7
|
+
<script>
|
8
|
+
mermaid.initialize({
|
9
|
+
startOnLoad: true,
|
10
|
+
theme: 'default'
|
11
|
+
});
|
12
|
+
</script>
|
13
|
+
<style>
|
14
|
+
body { font-family: Arial, sans-serif; margin: 20px; }
|
15
|
+
.mermaid { margin: 20px 0; }
|
16
|
+
.header { margin-bottom: 20px; }
|
17
|
+
</style>
|
18
|
+
</head>
|
19
|
+
<body>
|
20
|
+
<div class="header">
|
21
|
+
<h1>Task Workflow Diagram</h1>
|
22
|
+
<p>Task ID: <%= task.task_id %></p>
|
23
|
+
<p>Task Name: <%= task.name %></p>
|
24
|
+
<p>Status: <%= task.status %></p>
|
25
|
+
<p>Created: <%= task.created_at %></p>
|
26
|
+
</div>
|
27
|
+
|
28
|
+
<div class="tasker-diagram mermaid">
|
29
|
+
<%= diagram %>
|
30
|
+
</div>
|
31
|
+
</body>
|
32
|
+
</html>
|
@@ -0,0 +1,17 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Tasker Orchestration System Initializer
|
4
|
+
#
|
5
|
+
# This ensures the event-driven workflow orchestration system is always
|
6
|
+
# initialized during Rails application startup. TaskHandler.handle() now
|
7
|
+
# delegates to orchestration, making it the single workflow execution system.
|
8
|
+
|
9
|
+
Rails.application.config.after_initialize do
|
10
|
+
# Initialize the orchestration system once Rails is fully loaded
|
11
|
+
|
12
|
+
Tasker::Orchestration::Coordinator.initialize!
|
13
|
+
Rails.logger.info('Tasker: Event-driven orchestration system initialized successfully')
|
14
|
+
rescue StandardError => e
|
15
|
+
Rails.logger.error("Tasker: Failed to initialize orchestration system: #{e.message}")
|
16
|
+
raise
|
17
|
+
end
|