def _real_record_metering_data(cls, data): """Write the data to the backend storage system. :param data: a dictionary such as returned by ceilometer.meter.meter_message_from_counter """ session = sqlalchemy_session.get_session() with session.begin(): # Record the updated resource metadata rmetadata = data['resource_metadata'] source = cls._create_or_update(session, models.Source, data['source']) user = cls._create_or_update(session, models.User, data['user_id'], source) project = cls._create_or_update(session, models.Project, data['project_id'], source) resource = cls._create_or_update(session, models.Resource, data['resource_id'], source, user=user, project=project, resource_metadata=rmetadata) # Record the raw data for the meter. meter = models.Meter(counter_type=data['counter_type'], counter_unit=data['counter_unit'], counter_name=data['counter_name'], resource=resource) session.add(meter) if not filter(lambda x: x.id == source.id, meter.sources): meter.sources.append(source) meter.project = project meter.user = user meter.timestamp = data['timestamp'] meter.resource_metadata = rmetadata meter.counter_volume = data['counter_volume'] meter.message_signature = data['message_signature'] meter.message_id = data['message_id'] session.flush() if rmetadata: if isinstance(rmetadata, dict): for key, v in utils.dict_to_keyval(rmetadata): try: _model = META_TYPE_MAP[type(v)] except KeyError: LOG.warn( _("Unknown metadata type. Key (%s) will " "not be queryable."), key) else: session.add( _model(id=meter.id, meta_key=key, value=v))
def _create_meter(session, name, type, unit): try: nested = session.connection().dialect.name != 'sqlite' with session.begin(nested=nested, subtransactions=not nested): obj = (session.query( models.Meter).filter(models.Meter.name == name).filter( models.Meter.type == type).filter( models.Meter.unit == unit).first()) if obj is None: obj = models.Meter(name=name, type=type, unit=unit) session.add(obj) except dbexc.DBDuplicateEntry: # retry function to pick up duplicate committed object obj = Connection._create_meter(session, name, type, unit) return obj