diff --git a/core/Controller/OpenMetricsController.php b/core/Controller/OpenMetricsController.php index 8c57eb1a66335..766abec9329c0 100644 --- a/core/Controller/OpenMetricsController.php +++ b/core/Controller/OpenMetricsController.php @@ -1,6 +1,7 @@ generate(), - Http::STATUS_OK, - [ - 'Content-Type' => 'application/openmetrics-text; version=1.0.0; charset=utf-8', - ] - ); + return new Http\StreamTraversableResponse($this->generate(), Http::STATUS_OK, [ + 'Content-Type' => 'application/openmetrics-text; version=1.0.0; charset=utf-8', + ]); } private function isRemoteAddressAllowed(): bool { @@ -78,7 +75,16 @@ private function isRemoteAddressAllowed(): bool { private function generate(): \Generator { foreach ($this->exporterManager->export() as $family) { - yield $this->formatFamily($family); + try { + yield $this->formatFamily($family); + } catch (\Exception $e) { + // Skip family and return a valid result + $this->logger->error('Exception caught when exporting family {family}', [ + 'app' => 'metrics', + 'family' => $family->name(), + 'exception' => $e, + ]); + } } $elapsed = (string)(microtime(true) - $_SERVER['REQUEST_TIME_FLOAT']); @@ -129,11 +135,7 @@ private function formatLabels(Metric $metric): string { } private function escapeString(string $string): string { - return json_encode( - $string, - JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR, - 1 - ); + return json_encode($string, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_THROW_ON_ERROR, 1); } private function formatValue(Metric $metric): string {