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.
Files changed (605) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +22 -0
  3. data/README.md +443 -0
  4. data/Rakefile +10 -0
  5. data/app/controllers/tasker/analytics_controller.rb +179 -0
  6. data/app/controllers/tasker/application_controller.rb +45 -0
  7. data/app/controllers/tasker/graphql_controller.rb +193 -0
  8. data/app/controllers/tasker/handlers_controller.rb +217 -0
  9. data/app/controllers/tasker/health_controller.rb +229 -0
  10. data/app/controllers/tasker/metrics_controller.rb +111 -0
  11. data/app/controllers/tasker/page_sort.rb +97 -0
  12. data/app/controllers/tasker/task_diagrams_controller.rb +30 -0
  13. data/app/controllers/tasker/tasks_controller.rb +123 -0
  14. data/app/controllers/tasker/workflow_steps_controller.rb +69 -0
  15. data/app/graphql/examples/all_tasks.graphql +22 -0
  16. data/app/graphql/examples/pending_tasks.graphql +23 -0
  17. data/app/graphql/tasker/graph_ql_types/annotation_type.rb +14 -0
  18. data/app/graphql/tasker/graph_ql_types/base_argument.rb +9 -0
  19. data/app/graphql/tasker/graph_ql_types/base_connection.rb +11 -0
  20. data/app/graphql/tasker/graph_ql_types/base_edge.rb +10 -0
  21. data/app/graphql/tasker/graph_ql_types/base_enum.rb +9 -0
  22. data/app/graphql/tasker/graph_ql_types/base_field.rb +10 -0
  23. data/app/graphql/tasker/graph_ql_types/base_input_object.rb +10 -0
  24. data/app/graphql/tasker/graph_ql_types/base_interface.rb +14 -0
  25. data/app/graphql/tasker/graph_ql_types/base_object.rb +10 -0
  26. data/app/graphql/tasker/graph_ql_types/base_scalar.rb +9 -0
  27. data/app/graphql/tasker/graph_ql_types/base_union.rb +11 -0
  28. data/app/graphql/tasker/graph_ql_types/dependent_system_object_map_type.rb +18 -0
  29. data/app/graphql/tasker/graph_ql_types/dependent_system_type.rb +13 -0
  30. data/app/graphql/tasker/graph_ql_types/mutation_type.rb +16 -0
  31. data/app/graphql/tasker/graph_ql_types/named_step_type.rb +16 -0
  32. data/app/graphql/tasker/graph_ql_types/named_task_type.rb +14 -0
  33. data/app/graphql/tasker/graph_ql_types/named_tasks_named_step_type.rb +19 -0
  34. data/app/graphql/tasker/graph_ql_types/node_type.rb +12 -0
  35. data/app/graphql/tasker/graph_ql_types/query_type.rb +20 -0
  36. data/app/graphql/tasker/graph_ql_types/task_annotation_type.rb +17 -0
  37. data/app/graphql/tasker/graph_ql_types/task_interface.rb +17 -0
  38. data/app/graphql/tasker/graph_ql_types/task_type.rb +26 -0
  39. data/app/graphql/tasker/graph_ql_types/workflow_step_type.rb +154 -0
  40. data/app/graphql/tasker/graph_ql_types.rb +42 -0
  41. data/app/graphql/tasker/mutations/base_mutation.rb +13 -0
  42. data/app/graphql/tasker/mutations/cancel_step.rb +29 -0
  43. data/app/graphql/tasker/mutations/cancel_task.rb +29 -0
  44. data/app/graphql/tasker/mutations/create_task.rb +52 -0
  45. data/app/graphql/tasker/mutations/update_step.rb +36 -0
  46. data/app/graphql/tasker/mutations/update_task.rb +41 -0
  47. data/app/graphql/tasker/queries/all_annotation_types.rb +17 -0
  48. data/app/graphql/tasker/queries/all_tasks.rb +23 -0
  49. data/app/graphql/tasker/queries/base_query.rb +9 -0
  50. data/app/graphql/tasker/queries/helpers.rb +16 -0
  51. data/app/graphql/tasker/queries/one_step.rb +24 -0
  52. data/app/graphql/tasker/queries/one_task.rb +18 -0
  53. data/app/graphql/tasker/queries/tasks_by_annotation.rb +31 -0
  54. data/app/graphql/tasker/queries/tasks_by_status.rb +30 -0
  55. data/app/graphql/tasker/tasker_rails_schema.rb +52 -0
  56. data/app/jobs/tasker/application_job.rb +8 -0
  57. data/app/jobs/tasker/metrics_export_job.rb +252 -0
  58. data/app/jobs/tasker/task_runner_job.rb +224 -0
  59. data/app/models/tasker/annotation_type.rb +26 -0
  60. data/app/models/tasker/application_record.rb +70 -0
  61. data/app/models/tasker/dependent_system.rb +26 -0
  62. data/app/models/tasker/dependent_system_object_map.rb +64 -0
  63. data/app/models/tasker/diagram/edge.rb +106 -0
  64. data/app/models/tasker/diagram/flowchart.rb +137 -0
  65. data/app/models/tasker/diagram/node.rb +99 -0
  66. data/app/models/tasker/named_step.rb +41 -0
  67. data/app/models/tasker/named_task.rb +121 -0
  68. data/app/models/tasker/named_tasks_named_step.rb +82 -0
  69. data/app/models/tasker/step_dag_relationship.rb +65 -0
  70. data/app/models/tasker/step_readiness_status.rb +59 -0
  71. data/app/models/tasker/task.rb +424 -0
  72. data/app/models/tasker/task_annotation.rb +36 -0
  73. data/app/models/tasker/task_diagram.rb +332 -0
  74. data/app/models/tasker/task_execution_context.rb +29 -0
  75. data/app/models/tasker/task_namespace.rb +41 -0
  76. data/app/models/tasker/task_transition.rb +235 -0
  77. data/app/models/tasker/workflow_step.rb +461 -0
  78. data/app/models/tasker/workflow_step_edge.rb +94 -0
  79. data/app/models/tasker/workflow_step_transition.rb +434 -0
  80. data/app/serializers/tasker/annotation_type_serializer.rb +8 -0
  81. data/app/serializers/tasker/handler_serializer.rb +109 -0
  82. data/app/serializers/tasker/task_annotation_serializer.rb +32 -0
  83. data/app/serializers/tasker/task_serializer.rb +168 -0
  84. data/app/serializers/tasker/workflow_step_serializer.rb +27 -0
  85. data/app/services/tasker/analytics_service.rb +409 -0
  86. data/app/views/tasker/task/_diagram.html.erb +32 -0
  87. data/config/initializers/dry_struct.rb +11 -0
  88. data/config/initializers/statesman.rb +6 -0
  89. data/config/initializers/tasker_orchestration.rb +17 -0
  90. data/config/initializers/time_formats.rb +4 -0
  91. data/config/routes.rb +34 -0
  92. data/config/tasker/subscriptions/example_integrations.yml +67 -0
  93. data/config/tasker/system_events.yml +305 -0
  94. data/db/functions/calculate_dependency_levels_v01.sql +45 -0
  95. data/db/functions/get_analytics_metrics_v01.sql +137 -0
  96. data/db/functions/get_slowest_steps_v01.sql +82 -0
  97. data/db/functions/get_slowest_tasks_v01.sql +96 -0
  98. data/db/functions/get_step_readiness_status_batch_v01.sql +140 -0
  99. data/db/functions/get_step_readiness_status_v01.sql +139 -0
  100. data/db/functions/get_system_health_counts_v01.sql +108 -0
  101. data/db/functions/get_task_execution_context_v01.sql +108 -0
  102. data/db/functions/get_task_execution_contexts_batch_v01.sql +104 -0
  103. data/db/init/schema.sql +2277 -0
  104. data/db/migrate/20250701165431_initial_tasker_schema.rb +116 -0
  105. data/db/views/tasker_step_dag_relationships_v01.sql +69 -0
  106. data/docs/APPLICATION_GENERATOR.md +384 -0
  107. data/docs/AUTH.md +1780 -0
  108. data/docs/CIRCUIT_BREAKER.md +224 -0
  109. data/docs/DEVELOPER_GUIDE.md +2665 -0
  110. data/docs/EVENT_SYSTEM.md +637 -0
  111. data/docs/EXECUTION_CONFIGURATION.md +341 -0
  112. data/docs/FLOW_CHART.md +149 -0
  113. data/docs/HEALTH.md +542 -0
  114. data/docs/METRICS.md +731 -0
  115. data/docs/OPTIMIZATION_PLAN.md +1479 -0
  116. data/docs/OVERVIEW.md +552 -0
  117. data/docs/QUICK_START.md +270 -0
  118. data/docs/REGISTRY_SYSTEMS.md +373 -0
  119. data/docs/REST_API.md +632 -0
  120. data/docs/ROADMAP.md +221 -0
  121. data/docs/SQL_FUNCTIONS.md +1408 -0
  122. data/docs/TASK_DIAGRAM.md +252 -0
  123. data/docs/TASK_EXECUTION_CONTROL_FLOW.md +237 -0
  124. data/docs/TELEMETRY.md +795 -0
  125. data/docs/TROUBLESHOOTING.md +756 -0
  126. data/docs/TaskHandlerGenerator.html +255 -0
  127. data/docs/Tasker/Analysis/RuntimeGraphAnalyzer.html +907 -0
  128. data/docs/Tasker/Analysis/TemplateGraphAnalyzer.html +1236 -0
  129. data/docs/Tasker/Analysis.html +117 -0
  130. data/docs/Tasker/AnalyticsController.html +450 -0
  131. data/docs/Tasker/AnalyticsService/BottleneckAnalytics.html +816 -0
  132. data/docs/Tasker/AnalyticsService/PerformanceAnalytics.html +586 -0
  133. data/docs/Tasker/AnalyticsService.html +2221 -0
  134. data/docs/Tasker/AnnotationType.html +137 -0
  135. data/docs/Tasker/AnnotationTypeSerializer.html +124 -0
  136. data/docs/Tasker/ApplicationController.html +147 -0
  137. data/docs/Tasker/ApplicationJob.html +128 -0
  138. data/docs/Tasker/ApplicationRecord.html +378 -0
  139. data/docs/Tasker/Authentication/AuthenticationError.html +124 -0
  140. data/docs/Tasker/Authentication/ConfigurationError.html +124 -0
  141. data/docs/Tasker/Authentication/Coordinator.html +242 -0
  142. data/docs/Tasker/Authentication/Interface.html +560 -0
  143. data/docs/Tasker/Authentication/InterfaceError.html +124 -0
  144. data/docs/Tasker/Authentication/NoneAuthenticator.html +338 -0
  145. data/docs/Tasker/Authentication.html +119 -0
  146. data/docs/Tasker/Authorization/AuthorizationError.html +139 -0
  147. data/docs/Tasker/Authorization/BaseCoordinator.html +927 -0
  148. data/docs/Tasker/Authorization/ConfigurationError.html +153 -0
  149. data/docs/Tasker/Authorization/ResourceConstants/ACTIONS.html +428 -0
  150. data/docs/Tasker/Authorization/ResourceConstants/RESOURCES.html +365 -0
  151. data/docs/Tasker/Authorization/ResourceConstants.html +146 -0
  152. data/docs/Tasker/Authorization/ResourceRegistry.html +882 -0
  153. data/docs/Tasker/Authorization/UnauthorizedError.html +153 -0
  154. data/docs/Tasker/Authorization.html +582 -0
  155. data/docs/Tasker/CacheCapabilities.html +167 -0
  156. data/docs/Tasker/CacheStrategy.html +1297 -0
  157. data/docs/Tasker/Concerns/Authenticatable.html +116 -0
  158. data/docs/Tasker/Concerns/Authorizable/AdminStatusChecker.html +256 -0
  159. data/docs/Tasker/Concerns/Authorizable.html +816 -0
  160. data/docs/Tasker/Concerns/ControllerAuthorizable.html +157 -0
  161. data/docs/Tasker/Concerns/EventPublisher.html +4023 -0
  162. data/docs/Tasker/Concerns/IdempotentStateTransitions.html +806 -0
  163. data/docs/Tasker/Concerns/LifecycleEventHelpers.html +129 -0
  164. data/docs/Tasker/Concerns/OrchestrationPublisher.html +129 -0
  165. data/docs/Tasker/Concerns/StateMachineBase/ClassMethods.html +1075 -0
  166. data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase/ClassMethods.html +191 -0
  167. data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase.html +126 -0
  168. data/docs/Tasker/Concerns/StateMachineBase.html +153 -0
  169. data/docs/Tasker/Concerns/StructuredLogging.html +1413 -0
  170. data/docs/Tasker/Concerns.html +117 -0
  171. data/docs/Tasker/Configuration/AuthConfiguration.html +1023 -0
  172. data/docs/Tasker/Configuration/ConfigurationProxy.html +581 -0
  173. data/docs/Tasker/Configuration/DatabaseConfiguration.html +475 -0
  174. data/docs/Tasker/Configuration/EngineConfiguration.html +1265 -0
  175. data/docs/Tasker/Configuration/HealthConfiguration.html +791 -0
  176. data/docs/Tasker/Configuration/TelemetryConfiguration.html +1308 -0
  177. data/docs/Tasker/Configuration/TelemetryConfigurationProxy.html +388 -0
  178. data/docs/Tasker/Configuration.html +1669 -0
  179. data/docs/Tasker/ConfigurationError.html +143 -0
  180. data/docs/Tasker/ConfiguredTask.html +514 -0
  181. data/docs/Tasker/Constants/EventDefinitions.html +590 -0
  182. data/docs/Tasker/Constants/LifecycleEvents.html +137 -0
  183. data/docs/Tasker/Constants/ObservabilityEvents/Step.html +152 -0
  184. data/docs/Tasker/Constants/ObservabilityEvents/Task.html +142 -0
  185. data/docs/Tasker/Constants/ObservabilityEvents.html +126 -0
  186. data/docs/Tasker/Constants/RegistryEvents.html +285 -0
  187. data/docs/Tasker/Constants/StepEvents.html +177 -0
  188. data/docs/Tasker/Constants/TaskEvents.html +167 -0
  189. data/docs/Tasker/Constants/TaskExecution/ExecutionStatus.html +207 -0
  190. data/docs/Tasker/Constants/TaskExecution/HealthStatus.html +191 -0
  191. data/docs/Tasker/Constants/TaskExecution/RecommendedAction.html +207 -0
  192. data/docs/Tasker/Constants/TaskExecution.html +126 -0
  193. data/docs/Tasker/Constants/TaskFinalization/ErrorMessages.html +132 -0
  194. data/docs/Tasker/Constants/TaskFinalization/PendingReasons.html +207 -0
  195. data/docs/Tasker/Constants/TaskFinalization/ReenqueueReasons.html +239 -0
  196. data/docs/Tasker/Constants/TaskFinalization.html +126 -0
  197. data/docs/Tasker/Constants/TaskStatuses.html +223 -0
  198. data/docs/Tasker/Constants/TestEvents.html +163 -0
  199. data/docs/Tasker/Constants/WorkflowEvents.html +222 -0
  200. data/docs/Tasker/Constants/WorkflowStepStatuses.html +223 -0
  201. data/docs/Tasker/Constants.html +561 -0
  202. data/docs/Tasker/DependentSystem.html +137 -0
  203. data/docs/Tasker/DependentSystemObjectMap.html +250 -0
  204. data/docs/Tasker/DetectorRegistry.html +598 -0
  205. data/docs/Tasker/Diagram/Edge.html +1191 -0
  206. data/docs/Tasker/Diagram/Flowchart.html +1539 -0
  207. data/docs/Tasker/Diagram/Node.html +1165 -0
  208. data/docs/Tasker/Diagram.html +117 -0
  209. data/docs/Tasker/Engine.html +215 -0
  210. data/docs/Tasker/Error.html +139 -0
  211. data/docs/Tasker/Events/Bus.html +1226 -0
  212. data/docs/Tasker/Events/Catalog/CatalogPrinter.html +258 -0
  213. data/docs/Tasker/Events/Catalog/CustomEventRegistrar.html +276 -0
  214. data/docs/Tasker/Events/Catalog/ExamplePayloadGenerator.html +294 -0
  215. data/docs/Tasker/Events/Catalog.html +1291 -0
  216. data/docs/Tasker/Events/CustomRegistry.html +943 -0
  217. data/docs/Tasker/Events/DefinitionLoader.html +575 -0
  218. data/docs/Tasker/Events/EventPayloadBuilder/ErrorInfoExtractor.html +286 -0
  219. data/docs/Tasker/Events/EventPayloadBuilder/StepPayloadBuilder.html +312 -0
  220. data/docs/Tasker/Events/EventPayloadBuilder.html +664 -0
  221. data/docs/Tasker/Events/Publisher.html +365 -0
  222. data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer/ErrorTypeClassifier.html +1128 -0
  223. data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer.html +270 -0
  224. data/docs/Tasker/Events/Subscribers/BaseSubscriber/MetricTagsExtractor.html +266 -0
  225. data/docs/Tasker/Events/Subscribers/BaseSubscriber.html +2556 -0
  226. data/docs/Tasker/Events/Subscribers/MetricsSubscriber.html +723 -0
  227. data/docs/Tasker/Events/Subscribers/TelemetrySubscriber.html +2251 -0
  228. data/docs/Tasker/Events/Subscribers.html +117 -0
  229. data/docs/Tasker/Events/SubscriptionLoader.html +493 -0
  230. data/docs/Tasker/Events.html +294 -0
  231. data/docs/Tasker/EventsGenerator.html +459 -0
  232. data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics/AnalyticsMetrics.html +135 -0
  233. data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics.html +412 -0
  234. data/docs/Tasker/Functions/FunctionBasedDependencyLevels.html +598 -0
  235. data/docs/Tasker/Functions/FunctionBasedSlowestSteps/SlowestStep.html +135 -0
  236. data/docs/Tasker/Functions/FunctionBasedSlowestSteps.html +453 -0
  237. data/docs/Tasker/Functions/FunctionBasedSlowestTasks/SlowestTask.html +135 -0
  238. data/docs/Tasker/Functions/FunctionBasedSlowestTasks.html +453 -0
  239. data/docs/Tasker/Functions/FunctionBasedStepReadinessStatus.html +1457 -0
  240. data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts/HealthMetrics.html +135 -0
  241. data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts.html +370 -0
  242. data/docs/Tasker/Functions/FunctionBasedTaskExecutionContext.html +1250 -0
  243. data/docs/Tasker/Functions/FunctionWrapper.html +479 -0
  244. data/docs/Tasker/Functions.html +117 -0
  245. data/docs/Tasker/Generators/AuthenticatorGenerator/UsageInstructionsFormatter.html +244 -0
  246. data/docs/Tasker/Generators/AuthenticatorGenerator.html +373 -0
  247. data/docs/Tasker/Generators/AuthorizationCoordinatorGenerator.html +430 -0
  248. data/docs/Tasker/Generators/SubscriberGenerator.html +377 -0
  249. data/docs/Tasker/Generators/TaskHandlerGenerator.html +263 -0
  250. data/docs/Tasker/Generators.html +117 -0
  251. data/docs/Tasker/GraphQLTypes/AnnotationType.html +132 -0
  252. data/docs/Tasker/GraphQLTypes/BaseArgument.html +124 -0
  253. data/docs/Tasker/GraphQLTypes/BaseConnection.html +124 -0
  254. data/docs/Tasker/GraphQLTypes/BaseEdge.html +130 -0
  255. data/docs/Tasker/GraphQLTypes/BaseEnum.html +124 -0
  256. data/docs/Tasker/GraphQLTypes/BaseField.html +124 -0
  257. data/docs/Tasker/GraphQLTypes/BaseInputObject.html +124 -0
  258. data/docs/Tasker/GraphQLTypes/BaseInterface.html +116 -0
  259. data/docs/Tasker/GraphQLTypes/BaseObject.html +128 -0
  260. data/docs/Tasker/GraphQLTypes/BaseScalar.html +124 -0
  261. data/docs/Tasker/GraphQLTypes/BaseUnion.html +124 -0
  262. data/docs/Tasker/GraphQLTypes/DependentSystemObjectMapType.html +132 -0
  263. data/docs/Tasker/GraphQLTypes/DependentSystemType.html +132 -0
  264. data/docs/Tasker/GraphQLTypes/MutationType.html +132 -0
  265. data/docs/Tasker/GraphQLTypes/NamedStepType.html +132 -0
  266. data/docs/Tasker/GraphQLTypes/NamedTaskType.html +132 -0
  267. data/docs/Tasker/GraphQLTypes/NamedTasksNamedStepType.html +132 -0
  268. data/docs/Tasker/GraphQLTypes/NodeType.html +118 -0
  269. data/docs/Tasker/GraphQLTypes/QueryType.html +139 -0
  270. data/docs/Tasker/GraphQLTypes/TaskAnnotationType.html +132 -0
  271. data/docs/Tasker/GraphQLTypes/TaskInterface.html +111 -0
  272. data/docs/Tasker/GraphQLTypes/TaskType.html +201 -0
  273. data/docs/Tasker/GraphQLTypes/WorkflowStepType.html +694 -0
  274. data/docs/Tasker/GraphQLTypes.html +130 -0
  275. data/docs/Tasker/GraphqlController.html +251 -0
  276. data/docs/Tasker/HandlerFactory.html +1518 -0
  277. data/docs/Tasker/HandlerSerializer.html +682 -0
  278. data/docs/Tasker/HandlersController.html +574 -0
  279. data/docs/Tasker/HashIdentityStrategy.html +278 -0
  280. data/docs/Tasker/Health/ReadinessChecker.html +712 -0
  281. data/docs/Tasker/Health/StatusChecker.html +653 -0
  282. data/docs/Tasker/Health.html +117 -0
  283. data/docs/Tasker/HealthController.html +523 -0
  284. data/docs/Tasker/IdentityStrategy.html +276 -0
  285. data/docs/Tasker/InvalidTaskHandlerConfig.html +135 -0
  286. data/docs/Tasker/LifecycleEvents/Events/Step.html +162 -0
  287. data/docs/Tasker/LifecycleEvents/Events/Task.html +162 -0
  288. data/docs/Tasker/LifecycleEvents/Events.html +204 -0
  289. data/docs/Tasker/LifecycleEvents/Publisher.html +132 -0
  290. data/docs/Tasker/LifecycleEvents.html +799 -0
  291. data/docs/Tasker/Logging/CorrelationIdGenerator.html +688 -0
  292. data/docs/Tasker/Logging.html +115 -0
  293. data/docs/Tasker/MetricsController.html +293 -0
  294. data/docs/Tasker/MetricsExportJob.html +414 -0
  295. data/docs/Tasker/Mutations/BaseMutation.html +128 -0
  296. data/docs/Tasker/Mutations/CancelStep.html +219 -0
  297. data/docs/Tasker/Mutations/CancelTask.html +221 -0
  298. data/docs/Tasker/Mutations/CreateTask.html +243 -0
  299. data/docs/Tasker/Mutations/UpdateStep.html +243 -0
  300. data/docs/Tasker/Mutations/UpdateTask.html +243 -0
  301. data/docs/Tasker/Mutations.html +117 -0
  302. data/docs/Tasker/NamedStep.html +216 -0
  303. data/docs/Tasker/NamedTask.html +910 -0
  304. data/docs/Tasker/NamedTasksNamedStep.html +435 -0
  305. data/docs/Tasker/Orchestration/BackoffCalculator.html +404 -0
  306. data/docs/Tasker/Orchestration/ConnectionBuilder/ConfigValidator.html +258 -0
  307. data/docs/Tasker/Orchestration/ConnectionBuilder.html +435 -0
  308. data/docs/Tasker/Orchestration/ConnectionPoolIntelligence.html +513 -0
  309. data/docs/Tasker/Orchestration/Coordinator.html +641 -0
  310. data/docs/Tasker/Orchestration/FutureStateAnalyzer.html +1045 -0
  311. data/docs/Tasker/Orchestration/Orchestrator.html +679 -0
  312. data/docs/Tasker/Orchestration/PluginIntegration.html +1127 -0
  313. data/docs/Tasker/Orchestration/ResponseProcessor.html +504 -0
  314. data/docs/Tasker/Orchestration/RetryHeaderParser.html +304 -0
  315. data/docs/Tasker/Orchestration/StepExecutor.html +995 -0
  316. data/docs/Tasker/Orchestration/StepSequenceFactory.html +644 -0
  317. data/docs/Tasker/Orchestration/TaskFinalizer/BlockageChecker.html +264 -0
  318. data/docs/Tasker/Orchestration/TaskFinalizer/ContextManager.html +254 -0
  319. data/docs/Tasker/Orchestration/TaskFinalizer/DelayCalculator.html +556 -0
  320. data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationDecisionMaker.html +348 -0
  321. data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationProcessor.html +286 -0
  322. data/docs/Tasker/Orchestration/TaskFinalizer/ReasonDeterminer.html +432 -0
  323. data/docs/Tasker/Orchestration/TaskFinalizer/ReenqueueManager.html +296 -0
  324. data/docs/Tasker/Orchestration/TaskFinalizer/UnclearStateHandler.html +314 -0
  325. data/docs/Tasker/Orchestration/TaskFinalizer.html +1212 -0
  326. data/docs/Tasker/Orchestration/TaskInitializer.html +766 -0
  327. data/docs/Tasker/Orchestration/TaskReenqueuer.html +506 -0
  328. data/docs/Tasker/Orchestration/ViableStepDiscovery.html +442 -0
  329. data/docs/Tasker/Orchestration/WorkflowCoordinator.html +510 -0
  330. data/docs/Tasker/Orchestration.html +130 -0
  331. data/docs/Tasker/PageSort/PageSortParamsBuilder.html +296 -0
  332. data/docs/Tasker/PageSort.html +247 -0
  333. data/docs/Tasker/PermanentError.html +518 -0
  334. data/docs/Tasker/ProceduralError.html +147 -0
  335. data/docs/Tasker/Queries/AllAnnotationTypes.html +217 -0
  336. data/docs/Tasker/Queries/AllTasks.html +221 -0
  337. data/docs/Tasker/Queries/BaseQuery.html +128 -0
  338. data/docs/Tasker/Queries/Helpers.html +187 -0
  339. data/docs/Tasker/Queries/OneStep.html +225 -0
  340. data/docs/Tasker/Queries/OneTask.html +217 -0
  341. data/docs/Tasker/Queries/TasksByAnnotation.html +231 -0
  342. data/docs/Tasker/Queries/TasksByStatus.html +233 -0
  343. data/docs/Tasker/Queries.html +119 -0
  344. data/docs/Tasker/Railtie.html +124 -0
  345. data/docs/Tasker/Registry/BaseRegistry.html +1690 -0
  346. data/docs/Tasker/Registry/EventPublisher.html +667 -0
  347. data/docs/Tasker/Registry/InterfaceValidator.html +569 -0
  348. data/docs/Tasker/Registry/RegistrationError.html +132 -0
  349. data/docs/Tasker/Registry/RegistryError.html +139 -0
  350. data/docs/Tasker/Registry/StatisticsCollector.html +841 -0
  351. data/docs/Tasker/Registry/SubscriberRegistry.html +1504 -0
  352. data/docs/Tasker/Registry/ValidationError.html +132 -0
  353. data/docs/Tasker/Registry.html +119 -0
  354. data/docs/Tasker/RetryableError.html +515 -0
  355. data/docs/Tasker/StateMachine/Compatibility.html +282 -0
  356. data/docs/Tasker/StateMachine/InvalidStateTransition.html +135 -0
  357. data/docs/Tasker/StateMachine/StepStateMachine/StandardizedPayloadBuilder.html +260 -0
  358. data/docs/Tasker/StateMachine/StepStateMachine.html +2215 -0
  359. data/docs/Tasker/StateMachine/TaskStateMachine.html +734 -0
  360. data/docs/Tasker/StateMachine.html +602 -0
  361. data/docs/Tasker/StepDagRelationship.html +657 -0
  362. data/docs/Tasker/StepHandler/Api/Config.html +1091 -0
  363. data/docs/Tasker/StepHandler/Api.html +884 -0
  364. data/docs/Tasker/StepHandler/AutomaticEventPublishing.html +321 -0
  365. data/docs/Tasker/StepHandler/Base.html +970 -0
  366. data/docs/Tasker/StepHandler.html +119 -0
  367. data/docs/Tasker/StepReadinessStatus.html +836 -0
  368. data/docs/Tasker/Task.html +2575 -0
  369. data/docs/Tasker/TaskAnnotation.html +137 -0
  370. data/docs/Tasker/TaskAnnotationSerializer.html +124 -0
  371. data/docs/Tasker/TaskBuilder/StepNameValidator.html +264 -0
  372. data/docs/Tasker/TaskBuilder/StepTemplateDefiner.html +264 -0
  373. data/docs/Tasker/TaskBuilder.html +764 -0
  374. data/docs/Tasker/TaskDiagram/StepToStepEdgeBuilder.html +260 -0
  375. data/docs/Tasker/TaskDiagram/TaskToRootStepEdgeBuilder.html +290 -0
  376. data/docs/Tasker/TaskDiagram.html +548 -0
  377. data/docs/Tasker/TaskDiagramsController.html +240 -0
  378. data/docs/Tasker/TaskExecutionContext.html +469 -0
  379. data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/ClassBasedEventRegistrar.html +238 -0
  380. data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/YamlEventRegistrar.html +254 -0
  381. data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner.html +988 -0
  382. data/docs/Tasker/TaskHandler/ClassMethods.html +357 -0
  383. data/docs/Tasker/TaskHandler/InstanceMethods.html +1396 -0
  384. data/docs/Tasker/TaskHandler/StepGroup.html +1748 -0
  385. data/docs/Tasker/TaskHandler.html +271 -0
  386. data/docs/Tasker/TaskNamespace.html +312 -0
  387. data/docs/Tasker/TaskRunnerJob.html +406 -0
  388. data/docs/Tasker/TaskSerializer.html +474 -0
  389. data/docs/Tasker/TaskTransition.html +1517 -0
  390. data/docs/Tasker/TaskWorkflowSummary.html +988 -0
  391. data/docs/Tasker/TaskerRailsSchema/InvalidObjectTypeError.html +132 -0
  392. data/docs/Tasker/TaskerRailsSchema/TypeResolutionError.html +139 -0
  393. data/docs/Tasker/TaskerRailsSchema/UnknownInterfaceError.html +132 -0
  394. data/docs/Tasker/TaskerRailsSchema.html +384 -0
  395. data/docs/Tasker/TasksController.html +595 -0
  396. data/docs/Tasker/Telemetry/EventMapping.html +1307 -0
  397. data/docs/Tasker/Telemetry/EventRouter.html +2178 -0
  398. data/docs/Tasker/Telemetry/Events/ExportEvents.html +246 -0
  399. data/docs/Tasker/Telemetry/Events.html +115 -0
  400. data/docs/Tasker/Telemetry/ExportCoordinator/DistributedLockTimeoutError.html +135 -0
  401. data/docs/Tasker/Telemetry/ExportCoordinator.html +2137 -0
  402. data/docs/Tasker/Telemetry/IntelligentCacheManager.html +1083 -0
  403. data/docs/Tasker/Telemetry/LogBackend.html +1088 -0
  404. data/docs/Tasker/Telemetry/MetricTypes/Counter.html +1054 -0
  405. data/docs/Tasker/Telemetry/MetricTypes/Gauge.html +1270 -0
  406. data/docs/Tasker/Telemetry/MetricTypes/Histogram.html +1492 -0
  407. data/docs/Tasker/Telemetry/MetricTypes.html +153 -0
  408. data/docs/Tasker/Telemetry/MetricsBackend.html +2510 -0
  409. data/docs/Tasker/Telemetry/MetricsExportService.html +578 -0
  410. data/docs/Tasker/Telemetry/PluginRegistry.html +1774 -0
  411. data/docs/Tasker/Telemetry/Plugins/BaseExporter.html +1835 -0
  412. data/docs/Tasker/Telemetry/Plugins/CsvExporter.html +768 -0
  413. data/docs/Tasker/Telemetry/Plugins/JsonExporter.html +747 -0
  414. data/docs/Tasker/Telemetry/Plugins.html +117 -0
  415. data/docs/Tasker/Telemetry/PrometheusExporter.html +481 -0
  416. data/docs/Tasker/Telemetry/TraceBackend.html +891 -0
  417. data/docs/Tasker/Telemetry.html +130 -0
  418. data/docs/Tasker/Types/AuthConfig.html +886 -0
  419. data/docs/Tasker/Types/BackoffConfig.html +1063 -0
  420. data/docs/Tasker/Types/BaseConfig.html +227 -0
  421. data/docs/Tasker/Types/CacheConfig.html +1731 -0
  422. data/docs/Tasker/Types/DatabaseConfig.html +388 -0
  423. data/docs/Tasker/Types/DependencyGraph.html +526 -0
  424. data/docs/Tasker/Types/DependencyGraphConfig.html +753 -0
  425. data/docs/Tasker/Types/EngineConfig.html +1181 -0
  426. data/docs/Tasker/Types/ExecutionConfig.html +1963 -0
  427. data/docs/Tasker/Types/GraphEdge.html +517 -0
  428. data/docs/Tasker/Types/GraphMetadata.html +781 -0
  429. data/docs/Tasker/Types/GraphNode.html +694 -0
  430. data/docs/Tasker/Types/HealthConfig.html +784 -0
  431. data/docs/Tasker/Types/StepSequence.html +353 -0
  432. data/docs/Tasker/Types/StepTemplate.html +1193 -0
  433. data/docs/Tasker/Types/TaskRequest.html +1179 -0
  434. data/docs/Tasker/Types/TelemetryConfig.html +2746 -0
  435. data/docs/Tasker/Types.html +154 -0
  436. data/docs/Tasker/WorkflowStep/StepFinder.html +282 -0
  437. data/docs/Tasker/WorkflowStep.html +2724 -0
  438. data/docs/Tasker/WorkflowStepEdge.html +304 -0
  439. data/docs/Tasker/WorkflowStepSerializer.html +305 -0
  440. data/docs/Tasker/WorkflowStepTransition/TransitionDescriptionFormatter.html +282 -0
  441. data/docs/Tasker/WorkflowStepTransition.html +2201 -0
  442. data/docs/Tasker/WorkflowStepsController.html +462 -0
  443. data/docs/Tasker.html +452 -0
  444. data/docs/VISION.md +584 -0
  445. data/docs/WHY.md +21 -0
  446. data/docs/_index.html +2375 -0
  447. data/docs/class_list.html +54 -0
  448. data/docs/css/common.css +1 -0
  449. data/docs/css/full_list.css +58 -0
  450. data/docs/css/style.css +503 -0
  451. data/docs/events/migration_plan_outcomes.md +80 -0
  452. data/docs/file.README.html +541 -0
  453. data/docs/file_list.html +59 -0
  454. data/docs/frames.html +22 -0
  455. data/docs/index.html +541 -0
  456. data/docs/js/app.js +344 -0
  457. data/docs/js/full_list.js +242 -0
  458. data/docs/js/jquery.js +4 -0
  459. data/docs/method_list.html +9182 -0
  460. data/docs/top-level-namespace.html +110 -0
  461. data/lib/generators/tasker/authenticator_generator.rb +301 -0
  462. data/lib/generators/tasker/authorization_coordinator_generator.rb +139 -0
  463. data/lib/generators/tasker/events_generator.rb +91 -0
  464. data/lib/generators/tasker/subscriber_generator.rb +107 -0
  465. data/lib/generators/tasker/task_handler_generator.rb +138 -0
  466. data/lib/generators/tasker/templates/api_token_authenticator.rb.erb +113 -0
  467. data/lib/generators/tasker/templates/api_token_authenticator_spec.rb.erb +144 -0
  468. data/lib/generators/tasker/templates/authorization_coordinator.rb.erb +95 -0
  469. data/lib/generators/tasker/templates/authorization_coordinator_spec.rb.erb +142 -0
  470. data/lib/generators/tasker/templates/custom_authenticator.rb.erb +108 -0
  471. data/lib/generators/tasker/templates/custom_authenticator_spec.rb.erb +162 -0
  472. data/lib/generators/tasker/templates/custom_events.yml.erb +62 -0
  473. data/lib/generators/tasker/templates/custom_subscriber.rb.erb +72 -0
  474. data/lib/generators/tasker/templates/devise_authenticator.rb.erb +101 -0
  475. data/lib/generators/tasker/templates/devise_authenticator_spec.rb.erb +126 -0
  476. data/lib/generators/tasker/templates/initialize.rb.erb +202 -0
  477. data/lib/generators/tasker/templates/jwt_authenticator.rb.erb +144 -0
  478. data/lib/generators/tasker/templates/jwt_authenticator_spec.rb.erb +298 -0
  479. data/lib/generators/tasker/templates/metrics_subscriber.rb.erb +258 -0
  480. data/lib/generators/tasker/templates/metrics_subscriber_spec.rb.erb +308 -0
  481. data/lib/generators/tasker/templates/omniauth_authenticator.rb.erb +135 -0
  482. data/lib/generators/tasker/templates/omniauth_authenticator_spec.rb.erb +196 -0
  483. data/lib/generators/tasker/templates/opentelemetry_initializer.rb +52 -0
  484. data/lib/generators/tasker/templates/subscriber.rb.erb +64 -0
  485. data/lib/generators/tasker/templates/subscriber_spec.rb.erb +80 -0
  486. data/lib/generators/tasker/templates/task_config.yaml.erb +117 -0
  487. data/lib/generators/tasker/templates/task_handler.rb.erb +59 -0
  488. data/lib/generators/tasker/templates/task_handler_spec.rb.erb +159 -0
  489. data/lib/tasker/analysis/runtime_graph_analyzer.rb +1168 -0
  490. data/lib/tasker/analysis/template_graph_analyzer.rb +328 -0
  491. data/lib/tasker/authentication/coordinator.rb +78 -0
  492. data/lib/tasker/authentication/errors.rb +9 -0
  493. data/lib/tasker/authentication/interface.rb +36 -0
  494. data/lib/tasker/authentication/none_authenticator.rb +26 -0
  495. data/lib/tasker/authorization/base_coordinator.rb +112 -0
  496. data/lib/tasker/authorization/errors.rb +26 -0
  497. data/lib/tasker/authorization/resource_constants.rb +74 -0
  498. data/lib/tasker/authorization/resource_registry.rb +143 -0
  499. data/lib/tasker/authorization.rb +75 -0
  500. data/lib/tasker/cache_capabilities.rb +131 -0
  501. data/lib/tasker/cache_strategy.rb +469 -0
  502. data/lib/tasker/concerns/authenticatable.rb +41 -0
  503. data/lib/tasker/concerns/authorizable.rb +204 -0
  504. data/lib/tasker/concerns/controller_authorizable.rb +124 -0
  505. data/lib/tasker/concerns/event_publisher.rb +716 -0
  506. data/lib/tasker/concerns/idempotent_state_transitions.rb +128 -0
  507. data/lib/tasker/concerns/state_machine_base.rb +218 -0
  508. data/lib/tasker/concerns/structured_logging.rb +387 -0
  509. data/lib/tasker/configuration.rb +325 -0
  510. data/lib/tasker/constants/event_definitions.rb +147 -0
  511. data/lib/tasker/constants/registry_events.rb +54 -0
  512. data/lib/tasker/constants.rb +417 -0
  513. data/lib/tasker/engine.rb +90 -0
  514. data/lib/tasker/errors.rb +90 -0
  515. data/lib/tasker/events/catalog.rb +432 -0
  516. data/lib/tasker/events/custom_registry.rb +175 -0
  517. data/lib/tasker/events/definition_loader.rb +199 -0
  518. data/lib/tasker/events/event_payload_builder.rb +461 -0
  519. data/lib/tasker/events/publisher.rb +149 -0
  520. data/lib/tasker/events/subscribers/base_subscriber.rb +601 -0
  521. data/lib/tasker/events/subscribers/metrics_subscriber.rb +120 -0
  522. data/lib/tasker/events/subscribers/telemetry_subscriber.rb +462 -0
  523. data/lib/tasker/events/subscription_loader.rb +161 -0
  524. data/lib/tasker/events.rb +37 -0
  525. data/lib/tasker/functions/function_based_analytics_metrics.rb +103 -0
  526. data/lib/tasker/functions/function_based_dependency_levels.rb +54 -0
  527. data/lib/tasker/functions/function_based_slowest_steps.rb +84 -0
  528. data/lib/tasker/functions/function_based_slowest_tasks.rb +84 -0
  529. data/lib/tasker/functions/function_based_step_readiness_status.rb +183 -0
  530. data/lib/tasker/functions/function_based_system_health_counts.rb +94 -0
  531. data/lib/tasker/functions/function_based_task_execution_context.rb +148 -0
  532. data/lib/tasker/functions/function_wrapper.rb +42 -0
  533. data/lib/tasker/functions.rb +12 -0
  534. data/lib/tasker/handler_factory.rb +322 -0
  535. data/lib/tasker/health/readiness_checker.rb +186 -0
  536. data/lib/tasker/health/status_checker.rb +203 -0
  537. data/lib/tasker/identity_strategy.rb +38 -0
  538. data/lib/tasker/logging/correlation_id_generator.rb +120 -0
  539. data/lib/tasker/orchestration/backoff_calculator.rb +184 -0
  540. data/lib/tasker/orchestration/connection_builder.rb +122 -0
  541. data/lib/tasker/orchestration/connection_pool_intelligence.rb +177 -0
  542. data/lib/tasker/orchestration/coordinator.rb +119 -0
  543. data/lib/tasker/orchestration/future_state_analyzer.rb +137 -0
  544. data/lib/tasker/orchestration/plugin_integration.rb +124 -0
  545. data/lib/tasker/orchestration/response_processor.rb +168 -0
  546. data/lib/tasker/orchestration/retry_header_parser.rb +78 -0
  547. data/lib/tasker/orchestration/step_executor.rb +941 -0
  548. data/lib/tasker/orchestration/step_sequence_factory.rb +67 -0
  549. data/lib/tasker/orchestration/task_finalizer.rb +564 -0
  550. data/lib/tasker/orchestration/task_initializer.rb +140 -0
  551. data/lib/tasker/orchestration/task_reenqueuer.rb +71 -0
  552. data/lib/tasker/orchestration/viable_step_discovery.rb +65 -0
  553. data/lib/tasker/orchestration/workflow_coordinator.rb +294 -0
  554. data/lib/tasker/orchestration.rb +45 -0
  555. data/lib/tasker/railtie.rb +9 -0
  556. data/lib/tasker/registry/base_registry.rb +177 -0
  557. data/lib/tasker/registry/event_publisher.rb +91 -0
  558. data/lib/tasker/registry/interface_validator.rb +140 -0
  559. data/lib/tasker/registry/statistics_collector.rb +381 -0
  560. data/lib/tasker/registry/subscriber_registry.rb +285 -0
  561. data/lib/tasker/registry.rb +22 -0
  562. data/lib/tasker/state_machine/step_state_machine.rb +508 -0
  563. data/lib/tasker/state_machine/task_state_machine.rb +192 -0
  564. data/lib/tasker/state_machine.rb +83 -0
  565. data/lib/tasker/step_handler/api.rb +410 -0
  566. data/lib/tasker/step_handler/base.rb +206 -0
  567. data/lib/tasker/task_builder.rb +432 -0
  568. data/lib/tasker/task_handler/class_methods.rb +324 -0
  569. data/lib/tasker/task_handler/instance_methods.rb +293 -0
  570. data/lib/tasker/task_handler/step_group.rb +182 -0
  571. data/lib/tasker/task_handler.rb +43 -0
  572. data/lib/tasker/telemetry/event_mapping.rb +126 -0
  573. data/lib/tasker/telemetry/event_router.rb +318 -0
  574. data/lib/tasker/telemetry/events/export_events.rb +38 -0
  575. data/lib/tasker/telemetry/export_coordinator.rb +497 -0
  576. data/lib/tasker/telemetry/intelligent_cache_manager.rb +508 -0
  577. data/lib/tasker/telemetry/log_backend.rb +224 -0
  578. data/lib/tasker/telemetry/metric_types.rb +368 -0
  579. data/lib/tasker/telemetry/metrics_backend.rb +1227 -0
  580. data/lib/tasker/telemetry/metrics_export_service.rb +392 -0
  581. data/lib/tasker/telemetry/plugin_registry.rb +333 -0
  582. data/lib/tasker/telemetry/plugins/base_exporter.rb +246 -0
  583. data/lib/tasker/telemetry/plugins/csv_exporter.rb +198 -0
  584. data/lib/tasker/telemetry/plugins/json_exporter.rb +141 -0
  585. data/lib/tasker/telemetry/prometheus_exporter.rb +249 -0
  586. data/lib/tasker/telemetry/trace_backend.rb +186 -0
  587. data/lib/tasker/telemetry.rb +59 -0
  588. data/lib/tasker/types/auth_config.rb +81 -0
  589. data/lib/tasker/types/backoff_config.rb +142 -0
  590. data/lib/tasker/types/cache_config.rb +257 -0
  591. data/lib/tasker/types/database_config.rb +39 -0
  592. data/lib/tasker/types/dependency_graph.rb +225 -0
  593. data/lib/tasker/types/dependency_graph_config.rb +149 -0
  594. data/lib/tasker/types/engine_config.rb +131 -0
  595. data/lib/tasker/types/execution_config.rb +289 -0
  596. data/lib/tasker/types/health_config.rb +84 -0
  597. data/lib/tasker/types/step_sequence.rb +24 -0
  598. data/lib/tasker/types/step_template.rb +63 -0
  599. data/lib/tasker/types/task_request.rb +60 -0
  600. data/lib/tasker/types/telemetry_config.rb +273 -0
  601. data/lib/tasker/types.rb +64 -0
  602. data/lib/tasker/version.rb +7 -0
  603. data/lib/tasker.rb +82 -0
  604. data/lib/tasks/tasker_tasks.rake +302 -0
  605. metadata +958 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: dd2231fa336087118193cb1ed54b98838f396210d88b44ff2eb994ebc12cc12f
