Skip to content

Commit

Permalink
[Hbase] Add column for source filter in _get_meter_samples
Browse files Browse the repository at this point in the history
Earlier column for source was not created and "get_samples"
method with source query worked incorrect. In this change
it is fixed.

Fixes: bug #1330989

Change-Id: Ie8be408d6b54471322e2f585ddf27c50219b8fd3
  • Loading branch information
Ilya Tyaptin committed Aug 13, 2014
1 parent 1892bc6 commit 177927b
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 7 deletions.
36 changes: 30 additions & 6 deletions ceilometer/storage/hbase/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -192,17 +192,39 @@ def make_query(metaquery=None, trait_query=None, **kwargs):
return res_q


def get_meter_columns(metaquery, **kwargs):
"""Return a list of required columns in meter table to be scanned .
def get_meter_columns(metaquery=None, need_timestamp=False, **kwargs):
"""Return a list of required columns in meter table to be scanned.
SingleColumnFilter has 'columns' filter that should be used to determine
what columns we are interested in. But if we want to use 'filter' and
'columns' together we have to include columns we are filtering by
to columns list.
Please see an example: If we make scan with filter
"SingleColumnValueFilter ('f', 's_test-1', =, 'binary:\"1\"')"
and columns ['f:rts'], the output will be always empty
because only 'rts' will be returned and filter will be applied
to this data so 's_test-1' cannot be find.
To make this request correct it should be fixed as follows:
filter = "SingleColumnValueFilter ('f', 's_test-1', =, 'binary:\"1\"')",
columns = ['f:rts','f:s_test-1']}
:param metaquery: optional metaquery dict
:param need_timestamp: flag, which defines the need for timestamp columns
:param kwargs: key-value pairs to filter on. Key should be a real
column name in db
"""
columns = ['f:message', 'f:recorded_at']
columns.extend("f:%s" % k for k, v in kwargs.items() if v)
columns.extend("f:%s" % k for k, v in kwargs.items()
if v is not None)
if metaquery:
columns.extend("f:r_%s" % k for k, v in metaquery.items() if v)
columns.extend("f:r_%s" % k for k, v in metaquery.items()
if v is not None)
source = kwargs.get('source')
if source:
columns.append("f:s_%s" % source)
if need_timestamp:
columns.extend(['f:rts', 'f:timestamp'])
return columns


Expand All @@ -222,7 +244,6 @@ def make_sample_query_from_filter(sample_filter, require_meter=True):
start=sample_filter.start, start_op=sample_filter.start_timestamp_op,
end=sample_filter.end, end_op=sample_filter.end_timestamp_op,
some_id=meter)

kwargs = dict(user_id=sample_filter.user,
project_id=sample_filter.project,
counter_name=meter,
Expand All @@ -237,7 +258,10 @@ def make_sample_query_from_filter(sample_filter, require_meter=True):
res_q = q + ts_query if ts_query else q
else:
res_q = ts_query if ts_query else None
columns = get_meter_columns(metaquery=sample_filter.metaquery, **kwargs)

need_timestamp = (sample_filter.start or sample_filter.end) is not None
columns = get_meter_columns(metaquery=sample_filter.metaquery,
need_timestamp=need_timestamp, **kwargs)
return res_q, start_row, end_row, columns


Expand Down
2 changes: 1 addition & 1 deletion ceilometer/storage/impl_hbase.py
Original file line number Diff line number Diff line change
Expand Up @@ -380,7 +380,7 @@ def get_samples(self, sample_filter, limit=None):
(sample_filter, require_meter=False))
LOG.debug(_("Query Meter Table: %s") % q)
gen = meter_table.scan(filter=q, row_start=start, row_stop=stop,
limit=limit)
limit=limit, columns=columns)
for ignored, meter in gen:
d_meter = hbase_utils.deserialize_entry(meter)[0]
d_meter['message']['recorded_at'] = d_meter['recorded_at']
Expand Down

0 comments on commit 177927b

Please sign in to comment.