tasker-engine 0.1.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 +440 -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/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/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 +414 -0
- data/app/models/tasker/task_annotation.rb +36 -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 +95 -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/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_single_and_batch_v02.sql +223 -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 +2254 -0
- data/db/migrate/20250701165431_initial_tasker_schema.rb +116 -0
- data/db/migrate/20250710110830_step_readiness_sql_functions_v02.rb +39 -0
- data/db/views/tasker_step_dag_relationships_v01.sql +69 -0
- data/docs/APPLICATION_GENERATOR.md +384 -0
- data/docs/AUTH.md +1741 -0
- data/docs/CIRCUIT_BREAKER.md +224 -0
- data/docs/DEVELOPER_GUIDE.md +2664 -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 +548 -0
- data/docs/QUICK_START.md +270 -0
- data/docs/REGISTRY_SYSTEMS.md +373 -0
- data/docs/REST_API.md +632 -0
- data/docs/REVERSIONING.md +404 -0
- data/docs/ROADMAP.md +221 -0
- data/docs/SQL_FUNCTIONS.md +1408 -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 +360 -0
- data/docs/Tasker/Authorization/ResourceConstants.html +146 -0
- data/docs/Tasker/Authorization/ResourceRegistry.html +875 -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 +1528 -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 +2478 -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 +395 -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 +306 -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 +468 -0
- data/docs/VISION.md +584 -0
- data/docs/WHY.md +21 -0
- data/docs/_index.html +2319 -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 +537 -0
- data/docs/file_list.html +59 -0
- data/docs/frames.html +22 -0
- data/docs/index.html +537 -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 +8854 -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 +82 -0
- data/lib/generators/tasker/templates/authorization_coordinator_spec.rb.erb +136 -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 +60 -0
- data/lib/generators/tasker/templates/task_handler_spec.rb.erb +165 -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 +73 -0
- data/lib/tasker/authorization/resource_registry.rb +136 -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 +327 -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 +327 -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 +416 -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 +8 -0
- data/lib/tasker.rb +82 -0
- data/lib/tasks/tasker_tasks.rake +383 -0
- metadata +954 -0
@@ -0,0 +1,387 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'tasker/logging/correlation_id_generator'
|
4
|
+
|
5
|
+
module Tasker
|
6
|
+
module Concerns
|
7
|
+
# StructuredLogging provides correlation ID tracking and consistent JSON formatting
|
8
|
+
#
|
9
|
+
# This concern builds on Tasker's existing event system to add production-grade
|
10
|
+
# structured logging with correlation IDs for distributed tracing across workflows.
|
11
|
+
#
|
12
|
+
# Key Features:
|
13
|
+
# - Automatic correlation ID generation and propagation
|
14
|
+
# - JSON structured logging with consistent format
|
15
|
+
# - Integration with existing telemetry configuration
|
16
|
+
# - Parameter filtering for sensitive data
|
17
|
+
# - Performance-optimized with minimal overhead
|
18
|
+
#
|
19
|
+
# Usage:
|
20
|
+
# include Tasker::Concerns::StructuredLogging
|
21
|
+
#
|
22
|
+
# # Basic structured logging
|
23
|
+
# log_structured(:info, "Task started", task_id: task.task_id)
|
24
|
+
#
|
25
|
+
# # Domain-specific helpers
|
26
|
+
# log_task_event(task, :started, execution_mode: 'async')
|
27
|
+
# log_step_event(step, :completed, duration: 1.5)
|
28
|
+
#
|
29
|
+
# # Correlation ID propagation
|
30
|
+
# with_correlation_id(request_id) do
|
31
|
+
# # All logging within this block includes the correlation ID
|
32
|
+
# log_structured(:info, "Processing workflow")
|
33
|
+
# end
|
34
|
+
module StructuredLogging
|
35
|
+
extend ActiveSupport::Concern
|
36
|
+
|
37
|
+
# Thread-local storage for correlation ID to ensure thread safety
|
38
|
+
CORRELATION_ID_KEY = :tasker_correlation_id
|
39
|
+
|
40
|
+
# ========================================================================
|
41
|
+
# CORE STRUCTURED LOGGING API
|
42
|
+
# ========================================================================
|
43
|
+
|
44
|
+
# Log with structured JSON format including correlation ID and context
|
45
|
+
#
|
46
|
+
# @param level [Symbol] Log level (:debug, :info, :warn, :error, :fatal)
|
47
|
+
# @param message [String] Human-readable log message
|
48
|
+
# @param context [Hash] Additional structured context data
|
49
|
+
# @return [void]
|
50
|
+
#
|
51
|
+
# @example Basic usage
|
52
|
+
# log_structured(:info, "Task execution started",
|
53
|
+
# task_id: "task_123",
|
54
|
+
# task_name: "order_processing"
|
55
|
+
# )
|
56
|
+
#
|
57
|
+
# @example With performance data
|
58
|
+
# log_structured(:debug, "Step completed successfully",
|
59
|
+
# step_id: "step_456",
|
60
|
+
# duration_ms: 250.5,
|
61
|
+
# memory_delta_mb: 12.3
|
62
|
+
# )
|
63
|
+
def log_structured(level, message, **context)
|
64
|
+
return unless should_log?(level)
|
65
|
+
|
66
|
+
structured_data = build_structured_log_entry(message, context)
|
67
|
+
filtered_data = apply_parameter_filtering(structured_data)
|
68
|
+
|
69
|
+
Rails.logger.public_send(level, format_log_output(filtered_data))
|
70
|
+
rescue StandardError => e
|
71
|
+
# Failsafe logging - never let logging errors break application flow
|
72
|
+
Rails.logger.error("Structured logging failed: #{e.message}")
|
73
|
+
Rails.logger.public_send(level, message) # Fallback to simple logging
|
74
|
+
end
|
75
|
+
|
76
|
+
# ========================================================================
|
77
|
+
# CORRELATION ID MANAGEMENT
|
78
|
+
# ========================================================================
|
79
|
+
|
80
|
+
# Get the current correlation ID, generating one if needed
|
81
|
+
#
|
82
|
+
# @return [String] The correlation ID for the current execution context
|
83
|
+
def correlation_id
|
84
|
+
Thread.current[CORRELATION_ID_KEY] ||= generate_correlation_id
|
85
|
+
end
|
86
|
+
|
87
|
+
# Set a specific correlation ID for the current execution context
|
88
|
+
#
|
89
|
+
# @param id [String] The correlation ID to use
|
90
|
+
# @return [String] The correlation ID that was set
|
91
|
+
def correlation_id=(id)
|
92
|
+
Thread.current[CORRELATION_ID_KEY] = id
|
93
|
+
end
|
94
|
+
|
95
|
+
# Execute a block with a specific correlation ID
|
96
|
+
#
|
97
|
+
# @param id [String] The correlation ID to use during block execution
|
98
|
+
# @yield Block to execute with the correlation ID
|
99
|
+
# @return [Object] The result of the yielded block
|
100
|
+
#
|
101
|
+
# @example
|
102
|
+
# with_correlation_id("req_abc123") do
|
103
|
+
# process_workflow
|
104
|
+
# # All logging within this block will include req_abc123
|
105
|
+
# end
|
106
|
+
def with_correlation_id(id)
|
107
|
+
previous_id = Thread.current[CORRELATION_ID_KEY]
|
108
|
+
Thread.current[CORRELATION_ID_KEY] = id
|
109
|
+
yield
|
110
|
+
ensure
|
111
|
+
Thread.current[CORRELATION_ID_KEY] = previous_id
|
112
|
+
end
|
113
|
+
|
114
|
+
# ========================================================================
|
115
|
+
# DOMAIN-SPECIFIC LOGGING HELPERS
|
116
|
+
# ========================================================================
|
117
|
+
|
118
|
+
# Log task-related events with standardized format
|
119
|
+
#
|
120
|
+
# @param task [Tasker::Task] The task object
|
121
|
+
# @param event_type [Symbol] The type of event (:started, :completed, :failed, etc.)
|
122
|
+
# @param context [Hash] Additional context to include in the log
|
123
|
+
# @return [void]
|
124
|
+
#
|
125
|
+
# @example
|
126
|
+
# log_task_event(task, :started, execution_mode: 'async', priority: 'high')
|
127
|
+
# log_task_event(task, :completed, duration: 120.5, step_count: 5)
|
128
|
+
# log_task_event(task, :failed, error: exception.message)
|
129
|
+
def log_task_event(task, event_type, **context)
|
130
|
+
log_structured(:info, "Task #{event_type}",
|
131
|
+
entity_type: 'task',
|
132
|
+
entity_id: task.task_id,
|
133
|
+
entity_name: task.name,
|
134
|
+
event_type: event_type,
|
135
|
+
task_status: task.status,
|
136
|
+
**context)
|
137
|
+
end
|
138
|
+
|
139
|
+
# Log step-related events with standardized format
|
140
|
+
#
|
141
|
+
# @param step [Tasker::WorkflowStep] The step object
|
142
|
+
# @param event_type [Symbol] The type of event (:started, :completed, :failed, etc.)
|
143
|
+
# @param duration [Float, nil] Execution duration in seconds
|
144
|
+
# @param context [Hash] Additional context to include in the log
|
145
|
+
# @return [void]
|
146
|
+
#
|
147
|
+
# @example
|
148
|
+
# log_step_event(step, :started)
|
149
|
+
# log_step_event(step, :completed, duration: 2.5, records_processed: 150)
|
150
|
+
# log_step_event(step, :failed, duration: 1.2, error: "Connection timeout")
|
151
|
+
def log_step_event(step, event_type, duration: nil, **context)
|
152
|
+
step_context = {
|
153
|
+
entity_type: 'step',
|
154
|
+
entity_id: step.workflow_step_id,
|
155
|
+
entity_name: step.name,
|
156
|
+
event_type: event_type,
|
157
|
+
step_status: step.status,
|
158
|
+
task_id: step.task.task_id,
|
159
|
+
task_name: step.task.name
|
160
|
+
}
|
161
|
+
|
162
|
+
# Add performance data if provided
|
163
|
+
if duration
|
164
|
+
step_context[:duration_ms] = (duration * 1000).round(2)
|
165
|
+
step_context[:performance_category] = categorize_duration(duration)
|
166
|
+
end
|
167
|
+
|
168
|
+
log_structured(:info, "Step #{event_type}", **step_context, **context)
|
169
|
+
end
|
170
|
+
|
171
|
+
# Log orchestration events (workflow coordination, reenqueuing, etc.)
|
172
|
+
#
|
173
|
+
# @param operation [String] The orchestration operation name
|
174
|
+
# @param event_type [Symbol] The type of event (:started, :completed, :failed, etc.)
|
175
|
+
# @param context [Hash] Additional context to include in the log
|
176
|
+
# @return [void]
|
177
|
+
#
|
178
|
+
# @example
|
179
|
+
# log_orchestration_event("workflow_coordination", :started, task_id: "task_123")
|
180
|
+
# log_orchestration_event("step_execution_batch", :completed,
|
181
|
+
# step_count: 3, total_duration: 5.2)
|
182
|
+
def log_orchestration_event(operation, event_type, **context)
|
183
|
+
log_structured(:debug, "Orchestration #{event_type}",
|
184
|
+
entity_type: 'orchestration',
|
185
|
+
operation: operation,
|
186
|
+
event_type: event_type,
|
187
|
+
**context)
|
188
|
+
end
|
189
|
+
|
190
|
+
# Log performance-related events with timing and resource usage
|
191
|
+
#
|
192
|
+
# @param operation [String] The operation being measured
|
193
|
+
# @param duration [Float] Duration in seconds
|
194
|
+
# @param context [Hash] Additional performance context
|
195
|
+
# @return [void]
|
196
|
+
#
|
197
|
+
# @example
|
198
|
+
# log_performance_event("dependency_graph_analysis", 0.85,
|
199
|
+
# node_count: 25, complexity: "medium")
|
200
|
+
# log_performance_event("sql_query", 2.1,
|
201
|
+
# query_type: "select", table: "workflow_steps")
|
202
|
+
def log_performance_event(operation, duration, **context)
|
203
|
+
performance_context = {
|
204
|
+
entity_type: 'performance',
|
205
|
+
operation: operation,
|
206
|
+
duration_ms: (duration * 1000).round(2),
|
207
|
+
performance_category: categorize_duration(duration),
|
208
|
+
is_slow: duration > telemetry_config.slow_query_threshold_seconds
|
209
|
+
}
|
210
|
+
|
211
|
+
level = performance_context[:is_slow] ? :warn : :debug
|
212
|
+
log_structured(level, 'Performance measurement', **performance_context, **context)
|
213
|
+
end
|
214
|
+
|
215
|
+
# ========================================================================
|
216
|
+
# ERROR AND EXCEPTION LOGGING
|
217
|
+
# ========================================================================
|
218
|
+
|
219
|
+
# Log exceptions with full context and structured format
|
220
|
+
#
|
221
|
+
# @param exception [Exception] The exception to log
|
222
|
+
# @param context [Hash] Additional context about when/where the exception occurred
|
223
|
+
# @param level [Symbol] Log level (defaults to :error)
|
224
|
+
# @return [void]
|
225
|
+
#
|
226
|
+
# @example
|
227
|
+
# log_exception(e, operation: "step_execution", step_id: "step_123")
|
228
|
+
# log_exception(e, operation: "task_finalization", task_id: "task_456", level: :fatal)
|
229
|
+
def log_exception(exception, context: {}, level: :error)
|
230
|
+
exception_context = {
|
231
|
+
entity_type: 'exception',
|
232
|
+
exception_class: exception.class.name,
|
233
|
+
exception_message: exception.message,
|
234
|
+
backtrace: extract_relevant_backtrace(exception),
|
235
|
+
**context
|
236
|
+
}
|
237
|
+
|
238
|
+
log_structured(level, "Exception occurred: #{exception.class.name}", **exception_context)
|
239
|
+
end
|
240
|
+
|
241
|
+
private
|
242
|
+
|
243
|
+
# ========================================================================
|
244
|
+
# INTERNAL IMPLEMENTATION
|
245
|
+
# ========================================================================
|
246
|
+
|
247
|
+
# Build the core structured log entry with standard fields
|
248
|
+
#
|
249
|
+
# @param message [String] The log message
|
250
|
+
# @param context [Hash] Additional context
|
251
|
+
# @return [Hash] Structured log entry
|
252
|
+
def build_structured_log_entry(message, context)
|
253
|
+
{
|
254
|
+
timestamp: Time.current.iso8601(3), # Millisecond precision
|
255
|
+
correlation_id: correlation_id,
|
256
|
+
component: determine_component_name,
|
257
|
+
message: message,
|
258
|
+
**extract_standard_context,
|
259
|
+
**context
|
260
|
+
}
|
261
|
+
end
|
262
|
+
|
263
|
+
# Apply parameter filtering to remove sensitive data
|
264
|
+
#
|
265
|
+
# @param data [Hash] The log data to filter
|
266
|
+
# @return [Hash] Filtered log data
|
267
|
+
def apply_parameter_filtering(data)
|
268
|
+
return data unless telemetry_config.parameter_filter
|
269
|
+
|
270
|
+
# ActiveSupport::ParameterFilter works directly with hashes
|
271
|
+
telemetry_config.parameter_filter.filter(data)
|
272
|
+
rescue StandardError
|
273
|
+
# If filtering fails, return original data rather than breaking
|
274
|
+
data
|
275
|
+
end
|
276
|
+
|
277
|
+
# Format log output based on configuration
|
278
|
+
#
|
279
|
+
# @param data [Hash] The structured log data
|
280
|
+
# @return [String] Formatted log output
|
281
|
+
def format_log_output(data)
|
282
|
+
case telemetry_config.log_format
|
283
|
+
when 'json'
|
284
|
+
data.to_json
|
285
|
+
when 'pretty_json'
|
286
|
+
JSON.pretty_generate(data)
|
287
|
+
when 'logfmt'
|
288
|
+
format_as_logfmt(data)
|
289
|
+
else
|
290
|
+
data.to_json # Default to JSON
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
# Format data as logfmt (key=value pairs)
|
295
|
+
#
|
296
|
+
# @param data [Hash] The data to format
|
297
|
+
# @return [String] Logfmt formatted string
|
298
|
+
def format_as_logfmt(data)
|
299
|
+
data.map do |key, value|
|
300
|
+
formatted_value = value.is_a?(String) ? "\"#{value}\"" : value
|
301
|
+
"#{key}=#{formatted_value}"
|
302
|
+
end.join(' ')
|
303
|
+
end
|
304
|
+
|
305
|
+
# Generate a unique correlation ID
|
306
|
+
#
|
307
|
+
# @return [String] A unique correlation ID
|
308
|
+
def generate_correlation_id
|
309
|
+
Tasker::Logging::CorrelationIdGenerator.generate
|
310
|
+
end
|
311
|
+
|
312
|
+
# Determine the component name for logging context
|
313
|
+
#
|
314
|
+
# @return [String] Component name
|
315
|
+
def determine_component_name
|
316
|
+
self.class.name.demodulize.underscore
|
317
|
+
end
|
318
|
+
|
319
|
+
# Extract standard context available in all log entries
|
320
|
+
#
|
321
|
+
# @return [Hash] Standard context fields
|
322
|
+
def extract_standard_context
|
323
|
+
context = {
|
324
|
+
environment: Rails.env,
|
325
|
+
tasker_version: Tasker::Version
|
326
|
+
}
|
327
|
+
|
328
|
+
# Add process/thread info if available
|
329
|
+
context[:process_id] = Process.pid if defined?(Process.pid)
|
330
|
+
context[:thread_id] = Thread.current.object_id.to_s(16)
|
331
|
+
|
332
|
+
# Add request info if in a web request context
|
333
|
+
context[:request_id] = Current.request_id if defined?(Current) && Current.respond_to?(:request_id)
|
334
|
+
|
335
|
+
context
|
336
|
+
end
|
337
|
+
|
338
|
+
# Extract relevant backtrace lines (filter out gem noise)
|
339
|
+
#
|
340
|
+
# @param exception [Exception] The exception
|
341
|
+
# @return [Array<String>] Relevant backtrace lines
|
342
|
+
def extract_relevant_backtrace(exception)
|
343
|
+
return [] unless exception.backtrace
|
344
|
+
|
345
|
+
# Keep application lines and first few gem lines
|
346
|
+
app_lines = exception.backtrace.select { |line| line.include?(Rails.root.to_s) }
|
347
|
+
gem_lines = exception.backtrace.reject { |line| line.include?(Rails.root.to_s) }.first(3)
|
348
|
+
|
349
|
+
(app_lines + gem_lines).first(10)
|
350
|
+
end
|
351
|
+
|
352
|
+
# Categorize duration for performance analysis
|
353
|
+
#
|
354
|
+
# @param duration [Float] Duration in seconds
|
355
|
+
# @return [String] Performance category
|
356
|
+
def categorize_duration(duration)
|
357
|
+
case duration
|
358
|
+
when 0..0.1 then 'fast'
|
359
|
+
when 0.1..1.0 then 'moderate'
|
360
|
+
when 1.0..5.0 then 'slow'
|
361
|
+
else 'very_slow'
|
362
|
+
end
|
363
|
+
end
|
364
|
+
|
365
|
+
# Check if we should log at the given level
|
366
|
+
#
|
367
|
+
# @param level [Symbol] The log level
|
368
|
+
# @return [Boolean] Whether to log
|
369
|
+
def should_log?(level)
|
370
|
+
return true unless telemetry_config.respond_to?(:log_level)
|
371
|
+
|
372
|
+
level_hierarchy = { debug: 0, info: 1, warn: 2, error: 3, fatal: 4 }
|
373
|
+
current_level = level_hierarchy[telemetry_config.log_level.to_sym] || 1
|
374
|
+
requested_level = level_hierarchy[level] || 1
|
375
|
+
|
376
|
+
requested_level >= current_level
|
377
|
+
end
|
378
|
+
|
379
|
+
# Get telemetry configuration
|
380
|
+
#
|
381
|
+
# @return [Tasker::Types::TelemetryConfig] Telemetry configuration
|
382
|
+
def telemetry_config
|
383
|
+
@telemetry_config ||= Tasker::Configuration.configuration.telemetry
|
384
|
+
end
|
385
|
+
end
|
386
|
+
end
|
387
|
+
end
|