Ejemplo n.º 1
0
    def transform_to_fixed_size_buckets(percentages_histogram,
                                        expected_buckets=200):
        """
        Returns for given histogram to a normalized histogram in term of buckets.
        :param percentages_histogram: Histogram as returned per middleware in format
        :param expected_buckets: Number of buckets expected in the histogram
        :return: Histogram which has 100µs buckets between [0, expected_buckets/10 - 0.1] ms
        """
        result = {}

        # Default initialize the result-dictionary to our needs
        for i in range(expected_buckets):
            result[StdLib.get_rounded_double(i / 10)] = 0.0

        sum_beyond_range = 0
        # Fill in the observed values to the dictionary
        for item in percentages_histogram:
            if item >= expected_buckets / 10:
                # Accumulate anything above X milliseconds
                sum_beyond_range += percentages_histogram.get(item)
                continue
            index = StdLib.get_rounded_double(item)
            result[index] = percentages_histogram.get(item)

        last_bucket = StdLib.get_rounded_double((expected_buckets - 1) / 10)
        result[last_bucket] += sum_beyond_range

        return result
Ejemplo n.º 2
0
    def transform_to_fixed_size_buckets(percentages_histogram,
                                        expected_buckets=200):
        """
        Returns for given histogram to a normalized histogram in term of buckets.
        :param percentages_histogram: Histogram as returned per memtier in format
        :param expected_buckets: Number of buckets expected in the histogram
        :return: Histogram which has 100µs buckets between [0, expected_buckets/10 - 0.1] ms
        """
        result = {}

        # Default initialize the result-dictionary to our needs
        for i in range(expected_buckets):
            result[StdLib.get_rounded_double(i / 10)] = 0.0

        sum_below_range = 0
        sum_beyond_range = 0
        current_below = 0
        # Fill in the observed values to the dictionary
        for item in percentages_histogram:
            if item >= expected_buckets / 10:
                # Accumulate anything above X milliseconds
                sum_beyond_range += percentages_histogram.get(item)
                continue
            if item <= 1:
                if int(item * 10) - int(current_below * 10) > 0.99:
                    if not current_below == 0.0:
                        index = StdLib.get_rounded_double(
                            int(current_below * 10) / 10)
                        result[index] = sum_below_range
                    sum_below_range = percentages_histogram.get(item)
                    current_below = item
                    if item == 1:
                        current_below = 0
                        sum_below_range = 0
                        index = StdLib.get_rounded_double(item)
                        result[index] = percentages_histogram.get(item)
                else:
                    sum_below_range += percentages_histogram.get(item)
                continue
            # Try to expand buckets and divide respective percentages evenly -> uniform distribution inside buckets
            bucket_count = int(
                math.pow(10,
                         math.ceil(math.log10(item + 0.1)) - 1))
            bucket_value = StdLib.safe_div(percentages_histogram.get(item),
                                           bucket_count)
            for i in range(bucket_count):
                index = StdLib.get_rounded_double(item + i / 10)
                result[index] = bucket_value

        last_bucket = StdLib.get_rounded_double((expected_buckets - 1) / 10)
        result[last_bucket] += sum_beyond_range

        return result