示例#1
0
 def test_sanitize_metric_name_should_remove_multiple_dots(self):
     self.assertEqual("foo.bar.baz",
                      bg_metric.sanitize_metric_name("foo.bar..baz"))
     self.assertEqual("foo.bar.baz",
                      bg_metric.sanitize_metric_name("foo.bar...baz"))
     self.assertEqual("foo.bar.baz",
                      bg_metric.sanitize_metric_name("foo..bar..baz"))
示例#2
0
    def _search_metrics_from_components(self, glob, components, search=None):
        search = self._create_search_query() if search is None else search
        search = search.source("name")

        # Handle glob with globstar(s).
        globstars = components.count(bg_glob.Globstar())
        if globstars:
            name_regexp = "\\.".join(
                [_parse_regexp_component(c) for c in components])
            return True, search.filter("regexp", **{"name": name_regexp})

        # TODO (t.chataigner) Handle fully defined prefix (like a.b.c.*.*.*)
        # with a wildcard on name.

        # Handle fully defined glob.
        if self.__glob_parser.is_fully_defined(components):
            return (
                False,
                search.filter("term",
                              **{"name":
                                 bg_metric.sanitize_metric_name(glob)}),
            )

        # Handle all other use cases.
        for i, c in enumerate(components):
            if len(c) == 1:
                filter_type, value = parse_simple_component(c)
            else:
                filter_type, value = parse_complex_component(c)

            if filter_type:
                search = search.filter(filter_type, **{"p%d" % i: value})
        return False, search
示例#3
0
    def delete_metric(self, name):
        name = bg_metric.sanitize_metric_name(name)

        query = self._create_search_query().filter("term", name=name)

        log.debug(json.dumps(query.to_dict(), default=str))
        query.delete()
示例#4
0
    def _search_metrics_from_components(self, glob, components, search=None):
        search = self._create_search_query() if search is None else search
        search = search.source("name")

        # Handle glob with globstar(s).
        globstars = components.count(bg_glob.Globstar())
        if globstars:
            name_regexp = "\\.".join([_parse_regexp_component(c) for c in components])
            return True, search.filter("regexp", **{"name": name_regexp})

        # TODO (t.chataigner) Handle fully defined prefix (like a.b.c.*.*.*)
        # with a wildcard on name.

        # Handle fully defined glob.
        if self.__glob_parser.is_fully_defined(components):
            return (
                False,
                search.filter("term", **{"name": bg_metric.sanitize_metric_name(glob)}),
            )

        # Handle all other use cases.
        for i, c in enumerate(components):
            if len(c) == 1:
                filter_type, value = parse_simple_component(c)
            else:
                filter_type, value = parse_complex_component(c)

            if filter_type:
                search = search.filter(filter_type, **{"p%d" % i: value})
        return False, search
示例#5
0
    def delete_metric(self, name):
        name = bg_metric.sanitize_metric_name(name)

        query = self._create_search_query().filter("term", name=name)

        log.debug(json.dumps(query.to_dict(), default=str))
        query.delete()
示例#6
0
    def get_metric(self, metric_name):
        """See the real Accessor for a description."""
        super(_ElasticSearchAccessor, self).get_metric(metric_name)
        metric_name = bg_metric.sanitize_metric_name(metric_name)

        document = self.__get_document(metric_name)
        if document is None:
            return None

        return self._document_to_metric(document)
示例#7
0
    def get_metric(self, metric_name):
        """See the real Accessor for a description."""
        super(_ElasticSearchAccessor, self).get_metric(metric_name)
        metric_name = bg_metric.sanitize_metric_name(metric_name)

        document = self.__get_document(metric_name)
        if document is None:
            return None

        return self._document_to_metric(document)
示例#8
0
    def __touch_document(self, metric, updated_on):
        # Update Elasticsearch.
        metric_name = bg_metric.sanitize_metric_name(metric.name)

        # See if the metric is in the correct index
        index = self.get_index(metric)
        document = self.__get_document(metric_name, index)

        if not document:
            # Re-create the metric.
            metric.updated_on = updated_on
            self.create_metric(metric)
        else:
            self.__update_existing_document(document, updated_on)
示例#9
0
    def __touch_document(self, metric, updated_on):
        # Update Elasticsearch.
        metric_name = bg_metric.sanitize_metric_name(metric.name)

        # See if the metric is in the correct index
        index = self.get_index(metric)
        document = self.__get_document(metric_name, index)

        if not document:
            # Re-create the metric.
            metric.updated_on = updated_on
            self.create_metric(metric)
        else:
            self.__update_existing_document(document, updated_on)
示例#10
0
def document_from_metric(metric):
    """Creates an ElasticSearch document from a Metric."""
    config = metric.metadata.as_string_dict()
    components = _components_from_name(metric.name)
    name = bg_metric.sanitize_metric_name(metric.name)

    data = {"depth": len(components) - 1, "name": name}

    for i, component in enumerate(components):
        data["p%d" % i] = component
    data.update({
        "uuid": metric.id,
        "created_on": metric.created_on or datetime.datetime.now(),
        "updated_on": metric.updated_on or datetime.datetime.now(),
        "read_on": metric.read_on or None,
        "config": config,
    })
    return data
