summaryrefslogtreecommitdiff
path: root/ceilometer/sample.py
diff options
context:
space:
mode:
authorgord chung <gord@live.ca>2016-12-20 21:22:22 +0000
committergord chung <gord@live.ca>2016-12-20 23:07:52 +0000
commitdcd69a9e6a7ca5049c627d61c839dcc1ed4fa3f4 (patch)
treed2485c7c1faef27ca01cc3d1296c78b80d47934e /ceilometer/sample.py
parent6f1482f088a408edd43463a00ed16f6f78bb059d (diff)
downloadceilometer-dcd69a9e6a7ca5049c627d61c839dcc1ed4fa3f4.tar.gz
add support to parse user metadata
leverage the same user metadata parsing the pollster use. it basically grabs all entries in target payload with specified namespace. this is needed for nova free polling Change-Id: I676a1c2f16cc4259072b51df62a1c5e342caeb6f
Diffstat (limited to 'ceilometer/sample.py')
-rw-r--r--ceilometer/sample.py41
1 files changed, 41 insertions, 0 deletions
diff --git a/ceilometer/sample.py b/ceilometer/sample.py
index bcd25bf5..d5318822 100644
--- a/ceilometer/sample.py
+++ b/ceilometer/sample.py
@@ -25,14 +25,55 @@ import uuid
from oslo_config import cfg
from oslo_utils import timeutils
+import six
OPTS = [
cfg.StrOpt('sample_source',
default='openstack',
help='Source for samples emitted on this instance.'),
+ cfg.ListOpt('reserved_metadata_namespace',
+ default=['metering.'],
+ help='List of metadata prefixes reserved for metering use.'),
+ cfg.IntOpt('reserved_metadata_length',
+ default=256,
+ help='Limit on length of reserved metadata values.'),
+ cfg.ListOpt('reserved_metadata_keys',
+ default=[],
+ help='List of metadata keys reserved for metering use. And '
+ 'these keys are additional to the ones included in the '
+ 'namespace.'),
]
+def add_reserved_user_metadata(conf, src_metadata, dest_metadata):
+ limit = conf.reserved_metadata_length
+ user_metadata = {}
+ for prefix in conf.reserved_metadata_namespace:
+ md = dict(
+ (k[len(prefix):].replace('.', '_'),
+ v[:limit] if isinstance(v, six.string_types) else v)
+ for k, v in src_metadata.items()
+ if (k.startswith(prefix) and
+ k[len(prefix):].replace('.', '_') not in dest_metadata)
+ )
+ user_metadata.update(md)
+
+ for metadata_key in conf.reserved_metadata_keys:
+ md = dict(
+ (k.replace('.', '_'),
+ v[:limit] if isinstance(v, six.string_types) else v)
+ for k, v in src_metadata.items()
+ if (k == metadata_key and
+ k.replace('.', '_') not in dest_metadata)
+ )
+ user_metadata.update(md)
+
+ if user_metadata:
+ dest_metadata['user_metadata'] = user_metadata
+
+ return dest_metadata
+
+
# Fields explanation:
#
# Source: the source of this sample