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:
parent
5c3bb70c35
commit
26b0dd2a3e
|
@ -463,7 +463,7 @@ def format_watch(watch):
|
||||||
return result
|
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
|
# Demangle DB format data into something more easily used in the API
|
||||||
# We are expecting a dict with exactly two items, Namespace and
|
# We are expecting a dict with exactly two items, Namespace and
|
||||||
|
@ -477,7 +477,7 @@ def format_watch_data(wd):
|
||||||
return
|
return
|
||||||
|
|
||||||
result = {
|
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_METRIC: metric_name,
|
||||||
rpc_api.WATCH_DATA_TIME: wd.created_at.isoformat(),
|
rpc_api.WATCH_DATA_TIME: wd.created_at.isoformat(),
|
||||||
rpc_api.WATCH_DATA_NAMESPACE: namespace,
|
rpc_api.WATCH_DATA_NAMESPACE: namespace,
|
||||||
|
|
|
@ -2063,11 +2063,14 @@ class EngineService(service.Service):
|
||||||
|
|
||||||
try:
|
try:
|
||||||
wds = watch_data.WatchData.get_all(cnxt)
|
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:
|
except Exception as ex:
|
||||||
LOG.warning(_LW('show_metric (all) db error %s'), ex)
|
LOG.warning(_LW('show_metric (all) db error %s'), ex)
|
||||||
return
|
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
|
return result
|
||||||
|
|
||||||
@context.request_context
|
@context.request_context
|
||||||
|
|
|
@ -31,22 +31,14 @@ class WatchData(
|
||||||
'id': fields.IntegerField(),
|
'id': fields.IntegerField(),
|
||||||
'data': heat_fields.JsonField(nullable=True),
|
'data': heat_fields.JsonField(nullable=True),
|
||||||
'watch_rule_id': fields.StringField(),
|
'watch_rule_id': fields.StringField(),
|
||||||
'watch_rule': fields.ObjectField('WatchRule'),
|
|
||||||
'created_at': fields.DateTimeField(read_only=True),
|
'created_at': fields.DateTimeField(read_only=True),
|
||||||
'updated_at': fields.DateTimeField(nullable=True),
|
'updated_at': fields.DateTimeField(nullable=True),
|
||||||
}
|
}
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _from_db_object(context, rule, db_data):
|
def _from_db_object(context, rule, db_data):
|
||||||
from heat.objects import watch_rule
|
|
||||||
for field in rule.fields:
|
for field in rule.fields:
|
||||||
if field == 'watch_rule':
|
rule[field] = db_data[field]
|
||||||
rule[field] = watch_rule.WatchRule._from_db_object(
|
|
||||||
context,
|
|
||||||
watch_rule.WatchRule(),
|
|
||||||
db_data['watch_rule'])
|
|
||||||
else:
|
|
||||||
rule[field] = db_data[field]
|
|
||||||
rule._context = context
|
rule._context = context
|
||||||
rule.obj_reset_changes()
|
rule.obj_reset_changes()
|
||||||
return rule
|
return rule
|
||||||
|
|
|
@ -20,7 +20,6 @@ from oslo_versionedobjects import fields
|
||||||
from heat.db import api as db_api
|
from heat.db import api as db_api
|
||||||
from heat.objects import base as heat_base
|
from heat.objects import base as heat_base
|
||||||
from heat.objects import fields as heat_fields
|
from heat.objects import fields as heat_fields
|
||||||
from heat.objects import stack
|
|
||||||
from heat.objects import watch_data
|
from heat.objects import watch_data
|
||||||
|
|
||||||
|
|
||||||
|
@ -36,7 +35,6 @@ class WatchRule(
|
||||||
'state': fields.StringField(nullable=True),
|
'state': fields.StringField(nullable=True),
|
||||||
'last_evaluated': fields.DateTimeField(nullable=True),
|
'last_evaluated': fields.DateTimeField(nullable=True),
|
||||||
'stack_id': fields.StringField(),
|
'stack_id': fields.StringField(),
|
||||||
'stack': fields.ObjectField(stack.Stack),
|
|
||||||
'watch_data': fields.ListOfObjectsField(watch_data.WatchData),
|
'watch_data': fields.ListOfObjectsField(watch_data.WatchData),
|
||||||
'created_at': fields.DateTimeField(read_only=True),
|
'created_at': fields.DateTimeField(read_only=True),
|
||||||
'updated_at': fields.DateTimeField(nullable=True),
|
'updated_at': fields.DateTimeField(nullable=True),
|
||||||
|
@ -45,10 +43,7 @@ class WatchRule(
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _from_db_object(context, rule, db_rule):
|
def _from_db_object(context, rule, db_rule):
|
||||||
for field in rule.fields:
|
for field in rule.fields:
|
||||||
if field == 'stack':
|
if field == 'watch_data':
|
||||||
rule[field] = stack.Stack._from_db_object(
|
|
||||||
context, stack.Stack(), db_rule[field])
|
|
||||||
elif field == 'watch_data':
|
|
||||||
rule[field] = watch_data.WatchData.get_all_by_watch_rule_id(
|
rule[field] = watch_data.WatchData.get_all_by_watch_rule_id(
|
||||||
context, db_rule['id'])
|
context, db_rule['id'])
|
||||||
else:
|
else:
|
||||||
|
|
Loading…
Reference in New Issue