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
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: dd2231fa336087118193cb1ed54b98838f396210d88b44ff2eb994ebc12cc12f
|
4
|
+
data.tar.gz: 1e0f9172ccac70c3d712cdb038779158eb1edcd9e81e9402a3888a0ba12cb85c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 4cf9d080d61f3954b1d06749ee71f1a7508bd10272ca7be10476cfe45880d45048ea986fc5a510233ae9f92f549ba160f0ae93cf16a5e92fd3bcd4282deb69fa
|
7
|
+
data.tar.gz: c810d613f87f099bfb948f306fb7fc57e568427a7eb453acf2a0a602d270e31bd0f9e8e438e134f5d60e11ea3e63a7b00dc994ec76f664fa331a061453b0b4dc
|
data/LICENSE
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright 2021 Pete Taylor
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
6
|
+
a copy of this software and associated documentation files (the
|
7
|
+
"Software"), to deal in the Software without restriction, including
|
8
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
9
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
10
|
+
permit persons to whom the Software is furnished to do so, subject to
|
11
|
+
the following conditions:
|
12
|
+
|
13
|
+
The above copyright notice and this permission notice shall be
|
14
|
+
included in all copies or substantial portions of the Software.
|
15
|
+
|
16
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
17
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
18
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
19
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
20
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
21
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
22
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,443 @@
|
|
1
|
+
[](https://github.com/tasker-systems/tasker/actions/workflows/main.yml)
|
2
|
+

|
3
|
+

|
4
|
+
[](https://www.gitbook.com/preview?utm_source=gitbook_readme_badge&utm_medium=organic&utm_campaign=preview_documentation&utm_content=link)
|
5
|
+
|
6
|
+
# Tasker: Making Complex Workflows Easy-ish
|
7
|
+
|
8
|
+
## What is Tasker?
|
9
|
+
|
10
|
+
Tasker is a **production-ready Rails engine** that transforms complex, multi-step processes into reliable, observable workflows. It handles the orchestration complexity so you can focus on your business logic.
|
11
|
+
|
12
|
+
### 🚀 Key Capabilities
|
13
|
+
- **Complex Workflow Patterns**: Linear, diamond, tree, and parallel merge workflows
|
14
|
+
- **Intelligent Retry Logic**: Exponential backoff with configurable retry limits
|
15
|
+
- **Production Resilience**: Automatic failure recovery and retry orchestration
|
16
|
+
- **Complete Observability**: Event-driven architecture with comprehensive telemetry
|
17
|
+
- **Enterprise Security**: Authentication & authorization with GraphQL operation-level permissions
|
18
|
+
- **High Performance**: SQL-function based orchestration with 4x performance gains
|
19
|
+
- **Thread-Safe Registry Systems**: Enterprise-grade registry architecture with structured logging
|
20
|
+
- **Advanced Plugin Architecture**: Extensible plugin system with format-based discovery
|
21
|
+
|
22
|
+
Perfect for processes that involve multiple interdependent steps, require automatic retries, need visibility into progress and errors, and must handle transient failures gracefully.
|
23
|
+
|
24
|
+
## Quick Installation
|
25
|
+
|
26
|
+
### Option 1: Add to Existing Rails App
|
27
|
+
|
28
|
+
Add Tasker to your Rails app's `Gemfile`:
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
source 'https://rubygems.pkg.github.com/tasker-systems' do
|
32
|
+
gem 'tasker-engine', '~> 1.0.0'
|
33
|
+
end
|
34
|
+
```
|
35
|
+
|
36
|
+
Install and run the migrations:
|
37
|
+
|
38
|
+
```bash
|
39
|
+
bundle exec rails tasker:install:migrations
|
40
|
+
bundle exec rails tasker:install:database_objects
|
41
|
+
bundle exec rails db:migrate
|
42
|
+
```
|
43
|
+
|
44
|
+
Mount the engine and set up configuration:
|
45
|
+
|
46
|
+
```ruby
|
47
|
+
# config/routes.rb
|
48
|
+
Rails.application.routes.draw do
|
49
|
+
mount Tasker::Engine, at: '/tasker', as: 'tasker'
|
50
|
+
end
|
51
|
+
```
|
52
|
+
|
53
|
+
```bash
|
54
|
+
bundle exec rails tasker:setup
|
55
|
+
```
|
56
|
+
|
57
|
+
### Option 2: Generate Complete Application (v2.6.1)
|
58
|
+
|
59
|
+
Create a production-ready Rails application with Tasker integration in one command:
|
60
|
+
|
61
|
+
```bash
|
62
|
+
# Traditional setup
|
63
|
+
curl -fsSL https://raw.githubusercontent.com/tasker-systems/tasker/main/scripts/install-tasker-app.sh | bash
|
64
|
+
|
65
|
+
# Docker-based development environment
|
66
|
+
curl -fsSL https://raw.githubusercontent.com/tasker-systems/tasker/main/scripts/install-tasker-app.sh | bash -s -- \
|
67
|
+
--app-name my-tasker-app \
|
68
|
+
--docker \
|
69
|
+
--with-observability
|
70
|
+
```
|
71
|
+
|
72
|
+
Includes complete application templates for e-commerce, inventory management, and customer onboarding workflows. See [Application Generator Guide](docs/APPLICATION_GENERATOR.md) for details.
|
73
|
+
|
74
|
+
## Core Concepts
|
75
|
+
|
76
|
+
Tasker organizes workflows around these key concepts:
|
77
|
+
|
78
|
+
- **Tasks**: The overall process to be executed
|
79
|
+
- **TaskNamespaces**: Organizational hierarchy for grouping related task types
|
80
|
+
- **TaskHandlers**: Classes that define and coordinate workflow steps
|
81
|
+
- **Steps**: Individual units of work within a task
|
82
|
+
- **StepHandlers**: Classes that implement the logic for each step
|
83
|
+
- **Dependencies**: Relationships between steps that determine execution order
|
84
|
+
- **Versioning**: Semantic versioning support for task handlers with coexistence
|
85
|
+
|
86
|
+
### TaskNamespace Organization
|
87
|
+
|
88
|
+
Tasker supports organizing task handlers into logical namespaces for better organization and isolation:
|
89
|
+
|
90
|
+
```ruby
|
91
|
+
# Different namespaces can have tasks with the same name
|
92
|
+
payments_task = Tasker::HandlerFactory.instance.get(
|
93
|
+
'process_order',
|
94
|
+
namespace_name: 'payments',
|
95
|
+
version: '2.1.0'
|
96
|
+
)
|
97
|
+
|
98
|
+
inventory_task = Tasker::HandlerFactory.instance.get(
|
99
|
+
'process_order',
|
100
|
+
namespace_name: 'inventory',
|
101
|
+
version: '1.5.0'
|
102
|
+
)
|
103
|
+
```
|
104
|
+
|
105
|
+
Common namespace patterns:
|
106
|
+
- **`payments`** - Payment processing workflows
|
107
|
+
- **`inventory`** - Stock and inventory management
|
108
|
+
- **`notifications`** - Email, SMS, and alert workflows
|
109
|
+
- **`integrations`** - Third-party API integrations
|
110
|
+
- **`data_processing`** - ETL and data transformation workflows
|
111
|
+
- **`default`** - General-purpose workflows (used when no namespace specified)
|
112
|
+
|
113
|
+
## Simple Example: Order Processing
|
114
|
+
|
115
|
+
Create a task handler for processing orders:
|
116
|
+
|
117
|
+
```bash
|
118
|
+
rails generate tasker:task_handler OrderProcess
|
119
|
+
```
|
120
|
+
|
121
|
+
This creates a complete workflow structure:
|
122
|
+
|
123
|
+
**YAML Configuration** (`config/tasker/tasks/order_process.yaml`):
|
124
|
+
```yaml
|
125
|
+
---
|
126
|
+
name: order_process
|
127
|
+
namespace_name: default
|
128
|
+
version: 1.0.0
|
129
|
+
task_handler_class: OrderProcess
|
130
|
+
|
131
|
+
step_templates:
|
132
|
+
- name: validate_order
|
133
|
+
description: Validate order details
|
134
|
+
handler_class: OrderProcess::StepHandler::ValidateOrderHandler
|
135
|
+
|
136
|
+
- name: process_payment
|
137
|
+
description: Process payment for the order
|
138
|
+
depends_on_step: validate_order
|
139
|
+
handler_class: OrderProcess::StepHandler::ProcessPaymentHandler
|
140
|
+
default_retryable: true
|
141
|
+
default_retry_limit: 3
|
142
|
+
|
143
|
+
- name: send_confirmation
|
144
|
+
description: Send confirmation email
|
145
|
+
depends_on_step: process_payment
|
146
|
+
handler_class: OrderProcess::StepHandler::SendConfirmationHandler
|
147
|
+
```
|
148
|
+
|
149
|
+
**Step Handler Implementation**:
|
150
|
+
```ruby
|
151
|
+
module OrderProcess
|
152
|
+
module StepHandler
|
153
|
+
class ValidateOrderHandler < Tasker::StepHandler::Base
|
154
|
+
def process(task, sequence, step)
|
155
|
+
order_id = task.context['order_id']
|
156
|
+
order = Order.find(order_id)
|
157
|
+
|
158
|
+
raise "Order not found" unless order
|
159
|
+
raise "Order already processed" if order.processed?
|
160
|
+
|
161
|
+
{ order: order.as_json, valid: true }
|
162
|
+
end
|
163
|
+
end
|
164
|
+
end
|
165
|
+
end
|
166
|
+
```
|
167
|
+
|
168
|
+
**Using Your Workflow**:
|
169
|
+
```ruby
|
170
|
+
# Create and execute a task
|
171
|
+
task_request = Tasker::Types::TaskRequest.new(
|
172
|
+
name: 'order_process',
|
173
|
+
namespace: 'default', # Optional - defaults to 'default'
|
174
|
+
version: '1.0.0', # Optional - defaults to '0.1.0'
|
175
|
+
context: { order_id: 12345 }
|
176
|
+
)
|
177
|
+
|
178
|
+
# Handler lookup now supports namespace + version
|
179
|
+
handler = Tasker::HandlerFactory.instance.get(
|
180
|
+
'order_process',
|
181
|
+
namespace_name: 'default', # Optional - defaults to 'default'
|
182
|
+
version: '1.0.0' # Optional - defaults to '0.1.0'
|
183
|
+
)
|
184
|
+
task = handler.initialize_task!(task_request)
|
185
|
+
|
186
|
+
# Task is now queued for processing with automatic retry logic
|
187
|
+
```
|
188
|
+
|
189
|
+
## Advanced Features
|
190
|
+
|
191
|
+
### Authentication & Authorization
|
192
|
+
|
193
|
+
Tasker includes enterprise-grade security that works with any Rails authentication system:
|
194
|
+
|
195
|
+
```ruby
|
196
|
+
# config/initializers/tasker.rb
|
197
|
+
Tasker.configuration do |config|
|
198
|
+
config.auth do |auth|
|
199
|
+
auth.authentication_enabled = true
|
200
|
+
auth.authenticator_class = 'YourAuthenticator'
|
201
|
+
auth.authorization_enabled = true
|
202
|
+
auth.authorization_coordinator_class = 'YourAuthorizationCoordinator'
|
203
|
+
end
|
204
|
+
end
|
205
|
+
```
|
206
|
+
|
207
|
+
**Automatic GraphQL Security**: Operations are automatically mapped to permissions:
|
208
|
+
```ruby
|
209
|
+
# GraphQL query automatically requires tasker.task:index permission
|
210
|
+
query { tasks { taskId status } }
|
211
|
+
|
212
|
+
# GraphQL mutation automatically requires tasker.task:create permission
|
213
|
+
mutation { createTask(input: { name: "New Task" }) { taskId } }
|
214
|
+
```
|
215
|
+
|
216
|
+
### REST API & Handler Discovery
|
217
|
+
|
218
|
+
Tasker provides comprehensive REST API endpoints for handler discovery, task management, and dependency graph analysis:
|
219
|
+
|
220
|
+
**Handler Discovery API**:
|
221
|
+
```bash
|
222
|
+
# List all namespaces with handler counts
|
223
|
+
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
|
224
|
+
https://your-app.com/tasker/handlers
|
225
|
+
|
226
|
+
# List handlers in specific namespace
|
227
|
+
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
|
228
|
+
https://your-app.com/tasker/handlers/payments
|
229
|
+
|
230
|
+
# Get handler details with dependency graph
|
231
|
+
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
|
232
|
+
https://your-app.com/tasker/handlers/payments/process_order?version=2.1.0
|
233
|
+
```
|
234
|
+
|
235
|
+
**Response includes dependency graph visualization**:
|
236
|
+
```json
|
237
|
+
{
|
238
|
+
"id": "process_order",
|
239
|
+
"namespace": "payments",
|
240
|
+
"version": "2.1.0",
|
241
|
+
"step_templates": [...],
|
242
|
+
"dependency_graph": {
|
243
|
+
"nodes": ["validate_order", "process_payment", "send_confirmation"],
|
244
|
+
"edges": [
|
245
|
+
{"from": "validate_order", "to": "process_payment"},
|
246
|
+
{"from": "process_payment", "to": "send_confirmation"}
|
247
|
+
],
|
248
|
+
"execution_order": ["validate_order", "process_payment", "send_confirmation"]
|
249
|
+
}
|
250
|
+
}
|
251
|
+
```
|
252
|
+
|
253
|
+
**Task Management API**:
|
254
|
+
```bash
|
255
|
+
# Create task with namespace/version support
|
256
|
+
curl -X POST -H "Authorization: Bearer YOUR_JWT_TOKEN" \
|
257
|
+
-H "Content-Type: application/json" \
|
258
|
+
-d '{"name": "process_order", "namespace": "payments", "version": "2.1.0", "context": {"order_id": 123}}' \
|
259
|
+
https://your-app.com/tasker/tasks
|
260
|
+
|
261
|
+
# List tasks with namespace filtering
|
262
|
+
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
|
263
|
+
"https://your-app.com/tasker/tasks?namespace=payments&version=2.1.0"
|
264
|
+
```
|
265
|
+
|
266
|
+
### Event System & Integrations
|
267
|
+
|
268
|
+
Tasker provides comprehensive event-driven observability for custom integrations:
|
269
|
+
|
270
|
+
```ruby
|
271
|
+
class OrderEventsSubscriber < Tasker::Events::Subscribers::BaseSubscriber
|
272
|
+
subscribe_to 'task.completed', 'task.failed'
|
273
|
+
|
274
|
+
def handle_task_completed(event)
|
275
|
+
task_id = safe_get(event, :task_id)
|
276
|
+
NotificationService.send_success_email(task_id: task_id)
|
277
|
+
end
|
278
|
+
|
279
|
+
def handle_task_failed(event)
|
280
|
+
task_id = safe_get(event, :task_id)
|
281
|
+
error_message = safe_get(event, :error_message)
|
282
|
+
AlertService.send_failure_alert(task_id: task_id, error: error_message)
|
283
|
+
end
|
284
|
+
end
|
285
|
+
```
|
286
|
+
|
287
|
+
### Telemetry & Observability
|
288
|
+
|
289
|
+
Built-in OpenTelemetry integration provides complete observability:
|
290
|
+
|
291
|
+
```ruby
|
292
|
+
# config/initializers/tasker.rb
|
293
|
+
Tasker.configuration do |config|
|
294
|
+
config.telemetry do |tel|
|
295
|
+
tel.enabled = true
|
296
|
+
tel.service_name = 'my-app-workflows'
|
297
|
+
tel.service_version = '1.0.0'
|
298
|
+
end
|
299
|
+
end
|
300
|
+
```
|
301
|
+
|
302
|
+
Compatible with Jaeger, Zipkin, Honeycomb, and other OpenTelemetry-compatible tools.
|
303
|
+
|
304
|
+
### Registry System Architecture
|
305
|
+
|
306
|
+
Tasker features enterprise-grade registry systems with thread-safe operations and comprehensive observability:
|
307
|
+
|
308
|
+
**Thread-Safe Registries**:
|
309
|
+
- **HandlerFactory**: Thread-safe task handler registration with `Concurrent::Hash` storage
|
310
|
+
- **PluginRegistry**: Format-based plugin discovery with auto-discovery capabilities
|
311
|
+
- **SubscriberRegistry**: Event subscriber management with structured logging
|
312
|
+
|
313
|
+
**Advanced Features**:
|
314
|
+
- **Structured Logging**: Correlation IDs and JSON formatting for comprehensive observability
|
315
|
+
- **Interface Validation**: Fail-fast validation with detailed error messages
|
316
|
+
- **Replace Operations**: Conflict resolution with `replace: true` parameter
|
317
|
+
- **Event Integration**: Registry operations fully integrated with the 56-event system
|
318
|
+
|
319
|
+
**Production Benefits**:
|
320
|
+
```ruby
|
321
|
+
# Thread-safe operations with structured logging
|
322
|
+
Tasker::HandlerFactory.instance.register(
|
323
|
+
'order_processor',
|
324
|
+
OrderHandler,
|
325
|
+
namespace_name: 'payments',
|
326
|
+
version: '2.1.0',
|
327
|
+
replace: true # Handles conflicts gracefully
|
328
|
+
)
|
329
|
+
|
330
|
+
# Automatic structured logging with correlation IDs
|
331
|
+
# {"timestamp":"2024-01-15T10:30:45Z","correlation_id":"tsk_abc123","component":"handler_factory","message":"Registry item registered","entity_id":"payments/order_processor/2.1.0","event_type":"registered"}
|
332
|
+
```
|
333
|
+
|
334
|
+
### Health Monitoring & Production Readiness
|
335
|
+
|
336
|
+
Tasker provides enterprise-grade health endpoints for production deployments:
|
337
|
+
|
338
|
+
```ruby
|
339
|
+
# Kubernetes readiness probe - checks database connectivity
|
340
|
+
GET /tasker/health/ready
|
341
|
+
|
342
|
+
# Kubernetes liveness probe - lightweight health check
|
343
|
+
GET /tasker/health/live
|
344
|
+
|
345
|
+
# Detailed status endpoint - comprehensive system metrics
|
346
|
+
GET /tasker/health/status
|
347
|
+
```
|
348
|
+
|
349
|
+
**Optional Authentication & Authorization**:
|
350
|
+
```ruby
|
351
|
+
# config/initializers/tasker.rb
|
352
|
+
Tasker.configuration do |config|
|
353
|
+
config.health do |health|
|
354
|
+
health.status_requires_authentication = true # Secure detailed status
|
355
|
+
end
|
356
|
+
|
357
|
+
config.auth do |auth|
|
358
|
+
auth.authorization_enabled = true
|
359
|
+
# Status endpoint requires tasker.health_status:index permission
|
360
|
+
end
|
361
|
+
end
|
362
|
+
```
|
363
|
+
|
364
|
+
**Performance Optimized**: Uses SQL functions and 15-second caching for sub-100ms response times.
|
365
|
+
|
366
|
+
## Key Benefits
|
367
|
+
|
368
|
+
### For Developers
|
369
|
+
- **Quick Setup**: Working workflows in minutes with generators
|
370
|
+
- **Clear Structure**: YAML configuration with Ruby implementation
|
371
|
+
- **Comprehensive Testing**: Built-in test infrastructure and patterns
|
372
|
+
- **Rich Documentation**: Extensive guides and examples
|
373
|
+
|
374
|
+
### For Operations
|
375
|
+
- **Production Ready**: Battle-tested retry logic and error handling
|
376
|
+
- **Health Monitoring**: Enterprise-grade health endpoints for K8s and load balancers
|
377
|
+
- **Observable**: Complete event system with telemetry integration
|
378
|
+
- **Secure**: Enterprise-grade authentication and authorization
|
379
|
+
- **Performant**: SQL-function based orchestration with proven performance
|
380
|
+
- **Thread-Safe**: Concurrent registry operations with structured logging and correlation IDs
|
381
|
+
- **Reliable**: 100% test coverage with comprehensive validation and error handling
|
382
|
+
|
383
|
+
### For Business
|
384
|
+
- **Reliable**: Automatic retry with exponential backoff
|
385
|
+
- **Scalable**: Handles complex workflows with multiple dependencies
|
386
|
+
- **Maintainable**: Clear separation of concerns and documented patterns
|
387
|
+
- **Extensible**: Event system enables custom integrations
|
388
|
+
|
389
|
+
## What's Next?
|
390
|
+
|
391
|
+
### 🚀 Get Started Quickly
|
392
|
+
- **[Quick Start Guide](docs/QUICK_START.md)** - Build your first workflow in 15 minutes
|
393
|
+
- **[Developer Guide](docs/DEVELOPER_GUIDE.md)** - Comprehensive implementation guide
|
394
|
+
- **[Examples](spec/examples/)** - Real-world workflow patterns and implementations
|
395
|
+
|
396
|
+
### 🔧 Advanced Topics
|
397
|
+
- **[REST API Guide](docs/REST_API.md)** - Complete REST API documentation with handler discovery
|
398
|
+
- **[Registry Systems](docs/REGISTRY_SYSTEMS.md)** - Thread-safe registry architecture and structured logging
|
399
|
+
- **[Authentication & Authorization](docs/AUTH.md)** - Complete security system
|
400
|
+
- **[Health Monitoring](docs/HEALTH.md)** - Production health endpoints and monitoring
|
401
|
+
- **[Event System](docs/EVENT_SYSTEM.md)** - Observability and integrations
|
402
|
+
- **[Telemetry](docs/TELEMETRY.md)** - OpenTelemetry setup and monitoring
|
403
|
+
- **[Performance](docs/SQL_FUNCTIONS.md)** - High-performance SQL functions
|
404
|
+
- **[Circuit Breaker](docs/CIRCUIT_BREAKER.md)** - Distributed, SQL-driven retry architecture
|
405
|
+
|
406
|
+
### 📚 Additional Resources
|
407
|
+
- **[Application Generator](docs/APPLICATION_GENERATOR.md)** - One-line app creation with Docker support and validation
|
408
|
+
- **[System Overview](docs/OVERVIEW.md)** - Architecture and configuration
|
409
|
+
- **[Task Diagrams](docs/TASK_DIAGRAM.md)** - Visual workflow representation
|
410
|
+
- **[Troubleshooting](docs/TROUBLESHOOTING.md)** - Common issues and solutions
|
411
|
+
|
412
|
+
## Requirements & Dependencies
|
413
|
+
|
414
|
+
- **Ruby**: 3.2+
|
415
|
+
- **Rails**: 7.2+
|
416
|
+
- **Database**: PostgreSQL (required for SQL functions)
|
417
|
+
- **Background Jobs**: Compatible with ActiveJob (Sidekiq recommended)
|
418
|
+
|
419
|
+
## Development & Testing
|
420
|
+
|
421
|
+
```bash
|
422
|
+
# Set up development environment
|
423
|
+
bundle install
|
424
|
+
bundle exec rake db:schema:load
|
425
|
+
|
426
|
+
# Run tests
|
427
|
+
bundle exec rspec spec
|
428
|
+
|
429
|
+
# Run linter
|
430
|
+
bundle exec rubocop
|
431
|
+
```
|
432
|
+
|
433
|
+
## Contributing
|
434
|
+
|
435
|
+
We welcome contributions! Please see our [development guidelines](docs/DEVELOPER_GUIDE.md) for information on setting up your development environment and our coding standards.
|
436
|
+
|
437
|
+
## License
|
438
|
+
|
439
|
+
The gem is available as open source under the terms of the [MIT License](./LICENSE).
|
440
|
+
|
441
|
+
---
|
442
|
+
|
443
|
+
**Tasker** transforms complex workflows into reliable, observable processes. Focus on your business logic while Tasker handles the orchestration complexity.
|
data/Rakefile
ADDED
@@ -0,0 +1,179 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_dependency 'tasker/application_controller'
|
4
|
+
|
5
|
+
module Tasker
|
6
|
+
# Analytics controller providing performance and bottleneck analysis endpoints.
|
7
|
+
#
|
8
|
+
# This controller provides analytics endpoints:
|
9
|
+
# - `/analytics/performance` - System-wide performance metrics with caching
|
10
|
+
# - `/analytics/bottlenecks` - Bottleneck analysis scoped by task/version/namespace
|
11
|
+
#
|
12
|
+
# All endpoints use the authorization system with appropriate permissions.
|
13
|
+
# If authorization is disabled, access is allowed. If enabled, users need
|
14
|
+
# the corresponding analytics permissions.
|
15
|
+
#
|
16
|
+
# Analytics calculations are handled by Tasker::AnalyticsService for better
|
17
|
+
# separation of concerns.
|
18
|
+
class AnalyticsController < ApplicationController
|
19
|
+
# Set cache headers to prevent default caching (we use intelligent caching)
|
20
|
+
before_action :set_cache_headers
|
21
|
+
|
22
|
+
# Initialize intelligent cache for expensive analytics operations
|
23
|
+
before_action :set_intelligent_cache
|
24
|
+
|
25
|
+
# Performance analytics endpoint with intelligent caching
|
26
|
+
# Provides system-wide performance metrics and trends
|
27
|
+
#
|
28
|
+
# @return [JSON] Performance metrics and analytics
|
29
|
+
def performance
|
30
|
+
cache_key = "tasker:analytics:performance:#{performance_cache_version}"
|
31
|
+
|
32
|
+
cached_result = @intelligent_cache.intelligent_fetch(cache_key, base_ttl: 90.seconds) do
|
33
|
+
performance_analytics = Tasker::AnalyticsService.calculate_performance_analytics
|
34
|
+
|
35
|
+
{
|
36
|
+
**performance_analytics.to_h,
|
37
|
+
cache_info: {
|
38
|
+
cached: true,
|
39
|
+
cache_key: cache_key,
|
40
|
+
ttl_base: '90 seconds'
|
41
|
+
}
|
42
|
+
}
|
43
|
+
end
|
44
|
+
|
45
|
+
render json: cached_result, status: :ok
|
46
|
+
rescue StandardError => e
|
47
|
+
render json: {
|
48
|
+
error: 'Performance analytics failed',
|
49
|
+
message: e.message,
|
50
|
+
timestamp: Time.current.iso8601
|
51
|
+
}, status: :service_unavailable
|
52
|
+
end
|
53
|
+
|
54
|
+
# Bottleneck analysis endpoint scoped by task parameters
|
55
|
+
# Provides bottleneck analysis for specific task contexts
|
56
|
+
#
|
57
|
+
# Query parameters:
|
58
|
+
# - namespace: Filter by task namespace (optional)
|
59
|
+
# - name: Filter by task name (optional)
|
60
|
+
# - version: Filter by task version (optional)
|
61
|
+
# - period: Analysis period in hours (default: 24)
|
62
|
+
#
|
63
|
+
# @return [JSON] Bottleneck analysis for specified scope
|
64
|
+
def bottlenecks
|
65
|
+
# Extract and validate scope parameters
|
66
|
+
scope_params = extract_scope_parameters
|
67
|
+
analysis_period = params[:period]&.to_i || 24
|
68
|
+
|
69
|
+
# Generate cache key based on scope and period
|
70
|
+
cache_key = "tasker:analytics:bottlenecks:#{bottlenecks_cache_version(scope_params, analysis_period)}"
|
71
|
+
|
72
|
+
cached_result = @intelligent_cache.intelligent_fetch(cache_key, base_ttl: 2.minutes) do
|
73
|
+
bottleneck_analytics = Tasker::AnalyticsService.calculate_bottleneck_analytics(
|
74
|
+
scope_params,
|
75
|
+
analysis_period
|
76
|
+
)
|
77
|
+
|
78
|
+
{
|
79
|
+
**bottleneck_analytics.to_h,
|
80
|
+
cache_info: {
|
81
|
+
cached: true,
|
82
|
+
cache_key: cache_key,
|
83
|
+
ttl_base: '2 minutes'
|
84
|
+
}
|
85
|
+
}
|
86
|
+
end
|
87
|
+
|
88
|
+
render json: cached_result, status: :ok
|
89
|
+
rescue StandardError => e
|
90
|
+
render json: {
|
91
|
+
error: 'Bottleneck analysis failed',
|
92
|
+
message: e.message,
|
93
|
+
scope: extract_scope_parameters,
|
94
|
+
timestamp: Time.current.iso8601
|
95
|
+
}, status: :service_unavailable
|
96
|
+
end
|
97
|
+
|
98
|
+
private
|
99
|
+
|
100
|
+
def set_intelligent_cache
|
101
|
+
@intelligent_cache = Tasker::Telemetry::IntelligentCacheManager.new
|
102
|
+
end
|
103
|
+
|
104
|
+
# Extract and validate scope parameters for bottleneck analysis
|
105
|
+
#
|
106
|
+
# @return [Hash] Validated scope parameters
|
107
|
+
def extract_scope_parameters
|
108
|
+
scope = {}
|
109
|
+
scope[:namespace] = params[:namespace] if params[:namespace].present?
|
110
|
+
scope[:name] = params[:name] if params[:name].present?
|
111
|
+
scope[:version] = params[:version] if params[:version].present?
|
112
|
+
scope
|
113
|
+
end
|
114
|
+
|
115
|
+
# Generate cache version for performance analytics
|
116
|
+
#
|
117
|
+
# @return [String] Cache version that changes when system state changes
|
118
|
+
def performance_cache_version
|
119
|
+
current_10min_interval = "#{Time.current.strftime('%Y%m%d%H%M')[0..-2]}0" # Round to 10-minute intervals
|
120
|
+
|
121
|
+
# Include recent activity indicators for cache invalidation
|
122
|
+
recent_tasks = Task.created_since(30.minutes.ago).count
|
123
|
+
recent_completions = WorkflowStep.completed_since(30.minutes.ago).count
|
124
|
+
|
125
|
+
"v1:#{current_10min_interval}:#{recent_tasks}:#{recent_completions}"
|
126
|
+
end
|
127
|
+
|
128
|
+
# Generate cache version for bottleneck analysis
|
129
|
+
#
|
130
|
+
# @param scope_params [Hash] Scope parameters for the analysis
|
131
|
+
# @param period [Integer] Analysis period in hours
|
132
|
+
# @return [String] Cache version for bottleneck analysis
|
133
|
+
def bottlenecks_cache_version(scope_params, period)
|
134
|
+
current_10min_interval = "#{Time.current.strftime('%Y%m%d%H%M')[0..-2]}0" # Round to 10-minute intervals
|
135
|
+
scope_hash = scope_params.values.join('_').presence || 'all'
|
136
|
+
|
137
|
+
"v1:#{current_10min_interval}:#{scope_hash}:#{period}h"
|
138
|
+
end
|
139
|
+
|
140
|
+
# Override the resource name for authorization
|
141
|
+
# Maps analytics actions to analytics resource
|
142
|
+
#
|
143
|
+
# @return [String] The resource name for authorization
|
144
|
+
def tasker_resource_name
|
145
|
+
Tasker::Authorization::ResourceConstants::RESOURCES::ANALYTICS
|
146
|
+
end
|
147
|
+
|
148
|
+
# Override the action name for authorization
|
149
|
+
# Maps all actions to index permission for analytics
|
150
|
+
#
|
151
|
+
# @return [Symbol] The action name for authorization
|
152
|
+
def tasker_action_name
|
153
|
+
Tasker::Authorization::ResourceConstants::ACTIONS::INDEX
|
154
|
+
end
|
155
|
+
|
156
|
+
# Override authentication check for analytics endpoint
|
157
|
+
# Uses telemetry configuration for consistency with metrics
|
158
|
+
#
|
159
|
+
# @return [Boolean] True if authentication should be skipped
|
160
|
+
def skip_authentication?
|
161
|
+
!Tasker.configuration.telemetry.metrics_auth_required
|
162
|
+
end
|
163
|
+
|
164
|
+
# Override authorization check for analytics endpoint
|
165
|
+
# Uses telemetry configuration for consistency with metrics
|
166
|
+
#
|
167
|
+
# @return [Boolean] True if authorization should be skipped
|
168
|
+
def skip_authorization?
|
169
|
+
!Tasker.configuration.telemetry.metrics_auth_required
|
170
|
+
end
|
171
|
+
|
172
|
+
# Set appropriate cache control headers for analytics endpoints
|
173
|
+
def set_cache_headers
|
174
|
+
response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
|
175
|
+
response.headers['Pragma'] = 'no-cache'
|
176
|
+
response.headers['Expires'] = '0'
|
177
|
+
end
|
178
|
+
end
|
179
|
+
end
|