4
+ data.tar.gz: 1e0f9172ccac70c3d712cdb038779158eb1edcd9e81e9402a3888a0ba12cb85c
5
+ SHA512:
6
+ metadata.gz: 4cf9d080d61f3954b1d06749ee71f1a7508bd10272ca7be10476cfe45880d45048ea986fc5a510233ae9f92f549ba160f0ae93cf16a5e92fd3bcd4282deb69fa
7
+ data.tar.gz: c810d613f87f099bfb948f306fb7fc57e568427a7eb453acf2a0a602d270e31bd0f9e8e438e134f5d60e11ea3e63a7b00dc994ec76f664fa331a061453b0b4dc
data/LICENSE ADDED
@@ -0,0 +1,22 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright 2021 Pete Taylor
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,443 @@
1
+ [![CI](https://github.com/tasker-systems/tasker/actions/workflows/main.yml/badge.svg)](https://github.com/tasker-systems/tasker/actions/workflows/main.yml)
2
+ ![GitHub](https://img.shields.io/github/license/tasker-systems/tasker)
3
+ ![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/tasker-systems/tasker?color=blue&sort=semver)
4
+ [![GitBook](https://img.shields.io/static/v1?message=Documented%20on%20GitBook&logo=gitbook&logoColor=ffffff&label=%20&labelColor=5c5c5c&color=3F89A1)](https://www.gitbook.com/preview?utm_source=gitbook_readme_badge&utm_medium=organic&utm_campaign=preview_documentation&utm_content=link)
5
+
6
+ # Tasker: Making Complex Workflows Easy-ish
7
+
8
+ ## What is Tasker?
9
+
10
+ Tasker is a **production-ready Rails engine** that transforms complex, multi-step processes into reliable, observable workflows. It handles the orchestration complexity so you can focus on your business logic.
11
+
12
+ ### 🚀 Key Capabilities
13
+ - **Complex Workflow Patterns**: Linear, diamond, tree, and parallel merge workflows
14
+ - **Intelligent Retry Logic**: Exponential backoff with configurable retry limits
15
+ - **Production Resilience**: Automatic failure recovery and retry orchestration
16
+ - **Complete Observability**: Event-driven architecture with comprehensive telemetry
17
+ - **Enterprise Security**: Authentication & authorization with GraphQL operation-level permissions
18
+ - **High Performance**: SQL-function based orchestration with 4x performance gains
19
+ - **Thread-Safe Registry Systems**: Enterprise-grade registry architecture with structured logging
20
+ - **Advanced Plugin Architecture**: Extensible plugin system with format-based discovery
21
+
22
+ Perfect for processes that involve multiple interdependent steps, require automatic retries, need visibility into progress and errors, and must handle transient failures gracefully.
23
+
24
+ ## Quick Installation
25
+
26
+ ### Option 1: Add to Existing Rails App
27
+
28
+ Add Tasker to your Rails app's `Gemfile`:
29
+
30
+ ```ruby
31
+ source 'https://rubygems.pkg.github.com/tasker-systems' do
32
+ gem 'tasker-engine', '~> 1.0.0'
33
+ end
34
+ ```
35
+
36
+ Install and run the migrations:
37
+
38
+ ```bash
39
+ bundle exec rails tasker:install:migrations
40
+ bundle exec rails tasker:install:database_objects
41
+ bundle exec rails db:migrate
42
+ ```
43
+
44
+ Mount the engine and set up configuration:
45
+
46
+ ```ruby
47
+ # config/routes.rb
48
+ Rails.application.routes.draw do
49
+ mount Tasker::Engine, at: '/tasker', as: 'tasker'
50
+ end
51
+ ```
52
+
53
+ ```bash
54
+ bundle exec rails tasker:setup
55
+ ```
56
+
57
+ ### Option 2: Generate Complete Application (v2.6.1)
58
+
59
+ Create a production-ready Rails application with Tasker integration in one command:
60
+
61
+ ```bash
62
+ # Traditional setup
63
+ curl -fsSL https://raw.githubusercontent.com/tasker-systems/tasker/main/scripts/install-tasker-app.sh | bash
64
+
65
+ # Docker-based development environment
66
+ curl -fsSL https://raw.githubusercontent.com/tasker-systems/tasker/main/scripts/install-tasker-app.sh | bash -s -- \
67
+ --app-name my-tasker-app \
68
+ --docker \
69
+ --with-observability
70
+ ```
71
+
72
+ Includes complete application templates for e-commerce, inventory management, and customer onboarding workflows. See [Application Generator Guide](docs/APPLICATION_GENERATOR.md) for details.
73
+
74
+ ## Core Concepts
75
+
76
+ Tasker organizes workflows around these key concepts:
77
+
78
+ - **Tasks**: The overall process to be executed
79
+ - **TaskNamespaces**: Organizational hierarchy for grouping related task types
80
+ - **TaskHandlers**: Classes that define and coordinate workflow steps
81
+ - **Steps**: Individual units of work within a task
82
+ - **StepHandlers**: Classes that implement the logic for each step
83
+ - **Dependencies**: Relationships between steps that determine execution order
84
+ - **Versioning**: Semantic versioning support for task handlers with coexistence
85
+
86
+ ### TaskNamespace Organization
87
+
88
+ Tasker supports organizing task handlers into logical namespaces for better organization and isolation:
89
+
90
+ ```ruby
91
+ # Different namespaces can have tasks with the same name
92
+ payments_task = Tasker::HandlerFactory.instance.get(
93
+ 'process_order',
94
+ namespace_name: 'payments',
95
+ version: '2.1.0'
96
+ )
97
+
98
+ inventory_task = Tasker::HandlerFactory.instance.get(
99
+ 'process_order',
100
+ namespace_name: 'inventory',
101
+ version: '1.5.0'
102
+ )
103
+ ```
104
+
105
+ Common namespace patterns:
106
+ - **`payments`** - Payment processing workflows
107
+ - **`inventory`** - Stock and inventory management
108
+ - **`notifications`** - Email, SMS, and alert workflows
109
+ - **`integrations`** - Third-party API integrations
110
+ - **`data_processing`** - ETL and data transformation workflows
111
+ - **`default`** - General-purpose workflows (used when no namespace specified)
112
+
113
+ ## Simple Example: Order Processing
114
+
115
+ Create a task handler for processing orders:
116
+
117
+ ```bash
118
+ rails generate tasker:task_handler OrderProcess
119
+ ```
120
+
121
+ This creates a complete workflow structure:
122
+
123
+ **YAML Configuration** (`config/tasker/tasks/order_process.yaml`):
124
+ ```yaml
125
+ ---
126
+ name: order_process
127
+ namespace_name: default
128
+ version: 1.0.0
129
+ task_handler_class: OrderProcess
130
+
131
+ step_templates:
132
+ - name: validate_order
133
+ description: Validate order details
134
+ handler_class: OrderProcess::StepHandler::ValidateOrderHandler
135
+
136
+ - name: process_payment
137
+ description: Process payment for the order
138
+ depends_on_step: validate_order
139
+ handler_class: OrderProcess::StepHandler::ProcessPaymentHandler
140
+ default_retryable: true
141
+ default_retry_limit: 3
142
+
143
+ - name: send_confirmation
144
+ description: Send confirmation email
145
+ depends_on_step: process_payment
146
+ handler_class: OrderProcess::StepHandler::SendConfirmationHandler
147
+ ```
148
+
149
+ **Step Handler Implementation**:
150
+ ```ruby
151
+ module OrderProcess
152
+ module StepHandler
153
+ class ValidateOrderHandler < Tasker::StepHandler::Base
154
+ def process(task, sequence, step)
155
+ order_id = task.context['order_id']
156
+ order = Order.find(order_id)
157
+
158
+ raise "Order not found" unless order
159
+ raise "Order already processed" if order.processed?
160
+
161
+ { order: order.as_json, valid: true }
162
+ end
163
+ end
164
+ end
165
+ end
166
+ ```
167
+
168
+ **Using Your Workflow**:
169
+ ```ruby
170
+ # Create and execute a task
171
+ task_request = Tasker::Types::TaskRequest.new(
172
+ name: 'order_process',
173
+ namespace: 'default', # Optional - defaults to 'default'
174
+ version: '1.0.0', # Optional - defaults to '0.1.0'
175
+ context: { order_id: 12345 }
176
+ )
177
+
178
+ # Handler lookup now supports namespace + version
179
+ handler = Tasker::HandlerFactory.instance.get(
180
+ 'order_process',
181
+ namespace_name: 'default', # Optional - defaults to 'default'
182
+ version: '1.0.0' # Optional - defaults to '0.1.0'
183
+ )
184
+ task = handler.initialize_task!(task_request)
185
+
186
+ # Task is now queued for processing with automatic retry logic
187
+ ```
188
+
189
+ ## Advanced Features
190
+
191
+ ### Authentication & Authorization
192
+
193
+ Tasker includes enterprise-grade security that works with any Rails authentication system:
194
+
195
+ ```ruby
196
+ # config/initializers/tasker.rb
197
+ Tasker.configuration do |config|
198
+ config.auth do |auth|
199
+ auth.authentication_enabled = true
200
+ auth.authenticator_class = 'YourAuthenticator'
201
+ auth.authorization_enabled = true
202
+ auth.authorization_coordinator_class = 'YourAuthorizationCoordinator'
203
+ end
204
+ end
205
+ ```
206
+
207
+ **Automatic GraphQL Security**: Operations are automatically mapped to permissions:
208
+ ```ruby
209
+ # GraphQL query automatically requires tasker.task:index permission
210
+ query { tasks { taskId status } }
211
+
212
+ # GraphQL mutation automatically requires tasker.task:create permission
213
+ mutation { createTask(input: { name: "New Task" }) { taskId } }
214
+ ```
215
+
216
+ ### REST API & Handler Discovery
217
+
218
+ Tasker provides comprehensive REST API endpoints for handler discovery, task management, and dependency graph analysis:
219
+
220
+ **Handler Discovery API**:
221
+ ```bash
222
+ # List all namespaces with handler counts
223
+ curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
224
+ https://your-app.com/tasker/handlers
225
+
226
+ # List handlers in specific namespace
227
+ curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
228
+ https://your-app.com/tasker/handlers/payments
229
+
230
+ # Get handler details with dependency graph
231
+ curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
232
+ https://your-app.com/tasker/handlers/payments/process_order?version=2.1.0
233
+ ```
234
+
235
+ **Response includes dependency graph visualization**:
236
+ ```json
237
+ {
238
+ "id": "process_order",
239
+ "namespace": "payments",
240
+ "version": "2.1.0",
241
+ "step_templates": [...],
242
+ "dependency_graph": {
243
+ "nodes": ["validate_order", "process_payment", "send_confirmation"],
244
+ "edges": [
245
+ {"from": "validate_order", "to": "process_payment"},
246
+ {"from": "process_payment", "to": "send_confirmation"}
247
+ ],
248
+ "execution_order": ["validate_order", "process_payment", "send_confirmation"]
249
+ }
250
+ }
251
+ ```
252
+
253
+ **Task Management API**:
254
+ ```bash
255
+ # Create task with namespace/version support
256
+ curl -X POST -H "Authorization: Bearer YOUR_JWT_TOKEN" \
257
+ -H "Content-Type: application/json" \
258
+ -d '{"name": "process_order", "namespace": "payments", "version": "2.1.0", "context": {"order_id": 123}}' \
259
+ https://your-app.com/tasker/tasks
260
+
261
+ # List tasks with namespace filtering
262
+ curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
263
+ "https://your-app.com/tasker/tasks?namespace=payments&version=2.1.0"
264
+ ```
265
+
266
+ ### Event System & Integrations
267
+
268
+ Tasker provides comprehensive event-driven observability for custom integrations:
269
+
270
+ ```ruby
271
+ class OrderEventsSubscriber < Tasker::Events::Subscribers::BaseSubscriber
272
+ subscribe_to 'task.completed', 'task.failed'
273
+
274
+ def handle_task_completed(event)
275
+ task_id = safe_get(event, :task_id)
276
+ NotificationService.send_success_email(task_id: task_id)
277
+ end
278
+
279
+ def handle_task_failed(event)
280
+ task_id = safe_get(event, :task_id)
281
+ error_message = safe_get(event, :error_message)
282
+ AlertService.send_failure_alert(task_id: task_id, error: error_message)
283
+ end
284
+ end
285
+ ```
286
+
287
+ ### Telemetry & Observability
288
+
289
+ Built-in OpenTelemetry integration provides complete observability:
290
+
291
+ ```ruby
292
+ # config/initializers/tasker.rb
293
+ Tasker.configuration do |config|
294
+ config.telemetry do |tel|
295
+ tel.enabled = true
296
+ tel.service_name = 'my-app-workflows'
297
+ tel.service_version = '1.0.0'
298
+ end
299
+ end
300
+ ```
301
+
302
+ Compatible with Jaeger, Zipkin, Honeycomb, and other OpenTelemetry-compatible tools.
303
+
304
+ ### Registry System Architecture
305
+
306
+ Tasker features enterprise-grade registry systems with thread-safe operations and comprehensive observability:
307
+
308
+ **Thread-Safe Registries**:
309
+ - **HandlerFactory**: Thread-safe task handler registration with `Concurrent::Hash` storage
310
+ - **PluginRegistry**: Format-based plugin discovery with auto-discovery capabilities
311
+ - **SubscriberRegistry**: Event subscriber management with structured logging
312
+
313
+ **Advanced Features**:
314
+ - **Structured Logging**: Correlation IDs and JSON formatting for comprehensive observability
315
+ - **Interface Validation**: Fail-fast validation with detailed error messages
316
+ - **Replace Operations**: Conflict resolution with `replace: true` parameter
317
+ - **Event Integration**: Registry operations fully integrated with the 56-event system
318
+
319
+ **Production Benefits**:
320
+ ```ruby
321
+ # Thread-safe operations with structured logging
322
+ Tasker::HandlerFactory.instance.register(
323
+ 'order_processor',
324
+ OrderHandler,
325
+ namespace_name: 'payments',
326
+ version: '2.1.0',
327
+ replace: true # Handles conflicts gracefully
328
+ )
329
+
330
+ # Automatic structured logging with correlation IDs
331
+ # {"timestamp":"2024-01-15T10:30:45Z","correlation_id":"tsk_abc123","component":"handler_factory","message":"Registry item registered","entity_id":"payments/order_processor/2.1.0","event_type":"registered"}
332
+ ```
333
+
334
+ ### Health Monitoring & Production Readiness
335
+
336
+ Tasker provides enterprise-grade health endpoints for production deployments:
337
+
338
+ ```ruby
339
+ # Kubernetes readiness probe - checks database connectivity
340
+ GET /tasker/health/ready
341
+
342
+ # Kubernetes liveness probe - lightweight health check
343
+ GET /tasker/health/live
344
+
345
+ # Detailed status endpoint - comprehensive system metrics
346
+ GET /tasker/health/status
347
+ ```
348
+
349
+ **Optional Authentication & Authorization**:
350
+ ```ruby
351
+ # config/initializers/tasker.rb
352
+ Tasker.configuration do |config|
353
+ config.health do |health|
354
+ health.status_requires_authentication = true # Secure detailed status
355
+ end
356
+
357
+ config.auth do |auth|
358
+ auth.authorization_enabled = true
359
+ # Status endpoint requires tasker.health_status:index permission
360
+ end
361
+ end
362
+ ```
363
+
364
+ **Performance Optimized**: Uses SQL functions and 15-second caching for sub-100ms response times.
365
+
366
+ ## Key Benefits
367
+
368
+ ### For Developers
369
+ - **Quick Setup**: Working workflows in minutes with generators
370
+ - **Clear Structure**: YAML configuration with Ruby implementation
371
+ - **Comprehensive Testing**: Built-in test infrastructure and patterns
372
+ - **Rich Documentation**: Extensive guides and examples
373
+
374
+ ### For Operations
375
+ - **Production Ready**: Battle-tested retry logic and error handling
376
+ - **Health Monitoring**: Enterprise-grade health endpoints for K8s and load balancers
377
+ - **Observable**: Complete event system with telemetry integration
378
+ - **Secure**: Enterprise-grade authentication and authorization
379
+ - **Performant**: SQL-function based orchestration with proven performance
380
+ - **Thread-Safe**: Concurrent registry operations with structured logging and correlation IDs
381
+ - **Reliable**: 100% test coverage with comprehensive validation and error handling
382
+
383
+ ### For Business
384
+ - **Reliable**: Automatic retry with exponential backoff
385
+ - **Scalable**: Handles complex workflows with multiple dependencies
386
+ - **Maintainable**: Clear separation of concerns and documented patterns
387
+ - **Extensible**: Event system enables custom integrations
388
+
389
+ ## What's Next?
390
+
391
+ ### 🚀 Get Started Quickly
392
+ - **[Quick Start Guide](docs/QUICK_START.md)** - Build your first workflow in 15 minutes
393
+ - **[Developer Guide](docs/DEVELOPER_GUIDE.md)** - Comprehensive implementation guide
394
+ - **[Examples](spec/examples/)** - Real-world workflow patterns and implementations
395
+
396
+ ### 🔧 Advanced Topics
397
+ - **[REST API Guide](docs/REST_API.md)** - Complete REST API documentation with handler discovery
398
+ - **[Registry Systems](docs/REGISTRY_SYSTEMS.md)** - Thread-safe registry architecture and structured logging
399
+ - **[Authentication & Authorization](docs/AUTH.md)** - Complete security system
400
+ - **[Health Monitoring](docs/HEALTH.md)** - Production health endpoints and monitoring
401
+ - **[Event System](docs/EVENT_SYSTEM.md)** - Observability and integrations
402
+ - **[Telemetry](docs/TELEMETRY.md)** - OpenTelemetry setup and monitoring
403
+ - **[Performance](docs/SQL_FUNCTIONS.md)** - High-performance SQL functions
404
+ - **[Circuit Breaker](docs/CIRCUIT_BREAKER.md)** - Distributed, SQL-driven retry architecture
405
+
406
+ ### 📚 Additional Resources
407
+ - **[Application Generator](docs/APPLICATION_GENERATOR.md)** - One-line app creation with Docker support and validation
408
+ - **[System Overview](docs/OVERVIEW.md)** - Architecture and configuration
409
+ - **[Task Diagrams](docs/TASK_DIAGRAM.md)** - Visual workflow representation
410
+ - **[Troubleshooting](docs/TROUBLESHOOTING.md)** - Common issues and solutions
411
+
412
+ ## Requirements & Dependencies
413
+
414
+ - **Ruby**: 3.2+
415
+ - **Rails**: 7.2+
416
+ - **Database**: PostgreSQL (required for SQL functions)
417
+ - **Background Jobs**: Compatible with ActiveJob (Sidekiq recommended)
418
+
419
+ ## Development & Testing
420
+
421
+ ```bash
422
+ # Set up development environment
423
+ bundle install
424
+ bundle exec rake db:schema:load
425
+
426
+ # Run tests
427
+ bundle exec rspec spec
428
+
429
+ # Run linter
430
+ bundle exec rubocop
431
+ ```
432
+
433
+ ## Contributing
434
+
435
+ We welcome contributions! Please see our [development guidelines](docs/DEVELOPER_GUIDE.md) for information on setting up your development environment and our coding standards.
436
+
437
+ ## License
438
+
439
+ The gem is available as open source under the terms of the [MIT License](./LICENSE).
440
+
441
+ ---
442
+
443
+ **Tasker** transforms complex workflows into reliable, observable processes. Focus on your business logic while Tasker handles the orchestration complexity.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/setup'
4
+
5
+ APP_RAKEFILE = File.expand_path('spec/dummy/Rakefile', __dir__)
6
+ load 'rails/tasks/engine.rake'
7
+
8
+ load 'rails/tasks/statistics.rake'
9
+
10
+ require 'bundler/gem_tasks'
@@ -0,0 +1,179 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_dependency 'tasker/application_controller'
4
+
5
+ module Tasker
6
+ # Analytics controller providing performance and bottleneck analysis endpoints.
7
+ #
8
+ # This controller provides analytics endpoints:
9
+ # - `/analytics/performance` - System-wide performance metrics with caching
10
+ # - `/analytics/bottlenecks` - Bottleneck analysis scoped by task/version/namespace
11
+ #
12
+ # All endpoints use the authorization system with appropriate permissions.
13
+ # If authorization is disabled, access is allowed. If enabled, users need
14
+ # the corresponding analytics permissions.
15
+ #
16
+ # Analytics calculations are handled by Tasker::AnalyticsService for better
17
+ # separation of concerns.
18
+ class AnalyticsController < ApplicationController
19
+ # Set cache headers to prevent default caching (we use intelligent caching)
20
+ before_action :set_cache_headers
21
+
22
+ # Initialize intelligent cache for expensive analytics operations
23
+ before_action :set_intelligent_cache
24
+
25
+ # Performance analytics endpoint with intelligent caching
26
+ # Provides system-wide performance metrics and trends
27
+ #
28
+ # @return [JSON] Performance metrics and analytics
29
+ def performance
30
+ cache_key = "tasker:analytics:performance:#{performance_cache_version}"
31
+
32
+ cached_result = @intelligent_cache.intelligent_fetch(cache_key, base_ttl: 90.seconds) do
33
+ performance_analytics = Tasker::AnalyticsService.calculate_performance_analytics
34
+
35
+ {
36
+ **performance_analytics.to_h,
37
+ cache_info: {
38
+ cached: true,
39
+ cache_key: cache_key,
40
+ ttl_base: '90 seconds'
41
+ }
42
+ }
43
+ end
44
+
45
+ render json: cached_result, status: :ok
46
+ rescue StandardError => e
47
+ render json: {
48
+ error: 'Performance analytics failed',
49
+ message: e.message,
50
+ timestamp: Time.current.iso8601
51
+ }, status: :service_unavailable
52
+ end
53
+
54
+ # Bottleneck analysis endpoint scoped by task parameters
55
+ # Provides bottleneck analysis for specific task contexts
56
+ #
57
+ # Query parameters:
58
+ # - namespace: Filter by task namespace (optional)
59
+ # - name: Filter by task name (optional)
60
+ # - version: Filter by task version (optional)
61
+ # - period: Analysis period in hours (default: 24)
62
+ #
63
+ # @return [JSON] Bottleneck analysis for specified scope
64
+ def bottlenecks
65
+ # Extract and validate scope parameters
66
+ scope_params = extract_scope_parameters
67
+ analysis_period = params[:period]&.to_i || 24
68
+
69
+ # Generate cache key based on scope and period
70
+ cache_key = "tasker:analytics:bottlenecks:#{bottlenecks_cache_version(scope_params, analysis_period)}"
71
+
72
+ cached_result = @intelligent_cache.intelligent_fetch(cache_key, base_ttl: 2.minutes) do
73
+ bottleneck_analytics = Tasker::AnalyticsService.calculate_bottleneck_analytics(
74
+ scope_params,
75
+ analysis_period
76
+ )
77
+
78
+ {
79
+ **bottleneck_analytics.to_h,
80
+ cache_info: {
81
+ cached: true,
82
+ cache_key: cache_key,
83
+ ttl_base: '2 minutes'
84
+ }
85
+ }
86
+ end
87
+
88
+ render json: cached_result, status: :ok
89
+ rescue StandardError => e
90
+ render json: {
91
+ error: 'Bottleneck analysis failed',
92
+ message: e.message,
93
+ scope: extract_scope_parameters,
94
+ timestamp: Time.current.iso8601
95
+ }, status: :service_unavailable
96
+ end
97
+
98
+ private
99
+
100
+ def set_intelligent_cache
101
+ @intelligent_cache = Tasker::Telemetry::IntelligentCacheManager.new
102
+ end
103
+
104
+ # Extract and validate scope parameters for bottleneck analysis
105
+ #
106
+ # @return [Hash] Validated scope parameters
107
+ def extract_scope_parameters
108
+ scope = {}
109
+ scope[:namespace] = params[:namespace] if params[:namespace].present?
110
+ scope[:name] = params[:name] if params[:name].present?
111
+ scope[:version] = params[:version] if params[:version].present?
112
+ scope
113
+ end
114
+
115
+ # Generate cache version for performance analytics
116
+ #
117
+ # @return [String] Cache version that changes when system state changes
118
+ def performance_cache_version
119
+ current_10min_interval = "#{Time.current.strftime('%Y%m%d%H%M')[0..-2]}0" # Round to 10-minute intervals
120
+
121
+ # Include recent activity indicators for cache invalidation
122
+ recent_tasks = Task.created_since(30.minutes.ago).count
123
+ recent_completions = WorkflowStep.completed_since(30.minutes.ago).count
124
+
125
+ "v1:#{current_10min_interval}:#{recent_tasks}:#{recent_completions}"
126
+ end
127
+
128
+ # Generate cache version for bottleneck analysis
129
+ #
130
+ # @param scope_params [Hash] Scope parameters for the analysis
131
+ # @param period [Integer] Analysis period in hours
132
+ # @return [String] Cache version for bottleneck analysis
133
+ def bottlenecks_cache_version(scope_params, period)
134
+ current_10min_interval = "#{Time.current.strftime('%Y%m%d%H%M')[0..-2]}0" # Round to 10-minute intervals
135
+ scope_hash = scope_params.values.join('_').presence || 'all'
136
+
137
+ "v1:#{current_10min_interval}:#{scope_hash}:#{period}h"
138
+ end
139
+
140
+ # Override the resource name for authorization
141
+ # Maps analytics actions to analytics resource
142
+ #
143
+ # @return [String] The resource name for authorization
144
+ def tasker_resource_name
145
+ Tasker::Authorization::ResourceConstants::RESOURCES::ANALYTICS
146
+ end
147
+
148
+ # Override the action name for authorization
149
+ # Maps all actions to index permission for analytics
150
+ #
151
+ # @return [Symbol] The action name for authorization
152
+ def tasker_action_name
153
+ Tasker::Authorization::ResourceConstants::ACTIONS::INDEX
154
+ end
155
+
156
+ # Override authentication check for analytics endpoint
157
+ # Uses telemetry configuration for consistency with metrics
158
+ #
159
+ # @return [Boolean] True if authentication should be skipped
160
+ def skip_authentication?
161
+ !Tasker.configuration.telemetry.metrics_auth_required
162
+ end
163
+
164
+ # Override authorization check for analytics endpoint
165
+ # Uses telemetry configuration for consistency with metrics
166
+ #
167
+ # @return [Boolean] True if authorization should be skipped
168
+ def skip_authorization?
169
+ !Tasker.configuration.telemetry.metrics_auth_required
170
+ end
171
+
172
+ # Set appropriate cache control headers for analytics endpoints
173
+ def set_cache_headers
174
+ response.headers['Cache-Control'] = 'no-cache, no-store, must-revalidate'
175
+ response.headers['Pragma'] = 'no-cache'
176
+ response.headers['Expires'] = '0'
177
+ end
178
+ end
179
+ end