Completed
Push — develop ( d46380...4bf157 )
by Stan
03:03
created

SummarySamplesBuilder   A

Complexity

Total Complexity 8

Size/Duplication

Total Lines 87
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
dl 0
loc 87
ccs 33
cts 33
cp 1
rs 10
c 0
b 0
f 0
wmc 8

5 Methods

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