Completed
Push — develop ( 28a887...d46380 )
by Stan
02:57
created

SummarySamplesBuilder::calculate()   A

Complexity

Conditions 2
Paths 1

Size

Total Lines 10
Code Lines 6

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 6
CRAP Score 2

Importance

Changes 0
Metric Value
cc 2
eloc 6
nc 1
nop 2
dl 0
loc 10
ccs 6
cts 6
cp 1
crap 2
rs 9.4285
c 0
b 0
f 0
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 7
    public function __construct(Summary $summary, Collection $items)
25
    {
26 7
        parent::__construct($summary, $items);
27 7
    }
28
29
    /**
30
     * @return Collection
31
     */
32
    protected function initialize(): Collection
33
    {
34
        return new Collection;
35
    }
36
37
    /**
38
     * {@inheritdoc}
39
     */
40 7
    protected function group(): Collection
41
    {
42
        return parent::group()->collapse()->map(function ($item) {
43
            /** @var Collection $values */
44 7
            $values = $item['value'];
45 7
            $count = $values->count();
46 7
            $labels = $item['labels'];
47
48 7
            return $this->metric
49 7
                ->quantiles()
50 7
                ->map($this->calculate($values->sort()->values(), $count))
51 7
                ->push(compact('count'))
52 7
                ->push(['sum' => $values->sum()])
53
                ->map(function ($item) use ($labels) {
54 7
                    $item['labels'] = $labels;
55
56 7
                    return $item;
57 7
                });
58 7
        });
59
    }
60
61
    /**
62
     * {@inheritdoc}
63
     */
64 7
    protected function build(string $name): Closure
65
    {
66
        return function (array $item) use ($name) {
67 7
            $labels = new Collection($item['labels']);
68
69 7
            if (array_key_exists('count', $item)) {
70 7
                return new Sample("{$name}_count", $item['count'], $labels);
71
            }
72
73 7
            if (array_key_exists('sum', $item)) {
74 7
                return new Sample("{$name}_sum", $item['sum'], $labels);
75
            }
76
77 7
            return new Sample("{$name}", $item['value'], $labels->put('quantile', $item['quantile']));
78 7
        };
79
    }
80
81
    /**
82
     * @param Collection $values
83
     * @param int $count
84
     *
85
     * @return Closure
86
     */
87 7
    private function calculate(Collection $values, int $count): Closure
88
    {
89
        return function (float $quantile) use ($count, $values) {
90 7
            $index = $count * $quantile;
91
92 7
            $value = floor($index) === $index
93 5
                ? ($values[$index - 1] + $values[$index]) / 2
94 7
                : $values[floor($index)];
95
96 7
            return compact('quantile', 'value');
97 7
        };
98
    }
99
}
100