SummarySamplesBuilder::parse()   A
last analyzed

Complexity

Conditions 2
Paths 1

Size

Total Lines 32
Code Lines 24

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 23
CRAP Score 2

Importance

Changes 0
Metric Value
eloc 24
c 0
b 0
f 0
nc 1
nop 0
dl 0
loc 32
ccs 23
cts 23
cp 1
cc 2
crap 2
rs 9.536
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