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
data/docs/QUICK_START.md
ADDED
@@ -0,0 +1,270 @@
|
|
1
|
+
# Quick Start Guide: Your First Tasker Workflow
|
2
|
+
|
3
|
+
## Goal: Working Workflow in 5 Minutes
|
4
|
+
|
5
|
+
This guide will get you from zero to a working Tasker application with complete workflows in **5 minutes**. We'll use our automated demo application builder to create a full-featured Rails app with real-world workflow examples, then explore how to customize and extend them.
|
6
|
+
|
7
|
+
**🚀 New in Tasker 2.5.0**: This guide leverages our enterprise-grade demo application builder with:
|
8
|
+
- **Automated Setup**: One-command installation with complete Rails application
|
9
|
+
- **Real-World Examples**: E-commerce, inventory, and customer management workflows
|
10
|
+
- **Performance Optimization**: Dynamic concurrency with configurable execution settings
|
11
|
+
- **Full Observability**: OpenTelemetry tracing and Prometheus metrics integration
|
12
|
+
- **Production Ready**: Complete with Redis, Sidekiq, and comprehensive documentation
|
13
|
+
|
14
|
+
*Why this approach?* Instead of manual setup, we'll use proven patterns from our demo builder that create production-ready applications instantly.
|
15
|
+
|
16
|
+
## Prerequisites (1 minute)
|
17
|
+
|
18
|
+
Ensure you have:
|
19
|
+
- **Ruby 3.2+** with bundler
|
20
|
+
- **PostgreSQL** running locally
|
21
|
+
- **Basic terminal access**
|
22
|
+
- **Optional**: Redis for caching (will be configured automatically)
|
23
|
+
|
24
|
+
## Installation & Setup (2 minutes)
|
25
|
+
|
26
|
+
### Option 1: Automated Demo Application (Recommended)
|
27
|
+
|
28
|
+
Create a complete Tasker application with real-world workflows instantly:
|
29
|
+
|
30
|
+
```bash
|
31
|
+
# Interactive setup with full observability stack
|
32
|
+
curl -fsSL https://raw.githubusercontent.com/tasker-systems/tasker/main/scripts/install-tasker-app.sh | bash
|
33
|
+
|
34
|
+
# Or specify your preferences (traditional Rails setup)
|
35
|
+
curl -fsSL https://raw.githubusercontent.com/tasker-systems/tasker/main/scripts/install-tasker-app.sh | bash -s -- \
|
36
|
+
--app-name my-tasker-demo \
|
37
|
+
--tasks ecommerce,inventory,customer \
|
38
|
+
--observability \
|
39
|
+
--non-interactive
|
40
|
+
|
41
|
+
# NEW: Docker-based development environment (v2.6.0)
|
42
|
+
curl -fsSL https://raw.githubusercontent.com/tasker-systems/tasker/main/scripts/install-tasker-app.sh | bash -s -- \
|
43
|
+
--app-name my-tasker-demo \
|
44
|
+
--docker \
|
45
|
+
--with-observability
|
46
|
+
```
|
47
|
+
|
48
|
+
This creates a complete Rails application with:
|
49
|
+
- ✅ **Tasker gem** installed and configured
|
50
|
+
- ✅ **All 21 migrations** executed with database views/functions
|
51
|
+
- ✅ **3 complete workflows** (e-commerce, inventory, customer management)
|
52
|
+
- ✅ **Redis & Sidekiq** configured for background processing
|
53
|
+
- ✅ **OpenTelemetry** tracing and **Prometheus** metrics
|
54
|
+
- ✅ **Performance configuration** with execution tuning examples
|
55
|
+
|
56
|
+
**Skip to "Exploring Your Workflows"** below to start using your new application!
|
57
|
+
|
58
|
+
### Option 2: Manual Installation (Existing Rails App)
|
59
|
+
|
60
|
+
If you have an existing Rails application:
|
61
|
+
|
62
|
+
```bash
|
63
|
+
# Add to Gemfile
|
64
|
+
echo 'gem "tasker", git: "https://github.com/tasker-systems/tasker.git", tag: "v2.5.0"' >> Gemfile
|
65
|
+
|
66
|
+
# Install and setup
|
67
|
+
bundle install
|
68
|
+
bundle exec rails tasker:install:migrations
|
69
|
+
bundle exec rails tasker:install:database_objects # Critical step!
|
70
|
+
bundle exec rails db:migrate
|
71
|
+
bundle exec rails tasker:setup
|
72
|
+
|
73
|
+
# Mount the engine
|
74
|
+
echo 'mount Tasker::Engine, at: "/tasker"' >> config/routes.rb
|
75
|
+
```
|
76
|
+
|
77
|
+
## Exploring Your Workflows (2 minutes)
|
78
|
+
|
79
|
+
If you used the automated demo application builder, you now have a complete Rails application with three working workflows. Let's explore them!
|
80
|
+
|
81
|
+
### Start Your Application
|
82
|
+
|
83
|
+
#### Traditional Rails Setup
|
84
|
+
```bash
|
85
|
+
cd your-app-name # Use the name you chose during installation
|
86
|
+
|
87
|
+
# Start the services
|
88
|
+
bundle exec redis-server & # Background Redis
|
89
|
+
bundle exec sidekiq & # Background Sidekiq
|
90
|
+
bundle exec rails server # Rails application
|
91
|
+
```
|
92
|
+
|
93
|
+
#### Docker Setup (if you used --docker)
|
94
|
+
```bash
|
95
|
+
cd your-app-name # Use the name you chose during installation
|
96
|
+
|
97
|
+
# Start all services with Docker
|
98
|
+
./bin/docker-dev up-full # Includes observability stack
|
99
|
+
# OR
|
100
|
+
./bin/docker-dev up # Core services only
|
101
|
+
|
102
|
+
# View application logs
|
103
|
+
./bin/docker-dev logs
|
104
|
+
```
|
105
|
+
|
106
|
+
### Explore the Demo Workflows
|
107
|
+
|
108
|
+
Your application includes three complete, production-ready workflows:
|
109
|
+
|
110
|
+
#### 1. **E-commerce Order Processing**
|
111
|
+
- **File**: `app/tasks/ecommerce/order_processing_handler.rb`
|
112
|
+
- **Steps**: Validate order → Process payment → Update inventory → Send confirmation
|
113
|
+
- **Features**: Retry logic, error handling, real API integration with DummyJSON
|
114
|
+
|
115
|
+
#### 2. **Inventory Management**
|
116
|
+
- **File**: `app/tasks/inventory/stock_management_handler.rb`
|
117
|
+
- **Steps**: Check stock levels → Update quantities → Generate reports → Send alerts
|
118
|
+
- **Features**: Conditional logic, parallel processing, data aggregation
|
119
|
+
|
120
|
+
#### 3. **Customer Management**
|
121
|
+
- **File**: `app/tasks/customer/profile_management_handler.rb`
|
122
|
+
- **Steps**: Validate customer → Update profile → Sync external systems → Send notifications
|
123
|
+
- **Features**: External API calls, data transformation, notification patterns
|
124
|
+
|
125
|
+
### Test the Workflows
|
126
|
+
|
127
|
+
Access your application's interfaces:
|
128
|
+
|
129
|
+
```bash
|
130
|
+
# Visit these URLs in your browser:
|
131
|
+
open http://localhost:3000/tasker/graphql # GraphQL API interface
|
132
|
+
open http://localhost:3000/tasker/api-docs # REST API documentation
|
133
|
+
open http://localhost:3000/tasker/metrics # Prometheus metrics endpoint
|
134
|
+
```
|
135
|
+
|
136
|
+
#### Create and Execute a Task via GraphQL
|
137
|
+
|
138
|
+
1. **Open GraphQL Interface**: Navigate to `http://localhost:3000/tasker/graphql`
|
139
|
+
|
140
|
+
2. **Create an E-commerce Order Task**:
|
141
|
+
```graphql
|
142
|
+
mutation {
|
143
|
+
createTask(input: {
|
144
|
+
taskName: "ecommerce_order_processing"
|
145
|
+
context: {
|
146
|
+
order_id: 123
|
147
|
+
customer_id: 456
|
148
|
+
items: [
|
149
|
+
{ product_id: 1, quantity: 2, price: 29.99 }
|
150
|
+
{ product_id: 2, quantity: 1, price: 49.99 }
|
151
|
+
]
|
152
|
+
payment_method: "credit_card"
|
153
|
+
}
|
154
|
+
}) {
|
155
|
+
task {
|
156
|
+
taskId
|
157
|
+
currentState
|
158
|
+
workflowSteps {
|
159
|
+
name
|
160
|
+
currentState
|
161
|
+
}
|
162
|
+
}
|
163
|
+
}
|
164
|
+
}
|
165
|
+
```
|
166
|
+
|
167
|
+
3. **Monitor Task Progress**:
|
168
|
+
```graphql
|
169
|
+
query {
|
170
|
+
task(taskId: "your-task-id-here") {
|
171
|
+
taskId
|
172
|
+
currentState
|
173
|
+
workflowSteps {
|
174
|
+
name
|
175
|
+
currentState
|
176
|
+
results
|
177
|
+
attempts
|
178
|
+
}
|
179
|
+
}
|
180
|
+
}
|
181
|
+
```
|
182
|
+
|
183
|
+
## Performance Configuration (1 minute)
|
184
|
+
|
185
|
+
Your demo application includes comprehensive execution configuration examples. Explore the performance tuning options:
|
186
|
+
|
187
|
+
### View Current Configuration
|
188
|
+
|
189
|
+
```ruby
|
190
|
+
# In Rails console
|
191
|
+
rails console
|
192
|
+
|
193
|
+
# Check current execution settings
|
194
|
+
config = Tasker.configuration.execution
|
195
|
+
puts "Min concurrent steps: #{config.min_concurrent_steps}"
|
196
|
+
puts "Max concurrent steps: #{config.max_concurrent_steps_limit}"
|
197
|
+
puts "Concurrency cache duration: #{config.concurrency_cache_duration} seconds"
|
198
|
+
```
|
199
|
+
|
200
|
+
### Environment-Specific Tuning
|
201
|
+
|
202
|
+
Your application includes configuration examples in:
|
203
|
+
- **`config/initializers/tasker.rb`**: Main configuration with execution settings
|
204
|
+
- **`config/execution_tuning_examples.rb`**: 7 environment-specific examples:
|
205
|
+
- Development: Conservative settings (2-6 concurrent steps)
|
206
|
+
- Production: High-performance (5-25 concurrent steps)
|
207
|
+
- High-Performance: Maximum throughput (10-50 concurrent steps)
|
208
|
+
- API-Heavy: Optimized for external APIs (3-8 concurrent steps)
|
209
|
+
- Testing: Minimal concurrency for reliability (1-3 concurrent steps)
|
210
|
+
|
211
|
+
### Monitor Performance
|
212
|
+
|
213
|
+
```bash
|
214
|
+
# View metrics in your browser
|
215
|
+
open http://localhost:3000/tasker/metrics
|
216
|
+
|
217
|
+
# Check system health
|
218
|
+
curl http://localhost:3000/tasker/health/status | jq
|
219
|
+
```
|
220
|
+
|
221
|
+
## Creating Custom Workflows
|
222
|
+
|
223
|
+
Want to create your own workflow? Use our proven patterns:
|
224
|
+
|
225
|
+
### 1. Generate New Workflow Structure
|
226
|
+
|
227
|
+
```bash
|
228
|
+
# Generate a new task handler
|
229
|
+
rails generate tasker:task_handler WelcomeHandler --module_namespace WelcomeUser
|
230
|
+
|
231
|
+
# This creates:
|
232
|
+
# - app/tasks/welcome_user/welcome_handler.rb (task handler class)
|
233
|
+
# - config/tasker/tasks/welcome_user/welcome_handler.yaml (workflow configuration)
|
234
|
+
# - spec/tasks/welcome_user/welcome_handler_spec.rb (test file)
|
235
|
+
```
|
236
|
+
|
237
|
+
### 2. Configure Your Workflow
|
238
|
+
|
239
|
+
Edit `config/tasker/tasks/welcome_user/welcome_handler.yaml`:
|
240
|
+
|
241
|
+
```yaml
|
242
|
+
---
|
243
|
+
name: welcome_user
|
244
|
+
module_namespace: WelcomeUser
|
245
|
+
task_handler_class: WelcomeHandler
|
246
|
+
|
247
|
+
schema:
|
248
|
+
type: object
|
249
|
+
required:
|
250
|
+
- user_id
|
251
|
+
properties:
|
252
|
+
user_id:
|
253
|
+
type: integer
|
254
|
+
|
255
|
+
step_templates:
|
256
|
+
- name: validate_user
|
257
|
+
description: Ensure user exists and is valid for welcome email
|
258
|
+
handler_class: WelcomeUser::StepHandler::ValidateUserHandler
|
259
|
+
|
260
|
+
- name: generate_content
|
261
|
+
description: Generate personalized welcome email content
|
262
|
+
depends_on_step: validate_user
|
263
|
+
handler_class: WelcomeUser::StepHandler::GenerateContentHandler
|
264
|
+
|
265
|
+
- name: send_email
|
266
|
+
description: Send the welcome email to the user
|
267
|
+
depends_on_step: generate_content
|
268
|
+
handler_class: WelcomeUser::StepHandler::SendEmailHandler
|
269
|
+
default_retryable: true
|
270
|
+
default_retry_limit: 3
|
@@ -0,0 +1,373 @@
|
|
1
|
+
# Registry System Architecture
|
2
|
+
|
3
|
+
## Overview
|
4
|
+
|
5
|
+
Tasker features enterprise-grade registry systems that provide thread-safe operations, comprehensive validation, structured logging, and event integration. All registry systems have been modernized to use `Concurrent::Hash` storage and unified patterns.
|
6
|
+
|
7
|
+
## Registry Systems
|
8
|
+
|
9
|
+
### HandlerFactory Registry
|
10
|
+
|
11
|
+
The core registry for task handler management with namespace and version support.
|
12
|
+
|
13
|
+
**Features**:
|
14
|
+
- **Thread-Safe Operations**: `Concurrent::Hash` storage eliminates race conditions
|
15
|
+
- **3-Level Registry**: `namespace_name → handler_name → version → handler_class`
|
16
|
+
- **Interface Validation**: Fail-fast validation with detailed error messages
|
17
|
+
- **Conflict Resolution**: `replace: true` parameter for graceful updates
|
18
|
+
- **Structured Logging**: Every operation logged with correlation IDs
|
19
|
+
|
20
|
+
**Usage**:
|
21
|
+
```ruby
|
22
|
+
# Thread-safe registration
|
23
|
+
Tasker::HandlerFactory.instance.register(
|
24
|
+
'payment_processor',
|
25
|
+
PaymentHandler,
|
26
|
+
namespace_name: 'payments',
|
27
|
+
version: '2.1.0',
|
28
|
+
replace: true # Handles conflicts gracefully
|
29
|
+
)
|
30
|
+
|
31
|
+
# Thread-safe retrieval
|
32
|
+
handler = Tasker::HandlerFactory.instance.get(
|
33
|
+
'payment_processor',
|
34
|
+
namespace_name: 'payments',
|
35
|
+
version: '2.1.0'
|
36
|
+
)
|
37
|
+
|
38
|
+
# List handlers in namespace
|
39
|
+
handlers = Tasker::HandlerFactory.instance.list_handlers(namespace: 'payments')
|
40
|
+
|
41
|
+
# Registry statistics
|
42
|
+
stats = Tasker::HandlerFactory.instance.stats
|
43
|
+
# => {
|
44
|
+
# total_handlers: 45,
|
45
|
+
# namespaces: ["payments", "inventory", "notifications"],
|
46
|
+
# versions: ["1.0.0", "1.1.0", "2.0.0"],
|
47
|
+
# thread_safe: true,
|
48
|
+
# last_registration: "2024-01-15T10:30:45Z"
|
49
|
+
# }
|
50
|
+
```
|
51
|
+
|
52
|
+
### PluginRegistry System
|
53
|
+
|
54
|
+
Format-based plugin discovery with auto-discovery capabilities for telemetry exporters.
|
55
|
+
|
56
|
+
**Features**:
|
57
|
+
- **Format-Based Discovery**: Register plugins by export format (`:json`, `:csv`, `:prometheus`)
|
58
|
+
- **Auto-Discovery**: Automatic plugin detection and registration
|
59
|
+
- **Thread-Safe Operations**: Mutex-synchronized operations
|
60
|
+
- **Interface Validation**: Method arity checking for plugin interfaces
|
61
|
+
- **Event Integration**: Plugin registration triggers event system
|
62
|
+
|
63
|
+
**Usage**:
|
64
|
+
```ruby
|
65
|
+
# Register custom exporter
|
66
|
+
Tasker::Telemetry::PluginRegistry.register(
|
67
|
+
'custom_json_exporter',
|
68
|
+
CustomJsonExporter,
|
69
|
+
format: :json,
|
70
|
+
replace: true
|
71
|
+
)
|
72
|
+
|
73
|
+
# Find plugins by format
|
74
|
+
json_exporters = Tasker::Telemetry::PluginRegistry.find_by(format: :json)
|
75
|
+
|
76
|
+
# Auto-discovery
|
77
|
+
Tasker::Telemetry::PluginRegistry.auto_discover_plugins
|
78
|
+
|
79
|
+
# Registry statistics
|
80
|
+
stats = Tasker::Telemetry::PluginRegistry.stats
|
81
|
+
# => {
|
82
|
+
# total_plugins: 12,
|
83
|
+
# formats: [:json, :csv, :prometheus],
|
84
|
+
# auto_discovery_enabled: true,
|
85
|
+
# thread_safe: true
|
86
|
+
# }
|
87
|
+
```
|
88
|
+
|
89
|
+
### SubscriberRegistry System
|
90
|
+
|
91
|
+
Centralized event subscriber management with comprehensive validation.
|
92
|
+
|
93
|
+
**Features**:
|
94
|
+
- **Centralized Management**: Single registry for all event subscribers
|
95
|
+
- **Event Validation**: Validates subscriber methods match event names
|
96
|
+
- **Thread-Safe Operations**: Concurrent access protection
|
97
|
+
- **Health Monitoring**: Built-in health checks and statistics
|
98
|
+
- **Auto-Registration**: Automatic registration during class loading
|
99
|
+
|
100
|
+
**Usage**:
|
101
|
+
```ruby
|
102
|
+
# Register event subscriber
|
103
|
+
Tasker::Registry::SubscriberRegistry.register(
|
104
|
+
'notification_subscriber',
|
105
|
+
NotificationSubscriber,
|
106
|
+
events: ['task.completed', 'task.failed']
|
107
|
+
)
|
108
|
+
|
109
|
+
# List subscribers for event
|
110
|
+
subscribers = Tasker::Registry::SubscriberRegistry.find_by_event('task.completed')
|
111
|
+
|
112
|
+
# Registry health check
|
113
|
+
health = Tasker::Registry::SubscriberRegistry.health_check
|
114
|
+
# => { status: "healthy", subscriber_count: 15, events_covered: 45 }
|
115
|
+
```
|
116
|
+
|
117
|
+
## Structured Logging
|
118
|
+
|
119
|
+
Every registry operation includes comprehensive structured logging with correlation IDs:
|
120
|
+
|
121
|
+
```json
|
122
|
+
{
|
123
|
+
"timestamp": "2024-01-15T10:30:45Z",
|
124
|
+
"correlation_id": "tsk_abc123_def456",
|
125
|
+
"component": "handler_factory",
|
126
|
+
"message": "Registry item registered",
|
127
|
+
"environment": "production",
|
128
|
+
"tasker_version": "2.4.1",
|
129
|
+
"process_id": 12345,
|
130
|
+
"thread_id": "abc123",
|
131
|
+
"entity_type": "task_handler",
|
132
|
+
"entity_id": "payments/payment_processor/2.1.0",
|
133
|
+
"entity_class": "PaymentHandler",
|
134
|
+
"registry_name": "handler_factory",
|
135
|
+
"options": {
|
136
|
+
"namespace_name": "payments",
|
137
|
+
"version": "2.1.0",
|
138
|
+
"replace": true
|
139
|
+
},
|
140
|
+
"event_type": "registered"
|
141
|
+
}
|
142
|
+
```
|
143
|
+
|
144
|
+
## Interface Validation
|
145
|
+
|
146
|
+
All registries include fail-fast validation with detailed error messages:
|
147
|
+
|
148
|
+
```ruby
|
149
|
+
# Example validation error
|
150
|
+
begin
|
151
|
+
Tasker::HandlerFactory.instance.register('invalid_handler', InvalidClass)
|
152
|
+
rescue Tasker::Registry::ValidationError => e
|
153
|
+
puts e.message
|
154
|
+
# => "Handler validation failed: InvalidClass does not implement required method 'process'.
|
155
|
+
# Required methods: [process, initialize_task!].
|
156
|
+
# Available methods: [initialize, new].
|
157
|
+
# Suggestion: Inherit from Tasker::TaskHandler::Base"
|
158
|
+
end
|
159
|
+
```
|
160
|
+
|
161
|
+
## Event Integration
|
162
|
+
|
163
|
+
Registry operations are fully integrated with Tasker's 56-event system:
|
164
|
+
|
165
|
+
**Registry Events**:
|
166
|
+
- `registry.handler_registered` - Handler registration events
|
167
|
+
- `registry.plugin_registered` - Plugin registration events
|
168
|
+
- `registry.subscriber_registered` - Subscriber registration events
|
169
|
+
- `registry.validation_failed` - Validation failure events
|
170
|
+
- `registry.conflict_resolved` - Conflict resolution events
|
171
|
+
|
172
|
+
**Event Payloads**:
|
173
|
+
```ruby
|
174
|
+
# Handler registration event
|
175
|
+
{
|
176
|
+
registry_type: 'handler_factory',
|
177
|
+
entity_id: 'payments/payment_processor/2.1.0',
|
178
|
+
entity_class: 'PaymentHandler',
|
179
|
+
namespace_name: 'payments',
|
180
|
+
version: '2.1.0',
|
181
|
+
options: { replace: true },
|
182
|
+
correlation_id: 'tsk_abc123'
|
183
|
+
}
|
184
|
+
```
|
185
|
+
|
186
|
+
## Thread Safety
|
187
|
+
|
188
|
+
All registry systems use thread-safe storage and operations:
|
189
|
+
|
190
|
+
**Storage Types**:
|
191
|
+
- **HandlerFactory**: `Concurrent::Hash` with nested concurrent structures
|
192
|
+
- **PluginRegistry**: `Concurrent::Hash` with mutex synchronization
|
193
|
+
- **SubscriberRegistry**: `Concurrent::Hash` with atomic operations
|
194
|
+
|
195
|
+
**Thread Safety Guarantees**:
|
196
|
+
- **Atomic Operations**: Registration and retrieval are atomic
|
197
|
+
- **Race Condition Prevention**: No partial state during concurrent access
|
198
|
+
- **Memory Consistency**: All threads see consistent registry state
|
199
|
+
- **Deadlock Prevention**: Proper lock ordering and timeout handling
|
200
|
+
|
201
|
+
## Health Monitoring
|
202
|
+
|
203
|
+
Built-in health monitoring and statistics for all registries:
|
204
|
+
|
205
|
+
```ruby
|
206
|
+
# Individual registry health
|
207
|
+
handler_health = Tasker::HandlerFactory.instance.health_check
|
208
|
+
plugin_health = Tasker::Telemetry::PluginRegistry.health_check
|
209
|
+
subscriber_health = Tasker::Registry::SubscriberRegistry.health_check
|
210
|
+
|
211
|
+
# Comprehensive registry system health
|
212
|
+
registry_health = Tasker::Registry.system_health
|
213
|
+
# => {
|
214
|
+
# status: "healthy",
|
215
|
+
# registries: {
|
216
|
+
# handler_factory: { status: "healthy", count: 45 },
|
217
|
+
# plugin_registry: { status: "healthy", count: 12 },
|
218
|
+
# subscriber_registry: { status: "healthy", count: 15 }
|
219
|
+
# },
|
220
|
+
# thread_safe: true,
|
221
|
+
# total_entities: 72
|
222
|
+
# }
|
223
|
+
```
|
224
|
+
|
225
|
+
## Performance Characteristics
|
226
|
+
|
227
|
+
**Registry Operation Performance**:
|
228
|
+
- **Registration**: O(1) average case with thread-safe operations
|
229
|
+
- **Retrieval**: O(1) lookup with concurrent access
|
230
|
+
- **Listing**: O(n) where n is entities in scope
|
231
|
+
- **Statistics**: O(1) with cached computation
|
232
|
+
|
233
|
+
**Memory Usage**:
|
234
|
+
- **Efficient Storage**: Minimal memory overhead per registered entity
|
235
|
+
- **Concurrent Structures**: Memory-safe concurrent access
|
236
|
+
- **Garbage Collection**: Proper cleanup and memory management
|
237
|
+
|
238
|
+
## Best Practices
|
239
|
+
|
240
|
+
### Registration Patterns
|
241
|
+
|
242
|
+
```ruby
|
243
|
+
# ✅ Good: Use replace parameter for updates
|
244
|
+
Tasker::HandlerFactory.instance.register(
|
245
|
+
'payment_processor',
|
246
|
+
PaymentHandler,
|
247
|
+
namespace_name: 'payments',
|
248
|
+
version: '2.1.0',
|
249
|
+
replace: true
|
250
|
+
)
|
251
|
+
|
252
|
+
# ❌ Avoid: Registration without conflict handling
|
253
|
+
Tasker::HandlerFactory.instance.register(
|
254
|
+
'payment_processor',
|
255
|
+
PaymentHandler,
|
256
|
+
namespace_name: 'payments',
|
257
|
+
version: '2.1.0'
|
258
|
+
# Will raise error if already exists
|
259
|
+
)
|
260
|
+
```
|
261
|
+
|
262
|
+
### Error Handling
|
263
|
+
|
264
|
+
```ruby
|
265
|
+
# ✅ Good: Handle validation errors gracefully
|
266
|
+
begin
|
267
|
+
Tasker::HandlerFactory.instance.register(name, handler_class, options)
|
268
|
+
rescue Tasker::Registry::ValidationError => e
|
269
|
+
logger.error "Handler registration failed: #{e.message}"
|
270
|
+
# Handle error appropriately
|
271
|
+
rescue Tasker::Registry::ConflictError => e
|
272
|
+
logger.warn "Handler conflict: #{e.message}"
|
273
|
+
# Decide whether to use replace: true
|
274
|
+
end
|
275
|
+
```
|
276
|
+
|
277
|
+
### Performance Optimization
|
278
|
+
|
279
|
+
```ruby
|
280
|
+
# ✅ Good: Batch operations when possible
|
281
|
+
handlers = Tasker::HandlerFactory.instance.list_handlers(namespace: 'payments')
|
282
|
+
handlers.each { |name, versions| process_handler(name, versions) }
|
283
|
+
|
284
|
+
# ❌ Avoid: Individual lookups in loops
|
285
|
+
payment_handlers.each do |name|
|
286
|
+
handler = Tasker::HandlerFactory.instance.get(name, namespace_name: 'payments')
|
287
|
+
process_handler(handler)
|
288
|
+
end
|
289
|
+
```
|
290
|
+
|
291
|
+
## Troubleshooting
|
292
|
+
|
293
|
+
### Common Issues
|
294
|
+
|
295
|
+
**Thread Safety Issues**:
|
296
|
+
```ruby
|
297
|
+
# Symptom: Inconsistent registry state
|
298
|
+
# Solution: Ensure all access goes through registry APIs
|
299
|
+
# ❌ Don't access internal storage directly
|
300
|
+
# ✅ Use registry methods for all operations
|
301
|
+
```
|
302
|
+
|
303
|
+
**Validation Failures**:
|
304
|
+
```ruby
|
305
|
+
# Symptom: Registration fails with validation error
|
306
|
+
# Solution: Ensure classes implement required interfaces
|
307
|
+
class MyHandler < Tasker::TaskHandler::Base
|
308
|
+
# Implements required methods automatically
|
309
|
+
end
|
310
|
+
```
|
311
|
+
|
312
|
+
**Memory Leaks**:
|
313
|
+
```ruby
|
314
|
+
# Symptom: Growing memory usage
|
315
|
+
# Solution: Use proper cleanup in test environments
|
316
|
+
after(:each) do
|
317
|
+
Tasker::HandlerFactory.instance.clear_test_handlers!
|
318
|
+
end
|
319
|
+
```
|
320
|
+
|
321
|
+
### Debugging Registry State
|
322
|
+
|
323
|
+
```ruby
|
324
|
+
# Check registry contents
|
325
|
+
puts Tasker::HandlerFactory.instance.stats.to_json
|
326
|
+
|
327
|
+
# Verify thread safety
|
328
|
+
puts Tasker::HandlerFactory.instance.health_check[:thread_safe]
|
329
|
+
|
330
|
+
# Monitor registration events
|
331
|
+
Tasker::Events.subscribe('registry.handler_registered') do |event|
|
332
|
+
puts "Handler registered: #{event[:entity_id]}"
|
333
|
+
end
|
334
|
+
```
|
335
|
+
|
336
|
+
## Migration Guide
|
337
|
+
|
338
|
+
### Upgrading from Legacy Registry
|
339
|
+
|
340
|
+
If upgrading from older Tasker versions:
|
341
|
+
|
342
|
+
1. **Update Registration Code**:
|
343
|
+
```ruby
|
344
|
+
# Old (pre-2.3.0)
|
345
|
+
Tasker::HandlerFactory.register('handler', HandlerClass)
|
346
|
+
|
347
|
+
# New (2.3.0+)
|
348
|
+
Tasker::HandlerFactory.instance.register(
|
349
|
+
'handler',
|
350
|
+
HandlerClass,
|
351
|
+
namespace_name: 'default',
|
352
|
+
version: '1.0.0'
|
353
|
+
)
|
354
|
+
```
|
355
|
+
|
356
|
+
2. **Handle Thread Safety**:
|
357
|
+
```ruby
|
358
|
+
# Old: Manual synchronization required
|
359
|
+
# New: Thread safety built-in
|
360
|
+
```
|
361
|
+
|
362
|
+
3. **Update Error Handling**:
|
363
|
+
```ruby
|
364
|
+
# Old: Generic exceptions
|
365
|
+
# New: Specific validation and conflict errors
|
366
|
+
```
|
367
|
+
|
368
|
+
## Related Documentation
|
369
|
+
|
370
|
+
- [Developer Guide](DEVELOPER_GUIDE.md) - HandlerFactory usage patterns
|
371
|
+
- [Event System](EVENT_SYSTEM.md) - Registry event integration
|
372
|
+
- [Telemetry](TELEMETRY.md) - Plugin registry usage
|
373
|
+
- [Health Monitoring](HEALTH.md) - Registry health endpoints
|