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,637 @@
|
|
1
|
+
# Tasker Event System
|
2
|
+
|
3
|
+
## Overview
|
4
|
+
|
5
|
+
Tasker features a comprehensive event-driven architecture that provides deep insights into task execution, workflow orchestration, and system behavior. The event system supports both **system events** (built-in workflow events) and **custom events** (business logic events), designed to be production-ready for observability and developer-friendly for building custom integrations.
|
6
|
+
|
7
|
+
## Architecture
|
8
|
+
|
9
|
+
The Tasker event system consists of several key components working together:
|
10
|
+
|
11
|
+
### Core Components
|
12
|
+
|
13
|
+
1. **Events::Publisher** - Centralized event publishing using dry-events
|
14
|
+
2. **EventPublisher Concern** - Clean interface for business logic (`publish_step_completed`, `publish_custom_event`)
|
15
|
+
3. **EventPayloadBuilder** - Standardized payload creation for consistent data structures
|
16
|
+
4. **Event Catalog** - Complete event discovery and documentation system (system + custom events)
|
17
|
+
5. **BaseSubscriber** - Foundation for creating custom event subscribers
|
18
|
+
6. **TelemetrySubscriber** - Production OpenTelemetry integration
|
19
|
+
7. **CustomRegistry** - Registration and management of custom business events
|
20
|
+
|
21
|
+
### Event Flow Architecture
|
22
|
+
|
23
|
+
```mermaid
|
24
|
+
flowchart LR
|
25
|
+
subgraph Business["Business Logic"]
|
26
|
+
TaskHandler["Task Handler"]
|
27
|
+
StepLogic["Step Logic"]
|
28
|
+
Orchestration["Orchestration"]
|
29
|
+
StateMachine["State Machines"]
|
30
|
+
end
|
31
|
+
|
32
|
+
subgraph EventSystem["Event System"]
|
33
|
+
Publisher["Events::Publisher"]
|
34
|
+
PayloadBuilder["EventPayloadBuilder"]
|
35
|
+
Catalog["Event Catalog"]
|
36
|
+
CustomRegistry["CustomRegistry"]
|
37
|
+
end
|
38
|
+
|
39
|
+
subgraph Subscribers["Event Subscribers"]
|
40
|
+
Telemetry["TelemetrySubscriber"]
|
41
|
+
Custom["Custom Subscribers"]
|
42
|
+
Generated["Generated Subscribers"]
|
43
|
+
end
|
44
|
+
|
45
|
+
subgraph Tools["Developer Tools"]
|
46
|
+
Generator["Subscriber Generator"]
|
47
|
+
Examples["Integration Examples"]
|
48
|
+
Discovery["Event Discovery"]
|
49
|
+
end
|
50
|
+
|
51
|
+
TaskHandler -->|publish_step_completed| Publisher
|
52
|
+
TaskHandler -->|publish_custom_event| Publisher
|
53
|
+
StepLogic -->|publish_step_failed| Publisher
|
54
|
+
Orchestration -->|publish_workflow_event| Publisher
|
55
|
+
StateMachine -->|publish_task_event| Publisher
|
56
|
+
|
57
|
+
Publisher --> PayloadBuilder
|
58
|
+
Publisher --> Catalog
|
59
|
+
Publisher --> CustomRegistry
|
60
|
+
Publisher --> Telemetry
|
61
|
+
Publisher --> Custom
|
62
|
+
Publisher --> Generated
|
63
|
+
|
64
|
+
Generator --> Custom
|
65
|
+
Examples --> Custom
|
66
|
+
Discovery --> Catalog
|
67
|
+
```
|
68
|
+
|
69
|
+
---
|
70
|
+
|
71
|
+
## System Events
|
72
|
+
|
73
|
+
System events are built-in events that track the core workflow execution lifecycle. These events are automatically published by Tasker as tasks and steps execute.
|
74
|
+
|
75
|
+
### Task Events (`Tasker::Constants::TaskEvents`)
|
76
|
+
|
77
|
+
Task lifecycle events track the overall progress of workflow execution:
|
78
|
+
|
79
|
+
| Event | Description | Typical Payload |
|
80
|
+
|-------|-------------|-----------------|
|
81
|
+
| `INITIALIZE_REQUESTED` | Task creation and setup | `task_id`, `task_name`, `context` |
|
82
|
+
| `START_REQUESTED` | Task processing begins | `task_id`, `started_at` |
|
83
|
+
| `COMPLETED` | Task finished successfully | `task_id`, `execution_duration`, `step_count` |
|
84
|
+
| `FAILED` | Task encountered fatal error | `task_id`, `error_message`, `failed_step_id` |
|
85
|
+
| `RETRY_REQUESTED` | Task being retried | `task_id`, `retry_count`, `reason` |
|
86
|
+
| `CANCELLED` | Task manually cancelled | `task_id`, `cancelled_by`, `reason` |
|
87
|
+
|
88
|
+
### Step Events (`Tasker::Constants::StepEvents`)
|
89
|
+
|
90
|
+
Step-level events provide detailed execution tracking:
|
91
|
+
|
92
|
+
| Event | Description | Typical Payload |
|
93
|
+
|-------|-------------|-----------------|
|
94
|
+
| `EXECUTION_REQUESTED` | Step queued for processing | `task_id`, `step_id`, `step_name` |
|
95
|
+
| `BEFORE_HANDLE` | Step about to execute | `task_id`, `step_id`, `attempt_number` |
|
96
|
+
| `HANDLE` | Step currently executing | `task_id`, `step_id`, `started_at` |
|
97
|
+
| `COMPLETED` | Step finished successfully | `task_id`, `step_id`, `execution_duration`, `results` |
|
98
|
+
| `FAILED` | Step encountered error | `task_id`, `step_id`, `error_message`, `exception_class`, `backtrace` |
|
99
|
+
| `RETRY_REQUESTED` | Step being retried | `task_id`, `step_id`, `attempt_number`, `retry_delay` |
|
100
|
+
| `MAX_RETRIES_REACHED` | Step exceeded retry limit | `task_id`, `step_id`, `final_error` |
|
101
|
+
|
102
|
+
### Workflow Events (`Tasker::Constants::WorkflowEvents`)
|
103
|
+
|
104
|
+
Orchestration events track workflow coordination:
|
105
|
+
|
106
|
+
| Event | Description | Typical Payload |
|
107
|
+
|-------|-------------|-----------------|
|
108
|
+
| `TASK_STARTED` | Workflow orchestration begins | `task_id`, `total_steps` |
|
109
|
+
| `STEP_COMPLETED` | Individual step in workflow completed | `task_id`, `step_id`, `remaining_steps` |
|
110
|
+
| `VIABLE_STEPS_DISCOVERED` | Steps ready for execution identified | `task_id`, `step_ids`, `batch_size` |
|
111
|
+
| `NO_VIABLE_STEPS` | No executable steps found | `task_id`, `reason`, `blocked_steps` |
|
112
|
+
| `TASK_COMPLETED` | Entire workflow finished | `task_id`, `total_duration`, `success_rate` |
|
113
|
+
|
114
|
+
### Observability Events (`Tasker::Constants::ObservabilityEvents`)
|
115
|
+
|
116
|
+
System-level monitoring events:
|
117
|
+
|
118
|
+
| Event | Description | Typical Payload |
|
119
|
+
|-------|-------------|-----------------|
|
120
|
+
| `Task::ENQUEUE` | Task queued for background processing | `task_id`, `queue_name`, `enqueued_at` |
|
121
|
+
| `Task::START` | Task processing started by worker | `task_id`, `worker_id`, `started_at` |
|
122
|
+
| `Step::PROCESSING` | Step processing metrics | `task_id`, `step_id`, `processing_time`, `memory_usage` |
|
123
|
+
|
124
|
+
---
|
125
|
+
|
126
|
+
## Custom Events
|
127
|
+
|
128
|
+
Custom events allow you to define and publish business logic events from your step handlers that can be consumed by subscribers for monitoring, alerting, and notifications. Unlike system events, custom events are declaratively defined by developers and automatically registered.
|
129
|
+
|
130
|
+
### Creating Custom Events
|
131
|
+
|
132
|
+
Tasker provides multiple ways to define custom events with **automatic registration**:
|
133
|
+
|
134
|
+
#### 1. Class-Based Event Configuration (Recommended)
|
135
|
+
|
136
|
+
```ruby
|
137
|
+
class OrderFulfillmentStep < Tasker::StepHandler::Base
|
138
|
+
# Define custom events - these are automatically registered when the handler loads
|
139
|
+
def self.custom_event_configuration
|
140
|
+
[
|
141
|
+
{
|
142
|
+
name: 'order.fulfilled',
|
143
|
+
description: 'Order has been fulfilled and shipped'
|
144
|
+
},
|
145
|
+
{
|
146
|
+
name: 'order.shipment_delayed',
|
147
|
+
description: 'Order shipment has been delayed'
|
148
|
+
}
|
149
|
+
]
|
150
|
+
end
|
151
|
+
|
152
|
+
def process(task, sequence, step)
|
153
|
+
order = find_order(step.inputs['order_id'])
|
154
|
+
|
155
|
+
# ... fulfillment logic ...
|
156
|
+
|
157
|
+
# Publish custom event for subscribers (PagerDuty, Sentry, Slack, etc.)
|
158
|
+
publish_custom_event('order.fulfilled', {
|
159
|
+
order_id: order.id,
|
160
|
+
customer_id: order.customer_id,
|
161
|
+
total_amount: order.total,
|
162
|
+
priority: order.priority_level,
|
163
|
+
fulfillment_center: order.fulfillment_center,
|
164
|
+
shipping_method: order.shipping_method
|
165
|
+
})
|
166
|
+
end
|
167
|
+
end
|
168
|
+
```
|
169
|
+
|
170
|
+
#### 2. YAML-Based Event Configuration
|
171
|
+
|
172
|
+
You can also define custom events in your step template YAML files:
|
173
|
+
|
174
|
+
```yaml
|
175
|
+
# config/step_templates/order_fulfillment.yml
|
176
|
+
name: "Order Fulfillment Step"
|
177
|
+
description: "Processes and fulfills customer orders"
|
178
|
+
handler_class: "OrderFulfillmentStep"
|
179
|
+
custom_events:
|
180
|
+
- name: "order.fulfilled"
|
181
|
+
description: "Order has been fulfilled and shipped"
|
182
|
+
- name: "order.shipment_delayed"
|
183
|
+
description: "Order shipment has been delayed"
|
184
|
+
```
|
185
|
+
|
186
|
+
#### Key Features
|
187
|
+
|
188
|
+
- **Automatic Registration**: Events are registered when step handlers load - no manual registration required
|
189
|
+
- **Namespace Validation**: Events must be namespaced (e.g., `order.fulfilled`)
|
190
|
+
- **Conflict Prevention**: Cannot conflict with system events
|
191
|
+
- **Reserved Namespaces**: `task.*`, `step.*`, `workflow.*`, `observability.*`, `test.*` are reserved
|
192
|
+
- **Complete Integration**: Custom events appear in all discovery methods
|
193
|
+
- **Subscriber Compatibility**: Work seamlessly with existing subscriber patterns
|
194
|
+
|
195
|
+
### Publishing Custom Events
|
196
|
+
|
197
|
+
From within your step handlers, use the `publish_custom_event` method:
|
198
|
+
|
199
|
+
```ruby
|
200
|
+
class PaymentRiskAssessmentStep < Tasker::StepHandler::Base
|
201
|
+
def self.custom_event_configuration
|
202
|
+
[
|
203
|
+
{
|
204
|
+
name: 'payment.risk_flagged',
|
205
|
+
description: 'Payment flagged for manual review due to risk factors'
|
206
|
+
}
|
207
|
+
]
|
208
|
+
end
|
209
|
+
|
210
|
+
def process(task, sequence, step)
|
211
|
+
risk_assessment = assess_payment_risk(step.inputs)
|
212
|
+
|
213
|
+
if risk_assessment.flagged?
|
214
|
+
# Publish the pre-declared custom event
|
215
|
+
publish_custom_event('payment.risk_flagged', {
|
216
|
+
payment_id: risk_assessment.payment_id,
|
217
|
+
risk_score: risk_assessment.score,
|
218
|
+
flagged_reasons: risk_assessment.reasons,
|
219
|
+
requires_manual_review: true,
|
220
|
+
customer_tier: risk_assessment.customer_tier
|
221
|
+
})
|
222
|
+
end
|
223
|
+
end
|
224
|
+
end
|
225
|
+
```
|
226
|
+
|
227
|
+
### Custom Event Best Practices
|
228
|
+
|
229
|
+
#### Event Naming
|
230
|
+
- Use namespace.action format: `order.fulfilled`, `payment.processed`
|
231
|
+
- Choose descriptive, business-focused names
|
232
|
+
- Avoid technical implementation details in names
|
233
|
+
|
234
|
+
#### Event Payloads
|
235
|
+
Include relevant business context:
|
236
|
+
|
237
|
+
```ruby
|
238
|
+
# Good: Business context
|
239
|
+
publish_custom_event('order.cancelled', {
|
240
|
+
order_id: order.id,
|
241
|
+
customer_id: order.customer_id,
|
242
|
+
cancellation_reason: 'customer_request',
|
243
|
+
refund_amount: order.refundable_amount,
|
244
|
+
cancelled_at: Time.current,
|
245
|
+
order_status_before_cancellation: order.previous_status
|
246
|
+
})
|
247
|
+
|
248
|
+
# Avoid: Too technical or sparse
|
249
|
+
publish_custom_event('order.cancelled', {
|
250
|
+
id: 123,
|
251
|
+
status: 'cancelled'
|
252
|
+
})
|
253
|
+
```
|
254
|
+
|
255
|
+
---
|
256
|
+
|
257
|
+
## Event Discovery
|
258
|
+
|
259
|
+
The event catalog provides comprehensive discovery for both system and custom events:
|
260
|
+
|
261
|
+
### Using the Event Catalog
|
262
|
+
|
263
|
+
```ruby
|
264
|
+
# Discover all available events
|
265
|
+
puts Tasker::Events.catalog.keys # System events only
|
266
|
+
puts Tasker::Events.complete_catalog.keys # System + custom events
|
267
|
+
puts Tasker::Events.custom_events.keys # Custom events only
|
268
|
+
|
269
|
+
# Search and filter events
|
270
|
+
puts Tasker::Events.search_events('payment') # Search by name/description
|
271
|
+
puts Tasker::Events.events_by_namespace('order') # Get events by namespace
|
272
|
+
|
273
|
+
# Get detailed event information
|
274
|
+
event_info = Tasker::Events.event_info('task.completed')
|
275
|
+
puts event_info
|
276
|
+
# => {
|
277
|
+
# name: "task.completed",
|
278
|
+
# category: "task",
|
279
|
+
# description: "Fired when a task completes successfully",
|
280
|
+
# payload_schema: { task_id: String, execution_duration: Float },
|
281
|
+
# example_payload: { task_id: "task_123", execution_duration: 45.2 },
|
282
|
+
# fired_by: ["TaskFinalizer", "TaskHandler"]
|
283
|
+
# }
|
284
|
+
|
285
|
+
# Browse events by category
|
286
|
+
puts Tasker::Events.task_events.keys # System task events
|
287
|
+
puts Tasker::Events.step_events.keys # System step events
|
288
|
+
puts Tasker::Events.workflow_events.keys # System workflow events
|
289
|
+
puts Tasker::Events.custom_events.keys # Custom business events
|
290
|
+
```
|
291
|
+
|
292
|
+
### Event Documentation Structure
|
293
|
+
|
294
|
+
Each event in the catalog includes:
|
295
|
+
|
296
|
+
- **Name**: Standard event identifier
|
297
|
+
- **Category**: Event classification (task, step, workflow, observability, custom)
|
298
|
+
- **Description**: Human-readable explanation of when the event fires
|
299
|
+
- **Payload Schema**: Expected data structure with types
|
300
|
+
- **Example Payload**: Real example of event data
|
301
|
+
- **Fired By**: Components that publish this event
|
302
|
+
|
303
|
+
### Print Complete Catalog
|
304
|
+
|
305
|
+
```ruby
|
306
|
+
# Print complete catalog (includes custom events)
|
307
|
+
Tasker::Events::Catalog.print_catalog
|
308
|
+
|
309
|
+
# Or in Rails console:
|
310
|
+
pp Tasker::Events.custom_events
|
311
|
+
```
|
312
|
+
|
313
|
+
---
|
314
|
+
|
315
|
+
## Architectural Distinction: Event Subscribers vs Workflow Steps
|
316
|
+
|
317
|
+
**Critical Design Principle**: Event subscribers should handle **"collateral" or "secondary" logic** - operations that support observability, monitoring, and alerting but are not core business requirements.
|
318
|
+
|
319
|
+
### Use Event Subscribers For:
|
320
|
+
- **Operational Observability**: Logging, metrics, telemetry, traces
|
321
|
+
- **Alerting & Monitoring**: Sentry errors, PagerDuty alerts, operational notifications
|
322
|
+
- **Analytics**: Business intelligence, usage tracking, performance monitoring
|
323
|
+
- **External Integrations**: Non-critical third-party service notifications
|
324
|
+
|
325
|
+
### Use Workflow Steps For:
|
326
|
+
- **Business-Critical Operations**: Actions that must succeed for the workflow to be considered complete
|
327
|
+
- **Operations Requiring**:
|
328
|
+
- **Idempotency**: Can be safely retried without side effects
|
329
|
+
- **Retryability**: Built-in retry logic with exponential backoff
|
330
|
+
- **Explicit Lifecycle Tracking**: Success/failure states that matter to the business
|
331
|
+
- **Transactional Integrity**: Operations that need to be rolled back on failure
|
332
|
+
|
333
|
+
### Examples of Proper Usage
|
334
|
+
|
335
|
+
**✅ Event Subscriber (Collateral Concerns)**:
|
336
|
+
```ruby
|
337
|
+
class ObservabilitySubscriber < Tasker::Events::Subscribers::BaseSubscriber
|
338
|
+
subscribe_to 'order.fulfilled'
|
339
|
+
|
340
|
+
def handle_order_fulfilled(event)
|
341
|
+
# Operational logging and analytics - if these fail, the order is still fulfilled
|
342
|
+
AnalyticsService.track_fulfillment(order_id: safe_get(event, :order_id))
|
343
|
+
Rails.logger.info "Order #{safe_get(event, :order_id)} fulfilled"
|
344
|
+
end
|
345
|
+
end
|
346
|
+
```
|
347
|
+
|
348
|
+
**✅ Workflow Step (Business Logic)**:
|
349
|
+
```yaml
|
350
|
+
# config/tasker/tasks/order_process.yaml
|
351
|
+
- name: send_confirmation_email
|
352
|
+
description: Send order confirmation email to customer
|
353
|
+
depends_on_step: process_payment
|
354
|
+
handler_class: OrderProcess::StepHandler::SendConfirmationEmailHandler
|
355
|
+
default_retryable: true
|
356
|
+
default_retry_limit: 3
|
357
|
+
```
|
358
|
+
|
359
|
+
**❌ Wrong - Business Logic in Event Subscriber**:
|
360
|
+
```ruby
|
361
|
+
# DON'T DO THIS - Critical email sending belongs in a workflow step
|
362
|
+
def handle_order_fulfilled(event)
|
363
|
+
CustomerService.send_confirmation_email(safe_get(event, :order_id)) # Critical business action!
|
364
|
+
end
|
365
|
+
```
|
366
|
+
|
367
|
+
**Rule of Thumb**: If the operation must succeed for the workflow to be considered complete, it should be a workflow step. If it's supporting infrastructure (logging, monitoring, analytics), it should be an event subscriber.
|
368
|
+
|
369
|
+
## Creating Custom Subscribers
|
370
|
+
|
371
|
+
### Using the Subscriber Generator
|
372
|
+
|
373
|
+
The easiest way to create custom event subscribers is using the built-in generator:
|
374
|
+
|
375
|
+
```bash
|
376
|
+
# Generate a subscriber with specific events (works for both system and custom events)
|
377
|
+
rails generate tasker:subscriber notification --events task.completed task.failed order.fulfilled
|
378
|
+
|
379
|
+
# Generate a basic subscriber (add events manually)
|
380
|
+
rails generate tasker:subscriber sentry
|
381
|
+
```
|
382
|
+
|
383
|
+
This creates:
|
384
|
+
- A subscriber class extending `Tasker::Events::Subscribers::BaseSubscriber`
|
385
|
+
- Automatic method routing based on event names
|
386
|
+
- Complete RSpec test file with realistic patterns
|
387
|
+
- Clear usage instructions and documentation
|
388
|
+
|
389
|
+
### Manual Subscriber Creation
|
390
|
+
|
391
|
+
You can also create subscribers manually to handle both system and custom events:
|
392
|
+
|
393
|
+
```ruby
|
394
|
+
class ObservabilitySubscriber < Tasker::Events::Subscribers::BaseSubscriber
|
395
|
+
# Subscribe to system and custom events for operational monitoring
|
396
|
+
subscribe_to 'task.completed', 'task.failed', 'order.fulfilled', 'payment.risk_flagged'
|
397
|
+
|
398
|
+
# Handle system events - operational monitoring only
|
399
|
+
def handle_task_completed(event)
|
400
|
+
task_id = safe_get(event, :task_id)
|
401
|
+
task_name = safe_get(event, :task_name, 'unknown')
|
402
|
+
execution_duration = safe_get(event, :execution_duration, 0)
|
403
|
+
|
404
|
+
# Operational logging and metrics (collateral concerns)
|
405
|
+
Rails.logger.info "Task completed: #{task_name} (#{task_id}) in #{execution_duration}s"
|
406
|
+
StatsD.histogram('tasker.task.duration', execution_duration, tags: ["task:#{task_name}"])
|
407
|
+
end
|
408
|
+
|
409
|
+
def handle_task_failed(event)
|
410
|
+
task_id = safe_get(event, :task_id)
|
411
|
+
error_message = safe_get(event, :error_message, 'Unknown error')
|
412
|
+
|
413
|
+
# Operational alerting (collateral concerns)
|
414
|
+
Sentry.capture_message("Task failed: #{task_id}", level: 'error', extra: { error: error_message })
|
415
|
+
PagerDutyService.trigger_alert(
|
416
|
+
summary: "Tasker workflow failed",
|
417
|
+
severity: 'error',
|
418
|
+
details: { task_id: task_id, error: error_message }
|
419
|
+
)
|
420
|
+
end
|
421
|
+
|
422
|
+
# Handle custom business events - monitoring and analytics only
|
423
|
+
def handle_order_fulfilled(event)
|
424
|
+
order_id = safe_get(event, :order_id)
|
425
|
+
customer_id = safe_get(event, :customer_id)
|
426
|
+
|
427
|
+
# Analytics and operational monitoring (collateral concerns)
|
428
|
+
AnalyticsService.track_order_fulfillment(order_id, customer_id)
|
429
|
+
Rails.logger.info "Order fulfilled: #{order_id} for customer #{customer_id}"
|
430
|
+
end
|
431
|
+
|
432
|
+
def handle_payment_risk_flagged(event)
|
433
|
+
risk_score = safe_get(event, :risk_score, 0)
|
434
|
+
|
435
|
+
# Operational alerting for high-risk scenarios (collateral concern)
|
436
|
+
if risk_score > 0.8
|
437
|
+
PagerDutyService.trigger_alert(
|
438
|
+
summary: "High-risk payment detected",
|
439
|
+
severity: 'warning',
|
440
|
+
details: event
|
441
|
+
)
|
442
|
+
end
|
443
|
+
|
444
|
+
# Analytics tracking (collateral concern)
|
445
|
+
AnalyticsService.track_payment_risk(safe_get(event, :payment_id), risk_score)
|
446
|
+
end
|
447
|
+
end
|
448
|
+
```
|
449
|
+
|
450
|
+
### BaseSubscriber Features
|
451
|
+
|
452
|
+
The `BaseSubscriber` class provides:
|
453
|
+
|
454
|
+
- **Automatic Method Routing**: `task.completed` → `handle_task_completed`, `order.fulfilled` → `handle_order_fulfilled`
|
455
|
+
- **Safe Data Access**: `safe_get(event, :key, default)` with type checking
|
456
|
+
- **Error Handling**: Graceful handling of malformed events
|
457
|
+
- **Logging**: Automatic debug logging for event processing
|
458
|
+
- **Flexible Subscription**: Subscribe to specific events or event patterns
|
459
|
+
|
460
|
+
### Subscriber Integration Examples
|
461
|
+
|
462
|
+
Your subscribers can handle both system and custom events seamlessly:
|
463
|
+
|
464
|
+
```ruby
|
465
|
+
class PagerDutySubscriber < Tasker::Events::BaseSubscriber
|
466
|
+
# Listen to both system failures and custom high-priority events
|
467
|
+
subscribe_to 'task.failed', 'step.failed', 'payment.risk_flagged', 'inventory.restock_needed'
|
468
|
+
|
469
|
+
def handle_task_failed(event)
|
470
|
+
# Handle system event
|
471
|
+
trigger_pagerduty_alert(
|
472
|
+
summary: "Tasker task failed: #{safe_get(event, :task_id)}",
|
473
|
+
severity: 'error',
|
474
|
+
details: event
|
475
|
+
)
|
476
|
+
end
|
477
|
+
|
478
|
+
def handle_payment_risk_flagged(event)
|
479
|
+
# Handle custom business logic event
|
480
|
+
if safe_get(event, :risk_score, 0) > 80
|
481
|
+
trigger_pagerduty_alert(
|
482
|
+
summary: "High-risk payment requires review",
|
483
|
+
severity: 'error',
|
484
|
+
details: event
|
485
|
+
)
|
486
|
+
end
|
487
|
+
end
|
488
|
+
end
|
489
|
+
```
|
490
|
+
|
491
|
+
```ruby
|
492
|
+
class SlackSubscriber < Tasker::Events::BaseSubscriber
|
493
|
+
subscribe_to 'task.completed', 'order.fulfilled'
|
494
|
+
|
495
|
+
def handle_task_completed(event)
|
496
|
+
# Handle system event
|
497
|
+
send_slack_message(
|
498
|
+
channel: '#ops',
|
499
|
+
text: "✅ Task #{safe_get(event, :task_id)} completed in #{safe_get(event, :execution_duration)}s"
|
500
|
+
)
|
501
|
+
end
|
502
|
+
|
503
|
+
def handle_order_fulfilled(event)
|
504
|
+
# Handle custom business event
|
505
|
+
send_slack_message(
|
506
|
+
channel: '#fulfillment',
|
507
|
+
text: "🎉 Order #{safe_get(event, :order_id)} fulfilled!",
|
508
|
+
attachments: [{
|
509
|
+
color: 'good',
|
510
|
+
fields: [
|
511
|
+
{ title: 'Customer', value: safe_get(event, :customer_id), short: true },
|
512
|
+
{ title: 'Amount', value: "$#{safe_get(event, :total_amount)}", short: true },
|
513
|
+
{ title: 'Priority', value: safe_get(event, :priority), short: true }
|
514
|
+
]
|
515
|
+
}]
|
516
|
+
)
|
517
|
+
end
|
518
|
+
end
|
519
|
+
```
|
520
|
+
|
521
|
+
---
|
522
|
+
|
523
|
+
## Development & Testing
|
524
|
+
|
525
|
+
### Viewing Events
|
526
|
+
|
527
|
+
```ruby
|
528
|
+
# Print complete catalog (includes custom events)
|
529
|
+
Tasker::Events::Catalog.print_catalog
|
530
|
+
|
531
|
+
# Or in Rails console:
|
532
|
+
pp Tasker::Events.custom_events
|
533
|
+
pp Tasker::Events.complete_catalog
|
534
|
+
```
|
535
|
+
|
536
|
+
### Testing Both System and Custom Events
|
537
|
+
|
538
|
+
```ruby
|
539
|
+
RSpec.describe OrderFulfillmentStep do
|
540
|
+
it 'publishes custom order fulfilled event' do
|
541
|
+
step = create_step_with_inputs(order_id: 'ORDER123')
|
542
|
+
|
543
|
+
expect(subject).to receive(:publish_custom_event).with(
|
544
|
+
'order.fulfilled',
|
545
|
+
hash_including(
|
546
|
+
order_id: 'ORDER123',
|
547
|
+
customer_id: be_present
|
548
|
+
)
|
549
|
+
)
|
550
|
+
|
551
|
+
subject.process(task, sequence, step)
|
552
|
+
end
|
553
|
+
end
|
554
|
+
|
555
|
+
RSpec.describe ObservabilitySubscriber do
|
556
|
+
it 'handles both system and custom events for monitoring' do
|
557
|
+
# Test system event handling - operational logging and metrics
|
558
|
+
system_event = { task_id: 'TASK123', task_name: 'order_process', execution_duration: 45.2 }
|
559
|
+
expect(Rails.logger).to receive(:info).with(/Task completed/)
|
560
|
+
expect(StatsD).to receive(:histogram).with('tasker.task.duration', 45.2, anything)
|
561
|
+
subject.handle_task_completed(system_event)
|
562
|
+
|
563
|
+
# Test custom event handling - analytics and operational monitoring
|
564
|
+
custom_event = { order_id: 'ORDER123', customer_id: 'CUSTOMER456' }
|
565
|
+
expect(AnalyticsService).to receive(:track_order_fulfillment).with('ORDER123', 'CUSTOMER456')
|
566
|
+
expect(Rails.logger).to receive(:info).with(/Order fulfilled/)
|
567
|
+
subject.handle_order_fulfilled(custom_event)
|
568
|
+
end
|
569
|
+
end
|
570
|
+
```
|
571
|
+
|
572
|
+
---
|
573
|
+
|
574
|
+
## Integration Examples
|
575
|
+
|
576
|
+
Tasker includes comprehensive integration examples demonstrating real-world usage patterns for both system and custom events. These examples are located in `spec/lib/tasker/events/subscribers/examples/` and serve as both documentation and implementation templates.
|
577
|
+
|
578
|
+
### Available Examples
|
579
|
+
|
580
|
+
#### SentrySubscriber - Error Tracking Integration
|
581
|
+
```ruby
|
582
|
+
class SentrySubscriber < Tasker::Events::Subscribers::BaseSubscriber
|
583
|
+
subscribe_to 'task.failed', 'step.failed', 'payment.risk_flagged'
|
584
|
+
|
585
|
+
def handle_task_failed(event)
|
586
|
+
# Handle system event
|
587
|
+
task_id = safe_get(event, :task_id)
|
588
|
+
error_message = safe_get(event, :error_message, 'Unknown error')
|
589
|
+
|
590
|
+
sentry_data = {
|
591
|
+
level: 'error',
|
592
|
+
fingerprint: ['tasker', 'task_failed', task_id],
|
593
|
+
tags: {
|
594
|
+
task_id: task_id,
|
595
|
+
component: 'tasker',
|
596
|
+
environment: Rails.env
|
597
|
+
},
|
598
|
+
extra: {
|
599
|
+
error_message: error_message,
|
600
|
+
timestamp: Time.current.iso8601
|
601
|
+
}
|
602
|
+
}
|
603
|
+
|
604
|
+
Rails.logger.info "Would report to Sentry: #{sentry_data}"
|
605
|
+
end
|
606
|
+
|
607
|
+
def handle_payment_risk_flagged(event)
|
608
|
+
# Handle custom business event
|
609
|
+
payment_id = safe_get(event, :payment_id)
|
610
|
+
risk_score = safe_get(event, :risk_score, 0)
|
611
|
+
|
612
|
+
sentry_data = {
|
613
|
+
level: 'warning',
|
614
|
+
fingerprint: ['payment', 'risk_flagged', payment_id],
|
615
|
+
tags: {
|
616
|
+
payment_id: payment_id,
|
617
|
+
risk_score: risk_score,
|
618
|
+
component: 'payment_system'
|
619
|
+
}
|
620
|
+
}
|
621
|
+
|
622
|
+
Rails.logger.info "Would report payment risk to Sentry: #{sentry_data}"
|
623
|
+
end
|
624
|
+
end
|
625
|
+
```
|
626
|
+
|
627
|
+
### Summary
|
628
|
+
|
629
|
+
The Tasker Event System provides a unified approach to handling both system workflow events and custom business logic events:
|
630
|
+
|
631
|
+
- **System Events**: Automatically published by Tasker for observability and monitoring
|
632
|
+
- **Custom Events**: Declaratively defined by developers for business logic integration
|
633
|
+
- **Unified Discovery**: Single catalog and search interface for all events
|
634
|
+
- **Seamless Subscribers**: Same subscriber patterns work for both event types
|
635
|
+
- **Production Ready**: Built for real-world monitoring, alerting, and notification scenarios
|
636
|
+
|
637
|
+
This comprehensive event system enables you to build robust, observable, and well-integrated workflows that provide visibility into both technical execution and business processes.
|