From 3e5daac0c55d0f325a060a1a9467a154f8189aee Mon Sep 17 00:00:00 2001 From: Jyrki Gadinger Date: Mon, 20 Apr 2026 11:09:20 +0200 Subject: [PATCH 1/3] feat(openmetrics): expose app information per-app Since exporting the app information that way makes the apps count metric obsolete I removed it as well. Resolves #59718 Signed-off-by: Jyrki Gadinger --- lib/composer/composer/autoload_classmap.php | 3 +- lib/composer/composer/autoload_static.php | 3 +- lib/private/OpenMetrics/ExporterManager.php | 6 +- .../Exporters/{AppsInfo.php => AppInfo.php} | 16 ++--- .../OpenMetrics/Exporters/AppsCount.php | 62 ------------------- .../lib/OpenMetrics/Exporters/AppInfoTest.php | 52 ++++++++++++++++ .../OpenMetrics/Exporters/AppsCountTest.php | 38 ------------ .../OpenMetrics/Exporters/AppsInfoTest.php | 37 ----------- 8 files changed, 64 insertions(+), 153 deletions(-) rename lib/private/OpenMetrics/Exporters/{AppsInfo.php => AppInfo.php} (61%) delete mode 100644 lib/private/OpenMetrics/Exporters/AppsCount.php create mode 100644 tests/lib/OpenMetrics/Exporters/AppInfoTest.php delete mode 100644 tests/lib/OpenMetrics/Exporters/AppsCountTest.php delete mode 100644 tests/lib/OpenMetrics/Exporters/AppsInfoTest.php diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 7fb4e2ea6b0..7758a00ca25 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -1950,8 +1950,7 @@ return array( 'OC\\OpenMetrics\\ExporterManager' => $baseDir . '/lib/private/OpenMetrics/ExporterManager.php', 'OC\\OpenMetrics\\Exporters\\ActiveSessions' => $baseDir . '/lib/private/OpenMetrics/Exporters/ActiveSessions.php', 'OC\\OpenMetrics\\Exporters\\ActiveUsers' => $baseDir . '/lib/private/OpenMetrics/Exporters/ActiveUsers.php', - 'OC\\OpenMetrics\\Exporters\\AppsCount' => $baseDir . '/lib/private/OpenMetrics/Exporters/AppsCount.php', - 'OC\\OpenMetrics\\Exporters\\AppsInfo' => $baseDir . '/lib/private/OpenMetrics/Exporters/AppsInfo.php', + 'OC\\OpenMetrics\\Exporters\\AppInfo' => $baseDir . '/lib/private/OpenMetrics/Exporters/AppInfo.php', 'OC\\OpenMetrics\\Exporters\\Cached' => $baseDir . '/lib/private/OpenMetrics/Exporters/Cached.php', 'OC\\OpenMetrics\\Exporters\\FilesByType' => $baseDir . '/lib/private/OpenMetrics/Exporters/FilesByType.php', 'OC\\OpenMetrics\\Exporters\\InstanceInfo' => $baseDir . '/lib/private/OpenMetrics/Exporters/InstanceInfo.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 31ccabdeab4..9599386d532 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -1991,8 +1991,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OC\\OpenMetrics\\ExporterManager' => __DIR__ . '/../../..' . '/lib/private/OpenMetrics/ExporterManager.php', 'OC\\OpenMetrics\\Exporters\\ActiveSessions' => __DIR__ . '/../../..' . '/lib/private/OpenMetrics/Exporters/ActiveSessions.php', 'OC\\OpenMetrics\\Exporters\\ActiveUsers' => __DIR__ . '/../../..' . '/lib/private/OpenMetrics/Exporters/ActiveUsers.php', - 'OC\\OpenMetrics\\Exporters\\AppsCount' => __DIR__ . '/../../..' . '/lib/private/OpenMetrics/Exporters/AppsCount.php', - 'OC\\OpenMetrics\\Exporters\\AppsInfo' => __DIR__ . '/../../..' . '/lib/private/OpenMetrics/Exporters/AppsInfo.php', + 'OC\\OpenMetrics\\Exporters\\AppInfo' => __DIR__ . '/../../..' . '/lib/private/OpenMetrics/Exporters/AppInfo.php', 'OC\\OpenMetrics\\Exporters\\Cached' => __DIR__ . '/../../..' . '/lib/private/OpenMetrics/Exporters/Cached.php', 'OC\\OpenMetrics\\Exporters\\FilesByType' => __DIR__ . '/../../..' . '/lib/private/OpenMetrics/Exporters/FilesByType.php', 'OC\\OpenMetrics\\Exporters\\InstanceInfo' => __DIR__ . '/../../..' . '/lib/private/OpenMetrics/Exporters/InstanceInfo.php', diff --git a/lib/private/OpenMetrics/ExporterManager.php b/lib/private/OpenMetrics/ExporterManager.php index 0b984fb382e..2a7a78d256d 100644 --- a/lib/private/OpenMetrics/ExporterManager.php +++ b/lib/private/OpenMetrics/ExporterManager.php @@ -12,8 +12,7 @@ namespace OC\OpenMetrics; use Generator; use OC\OpenMetrics\Exporters\ActiveSessions; use OC\OpenMetrics\Exporters\ActiveUsers; -use OC\OpenMetrics\Exporters\AppsCount; -use OC\OpenMetrics\Exporters\AppsInfo; +use OC\OpenMetrics\Exporters\AppInfo; use OC\OpenMetrics\Exporters\FilesByType; use OC\OpenMetrics\Exporters\InstanceInfo; use OC\OpenMetrics\Exporters\LogLevel; @@ -44,8 +43,7 @@ class ExporterManager { $exporters = [ // Basic exporters InstanceInfo::class, - AppsInfo::class, - AppsCount::class, + AppInfo::class, Maintenance::class, LogLevel::class, diff --git a/lib/private/OpenMetrics/Exporters/AppsInfo.php b/lib/private/OpenMetrics/Exporters/AppInfo.php similarity index 61% rename from lib/private/OpenMetrics/Exporters/AppsInfo.php rename to lib/private/OpenMetrics/Exporters/AppInfo.php index 0910007c10a..3b70657e695 100644 --- a/lib/private/OpenMetrics/Exporters/AppsInfo.php +++ b/lib/private/OpenMetrics/Exporters/AppInfo.php @@ -17,9 +17,9 @@ use OCP\OpenMetrics\MetricType; use Override; /** - * Export information about enabled applications + * Export information about installed applications */ -class AppsInfo implements IMetricFamily { +class AppInfo implements IMetricFamily { public function __construct( private IAppManager $appManager, ) { @@ -27,12 +27,12 @@ class AppsInfo implements IMetricFamily { #[Override] public function name(): string { - return 'apps_info'; + return 'app_info'; } #[Override] public function type(): MetricType { - return MetricType::info; + return MetricType::gauge; } #[Override] @@ -42,15 +42,15 @@ class AppsInfo implements IMetricFamily { #[Override] public function help(): string { - return 'Enabled applications in Nextcloud'; + return 'Information about the installed Nextcloud applications'; } #[Override] public function metrics(): Generator { $apps = []; - foreach ($this->appManager->getAppInstalledVersions(true) as $appId => $version) { - $apps[str_replace('-', '_', $appId)] = $version; + $enabledApps = $this->appManager->getEnabledApps(); + foreach ($this->appManager->getAppInstalledVersions(false) as $appId => $version) { + yield new Metric(in_array($appId, $enabledApps, true) ? 1 : 0, ['app_name' => $appId, 'version' => $version]); } - yield new Metric(1, $apps, time()); } } diff --git a/lib/private/OpenMetrics/Exporters/AppsCount.php b/lib/private/OpenMetrics/Exporters/AppsCount.php deleted file mode 100644 index f011bea6956..00000000000 --- a/lib/private/OpenMetrics/Exporters/AppsCount.php +++ /dev/null @@ -1,62 +0,0 @@ -appManager->getAppInstalledVersions(false)); - $enabledAppsCount = count($this->appManager->getEnabledApps()); - $disabledAppsCount = $installedAppsCount - $enabledAppsCount; - yield new Metric( - $disabledAppsCount, - ['status' => 'disabled'], - ); - yield new Metric( - $enabledAppsCount, - ['status' => 'enabled'], - ); - } -} diff --git a/tests/lib/OpenMetrics/Exporters/AppInfoTest.php b/tests/lib/OpenMetrics/Exporters/AppInfoTest.php new file mode 100644 index 00000000000..79a4eb525de --- /dev/null +++ b/tests/lib/OpenMetrics/Exporters/AppInfoTest.php @@ -0,0 +1,52 @@ + '0.1.2', + 'appB' => '1.2.3 beta 4', + 'appC' => '6.2.1', + 'appD' => '3.141.5', + ]; + private array $installedAppsList = [ + 'appA', 'appB', 'appD' + ]; + + protected function getExporter():IMetricFamily { + $this->appManager = $this->createMock(IAppManager::class); + $this->appManager->method('getAppInstalledVersions') + ->with(false) + ->willReturn($this->appList); + $this->appManager->method('getEnabledApps') + ->willReturn($this->installedAppsList); + + return new AppInfo($this->appManager); + } + + public function testMetrics(): void { + $this->assertCount(4, $this->metrics); + foreach ($this->appList as $appName => $appVersion) { + $metricForApp = array_find($this->metrics, function (Metric $metric) use ($appName) { + return $metric->label('app_name') === $appName; + }); + + $expectedMetricValue = in_array($appName, $this->installedAppsList) ? 1 : 0; + $this->assertEquals($expectedMetricValue, $metricForApp->value); + $this->assertSame(['app_name' => $appName, 'version' => $appVersion], $metricForApp->labels); + } + } +} diff --git a/tests/lib/OpenMetrics/Exporters/AppsCountTest.php b/tests/lib/OpenMetrics/Exporters/AppsCountTest.php deleted file mode 100644 index c1617e1ba1d..00000000000 --- a/tests/lib/OpenMetrics/Exporters/AppsCountTest.php +++ /dev/null @@ -1,38 +0,0 @@ -appManager = $this->createMock(IAppManager::class); - $this->appManager->method('getAppInstalledVersions') - ->with(false) - ->willReturn(['app1', 'app2', 'app3', 'app4', 'app5']); - $this->appManager->method('getEnabledApps') - ->willReturn(['app1', 'app2', 'app3']); - return new AppsCount($this->appManager); - } - - public function testMetrics(): void { - foreach ($this->metrics as $metric) { - $expectedValue = match ($metric->label('status')) { - 'disabled' => 2, - 'enabled' => 3, - }; - $this->assertEquals($expectedValue, $metric->value); - } - } -} diff --git a/tests/lib/OpenMetrics/Exporters/AppsInfoTest.php b/tests/lib/OpenMetrics/Exporters/AppsInfoTest.php deleted file mode 100644 index 5baa85af3f9..00000000000 --- a/tests/lib/OpenMetrics/Exporters/AppsInfoTest.php +++ /dev/null @@ -1,37 +0,0 @@ - '0.1.2', - 'appB' => '1.2.3 beta 4', - ]; - - protected function getExporter():IMetricFamily { - $this->appManager = $this->createMock(IAppManager::class); - $this->appManager->method('getAppInstalledVersions') - ->with(true) - ->willReturn($this->appList); - - return new AppsInfo($this->appManager); - } - - public function testMetrics(): void { - $this->assertCount(1, $this->metrics); - $metric = array_pop($this->metrics); - $this->assertSame($this->appList, $metric->labels); - } -} From e7b1b69e664657a5b9e81fa195f7eec7e936eb3f Mon Sep 17 00:00:00 2001 From: Jyrki Gadinger Date: Mon, 20 Apr 2026 11:38:44 +0200 Subject: [PATCH 2/3] chore(openmetrics): use "app_id" label instead of "app_name" Signed-off-by: Jyrki Gadinger --- lib/private/OpenMetrics/Exporters/AppInfo.php | 2 +- tests/lib/OpenMetrics/Exporters/AppInfoTest.php | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/private/OpenMetrics/Exporters/AppInfo.php b/lib/private/OpenMetrics/Exporters/AppInfo.php index 3b70657e695..c55ae058072 100644 --- a/lib/private/OpenMetrics/Exporters/AppInfo.php +++ b/lib/private/OpenMetrics/Exporters/AppInfo.php @@ -50,7 +50,7 @@ class AppInfo implements IMetricFamily { $apps = []; $enabledApps = $this->appManager->getEnabledApps(); foreach ($this->appManager->getAppInstalledVersions(false) as $appId => $version) { - yield new Metric(in_array($appId, $enabledApps, true) ? 1 : 0, ['app_name' => $appId, 'version' => $version]); + yield new Metric(in_array($appId, $enabledApps, true) ? 1 : 0, ['app_id' => $appId, 'version' => $version]); } } } diff --git a/tests/lib/OpenMetrics/Exporters/AppInfoTest.php b/tests/lib/OpenMetrics/Exporters/AppInfoTest.php index 79a4eb525de..59737294cde 100644 --- a/tests/lib/OpenMetrics/Exporters/AppInfoTest.php +++ b/tests/lib/OpenMetrics/Exporters/AppInfoTest.php @@ -39,14 +39,14 @@ class AppInfoTest extends ExporterTestCase { public function testMetrics(): void { $this->assertCount(4, $this->metrics); - foreach ($this->appList as $appName => $appVersion) { - $metricForApp = array_find($this->metrics, function (Metric $metric) use ($appName) { - return $metric->label('app_name') === $appName; + foreach ($this->appList as $appId => $appVersion) { + $metricForApp = array_find($this->metrics, function (Metric $metric) use ($appId) { + return $metric->label('app_id') === $appId; }); - $expectedMetricValue = in_array($appName, $this->installedAppsList) ? 1 : 0; + $expectedMetricValue = in_array($appId, $this->installedAppsList) ? 1 : 0; $this->assertEquals($expectedMetricValue, $metricForApp->value); - $this->assertSame(['app_name' => $appName, 'version' => $appVersion], $metricForApp->labels); + $this->assertSame(['app_id' => $appId, 'version' => $appVersion], $metricForApp->labels); } } } From 3183aa0ad0169a4b675500a15079a2b491053a77 Mon Sep 17 00:00:00 2001 From: Jyrki Gadinger Date: Mon, 20 Apr 2026 11:41:19 +0200 Subject: [PATCH 3/3] chore(openmetrics): rename app_info metric to app_enbled Signed-off-by: Jyrki Gadinger --- lib/composer/composer/autoload_classmap.php | 2 +- lib/composer/composer/autoload_static.php | 2 +- lib/private/OpenMetrics/ExporterManager.php | 4 ++-- .../OpenMetrics/Exporters/{AppInfo.php => AppEnabled.php} | 4 ++-- .../Exporters/{AppInfoTest.php => AppEnabledTest.php} | 6 +++--- 5 files changed, 9 insertions(+), 9 deletions(-) rename lib/private/OpenMetrics/Exporters/{AppInfo.php => AppEnabled.php} (94%) rename tests/lib/OpenMetrics/Exporters/{AppInfoTest.php => AppEnabledTest.php} (91%) diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php index 7758a00ca25..057a7e57772 100644 --- a/lib/composer/composer/autoload_classmap.php +++ b/lib/composer/composer/autoload_classmap.php @@ -1950,7 +1950,7 @@ return array( 'OC\\OpenMetrics\\ExporterManager' => $baseDir . '/lib/private/OpenMetrics/ExporterManager.php', 'OC\\OpenMetrics\\Exporters\\ActiveSessions' => $baseDir . '/lib/private/OpenMetrics/Exporters/ActiveSessions.php', 'OC\\OpenMetrics\\Exporters\\ActiveUsers' => $baseDir . '/lib/private/OpenMetrics/Exporters/ActiveUsers.php', - 'OC\\OpenMetrics\\Exporters\\AppInfo' => $baseDir . '/lib/private/OpenMetrics/Exporters/AppInfo.php', + 'OC\\OpenMetrics\\Exporters\\AppEnabled' => $baseDir . '/lib/private/OpenMetrics/Exporters/AppEnabled.php', 'OC\\OpenMetrics\\Exporters\\Cached' => $baseDir . '/lib/private/OpenMetrics/Exporters/Cached.php', 'OC\\OpenMetrics\\Exporters\\FilesByType' => $baseDir . '/lib/private/OpenMetrics/Exporters/FilesByType.php', 'OC\\OpenMetrics\\Exporters\\InstanceInfo' => $baseDir . '/lib/private/OpenMetrics/Exporters/InstanceInfo.php', diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php index 9599386d532..2e7a0d8c040 100644 --- a/lib/composer/composer/autoload_static.php +++ b/lib/composer/composer/autoload_static.php @@ -1991,7 +1991,7 @@ class ComposerStaticInit749170dad3f5e7f9ca158f5a9f04f6a2 'OC\\OpenMetrics\\ExporterManager' => __DIR__ . '/../../..' . '/lib/private/OpenMetrics/ExporterManager.php', 'OC\\OpenMetrics\\Exporters\\ActiveSessions' => __DIR__ . '/../../..' . '/lib/private/OpenMetrics/Exporters/ActiveSessions.php', 'OC\\OpenMetrics\\Exporters\\ActiveUsers' => __DIR__ . '/../../..' . '/lib/private/OpenMetrics/Exporters/ActiveUsers.php', - 'OC\\OpenMetrics\\Exporters\\AppInfo' => __DIR__ . '/../../..' . '/lib/private/OpenMetrics/Exporters/AppInfo.php', + 'OC\\OpenMetrics\\Exporters\\AppEnabled' => __DIR__ . '/../../..' . '/lib/private/OpenMetrics/Exporters/AppEnabled.php', 'OC\\OpenMetrics\\Exporters\\Cached' => __DIR__ . '/../../..' . '/lib/private/OpenMetrics/Exporters/Cached.php', 'OC\\OpenMetrics\\Exporters\\FilesByType' => __DIR__ . '/../../..' . '/lib/private/OpenMetrics/Exporters/FilesByType.php', 'OC\\OpenMetrics\\Exporters\\InstanceInfo' => __DIR__ . '/../../..' . '/lib/private/OpenMetrics/Exporters/InstanceInfo.php', diff --git a/lib/private/OpenMetrics/ExporterManager.php b/lib/private/OpenMetrics/ExporterManager.php index 2a7a78d256d..38984a173a4 100644 --- a/lib/private/OpenMetrics/ExporterManager.php +++ b/lib/private/OpenMetrics/ExporterManager.php @@ -12,7 +12,7 @@ namespace OC\OpenMetrics; use Generator; use OC\OpenMetrics\Exporters\ActiveSessions; use OC\OpenMetrics\Exporters\ActiveUsers; -use OC\OpenMetrics\Exporters\AppInfo; +use OC\OpenMetrics\Exporters\AppEnabled; use OC\OpenMetrics\Exporters\FilesByType; use OC\OpenMetrics\Exporters\InstanceInfo; use OC\OpenMetrics\Exporters\LogLevel; @@ -43,7 +43,7 @@ class ExporterManager { $exporters = [ // Basic exporters InstanceInfo::class, - AppInfo::class, + AppEnabled::class, Maintenance::class, LogLevel::class, diff --git a/lib/private/OpenMetrics/Exporters/AppInfo.php b/lib/private/OpenMetrics/Exporters/AppEnabled.php similarity index 94% rename from lib/private/OpenMetrics/Exporters/AppInfo.php rename to lib/private/OpenMetrics/Exporters/AppEnabled.php index c55ae058072..cc4a84f4266 100644 --- a/lib/private/OpenMetrics/Exporters/AppInfo.php +++ b/lib/private/OpenMetrics/Exporters/AppEnabled.php @@ -19,7 +19,7 @@ use Override; /** * Export information about installed applications */ -class AppInfo implements IMetricFamily { +class AppEnabled implements IMetricFamily { public function __construct( private IAppManager $appManager, ) { @@ -27,7 +27,7 @@ class AppInfo implements IMetricFamily { #[Override] public function name(): string { - return 'app_info'; + return 'app_enabled'; } #[Override] diff --git a/tests/lib/OpenMetrics/Exporters/AppInfoTest.php b/tests/lib/OpenMetrics/Exporters/AppEnabledTest.php similarity index 91% rename from tests/lib/OpenMetrics/Exporters/AppInfoTest.php rename to tests/lib/OpenMetrics/Exporters/AppEnabledTest.php index 59737294cde..3dba47768f6 100644 --- a/tests/lib/OpenMetrics/Exporters/AppInfoTest.php +++ b/tests/lib/OpenMetrics/Exporters/AppEnabledTest.php @@ -9,12 +9,12 @@ declare(strict_types=1); namespace Test\OpenMetrics\Exporters; -use OC\OpenMetrics\Exporters\AppInfo; +use OC\OpenMetrics\Exporters\AppEnabled; use OCP\App\IAppManager; use OCP\OpenMetrics\IMetricFamily; use OCP\OpenMetrics\Metric; -class AppInfoTest extends ExporterTestCase { +class AppEnabledTest extends ExporterTestCase { private IAppManager $appManager; private array $appList = [ 'appA' => '0.1.2', @@ -34,7 +34,7 @@ class AppInfoTest extends ExporterTestCase { $this->appManager->method('getEnabledApps') ->willReturn($this->installedAppsList); - return new AppInfo($this->appManager); + return new AppEnabled($this->appManager); } public function testMetrics(): void {