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,186 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'concurrent-ruby'
|
4
|
+
require 'singleton'
|
5
|
+
|
6
|
+
module Tasker
|
7
|
+
module Telemetry
|
8
|
+
# TraceBackend provides thread-safe trace event collection and routing
|
9
|
+
#
|
10
|
+
# This class implements Tasker's core tracing system with thread-safe operations,
|
11
|
+
# automatic EventRouter integration, and support for distributed tracing backends
|
12
|
+
# like Jaeger, Zipkin, or OpenTelemetry.
|
13
|
+
#
|
14
|
+
# The backend follows the same singleton pattern as MetricsBackend for consistency
|
15
|
+
# and provides structured trace data collection with span hierarchy support.
|
16
|
+
#
|
17
|
+
# @example Basic usage
|
18
|
+
# backend = TraceBackend.instance
|
19
|
+
# backend.start_span('task.execution', { task_id: '123' })
|
20
|
+
# backend.finish_span('task.execution', { status: 'success' })
|
21
|
+
#
|
22
|
+
# @example EventRouter integration
|
23
|
+
# # Automatic trace collection based on event routing
|
24
|
+
# backend.handle_event('task.started', { task_id: '123', context: { user_id: 456 } })
|
25
|
+
#
|
26
|
+
class TraceBackend
|
27
|
+
include Singleton
|
28
|
+
|
29
|
+
# Core trace storage for active spans
|
30
|
+
# Using ConcurrentHash for thread-safe operations without locks
|
31
|
+
# @return [Concurrent::Hash] Thread-safe trace storage
|
32
|
+
attr_reader :traces
|
33
|
+
|
34
|
+
# Backend creation timestamp for monitoring
|
35
|
+
# @return [Time] When this backend was initialized
|
36
|
+
attr_reader :created_at
|
37
|
+
|
38
|
+
def initialize
|
39
|
+
@traces = Concurrent::Hash.new
|
40
|
+
@created_at = Time.current
|
41
|
+
@instance_id = Socket.gethostname
|
42
|
+
end
|
43
|
+
|
44
|
+
# Handle an event from EventRouter and collect appropriate trace data
|
45
|
+
#
|
46
|
+
# This method is called by EventRouter when an event should be routed to
|
47
|
+
# the trace backend. It automatically creates trace spans based on event
|
48
|
+
# type and payload.
|
49
|
+
#
|
50
|
+
# @param event_name [String] The lifecycle event name
|
51
|
+
# @param payload [Hash] Event payload with trace data
|
52
|
+
# @return [Boolean] True if trace data was collected successfully
|
53
|
+
#
|
54
|
+
# @example Automatic usage via EventRouter
|
55
|
+
# # EventRouter calls this automatically:
|
56
|
+
# backend.handle_event('task.started', {
|
57
|
+
# task_id: '123',
|
58
|
+
# operation: 'process_payment',
|
59
|
+
# context: { user_id: 456, session_id: 'abc' }
|
60
|
+
# })
|
61
|
+
#
|
62
|
+
def handle_event(event_name, payload = {})
|
63
|
+
return false unless payload.is_a?(Hash)
|
64
|
+
|
65
|
+
trace_data = {
|
66
|
+
event_name: event_name,
|
67
|
+
timestamp: Time.current.iso8601,
|
68
|
+
payload: payload,
|
69
|
+
instance_id: @instance_id
|
70
|
+
}
|
71
|
+
|
72
|
+
case event_name
|
73
|
+
when /\.started$/
|
74
|
+
handle_start_event(trace_data)
|
75
|
+
when /\.completed$/, /\.failed$/
|
76
|
+
handle_finish_event(trace_data)
|
77
|
+
when /\.before_/, /\.after_/
|
78
|
+
handle_span_event(trace_data)
|
79
|
+
else
|
80
|
+
handle_generic_event(trace_data)
|
81
|
+
end
|
82
|
+
|
83
|
+
true
|
84
|
+
rescue StandardError => e
|
85
|
+
# Log error but don't raise to prevent breaking the event flow
|
86
|
+
Rails.logger&.error("TraceBackend error handling #{event_name}: #{e.message}")
|
87
|
+
false
|
88
|
+
end
|
89
|
+
|
90
|
+
# Export all collected trace data
|
91
|
+
#
|
92
|
+
# @return [Hash] All trace data with metadata
|
93
|
+
def export
|
94
|
+
{
|
95
|
+
traces: @traces.transform_values(&:dup),
|
96
|
+
metadata: {
|
97
|
+
backend: 'trace',
|
98
|
+
instance_id: @instance_id,
|
99
|
+
created_at: @created_at.iso8601,
|
100
|
+
exported_at: Time.current.iso8601,
|
101
|
+
trace_count: @traces.size
|
102
|
+
}
|
103
|
+
}
|
104
|
+
end
|
105
|
+
|
106
|
+
# Clear all trace data (primarily for testing)
|
107
|
+
#
|
108
|
+
# @return [void]
|
109
|
+
def reset!
|
110
|
+
@traces.clear
|
111
|
+
end
|
112
|
+
|
113
|
+
# Get trace statistics
|
114
|
+
#
|
115
|
+
# @return [Hash] Statistics about collected traces
|
116
|
+
def stats
|
117
|
+
{
|
118
|
+
active_traces: @traces.size,
|
119
|
+
backend_uptime: Time.current - @created_at,
|
120
|
+
instance_id: @instance_id
|
121
|
+
}
|
122
|
+
end
|
123
|
+
|
124
|
+
private
|
125
|
+
|
126
|
+
def handle_start_event(trace_data)
|
127
|
+
trace_key = extract_trace_key(trace_data[:payload])
|
128
|
+
@traces[trace_key] = {
|
129
|
+
start_time: trace_data[:timestamp],
|
130
|
+
event_name: trace_data[:event_name],
|
131
|
+
payload: trace_data[:payload],
|
132
|
+
spans: []
|
133
|
+
}
|
134
|
+
end
|
135
|
+
|
136
|
+
def handle_finish_event(trace_data)
|
137
|
+
trace_key = extract_trace_key(trace_data[:payload])
|
138
|
+
if (trace = @traces[trace_key])
|
139
|
+
trace[:end_time] = trace_data[:timestamp]
|
140
|
+
trace[:duration] = calculate_duration(trace[:start_time], trace_data[:timestamp])
|
141
|
+
trace[:status] = trace_data[:event_name].include?('failed') ? 'error' : 'success'
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
def handle_span_event(trace_data)
|
146
|
+
trace_key = extract_trace_key(trace_data[:payload])
|
147
|
+
if (trace = @traces[trace_key])
|
148
|
+
trace[:spans] << {
|
149
|
+
timestamp: trace_data[:timestamp],
|
150
|
+
event_name: trace_data[:event_name],
|
151
|
+
payload: trace_data[:payload]
|
152
|
+
}
|
153
|
+
end
|
154
|
+
end
|
155
|
+
|
156
|
+
def handle_generic_event(trace_data)
|
157
|
+
# Store generic events in a special traces collection
|
158
|
+
@traces["generic_#{Time.current.to_f}"] = {
|
159
|
+
timestamp: trace_data[:timestamp],
|
160
|
+
event_name: trace_data[:event_name],
|
161
|
+
payload: trace_data[:payload],
|
162
|
+
type: 'generic'
|
163
|
+
}
|
164
|
+
end
|
165
|
+
|
166
|
+
def extract_trace_key(payload)
|
167
|
+
# Create a trace key from task_id, workflow_step_id, or other identifiers
|
168
|
+
return "task_#{payload[:task_id]}" if payload[:task_id]
|
169
|
+
return "step_#{payload[:workflow_step_id]}" if payload[:workflow_step_id]
|
170
|
+
return "operation_#{payload[:operation]}" if payload[:operation]
|
171
|
+
|
172
|
+
"trace_#{Time.current.to_f}"
|
173
|
+
end
|
174
|
+
|
175
|
+
def calculate_duration(start_time, end_time)
|
176
|
+
return nil unless start_time && end_time
|
177
|
+
|
178
|
+
start_parsed = Time.zone.parse(start_time)
|
179
|
+
end_parsed = Time.zone.parse(end_time)
|
180
|
+
(end_parsed - start_parsed).round(6)
|
181
|
+
rescue StandardError
|
182
|
+
nil
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Tasker::Telemetry namespace for intelligent event-driven telemetry routing
|
4
|
+
#
|
5
|
+
# This module provides the strategic evolution of Tasker's telemetry architecture,
|
6
|
+
# transforming the existing solid TelemetrySubscriber foundation into a comprehensive,
|
7
|
+
# event-driven observability system that leverages our robust 40+ event pub/sub model.
|
8
|
+
#
|
9
|
+
# Components:
|
10
|
+
# - EventRouter: Intelligent routing core for event→telemetry mapping
|
11
|
+
# - EventMapping: Declarative configuration for routing decisions
|
12
|
+
# - MetricTypes: Counter, Gauge, Histogram with atomic thread-safe operations
|
13
|
+
# - MetricsBackend: Thread-safe native metrics collection with EventRouter integration
|
14
|
+
# - SubscriberEnhancer: Evolution wrapper for existing TelemetrySubscriber (Phase 4.2.3)
|
15
|
+
#
|
16
|
+
# Core Philosophy: PRESERVE all existing TelemetrySubscriber functionality while
|
17
|
+
# dramatically expanding observability through intelligent event routing.
|
18
|
+
#
|
19
|
+
# Usage:
|
20
|
+
# # Configure intelligent event routing
|
21
|
+
# Tasker::Telemetry::EventRouter.configure do |router|
|
22
|
+
# router.map 'task.completed' => [:trace, :metrics]
|
23
|
+
# router.map 'workflow.viable_steps_discovered' => [:trace, :metrics]
|
24
|
+
# router.map 'observability.task.enqueue' => [:metrics]
|
25
|
+
# end
|
26
|
+
#
|
27
|
+
# # Direct metrics collection with thread-safe operations
|
28
|
+
# backend = Tasker::Telemetry::MetricsBackend.instance
|
29
|
+
# backend.counter('api_requests_total', endpoint: '/tasks').increment
|
30
|
+
# backend.gauge('active_connections').set(42)
|
31
|
+
# backend.histogram('request_duration_seconds').observe(0.125)
|
32
|
+
#
|
33
|
+
# # Automatic event-driven metrics via EventRouter integration
|
34
|
+
# router.route_event('task.completed', { task_id: '123', duration: 2.5 })
|
35
|
+
#
|
36
|
+
# # Evolution of existing TelemetrySubscriber (zero breaking changes)
|
37
|
+
# enhanced_subscriber = Tasker::Telemetry::SubscriberEnhancer.new # Phase 4.2.3
|
38
|
+
# enhanced_subscriber.subscribe_to_publisher(publisher)
|
39
|
+
|
40
|
+
# Explicitly require telemetry components for predictable loading
|
41
|
+
require_relative 'telemetry/metric_types'
|
42
|
+
require_relative 'telemetry/event_mapping'
|
43
|
+
require_relative 'telemetry/event_router'
|
44
|
+
require_relative 'telemetry/metrics_backend'
|
45
|
+
require_relative 'telemetry/trace_backend'
|
46
|
+
require_relative 'telemetry/log_backend'
|
47
|
+
require_relative 'telemetry/prometheus_exporter'
|
48
|
+
require_relative 'telemetry/export_coordinator'
|
49
|
+
require_relative 'telemetry/plugin_registry'
|
50
|
+
|
51
|
+
# Require the MetricsSubscriber for automatic event-to-metrics bridging
|
52
|
+
require_relative 'events/subscribers/metrics_subscriber'
|
53
|
+
|
54
|
+
module Tasker
|
55
|
+
module Telemetry
|
56
|
+
# All telemetry components are now explicitly loaded above
|
57
|
+
# This provides predictable loading order and avoids autoload complexity
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,81 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tasker
|
4
|
+
module Types
|
5
|
+
# Configuration type for authentication and authorization settings
|
6
|
+
#
|
7
|
+
# This configuration handles all authentication and authorization settings for Tasker.
|
8
|
+
# It provides the same functionality as the original AuthConfiguration but with
|
9
|
+
# dry-struct type safety and immutability.
|
10
|
+
#
|
11
|
+
# @example Basic authentication setup
|
12
|
+
# config = AuthConfig.new(
|
13
|
+
# authentication_enabled: true,
|
14
|
+
# authenticator_class: 'MyAuthenticator',
|
15
|
+
# strategy: :custom
|
16
|
+
# )
|
17
|
+
#
|
18
|
+
# @example Full configuration
|
19
|
+
# config = AuthConfig.new(
|
20
|
+
# authentication_enabled: true,
|
21
|
+
# authenticator_class: 'JwtAuthenticator',
|
22
|
+
# current_user_method: :current_user,
|
23
|
+
# authenticate_user_method: :authenticate_user!,
|
24
|
+
# authorization_enabled: true,
|
25
|
+
# authorization_coordinator_class: 'MyAuthorizationCoordinator',
|
26
|
+
# user_class: 'User',
|
27
|
+
# strategy: :custom
|
28
|
+
# )
|
29
|
+
class AuthConfig < BaseConfig
|
30
|
+
transform_keys(&:to_sym)
|
31
|
+
|
32
|
+
# Whether authentication is enabled
|
33
|
+
#
|
34
|
+
# @!attribute [r] authentication_enabled
|
35
|
+
# @return [Boolean] Whether authentication is enabled
|
36
|
+
attribute :authentication_enabled, Types::Bool.default(false)
|
37
|
+
|
38
|
+
# Class name for the authenticator (nil means no authentication)
|
39
|
+
#
|
40
|
+
# @!attribute [r] authenticator_class
|
41
|
+
# @return [String, nil] Class name for the authenticator
|
42
|
+
attribute? :authenticator_class, Types::String.optional.default(nil)
|
43
|
+
|
44
|
+
# Method name to get the current user
|
45
|
+
#
|
46
|
+
# @!attribute [r] current_user_method
|
47
|
+
# @return [Symbol] Method name to get the current user
|
48
|
+
attribute :current_user_method, Types::Symbol.default(:current_user)
|
49
|
+
|
50
|
+
# Method name to authenticate the user
|
51
|
+
#
|
52
|
+
# @!attribute [r] authenticate_user_method
|
53
|
+
# @return [Symbol] Method name to authenticate the user
|
54
|
+
attribute :authenticate_user_method, Types::Symbol.default(:authenticate_user!)
|
55
|
+
|
56
|
+
# Whether authorization is enabled
|
57
|
+
#
|
58
|
+
# @!attribute [r] authorization_enabled
|
59
|
+
# @return [Boolean] Whether authorization is enabled
|
60
|
+
attribute :authorization_enabled, Types::Bool.default(false)
|
61
|
+
|
62
|
+
# Class name for the authorization coordinator
|
63
|
+
#
|
64
|
+
# @!attribute [r] authorization_coordinator_class
|
65
|
+
# @return [String] Class name for the authorization coordinator
|
66
|
+
attribute :authorization_coordinator_class, Types::String.default('Tasker::Authorization::BaseCoordinator')
|
67
|
+
|
68
|
+
# Class name for the authorizable user class
|
69
|
+
#
|
70
|
+
# @!attribute [r] user_class
|
71
|
+
# @return [String, nil] Class name for the authorizable user class
|
72
|
+
attribute? :user_class, Types::String.optional.default(nil)
|
73
|
+
|
74
|
+
# Authentication strategy (:none, :test, :custom, etc.)
|
75
|
+
#
|
76
|
+
# @!attribute [r] strategy
|
77
|
+
# @return [Symbol] Authentication strategy
|
78
|
+
attribute :strategy, Types::Symbol.default(:none)
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
@@ -0,0 +1,142 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Tasker
|
4
|
+
module Types
|
5
|
+
# Configuration type for retry backoff calculation settings
|
6
|
+
#
|
7
|
+
# This configuration exposes previously hardcoded backoff timing constants
|
8
|
+
# used in retry logic and exponential backoff calculations.
|
9
|
+
#
|
10
|
+
# @example Basic usage
|
11
|
+
# config = BackoffConfig.new(
|
12
|
+
# max_backoff_seconds: 120
|
13
|
+
# )
|
14
|
+
#
|
15
|
+
# @example With custom backoff progression
|
16
|
+
# config = BackoffConfig.new(
|
17
|
+
# default_backoff_seconds: [1, 2, 5, 10, 20, 60],
|
18
|
+
# max_backoff_seconds: 300,
|
19
|
+
# backoff_multiplier: 2.5,
|
20
|
+
# jitter_enabled: true,
|
21
|
+
# jitter_max_percentage: 0.15
|
22
|
+
# )
|
23
|
+
class BackoffConfig < BaseConfig
|
24
|
+
transform_keys(&:to_sym)
|
25
|
+
|
26
|
+
# Default backoff progression in seconds
|
27
|
+
#
|
28
|
+
# This array defines the backoff progression for retries.
|
29
|
+
# Each element represents the backoff time for that attempt number.
|
30
|
+
# If more attempts are made than elements in this array,
|
31
|
+
# the exponential backoff calculation takes over.
|
32
|
+
#
|
33
|
+
# @!attribute [r] default_backoff_seconds
|
34
|
+
# @return [Array<Integer>] Backoff progression in seconds
|
35
|
+
attribute :default_backoff_seconds, Types::Array.of(Types::Integer)
|
36
|
+
.default([1, 2, 4, 8, 16, 32].freeze)
|
37
|
+
|
38
|
+
# Maximum backoff time in seconds
|
39
|
+
#
|
40
|
+
# This value caps the exponential backoff calculation to prevent
|
41
|
+
# excessively long delays between retry attempts.
|
42
|
+
#
|
43
|
+
# @!attribute [r] max_backoff_seconds
|
44
|
+
# @return [Integer] Maximum backoff time in seconds
|
45
|
+
attribute :max_backoff_seconds, Types::Integer.default(300)
|
46
|
+
|
47
|
+
# Multiplier for exponential backoff calculation
|
48
|
+
#
|
49
|
+
# This value is used in the exponential backoff formula:
|
50
|
+
# backoff_time = attempt_number ^ backoff_multiplier * base_seconds
|
51
|
+
#
|
52
|
+
# @!attribute [r] backoff_multiplier
|
53
|
+
# @return [Float] Exponential backoff multiplier
|
54
|
+
attribute :backoff_multiplier, Types::Float.default(2.0)
|
55
|
+
|
56
|
+
# Whether to apply jitter to backoff calculations
|
57
|
+
#
|
58
|
+
# Jitter helps prevent the "thundering herd" problem where
|
59
|
+
# many failed steps retry at exactly the same time.
|
60
|
+
#
|
61
|
+
# @!attribute [r] jitter_enabled
|
62
|
+
# @return [Boolean] Whether jitter is enabled
|
63
|
+
attribute :jitter_enabled, Types::Bool.default(true)
|
64
|
+
|
65
|
+
# Maximum jitter percentage
|
66
|
+
#
|
67
|
+
# When jitter is enabled, the actual backoff time will be
|
68
|
+
# randomly adjusted by up to this percentage.
|
69
|
+
# E.g., 0.1 means ±10% variation.
|
70
|
+
#
|
71
|
+
# @!attribute [r] jitter_max_percentage
|
72
|
+
# @return [Float] Maximum jitter as a decimal percentage
|
73
|
+
attribute :jitter_max_percentage, Types::Float.default(0.1)
|
74
|
+
|
75
|
+
# Task reenqueue delay configuration hash
|
76
|
+
#
|
77
|
+
# This hash defines delays for different task execution states
|
78
|
+
# when reenqueuing tasks for further processing.
|
79
|
+
# Keys correspond to TaskExecution::ExecutionStatus constants.
|
80
|
+
#
|
81
|
+
# @!attribute [r] reenqueue_delays
|
82
|
+
# @return [Hash] Mapping of execution status to delay seconds
|
83
|
+
attribute :reenqueue_delays, Types::Hash.schema(
|
84
|
+
has_ready_steps: Types::Integer.default { 0 }, # Steps ready - immediate processing
|
85
|
+
waiting_for_dependencies: Types::Integer.default { 45 }, # Waiting for deps - moderate delay
|
86
|
+
processing: Types::Integer.default { 10 } # Processing - short delay
|
87
|
+
).constructor { |value|
|
88
|
+
value.respond_to?(:deep_symbolize_keys) ? value.deep_symbolize_keys : value
|
89
|
+
}.default({
|
90
|
+
has_ready_steps: 0,
|
91
|
+
waiting_for_dependencies: 45,
|
92
|
+
processing: 10
|
93
|
+
}.freeze)
|
94
|
+
|
95
|
+
# Default reenqueue delay for unclear states
|
96
|
+
#
|
97
|
+
# This value is used when the task execution status doesn't match
|
98
|
+
# any of the predefined states in reenqueue_delays.
|
99
|
+
#
|
100
|
+
# @!attribute [r] default_reenqueue_delay
|
101
|
+
# @return [Integer] Default reenqueue delay in seconds
|
102
|
+
attribute :default_reenqueue_delay, Types::Integer.default(30)
|
103
|
+
|
104
|
+
# Buffer time for optimal backoff calculations
|
105
|
+
#
|
106
|
+
# This buffer is added to calculated backoff times to ensure
|
107
|
+
# steps are definitely ready for retry when tasks are reenqueued.
|
108
|
+
#
|
109
|
+
# @!attribute [r] buffer_seconds
|
110
|
+
# @return [Integer] Buffer time in seconds
|
111
|
+
attribute :buffer_seconds, Types::Integer.default(5)
|
112
|
+
|
113
|
+
# Calculate backoff time for a given attempt
|
114
|
+
#
|
115
|
+
# @param attempt_number [Integer] The retry attempt number (1-based)
|
116
|
+
# @return [Integer] Backoff time in seconds
|
117
|
+
def calculate_backoff_seconds(attempt_number)
|
118
|
+
return 0 if attempt_number <= 0
|
119
|
+
|
120
|
+
# Use predefined progression if available
|
121
|
+
base_backoff = if attempt_number <= default_backoff_seconds.length
|
122
|
+
default_backoff_seconds[attempt_number - 1]
|
123
|
+
else
|
124
|
+
# Use exponential backoff for attempts beyond predefined progression
|
125
|
+
(attempt_number**backoff_multiplier).to_i
|
126
|
+
end
|
127
|
+
|
128
|
+
# Apply maximum limit
|
129
|
+
backoff_time = [base_backoff, max_backoff_seconds].min
|
130
|
+
|
131
|
+
# Apply jitter if enabled
|
132
|
+
if jitter_enabled
|
133
|
+
jitter_range = (backoff_time * jitter_max_percentage).round
|
134
|
+
jitter = Random.rand(-jitter_range..jitter_range)
|
135
|
+
backoff_time = [backoff_time + jitter, 1].max # Ensure minimum 1 second
|
136
|
+
end
|
137
|
+
|
138
|
+
backoff_time
|
139
|
+
end
|
140
|
+
end
|
141
|
+
end
|
142
|
+
end
|