示例#1
0
def reverse_tag_value(org_id: int, index: int) -> str:
    str_value = indexer.reverse_resolve(org_id, index)  # type: ignore
    # If the value can't be reversed it's very likely a real programming bug
    # instead of something to be caught down: We probably got back a value from
    # Snuba that's not in the indexer => partial data loss
    assert str_value is not None
    return str_value  # type: ignore
示例#2
0
    def _extract_data(self, entity, data, groups):
        tags = tuple((key, data[key]) for key in sorted(data.keys()) if key.startswith("tags["))

        metric_name = indexer.reverse_resolve(data["metric_id"])
        ops = self._ops_by_metric[metric_name]

        tag_data = groups.setdefault(
            tags,
            {
                "totals": {},
                "series": {},
            },
        )

        timestamp = data.pop(TS_COL_GROUP, None)

        for op in ops:
            key = f"{op}({metric_name})"
            series = tag_data["series"].setdefault(
                key, len(self._intervals) * [_DEFAULT_AGGREGATES[op]]
            )

            field = _OP_TO_FIELD[entity][op]
            value = data[field]
            if field == "percentiles":
                value = value[Percentile[op].value]

            # If this is time series data, add it to the appropriate series.
            # Else, add to totals
            if timestamp is None:
                tag_data["totals"][key] = finite_or_none(value)
            else:
                series_index = self._timestamp_index[timestamp]
                series[series_index] = finite_or_none(value)
示例#3
0
    def translate_results(self):
        groups = {}

        for entity, subresults in self._results.items():
            totals = subresults["totals"]["data"]
            for data in totals:
                self._extract_data(entity, data, groups)

            series = subresults["series"]["data"]
            for data in series:
                self._extract_data(entity, data, groups)

        org_id = self._organization_id

        groups = [
            dict(
                by={
                    self._parse_tag(key):
                    indexer.reverse_resolve(org_id, value)
                    for key, value in tags
                },
                **data,
            ) for tags, data in groups.items()
        ]

        return groups
示例#4
0
def reverse_resolve(index: int) -> str:
    assert index != 0
    resolved = indexer.reverse_resolve(index)
    # The indexer should never return None for integers > 0:
    if resolved is None:
        raise MetricIndexNotFound()

    return resolved  # type: ignore
示例#5
0
def resolve_tags(results: Any, metrics_query: MetricsQueryBuilder) -> Any:
    """Go through the results of a metrics query and reverse resolve its tags"""
    tags: List[str] = []

    for column in metrics_query.columns:
        if (
            isinstance(column, AliasedExpression)
            and column.exp.subscriptable == "tags"
            and column.alias
        ):
            tags.append(column.alias)

    for tag in tags:
        for row in results["data"]:
            row[tag] = indexer.reverse_resolve(row[tag])
        if tag in results["meta"]:
            results["meta"][tag] = "string"

    return results
示例#6
0
 def _parse_tag(self, tag_string: str) -> str:
     tag_key = int(tag_string.replace("tags[", "").replace("]", ""))
     return indexer.reverse_resolve(self._organization_id, tag_key)
示例#7
0
 def _parse_tag(self, tag_string: str) -> str:
     tag_key = int(tag_string.replace("tags[", "").replace("]", ""))
     return indexer.reverse_resolve(self._project_id, UseCase.TAG_KEY,
                                    tag_key)
def _reverse_resolve(index: int) -> Optional[str]:
    """Wrapper for typing"""
    return indexer.reverse_resolve(index)  # type: ignore
示例#9
0
def reverse_tag_value(org_id: int, index: int) -> str:
    str_value = indexer.reverse_resolve(org_id, UseCase.TAG_VALUE,
                                        index)  # type: ignore
    assert str_value is not None
    return str_value  # type: ignore
示例#10
0
def reverse_resolve(index: int) -> str:
    resolved = indexer.reverse_resolve(index)
    # The indexer should never return None for integers > 0:
    assert resolved is not None

    return resolved