-
-
Notifications
You must be signed in to change notification settings - Fork 5.1k
Expand file tree
/
Copy pathExporterManager.php
More file actions
99 lines (85 loc) · 2.43 KB
/
Copy pathExporterManager.php
File metadata and controls
99 lines (85 loc) · 2.43 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
<?php
declare(strict_types=1);
/**
* SPDX-FileCopyrightText: 2025 Nextcloud GmbH and Nextcloud contributors
* SPDX-License-Identifier: AGPL-3.0-or-later
*/
namespace OC\OpenMetrics;
use Generator;
use OCP\App\IAppManager;
use OCP\IConfig;
use OCP\OpenMetrics\IMetricFamily;
use OCP\Server;
use Psr\Log\LoggerInterface;
class ExporterManager {
private array $skippedClasses;
private const XML_ENTRY = 'openmetrics';
public function __construct(
private IAppManager $appManager,
private LoggerInterface $logger,
IConfig $config,
) {
// Use values as keys for faster lookups
$this->skippedClasses = array_fill_keys($config->getSystemValue('openmetrics_skipped_classes', []), true);
}
public function export(): Generator {
// Core exporters
$exporters = [
// Basic exporters
Exporters\InstanceInfo::class,
Exporters\AppsInfo::class,
Exporters\AppsCount::class,
Exporters\Maintenance::class,
// File exporters
Exporters\FilesByType::class,
// Users exporters
Exporters\ActiveUsers::class,
Exporters\ActiveSessions::class,
Exporters\UsersByBackend::class,
// Jobs
Exporters\RunningJobs::class,
];
$exporters = array_filter($exporters, fn ($classname) => !isset($this->skippedClasses[$classname]));
foreach ($exporters as $classname) {
$exporter = $this->loadExporter($classname);
if ($exporter !== null) {
yield $exporter;
}
}
// Apps exporters
foreach ($this->appManager->getEnabledApps() as $appId) {
$appInfo = $this->appManager->getAppInfo($appId);
if (!isset($appInfo[self::XML_ENTRY]) || !is_array($appInfo[self::XML_ENTRY])) {
continue;
}
foreach ($appInfo[self::XML_ENTRY] as $classEntries) {
// When multiple exporters are specified, $classEntries will be an array, instead of a string
$classnames = is_array($classEntries) ? $classEntries : [$classEntries];
foreach ($classnames as $classname) {
if (isset($this->skippedClasses[$classname])) {
continue;
}
$exporter = $this->loadExporter($classname, $appId);
if ($exporter !== null) {
yield $exporter;
}
}
}
}
}
private function loadExporter(string $classname, string $appId = 'core'): ?IMetricFamily {
try {
return Server::get($classname);
} catch (\Exception $e) {
$this->logger->error(
'Unable to build exporter {exporter}',
[
'app' => $appId,
'exception' => $e,
'exporter' => $classname,
],
);
}
return null;
}
}