示例#11
0
    def update_metric(self, name, updated_metadata):
        """See bg_accessor.Accessor."""
        super(_ElasticSearchAccessor, self).update_metric(name, updated_metadata)

        name = bg_metric.sanitize_metric_name(name)
        metric = self.get_metric(name)

        if metric is None:
            raise InvalidArgumentError("Unknown metric '%s'" % name)

        updated_metric = bg_metric.make_metric(
            name,
            updated_metadata,
            created_on=metric.created_on,
            updated_on=datetime.datetime.now(),
            read_on=metric.read_on,
        )
        self.create_metric(updated_metric)
示例#12
0
    def touch_metric(self, metric):
        """See the real Accessor for a description."""
        super(_ElasticSearchAccessor, self).touch_metric(metric)

        if not metric.updated_on:
            delta = self.__updated_on_ttl_sec + 1
        else:
            updated_on_timestamp = time.mktime(metric.updated_on.timetuple())
            delta = int(time.time()) - int(updated_on_timestamp)

        if delta >= self.__updated_on_ttl_sec:
            # Update Elasticsearch.
            metric_name = bg_metric.sanitize_metric_name(metric.name)
            document = self.__get_document(metric_name)
            if document:
                self.__touch_document(document)
            # Make sure the caller also see the change without refreshing
            # the metric.
            metric.updated_on = datetime.datetime.now()
示例#13
0
    def update_metric(self, name, updated_metadata):
        """See bg_accessor.Accessor."""
        super(_ElasticSearchAccessor,
              self).update_metric(name, updated_metadata)

        name = bg_metric.sanitize_metric_name(name)
        metric = self.get_metric(name)

        if metric is None:
            raise InvalidArgumentError("Unknown metric '%s'" % name)

        updated_metric = bg_metric.make_metric(
            name,
            updated_metadata,
            created_on=metric.created_on,
            updated_on=datetime.datetime.now(),
            read_on=metric.read_on,
        )
        self.create_metric(updated_metric)
示例#14
0
def document_from_metric(metric):
    """Creates an ElasticSearch document from a Metric."""
    config = metric.metadata.as_string_dict()
    components = _components_from_name(metric.name)
    name = bg_metric.sanitize_metric_name(metric.name)

    data = {"depth": len(components) - 1, "name": name}

    for i, component in enumerate(components):
        data["p%d" % i] = component
    data.update(
        {
            "uuid": metric.id,
            "created_on": metric.created_on or datetime.datetime.now(),
            "updated_on": metric.updated_on or datetime.datetime.now(),
            "read_on": metric.read_on or None,
            "config": config,
        }
    )
    return data
示例#15
0
 def test_sanitize_metric_name_should_trim_trailing_dots(self):
     self.assertEqual("foo.bar", bg_metric.sanitize_metric_name("foo.bar."))
     self.assertEqual("foo.bar", bg_metric.sanitize_metric_name("foo.bar.."))
示例#16
0
 def test_sanitize_metric_name_should_trim_heading_dots(self):
     self.assertEqual("foo.bar", bg_metric.sanitize_metric_name(".foo.bar"))
     self.assertEqual("foo.bar", bg_metric.sanitize_metric_name("..foo.bar"))
示例#17
0
 def test_sanitize_metric_name_should_handle_empty_value(self):
     self.assertEqual("", bg_metric.sanitize_metric_name(""))
     self.assertEqual("", bg_metric.sanitize_metric_name("."))
     self.assertEqual("", bg_metric.sanitize_metric_name(".."))
示例#18
0
 def test_sanitize_metric_name_should_handle_None_value(self):
     self.assertEqual(None, bg_metric.sanitize_metric_name(None))
示例#19
0
 def test_sanitize_metric_name_should_trim_heading_dots(self):
     self.assertEqual("foo.bar", bg_metric.sanitize_metric_name(".foo.bar"))
     self.assertEqual("foo.bar",
                      bg_metric.sanitize_metric_name("..foo.bar"))
示例#20
0
 def test_sanitize_metric_name_should_trim_trailing_dots(self):
     self.assertEqual("foo.bar", bg_metric.sanitize_metric_name("foo.bar."))
     self.assertEqual("foo.bar",
                      bg_metric.sanitize_metric_name("foo.bar.."))
示例#21
0
 def test_sanitize_metric_name_should_handle_None_value(self):
     self.assertEqual(None, bg_metric.sanitize_metric_name(None))
示例#22
0
 def test_sanitize_metric_name_should_handle_empty_value(self):
     self.assertEqual("", bg_metric.sanitize_metric_name(""))
     self.assertEqual("", bg_metric.sanitize_metric_name("."))
     self.assertEqual("", bg_metric.sanitize_metric_name(".."))
示例#23
0
 def test_sanitize_metric_name_should_remove_multiple_dots(self):
     self.assertEqual("foo.bar.baz", bg_metric.sanitize_metric_name("foo.bar..baz"))
     self.assertEqual("foo.bar.baz", bg_metric.sanitize_metric_name("foo.bar...baz"))
     self.assertEqual("foo.bar.baz", bg_metric.sanitize_metric_name("foo..bar..baz"))