tasker-engine 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/LICENSE +22 -0
- data/README.md +443 -0
- data/Rakefile +10 -0
- data/app/controllers/tasker/analytics_controller.rb +179 -0
- data/app/controllers/tasker/application_controller.rb +45 -0
- data/app/controllers/tasker/graphql_controller.rb +193 -0
- data/app/controllers/tasker/handlers_controller.rb +217 -0
- data/app/controllers/tasker/health_controller.rb +229 -0
- data/app/controllers/tasker/metrics_controller.rb +111 -0
- data/app/controllers/tasker/page_sort.rb +97 -0
- data/app/controllers/tasker/task_diagrams_controller.rb +30 -0
- data/app/controllers/tasker/tasks_controller.rb +123 -0
- data/app/controllers/tasker/workflow_steps_controller.rb +69 -0
- data/app/graphql/examples/all_tasks.graphql +22 -0
- data/app/graphql/examples/pending_tasks.graphql +23 -0
- data/app/graphql/tasker/graph_ql_types/annotation_type.rb +14 -0
- data/app/graphql/tasker/graph_ql_types/base_argument.rb +9 -0
- data/app/graphql/tasker/graph_ql_types/base_connection.rb +11 -0
- data/app/graphql/tasker/graph_ql_types/base_edge.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_enum.rb +9 -0
- data/app/graphql/tasker/graph_ql_types/base_field.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_input_object.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_interface.rb +14 -0
- data/app/graphql/tasker/graph_ql_types/base_object.rb +10 -0
- data/app/graphql/tasker/graph_ql_types/base_scalar.rb +9 -0
- data/app/graphql/tasker/graph_ql_types/base_union.rb +11 -0
- data/app/graphql/tasker/graph_ql_types/dependent_system_object_map_type.rb +18 -0
- data/app/graphql/tasker/graph_ql_types/dependent_system_type.rb +13 -0
- data/app/graphql/tasker/graph_ql_types/mutation_type.rb +16 -0
- data/app/graphql/tasker/graph_ql_types/named_step_type.rb +16 -0
- data/app/graphql/tasker/graph_ql_types/named_task_type.rb +14 -0
- data/app/graphql/tasker/graph_ql_types/named_tasks_named_step_type.rb +19 -0
- data/app/graphql/tasker/graph_ql_types/node_type.rb +12 -0
- data/app/graphql/tasker/graph_ql_types/query_type.rb +20 -0
- data/app/graphql/tasker/graph_ql_types/task_annotation_type.rb +17 -0
- data/app/graphql/tasker/graph_ql_types/task_interface.rb +17 -0
- data/app/graphql/tasker/graph_ql_types/task_type.rb +26 -0
- data/app/graphql/tasker/graph_ql_types/workflow_step_type.rb +154 -0
- data/app/graphql/tasker/graph_ql_types.rb +42 -0
- data/app/graphql/tasker/mutations/base_mutation.rb +13 -0
- data/app/graphql/tasker/mutations/cancel_step.rb +29 -0
- data/app/graphql/tasker/mutations/cancel_task.rb +29 -0
- data/app/graphql/tasker/mutations/create_task.rb +52 -0
- data/app/graphql/tasker/mutations/update_step.rb +36 -0
- data/app/graphql/tasker/mutations/update_task.rb +41 -0
- data/app/graphql/tasker/queries/all_annotation_types.rb +17 -0
- data/app/graphql/tasker/queries/all_tasks.rb +23 -0
- data/app/graphql/tasker/queries/base_query.rb +9 -0
- data/app/graphql/tasker/queries/helpers.rb +16 -0
- data/app/graphql/tasker/queries/one_step.rb +24 -0
- data/app/graphql/tasker/queries/one_task.rb +18 -0
- data/app/graphql/tasker/queries/tasks_by_annotation.rb +31 -0
- data/app/graphql/tasker/queries/tasks_by_status.rb +30 -0
- data/app/graphql/tasker/tasker_rails_schema.rb +52 -0
- data/app/jobs/tasker/application_job.rb +8 -0
- data/app/jobs/tasker/metrics_export_job.rb +252 -0
- data/app/jobs/tasker/task_runner_job.rb +224 -0
- data/app/models/tasker/annotation_type.rb +26 -0
- data/app/models/tasker/application_record.rb +70 -0
- data/app/models/tasker/dependent_system.rb +26 -0
- data/app/models/tasker/dependent_system_object_map.rb +64 -0
- data/app/models/tasker/diagram/edge.rb +106 -0
- data/app/models/tasker/diagram/flowchart.rb +137 -0
- data/app/models/tasker/diagram/node.rb +99 -0
- data/app/models/tasker/named_step.rb +41 -0
- data/app/models/tasker/named_task.rb +121 -0
- data/app/models/tasker/named_tasks_named_step.rb +82 -0
- data/app/models/tasker/step_dag_relationship.rb +65 -0
- data/app/models/tasker/step_readiness_status.rb +59 -0
- data/app/models/tasker/task.rb +424 -0
- data/app/models/tasker/task_annotation.rb +36 -0
- data/app/models/tasker/task_diagram.rb +332 -0
- data/app/models/tasker/task_execution_context.rb +29 -0
- data/app/models/tasker/task_namespace.rb +41 -0
- data/app/models/tasker/task_transition.rb +235 -0
- data/app/models/tasker/workflow_step.rb +461 -0
- data/app/models/tasker/workflow_step_edge.rb +94 -0
- data/app/models/tasker/workflow_step_transition.rb +434 -0
- data/app/serializers/tasker/annotation_type_serializer.rb +8 -0
- data/app/serializers/tasker/handler_serializer.rb +109 -0
- data/app/serializers/tasker/task_annotation_serializer.rb +32 -0
- data/app/serializers/tasker/task_serializer.rb +168 -0
- data/app/serializers/tasker/workflow_step_serializer.rb +27 -0
- data/app/services/tasker/analytics_service.rb +409 -0
- data/app/views/tasker/task/_diagram.html.erb +32 -0
- data/config/initializers/dry_struct.rb +11 -0
- data/config/initializers/statesman.rb +6 -0
- data/config/initializers/tasker_orchestration.rb +17 -0
- data/config/initializers/time_formats.rb +4 -0
- data/config/routes.rb +34 -0
- data/config/tasker/subscriptions/example_integrations.yml +67 -0
- data/config/tasker/system_events.yml +305 -0
- data/db/functions/calculate_dependency_levels_v01.sql +45 -0
- data/db/functions/get_analytics_metrics_v01.sql +137 -0
- data/db/functions/get_slowest_steps_v01.sql +82 -0
- data/db/functions/get_slowest_tasks_v01.sql +96 -0
- data/db/functions/get_step_readiness_status_batch_v01.sql +140 -0
- data/db/functions/get_step_readiness_status_v01.sql +139 -0
- data/db/functions/get_system_health_counts_v01.sql +108 -0
- data/db/functions/get_task_execution_context_v01.sql +108 -0
- data/db/functions/get_task_execution_contexts_batch_v01.sql +104 -0
- data/db/init/schema.sql +2277 -0
- data/db/migrate/20250701165431_initial_tasker_schema.rb +116 -0
- data/db/views/tasker_step_dag_relationships_v01.sql +69 -0
- data/docs/APPLICATION_GENERATOR.md +384 -0
- data/docs/AUTH.md +1780 -0
- data/docs/CIRCUIT_BREAKER.md +224 -0
- data/docs/DEVELOPER_GUIDE.md +2665 -0
- data/docs/EVENT_SYSTEM.md +637 -0
- data/docs/EXECUTION_CONFIGURATION.md +341 -0
- data/docs/FLOW_CHART.md +149 -0
- data/docs/HEALTH.md +542 -0
- data/docs/METRICS.md +731 -0
- data/docs/OPTIMIZATION_PLAN.md +1479 -0
- data/docs/OVERVIEW.md +552 -0
- data/docs/QUICK_START.md +270 -0
- data/docs/REGISTRY_SYSTEMS.md +373 -0
- data/docs/REST_API.md +632 -0
- data/docs/ROADMAP.md +221 -0
- data/docs/SQL_FUNCTIONS.md +1408 -0
- data/docs/TASK_DIAGRAM.md +252 -0
- data/docs/TASK_EXECUTION_CONTROL_FLOW.md +237 -0
- data/docs/TELEMETRY.md +795 -0
- data/docs/TROUBLESHOOTING.md +756 -0
- data/docs/TaskHandlerGenerator.html +255 -0
- data/docs/Tasker/Analysis/RuntimeGraphAnalyzer.html +907 -0
- data/docs/Tasker/Analysis/TemplateGraphAnalyzer.html +1236 -0
- data/docs/Tasker/Analysis.html +117 -0
- data/docs/Tasker/AnalyticsController.html +450 -0
- data/docs/Tasker/AnalyticsService/BottleneckAnalytics.html +816 -0
- data/docs/Tasker/AnalyticsService/PerformanceAnalytics.html +586 -0
- data/docs/Tasker/AnalyticsService.html +2221 -0
- data/docs/Tasker/AnnotationType.html +137 -0
- data/docs/Tasker/AnnotationTypeSerializer.html +124 -0
- data/docs/Tasker/ApplicationController.html +147 -0
- data/docs/Tasker/ApplicationJob.html +128 -0
- data/docs/Tasker/ApplicationRecord.html +378 -0
- data/docs/Tasker/Authentication/AuthenticationError.html +124 -0
- data/docs/Tasker/Authentication/ConfigurationError.html +124 -0
- data/docs/Tasker/Authentication/Coordinator.html +242 -0
- data/docs/Tasker/Authentication/Interface.html +560 -0
- data/docs/Tasker/Authentication/InterfaceError.html +124 -0
- data/docs/Tasker/Authentication/NoneAuthenticator.html +338 -0
- data/docs/Tasker/Authentication.html +119 -0
- data/docs/Tasker/Authorization/AuthorizationError.html +139 -0
- data/docs/Tasker/Authorization/BaseCoordinator.html +927 -0
- data/docs/Tasker/Authorization/ConfigurationError.html +153 -0
- data/docs/Tasker/Authorization/ResourceConstants/ACTIONS.html +428 -0
- data/docs/Tasker/Authorization/ResourceConstants/RESOURCES.html +365 -0
- data/docs/Tasker/Authorization/ResourceConstants.html +146 -0
- data/docs/Tasker/Authorization/ResourceRegistry.html +882 -0
- data/docs/Tasker/Authorization/UnauthorizedError.html +153 -0
- data/docs/Tasker/Authorization.html +582 -0
- data/docs/Tasker/CacheCapabilities.html +167 -0
- data/docs/Tasker/CacheStrategy.html +1297 -0
- data/docs/Tasker/Concerns/Authenticatable.html +116 -0
- data/docs/Tasker/Concerns/Authorizable/AdminStatusChecker.html +256 -0
- data/docs/Tasker/Concerns/Authorizable.html +816 -0
- data/docs/Tasker/Concerns/ControllerAuthorizable.html +157 -0
- data/docs/Tasker/Concerns/EventPublisher.html +4023 -0
- data/docs/Tasker/Concerns/IdempotentStateTransitions.html +806 -0
- data/docs/Tasker/Concerns/LifecycleEventHelpers.html +129 -0
- data/docs/Tasker/Concerns/OrchestrationPublisher.html +129 -0
- data/docs/Tasker/Concerns/StateMachineBase/ClassMethods.html +1075 -0
- data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase/ClassMethods.html +191 -0
- data/docs/Tasker/Concerns/StateMachineBase/StateMachineBase.html +126 -0
- data/docs/Tasker/Concerns/StateMachineBase.html +153 -0
- data/docs/Tasker/Concerns/StructuredLogging.html +1413 -0
- data/docs/Tasker/Concerns.html +117 -0
- data/docs/Tasker/Configuration/AuthConfiguration.html +1023 -0
- data/docs/Tasker/Configuration/ConfigurationProxy.html +581 -0
- data/docs/Tasker/Configuration/DatabaseConfiguration.html +475 -0
- data/docs/Tasker/Configuration/EngineConfiguration.html +1265 -0
- data/docs/Tasker/Configuration/HealthConfiguration.html +791 -0
- data/docs/Tasker/Configuration/TelemetryConfiguration.html +1308 -0
- data/docs/Tasker/Configuration/TelemetryConfigurationProxy.html +388 -0
- data/docs/Tasker/Configuration.html +1669 -0
- data/docs/Tasker/ConfigurationError.html +143 -0
- data/docs/Tasker/ConfiguredTask.html +514 -0
- data/docs/Tasker/Constants/EventDefinitions.html +590 -0
- data/docs/Tasker/Constants/LifecycleEvents.html +137 -0
- data/docs/Tasker/Constants/ObservabilityEvents/Step.html +152 -0
- data/docs/Tasker/Constants/ObservabilityEvents/Task.html +142 -0
- data/docs/Tasker/Constants/ObservabilityEvents.html +126 -0
- data/docs/Tasker/Constants/RegistryEvents.html +285 -0
- data/docs/Tasker/Constants/StepEvents.html +177 -0
- data/docs/Tasker/Constants/TaskEvents.html +167 -0
- data/docs/Tasker/Constants/TaskExecution/ExecutionStatus.html +207 -0
- data/docs/Tasker/Constants/TaskExecution/HealthStatus.html +191 -0
- data/docs/Tasker/Constants/TaskExecution/RecommendedAction.html +207 -0
- data/docs/Tasker/Constants/TaskExecution.html +126 -0
- data/docs/Tasker/Constants/TaskFinalization/ErrorMessages.html +132 -0
- data/docs/Tasker/Constants/TaskFinalization/PendingReasons.html +207 -0
- data/docs/Tasker/Constants/TaskFinalization/ReenqueueReasons.html +239 -0
- data/docs/Tasker/Constants/TaskFinalization.html +126 -0
- data/docs/Tasker/Constants/TaskStatuses.html +223 -0
- data/docs/Tasker/Constants/TestEvents.html +163 -0
- data/docs/Tasker/Constants/WorkflowEvents.html +222 -0
- data/docs/Tasker/Constants/WorkflowStepStatuses.html +223 -0
- data/docs/Tasker/Constants.html +561 -0
- data/docs/Tasker/DependentSystem.html +137 -0
- data/docs/Tasker/DependentSystemObjectMap.html +250 -0
- data/docs/Tasker/DetectorRegistry.html +598 -0
- data/docs/Tasker/Diagram/Edge.html +1191 -0
- data/docs/Tasker/Diagram/Flowchart.html +1539 -0
- data/docs/Tasker/Diagram/Node.html +1165 -0
- data/docs/Tasker/Diagram.html +117 -0
- data/docs/Tasker/Engine.html +215 -0
- data/docs/Tasker/Error.html +139 -0
- data/docs/Tasker/Events/Bus.html +1226 -0
- data/docs/Tasker/Events/Catalog/CatalogPrinter.html +258 -0
- data/docs/Tasker/Events/Catalog/CustomEventRegistrar.html +276 -0
- data/docs/Tasker/Events/Catalog/ExamplePayloadGenerator.html +294 -0
- data/docs/Tasker/Events/Catalog.html +1291 -0
- data/docs/Tasker/Events/CustomRegistry.html +943 -0
- data/docs/Tasker/Events/DefinitionLoader.html +575 -0
- data/docs/Tasker/Events/EventPayloadBuilder/ErrorInfoExtractor.html +286 -0
- data/docs/Tasker/Events/EventPayloadBuilder/StepPayloadBuilder.html +312 -0
- data/docs/Tasker/Events/EventPayloadBuilder.html +664 -0
- data/docs/Tasker/Events/Publisher.html +365 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer/ErrorTypeClassifier.html +1128 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/ErrorCategorizer.html +270 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber/MetricTagsExtractor.html +266 -0
- data/docs/Tasker/Events/Subscribers/BaseSubscriber.html +2556 -0
- data/docs/Tasker/Events/Subscribers/MetricsSubscriber.html +723 -0
- data/docs/Tasker/Events/Subscribers/TelemetrySubscriber.html +2251 -0
- data/docs/Tasker/Events/Subscribers.html +117 -0
- data/docs/Tasker/Events/SubscriptionLoader.html +493 -0
- data/docs/Tasker/Events.html +294 -0
- data/docs/Tasker/EventsGenerator.html +459 -0
- data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics/AnalyticsMetrics.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedAnalyticsMetrics.html +412 -0
- data/docs/Tasker/Functions/FunctionBasedDependencyLevels.html +598 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestSteps/SlowestStep.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestSteps.html +453 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestTasks/SlowestTask.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedSlowestTasks.html +453 -0
- data/docs/Tasker/Functions/FunctionBasedStepReadinessStatus.html +1457 -0
- data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts/HealthMetrics.html +135 -0
- data/docs/Tasker/Functions/FunctionBasedSystemHealthCounts.html +370 -0
- data/docs/Tasker/Functions/FunctionBasedTaskExecutionContext.html +1250 -0
- data/docs/Tasker/Functions/FunctionWrapper.html +479 -0
- data/docs/Tasker/Functions.html +117 -0
- data/docs/Tasker/Generators/AuthenticatorGenerator/UsageInstructionsFormatter.html +244 -0
- data/docs/Tasker/Generators/AuthenticatorGenerator.html +373 -0
- data/docs/Tasker/Generators/AuthorizationCoordinatorGenerator.html +430 -0
- data/docs/Tasker/Generators/SubscriberGenerator.html +377 -0
- data/docs/Tasker/Generators/TaskHandlerGenerator.html +263 -0
- data/docs/Tasker/Generators.html +117 -0
- data/docs/Tasker/GraphQLTypes/AnnotationType.html +132 -0
- data/docs/Tasker/GraphQLTypes/BaseArgument.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseConnection.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseEdge.html +130 -0
- data/docs/Tasker/GraphQLTypes/BaseEnum.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseField.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseInputObject.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseInterface.html +116 -0
- data/docs/Tasker/GraphQLTypes/BaseObject.html +128 -0
- data/docs/Tasker/GraphQLTypes/BaseScalar.html +124 -0
- data/docs/Tasker/GraphQLTypes/BaseUnion.html +124 -0
- data/docs/Tasker/GraphQLTypes/DependentSystemObjectMapType.html +132 -0
- data/docs/Tasker/GraphQLTypes/DependentSystemType.html +132 -0
- data/docs/Tasker/GraphQLTypes/MutationType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NamedStepType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NamedTaskType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NamedTasksNamedStepType.html +132 -0
- data/docs/Tasker/GraphQLTypes/NodeType.html +118 -0
- data/docs/Tasker/GraphQLTypes/QueryType.html +139 -0
- data/docs/Tasker/GraphQLTypes/TaskAnnotationType.html +132 -0
- data/docs/Tasker/GraphQLTypes/TaskInterface.html +111 -0
- data/docs/Tasker/GraphQLTypes/TaskType.html +201 -0
- data/docs/Tasker/GraphQLTypes/WorkflowStepType.html +694 -0
- data/docs/Tasker/GraphQLTypes.html +130 -0
- data/docs/Tasker/GraphqlController.html +251 -0
- data/docs/Tasker/HandlerFactory.html +1518 -0
- data/docs/Tasker/HandlerSerializer.html +682 -0
- data/docs/Tasker/HandlersController.html +574 -0
- data/docs/Tasker/HashIdentityStrategy.html +278 -0
- data/docs/Tasker/Health/ReadinessChecker.html +712 -0
- data/docs/Tasker/Health/StatusChecker.html +653 -0
- data/docs/Tasker/Health.html +117 -0
- data/docs/Tasker/HealthController.html +523 -0
- data/docs/Tasker/IdentityStrategy.html +276 -0
- data/docs/Tasker/InvalidTaskHandlerConfig.html +135 -0
- data/docs/Tasker/LifecycleEvents/Events/Step.html +162 -0
- data/docs/Tasker/LifecycleEvents/Events/Task.html +162 -0
- data/docs/Tasker/LifecycleEvents/Events.html +204 -0
- data/docs/Tasker/LifecycleEvents/Publisher.html +132 -0
- data/docs/Tasker/LifecycleEvents.html +799 -0
- data/docs/Tasker/Logging/CorrelationIdGenerator.html +688 -0
- data/docs/Tasker/Logging.html +115 -0
- data/docs/Tasker/MetricsController.html +293 -0
- data/docs/Tasker/MetricsExportJob.html +414 -0
- data/docs/Tasker/Mutations/BaseMutation.html +128 -0
- data/docs/Tasker/Mutations/CancelStep.html +219 -0
- data/docs/Tasker/Mutations/CancelTask.html +221 -0
- data/docs/Tasker/Mutations/CreateTask.html +243 -0
- data/docs/Tasker/Mutations/UpdateStep.html +243 -0
- data/docs/Tasker/Mutations/UpdateTask.html +243 -0
- data/docs/Tasker/Mutations.html +117 -0
- data/docs/Tasker/NamedStep.html +216 -0
- data/docs/Tasker/NamedTask.html +910 -0
- data/docs/Tasker/NamedTasksNamedStep.html +435 -0
- data/docs/Tasker/Orchestration/BackoffCalculator.html +404 -0
- data/docs/Tasker/Orchestration/ConnectionBuilder/ConfigValidator.html +258 -0
- data/docs/Tasker/Orchestration/ConnectionBuilder.html +435 -0
- data/docs/Tasker/Orchestration/ConnectionPoolIntelligence.html +513 -0
- data/docs/Tasker/Orchestration/Coordinator.html +641 -0
- data/docs/Tasker/Orchestration/FutureStateAnalyzer.html +1045 -0
- data/docs/Tasker/Orchestration/Orchestrator.html +679 -0
- data/docs/Tasker/Orchestration/PluginIntegration.html +1127 -0
- data/docs/Tasker/Orchestration/ResponseProcessor.html +504 -0
- data/docs/Tasker/Orchestration/RetryHeaderParser.html +304 -0
- data/docs/Tasker/Orchestration/StepExecutor.html +995 -0
- data/docs/Tasker/Orchestration/StepSequenceFactory.html +644 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/BlockageChecker.html +264 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/ContextManager.html +254 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/DelayCalculator.html +556 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationDecisionMaker.html +348 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/FinalizationProcessor.html +286 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/ReasonDeterminer.html +432 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/ReenqueueManager.html +296 -0
- data/docs/Tasker/Orchestration/TaskFinalizer/UnclearStateHandler.html +314 -0
- data/docs/Tasker/Orchestration/TaskFinalizer.html +1212 -0
- data/docs/Tasker/Orchestration/TaskInitializer.html +766 -0
- data/docs/Tasker/Orchestration/TaskReenqueuer.html +506 -0
- data/docs/Tasker/Orchestration/ViableStepDiscovery.html +442 -0
- data/docs/Tasker/Orchestration/WorkflowCoordinator.html +510 -0
- data/docs/Tasker/Orchestration.html +130 -0
- data/docs/Tasker/PageSort/PageSortParamsBuilder.html +296 -0
- data/docs/Tasker/PageSort.html +247 -0
- data/docs/Tasker/PermanentError.html +518 -0
- data/docs/Tasker/ProceduralError.html +147 -0
- data/docs/Tasker/Queries/AllAnnotationTypes.html +217 -0
- data/docs/Tasker/Queries/AllTasks.html +221 -0
- data/docs/Tasker/Queries/BaseQuery.html +128 -0
- data/docs/Tasker/Queries/Helpers.html +187 -0
- data/docs/Tasker/Queries/OneStep.html +225 -0
- data/docs/Tasker/Queries/OneTask.html +217 -0
- data/docs/Tasker/Queries/TasksByAnnotation.html +231 -0
- data/docs/Tasker/Queries/TasksByStatus.html +233 -0
- data/docs/Tasker/Queries.html +119 -0
- data/docs/Tasker/Railtie.html +124 -0
- data/docs/Tasker/Registry/BaseRegistry.html +1690 -0
- data/docs/Tasker/Registry/EventPublisher.html +667 -0
- data/docs/Tasker/Registry/InterfaceValidator.html +569 -0
- data/docs/Tasker/Registry/RegistrationError.html +132 -0
- data/docs/Tasker/Registry/RegistryError.html +139 -0
- data/docs/Tasker/Registry/StatisticsCollector.html +841 -0
- data/docs/Tasker/Registry/SubscriberRegistry.html +1504 -0
- data/docs/Tasker/Registry/ValidationError.html +132 -0
- data/docs/Tasker/Registry.html +119 -0
- data/docs/Tasker/RetryableError.html +515 -0
- data/docs/Tasker/StateMachine/Compatibility.html +282 -0
- data/docs/Tasker/StateMachine/InvalidStateTransition.html +135 -0
- data/docs/Tasker/StateMachine/StepStateMachine/StandardizedPayloadBuilder.html +260 -0
- data/docs/Tasker/StateMachine/StepStateMachine.html +2215 -0
- data/docs/Tasker/StateMachine/TaskStateMachine.html +734 -0
- data/docs/Tasker/StateMachine.html +602 -0
- data/docs/Tasker/StepDagRelationship.html +657 -0
- data/docs/Tasker/StepHandler/Api/Config.html +1091 -0
- data/docs/Tasker/StepHandler/Api.html +884 -0
- data/docs/Tasker/StepHandler/AutomaticEventPublishing.html +321 -0
- data/docs/Tasker/StepHandler/Base.html +970 -0
- data/docs/Tasker/StepHandler.html +119 -0
- data/docs/Tasker/StepReadinessStatus.html +836 -0
- data/docs/Tasker/Task.html +2575 -0
- data/docs/Tasker/TaskAnnotation.html +137 -0
- data/docs/Tasker/TaskAnnotationSerializer.html +124 -0
- data/docs/Tasker/TaskBuilder/StepNameValidator.html +264 -0
- data/docs/Tasker/TaskBuilder/StepTemplateDefiner.html +264 -0
- data/docs/Tasker/TaskBuilder.html +764 -0
- data/docs/Tasker/TaskDiagram/StepToStepEdgeBuilder.html +260 -0
- data/docs/Tasker/TaskDiagram/TaskToRootStepEdgeBuilder.html +290 -0
- data/docs/Tasker/TaskDiagram.html +548 -0
- data/docs/Tasker/TaskDiagramsController.html +240 -0
- data/docs/Tasker/TaskExecutionContext.html +469 -0
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/ClassBasedEventRegistrar.html +238 -0
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner/YamlEventRegistrar.html +254 -0
- data/docs/Tasker/TaskHandler/ClassMethods/StepTemplateDefiner.html +988 -0
- data/docs/Tasker/TaskHandler/ClassMethods.html +357 -0
- data/docs/Tasker/TaskHandler/InstanceMethods.html +1396 -0
- data/docs/Tasker/TaskHandler/StepGroup.html +1748 -0
- data/docs/Tasker/TaskHandler.html +271 -0
- data/docs/Tasker/TaskNamespace.html +312 -0
- data/docs/Tasker/TaskRunnerJob.html +406 -0
- data/docs/Tasker/TaskSerializer.html +474 -0
- data/docs/Tasker/TaskTransition.html +1517 -0
- data/docs/Tasker/TaskWorkflowSummary.html +988 -0
- data/docs/Tasker/TaskerRailsSchema/InvalidObjectTypeError.html +132 -0
- data/docs/Tasker/TaskerRailsSchema/TypeResolutionError.html +139 -0
- data/docs/Tasker/TaskerRailsSchema/UnknownInterfaceError.html +132 -0
- data/docs/Tasker/TaskerRailsSchema.html +384 -0
- data/docs/Tasker/TasksController.html +595 -0
- data/docs/Tasker/Telemetry/EventMapping.html +1307 -0
- data/docs/Tasker/Telemetry/EventRouter.html +2178 -0
- data/docs/Tasker/Telemetry/Events/ExportEvents.html +246 -0
- data/docs/Tasker/Telemetry/Events.html +115 -0
- data/docs/Tasker/Telemetry/ExportCoordinator/DistributedLockTimeoutError.html +135 -0
- data/docs/Tasker/Telemetry/ExportCoordinator.html +2137 -0
- data/docs/Tasker/Telemetry/IntelligentCacheManager.html +1083 -0
- data/docs/Tasker/Telemetry/LogBackend.html +1088 -0
- data/docs/Tasker/Telemetry/MetricTypes/Counter.html +1054 -0
- data/docs/Tasker/Telemetry/MetricTypes/Gauge.html +1270 -0
- data/docs/Tasker/Telemetry/MetricTypes/Histogram.html +1492 -0
- data/docs/Tasker/Telemetry/MetricTypes.html +153 -0
- data/docs/Tasker/Telemetry/MetricsBackend.html +2510 -0
- data/docs/Tasker/Telemetry/MetricsExportService.html +578 -0
- data/docs/Tasker/Telemetry/PluginRegistry.html +1774 -0
- data/docs/Tasker/Telemetry/Plugins/BaseExporter.html +1835 -0
- data/docs/Tasker/Telemetry/Plugins/CsvExporter.html +768 -0
- data/docs/Tasker/Telemetry/Plugins/JsonExporter.html +747 -0
- data/docs/Tasker/Telemetry/Plugins.html +117 -0
- data/docs/Tasker/Telemetry/PrometheusExporter.html +481 -0
- data/docs/Tasker/Telemetry/TraceBackend.html +891 -0
- data/docs/Tasker/Telemetry.html +130 -0
- data/docs/Tasker/Types/AuthConfig.html +886 -0
- data/docs/Tasker/Types/BackoffConfig.html +1063 -0
- data/docs/Tasker/Types/BaseConfig.html +227 -0
- data/docs/Tasker/Types/CacheConfig.html +1731 -0
- data/docs/Tasker/Types/DatabaseConfig.html +388 -0
- data/docs/Tasker/Types/DependencyGraph.html +526 -0
- data/docs/Tasker/Types/DependencyGraphConfig.html +753 -0
- data/docs/Tasker/Types/EngineConfig.html +1181 -0
- data/docs/Tasker/Types/ExecutionConfig.html +1963 -0
- data/docs/Tasker/Types/GraphEdge.html +517 -0
- data/docs/Tasker/Types/GraphMetadata.html +781 -0
- data/docs/Tasker/Types/GraphNode.html +694 -0
- data/docs/Tasker/Types/HealthConfig.html +784 -0
- data/docs/Tasker/Types/StepSequence.html +353 -0
- data/docs/Tasker/Types/StepTemplate.html +1193 -0
- data/docs/Tasker/Types/TaskRequest.html +1179 -0
- data/docs/Tasker/Types/TelemetryConfig.html +2746 -0
- data/docs/Tasker/Types.html +154 -0
- data/docs/Tasker/WorkflowStep/StepFinder.html +282 -0
- data/docs/Tasker/WorkflowStep.html +2724 -0
- data/docs/Tasker/WorkflowStepEdge.html +304 -0
- data/docs/Tasker/WorkflowStepSerializer.html +305 -0
- data/docs/Tasker/WorkflowStepTransition/TransitionDescriptionFormatter.html +282 -0
- data/docs/Tasker/WorkflowStepTransition.html +2201 -0
- data/docs/Tasker/WorkflowStepsController.html +462 -0
- data/docs/Tasker.html +452 -0
- data/docs/VISION.md +584 -0
- data/docs/WHY.md +21 -0
- data/docs/_index.html +2375 -0
- data/docs/class_list.html +54 -0
- data/docs/css/common.css +1 -0
- data/docs/css/full_list.css +58 -0
- data/docs/css/style.css +503 -0
- data/docs/events/migration_plan_outcomes.md +80 -0
- data/docs/file.README.html +541 -0
- data/docs/file_list.html +59 -0
- data/docs/frames.html +22 -0
- data/docs/index.html +541 -0
- data/docs/js/app.js +344 -0
- data/docs/js/full_list.js +242 -0
- data/docs/js/jquery.js +4 -0
- data/docs/method_list.html +9182 -0
- data/docs/top-level-namespace.html +110 -0
- data/lib/generators/tasker/authenticator_generator.rb +301 -0
- data/lib/generators/tasker/authorization_coordinator_generator.rb +139 -0
- data/lib/generators/tasker/events_generator.rb +91 -0
- data/lib/generators/tasker/subscriber_generator.rb +107 -0
- data/lib/generators/tasker/task_handler_generator.rb +138 -0
- data/lib/generators/tasker/templates/api_token_authenticator.rb.erb +113 -0
- data/lib/generators/tasker/templates/api_token_authenticator_spec.rb.erb +144 -0
- data/lib/generators/tasker/templates/authorization_coordinator.rb.erb +95 -0
- data/lib/generators/tasker/templates/authorization_coordinator_spec.rb.erb +142 -0
- data/lib/generators/tasker/templates/custom_authenticator.rb.erb +108 -0
- data/lib/generators/tasker/templates/custom_authenticator_spec.rb.erb +162 -0
- data/lib/generators/tasker/templates/custom_events.yml.erb +62 -0
- data/lib/generators/tasker/templates/custom_subscriber.rb.erb +72 -0
- data/lib/generators/tasker/templates/devise_authenticator.rb.erb +101 -0
- data/lib/generators/tasker/templates/devise_authenticator_spec.rb.erb +126 -0
- data/lib/generators/tasker/templates/initialize.rb.erb +202 -0
- data/lib/generators/tasker/templates/jwt_authenticator.rb.erb +144 -0
- data/lib/generators/tasker/templates/jwt_authenticator_spec.rb.erb +298 -0
- data/lib/generators/tasker/templates/metrics_subscriber.rb.erb +258 -0
- data/lib/generators/tasker/templates/metrics_subscriber_spec.rb.erb +308 -0
- data/lib/generators/tasker/templates/omniauth_authenticator.rb.erb +135 -0
- data/lib/generators/tasker/templates/omniauth_authenticator_spec.rb.erb +196 -0
- data/lib/generators/tasker/templates/opentelemetry_initializer.rb +52 -0
- data/lib/generators/tasker/templates/subscriber.rb.erb +64 -0
- data/lib/generators/tasker/templates/subscriber_spec.rb.erb +80 -0
- data/lib/generators/tasker/templates/task_config.yaml.erb +117 -0
- data/lib/generators/tasker/templates/task_handler.rb.erb +59 -0
- data/lib/generators/tasker/templates/task_handler_spec.rb.erb +159 -0
- data/lib/tasker/analysis/runtime_graph_analyzer.rb +1168 -0
- data/lib/tasker/analysis/template_graph_analyzer.rb +328 -0
- data/lib/tasker/authentication/coordinator.rb +78 -0
- data/lib/tasker/authentication/errors.rb +9 -0
- data/lib/tasker/authentication/interface.rb +36 -0
- data/lib/tasker/authentication/none_authenticator.rb +26 -0
- data/lib/tasker/authorization/base_coordinator.rb +112 -0
- data/lib/tasker/authorization/errors.rb +26 -0
- data/lib/tasker/authorization/resource_constants.rb +74 -0
- data/lib/tasker/authorization/resource_registry.rb +143 -0
- data/lib/tasker/authorization.rb +75 -0
- data/lib/tasker/cache_capabilities.rb +131 -0
- data/lib/tasker/cache_strategy.rb +469 -0
- data/lib/tasker/concerns/authenticatable.rb +41 -0
- data/lib/tasker/concerns/authorizable.rb +204 -0
- data/lib/tasker/concerns/controller_authorizable.rb +124 -0
- data/lib/tasker/concerns/event_publisher.rb +716 -0
- data/lib/tasker/concerns/idempotent_state_transitions.rb +128 -0
- data/lib/tasker/concerns/state_machine_base.rb +218 -0
- data/lib/tasker/concerns/structured_logging.rb +387 -0
- data/lib/tasker/configuration.rb +325 -0
- data/lib/tasker/constants/event_definitions.rb +147 -0
- data/lib/tasker/constants/registry_events.rb +54 -0
- data/lib/tasker/constants.rb +417 -0
- data/lib/tasker/engine.rb +90 -0
- data/lib/tasker/errors.rb +90 -0
- data/lib/tasker/events/catalog.rb +432 -0
- data/lib/tasker/events/custom_registry.rb +175 -0
- data/lib/tasker/events/definition_loader.rb +199 -0
- data/lib/tasker/events/event_payload_builder.rb +461 -0
- data/lib/tasker/events/publisher.rb +149 -0
- data/lib/tasker/events/subscribers/base_subscriber.rb +601 -0
- data/lib/tasker/events/subscribers/metrics_subscriber.rb +120 -0
- data/lib/tasker/events/subscribers/telemetry_subscriber.rb +462 -0
- data/lib/tasker/events/subscription_loader.rb +161 -0
- data/lib/tasker/events.rb +37 -0
- data/lib/tasker/functions/function_based_analytics_metrics.rb +103 -0
- data/lib/tasker/functions/function_based_dependency_levels.rb +54 -0
- data/lib/tasker/functions/function_based_slowest_steps.rb +84 -0
- data/lib/tasker/functions/function_based_slowest_tasks.rb +84 -0
- data/lib/tasker/functions/function_based_step_readiness_status.rb +183 -0
- data/lib/tasker/functions/function_based_system_health_counts.rb +94 -0
- data/lib/tasker/functions/function_based_task_execution_context.rb +148 -0
- data/lib/tasker/functions/function_wrapper.rb +42 -0
- data/lib/tasker/functions.rb +12 -0
- data/lib/tasker/handler_factory.rb +322 -0
- data/lib/tasker/health/readiness_checker.rb +186 -0
- data/lib/tasker/health/status_checker.rb +203 -0
- data/lib/tasker/identity_strategy.rb +38 -0
- data/lib/tasker/logging/correlation_id_generator.rb +120 -0
- data/lib/tasker/orchestration/backoff_calculator.rb +184 -0
- data/lib/tasker/orchestration/connection_builder.rb +122 -0
- data/lib/tasker/orchestration/connection_pool_intelligence.rb +177 -0
- data/lib/tasker/orchestration/coordinator.rb +119 -0
- data/lib/tasker/orchestration/future_state_analyzer.rb +137 -0
- data/lib/tasker/orchestration/plugin_integration.rb +124 -0
- data/lib/tasker/orchestration/response_processor.rb +168 -0
- data/lib/tasker/orchestration/retry_header_parser.rb +78 -0
- data/lib/tasker/orchestration/step_executor.rb +941 -0
- data/lib/tasker/orchestration/step_sequence_factory.rb +67 -0
- data/lib/tasker/orchestration/task_finalizer.rb +564 -0
- data/lib/tasker/orchestration/task_initializer.rb +140 -0
- data/lib/tasker/orchestration/task_reenqueuer.rb +71 -0
- data/lib/tasker/orchestration/viable_step_discovery.rb +65 -0
- data/lib/tasker/orchestration/workflow_coordinator.rb +294 -0
- data/lib/tasker/orchestration.rb +45 -0
- data/lib/tasker/railtie.rb +9 -0
- data/lib/tasker/registry/base_registry.rb +177 -0
- data/lib/tasker/registry/event_publisher.rb +91 -0
- data/lib/tasker/registry/interface_validator.rb +140 -0
- data/lib/tasker/registry/statistics_collector.rb +381 -0
- data/lib/tasker/registry/subscriber_registry.rb +285 -0
- data/lib/tasker/registry.rb +22 -0
- data/lib/tasker/state_machine/step_state_machine.rb +508 -0
- data/lib/tasker/state_machine/task_state_machine.rb +192 -0
- data/lib/tasker/state_machine.rb +83 -0
- data/lib/tasker/step_handler/api.rb +410 -0
- data/lib/tasker/step_handler/base.rb +206 -0
- data/lib/tasker/task_builder.rb +432 -0
- data/lib/tasker/task_handler/class_methods.rb +324 -0
- data/lib/tasker/task_handler/instance_methods.rb +293 -0
- data/lib/tasker/task_handler/step_group.rb +182 -0
- data/lib/tasker/task_handler.rb +43 -0
- data/lib/tasker/telemetry/event_mapping.rb +126 -0
- data/lib/tasker/telemetry/event_router.rb +318 -0
- data/lib/tasker/telemetry/events/export_events.rb +38 -0
- data/lib/tasker/telemetry/export_coordinator.rb +497 -0
- data/lib/tasker/telemetry/intelligent_cache_manager.rb +508 -0
- data/lib/tasker/telemetry/log_backend.rb +224 -0
- data/lib/tasker/telemetry/metric_types.rb +368 -0
- data/lib/tasker/telemetry/metrics_backend.rb +1227 -0
- data/lib/tasker/telemetry/metrics_export_service.rb +392 -0
- data/lib/tasker/telemetry/plugin_registry.rb +333 -0
- data/lib/tasker/telemetry/plugins/base_exporter.rb +246 -0
- data/lib/tasker/telemetry/plugins/csv_exporter.rb +198 -0
- data/lib/tasker/telemetry/plugins/json_exporter.rb +141 -0
- data/lib/tasker/telemetry/prometheus_exporter.rb +249 -0
- data/lib/tasker/telemetry/trace_backend.rb +186 -0
- data/lib/tasker/telemetry.rb +59 -0
- data/lib/tasker/types/auth_config.rb +81 -0
- data/lib/tasker/types/backoff_config.rb +142 -0
- data/lib/tasker/types/cache_config.rb +257 -0
- data/lib/tasker/types/database_config.rb +39 -0
- data/lib/tasker/types/dependency_graph.rb +225 -0
- data/lib/tasker/types/dependency_graph_config.rb +149 -0
- data/lib/tasker/types/engine_config.rb +131 -0
- data/lib/tasker/types/execution_config.rb +289 -0
- data/lib/tasker/types/health_config.rb +84 -0
- data/lib/tasker/types/step_sequence.rb +24 -0
- data/lib/tasker/types/step_template.rb +63 -0
- data/lib/tasker/types/task_request.rb +60 -0
- data/lib/tasker/types/telemetry_config.rb +273 -0
- data/lib/tasker/types.rb +64 -0
- data/lib/tasker/version.rb +7 -0
- data/lib/tasker.rb +82 -0
- data/lib/tasks/tasker_tasks.rake +302 -0
- metadata +958 -0
@@ -0,0 +1,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
|
+
— 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> »
|
40
|
+
<span class='title'><span class='object_link'><a href="../Tasker.html" title="Tasker (module)">Tasker</a></span></span>
|
41
|
+
»
|
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) ⇒ 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) ⇒ 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) ⇒ 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) ⇒ 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> ⇒ 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) ⇒ 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) ⇒ 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) ⇒ 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> ⇒ 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> ⇒ 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> ⇒ 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> ⇒ 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) ⇒ 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) ⇒ 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) ⇒ 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) ⇒ 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) ⇒ <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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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'>'</span><span class='tstring_content'>pending</span><span class='tstring_end'>'</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'>'</span><span class='tstring_content'>EXTRACT(EPOCH FROM (NOW() - tasker_workflow_steps.created_at))</span><span class='tstring_end'>'</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'>&.</span><span class='id identifier rubyid_to_f'>to_f</span><span class='op'>&.</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'>=></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'>"</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'>"</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) ⇒ <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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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'>=></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'>"</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'>"</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) ⇒ <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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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) ⇒ <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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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> ⇒ <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
|
+
—
|
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) ⇒ <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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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'>'</span><span class='tstring_content'>0-10s</span><span class='tstring_end'>'</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'>'</span><span class='tstring_content'>10-30s</span><span class='tstring_end'>'</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'>'</span><span class='tstring_content'>30s+</span><span class='tstring_end'>'</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'>=></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'>"</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'>"</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) ⇒ <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
|
+
—
|
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
|
+
—
|
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'>'</span><span class='tstring_content'>attempts > 1</span><span class='tstring_end'>'</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'>'</span><span class='tstring_content'>complete</span><span class='tstring_end'>'</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'>=></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'>"</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'>"</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) ⇒ <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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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'>'</span><span class='tstring_content'>tasker_named_tasks.name</span><span class='tstring_end'>'</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'>=></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'>"</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'>"</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> ⇒ <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
|
+
—
|
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> ⇒ <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> ⇒ <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> ⇒ <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'>'</span><span class='tstring_content'>0-10s</span><span class='tstring_end'>'</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'>'</span><span class='tstring_content'>10-30s</span><span class='tstring_end'>'</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'>'</span><span class='tstring_content'>30s+</span><span class='tstring_end'>'</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) ⇒ <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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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'>&</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'>=></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'>"</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'>"</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) ⇒ <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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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'>&</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'>=></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'>"</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'>"</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) ⇒ <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
|
+
—
|
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
|
+
—
|
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'>'</span><span class='tstring_content'>pending</span><span class='tstring_end'>'</span></span> <span class='op'>&&</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'>&</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'>&</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'>&</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'>=></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'>"</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'>"</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) ⇒ <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
|
+
—
|
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
|
+
—
|
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
|
+
—
|
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'>></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'><<</span> <span class='tstring'><span class='tstring_beg'>"</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'>"</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'>></span> <span class='int'>1</span> <span class='rbrace'>}</span>
|
2187
|
+
<span class='id identifier rubyid_recommendations'>recommendations</span> <span class='op'><<</span> <span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>High retry patterns detected. Review error handling and timeout configurations.</span><span class='tstring_end'>'</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'>'</span><span class='tstring_content'>Monitor task performance trends regularly</span><span class='tstring_end'>'</span></span><span class='comma'>,</span>
|
2194
|
+
<span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>Review timeout configurations for network operations</span><span class='tstring_end'>'</span></span><span class='comma'>,</span>
|
2195
|
+
<span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>Consider implementing caching for repeated operations</span><span class='tstring_end'>'</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'>=></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'>"</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'>"</span></span>
|
2202
|
+
<span class='lbracket'>[</span><span class='tstring'><span class='tstring_beg'>'</span><span class='tstring_content'>Monitor system performance regularly</span><span class='tstring_end'>'</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>
|