Exemple #1
0
    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))
Exemple #2
0
    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