diff --git a/src/Prometheus/Storage/APCng.php b/src/Prometheus/Storage/APCng.php index 416a46f..b37cffb 100644 --- a/src/Prometheus/Storage/APCng.php +++ b/src/Prometheus/Storage/APCng.php @@ -430,33 +430,24 @@ private function metaData(array $data): array * [9] => ['/private', 'get', 'fail'], [10] => ['/private', 'post', 'success'], [11] => ['/private', 'post', 'fail'], * [12] => ['/metrics', 'put', 'success'], [13] => ['/metrics', 'put', 'fail'], [14] => ['/metrics', 'get', 'success'], * [15] => ['/metrics', 'get', 'fail'], [16] => ['/metrics', 'post', 'success'], [17] => ['/metrics', 'post', 'fail'] - * @param array $labelNames * @param array $labelValues - * @return array + * @return \Generator */ - private function buildPermutationTree(array $labelNames, array $labelValues): array /** @phpstan-ignore-line */ - { - $treeRowCount = count(array_keys($labelNames)); - $numElements = 1; - $treeInfo = []; - for ($i = $treeRowCount - 1; $i >= 0; $i--) { - $treeInfo[$i]['numInRow'] = count($labelValues[$i]); - $numElements *= $treeInfo[$i]['numInRow']; - $treeInfo[$i]['numInTree'] = $numElements; - } - - $map = array_fill(0, $numElements, []); - for ($row = 0; $row < $treeRowCount; $row++) { - $col = $i = 0; - while ($i < $numElements) { - $val = $labelValues[$row][$col]; - $map[$i] = array_merge($map[$i], array($val)); - if (++$i % ($treeInfo[$row]['numInTree'] / $treeInfo[$row]['numInRow']) == 0) { - $col = ++$col % $treeInfo[$row]['numInRow']; + private function buildPermutationTree(array $labelValues): \Generator /** @phpstan-ignore-line */ + { + if (count($labelValues) > 0) { + $lastIndex = array_key_last($labelValues); + $currentValue = array_pop($labelValues); + if ($currentValue != null) { + foreach ($this->buildPermutationTree($labelValues) as $prefix) { + foreach ($currentValue as $value) { + yield $prefix + [$lastIndex => $value]; + } } } + } else { + yield []; } - return $map; } /** @@ -557,10 +548,9 @@ private function getValues(string $type, array $metaData): array /** @phpstan-ig if (isset($metaData['buckets'])) { $metaData['buckets'][] = 'sum'; $labels[] = $metaData['buckets']; - $metaData['labelNames'][] = '__histogram_buckets'; } - $labelValuesList = $this->buildPermutationTree($metaData['labelNames'], $labels); + $labelValuesList = $this->buildPermutationTree($labels); unset($labels); $histogramBucket = ''; foreach ($labelValuesList as $labelValues) {