Do not populate unused stack and watch rule objects

These fields are lazy loaded, so cause extra unnecessary database
access.

The watch rules are needed when formatting every watch data metric for
the cloudwatch API, so an id->name map of all rules is built to avoid
repeated lazy loading of every rule.

Change-Id: I36dd43172ccd402f08a45b254ae47e208b7b8c08
Related-Bug: #1479723
This commit is contained in:
Steve Baker 2016-06-21 11:00:22 +12:00
parent 5c3bb70c35
commit 26b0dd2a3e
4 changed files with 8 additions and 18 deletions

View File

@ -463,7 +463,7 @@ def format_watch(watch):
return result
def format_watch_data(wd):
def format_watch_data(wd, rule_names):
# Demangle DB format data into something more easily used in the API
# We are expecting a dict with exactly two items, Namespace and
@ -477,7 +477,7 @@ def format_watch_data(wd):
return
result = {
rpc_api.WATCH_DATA_ALARM: wd.watch_rule.name,
rpc_api.WATCH_DATA_ALARM: rule_names.get(wd.watch_rule_id),
rpc_api.WATCH_DATA_METRIC: metric_name,
rpc_api.WATCH_DATA_TIME: wd.created_at.isoformat(),
rpc_api.WATCH_DATA_NAMESPACE: namespace,

View File

@ -2063,11 +2063,14 @@ class EngineService(service.Service):
try:
wds = watch_data.WatchData.get_all(cnxt)
rule_names = {
r.id: r.name for r in watch_rule.WatchRule.get_all(cnxt)
}
except Exception as ex:
LOG.warning(_LW('show_metric (all) db error %s'), ex)
return
result = [api.format_watch_data(w) for w in wds]
result = [api.format_watch_data(w, rule_names) for w in wds]
return result
@context.request_context

View File

@ -31,22 +31,14 @@ class WatchData(
'id': fields.IntegerField(),
'data': heat_fields.JsonField(nullable=True),
'watch_rule_id': fields.StringField(),
'watch_rule': fields.ObjectField('WatchRule'),
'created_at': fields.DateTimeField(read_only=True),
'updated_at': fields.DateTimeField(nullable=True),
}
@staticmethod
def _from_db_object(context, rule, db_data):
from heat.objects import watch_rule
for field in rule.fields:
if field == 'watch_rule':
rule[field] = watch_rule.WatchRule._from_db_object(
context,
watch_rule.WatchRule(),
db_data['watch_rule'])
else:
rule[field] = db_data[field]
rule[field] = db_data[field]
rule._context = context
rule.obj_reset_changes()
return rule

View File

@ -20,7 +20,6 @@ from oslo_versionedobjects import fields
from heat.db import api as db_api
from heat.objects import base as heat_base
from heat.objects import fields as heat_fields
from heat.objects import stack
from heat.objects import watch_data
@ -36,7 +35,6 @@ class WatchRule(
'state': fields.StringField(nullable=True),
'last_evaluated': fields.DateTimeField(nullable=True),
'stack_id': fields.StringField(),
'stack': fields.ObjectField(stack.Stack),
'watch_data': fields.ListOfObjectsField(watch_data.WatchData),
'created_at': fields.DateTimeField(read_only=True),
'updated_at': fields.DateTimeField(nullable=True),
@ -45,10 +43,7 @@ class WatchRule(
@staticmethod
def _from_db_object(context, rule, db_rule):
for field in rule.fields:
if field == 'stack':
rule[field] = stack.Stack._from_db_object(
context, stack.Stack(), db_rule[field])
elif field == 'watch_data':
if field == 'watch_data':
rule[field] = watch_data.WatchData.get_all_by_watch_rule_id(
context, db_rule['id'])
else: