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,161 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module Tasker
|
6
|
+
module Events
|
7
|
+
# SubscriptionLoader loads event subscriptions from YAML configuration files
|
8
|
+
#
|
9
|
+
# This class enables developers to configure event subscriptions declaratively
|
10
|
+
# using YAML files in config/tasker/subscriptions/
|
11
|
+
#
|
12
|
+
# Example YAML structure:
|
13
|
+
# subscriptions:
|
14
|
+
# sentry_integration:
|
15
|
+
# class: 'SentrySubscriber'
|
16
|
+
# events:
|
17
|
+
# - 'task.failed'
|
18
|
+
# - 'step.failed'
|
19
|
+
# config:
|
20
|
+
# dsn: 'https://...'
|
21
|
+
# environment: 'production'
|
22
|
+
#
|
23
|
+
class SubscriptionLoader
|
24
|
+
class << self
|
25
|
+
# Load all subscription configurations from YAML files
|
26
|
+
#
|
27
|
+
# @return [Hash] Loaded subscription configurations
|
28
|
+
def load_all
|
29
|
+
@load_all ||= load_subscription_files
|
30
|
+
end
|
31
|
+
|
32
|
+
# Load and instantiate all configured subscribers
|
33
|
+
#
|
34
|
+
# @return [Array<BaseSubscriber>] Array of instantiated subscribers
|
35
|
+
def load_subscribers
|
36
|
+
subscribers = []
|
37
|
+
|
38
|
+
load_all.each do |name, config|
|
39
|
+
subscriber = instantiate_subscriber(name, config)
|
40
|
+
subscribers << subscriber if subscriber
|
41
|
+
rescue StandardError => e
|
42
|
+
Rails.logger.warn "Failed to load subscriber #{name}: #{e.message}"
|
43
|
+
end
|
44
|
+
|
45
|
+
subscribers
|
46
|
+
end
|
47
|
+
|
48
|
+
# Register all loaded subscribers with the event system
|
49
|
+
#
|
50
|
+
# @return [void]
|
51
|
+
def register_all_subscribers
|
52
|
+
load_subscribers.each do |subscriber|
|
53
|
+
Rails.logger.info "Registering subscriber: #{subscriber.class.name}"
|
54
|
+
# Subscribers auto-register themselves when instantiated
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
# Reload subscription configurations (useful for development)
|
59
|
+
#
|
60
|
+
# @return [Hash] Reloaded subscription configurations
|
61
|
+
def reload!
|
62
|
+
@loaded_subscriptions = nil
|
63
|
+
load_all
|
64
|
+
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
# Load subscription configurations from all YAML files
|
69
|
+
#
|
70
|
+
# @return [Hash] Combined subscription configurations
|
71
|
+
def load_subscription_files
|
72
|
+
subscriptions = {}
|
73
|
+
|
74
|
+
subscription_files.each do |file_path|
|
75
|
+
file_subscriptions = load_subscription_file(file_path)
|
76
|
+
subscriptions.merge!(file_subscriptions)
|
77
|
+
rescue StandardError => e
|
78
|
+
Rails.logger.warn "Failed to load subscription file #{file_path}: #{e.message}"
|
79
|
+
end
|
80
|
+
|
81
|
+
subscriptions
|
82
|
+
end
|
83
|
+
|
84
|
+
# Load subscription configuration from a single YAML file
|
85
|
+
#
|
86
|
+
# @param file_path [String] Path to the YAML file
|
87
|
+
# @return [Hash] Subscription configurations from the file
|
88
|
+
def load_subscription_file(file_path)
|
89
|
+
yaml_data = YAML.load_file(file_path)
|
90
|
+
subscriptions_data = yaml_data['subscriptions'] || {}
|
91
|
+
|
92
|
+
# Validate and normalize subscription configurations
|
93
|
+
normalized = {}
|
94
|
+
subscriptions_data.each do |name, config|
|
95
|
+
normalized[name] = normalize_subscription_config(name, config)
|
96
|
+
end
|
97
|
+
|
98
|
+
normalized
|
99
|
+
end
|
100
|
+
|
101
|
+
# Normalize and validate a subscription configuration
|
102
|
+
#
|
103
|
+
# @param name [String] Subscription name
|
104
|
+
# @param config [Hash] Raw subscription configuration
|
105
|
+
# @return [Hash] Normalized subscription configuration
|
106
|
+
def normalize_subscription_config(name, config)
|
107
|
+
{
|
108
|
+
name: name,
|
109
|
+
class: config['class'] || config[:class],
|
110
|
+
events: Array(config['events'] || config[:events]),
|
111
|
+
config: config['config'] || config[:config] || {},
|
112
|
+
enabled: config.fetch('enabled', config.fetch(:enabled, true))
|
113
|
+
}
|
114
|
+
end
|
115
|
+
|
116
|
+
# Instantiate a subscriber from configuration
|
117
|
+
#
|
118
|
+
# @param name [String] Subscription name
|
119
|
+
# @param config [Hash] Subscription configuration
|
120
|
+
# @return [BaseSubscriber, nil] Instantiated subscriber or nil if disabled/failed
|
121
|
+
def instantiate_subscriber(_name, config)
|
122
|
+
return nil unless config[:enabled]
|
123
|
+
|
124
|
+
subscriber_class = resolve_subscriber_class(config[:class])
|
125
|
+
return nil unless subscriber_class
|
126
|
+
|
127
|
+
# Pass configuration to subscriber constructor
|
128
|
+
subscriber_class.new(
|
129
|
+
name: config[:name],
|
130
|
+
events: config[:events],
|
131
|
+
config: config[:config]
|
132
|
+
)
|
133
|
+
end
|
134
|
+
|
135
|
+
# Resolve subscriber class from string name
|
136
|
+
#
|
137
|
+
# @param class_name [String] Class name to resolve
|
138
|
+
# @return [Class, nil] Resolved class or nil if not found
|
139
|
+
def resolve_subscriber_class(class_name)
|
140
|
+
return nil unless class_name
|
141
|
+
|
142
|
+
# Try to constantize the class name
|
143
|
+
class_name.constantize
|
144
|
+
rescue NameError => e
|
145
|
+
Rails.logger.warn "Subscriber class not found: #{class_name} (#{e.message})"
|
146
|
+
nil
|
147
|
+
end
|
148
|
+
|
149
|
+
# Get all subscription YAML files
|
150
|
+
#
|
151
|
+
# @return [Array<String>] Array of file paths
|
152
|
+
def subscription_files
|
153
|
+
subscription_dir = Rails.root.join('config/tasker/subscriptions')
|
154
|
+
return [] unless subscription_dir.exist?
|
155
|
+
|
156
|
+
Dir.glob(subscription_dir.join('*.yml'))
|
157
|
+
end
|
158
|
+
end
|
159
|
+
end
|
160
|
+
end
|
161
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'events/catalog'
|
4
|
+
require_relative 'events/publisher'
|
5
|
+
require_relative 'events/subscribers/base_subscriber'
|
6
|
+
|
7
|
+
module Tasker
|
8
|
+
module Events
|
9
|
+
# Delegate catalog methods to the Catalog class for clean developer API
|
10
|
+
class << self
|
11
|
+
delegate :catalog, :event_info, :task_events, :step_events, :workflow_events,
|
12
|
+
:observability_events, :custom_events, :complete_catalog,
|
13
|
+
:search_events, :events_by_namespace, :print_catalog, to: :catalog_instance
|
14
|
+
|
15
|
+
# Register a custom event
|
16
|
+
#
|
17
|
+
# @param name [String] Event name (must contain namespace, e.g., 'order.fulfilled')
|
18
|
+
# @param description [String] Human-readable description
|
19
|
+
# @param fired_by [Array<String>] Components that fire this event
|
20
|
+
# @return [void]
|
21
|
+
# @raise [ArgumentError] If event name is invalid or conflicts with system events
|
22
|
+
def register_custom_event(name, description: 'Custom event', fired_by: [])
|
23
|
+
Tasker::Events::CustomRegistry.instance.register_event(
|
24
|
+
name,
|
25
|
+
description: description,
|
26
|
+
fired_by: fired_by
|
27
|
+
)
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def catalog_instance
|
33
|
+
@catalog_instance ||= Catalog
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'function_wrapper'
|
4
|
+
|
5
|
+
module Tasker
|
6
|
+
module Functions
|
7
|
+
# Wrapper for the get_analytics_metrics_v01 SQL function
|
8
|
+
#
|
9
|
+
# This function provides comprehensive analytics metrics for performance monitoring,
|
10
|
+
# including system overview, performance metrics, and duration calculations.
|
11
|
+
#
|
12
|
+
# @example Basic usage
|
13
|
+
# metrics = Tasker::Functions::FunctionBasedAnalyticsMetrics.call
|
14
|
+
# puts metrics.system_health_score
|
15
|
+
# puts metrics.completion_rate
|
16
|
+
#
|
17
|
+
# @example Time-bounded analysis
|
18
|
+
# since_time = 4.hours.ago
|
19
|
+
# metrics = Tasker::Functions::FunctionBasedAnalyticsMetrics.call(since_time)
|
20
|
+
# puts metrics.task_throughput
|
21
|
+
#
|
22
|
+
class FunctionBasedAnalyticsMetrics < FunctionWrapper
|
23
|
+
# Analytics metrics result structure
|
24
|
+
class AnalyticsMetrics < Dry::Struct
|
25
|
+
# System overview metrics
|
26
|
+
attribute :active_tasks_count, Types::Integer
|
27
|
+
attribute :total_namespaces_count, Types::Integer
|
28
|
+
attribute :unique_task_types_count, Types::Integer
|
29
|
+
attribute :system_health_score, Types::Float
|
30
|
+
|
31
|
+
# Performance metrics since timestamp
|
32
|
+
attribute :task_throughput, Types::Integer
|
33
|
+
attribute :completion_count, Types::Integer
|
34
|
+
attribute :error_count, Types::Integer
|
35
|
+
attribute :completion_rate, Types::Float
|
36
|
+
attribute :error_rate, Types::Float
|
37
|
+
|
38
|
+
# Duration metrics (in seconds)
|
39
|
+
attribute :avg_task_duration, Types::Float
|
40
|
+
attribute :avg_step_duration, Types::Float
|
41
|
+
attribute :step_throughput, Types::Integer
|
42
|
+
|
43
|
+
# Metadata
|
44
|
+
attribute :analysis_period_start, Types::String
|
45
|
+
attribute :calculated_at, Types::String
|
46
|
+
end
|
47
|
+
|
48
|
+
# Call the get_analytics_metrics_v01 SQL function
|
49
|
+
#
|
50
|
+
# @param since_timestamp [Time, nil] Start time for analysis (defaults to 1 hour ago in SQL)
|
51
|
+
# @return [AnalyticsMetrics] Comprehensive analytics metrics
|
52
|
+
# @raise [ActiveRecord::StatementInvalid] If the SQL function fails
|
53
|
+
def self.call(since_timestamp = nil)
|
54
|
+
if since_timestamp
|
55
|
+
sql = 'SELECT * FROM get_analytics_metrics_v01($1)'
|
56
|
+
result = connection.select_all(sql, 'AnalyticsMetrics Load', [since_timestamp])
|
57
|
+
else
|
58
|
+
sql = 'SELECT * FROM get_analytics_metrics_v01()'
|
59
|
+
result = connection.select_all(sql, 'AnalyticsMetrics Load')
|
60
|
+
end
|
61
|
+
|
62
|
+
if result.empty?
|
63
|
+
# Return zero values if no data (shouldn't happen but defensive)
|
64
|
+
AnalyticsMetrics.new(
|
65
|
+
active_tasks_count: 0,
|
66
|
+
total_namespaces_count: 0,
|
67
|
+
unique_task_types_count: 0,
|
68
|
+
system_health_score: 1.0,
|
69
|
+
task_throughput: 0,
|
70
|
+
completion_count: 0,
|
71
|
+
error_count: 0,
|
72
|
+
completion_rate: 0.0,
|
73
|
+
error_rate: 0.0,
|
74
|
+
avg_task_duration: 0.0,
|
75
|
+
avg_step_duration: 0.0,
|
76
|
+
step_throughput: 0,
|
77
|
+
analysis_period_start: (since_timestamp || 1.hour.ago).to_s,
|
78
|
+
calculated_at: Time.current.to_s
|
79
|
+
)
|
80
|
+
else
|
81
|
+
# Convert the result to a structured AnalyticsMetrics object
|
82
|
+
row = result.first
|
83
|
+
AnalyticsMetrics.new(
|
84
|
+
active_tasks_count: row['active_tasks_count'].to_i,
|
85
|
+
total_namespaces_count: row['total_namespaces_count'].to_i,
|
86
|
+
unique_task_types_count: row['unique_task_types_count'].to_i,
|
87
|
+
system_health_score: row['system_health_score'].to_f,
|
88
|
+
task_throughput: row['task_throughput'].to_i,
|
89
|
+
completion_count: row['completion_count'].to_i,
|
90
|
+
error_count: row['error_count'].to_i,
|
91
|
+
completion_rate: row['completion_rate'].to_f,
|
92
|
+
error_rate: row['error_rate'].to_f,
|
93
|
+
avg_task_duration: row['avg_task_duration'].to_f,
|
94
|
+
avg_step_duration: row['avg_step_duration'].to_f,
|
95
|
+
step_throughput: row['step_throughput'].to_i,
|
96
|
+
analysis_period_start: row['analysis_period_start'].to_s,
|
97
|
+
calculated_at: row['calculated_at'].to_s
|
98
|
+
)
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
@@ -0,0 +1,54 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'function_wrapper'
|
4
|
+
|
5
|
+
module Tasker
|
6
|
+
module Functions
|
7
|
+
# Function-based implementation of dependency level calculation
|
8
|
+
# Uses SQL function for performance-optimized dependency level calculation
|
9
|
+
class FunctionBasedDependencyLevels < FunctionWrapper
|
10
|
+
# Define attributes to match the SQL function output
|
11
|
+
attribute :workflow_step_id, :integer
|
12
|
+
attribute :dependency_level, :integer
|
13
|
+
|
14
|
+
# Class methods that use SQL functions
|
15
|
+
def self.for_task(task_id)
|
16
|
+
sql = 'SELECT * FROM calculate_dependency_levels($1::BIGINT)'
|
17
|
+
binds = [task_id]
|
18
|
+
from_sql_function(sql, binds, 'DependencyLevels Load')
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.levels_hash_for_task(task_id)
|
22
|
+
for_task(task_id).each_with_object({}) do |level_data, hash|
|
23
|
+
hash[level_data.workflow_step_id] = level_data.dependency_level
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.max_level_for_task(task_id)
|
28
|
+
for_task(task_id).map(&:dependency_level).max || 0
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.steps_at_level(task_id, level)
|
32
|
+
for_task(task_id).select { |data| data.dependency_level == level }
|
33
|
+
.map(&:workflow_step_id)
|
34
|
+
end
|
35
|
+
|
36
|
+
def self.root_steps_for_task(task_id)
|
37
|
+
steps_at_level(task_id, 0)
|
38
|
+
end
|
39
|
+
|
40
|
+
# Instance methods
|
41
|
+
def to_h
|
42
|
+
{
|
43
|
+
workflow_step_id: workflow_step_id,
|
44
|
+
dependency_level: dependency_level
|
45
|
+
}
|
46
|
+
end
|
47
|
+
|
48
|
+
# Associations (lazy-loaded)
|
49
|
+
def workflow_step
|
50
|
+
@workflow_step ||= Tasker::WorkflowStep.find(workflow_step_id)
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'function_wrapper'
|
4
|
+
|
5
|
+
module Tasker
|
6
|
+
module Functions
|
7
|
+
# Wrapper for the get_slowest_steps_v01 SQL function
|
8
|
+
#
|
9
|
+
# This function returns the slowest workflow steps within a specified time period
|
10
|
+
# with duration metrics and optional filtering by namespace, task name, and version.
|
11
|
+
#
|
12
|
+
# @example Basic usage
|
13
|
+
# slowest_steps = Tasker::Functions::FunctionBasedSlowestSteps.call
|
14
|
+
# slowest_steps.each { |step| puts "#{step.step_name}: #{step.duration_seconds}s" }
|
15
|
+
#
|
16
|
+
# @example With filters and time period
|
17
|
+
# since_time = 24.hours.ago
|
18
|
+
# filtered_steps = Tasker::Functions::FunctionBasedSlowestSteps.call(
|
19
|
+
# since_timestamp: since_time,
|
20
|
+
# limit_count: 15,
|
21
|
+
# namespace_filter: 'inventory',
|
22
|
+
# task_name_filter: 'update_stock'
|
23
|
+
# )
|
24
|
+
#
|
25
|
+
class FunctionBasedSlowestSteps < FunctionWrapper
|
26
|
+
# Individual slowest step result structure
|
27
|
+
class SlowestStep < Dry::Struct
|
28
|
+
attribute :workflow_step_id, Types::Integer
|
29
|
+
attribute :task_id, Types::Integer
|
30
|
+
attribute :step_name, Types::String
|
31
|
+
attribute :task_name, Types::String
|
32
|
+
attribute :namespace_name, Types::String
|
33
|
+
attribute :version, Types::String
|
34
|
+
attribute :duration_seconds, Types::Float
|
35
|
+
attribute :attempts, Types::Integer
|
36
|
+
attribute :created_at, Types::Params::DateTime
|
37
|
+
attribute :completed_at, Types::Params::DateTime
|
38
|
+
attribute :retryable, Types::Bool
|
39
|
+
attribute :step_status, Types::String
|
40
|
+
end
|
41
|
+
|
42
|
+
# Call the get_slowest_steps_v01 SQL function
|
43
|
+
#
|
44
|
+
# @param since_timestamp [Time, nil] Start time for analysis (defaults to 24 hours ago in SQL)
|
45
|
+
# @param limit_count [Integer] Maximum number of results to return (default: 10)
|
46
|
+
# @param namespace_filter [String, nil] Filter by namespace name
|
47
|
+
# @param task_name_filter [String, nil] Filter by task name
|
48
|
+
# @param version_filter [String, nil] Filter by task version
|
49
|
+
# @return [Array<SlowestStep>] Array of slowest step results
|
50
|
+
# @raise [ActiveRecord::StatementInvalid] If the SQL function fails
|
51
|
+
def self.call(since_timestamp: nil, limit_count: 10, namespace_filter: nil, task_name_filter: nil,
|
52
|
+
version_filter: nil)
|
53
|
+
# Build SQL with proper parameter binding
|
54
|
+
sql = 'SELECT * FROM get_slowest_steps_v01($1, $2, $3, $4, $5)'
|
55
|
+
binds = [
|
56
|
+
since_timestamp,
|
57
|
+
limit_count,
|
58
|
+
namespace_filter,
|
59
|
+
task_name_filter,
|
60
|
+
version_filter
|
61
|
+
]
|
62
|
+
|
63
|
+
result = connection.select_all(sql, 'SlowestSteps Load', binds)
|
64
|
+
|
65
|
+
result.map do |row|
|
66
|
+
SlowestStep.new(
|
67
|
+
workflow_step_id: row['workflow_step_id'].to_i,
|
68
|
+
task_id: row['task_id'].to_i,
|
69
|
+
step_name: row['step_name'].to_s,
|
70
|
+
task_name: row['task_name'].to_s,
|
71
|
+
namespace_name: row['namespace_name'].to_s,
|
72
|
+
version: row['version'].to_s,
|
73
|
+
duration_seconds: row['duration_seconds'].to_f,
|
74
|
+
attempts: row['attempts'].to_i,
|
75
|
+
created_at: Time.zone.parse(row['created_at'].to_s),
|
76
|
+
completed_at: Time.zone.parse(row['completed_at'].to_s),
|
77
|
+
retryable: ['t', true].include?(row['retryable']),
|
78
|
+
step_status: row['step_status'].to_s
|
79
|
+
)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'function_wrapper'
|
4
|
+
|
5
|
+
module Tasker
|
6
|
+
module Functions
|
7
|
+
# Wrapper for the get_slowest_tasks_v01 SQL function
|
8
|
+
#
|
9
|
+
# This function returns the slowest tasks within a specified time period
|
10
|
+
# with performance metrics and optional filtering by namespace, task name, and version.
|
11
|
+
#
|
12
|
+
# @example Basic usage
|
13
|
+
# slowest_tasks = Tasker::Functions::FunctionBasedSlowestTasks.call
|
14
|
+
# slowest_tasks.each { |task| puts "#{task.task_name}: #{task.duration_seconds}s" }
|
15
|
+
#
|
16
|
+
# @example With filters and time period
|
17
|
+
# since_time = 24.hours.ago
|
18
|
+
# filtered_tasks = Tasker::Functions::FunctionBasedSlowestTasks.call(
|
19
|
+
# since_timestamp: since_time,
|
20
|
+
# limit_count: 5,
|
21
|
+
# namespace_filter: 'payments',
|
22
|
+
# task_name_filter: 'process_payment'
|
23
|
+
# )
|
24
|
+
#
|
25
|
+
class FunctionBasedSlowestTasks < FunctionWrapper
|
26
|
+
# Individual slowest task result structure
|
27
|
+
class SlowestTask < Dry::Struct
|
28
|
+
attribute :task_id, Types::Integer
|
29
|
+
attribute :task_name, Types::String
|
30
|
+
attribute :namespace_name, Types::String
|
31
|
+
attribute :version, Types::String
|
32
|
+
attribute :duration_seconds, Types::Float
|
33
|
+
attribute :step_count, Types::Integer
|
34
|
+
attribute :completed_steps, Types::Integer
|
35
|
+
attribute :error_steps, Types::Integer
|
36
|
+
attribute :created_at, Types::Params::DateTime
|
37
|
+
attribute :completed_at, Types::Params::DateTime.optional
|
38
|
+
attribute :initiator, Types::String.optional
|
39
|
+
attribute :source_system, Types::String.optional
|
40
|
+
end
|
41
|
+
|
42
|
+
# Call the get_slowest_tasks_v01 SQL function
|
43
|
+
#
|
44
|
+
# @param since_timestamp [Time, nil] Start time for analysis (defaults to 24 hours ago in SQL)
|
45
|
+
# @param limit_count [Integer] Maximum number of results to return (default: 10)
|
46
|
+
# @param namespace_filter [String, nil] Filter by namespace name
|
47
|
+
# @param task_name_filter [String, nil] Filter by task name
|
48
|
+
# @param version_filter [String, nil] Filter by task version
|
49
|
+
# @return [Array<SlowestTask>] Array of slowest task results
|
50
|
+
# @raise [ActiveRecord::StatementInvalid] If the SQL function fails
|
51
|
+
def self.call(since_timestamp: nil, limit_count: 10, namespace_filter: nil, task_name_filter: nil,
|
52
|
+
version_filter: nil)
|
53
|
+
# Build SQL with proper parameter binding
|
54
|
+
sql = 'SELECT * FROM get_slowest_tasks_v01($1, $2, $3, $4, $5)'
|
55
|
+
binds = [
|
56
|
+
since_timestamp,
|
57
|
+
limit_count,
|
58
|
+
namespace_filter,
|
59
|
+
task_name_filter,
|
60
|
+
version_filter
|
61
|
+
]
|
62
|
+
|
63
|
+
result = connection.select_all(sql, 'SlowestTasks Load', binds)
|
64
|
+
|
65
|
+
result.map do |row|
|
66
|
+
SlowestTask.new(
|
67
|
+
task_id: row['task_id'].to_i,
|
68
|
+
task_name: row['task_name'].to_s,
|
69
|
+
namespace_name: row['namespace_name'].to_s,
|
70
|
+
version: row['version'].to_s,
|
71
|
+
duration_seconds: row['duration_seconds'].to_f,
|
72
|
+
step_count: row['step_count'].to_i,
|
73
|
+
completed_steps: row['completed_steps'].to_i,
|
74
|
+
error_steps: row['error_steps'].to_i,
|
75
|
+
created_at: Time.zone.parse(row['created_at'].to_s),
|
76
|
+
completed_at: row['completed_at'] ? Time.zone.parse(row['completed_at'].to_s) : nil,
|
77
|
+
initiator: row['initiator'],
|
78
|
+
source_system: row['source_system']
|
79
|
+
)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|