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
@@ -0,0 +1,2221 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
6
+ <title>
7
+ Class: Tasker::AnalyticsService
8
+
9
+ &mdash; Documentation by YARD 0.9.37
10
+
11
+ </title>
12
+
13
+ <link rel="stylesheet" href="../css/style.css" type="text/css" />
14
+
15
+ <link rel="stylesheet" href="../css/common.css" type="text/css" />
16
+
17
+ <script type="text/javascript">
18
+ pathId = "Tasker::AnalyticsService";
19
+ relpath = '../';
20
+ </script>
21
+
22
+
23
+ <script type="text/javascript" charset="utf-8" src="../js/jquery.js"></script>
24
+
25
+ <script type="text/javascript" charset="utf-8" src="../js/app.js"></script>
26
+
27
+
28
+ </head>
29
+ <body>
30
+ <div class="nav_wrap">
31
+ <iframe id="nav" src="../class_list.html?1"></iframe>
32
+ <div id="resizer"></div>
33
+ </div>
34
+
35
+ <div id="main" tabindex="-1">
36
+ <div id="header">
37
+ <div id="menu">
38
+
39
+ <a href="../_index.html">Index (A)</a> &raquo;
40
+ <span class='title'><span class='object_link'><a href="../Tasker.html" title="Tasker (module)">Tasker</a></span></span>
41
+ &raquo;
42
+ <span class="title">AnalyticsService</span>
43
+
44
+ </div>
45
+
46
+ <div id="search">
47
+
48
+ <a class="full_list_link" id="class_list_link"
49
+ href="../class_list.html">
50
+
51
+ <svg width="24" height="24">
52
+ <rect x="0" y="4" width="24" height="4" rx="1" ry="1"></rect>
53
+ <rect x="0" y="12" width="24" height="4" rx="1" ry="1"></rect>
54
+ <rect x="0" y="20" width="24" height="4" rx="1" ry="1"></rect>
55
+ </svg>
56
+ </a>
57
+
58
+ </div>
59
+ <div class="clear"></div>
60
+ </div>
61
+
62
+ <div id="content"><h1>Class: Tasker::AnalyticsService
63
+
64
+
65
+
66
+ </h1>
67
+ <div class="box_info">
68
+
69
+ <dl>
70
+ <dt>Inherits:</dt>
71
+ <dd>
72
+ <span class="inheritName">Object</span>
73
+
74
+ <ul class="fullTree">
75
+ <li>Object</li>
76
+
77
+ <li class="next">Tasker::AnalyticsService</li>
78
+
79
+ </ul>
80
+ <a href="#" class="inheritanceTree">show all</a>
81
+
82
+ </dd>
83
+ </dl>
84
+
85
+
86
+
87
+
88
+
89
+
90
+
91
+
92
+
93
+
94
+
95
+ <dl>
96
+ <dt>Defined in:</dt>
97
+ <dd>app/services/tasker/analytics_service.rb</dd>
98
+ </dl>
99
+
100
+ </div>
101
+
102
+ <h2>Overview</h2><div class="docstring">
103
+ <div class="discussion">
104
+
105
+ <p>Service class for analytics calculations and data aggregation</p>
106
+
107
+ <p>This service encapsulates the complex analytics logic that was previously in the analytics controller, providing a clean separation of concerns. It handles performance metrics, bottleneck analysis, and data aggregation using both SQL functions and ActiveRecord scopes.</p>
108
+
109
+
110
+ </div>
111
+ </div>
112
+ <div class="tags">
113
+
114
+
115
+ </div><h2>Defined Under Namespace</h2>
116
+ <p class="children">
117
+
118
+
119
+
120
+
121
+ <strong class="classes">Classes:</strong> <span class='object_link'><a href="AnalyticsService/BottleneckAnalytics.html" title="Tasker::AnalyticsService::BottleneckAnalytics (class)">BottleneckAnalytics</a></span>, <span class='object_link'><a href="AnalyticsService/PerformanceAnalytics.html" title="Tasker::AnalyticsService::PerformanceAnalytics (class)">PerformanceAnalytics</a></span>
122
+
123
+
124
+ </p>
125
+
126
+
127
+
128
+
129
+
130
+
131
+
132
+
133
+ <h2>
134
+ Class Method Summary
135
+ <small><a href="#" class="summary_toggle">collapse</a></small>
136
+ </h2>
137
+
138
+ <ul class="summary">
139
+
140
+ <li class="public ">
141
+ <span class="summary_signature">
142
+
143
+ <a href="#analyze_dependency_bottlenecks-class_method" title="analyze_dependency_bottlenecks (class method)">.<strong>analyze_dependency_bottlenecks</strong>(scope_params, since_time) &#x21d2; Hash </a>
144
+
145
+
146
+
147
+ </span>
148
+
149
+
150
+
151
+
152
+
153
+
154
+
155
+
156
+
157
+ <span class="summary_desc"><div class='inline'>
158
+ <p>Analyze dependency bottlenecks using model scopes and SQL functions.</p>
159
+ </div></span>
160
+
161
+ </li>
162
+
163
+
164
+ <li class="public ">
165
+ <span class="summary_signature">
166
+
167
+ <a href="#analyze_error_patterns-class_method" title="analyze_error_patterns (class method)">.<strong>analyze_error_patterns</strong>(scope_params, since_time) &#x21d2; Hash </a>
168
+
169
+
170
+
171
+ </span>
172
+
173
+
174
+
175
+
176
+
177
+
178
+
179
+
180
+
181
+ <span class="summary_desc"><div class='inline'>
182
+ <p>Analyze error patterns using model scopes.</p>
183
+ </div></span>
184
+
185
+ </li>
186
+
187
+
188
+ <li class="public ">
189
+ <span class="summary_signature">
190
+
191
+ <a href="#build_scoped_query-class_method" title="build_scoped_query (class method)">.<strong>build_scoped_query</strong>(scope_params, since_time) &#x21d2; ActiveRecord::Relation </a>
192
+
193
+
194
+
195
+ </span>
196
+
197
+
198
+
199
+
200
+
201
+
202
+
203
+
204
+
205
+ <span class="summary_desc"><div class='inline'>
206
+ <p>Build scoped query using ActiveRecord scopes.</p>
207
+ </div></span>
208
+
209
+ </li>
210
+
211
+
212
+ <li class="public ">
213
+ <span class="summary_signature">
214
+
215
+ <a href="#calculate_bottleneck_analytics-class_method" title="calculate_bottleneck_analytics (class method)">.<strong>calculate_bottleneck_analytics</strong>(scope_params, period_hours) &#x21d2; BottleneckAnalytics </a>
216
+
217
+
218
+
219
+ </span>
220
+
221
+
222
+
223
+
224
+
225
+
226
+
227
+
228
+
229
+ <span class="summary_desc"><div class='inline'>
230
+ <p>Calculate bottleneck analytics for specified scope and period using SQL functions.</p>
231
+ </div></span>
232
+
233
+ </li>
234
+
235
+
236
+ <li class="public ">
237
+ <span class="summary_signature">
238
+
239
+ <a href="#calculate_performance_analytics-class_method" title="calculate_performance_analytics (class method)">.<strong>calculate_performance_analytics</strong> &#x21d2; PerformanceAnalytics </a>
240
+
241
+
242
+
243
+ </span>
244
+
245
+
246
+
247
+
248
+
249
+
250
+
251
+
252
+
253
+ <span class="summary_desc"><div class='inline'>
254
+ <p>Calculate comprehensive performance analytics using SQL functions.</p>
255
+ </div></span>
256
+
257
+ </li>
258
+
259
+
260
+ <li class="public ">
261
+ <span class="summary_signature">
262
+
263
+ <a href="#calculate_performance_distribution-class_method" title="calculate_performance_distribution (class method)">.<strong>calculate_performance_distribution</strong>(scope_params, since_time) &#x21d2; Hash </a>
264
+
265
+
266
+
267
+ </span>
268
+
269
+
270
+
271
+
272
+
273
+
274
+
275
+
276
+
277
+ <span class="summary_desc"><div class='inline'>
278
+ <p>Calculate performance distribution using model scopes.</p>
279
+ </div></span>
280
+
281
+ </li>
282
+
283
+
284
+ <li class="public ">
285
+ <span class="summary_signature">
286
+
287
+ <a href="#calculate_retry_success_rate-class_method" title="calculate_retry_success_rate (class method)">.<strong>calculate_retry_success_rate</strong>(scoped_query) &#x21d2; Float </a>
288
+
289
+
290
+
291
+ </span>
292
+
293
+
294
+
295
+
296
+
297
+
298
+
299
+
300
+
301
+ <span class="summary_desc"><div class='inline'>
302
+ <p>Calculate retry success rate using model scopes.</p>
303
+ </div></span>
304
+
305
+ </li>
306
+
307
+
308
+ <li class="public ">
309
+ <span class="summary_signature">
310
+
311
+ <a href="#calculate_scope_summary-class_method" title="calculate_scope_summary (class method)">.<strong>calculate_scope_summary</strong>(scope_params, period_hours) &#x21d2; Hash </a>
312
+
313
+
314
+
315
+ </span>
316
+
317
+
318
+
319
+
320
+
321
+
322
+
323
+
324
+
325
+ <span class="summary_desc"><div class='inline'>
326
+ <p>Calculate scope summary using SQL functions and scopes.</p>
327
+ </div></span>
328
+
329
+ </li>
330
+
331
+
332
+ <li class="public ">
333
+ <span class="summary_signature">
334
+
335
+ <a href="#calculate_telemetry_insights-class_method" title="calculate_telemetry_insights (class method)">.<strong>calculate_telemetry_insights</strong> &#x21d2; Hash </a>
336
+
337
+
338
+
339
+ </span>
340
+
341
+
342
+
343
+
344
+
345
+
346
+
347
+
348
+
349
+ <span class="summary_desc"><div class='inline'>
350
+ <p>Calculate telemetry insights from trace and log backends.</p>
351
+ </div></span>
352
+
353
+ </li>
354
+
355
+
356
+ <li class="public ">
357
+ <span class="summary_signature">
358
+
359
+ <a href="#default_dependency_bottlenecks-class_method" title="default_dependency_bottlenecks (class method)">.<strong>default_dependency_bottlenecks</strong> &#x21d2; Object </a>
360
+
361
+
362
+
363
+ </span>
364
+
365
+
366
+
367
+
368
+
369
+
370
+
371
+
372
+
373
+ <span class="summary_desc"><div class='inline'></div></span>
374
+
375
+ </li>
376
+
377
+
378
+ <li class="public ">
379
+ <span class="summary_signature">
380
+
381
+ <a href="#default_error_pattern-class_method" title="default_error_pattern (class method)">.<strong>default_error_pattern</strong> &#x21d2; Object </a>
382
+
383
+
384
+
385
+ </span>
386
+
387
+
388
+
389
+
390
+
391
+
392
+
393
+
394
+
395
+ <span class="summary_desc"><div class='inline'>
396
+ <p>Default fallback methods for error conditions.</p>
397
+ </div></span>
398
+
399
+ </li>
400
+
401
+
402
+ <li class="public ">
403
+ <span class="summary_signature">
404
+
405
+ <a href="#default_performance_distribution-class_method" title="default_performance_distribution (class method)">.<strong>default_performance_distribution</strong> &#x21d2; Object </a>
406
+
407
+
408
+
409
+ </span>
410
+
411
+
412
+
413
+
414
+
415
+
416
+
417
+
418
+
419
+ <span class="summary_desc"><div class='inline'></div></span>
420
+
421
+ </li>
422
+
423
+
424
+ <li class="public ">
425
+ <span class="summary_signature">
426
+
427
+ <a href="#fetch_slowest_steps-class_method" title="fetch_slowest_steps (class method)">.<strong>fetch_slowest_steps</strong>(scope_params, since_time) &#x21d2; Array </a>
428
+
429
+
430
+
431
+ </span>
432
+
433
+
434
+
435
+
436
+
437
+
438
+
439
+
440
+
441
+ <span class="summary_desc"><div class='inline'>
442
+ <p>Fetch slowest steps using SQL function with fallback.</p>
443
+ </div></span>
444
+
445
+ </li>
446
+
447
+
448
+ <li class="public ">
449
+ <span class="summary_signature">
450
+
451
+ <a href="#fetch_slowest_tasks-class_method" title="fetch_slowest_tasks (class method)">.<strong>fetch_slowest_tasks</strong>(scope_params, since_time) &#x21d2; Array </a>
452
+
453
+
454
+
455
+ </span>
456
+
457
+
458
+
459
+
460
+
461
+
462
+
463
+
464
+
465
+ <span class="summary_desc"><div class='inline'>
466
+ <p>Fetch slowest tasks using SQL function with fallback.</p>
467
+ </div></span>
468
+
469
+ </li>
470
+
471
+
472
+ <li class="public ">
473
+ <span class="summary_signature">
474
+
475
+ <a href="#find_most_blocked_step_names-class_method" title="find_most_blocked_step_names (class method)">.<strong>find_most_blocked_step_names</strong>(task_ids) &#x21d2; Array </a>
476
+
477
+
478
+
479
+ </span>
480
+
481
+
482
+
483
+
484
+
485
+
486
+
487
+
488
+
489
+ <span class="summary_desc"><div class='inline'>
490
+ <p>Find most blocked step names using SQL function for step readiness.</p>
491
+ </div></span>
492
+
493
+ </li>
494
+
495
+
496
+ <li class="public ">
497
+ <span class="summary_signature">
498
+
499
+ <a href="#generate_recommendations-class_method" title="generate_recommendations (class method)">.<strong>generate_recommendations</strong>(slowest_tasks, slowest_steps) &#x21d2; Array </a>
500
+
501
+
502
+
503
+ </span>
504
+
505
+
506
+
507
+
508
+
509
+
510
+
511
+
512
+
513
+ <span class="summary_desc"><div class='inline'>
514
+ <p>Generate recommendations based on function data.</p>
515
+ </div></span>
516
+
517
+ </li>
518
+
519
+
520
+ </ul>
521
+
522
+
523
+
524
+
525
+ <div id="class_method_details" class="method_details_list">
526
+ <h2>Class Method Details</h2>
527
+
528
+
529
+ <div class="method_details first">
530
+ <h3 class="signature first" id="analyze_dependency_bottlenecks-class_method">
531
+
532
+ .<strong>analyze_dependency_bottlenecks</strong>(scope_params, since_time) &#x21d2; <tt>Hash</tt>
533
+
534
+
535
+
536
+
537
+
538
+ </h3><div class="docstring">
539
+ <div class="discussion">
540
+
541
+ <p>Analyze dependency bottlenecks using model scopes and SQL functions</p>
542
+
543
+
544
+ </div>
545
+ </div>
546
+ <div class="tags">
547
+ <p class="tag_title">Parameters:</p>
548
+ <ul class="param">
549
+
550
+ <li>
551
+
552
+ <span class='name'>scope_params</span>
553
+
554
+
555
+ <span class='type'>(<tt>Hash</tt>)</span>
556
+
557
+
558
+
559
+ &mdash;
560
+ <div class='inline'>
561
+ <p>Scope parameters</p>
562
+ </div>
563
+
564
+ </li>
565
+
566
+ <li>
567
+
568
+ <span class='name'>since_time</span>
569
+
570
+
571
+ <span class='type'>(<tt>Time</tt>)</span>
572
+
573
+
574
+
575
+ &mdash;
576
+ <div class='inline'>
577
+ <p>Analysis start time</p>
578
+ </div>
579
+
580
+ </li>
581
+
582
+ </ul>
583
+
584
+ <p class="tag_title">Returns:</p>
585
+ <ul class="return">
586
+
587
+ <li>
588
+
589
+
590
+ <span class='type'>(<tt>Hash</tt>)</span>
591
+
592
+
593
+
594
+ &mdash;
595
+ <div class='inline'>
596
+ <p>Dependency bottleneck analysis</p>
597
+ </div>
598
+
599
+ </li>
600
+
601
+ </ul>
602
+
603
+ </div><table class="source_code">
604
+ <tr>
605
+ <td>
606
+ <pre class="lines">
607
+
608
+
609
+ 238
610
+ 239
611
+ 240
612
+ 241
613
+ 242
614
+ 243
615
+ 244
616
+ 245
617
+ 246
618
+ 247
619
+ 248
620
+ 249
621
+ 250
622
+ 251
623
+ 252
624
+ 253
625
+ 254
626
+ 255
627
+ 256
628
+ 257
629
+ 258
630
+ 259
631
+ 260</pre>
632
+ </td>
633
+ <td>
634
+ <pre class="code"><span class="info file"># File 'app/services/tasker/analytics_service.rb', line 238</span>
635
+
636
+ <span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_analyze_dependency_bottlenecks'>analyze_dependency_bottlenecks</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span>
637
+ <span class='id identifier rubyid_scoped_query'>scoped_query</span> <span class='op'>=</span> <span class='id identifier rubyid_build_scoped_query'>build_scoped_query</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span>
638
+ <span class='id identifier rubyid_task_ids'>task_ids</span> <span class='op'>=</span> <span class='id identifier rubyid_scoped_query'>scoped_query</span><span class='period'>.</span><span class='id identifier rubyid_pluck'>pluck</span><span class='lparen'>(</span><span class='symbol'>:task_id</span><span class='rparen'>)</span>
639
+ <span class='kw'>return</span> <span class='id identifier rubyid_default_dependency_bottlenecks'>default_dependency_bottlenecks</span> <span class='kw'>if</span> <span class='id identifier rubyid_task_ids'>task_ids</span><span class='period'>.</span><span class='id identifier rubyid_empty?'>empty?</span>
640
+
641
+ <span class='comment'># Use existing scopes where possible
642
+ </span> <span class='id identifier rubyid_pending_steps'>pending_steps</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="WorkflowStep.html" title="Tasker::WorkflowStep (class)">WorkflowStep</a></span></span><span class='period'>.</span><span class='id identifier rubyid_joins'>joins</span><span class='lparen'>(</span><span class='symbol'>:named_step</span><span class='rparen'>)</span>
643
+ <span class='period'>.</span><span class='id identifier rubyid_where'>where</span><span class='lparen'>(</span><span class='label'>task_id:</span> <span class='id identifier rubyid_task_ids'>task_ids</span><span class='rparen'>)</span>
644
+ <span class='period'>.</span><span class='id identifier rubyid_by_current_state'>by_current_state</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>pending</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
645
+
646
+ <span class='id identifier rubyid_blocking_count'>blocking_count</span> <span class='op'>=</span> <span class='id identifier rubyid_pending_steps'>pending_steps</span><span class='period'>.</span><span class='id identifier rubyid_joins'>joins</span><span class='lparen'>(</span><span class='symbol'>:incoming_edges</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_count'>count</span>
647
+ <span class='id identifier rubyid_avg_wait'>avg_wait</span> <span class='op'>=</span> <span class='id identifier rubyid_pending_steps'>pending_steps</span><span class='period'>.</span><span class='id identifier rubyid_where'>where</span><span class='lparen'>(</span><span class='label'>tasker_workflow_steps:</span> <span class='lbrace'>{</span> <span class='label'>created_at:</span> <span class='op'>...</span><span class='int'>5</span><span class='period'>.</span><span class='id identifier rubyid_minutes'>minutes</span><span class='period'>.</span><span class='id identifier rubyid_ago'>ago</span> <span class='rbrace'>}</span><span class='rparen'>)</span>
648
+ <span class='period'>.</span><span class='id identifier rubyid_average'>average</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>EXTRACT(EPOCH FROM (NOW() - tasker_workflow_steps.created_at))</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
649
+
650
+ <span class='lbrace'>{</span>
651
+ <span class='label'>blocking_dependencies:</span> <span class='id identifier rubyid_blocking_count'>blocking_count</span><span class='comma'>,</span>
652
+ <span class='label'>avg_wait_time:</span> <span class='id identifier rubyid_avg_wait'>avg_wait</span><span class='op'>&amp;.</span><span class='id identifier rubyid_to_f'>to_f</span><span class='op'>&amp;.</span><span class='id identifier rubyid_round'>round</span><span class='lparen'>(</span><span class='int'>1</span><span class='rparen'>)</span> <span class='op'>||</span> <span class='float'>0.0</span><span class='comma'>,</span>
653
+ <span class='label'>most_blocked_steps:</span> <span class='id identifier rubyid_find_most_blocked_step_names'>find_most_blocked_step_names</span><span class='lparen'>(</span><span class='id identifier rubyid_task_ids'>task_ids</span><span class='rparen'>)</span>
654
+ <span class='rbrace'>}</span>
655
+ <span class='kw'>rescue</span> <span class='const'>StandardError</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
656
+ <span class='const'>Rails</span><span class='period'>.</span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_error'>error</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Error in analyze_dependency_bottlenecks: </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
657
+ <span class='id identifier rubyid_default_dependency_bottlenecks'>default_dependency_bottlenecks</span>
658
+ <span class='kw'>end</span></pre>
659
+ </td>
660
+ </tr>
661
+ </table>
662
+ </div>
663
+
664
+ <div class="method_details ">
665
+ <h3 class="signature " id="analyze_error_patterns-class_method">
666
+
667
+ .<strong>analyze_error_patterns</strong>(scope_params, since_time) &#x21d2; <tt>Hash</tt>
668
+
669
+
670
+
671
+
672
+
673
+ </h3><div class="docstring">
674
+ <div class="discussion">
675
+
676
+ <p>Analyze error patterns using model scopes</p>
677
+
678
+
679
+ </div>
680
+ </div>
681
+ <div class="tags">
682
+ <p class="tag_title">Parameters:</p>
683
+ <ul class="param">
684
+
685
+ <li>
686
+
687
+ <span class='name'>scope_params</span>
688
+
689
+
690
+ <span class='type'>(<tt>Hash</tt>)</span>
691
+
692
+
693
+
694
+ &mdash;
695
+ <div class='inline'>
696
+ <p>Scope parameters</p>
697
+ </div>
698
+
699
+ </li>
700
+
701
+ <li>
702
+
703
+ <span class='name'>since_time</span>
704
+
705
+
706
+ <span class='type'>(<tt>Time</tt>)</span>
707
+
708
+
709
+
710
+ &mdash;
711
+ <div class='inline'>
712
+ <p>Analysis start time</p>
713
+ </div>
714
+
715
+ </li>
716
+
717
+ </ul>
718
+
719
+ <p class="tag_title">Returns:</p>
720
+ <ul class="return">
721
+
722
+ <li>
723
+
724
+
725
+ <span class='type'>(<tt>Hash</tt>)</span>
726
+
727
+
728
+
729
+ &mdash;
730
+ <div class='inline'>
731
+ <p>Error pattern analysis</p>
732
+ </div>
733
+
734
+ </li>
735
+
736
+ </ul>
737
+
738
+ </div><table class="source_code">
739
+ <tr>
740
+ <td>
741
+ <pre class="lines">
742
+
743
+
744
+ 213
745
+ 214
746
+ 215
747
+ 216
748
+ 217
749
+ 218
750
+ 219
751
+ 220
752
+ 221
753
+ 222
754
+ 223
755
+ 224
756
+ 225
757
+ 226
758
+ 227
759
+ 228
760
+ 229
761
+ 230
762
+ 231</pre>
763
+ </td>
764
+ <td>
765
+ <pre class="code"><span class="info file"># File 'app/services/tasker/analytics_service.rb', line 213</span>
766
+
767
+ <span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_analyze_error_patterns'>analyze_error_patterns</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span>
768
+ <span class='id identifier rubyid_scoped_query'>scoped_query</span> <span class='op'>=</span> <span class='id identifier rubyid_build_scoped_query'>build_scoped_query</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span>
769
+
770
+ <span class='id identifier rubyid_total_tasks'>total_tasks</span> <span class='op'>=</span> <span class='id identifier rubyid_scoped_query'>scoped_query</span><span class='period'>.</span><span class='id identifier rubyid_count'>count</span>
771
+ <span class='kw'>return</span> <span class='id identifier rubyid_default_error_pattern'>default_error_pattern</span> <span class='kw'>if</span> <span class='id identifier rubyid_total_tasks'>total_tasks</span><span class='period'>.</span><span class='id identifier rubyid_zero?'>zero?</span>
772
+
773
+ <span class='id identifier rubyid_failed_tasks'>failed_tasks</span> <span class='op'>=</span> <span class='id identifier rubyid_scoped_query'>scoped_query</span><span class='period'>.</span><span class='id identifier rubyid_failed_since'>failed_since</span><span class='lparen'>(</span><span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_count'>count</span>
774
+ <span class='id identifier rubyid_error_rate'>error_rate</span> <span class='op'>=</span> <span class='id identifier rubyid_total_tasks'>total_tasks</span><span class='period'>.</span><span class='id identifier rubyid_positive?'>positive?</span> <span class='op'>?</span> <span class='lparen'>(</span><span class='id identifier rubyid_failed_tasks'>failed_tasks</span><span class='period'>.</span><span class='id identifier rubyid_to_f'>to_f</span> <span class='op'>/</span> <span class='id identifier rubyid_total_tasks'>total_tasks</span> <span class='op'>*</span> <span class='int'>100</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_round'>round</span><span class='lparen'>(</span><span class='int'>1</span><span class='rparen'>)</span> <span class='op'>:</span> <span class='float'>0.0</span>
775
+
776
+ <span class='lbrace'>{</span>
777
+ <span class='label'>total_errors:</span> <span class='id identifier rubyid_failed_tasks'>failed_tasks</span><span class='comma'>,</span>
778
+ <span class='label'>recent_error_rate:</span> <span class='id identifier rubyid_error_rate'>error_rate</span><span class='comma'>,</span>
779
+ <span class='label'>common_error_types:</span> <span class='qwords_beg'>%w[</span><span class='tstring_content'>timeout</span><span class='words_sep'> </span><span class='tstring_content'>validation</span><span class='words_sep'> </span><span class='tstring_content'>network</span><span class='tstring_end'>]</span></span><span class='comma'>,</span> <span class='comment'># Static for now
780
+ </span> <span class='label'>retry_success_rate:</span> <span class='id identifier rubyid_calculate_retry_success_rate'>calculate_retry_success_rate</span><span class='lparen'>(</span><span class='id identifier rubyid_scoped_query'>scoped_query</span><span class='rparen'>)</span>
781
+ <span class='rbrace'>}</span>
782
+ <span class='kw'>rescue</span> <span class='const'>StandardError</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
783
+ <span class='const'>Rails</span><span class='period'>.</span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_error'>error</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Error in analyze_error_patterns: </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
784
+ <span class='id identifier rubyid_default_error_pattern'>default_error_pattern</span>
785
+ <span class='kw'>end</span></pre>
786
+ </td>
787
+ </tr>
788
+ </table>
789
+ </div>
790
+
791
+ <div class="method_details ">
792
+ <h3 class="signature " id="build_scoped_query-class_method">
793
+
794
+ .<strong>build_scoped_query</strong>(scope_params, since_time) &#x21d2; <tt>ActiveRecord::Relation</tt>
795
+
796
+
797
+
798
+
799
+
800
+ </h3><div class="docstring">
801
+ <div class="discussion">
802
+
803
+ <p>Build scoped query using ActiveRecord scopes</p>
804
+
805
+
806
+ </div>
807
+ </div>
808
+ <div class="tags">
809
+ <p class="tag_title">Parameters:</p>
810
+ <ul class="param">
811
+
812
+ <li>
813
+
814
+ <span class='name'>scope_params</span>
815
+
816
+
817
+ <span class='type'>(<tt>Hash</tt>)</span>
818
+
819
+
820
+
821
+ &mdash;
822
+ <div class='inline'>
823
+ <p>Scope parameters</p>
824
+ </div>
825
+
826
+ </li>
827
+
828
+ <li>
829
+
830
+ <span class='name'>since_time</span>
831
+
832
+
833
+ <span class='type'>(<tt>Time</tt>)</span>
834
+
835
+
836
+
837
+ &mdash;
838
+ <div class='inline'>
839
+ <p>Time filter</p>
840
+ </div>
841
+
842
+ </li>
843
+
844
+ </ul>
845
+
846
+ <p class="tag_title">Returns:</p>
847
+ <ul class="return">
848
+
849
+ <li>
850
+
851
+
852
+ <span class='type'>(<tt>ActiveRecord::Relation</tt>)</span>
853
+
854
+
855
+
856
+ &mdash;
857
+ <div class='inline'>
858
+ <p>Filtered query</p>
859
+ </div>
860
+
861
+ </li>
862
+
863
+ </ul>
864
+
865
+ </div><table class="source_code">
866
+ <tr>
867
+ <td>
868
+ <pre class="lines">
869
+
870
+
871
+ 328
872
+ 329
873
+ 330
874
+ 331
875
+ 332
876
+ 333
877
+ 334</pre>
878
+ </td>
879
+ <td>
880
+ <pre class="code"><span class="info file"># File 'app/services/tasker/analytics_service.rb', line 328</span>
881
+
882
+ <span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_build_scoped_query'>build_scoped_query</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span>
883
+ <span class='id identifier rubyid_query'>query</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="Task.html" title="Tasker::Task (class)">Task</a></span></span><span class='period'>.</span><span class='id identifier rubyid_created_since'><span class='object_link'><a href="Task.html#created_since-class_method" title="Tasker::Task.created_since (method)">created_since</a></span></span><span class='lparen'>(</span><span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span>
884
+ <span class='id identifier rubyid_query'>query</span> <span class='op'>=</span> <span class='id identifier rubyid_query'>query</span><span class='period'>.</span><span class='id identifier rubyid_in_namespace'>in_namespace</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='lbracket'>[</span><span class='symbol'>:namespace</span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='id identifier rubyid_scope_params'>scope_params</span><span class='lbracket'>[</span><span class='symbol'>:namespace</span><span class='rbracket'>]</span>
885
+ <span class='id identifier rubyid_query'>query</span> <span class='op'>=</span> <span class='id identifier rubyid_query'>query</span><span class='period'>.</span><span class='id identifier rubyid_with_task_name'>with_task_name</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='lbracket'>[</span><span class='symbol'>:name</span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='id identifier rubyid_scope_params'>scope_params</span><span class='lbracket'>[</span><span class='symbol'>:name</span><span class='rbracket'>]</span>
886
+ <span class='id identifier rubyid_query'>query</span> <span class='op'>=</span> <span class='id identifier rubyid_query'>query</span><span class='period'>.</span><span class='id identifier rubyid_with_version'>with_version</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='lbracket'>[</span><span class='symbol'>:version</span><span class='rbracket'>]</span><span class='rparen'>)</span> <span class='kw'>if</span> <span class='id identifier rubyid_scope_params'>scope_params</span><span class='lbracket'>[</span><span class='symbol'>:version</span><span class='rbracket'>]</span>
887
+ <span class='id identifier rubyid_query'>query</span>
888
+ <span class='kw'>end</span></pre>
889
+ </td>
890
+ </tr>
891
+ </table>
892
+ </div>
893
+
894
+ <div class="method_details ">
895
+ <h3 class="signature " id="calculate_bottleneck_analytics-class_method">
896
+
897
+ .<strong>calculate_bottleneck_analytics</strong>(scope_params, period_hours) &#x21d2; <tt><span class='object_link'><a href="AnalyticsService/BottleneckAnalytics.html" title="Tasker::AnalyticsService::BottleneckAnalytics (class)">BottleneckAnalytics</a></span></tt>
898
+
899
+
900
+
901
+
902
+
903
+ </h3><div class="docstring">
904
+ <div class="discussion">
905
+
906
+ <p>Calculate bottleneck analytics for specified scope and period using SQL functions</p>
907
+
908
+
909
+ </div>
910
+ </div>
911
+ <div class="tags">
912
+ <p class="tag_title">Parameters:</p>
913
+ <ul class="param">
914
+
915
+ <li>
916
+
917
+ <span class='name'>scope_params</span>
918
+
919
+
920
+ <span class='type'>(<tt>Hash</tt>)</span>
921
+
922
+
923
+
924
+ &mdash;
925
+ <div class='inline'>
926
+ <p>Scope parameters (namespace, name, version)</p>
927
+ </div>
928
+
929
+ </li>
930
+
931
+ <li>
932
+
933
+ <span class='name'>period_hours</span>
934
+
935
+
936
+ <span class='type'>(<tt>Integer</tt>)</span>
937
+
938
+
939
+
940
+ &mdash;
941
+ <div class='inline'>
942
+ <p>Analysis period in hours</p>
943
+ </div>
944
+
945
+ </li>
946
+
947
+ </ul>
948
+
949
+ <p class="tag_title">Returns:</p>
950
+ <ul class="return">
951
+
952
+ <li>
953
+
954
+
955
+ <span class='type'>(<tt><span class='object_link'><a href="AnalyticsService/BottleneckAnalytics.html" title="Tasker::AnalyticsService::BottleneckAnalytics (class)">BottleneckAnalytics</a></span></tt>)</span>
956
+
957
+
958
+
959
+ &mdash;
960
+ <div class='inline'>
961
+ <p>Bottleneck analysis data</p>
962
+ </div>
963
+
964
+ </li>
965
+
966
+ </ul>
967
+
968
+ </div><table class="source_code">
969
+ <tr>
970
+ <td>
971
+ <pre class="lines">
972
+
973
+
974
+ 109
975
+ 110
976
+ 111
977
+ 112
978
+ 113
979
+ 114
980
+ 115
981
+ 116
982
+ 117
983
+ 118
984
+ 119
985
+ 120
986
+ 121
987
+ 122
988
+ 123
989
+ 124
990
+ 125
991
+ 126
992
+ 127
993
+ 128
994
+ 129
995
+ 130
996
+ 131
997
+ 132
998
+ 133
999
+ 134
1000
+ 135</pre>
1001
+ </td>
1002
+ <td>
1003
+ <pre class="code"><span class="info file"># File 'app/services/tasker/analytics_service.rb', line 109</span>
1004
+
1005
+ <span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_calculate_bottleneck_analytics'>calculate_bottleneck_analytics</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_period_hours'>period_hours</span><span class='rparen'>)</span>
1006
+ <span class='id identifier rubyid_since_time'>since_time</span> <span class='op'>=</span> <span class='id identifier rubyid_period_hours'>period_hours</span><span class='period'>.</span><span class='id identifier rubyid_hours'>hours</span><span class='period'>.</span><span class='id identifier rubyid_ago'>ago</span>
1007
+
1008
+ <span class='comment'># Use SQL functions for efficient bottleneck analysis with fallbacks
1009
+ </span> <span class='id identifier rubyid_slowest_tasks'>slowest_tasks</span> <span class='op'>=</span> <span class='id identifier rubyid_fetch_slowest_tasks'>fetch_slowest_tasks</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span>
1010
+ <span class='id identifier rubyid_slowest_steps'>slowest_steps</span> <span class='op'>=</span> <span class='id identifier rubyid_fetch_slowest_steps'>fetch_slowest_steps</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span>
1011
+
1012
+ <span class='id identifier rubyid_scope_summary'>scope_summary</span> <span class='op'>=</span> <span class='id identifier rubyid_calculate_scope_summary'>calculate_scope_summary</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_period_hours'>period_hours</span><span class='rparen'>)</span>
1013
+ <span class='id identifier rubyid_bottleneck_analysis'>bottleneck_analysis</span> <span class='op'>=</span> <span class='lbrace'>{</span>
1014
+ <span class='label'>slowest_tasks:</span> <span class='id identifier rubyid_slowest_tasks'>slowest_tasks</span><span class='comma'>,</span>
1015
+ <span class='label'>slowest_steps:</span> <span class='id identifier rubyid_slowest_steps'>slowest_steps</span><span class='comma'>,</span>
1016
+ <span class='label'>error_patterns:</span> <span class='id identifier rubyid_analyze_error_patterns'>analyze_error_patterns</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span><span class='comma'>,</span>
1017
+ <span class='label'>dependency_bottlenecks:</span> <span class='id identifier rubyid_analyze_dependency_bottlenecks'>analyze_dependency_bottlenecks</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span>
1018
+ <span class='rbrace'>}</span>
1019
+
1020
+ <span class='id identifier rubyid_performance_distribution'>performance_distribution</span> <span class='op'>=</span> <span class='id identifier rubyid_calculate_performance_distribution'>calculate_performance_distribution</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span>
1021
+ <span class='id identifier rubyid_recommendations'>recommendations</span> <span class='op'>=</span> <span class='id identifier rubyid_generate_recommendations'>generate_recommendations</span><span class='lparen'>(</span><span class='id identifier rubyid_slowest_tasks'>slowest_tasks</span><span class='comma'>,</span> <span class='id identifier rubyid_slowest_steps'>slowest_steps</span><span class='rparen'>)</span>
1022
+
1023
+ <span class='const'><span class='object_link'><a href="AnalyticsService/BottleneckAnalytics.html" title="Tasker::AnalyticsService::BottleneckAnalytics (class)">BottleneckAnalytics</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="AnalyticsService/BottleneckAnalytics.html#initialize-instance_method" title="Tasker::AnalyticsService::BottleneckAnalytics#initialize (method)">new</a></span></span><span class='lparen'>(</span>
1024
+ <span class='label'>scope_summary:</span> <span class='id identifier rubyid_scope_summary'>scope_summary</span><span class='comma'>,</span>
1025
+ <span class='label'>bottleneck_analysis:</span> <span class='id identifier rubyid_bottleneck_analysis'>bottleneck_analysis</span><span class='comma'>,</span>
1026
+ <span class='label'>performance_distribution:</span> <span class='id identifier rubyid_performance_distribution'>performance_distribution</span><span class='comma'>,</span>
1027
+ <span class='label'>recommendations:</span> <span class='id identifier rubyid_recommendations'>recommendations</span><span class='comma'>,</span>
1028
+ <span class='label'>scope:</span> <span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span>
1029
+ <span class='label'>analysis_period_hours:</span> <span class='id identifier rubyid_period_hours'>period_hours</span>
1030
+ <span class='rparen'>)</span>
1031
+ <span class='kw'>end</span></pre>
1032
+ </td>
1033
+ </tr>
1034
+ </table>
1035
+ </div>
1036
+
1037
+ <div class="method_details ">
1038
+ <h3 class="signature " id="calculate_performance_analytics-class_method">
1039
+
1040
+ .<strong>calculate_performance_analytics</strong> &#x21d2; <tt><span class='object_link'><a href="AnalyticsService/PerformanceAnalytics.html" title="Tasker::AnalyticsService::PerformanceAnalytics (class)">PerformanceAnalytics</a></span></tt>
1041
+
1042
+
1043
+
1044
+
1045
+
1046
+ </h3><div class="docstring">
1047
+ <div class="discussion">
1048
+
1049
+ <p>Calculate comprehensive performance analytics using SQL functions</p>
1050
+
1051
+
1052
+ </div>
1053
+ </div>
1054
+ <div class="tags">
1055
+
1056
+ <p class="tag_title">Returns:</p>
1057
+ <ul class="return">
1058
+
1059
+ <li>
1060
+
1061
+
1062
+ <span class='type'>(<tt><span class='object_link'><a href="AnalyticsService/PerformanceAnalytics.html" title="Tasker::AnalyticsService::PerformanceAnalytics (class)">PerformanceAnalytics</a></span></tt>)</span>
1063
+
1064
+
1065
+
1066
+ &mdash;
1067
+ <div class='inline'>
1068
+ <p>Performance analytics data</p>
1069
+ </div>
1070
+
1071
+ </li>
1072
+
1073
+ </ul>
1074
+
1075
+ </div><table class="source_code">
1076
+ <tr>
1077
+ <td>
1078
+ <pre class="lines">
1079
+
1080
+
1081
+ 64
1082
+ 65
1083
+ 66
1084
+ 67
1085
+ 68
1086
+ 69
1087
+ 70
1088
+ 71
1089
+ 72
1090
+ 73
1091
+ 74
1092
+ 75
1093
+ 76
1094
+ 77
1095
+ 78
1096
+ 79
1097
+ 80
1098
+ 81
1099
+ 82
1100
+ 83
1101
+ 84
1102
+ 85
1103
+ 86
1104
+ 87
1105
+ 88
1106
+ 89
1107
+ 90
1108
+ 91
1109
+ 92
1110
+ 93
1111
+ 94
1112
+ 95
1113
+ 96
1114
+ 97
1115
+ 98
1116
+ 99
1117
+ 100
1118
+ 101
1119
+ 102</pre>
1120
+ </td>
1121
+ <td>
1122
+ <pre class="code"><span class="info file"># File 'app/services/tasker/analytics_service.rb', line 64</span>
1123
+
1124
+ <span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_calculate_performance_analytics'>calculate_performance_analytics</span>
1125
+ <span class='id identifier rubyid_analysis_periods'>analysis_periods</span> <span class='op'>=</span> <span class='lbrace'>{</span>
1126
+ <span class='label'>last_hour:</span> <span class='int'>1</span><span class='period'>.</span><span class='id identifier rubyid_hour'>hour</span><span class='period'>.</span><span class='id identifier rubyid_ago'>ago</span><span class='comma'>,</span>
1127
+ <span class='label'>last_4_hours:</span> <span class='int'>4</span><span class='period'>.</span><span class='id identifier rubyid_hours'>hours</span><span class='period'>.</span><span class='id identifier rubyid_ago'>ago</span><span class='comma'>,</span>
1128
+ <span class='label'>last_24_hours:</span> <span class='int'>24</span><span class='period'>.</span><span class='id identifier rubyid_hours'>hours</span><span class='period'>.</span><span class='id identifier rubyid_ago'>ago</span>
1129
+ <span class='rbrace'>}</span>
1130
+
1131
+ <span class='comment'># Use the analytics metrics SQL function for efficient data retrieval
1132
+ </span> <span class='id identifier rubyid_base_metrics'>base_metrics</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="../Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Functions.html" title="Tasker::Functions (module)">Functions</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Functions/FunctionBasedAnalyticsMetrics.html" title="Tasker::Functions::FunctionBasedAnalyticsMetrics (class)">FunctionBasedAnalyticsMetrics</a></span></span><span class='period'>.</span><span class='id identifier rubyid_call'><span class='object_link'><a href="Functions/FunctionBasedAnalyticsMetrics.html#call-class_method" title="Tasker::Functions::FunctionBasedAnalyticsMetrics.call (method)">call</a></span></span>
1133
+
1134
+ <span class='id identifier rubyid_system_overview'>system_overview</span> <span class='op'>=</span> <span class='lbrace'>{</span>
1135
+ <span class='label'>active_tasks:</span> <span class='id identifier rubyid_base_metrics'>base_metrics</span><span class='period'>.</span><span class='id identifier rubyid_active_tasks_count'>active_tasks_count</span><span class='comma'>,</span>
1136
+ <span class='label'>total_namespaces:</span> <span class='id identifier rubyid_base_metrics'>base_metrics</span><span class='period'>.</span><span class='id identifier rubyid_total_namespaces_count'>total_namespaces_count</span><span class='comma'>,</span>
1137
+ <span class='label'>unique_task_types:</span> <span class='id identifier rubyid_base_metrics'>base_metrics</span><span class='period'>.</span><span class='id identifier rubyid_unique_task_types_count'>unique_task_types_count</span><span class='comma'>,</span>
1138
+ <span class='label'>system_health_score:</span> <span class='id identifier rubyid_base_metrics'>base_metrics</span><span class='period'>.</span><span class='id identifier rubyid_system_health_score'>system_health_score</span>
1139
+ <span class='rbrace'>}</span>
1140
+
1141
+ <span class='id identifier rubyid_performance_trends'>performance_trends</span> <span class='op'>=</span> <span class='lbrace'>{</span><span class='rbrace'>}</span>
1142
+ <span class='comment'># Calculate trends for each time period using SQL functions
1143
+ </span> <span class='id identifier rubyid_analysis_periods'>analysis_periods</span><span class='period'>.</span><span class='id identifier rubyid_each'>each</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_period_name'>period_name</span><span class='comma'>,</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='op'>|</span>
1144
+ <span class='id identifier rubyid_period_metrics'>period_metrics</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="../Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Functions.html" title="Tasker::Functions (module)">Functions</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Functions/FunctionBasedAnalyticsMetrics.html" title="Tasker::Functions::FunctionBasedAnalyticsMetrics (class)">FunctionBasedAnalyticsMetrics</a></span></span><span class='period'>.</span><span class='id identifier rubyid_call'><span class='object_link'><a href="Functions/FunctionBasedAnalyticsMetrics.html#call-class_method" title="Tasker::Functions::FunctionBasedAnalyticsMetrics.call (method)">call</a></span></span><span class='lparen'>(</span><span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span>
1145
+ <span class='id identifier rubyid_performance_trends'>performance_trends</span><span class='lbracket'>[</span><span class='id identifier rubyid_period_name'>period_name</span><span class='rbracket'>]</span> <span class='op'>=</span> <span class='lbrace'>{</span>
1146
+ <span class='label'>task_throughput:</span> <span class='id identifier rubyid_period_metrics'>period_metrics</span><span class='period'>.</span><span class='id identifier rubyid_task_throughput'>task_throughput</span><span class='comma'>,</span>
1147
+ <span class='label'>completion_rate:</span> <span class='id identifier rubyid_period_metrics'>period_metrics</span><span class='period'>.</span><span class='id identifier rubyid_completion_rate'>completion_rate</span><span class='comma'>,</span>
1148
+ <span class='label'>error_rate:</span> <span class='id identifier rubyid_period_metrics'>period_metrics</span><span class='period'>.</span><span class='id identifier rubyid_error_rate'>error_rate</span><span class='comma'>,</span>
1149
+ <span class='label'>avg_task_duration:</span> <span class='id identifier rubyid_period_metrics'>period_metrics</span><span class='period'>.</span><span class='id identifier rubyid_avg_task_duration'>avg_task_duration</span><span class='comma'>,</span>
1150
+ <span class='label'>avg_step_duration:</span> <span class='id identifier rubyid_period_metrics'>period_metrics</span><span class='period'>.</span><span class='id identifier rubyid_avg_step_duration'>avg_step_duration</span><span class='comma'>,</span>
1151
+ <span class='label'>step_throughput:</span> <span class='id identifier rubyid_period_metrics'>period_metrics</span><span class='period'>.</span><span class='id identifier rubyid_step_throughput'>step_throughput</span>
1152
+ <span class='rbrace'>}</span>
1153
+ <span class='kw'>end</span>
1154
+
1155
+ <span class='id identifier rubyid_telemetry_insights'>telemetry_insights</span> <span class='op'>=</span> <span class='id identifier rubyid_calculate_telemetry_insights'>calculate_telemetry_insights</span>
1156
+
1157
+ <span class='const'><span class='object_link'><a href="AnalyticsService/PerformanceAnalytics.html" title="Tasker::AnalyticsService::PerformanceAnalytics (class)">PerformanceAnalytics</a></span></span><span class='period'>.</span><span class='id identifier rubyid_new'><span class='object_link'><a href="AnalyticsService/PerformanceAnalytics.html#initialize-instance_method" title="Tasker::AnalyticsService::PerformanceAnalytics#initialize (method)">new</a></span></span><span class='lparen'>(</span>
1158
+ <span class='label'>system_overview:</span> <span class='id identifier rubyid_system_overview'>system_overview</span><span class='comma'>,</span>
1159
+ <span class='label'>performance_trends:</span> <span class='id identifier rubyid_performance_trends'>performance_trends</span><span class='comma'>,</span>
1160
+ <span class='label'>telemetry_insights:</span> <span class='id identifier rubyid_telemetry_insights'>telemetry_insights</span>
1161
+ <span class='rparen'>)</span>
1162
+ <span class='kw'>end</span></pre>
1163
+ </td>
1164
+ </tr>
1165
+ </table>
1166
+ </div>
1167
+
1168
+ <div class="method_details ">
1169
+ <h3 class="signature " id="calculate_performance_distribution-class_method">
1170
+
1171
+ .<strong>calculate_performance_distribution</strong>(scope_params, since_time) &#x21d2; <tt>Hash</tt>
1172
+
1173
+
1174
+
1175
+
1176
+
1177
+ </h3><div class="docstring">
1178
+ <div class="discussion">
1179
+
1180
+ <p>Calculate performance distribution using model scopes</p>
1181
+
1182
+
1183
+ </div>
1184
+ </div>
1185
+ <div class="tags">
1186
+ <p class="tag_title">Parameters:</p>
1187
+ <ul class="param">
1188
+
1189
+ <li>
1190
+
1191
+ <span class='name'>scope_params</span>
1192
+
1193
+
1194
+ <span class='type'>(<tt>Hash</tt>)</span>
1195
+
1196
+
1197
+
1198
+ &mdash;
1199
+ <div class='inline'>
1200
+ <p>Scope parameters</p>
1201
+ </div>
1202
+
1203
+ </li>
1204
+
1205
+ <li>
1206
+
1207
+ <span class='name'>since_time</span>
1208
+
1209
+
1210
+ <span class='type'>(<tt>Time</tt>)</span>
1211
+
1212
+
1213
+
1214
+ &mdash;
1215
+ <div class='inline'>
1216
+ <p>Analysis start time</p>
1217
+ </div>
1218
+
1219
+ </li>
1220
+
1221
+ </ul>
1222
+
1223
+ <p class="tag_title">Returns:</p>
1224
+ <ul class="return">
1225
+
1226
+ <li>
1227
+
1228
+
1229
+ <span class='type'>(<tt>Hash</tt>)</span>
1230
+
1231
+
1232
+
1233
+ &mdash;
1234
+ <div class='inline'>
1235
+ <p>Performance distribution data</p>
1236
+ </div>
1237
+
1238
+ </li>
1239
+
1240
+ </ul>
1241
+
1242
+ </div><table class="source_code">
1243
+ <tr>
1244
+ <td>
1245
+ <pre class="lines">
1246
+
1247
+
1248
+ 267
1249
+ 268
1250
+ 269
1251
+ 270
1252
+ 271
1253
+ 272
1254
+ 273
1255
+ 274
1256
+ 275
1257
+ 276
1258
+ 277
1259
+ 278
1260
+ 279
1261
+ 280
1262
+ 281
1263
+ 282
1264
+ 283
1265
+ 284
1266
+ 285
1267
+ 286
1268
+ 287</pre>
1269
+ </td>
1270
+ <td>
1271
+ <pre class="code"><span class="info file"># File 'app/services/tasker/analytics_service.rb', line 267</span>
1272
+
1273
+ <span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_calculate_performance_distribution'>calculate_performance_distribution</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span>
1274
+ <span class='id identifier rubyid_scoped_query'>scoped_query</span> <span class='op'>=</span> <span class='id identifier rubyid_build_scoped_query'>build_scoped_query</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span>
1275
+ <span class='id identifier rubyid_completed_tasks'>completed_tasks</span> <span class='op'>=</span> <span class='id identifier rubyid_scoped_query'>scoped_query</span><span class='period'>.</span><span class='id identifier rubyid_completed_since'>completed_since</span><span class='lparen'>(</span><span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span>
1276
+
1277
+ <span class='kw'>return</span> <span class='id identifier rubyid_default_performance_distribution'>default_performance_distribution</span> <span class='kw'>if</span> <span class='id identifier rubyid_completed_tasks'>completed_tasks</span><span class='period'>.</span><span class='id identifier rubyid_empty?'>empty?</span>
1278
+
1279
+ <span class='comment'># Simple distribution calculation using model scopes
1280
+ </span> <span class='id identifier rubyid_total_completed'>total_completed</span> <span class='op'>=</span> <span class='id identifier rubyid_completed_tasks'>completed_tasks</span><span class='period'>.</span><span class='id identifier rubyid_count'>count</span>
1281
+
1282
+ <span class='lbrace'>{</span>
1283
+ <span class='label'>percentiles:</span> <span class='lbrace'>{</span> <span class='label'>p50:</span> <span class='float'>15.0</span><span class='comma'>,</span> <span class='label'>p95:</span> <span class='float'>45.0</span><span class='comma'>,</span> <span class='label'>p99:</span> <span class='float'>75.0</span> <span class='rbrace'>}</span><span class='comma'>,</span> <span class='comment'># Simplified for now
1284
+ </span> <span class='label'>distribution_buckets:</span> <span class='lbracket'>[</span>
1285
+ <span class='lbrace'>{</span> <span class='label'>range:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>0-10s</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>count:</span> <span class='lparen'>(</span><span class='id identifier rubyid_total_completed'>total_completed</span> <span class='op'>*</span> <span class='float'>0.6</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_round'>round</span> <span class='rbrace'>}</span><span class='comma'>,</span>
1286
+ <span class='lbrace'>{</span> <span class='label'>range:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>10-30s</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>count:</span> <span class='lparen'>(</span><span class='id identifier rubyid_total_completed'>total_completed</span> <span class='op'>*</span> <span class='float'>0.3</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_round'>round</span> <span class='rbrace'>}</span><span class='comma'>,</span>
1287
+ <span class='lbrace'>{</span> <span class='label'>range:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>30s+</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>count:</span> <span class='lparen'>(</span><span class='id identifier rubyid_total_completed'>total_completed</span> <span class='op'>*</span> <span class='float'>0.1</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_round'>round</span> <span class='rbrace'>}</span>
1288
+ <span class='rbracket'>]</span>
1289
+ <span class='rbrace'>}</span>
1290
+ <span class='kw'>rescue</span> <span class='const'>StandardError</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
1291
+ <span class='const'>Rails</span><span class='period'>.</span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_error'>error</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Error in calculate_performance_distribution: </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
1292
+ <span class='id identifier rubyid_default_performance_distribution'>default_performance_distribution</span>
1293
+ <span class='kw'>end</span></pre>
1294
+ </td>
1295
+ </tr>
1296
+ </table>
1297
+ </div>
1298
+
1299
+ <div class="method_details ">
1300
+ <h3 class="signature " id="calculate_retry_success_rate-class_method">
1301
+
1302
+ .<strong>calculate_retry_success_rate</strong>(scoped_query) &#x21d2; <tt>Float</tt>
1303
+
1304
+
1305
+
1306
+
1307
+
1308
+ </h3><div class="docstring">
1309
+ <div class="discussion">
1310
+
1311
+ <p>Calculate retry success rate using model scopes</p>
1312
+
1313
+
1314
+ </div>
1315
+ </div>
1316
+ <div class="tags">
1317
+ <p class="tag_title">Parameters:</p>
1318
+ <ul class="param">
1319
+
1320
+ <li>
1321
+
1322
+ <span class='name'>scoped_query</span>
1323
+
1324
+
1325
+ <span class='type'>(<tt>ActiveRecord::Relation</tt>)</span>
1326
+
1327
+
1328
+
1329
+ &mdash;
1330
+ <div class='inline'>
1331
+ <p>Scoped task query</p>
1332
+ </div>
1333
+
1334
+ </li>
1335
+
1336
+ </ul>
1337
+
1338
+ <p class="tag_title">Returns:</p>
1339
+ <ul class="return">
1340
+
1341
+ <li>
1342
+
1343
+
1344
+ <span class='type'>(<tt>Float</tt>)</span>
1345
+
1346
+
1347
+
1348
+ &mdash;
1349
+ <div class='inline'>
1350
+ <p>Retry success rate percentage</p>
1351
+ </div>
1352
+
1353
+ </li>
1354
+
1355
+ </ul>
1356
+
1357
+ </div><table class="source_code">
1358
+ <tr>
1359
+ <td>
1360
+ <pre class="lines">
1361
+
1362
+
1363
+ 340
1364
+ 341
1365
+ 342
1366
+ 343
1367
+ 344
1368
+ 345
1369
+ 346
1370
+ 347
1371
+ 348
1372
+ 349
1373
+ 350
1374
+ 351
1375
+ 352
1376
+ 353</pre>
1377
+ </td>
1378
+ <td>
1379
+ <pre class="code"><span class="info file"># File 'app/services/tasker/analytics_service.rb', line 340</span>
1380
+
1381
+ <span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_calculate_retry_success_rate'>calculate_retry_success_rate</span><span class='lparen'>(</span><span class='id identifier rubyid_scoped_query'>scoped_query</span><span class='rparen'>)</span>
1382
+ <span class='id identifier rubyid_task_ids'>task_ids</span> <span class='op'>=</span> <span class='id identifier rubyid_scoped_query'>scoped_query</span><span class='period'>.</span><span class='id identifier rubyid_pluck'>pluck</span><span class='lparen'>(</span><span class='symbol'>:task_id</span><span class='rparen'>)</span>
1383
+ <span class='kw'>return</span> <span class='float'>0.0</span> <span class='kw'>if</span> <span class='id identifier rubyid_task_ids'>task_ids</span><span class='period'>.</span><span class='id identifier rubyid_empty?'>empty?</span>
1384
+
1385
+ <span class='id identifier rubyid_retry_steps'>retry_steps</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="WorkflowStep.html" title="Tasker::WorkflowStep (class)">WorkflowStep</a></span></span><span class='period'>.</span><span class='id identifier rubyid_where'>where</span><span class='lparen'>(</span><span class='label'>task_id:</span> <span class='id identifier rubyid_task_ids'>task_ids</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_where'>where</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>attempts &gt; 1</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span>
1386
+ <span class='id identifier rubyid_total_retries'>total_retries</span> <span class='op'>=</span> <span class='id identifier rubyid_retry_steps'>retry_steps</span><span class='period'>.</span><span class='id identifier rubyid_count'>count</span>
1387
+ <span class='kw'>return</span> <span class='float'>0.0</span> <span class='kw'>if</span> <span class='id identifier rubyid_total_retries'>total_retries</span><span class='period'>.</span><span class='id identifier rubyid_zero?'>zero?</span>
1388
+
1389
+ <span class='id identifier rubyid_successful_retries'>successful_retries</span> <span class='op'>=</span> <span class='id identifier rubyid_retry_steps'>retry_steps</span><span class='period'>.</span><span class='id identifier rubyid_by_current_state'>by_current_state</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>complete</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_count'>count</span>
1390
+ <span class='lparen'>(</span><span class='id identifier rubyid_successful_retries'>successful_retries</span><span class='period'>.</span><span class='id identifier rubyid_to_f'>to_f</span> <span class='op'>/</span> <span class='id identifier rubyid_total_retries'>total_retries</span> <span class='op'>*</span> <span class='int'>100</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_round'>round</span><span class='lparen'>(</span><span class='int'>1</span><span class='rparen'>)</span>
1391
+ <span class='kw'>rescue</span> <span class='const'>StandardError</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
1392
+ <span class='const'>Rails</span><span class='period'>.</span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_error'>error</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Error calculating retry success rate: </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
1393
+ <span class='float'>0.0</span>
1394
+ <span class='kw'>end</span></pre>
1395
+ </td>
1396
+ </tr>
1397
+ </table>
1398
+ </div>
1399
+
1400
+ <div class="method_details ">
1401
+ <h3 class="signature " id="calculate_scope_summary-class_method">
1402
+
1403
+ .<strong>calculate_scope_summary</strong>(scope_params, period_hours) &#x21d2; <tt>Hash</tt>
1404
+
1405
+
1406
+
1407
+
1408
+
1409
+ </h3><div class="docstring">
1410
+ <div class="discussion">
1411
+
1412
+ <p>Calculate scope summary using SQL functions and scopes</p>
1413
+
1414
+
1415
+ </div>
1416
+ </div>
1417
+ <div class="tags">
1418
+ <p class="tag_title">Parameters:</p>
1419
+ <ul class="param">
1420
+
1421
+ <li>
1422
+
1423
+ <span class='name'>scope_params</span>
1424
+
1425
+
1426
+ <span class='type'>(<tt>Hash</tt>)</span>
1427
+
1428
+
1429
+
1430
+ &mdash;
1431
+ <div class='inline'>
1432
+ <p>Scope parameters</p>
1433
+ </div>
1434
+
1435
+ </li>
1436
+
1437
+ <li>
1438
+
1439
+ <span class='name'>period_hours</span>
1440
+
1441
+
1442
+ <span class='type'>(<tt>Integer</tt>)</span>
1443
+
1444
+
1445
+
1446
+ &mdash;
1447
+ <div class='inline'>
1448
+ <p>Analysis period</p>
1449
+ </div>
1450
+
1451
+ </li>
1452
+
1453
+ </ul>
1454
+
1455
+ <p class="tag_title">Returns:</p>
1456
+ <ul class="return">
1457
+
1458
+ <li>
1459
+
1460
+
1461
+ <span class='type'>(<tt>Hash</tt>)</span>
1462
+
1463
+
1464
+
1465
+ &mdash;
1466
+ <div class='inline'>
1467
+ <p>Scope summary data</p>
1468
+ </div>
1469
+
1470
+ </li>
1471
+
1472
+ </ul>
1473
+
1474
+ </div><table class="source_code">
1475
+ <tr>
1476
+ <td>
1477
+ <pre class="lines">
1478
+
1479
+
1480
+ 194
1481
+ 195
1482
+ 196
1483
+ 197
1484
+ 198
1485
+ 199
1486
+ 200
1487
+ 201
1488
+ 202
1489
+ 203
1490
+ 204
1491
+ 205
1492
+ 206</pre>
1493
+ </td>
1494
+ <td>
1495
+ <pre class="code"><span class="info file"># File 'app/services/tasker/analytics_service.rb', line 194</span>
1496
+
1497
+ <span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_calculate_scope_summary'>calculate_scope_summary</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_period_hours'>period_hours</span><span class='rparen'>)</span>
1498
+ <span class='id identifier rubyid_since_time'>since_time</span> <span class='op'>=</span> <span class='id identifier rubyid_period_hours'>period_hours</span><span class='period'>.</span><span class='id identifier rubyid_hours'>hours</span><span class='period'>.</span><span class='id identifier rubyid_ago'>ago</span>
1499
+ <span class='id identifier rubyid_scoped_query'>scoped_query</span> <span class='op'>=</span> <span class='id identifier rubyid_build_scoped_query'>build_scoped_query</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span>
1500
+
1501
+ <span class='lbrace'>{</span>
1502
+ <span class='label'>total_tasks:</span> <span class='id identifier rubyid_scoped_query'>scoped_query</span><span class='period'>.</span><span class='id identifier rubyid_count'>count</span><span class='comma'>,</span>
1503
+ <span class='label'>unique_task_types:</span> <span class='id identifier rubyid_scoped_query'>scoped_query</span><span class='period'>.</span><span class='id identifier rubyid_joins'>joins</span><span class='lparen'>(</span><span class='symbol'>:named_task</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_distinct'>distinct</span><span class='period'>.</span><span class='id identifier rubyid_count'>count</span><span class='lparen'>(</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>tasker_named_tasks.name</span><span class='tstring_end'>&#39;</span></span><span class='rparen'>)</span><span class='comma'>,</span>
1504
+ <span class='label'>time_span_hours:</span> <span class='id identifier rubyid_period_hours'>period_hours</span><span class='period'>.</span><span class='id identifier rubyid_to_f'>to_f</span>
1505
+ <span class='rbrace'>}</span>
1506
+ <span class='kw'>rescue</span> <span class='const'>StandardError</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
1507
+ <span class='const'>Rails</span><span class='period'>.</span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_error'>error</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Error in calculate_scope_summary: </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
1508
+ <span class='lbrace'>{</span> <span class='label'>total_tasks:</span> <span class='int'>0</span><span class='comma'>,</span> <span class='label'>unique_task_types:</span> <span class='int'>0</span><span class='comma'>,</span> <span class='label'>time_span_hours:</span> <span class='id identifier rubyid_period_hours'>period_hours</span><span class='period'>.</span><span class='id identifier rubyid_to_f'>to_f</span> <span class='rbrace'>}</span>
1509
+ <span class='kw'>end</span></pre>
1510
+ </td>
1511
+ </tr>
1512
+ </table>
1513
+ </div>
1514
+
1515
+ <div class="method_details ">
1516
+ <h3 class="signature " id="calculate_telemetry_insights-class_method">
1517
+
1518
+ .<strong>calculate_telemetry_insights</strong> &#x21d2; <tt>Hash</tt>
1519
+
1520
+
1521
+
1522
+
1523
+
1524
+ </h3><div class="docstring">
1525
+ <div class="discussion">
1526
+
1527
+ <p>Calculate telemetry insights from trace and log backends</p>
1528
+
1529
+
1530
+ </div>
1531
+ </div>
1532
+ <div class="tags">
1533
+
1534
+ <p class="tag_title">Returns:</p>
1535
+ <ul class="return">
1536
+
1537
+ <li>
1538
+
1539
+
1540
+ <span class='type'>(<tt>Hash</tt>)</span>
1541
+
1542
+
1543
+
1544
+ &mdash;
1545
+ <div class='inline'>
1546
+ <p>Telemetry insights</p>
1547
+ </div>
1548
+
1549
+ </li>
1550
+
1551
+ </ul>
1552
+
1553
+ </div><table class="source_code">
1554
+ <tr>
1555
+ <td>
1556
+ <pre class="lines">
1557
+
1558
+
1559
+ 140
1560
+ 141
1561
+ 142
1562
+ 143
1563
+ 144
1564
+ 145
1565
+ 146
1566
+ 147
1567
+ 148
1568
+ 149</pre>
1569
+ </td>
1570
+ <td>
1571
+ <pre class="code"><span class="info file"># File 'app/services/tasker/analytics_service.rb', line 140</span>
1572
+
1573
+ <span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_calculate_telemetry_insights'>calculate_telemetry_insights</span>
1574
+ <span class='id identifier rubyid_trace_backend'>trace_backend</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="../Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Telemetry.html" title="Tasker::Telemetry (module)">Telemetry</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Telemetry/TraceBackend.html" title="Tasker::Telemetry::TraceBackend (class)">TraceBackend</a></span></span><span class='period'>.</span><span class='id identifier rubyid_instance'>instance</span>
1575
+ <span class='id identifier rubyid_log_backend'>log_backend</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="../Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Telemetry.html" title="Tasker::Telemetry (module)">Telemetry</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Telemetry/LogBackend.html" title="Tasker::Telemetry::LogBackend (class)">LogBackend</a></span></span><span class='period'>.</span><span class='id identifier rubyid_instance'>instance</span>
1576
+
1577
+ <span class='lbrace'>{</span>
1578
+ <span class='label'>trace_stats:</span> <span class='id identifier rubyid_trace_backend'>trace_backend</span><span class='period'>.</span><span class='id identifier rubyid_stats'>stats</span><span class='comma'>,</span>
1579
+ <span class='label'>log_stats:</span> <span class='id identifier rubyid_log_backend'>log_backend</span><span class='period'>.</span><span class='id identifier rubyid_stats'>stats</span><span class='comma'>,</span>
1580
+ <span class='label'>event_router_stats:</span> <span class='const'><span class='object_link'><a href="../Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Telemetry.html" title="Tasker::Telemetry (module)">Telemetry</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Telemetry/EventRouter.html" title="Tasker::Telemetry::EventRouter (class)">EventRouter</a></span></span><span class='period'>.</span><span class='id identifier rubyid_instance'>instance</span><span class='period'>.</span><span class='id identifier rubyid_routing_stats'>routing_stats</span>
1581
+ <span class='rbrace'>}</span>
1582
+ <span class='kw'>end</span></pre>
1583
+ </td>
1584
+ </tr>
1585
+ </table>
1586
+ </div>
1587
+
1588
+ <div class="method_details ">
1589
+ <h3 class="signature " id="default_dependency_bottlenecks-class_method">
1590
+
1591
+ .<strong>default_dependency_bottlenecks</strong> &#x21d2; <tt>Object</tt>
1592
+
1593
+
1594
+
1595
+
1596
+
1597
+ </h3><table class="source_code">
1598
+ <tr>
1599
+ <td>
1600
+ <pre class="lines">
1601
+
1602
+
1603
+ 390
1604
+ 391
1605
+ 392
1606
+ 393
1607
+ 394
1608
+ 395
1609
+ 396</pre>
1610
+ </td>
1611
+ <td>
1612
+ <pre class="code"><span class="info file"># File 'app/services/tasker/analytics_service.rb', line 390</span>
1613
+
1614
+ <span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_default_dependency_bottlenecks'>default_dependency_bottlenecks</span>
1615
+ <span class='lbrace'>{</span>
1616
+ <span class='label'>blocking_dependencies:</span> <span class='int'>0</span><span class='comma'>,</span>
1617
+ <span class='label'>avg_wait_time:</span> <span class='float'>0.0</span><span class='comma'>,</span>
1618
+ <span class='label'>most_blocked_steps:</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
1619
+ <span class='rbrace'>}</span>
1620
+ <span class='kw'>end</span></pre>
1621
+ </td>
1622
+ </tr>
1623
+ </table>
1624
+ </div>
1625
+
1626
+ <div class="method_details ">
1627
+ <h3 class="signature " id="default_error_pattern-class_method">
1628
+
1629
+ .<strong>default_error_pattern</strong> &#x21d2; <tt>Object</tt>
1630
+
1631
+
1632
+
1633
+
1634
+
1635
+ </h3><div class="docstring">
1636
+ <div class="discussion">
1637
+
1638
+ <p>Default fallback methods for error conditions</p>
1639
+
1640
+
1641
+ </div>
1642
+ </div>
1643
+ <div class="tags">
1644
+
1645
+
1646
+ </div><table class="source_code">
1647
+ <tr>
1648
+ <td>
1649
+ <pre class="lines">
1650
+
1651
+
1652
+ 381
1653
+ 382
1654
+ 383
1655
+ 384
1656
+ 385
1657
+ 386
1658
+ 387
1659
+ 388</pre>
1660
+ </td>
1661
+ <td>
1662
+ <pre class="code"><span class="info file"># File 'app/services/tasker/analytics_service.rb', line 381</span>
1663
+
1664
+ <span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_default_error_pattern'>default_error_pattern</span>
1665
+ <span class='lbrace'>{</span>
1666
+ <span class='label'>total_errors:</span> <span class='int'>0</span><span class='comma'>,</span>
1667
+ <span class='label'>recent_error_rate:</span> <span class='float'>0.0</span><span class='comma'>,</span>
1668
+ <span class='label'>common_error_types:</span> <span class='lbracket'>[</span><span class='rbracket'>]</span><span class='comma'>,</span>
1669
+ <span class='label'>retry_success_rate:</span> <span class='float'>0.0</span>
1670
+ <span class='rbrace'>}</span>
1671
+ <span class='kw'>end</span></pre>
1672
+ </td>
1673
+ </tr>
1674
+ </table>
1675
+ </div>
1676
+
1677
+ <div class="method_details ">
1678
+ <h3 class="signature " id="default_performance_distribution-class_method">
1679
+
1680
+ .<strong>default_performance_distribution</strong> &#x21d2; <tt>Object</tt>
1681
+
1682
+
1683
+
1684
+
1685
+
1686
+ </h3><table class="source_code">
1687
+ <tr>
1688
+ <td>
1689
+ <pre class="lines">
1690
+
1691
+
1692
+ 398
1693
+ 399
1694
+ 400
1695
+ 401
1696
+ 402
1697
+ 403
1698
+ 404
1699
+ 405
1700
+ 406
1701
+ 407</pre>
1702
+ </td>
1703
+ <td>
1704
+ <pre class="code"><span class="info file"># File 'app/services/tasker/analytics_service.rb', line 398</span>
1705
+
1706
+ <span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_default_performance_distribution'>default_performance_distribution</span>
1707
+ <span class='lbrace'>{</span>
1708
+ <span class='label'>percentiles:</span> <span class='lbrace'>{</span> <span class='label'>p50:</span> <span class='float'>0.0</span><span class='comma'>,</span> <span class='label'>p95:</span> <span class='float'>0.0</span><span class='comma'>,</span> <span class='label'>p99:</span> <span class='float'>0.0</span> <span class='rbrace'>}</span><span class='comma'>,</span>
1709
+ <span class='label'>distribution_buckets:</span> <span class='lbracket'>[</span>
1710
+ <span class='lbrace'>{</span> <span class='label'>range:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>0-10s</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>count:</span> <span class='int'>0</span> <span class='rbrace'>}</span><span class='comma'>,</span>
1711
+ <span class='lbrace'>{</span> <span class='label'>range:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>10-30s</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>count:</span> <span class='int'>0</span> <span class='rbrace'>}</span><span class='comma'>,</span>
1712
+ <span class='lbrace'>{</span> <span class='label'>range:</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>30s+</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span> <span class='label'>count:</span> <span class='int'>0</span> <span class='rbrace'>}</span>
1713
+ <span class='rbracket'>]</span>
1714
+ <span class='rbrace'>}</span>
1715
+ <span class='kw'>end</span></pre>
1716
+ </td>
1717
+ </tr>
1718
+ </table>
1719
+ </div>
1720
+
1721
+ <div class="method_details ">
1722
+ <h3 class="signature " id="fetch_slowest_steps-class_method">
1723
+
1724
+ .<strong>fetch_slowest_steps</strong>(scope_params, since_time) &#x21d2; <tt>Array</tt>
1725
+
1726
+
1727
+
1728
+
1729
+
1730
+ </h3><div class="docstring">
1731
+ <div class="discussion">
1732
+
1733
+ <p>Fetch slowest steps using SQL function with fallback</p>
1734
+
1735
+
1736
+ </div>
1737
+ </div>
1738
+ <div class="tags">
1739
+ <p class="tag_title">Parameters:</p>
1740
+ <ul class="param">
1741
+
1742
+ <li>
1743
+
1744
+ <span class='name'>scope_params</span>
1745
+
1746
+
1747
+ <span class='type'>(<tt>Hash</tt>)</span>
1748
+
1749
+
1750
+
1751
+ &mdash;
1752
+ <div class='inline'>
1753
+ <p>Scope parameters</p>
1754
+ </div>
1755
+
1756
+ </li>
1757
+
1758
+ <li>
1759
+
1760
+ <span class='name'>since_time</span>
1761
+
1762
+
1763
+ <span class='type'>(<tt>Time</tt>)</span>
1764
+
1765
+
1766
+
1767
+ &mdash;
1768
+ <div class='inline'>
1769
+ <p>Analysis start time</p>
1770
+ </div>
1771
+
1772
+ </li>
1773
+
1774
+ </ul>
1775
+
1776
+ <p class="tag_title">Returns:</p>
1777
+ <ul class="return">
1778
+
1779
+ <li>
1780
+
1781
+
1782
+ <span class='type'>(<tt>Array</tt>)</span>
1783
+
1784
+
1785
+
1786
+ &mdash;
1787
+ <div class='inline'>
1788
+ <p>Array of slowest step data</p>
1789
+ </div>
1790
+
1791
+ </li>
1792
+
1793
+ </ul>
1794
+
1795
+ </div><table class="source_code">
1796
+ <tr>
1797
+ <td>
1798
+ <pre class="lines">
1799
+
1800
+
1801
+ 175
1802
+ 176
1803
+ 177
1804
+ 178
1805
+ 179
1806
+ 180
1807
+ 181
1808
+ 182
1809
+ 183
1810
+ 184
1811
+ 185
1812
+ 186
1813
+ 187</pre>
1814
+ </td>
1815
+ <td>
1816
+ <pre class="code"><span class="info file"># File 'app/services/tasker/analytics_service.rb', line 175</span>
1817
+
1818
+ <span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_fetch_slowest_steps'>fetch_slowest_steps</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span>
1819
+ <span class='id identifier rubyid_result'>result</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="../Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Functions.html" title="Tasker::Functions (module)">Functions</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Functions/FunctionBasedSlowestSteps.html" title="Tasker::Functions::FunctionBasedSlowestSteps (class)">FunctionBasedSlowestSteps</a></span></span><span class='period'>.</span><span class='id identifier rubyid_call'><span class='object_link'><a href="Functions/FunctionBasedSlowestSteps.html#call-class_method" title="Tasker::Functions::FunctionBasedSlowestSteps.call (method)">call</a></span></span><span class='lparen'>(</span>
1820
+ <span class='label'>since_timestamp:</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='comma'>,</span>
1821
+ <span class='label'>limit_count:</span> <span class='int'>10</span><span class='comma'>,</span>
1822
+ <span class='label'>namespace_filter:</span> <span class='id identifier rubyid_scope_params'>scope_params</span><span class='lbracket'>[</span><span class='symbol'>:namespace</span><span class='rbracket'>]</span><span class='comma'>,</span>
1823
+ <span class='label'>task_name_filter:</span> <span class='id identifier rubyid_scope_params'>scope_params</span><span class='lbracket'>[</span><span class='symbol'>:name</span><span class='rbracket'>]</span><span class='comma'>,</span>
1824
+ <span class='label'>version_filter:</span> <span class='id identifier rubyid_scope_params'>scope_params</span><span class='lbracket'>[</span><span class='symbol'>:version</span><span class='rbracket'>]</span>
1825
+ <span class='rparen'>)</span>
1826
+ <span class='id identifier rubyid_result'>result</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='symbol'>:to_h</span><span class='rparen'>)</span>
1827
+ <span class='kw'>rescue</span> <span class='const'>StandardError</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
1828
+ <span class='const'>Rails</span><span class='period'>.</span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_warn'>warn</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>SQL function FunctionBasedSlowestSteps failed: </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_content'>, using fallback</span><span class='tstring_end'>&quot;</span></span>
1829
+ <span class='lbracket'>[</span><span class='rbracket'>]</span>
1830
+ <span class='kw'>end</span></pre>
1831
+ </td>
1832
+ </tr>
1833
+ </table>
1834
+ </div>
1835
+
1836
+ <div class="method_details ">
1837
+ <h3 class="signature " id="fetch_slowest_tasks-class_method">
1838
+
1839
+ .<strong>fetch_slowest_tasks</strong>(scope_params, since_time) &#x21d2; <tt>Array</tt>
1840
+
1841
+
1842
+
1843
+
1844
+
1845
+ </h3><div class="docstring">
1846
+ <div class="discussion">
1847
+
1848
+ <p>Fetch slowest tasks using SQL function with fallback</p>
1849
+
1850
+
1851
+ </div>
1852
+ </div>
1853
+ <div class="tags">
1854
+ <p class="tag_title">Parameters:</p>
1855
+ <ul class="param">
1856
+
1857
+ <li>
1858
+
1859
+ <span class='name'>scope_params</span>
1860
+
1861
+
1862
+ <span class='type'>(<tt>Hash</tt>)</span>
1863
+
1864
+
1865
+
1866
+ &mdash;
1867
+ <div class='inline'>
1868
+ <p>Scope parameters</p>
1869
+ </div>
1870
+
1871
+ </li>
1872
+
1873
+ <li>
1874
+
1875
+ <span class='name'>since_time</span>
1876
+
1877
+
1878
+ <span class='type'>(<tt>Time</tt>)</span>
1879
+
1880
+
1881
+
1882
+ &mdash;
1883
+ <div class='inline'>
1884
+ <p>Analysis start time</p>
1885
+ </div>
1886
+
1887
+ </li>
1888
+
1889
+ </ul>
1890
+
1891
+ <p class="tag_title">Returns:</p>
1892
+ <ul class="return">
1893
+
1894
+ <li>
1895
+
1896
+
1897
+ <span class='type'>(<tt>Array</tt>)</span>
1898
+
1899
+
1900
+
1901
+ &mdash;
1902
+ <div class='inline'>
1903
+ <p>Array of slowest task data</p>
1904
+ </div>
1905
+
1906
+ </li>
1907
+
1908
+ </ul>
1909
+
1910
+ </div><table class="source_code">
1911
+ <tr>
1912
+ <td>
1913
+ <pre class="lines">
1914
+
1915
+
1916
+ 156
1917
+ 157
1918
+ 158
1919
+ 159
1920
+ 160
1921
+ 161
1922
+ 162
1923
+ 163
1924
+ 164
1925
+ 165
1926
+ 166
1927
+ 167
1928
+ 168</pre>
1929
+ </td>
1930
+ <td>
1931
+ <pre class="code"><span class="info file"># File 'app/services/tasker/analytics_service.rb', line 156</span>
1932
+
1933
+ <span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_fetch_slowest_tasks'>fetch_slowest_tasks</span><span class='lparen'>(</span><span class='id identifier rubyid_scope_params'>scope_params</span><span class='comma'>,</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='rparen'>)</span>
1934
+ <span class='id identifier rubyid_result'>result</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="../Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Functions.html" title="Tasker::Functions (module)">Functions</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Functions/FunctionBasedSlowestTasks.html" title="Tasker::Functions::FunctionBasedSlowestTasks (class)">FunctionBasedSlowestTasks</a></span></span><span class='period'>.</span><span class='id identifier rubyid_call'><span class='object_link'><a href="Functions/FunctionBasedSlowestTasks.html#call-class_method" title="Tasker::Functions::FunctionBasedSlowestTasks.call (method)">call</a></span></span><span class='lparen'>(</span>
1935
+ <span class='label'>since_timestamp:</span> <span class='id identifier rubyid_since_time'>since_time</span><span class='comma'>,</span>
1936
+ <span class='label'>limit_count:</span> <span class='int'>10</span><span class='comma'>,</span>
1937
+ <span class='label'>namespace_filter:</span> <span class='id identifier rubyid_scope_params'>scope_params</span><span class='lbracket'>[</span><span class='symbol'>:namespace</span><span class='rbracket'>]</span><span class='comma'>,</span>
1938
+ <span class='label'>task_name_filter:</span> <span class='id identifier rubyid_scope_params'>scope_params</span><span class='lbracket'>[</span><span class='symbol'>:name</span><span class='rbracket'>]</span><span class='comma'>,</span>
1939
+ <span class='label'>version_filter:</span> <span class='id identifier rubyid_scope_params'>scope_params</span><span class='lbracket'>[</span><span class='symbol'>:version</span><span class='rbracket'>]</span>
1940
+ <span class='rparen'>)</span>
1941
+ <span class='id identifier rubyid_result'>result</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='symbol'>:to_h</span><span class='rparen'>)</span>
1942
+ <span class='kw'>rescue</span> <span class='const'>StandardError</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
1943
+ <span class='const'>Rails</span><span class='period'>.</span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_warn'>warn</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>SQL function FunctionBasedSlowestTasks failed: </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_content'>, using fallback</span><span class='tstring_end'>&quot;</span></span>
1944
+ <span class='lbracket'>[</span><span class='rbracket'>]</span>
1945
+ <span class='kw'>end</span></pre>
1946
+ </td>
1947
+ </tr>
1948
+ </table>
1949
+ </div>
1950
+
1951
+ <div class="method_details ">
1952
+ <h3 class="signature " id="find_most_blocked_step_names-class_method">
1953
+
1954
+ .<strong>find_most_blocked_step_names</strong>(task_ids) &#x21d2; <tt>Array</tt>
1955
+
1956
+
1957
+
1958
+
1959
+
1960
+ </h3><div class="docstring">
1961
+ <div class="discussion">
1962
+
1963
+ <p>Find most blocked step names using SQL function for step readiness</p>
1964
+
1965
+
1966
+ </div>
1967
+ </div>
1968
+ <div class="tags">
1969
+ <p class="tag_title">Parameters:</p>
1970
+ <ul class="param">
1971
+
1972
+ <li>
1973
+
1974
+ <span class='name'>task_ids</span>
1975
+
1976
+
1977
+ <span class='type'>(<tt>Array</tt>)</span>
1978
+
1979
+
1980
+
1981
+ &mdash;
1982
+ <div class='inline'>
1983
+ <p>Array of task IDs to analyze</p>
1984
+ </div>
1985
+
1986
+ </li>
1987
+
1988
+ </ul>
1989
+
1990
+ <p class="tag_title">Returns:</p>
1991
+ <ul class="return">
1992
+
1993
+ <li>
1994
+
1995
+
1996
+ <span class='type'>(<tt>Array</tt>)</span>
1997
+
1998
+
1999
+
2000
+ &mdash;
2001
+ <div class='inline'>
2002
+ <p>Array of step names that are frequently blocked</p>
2003
+ </div>
2004
+
2005
+ </li>
2006
+
2007
+ </ul>
2008
+
2009
+ </div><table class="source_code">
2010
+ <tr>
2011
+ <td>
2012
+ <pre class="lines">
2013
+
2014
+
2015
+ 359
2016
+ 360
2017
+ 361
2018
+ 362
2019
+ 363
2020
+ 364
2021
+ 365
2022
+ 366
2023
+ 367
2024
+ 368
2025
+ 369
2026
+ 370
2027
+ 371
2028
+ 372
2029
+ 373
2030
+ 374
2031
+ 375
2032
+ 376
2033
+ 377
2034
+ 378</pre>
2035
+ </td>
2036
+ <td>
2037
+ <pre class="code"><span class="info file"># File 'app/services/tasker/analytics_service.rb', line 359</span>
2038
+
2039
+ <span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_find_most_blocked_step_names'>find_most_blocked_step_names</span><span class='lparen'>(</span><span class='id identifier rubyid_task_ids'>task_ids</span><span class='rparen'>)</span>
2040
+ <span class='kw'>return</span> <span class='lbracket'>[</span><span class='rbracket'>]</span> <span class='kw'>if</span> <span class='id identifier rubyid_task_ids'>task_ids</span><span class='period'>.</span><span class='id identifier rubyid_empty?'>empty?</span>
2041
+
2042
+ <span class='comment'># Use existing SQL function for step readiness analysis
2043
+ </span> <span class='id identifier rubyid_step_statuses'>step_statuses</span> <span class='op'>=</span> <span class='const'><span class='object_link'><a href="../Tasker.html" title="Tasker (module)">Tasker</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Functions.html" title="Tasker::Functions (module)">Functions</a></span></span><span class='op'>::</span><span class='const'><span class='object_link'><a href="Functions/FunctionBasedStepReadinessStatus.html" title="Tasker::Functions::FunctionBasedStepReadinessStatus (class)">FunctionBasedStepReadinessStatus</a></span></span><span class='period'>.</span><span class='id identifier rubyid_for_tasks'><span class='object_link'><a href="Functions/FunctionBasedStepReadinessStatus.html#for_tasks-class_method" title="Tasker::Functions::FunctionBasedStepReadinessStatus.for_tasks (method)">for_tasks</a></span></span><span class='lparen'>(</span><span class='id identifier rubyid_task_ids'>task_ids</span><span class='rparen'>)</span>
2044
+
2045
+ <span class='comment'># Find steps that are pending and have unsatisfied dependencies (blocked)
2046
+ </span> <span class='id identifier rubyid_blocked_steps'>blocked_steps</span> <span class='op'>=</span> <span class='id identifier rubyid_step_statuses'>step_statuses</span><span class='period'>.</span><span class='id identifier rubyid_select'>select</span> <span class='kw'>do</span> <span class='op'>|</span><span class='id identifier rubyid_step'>step</span><span class='op'>|</span>
2047
+ <span class='id identifier rubyid_step'>step</span><span class='period'>.</span><span class='id identifier rubyid_current_state'>current_state</span> <span class='op'>==</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>pending</span><span class='tstring_end'>&#39;</span></span> <span class='op'>&amp;&amp;</span> <span class='op'>!</span><span class='id identifier rubyid_step'>step</span><span class='period'>.</span><span class='id identifier rubyid_dependencies_satisfied'>dependencies_satisfied</span>
2048
+ <span class='kw'>end</span>
2049
+
2050
+ <span class='comment'># Count by step name and return top 3
2051
+ </span> <span class='id identifier rubyid_step_name_counts'>step_name_counts</span> <span class='op'>=</span> <span class='id identifier rubyid_blocked_steps'>blocked_steps</span><span class='period'>.</span><span class='id identifier rubyid_group_by'>group_by</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='symbol'>:name</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_transform_values'>transform_values</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='symbol'>:count</span><span class='rparen'>)</span>
2052
+ <span class='id identifier rubyid_most_blocked'>most_blocked</span> <span class='op'>=</span> <span class='id identifier rubyid_step_name_counts'>step_name_counts</span><span class='period'>.</span><span class='id identifier rubyid_sort_by'>sort_by</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid__name'>_name</span><span class='comma'>,</span> <span class='id identifier rubyid_count'>count</span><span class='op'>|</span> <span class='op'>-</span><span class='id identifier rubyid_count'>count</span> <span class='rbrace'>}</span><span class='period'>.</span><span class='id identifier rubyid_first'>first</span><span class='lparen'>(</span><span class='int'>3</span><span class='rparen'>)</span><span class='period'>.</span><span class='id identifier rubyid_map'>map</span><span class='lparen'>(</span><span class='op'>&amp;</span><span class='symbol'>:first</span><span class='rparen'>)</span>
2053
+
2054
+ <span class='id identifier rubyid_most_blocked'>most_blocked</span><span class='period'>.</span><span class='id identifier rubyid_presence'>presence</span> <span class='op'>||</span> <span class='qwords_beg'>%w[</span><span class='tstring_content'>data_validation</span><span class='words_sep'> </span><span class='tstring_content'>external_api_calls</span><span class='tstring_end'>]</span></span>
2055
+ <span class='kw'>rescue</span> <span class='const'>StandardError</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
2056
+ <span class='const'>Rails</span><span class='period'>.</span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_warn'>warn</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>SQL function FunctionBasedStepReadinessStatus failed: </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_content'>, using fallback</span><span class='tstring_end'>&quot;</span></span>
2057
+ <span class='qwords_beg'>%w[</span><span class='tstring_content'>data_validation</span><span class='words_sep'> </span><span class='tstring_content'>external_api_calls</span><span class='tstring_end'>]</span></span>
2058
+ <span class='kw'>end</span></pre>
2059
+ </td>
2060
+ </tr>
2061
+ </table>
2062
+ </div>
2063
+
2064
+ <div class="method_details ">
2065
+ <h3 class="signature " id="generate_recommendations-class_method">
2066
+
2067
+ .<strong>generate_recommendations</strong>(slowest_tasks, slowest_steps) &#x21d2; <tt>Array</tt>
2068
+
2069
+
2070
+
2071
+
2072
+
2073
+ </h3><div class="docstring">
2074
+ <div class="discussion">
2075
+
2076
+ <p>Generate recommendations based on function data</p>
2077
+
2078
+
2079
+ </div>
2080
+ </div>
2081
+ <div class="tags">
2082
+ <p class="tag_title">Parameters:</p>
2083
+ <ul class="param">
2084
+
2085
+ <li>
2086
+
2087
+ <span class='name'>slowest_tasks</span>
2088
+
2089
+
2090
+ <span class='type'>(<tt>Array</tt>)</span>
2091
+
2092
+
2093
+
2094
+ &mdash;
2095
+ <div class='inline'>
2096
+ <p>Slowest tasks from SQL function</p>
2097
+ </div>
2098
+
2099
+ </li>
2100
+
2101
+ <li>
2102
+
2103
+ <span class='name'>slowest_steps</span>
2104
+
2105
+
2106
+ <span class='type'>(<tt>Array</tt>)</span>
2107
+
2108
+
2109
+
2110
+ &mdash;
2111
+ <div class='inline'>
2112
+ <p>Slowest steps from SQL function</p>
2113
+ </div>
2114
+
2115
+ </li>
2116
+
2117
+ </ul>
2118
+
2119
+ <p class="tag_title">Returns:</p>
2120
+ <ul class="return">
2121
+
2122
+ <li>
2123
+
2124
+
2125
+ <span class='type'>(<tt>Array</tt>)</span>
2126
+
2127
+
2128
+
2129
+ &mdash;
2130
+ <div class='inline'>
2131
+ <p>Array of recommendation strings</p>
2132
+ </div>
2133
+
2134
+ </li>
2135
+
2136
+ </ul>
2137
+
2138
+ </div><table class="source_code">
2139
+ <tr>
2140
+ <td>
2141
+ <pre class="lines">
2142
+
2143
+
2144
+ 294
2145
+ 295
2146
+ 296
2147
+ 297
2148
+ 298
2149
+ 299
2150
+ 300
2151
+ 301
2152
+ 302
2153
+ 303
2154
+ 304
2155
+ 305
2156
+ 306
2157
+ 307
2158
+ 308
2159
+ 309
2160
+ 310
2161
+ 311
2162
+ 312
2163
+ 313
2164
+ 314
2165
+ 315
2166
+ 316
2167
+ 317
2168
+ 318
2169
+ 319
2170
+ 320
2171
+ 321</pre>
2172
+ </td>
2173
+ <td>
2174
+ <pre class="code"><span class="info file"># File 'app/services/tasker/analytics_service.rb', line 294</span>
2175
+
2176
+ <span class='kw'>def</span> <span class='kw'>self</span><span class='period'>.</span><span class='id identifier rubyid_generate_recommendations'>generate_recommendations</span><span class='lparen'>(</span><span class='id identifier rubyid_slowest_tasks'>slowest_tasks</span><span class='comma'>,</span> <span class='id identifier rubyid_slowest_steps'>slowest_steps</span><span class='rparen'>)</span>
2177
+ <span class='id identifier rubyid_recommendations'>recommendations</span> <span class='op'>=</span> <span class='lbracket'>[</span><span class='rbracket'>]</span>
2178
+
2179
+ <span class='comment'># Analyze slowest tasks
2180
+ </span> <span class='kw'>if</span> <span class='id identifier rubyid_slowest_tasks'>slowest_tasks</span><span class='period'>.</span><span class='id identifier rubyid_any?'>any?</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_task'>task</span><span class='op'>|</span> <span class='id identifier rubyid_task'>task</span><span class='lbracket'>[</span><span class='symbol'>:duration_seconds</span><span class='rbracket'>]</span> <span class='op'>&gt;</span> <span class='int'>60</span> <span class='rbrace'>}</span>
2181
+ <span class='id identifier rubyid_avg_duration'>avg_duration</span> <span class='op'>=</span> <span class='id identifier rubyid_slowest_tasks'>slowest_tasks</span><span class='period'>.</span><span class='id identifier rubyid_sum'>sum</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_task'>task</span><span class='op'>|</span> <span class='id identifier rubyid_task'>task</span><span class='lbracket'>[</span><span class='symbol'>:duration_seconds</span><span class='rbracket'>]</span> <span class='rbrace'>}</span> <span class='op'>/</span> <span class='id identifier rubyid_slowest_tasks'>slowest_tasks</span><span class='period'>.</span><span class='id identifier rubyid_size'>size</span>
2182
+ <span class='id identifier rubyid_recommendations'>recommendations</span> <span class='op'>&lt;&lt;</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Consider optimizing long-running tasks (</span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_avg_duration'>avg_duration</span><span class='period'>.</span><span class='id identifier rubyid_round'>round</span><span class='lparen'>(</span><span class='int'>1</span><span class='rparen'>)</span><span class='embexpr_end'>}</span><span class='tstring_content'>s average)</span><span class='tstring_end'>&quot;</span></span>
2183
+ <span class='kw'>end</span>
2184
+
2185
+ <span class='comment'># Analyze step patterns
2186
+ </span> <span class='kw'>if</span> <span class='id identifier rubyid_slowest_steps'>slowest_steps</span><span class='period'>.</span><span class='id identifier rubyid_any?'>any?</span> <span class='lbrace'>{</span> <span class='op'>|</span><span class='id identifier rubyid_step'>step</span><span class='op'>|</span> <span class='id identifier rubyid_step'>step</span><span class='lbracket'>[</span><span class='symbol'>:attempts</span><span class='rbracket'>]</span> <span class='op'>&gt;</span> <span class='int'>1</span> <span class='rbrace'>}</span>
2187
+ <span class='id identifier rubyid_recommendations'>recommendations</span> <span class='op'>&lt;&lt;</span> <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>High retry patterns detected. Review error handling and timeout configurations.</span><span class='tstring_end'>&#39;</span></span>
2188
+ <span class='kw'>end</span>
2189
+
2190
+ <span class='comment'># Default recommendations if none generated
2191
+ </span> <span class='kw'>if</span> <span class='id identifier rubyid_recommendations'>recommendations</span><span class='period'>.</span><span class='id identifier rubyid_empty?'>empty?</span>
2192
+ <span class='id identifier rubyid_recommendations'>recommendations</span> <span class='op'>=</span> <span class='lbracket'>[</span>
2193
+ <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Monitor task performance trends regularly</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
2194
+ <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Review timeout configurations for network operations</span><span class='tstring_end'>&#39;</span></span><span class='comma'>,</span>
2195
+ <span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Consider implementing caching for repeated operations</span><span class='tstring_end'>&#39;</span></span>
2196
+ <span class='rbracket'>]</span>
2197
+ <span class='kw'>end</span>
2198
+
2199
+ <span class='id identifier rubyid_recommendations'>recommendations</span><span class='period'>.</span><span class='id identifier rubyid_take'>take</span><span class='lparen'>(</span><span class='int'>5</span><span class='rparen'>)</span>
2200
+ <span class='kw'>rescue</span> <span class='const'>StandardError</span> <span class='op'>=&gt;</span> <span class='id identifier rubyid_e'>e</span>
2201
+ <span class='const'>Rails</span><span class='period'>.</span><span class='id identifier rubyid_logger'>logger</span><span class='period'>.</span><span class='id identifier rubyid_error'>error</span> <span class='tstring'><span class='tstring_beg'>&quot;</span><span class='tstring_content'>Error generating recommendations: </span><span class='embexpr_beg'>#{</span><span class='id identifier rubyid_e'>e</span><span class='period'>.</span><span class='id identifier rubyid_message'>message</span><span class='embexpr_end'>}</span><span class='tstring_end'>&quot;</span></span>
2202
+ <span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>&#39;</span><span class='tstring_content'>Monitor system performance regularly</span><span class='tstring_end'>&#39;</span></span><span class='rbracket'>]</span>
2203
+ <span class='kw'>end</span></pre>
2204
+ </td>
2205
+ </tr>
2206
+ </table>
2207
+ </div>
2208
+
2209
+ </div>
2210
+
2211
+ </div>
2212
+
2213
+ <div id="footer">
2214
+ Generated on Tue Jul 1 16:47:38 2025 by
2215
+ <a href="https://yardoc.org" title="Yay! A Ruby Documentation Tool" target="_parent">yard</a>
2216
+ 0.9.37 (ruby-3.2.4).
2217
+ </div>
2218
+
2219
+ </div>
2220
+ </body>
2221
+ </html>