Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 # Copyright 2014 The LUCI Authors. All rights reserved. | 1 # Copyright 2014 The LUCI Authors. All rights reserved. |
| 2 # Use of this source code is governed under the Apache License, Version 2.0 | 2 # Use of this source code is governed under the Apache License, Version 2.0 |
| 3 # that can be found in the LICENSE file. | 3 # that can be found in the LICENSE file. |
| 4 | 4 |
| 5 """Main entry point for Swarming backend handlers.""" | 5 """Main entry point for Swarming backend handlers.""" |
| 6 | 6 |
| 7 import datetime | |
| 7 import json | 8 import json |
| 8 import logging | 9 import logging |
| 9 | 10 |
| 10 import webapp2 | 11 import webapp2 |
| 11 from google.appengine.api import app_identity | 12 from google.appengine.api import app_identity |
| 12 from google.appengine.api import datastore_errors | 13 from google.appengine.api import datastore_errors |
| 13 from google.appengine.api import taskqueue | 14 from google.appengine.api import taskqueue |
| 14 | 15 |
| 15 from components import utils | 16 from components import utils |
| 16 | 17 |
| 17 import mapreduce_jobs | 18 import mapreduce_jobs |
| 18 from components import decorators | 19 from components import decorators |
| 20 from components import datastore_utils | |
| 19 from components import machine_provider | 21 from components import machine_provider |
| 20 from server import bot_management | 22 from server import bot_management |
| 21 from server import config | 23 from server import config |
| 22 from server import lease_management | 24 from server import lease_management |
| 23 from server import stats | 25 from server import stats |
| 26 from server import task_result | |
| 24 from server import task_scheduler | 27 from server import task_scheduler |
| 25 | 28 |
| 26 | 29 |
| 27 class CronBotDiedHandler(webapp2.RequestHandler): | 30 class CronBotDiedHandler(webapp2.RequestHandler): |
| 28 @decorators.require_cronjob | 31 @decorators.require_cronjob |
| 29 def get(self): | 32 def get(self): |
| 30 try: | 33 try: |
| 31 task_scheduler.cron_handle_bot_died(self.request.host_url) | 34 task_scheduler.cron_handle_bot_died(self.request.host_url) |
| 32 except datastore_errors.NeedIndexError as e: | 35 except datastore_errors.NeedIndexError as e: |
| 33 # When a fresh new instance is deployed, it takes a few minutes for the | 36 # When a fresh new instance is deployed, it takes a few minutes for the |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 117 for k, values in sorted(seen.iteritems()) | 120 for k, values in sorted(seen.iteritems()) |
| 118 ] | 121 ] |
| 119 | 122 |
| 120 logging.info('Saw dimensions %s', dims) | 123 logging.info('Saw dimensions %s', dims) |
| 121 bot_management.DimensionAggregation( | 124 bot_management.DimensionAggregation( |
| 122 key=bot_management.DimensionAggregation.KEY, | 125 key=bot_management.DimensionAggregation.KEY, |
| 123 dimensions=dims, | 126 dimensions=dims, |
| 124 ts=now).put() | 127 ts=now).put() |
| 125 | 128 |
| 126 | 129 |
| 130 class CronTasksTagsAggregationHandler(webapp2.RequestHandler): | |
| 131 """Aggregates all task tags from the last 48 hours.""" | |
| 132 | |
| 133 @decorators.require_cronjob | |
| 134 def get(self): | |
| 135 seen = {} | |
| 136 now = utils.utcnow() | |
| 137 count = 0 | |
| 138 q = task_result.get_result_summaries_query( | |
| 139 now - datetime.timedelta(days=2), None, 'created_ts', 'all', None) | |
| 140 cursor = None | |
| 141 while True: | |
| 142 tasks, cursor = datastore_utils.fetch_page(q, 1000, cursor) | |
|
M-A Ruel
2016/08/16 15:37:21
fetching 1000 at a time is going to be very slow.
kjlubick
2016/08/16 17:20:44
I tried iterating one at a time, even with a filte
| |
| 143 count += len(tasks) | |
| 144 for t in tasks: | |
| 145 for i in t.tags: | |
| 146 k, v = i.split(':', 1) | |
| 147 if k != 'cron_invocation_id': | |
|
M-A Ruel
2016/08/16 15:37:21
what's that?
kjlubick
2016/08/16 17:20:44
It appeared to be something that was different for
| |
| 148 seen.setdefault(k, set()).add(v) | |
| 149 if not cursor or len(tasks) == 0: | |
| 150 break | |
| 151 | |
| 152 tags = [ | |
| 153 task_result.TagValues(tag=k,values=sorted(values)) | |
|
M-A Ruel
2016/08/16 15:37:21
task_result.TagValues(tag=k, values=sorted(values)
kjlubick
2016/08/16 17:20:44
Done.
| |
| 154 for k, values in sorted(seen.iteritems()) | |
| 155 ] | |
| 156 | |
| 157 logging.info('From %d tasks, saw tags %s', count, tags) | |
| 158 task_result.TagAggregation( | |
| 159 key=task_result.TagAggregation.KEY, | |
| 160 tags=tags, | |
| 161 ts=now).put() | |
| 162 | |
| 163 | |
| 127 class CronMachineProviderPubSubHandler(webapp2.RequestHandler): | 164 class CronMachineProviderPubSubHandler(webapp2.RequestHandler): |
| 128 """Listens for Pub/Sub communication from Machine Provider.""" | 165 """Listens for Pub/Sub communication from Machine Provider.""" |
| 129 | 166 |
| 130 @decorators.require_cronjob | 167 @decorators.require_cronjob |
| 131 def get(self): | 168 def get(self): |
| 132 if not config.settings().mp.enabled: | 169 if not config.settings().mp.enabled: |
| 133 logging.info('MP support is disabled') | 170 logging.info('MP support is disabled') |
| 134 return | 171 return |
| 135 | 172 |
| 136 taskqueue.add( | 173 taskqueue.add( |
| (...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 192 # the app version has to be running an already compatible version already. | 229 # the app version has to be running an already compatible version already. |
| 193 ('/internal/cron/abort_bot_died', CronBotDiedHandler), | 230 ('/internal/cron/abort_bot_died', CronBotDiedHandler), |
| 194 ('/internal/cron/handle_bot_died', CronBotDiedHandler), | 231 ('/internal/cron/handle_bot_died', CronBotDiedHandler), |
| 195 ('/internal/cron/abort_expired_task_to_run', | 232 ('/internal/cron/abort_expired_task_to_run', |
| 196 CronAbortExpiredShardToRunHandler), | 233 CronAbortExpiredShardToRunHandler), |
| 197 | 234 |
| 198 ('/internal/cron/stats/update', stats.InternalStatsUpdateHandler), | 235 ('/internal/cron/stats/update', stats.InternalStatsUpdateHandler), |
| 199 ('/internal/cron/trigger_cleanup_data', CronTriggerCleanupDataHandler), | 236 ('/internal/cron/trigger_cleanup_data', CronTriggerCleanupDataHandler), |
| 200 ('/internal/cron/aggregate_bots_dimensions', | 237 ('/internal/cron/aggregate_bots_dimensions', |
| 201 CronBotsDimensionAggregationHandler), | 238 CronBotsDimensionAggregationHandler), |
| 239 ('/internal/cron/aggregate_tasks_tags', | |
| 240 CronTasksTagsAggregationHandler), | |
| 202 ('/internal/cron/machine_provider', CronMachineProviderBotHandler), | 241 ('/internal/cron/machine_provider', CronMachineProviderBotHandler), |
| 203 ('/internal/cron/machine_provider_cleanup', | 242 ('/internal/cron/machine_provider_cleanup', |
| 204 CronMachineProviderCleanUpHandler), | 243 CronMachineProviderCleanUpHandler), |
| 205 ('/internal/cron/machine_provider_pubsub', | 244 ('/internal/cron/machine_provider_pubsub', |
| 206 CronMachineProviderPubSubHandler), | 245 CronMachineProviderPubSubHandler), |
| 207 | 246 |
| 208 # Task queues. | 247 # Task queues. |
| 209 ('/internal/taskqueue/cleanup_data', TaskCleanupDataHandler), | 248 ('/internal/taskqueue/cleanup_data', TaskCleanupDataHandler), |
| 210 (r'/internal/taskqueue/pubsub/<task_id:[0-9a-f]+>', TaskSendPubSubMessage), | 249 (r'/internal/taskqueue/pubsub/<task_id:[0-9a-f]+>', TaskSendPubSubMessage), |
| 211 ('/internal/taskqueue/pubsub/machine_provider', | 250 ('/internal/taskqueue/pubsub/machine_provider', |
| 212 TaskMachineProviderPubSubHandler), | 251 TaskMachineProviderPubSubHandler), |
| 213 | 252 |
| 214 # Mapreduce related urls. | 253 # Mapreduce related urls. |
| 215 (r'/internal/taskqueue/mapreduce/launch/<job_id:[^\/]+>', | 254 (r'/internal/taskqueue/mapreduce/launch/<job_id:[^\/]+>', |
| 216 InternalLaunchMapReduceJobWorkerHandler), | 255 InternalLaunchMapReduceJobWorkerHandler), |
| 217 ] | 256 ] |
| 218 return [webapp2.Route(*a) for a in routes] | 257 return [webapp2.Route(*a) for a in routes] |
| OLD | NEW |