SummarySamplesBuilder   A
last analyzed

Complexity

Total Complexity 5

Size/Duplication

Total Lines 69
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 1
Bugs 0 Features 0
Metric Value
eloc 33
c 1
b 0
f 0
dl 0
loc 69
ccs 35
cts 35
cp 1
rs 10
wmc 5

3 Methods

Rating   Name   Duplication   Size   Complexity  
A __construct() 0 3 1
A parse() 0 32 2
A calculate() 0 11 2
1
<?php
2
3
namespace Krenor\Prometheus\Storage\Builders;
4
5
use Closure;
6
use Krenor\Prometheus\Metrics\Summary;
7
use Tightenco\Collect\Support\Collection;
8
use Krenor\Prometheus\Contracts\SamplesBuilder;
9
10
class SummarySamplesBuilder extends SamplesBuilder
11
{
12
    /**
13
     * SummarySamplesBuilder constructor.
14
     *
15
     * @param Summary $summary
16
     * @param Collection $items
17
     */
18 8
    public function __construct(Summary $summary, Collection $items)
19
    {
20 8
        parent::__construct($summary, $items);
21 8
    }
22
23
    /**
24
     * {@inheritdoc}
25
     */
26 8
    protected function parse(): Collection
27
    {
28 8
        $quantiles = $this->metric->quantiles();
29
30
        return parent
31 8
            ::parse()
32 8
            ->flatMap(function (array $item) use ($quantiles) {
33 8
                ['name'   => $name,
34 8
                 'labels' => $labels] = $item;
35
36 8
                $values = !$item['value'] instanceof Collection
37 1
                    ? new Collection
38 7
                    : $item['value'];
39
40 8
                $count = $values->count();
41
42
                return $quantiles
43 8
                    ->map($this->calculate($values->sort()->values(), $count))
44 8
                    ->map(function (array $item) use ($name, $labels) {
45 8
                        $item['labels'] = $labels + [
46 8
                            'quantile' => $item['quantile'],
47
                        ];
48
49 8
                        return $item + compact('name');
50 8
                    })->push([
51 8
                        'name'   => "{$name}_count",
52 8
                        'value'  => $count,
53 8
                        'labels' => $labels,
54 8
                    ])->push([
55 8
                        'name'   => "{$name}_sum",
56 8
                        'value'  => $values->sum(),
57 8
                        'labels' => $labels,
58
                    ]);
59 8
            });
60
    }
61
62
    /**
63
     * @param Collection $values
64
     * @param int $count
65
     *
66
     * @return Closure
67
     */
68 8
    private function calculate(Collection $values, int $count): Closure
69
    {
70 8
        return function (float $quantile) use ($count, $values) {
71 8
            $position = $count * $quantile;
72 8
            $index = (int) $position;
73
74 8
            $value = floor($position) === $position
75 6
                ? ($values->get($index - 1) + $values->get($index)) / 2
76 7
                : $values->get($index);
77
78 8
            return compact('quantile', 'value');
79 8
        };
80
    }
81
}
82