- Add DISCOVERY_LOG_LEVEL=debug - Add DISCOVERY_SHOW_PROGRESS=true - Temporary changes for debugging InitializerProcessor fixes on production
761 lines
22 KiB
Markdown
761 lines
22 KiB
Markdown
# Analytics Framework Beispiele
|
|
|
|
> **Dokumentationshinweis:** Diese Dokumentation ist vollständig aktualisiert und stellt die aktuelle Implementierung des Analytics Frameworks korrekt dar.
|
|
|
|
## Übersicht
|
|
|
|
Diese Dokumentation enthält praktische Beispiele für die Verwendung des Analytics Frameworks in verschiedenen Szenarien. Die Beispiele zeigen, wie Sie Analytics-Daten erfassen, analysieren und in Ihre Anwendung integrieren können.
|
|
|
|
## Grundlegende Verwendung
|
|
|
|
### Benutzeraktionen erfassen
|
|
|
|
```php
|
|
use App\Framework\Analytics\AnalyticsCollector;
|
|
use App\Framework\Analytics\AnalyticsCategory;
|
|
|
|
class UserController
|
|
{
|
|
public function __construct(
|
|
private readonly AnalyticsCollector $analyticsCollector
|
|
) {}
|
|
|
|
public function handleLogin(Request $request): Response
|
|
{
|
|
// Login-Logik
|
|
$success = $this->authService->login($request->getParam('email'), $request->getParam('password'));
|
|
|
|
// Login-Aktion erfassen
|
|
$this->analyticsCollector->trackAction(
|
|
'user_login',
|
|
AnalyticsCategory::USER,
|
|
[
|
|
'success' => $success,
|
|
'email_domain' => explode('@', $request->getParam('email'))[1] ?? 'unknown',
|
|
'ip' => $request->getClientIp(),
|
|
'user_agent' => $request->getUserAgent()
|
|
]
|
|
);
|
|
|
|
// Antwort zurückgeben
|
|
return $success
|
|
? $this->redirect('/dashboard')
|
|
: $this->renderForm('login', ['error' => 'Ungültige Anmeldedaten']);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Seitenaufrufe erfassen
|
|
|
|
```php
|
|
use App\Framework\Analytics\AnalyticsCollector;
|
|
|
|
class ProductController
|
|
{
|
|
public function __construct(
|
|
private readonly AnalyticsCollector $analyticsCollector,
|
|
private readonly ProductRepository $productRepository
|
|
) {}
|
|
|
|
public function showProduct(Request $request, string $productId): Response
|
|
{
|
|
$product = $this->productRepository->find($productId);
|
|
|
|
if (!$product) {
|
|
return $this->notFound();
|
|
}
|
|
|
|
// Seitenaufruf erfassen
|
|
$this->analyticsCollector->trackPageView(
|
|
"/products/{$productId}",
|
|
[
|
|
'product_id' => $productId,
|
|
'product_name' => $product->name,
|
|
'product_category' => $product->category,
|
|
'referrer' => $request->getHeader('Referer'),
|
|
'user_id' => $this->session->get('user_id')
|
|
]
|
|
);
|
|
|
|
return $this->render('product', ['product' => $product]);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Fehler erfassen
|
|
|
|
```php
|
|
use App\Framework\Analytics\AnalyticsCollector;
|
|
|
|
class ErrorHandler
|
|
{
|
|
public function __construct(
|
|
private readonly AnalyticsCollector $analyticsCollector,
|
|
private readonly Logger $logger
|
|
) {}
|
|
|
|
public function handleException(\Throwable $exception): Response
|
|
{
|
|
// Fehler loggen
|
|
$this->logger->error('Unbehandelte Ausnahme: ' . $exception->getMessage(), [
|
|
'exception' => $exception
|
|
]);
|
|
|
|
// Fehler für Analytics erfassen
|
|
$this->analyticsCollector->trackError(
|
|
get_class($exception),
|
|
[
|
|
'message' => $exception->getMessage(),
|
|
'file' => $exception->getFile(),
|
|
'line' => $exception->getLine(),
|
|
'trace' => $exception->getTraceAsString(),
|
|
'request_uri' => $_SERVER['REQUEST_URI'] ?? null,
|
|
'user_id' => $this->session->get('user_id')
|
|
]
|
|
);
|
|
|
|
// Fehlerseite anzeigen
|
|
return new Response(500, [], 'Ein Fehler ist aufgetreten');
|
|
}
|
|
}
|
|
```
|
|
|
|
### Geschäftsereignisse erfassen
|
|
|
|
```php
|
|
use App\Framework\Analytics\AnalyticsCollector;
|
|
|
|
class OrderService
|
|
{
|
|
public function __construct(
|
|
private readonly AnalyticsCollector $analyticsCollector,
|
|
private readonly OrderRepository $orderRepository
|
|
) {}
|
|
|
|
public function placeOrder(Order $order): bool
|
|
{
|
|
// Bestellung speichern
|
|
$success = $this->orderRepository->save($order);
|
|
|
|
if ($success) {
|
|
// Geschäftsereignis erfassen
|
|
$this->analyticsCollector->trackBusinessEvent(
|
|
'order_placed',
|
|
[
|
|
'order_id' => $order->id,
|
|
'user_id' => $order->userId,
|
|
'total_amount' => $order->totalAmount,
|
|
'items_count' => count($order->items),
|
|
'payment_method' => $order->paymentMethod,
|
|
'shipping_country' => $order->shippingAddress->country
|
|
]
|
|
);
|
|
}
|
|
|
|
return $success;
|
|
}
|
|
}
|
|
```
|
|
|
|
### API-Aufrufe erfassen
|
|
|
|
```php
|
|
use App\Framework\Analytics\AnalyticsCollector;
|
|
|
|
class ApiClient
|
|
{
|
|
public function __construct(
|
|
private readonly AnalyticsCollector $analyticsCollector,
|
|
private readonly HttpClient $httpClient
|
|
) {}
|
|
|
|
public function sendRequest(string $endpoint, string $method, array $data = []): Response
|
|
{
|
|
$startTime = microtime(true);
|
|
|
|
try {
|
|
$response = $this->httpClient->request($method, $endpoint, $data);
|
|
$statusCode = $response->getStatusCode();
|
|
$success = $statusCode >= 200 && $statusCode < 300;
|
|
} catch (\Exception $e) {
|
|
$statusCode = 0;
|
|
$success = false;
|
|
}
|
|
|
|
$duration = (microtime(true) - $startTime) * 1000; // in ms
|
|
|
|
// API-Aufruf erfassen
|
|
$this->analyticsCollector->trackApiCall(
|
|
$endpoint,
|
|
$method,
|
|
$statusCode,
|
|
[
|
|
'duration' => $duration,
|
|
'success' => $success,
|
|
'data_size' => strlen(json_encode($data)),
|
|
'user_id' => $this->session->get('user_id')
|
|
]
|
|
);
|
|
|
|
return $response;
|
|
}
|
|
}
|
|
```
|
|
|
|
## Fortgeschrittene Verwendung
|
|
|
|
### Automatische Erfassung mit Middleware
|
|
|
|
Die `AnalyticsMiddleware` erfasst automatisch Seitenaufrufe und API-Aufrufe:
|
|
|
|
```php
|
|
use App\Framework\Analytics\Middleware\AnalyticsMiddleware;
|
|
|
|
// In der Bootstrap-Datei oder Router-Konfiguration
|
|
$app->addMiddleware(AnalyticsMiddleware::class);
|
|
```
|
|
|
|
Anpassung der Middleware für bestimmte Routen:
|
|
|
|
```php
|
|
use App\Framework\Analytics\Middleware\AnalyticsMiddleware;
|
|
use App\Framework\Http\MiddlewareContext;
|
|
use App\Framework\Http\Next;
|
|
|
|
class CustomAnalyticsMiddleware extends AnalyticsMiddleware
|
|
{
|
|
public function __invoke(MiddlewareContext $context, Next $next): MiddlewareContext
|
|
{
|
|
$request = $context->request;
|
|
|
|
// Bestimmte Routen ausschließen
|
|
if (str_starts_with($request->path, '/api/health') || str_starts_with($request->path, '/static/')) {
|
|
return $next($context);
|
|
}
|
|
|
|
// Zusätzliche Daten für bestimmte Routen hinzufügen
|
|
$additionalData = [];
|
|
if (str_starts_with($request->path, '/products/')) {
|
|
$productId = substr($request->path, 10);
|
|
$additionalData['product_id'] = $productId;
|
|
}
|
|
|
|
// Standardverhalten mit zusätzlichen Daten
|
|
return parent::__invoke($context, $next, $additionalData);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Sicherheitsereignisse erfassen
|
|
|
|
Integration mit dem Security-System:
|
|
|
|
```php
|
|
use App\Framework\Analytics\Listeners\SecurityAnalyticsListener;
|
|
use App\Framework\Analytics\Bridges\SecurityEventBridge;
|
|
use App\Framework\Security\Events\LoginAttemptEvent;
|
|
|
|
// In der Bootstrap-Datei
|
|
$securityEventBridge = SecurityEventBridge::create(
|
|
$container->get(SecurityAnalyticsListener::class),
|
|
$config->securityAnalyticsEnabled
|
|
);
|
|
|
|
$eventDispatcher->addListener(LoginAttemptEvent::class, [$securityEventBridge, 'handleSecurityEvent']);
|
|
```
|
|
|
|
Benutzerdefinierter Security-Event-Listener:
|
|
|
|
```php
|
|
use App\Framework\Analytics\AnalyticsCollector;
|
|
use App\Framework\Analytics\AnalyticsCategory;
|
|
use App\Framework\Security\Events\LoginAttemptEvent;
|
|
|
|
class LoginAnalyticsListener
|
|
{
|
|
public function __construct(
|
|
private readonly AnalyticsCollector $analyticsCollector
|
|
) {}
|
|
|
|
public function onLoginAttempt(LoginAttemptEvent $event): void
|
|
{
|
|
$this->analyticsCollector->trackAction(
|
|
'login_attempt',
|
|
AnalyticsCategory::SECURITY,
|
|
[
|
|
'username' => $event->getUsername(),
|
|
'success' => $event->isSuccessful(),
|
|
'ip' => $event->getIp(),
|
|
'user_agent' => $event->getUserAgent(),
|
|
'timestamp' => $event->getTimestamp()->format('Y-m-d H:i:s')
|
|
]
|
|
);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Asynchrone Datenerfassung
|
|
|
|
Für maximale Leistung kann die Analytics-Datenerfassung asynchron erfolgen:
|
|
|
|
```php
|
|
use App\Framework\Analytics\AsyncAnalyticsCollector;
|
|
use App\Framework\Queue\QueueInterface;
|
|
|
|
class AsyncAnalyticsService
|
|
{
|
|
public function __construct(
|
|
private readonly AnalyticsCollector $analyticsCollector,
|
|
private readonly QueueInterface $queue
|
|
) {}
|
|
|
|
public function initialize(): void
|
|
{
|
|
// Asynchronen Collector erstellen
|
|
$asyncCollector = new AsyncAnalyticsCollector(
|
|
$this->analyticsCollector,
|
|
$this->queue
|
|
);
|
|
|
|
// Asynchronen Collector registrieren
|
|
$this->container->set(AnalyticsCollector::class, $asyncCollector);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Benutzerdefinierte Ereignistypen
|
|
|
|
Sie können benutzerdefinierte Ereignistypen für spezifische Anforderungen erstellen:
|
|
|
|
```php
|
|
use App\Framework\Analytics\AnalyticsCollector;
|
|
use App\Framework\Analytics\AnalyticsCategory;
|
|
|
|
class CustomAnalyticsService
|
|
{
|
|
public function __construct(
|
|
private readonly AnalyticsCollector $analyticsCollector
|
|
) {}
|
|
|
|
public function trackProductView(string $productId, string $productName, string $category): void
|
|
{
|
|
$this->analyticsCollector->trackAction(
|
|
'product_view',
|
|
AnalyticsCategory::BUSINESS,
|
|
[
|
|
'product_id' => $productId,
|
|
'product_name' => $productName,
|
|
'category' => $category,
|
|
'timestamp' => time(),
|
|
'user_id' => $this->session->get('user_id')
|
|
]
|
|
);
|
|
}
|
|
|
|
public function trackAddToCart(string $productId, int $quantity, float $price): void
|
|
{
|
|
$this->analyticsCollector->trackAction(
|
|
'add_to_cart',
|
|
AnalyticsCategory::BUSINESS,
|
|
[
|
|
'product_id' => $productId,
|
|
'quantity' => $quantity,
|
|
'price' => $price,
|
|
'total' => $quantity * $price,
|
|
'timestamp' => time(),
|
|
'user_id' => $this->session->get('user_id')
|
|
]
|
|
);
|
|
}
|
|
}
|
|
```
|
|
|
|
## Datenanalyse
|
|
|
|
### Rohdaten abfragen
|
|
|
|
```php
|
|
use App\Framework\Analytics\Storage\AnalyticsStorage;
|
|
|
|
class AnalyticsReportService
|
|
{
|
|
public function __construct(
|
|
private readonly AnalyticsStorage $analyticsStorage
|
|
) {}
|
|
|
|
public function getPageViewsReport(\DateTimeInterface $from, \DateTimeInterface $to): array
|
|
{
|
|
// Rohdaten für Seitenaufrufe abrufen
|
|
$pageViews = $this->analyticsStorage->getRawData(
|
|
'page_view',
|
|
$from,
|
|
$to
|
|
);
|
|
|
|
// Daten nach Seite gruppieren
|
|
$pageViewsByPath = [];
|
|
foreach ($pageViews as $pageView) {
|
|
$path = $pageView['path'] ?? 'unknown';
|
|
if (!isset($pageViewsByPath[$path])) {
|
|
$pageViewsByPath[$path] = 0;
|
|
}
|
|
$pageViewsByPath[$path]++;
|
|
}
|
|
|
|
// Nach Anzahl sortieren
|
|
arsort($pageViewsByPath);
|
|
|
|
return $pageViewsByPath;
|
|
}
|
|
|
|
public function getUserActivityReport(string $userId, \DateTimeInterface $from, \DateTimeInterface $to): array
|
|
{
|
|
// Alle Aktionen für einen bestimmten Benutzer abrufen
|
|
$actions = $this->analyticsStorage->getRawData(
|
|
'user_action',
|
|
$from,
|
|
$to,
|
|
['user_id' => $userId]
|
|
);
|
|
|
|
// Nach Zeitstempel sortieren
|
|
usort($actions, function ($a, $b) {
|
|
return $a['timestamp'] <=> $b['timestamp'];
|
|
});
|
|
|
|
return $actions;
|
|
}
|
|
}
|
|
```
|
|
|
|
### Aggregierte Daten abfragen
|
|
|
|
```php
|
|
use App\Framework\Analytics\Storage\AnalyticsStorage;
|
|
|
|
class PerformanceReportService
|
|
{
|
|
public function __construct(
|
|
private readonly AnalyticsStorage $analyticsStorage
|
|
) {}
|
|
|
|
public function getApiPerformanceReport(\DateTimeInterface $from, \DateTimeInterface $to): array
|
|
{
|
|
// Aggregierte Daten für API-Aufrufe abrufen
|
|
$apiCallStats = $this->analyticsStorage->getAggregatedData(
|
|
'analytics_api_calls_total',
|
|
$from,
|
|
$to
|
|
);
|
|
|
|
// Durchschnittliche Antwortzeit pro Endpunkt berechnen
|
|
$responseTimeByEndpoint = [];
|
|
foreach ($apiCallStats as $stat) {
|
|
$endpoint = $stat['tags']['path'] ?? 'unknown';
|
|
$method = $stat['tags']['method'] ?? 'unknown';
|
|
$key = "{$method} {$endpoint}";
|
|
|
|
if (!isset($responseTimeByEndpoint[$key])) {
|
|
$responseTimeByEndpoint[$key] = [
|
|
'count' => 0,
|
|
'total_time' => 0,
|
|
'min_time' => PHP_FLOAT_MAX,
|
|
'max_time' => 0,
|
|
];
|
|
}
|
|
|
|
$duration = $stat['tags']['duration'] ?? 0;
|
|
$responseTimeByEndpoint[$key]['count']++;
|
|
$responseTimeByEndpoint[$key]['total_time'] += $duration;
|
|
$responseTimeByEndpoint[$key]['min_time'] = min($responseTimeByEndpoint[$key]['min_time'], $duration);
|
|
$responseTimeByEndpoint[$key]['max_time'] = max($responseTimeByEndpoint[$key]['max_time'], $duration);
|
|
}
|
|
|
|
// Durchschnitt berechnen
|
|
foreach ($responseTimeByEndpoint as $key => $data) {
|
|
$responseTimeByEndpoint[$key]['avg_time'] = $data['total_time'] / $data['count'];
|
|
}
|
|
|
|
// Nach durchschnittlicher Antwortzeit sortieren
|
|
uasort($responseTimeByEndpoint, function ($a, $b) {
|
|
return $b['avg_time'] <=> $a['avg_time'];
|
|
});
|
|
|
|
return $responseTimeByEndpoint;
|
|
}
|
|
}
|
|
```
|
|
|
|
### Dashboard-Integration
|
|
|
|
```php
|
|
use App\Framework\Analytics\Dashboard\AnalyticsDashboard;
|
|
|
|
class AdminController
|
|
{
|
|
public function __construct(
|
|
private readonly AnalyticsDashboard $dashboard,
|
|
private readonly TemplateEngine $templateEngine
|
|
) {}
|
|
|
|
public function showDashboard(Request $request): Response
|
|
{
|
|
// Zeitraum aus Anfrage oder Standardwerte
|
|
$from = new \DateTimeImmutable($request->getQueryParam('from', '-7 days'));
|
|
$to = new \DateTimeImmutable($request->getQueryParam('to', 'now'));
|
|
|
|
// Dashboard-Daten abrufen
|
|
$stats = $this->dashboard->getStats($from, $to);
|
|
|
|
// Spezifische Statistiken abrufen
|
|
$pageViewStats = $this->dashboard->getPageViewStats($from, $to);
|
|
$errorStats = $this->dashboard->getErrorStats($from, $to);
|
|
$performanceStats = $this->dashboard->getPerformanceStats($from, $to);
|
|
$businessStats = $this->dashboard->getBusinessStats($from, $to);
|
|
|
|
// Dashboard rendern
|
|
return $this->templateEngine->render('admin/dashboard', [
|
|
'stats' => $stats,
|
|
'pageViewStats' => $pageViewStats,
|
|
'errorStats' => $errorStats,
|
|
'performanceStats' => $performanceStats,
|
|
'businessStats' => $businessStats,
|
|
'from' => $from,
|
|
'to' => $to
|
|
]);
|
|
}
|
|
}
|
|
```
|
|
|
|
## Datenexport
|
|
|
|
### CSV-Export
|
|
|
|
```php
|
|
use App\Framework\Analytics\Export\AnalyticsExporter;
|
|
|
|
class ExportController
|
|
{
|
|
public function __construct(
|
|
private readonly AnalyticsExporter $exporter
|
|
) {}
|
|
|
|
public function exportPageViews(Request $request): Response
|
|
{
|
|
// Zeitraum aus Anfrage
|
|
$from = new \DateTimeImmutable($request->getQueryParam('from', '-7 days'));
|
|
$to = new \DateTimeImmutable($request->getQueryParam('to', 'now'));
|
|
|
|
// Daten exportieren
|
|
$csvData = $this->exporter->exportToCsv(
|
|
'page_view',
|
|
$from,
|
|
$to
|
|
);
|
|
|
|
// CSV-Datei zurückgeben
|
|
return new Response(
|
|
200,
|
|
[
|
|
'Content-Type' => 'text/csv',
|
|
'Content-Disposition' => 'attachment; filename="page_views.csv"'
|
|
],
|
|
$csvData
|
|
);
|
|
}
|
|
}
|
|
```
|
|
|
|
### JSON-Export
|
|
|
|
```php
|
|
use App\Framework\Analytics\Export\AnalyticsExporter;
|
|
|
|
class ApiController
|
|
{
|
|
public function __construct(
|
|
private readonly AnalyticsExporter $exporter
|
|
) {}
|
|
|
|
public function getAnalyticsData(Request $request): Response
|
|
{
|
|
// Parameter aus Anfrage
|
|
$eventType = $request->getQueryParam('type', 'page_view');
|
|
$from = new \DateTimeImmutable($request->getQueryParam('from', '-7 days'));
|
|
$to = new \DateTimeImmutable($request->getQueryParam('to', 'now'));
|
|
|
|
// Daten exportieren
|
|
$data = $this->exporter->exportToArray(
|
|
$eventType,
|
|
$from,
|
|
$to
|
|
);
|
|
|
|
// JSON-Daten zurückgeben
|
|
return new Response(
|
|
200,
|
|
['Content-Type' => 'application/json'],
|
|
json_encode($data)
|
|
);
|
|
}
|
|
}
|
|
```
|
|
|
|
## Integration mit anderen Systemen
|
|
|
|
### Event-System-Integration
|
|
|
|
```php
|
|
use App\Framework\Analytics\EventSubscribers\AnalyticsEventSubscriber;
|
|
use App\Framework\EventDispatcher\EventDispatcherInterface;
|
|
|
|
class AnalyticsBootstrap
|
|
{
|
|
public function initialize(EventDispatcherInterface $eventDispatcher): void
|
|
{
|
|
// Analytics-Event-Subscriber registrieren
|
|
$eventDispatcher->addSubscriber(new AnalyticsEventSubscriber(
|
|
$this->container->get(AnalyticsCollector::class)
|
|
));
|
|
}
|
|
}
|
|
```
|
|
|
|
### Externe Analytics-Integration
|
|
|
|
```php
|
|
use App\Framework\Analytics\AnalyticsCollector;
|
|
use App\Framework\Analytics\AnalyticsCategory;
|
|
|
|
class ExternalAnalyticsService
|
|
{
|
|
public function __construct(
|
|
private readonly AnalyticsCollector $analyticsCollector,
|
|
private readonly ExternalAnalyticsClient $externalClient
|
|
) {}
|
|
|
|
public function trackEvent(string $eventName, array $properties): void
|
|
{
|
|
// Intern erfassen
|
|
$this->analyticsCollector->trackAction(
|
|
$eventName,
|
|
AnalyticsCategory::BUSINESS,
|
|
$properties
|
|
);
|
|
|
|
// An externes System senden
|
|
$this->externalClient->trackEvent($eventName, $properties);
|
|
}
|
|
|
|
public function syncData(\DateTimeInterface $from, \DateTimeInterface $to): void
|
|
{
|
|
// Daten aus internem Analytics abrufen
|
|
$internalData = $this->analyticsStorage->getRawData('*', $from, $to);
|
|
|
|
// Daten an externes System senden
|
|
$this->externalClient->batchImport($internalData);
|
|
}
|
|
}
|
|
```
|
|
|
|
## Fehlerbehebung
|
|
|
|
### Debugging der Datenerfassung
|
|
|
|
```php
|
|
use App\Framework\Analytics\AnalyticsCollector;
|
|
use App\Framework\Analytics\AnalyticsCategory;
|
|
|
|
class DebugAnalyticsCollector extends AnalyticsCollector
|
|
{
|
|
public function trackAction(string $action, AnalyticsCategory $category, array $data = []): void
|
|
{
|
|
// Debug-Ausgabe
|
|
echo "Tracking action: {$action}, category: {$category->value}\n";
|
|
echo "Data: " . json_encode($data, JSON_PRETTY_PRINT) . "\n";
|
|
|
|
// Original-Methode aufrufen
|
|
parent::trackAction($action, $category, $data);
|
|
}
|
|
|
|
public function trackPageView(string $path, array $data = []): void
|
|
{
|
|
// Debug-Ausgabe
|
|
echo "Tracking page view: {$path}\n";
|
|
echo "Data: " . json_encode($data, JSON_PRETTY_PRINT) . "\n";
|
|
|
|
// Original-Methode aufrufen
|
|
parent::trackPageView($path, $data);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Überprüfung der Datenspeicherung
|
|
|
|
```php
|
|
use App\Framework\Analytics\Storage\AnalyticsStorage;
|
|
|
|
class AnalyticsDebugService
|
|
{
|
|
public function __construct(
|
|
private readonly AnalyticsStorage $analyticsStorage,
|
|
private readonly string $dataPath
|
|
) {}
|
|
|
|
public function checkStorage(): array
|
|
{
|
|
$result = [
|
|
'status' => 'ok',
|
|
'messages' => [],
|
|
'files' => []
|
|
];
|
|
|
|
// Prüfen, ob der Datenpfad existiert
|
|
if (!is_dir($this->dataPath)) {
|
|
$result['status'] = 'error';
|
|
$result['messages'][] = "Datenpfad existiert nicht: {$this->dataPath}";
|
|
return $result;
|
|
}
|
|
|
|
// Prüfen, ob der Datenpfad beschreibbar ist
|
|
if (!is_writable($this->dataPath)) {
|
|
$result['status'] = 'error';
|
|
$result['messages'][] = "Datenpfad ist nicht beschreibbar: {$this->dataPath}";
|
|
return $result;
|
|
}
|
|
|
|
// Dateien im Datenpfad auflisten
|
|
$files = glob($this->dataPath . '/*.json');
|
|
foreach ($files as $file) {
|
|
$size = filesize($file);
|
|
$modified = date('Y-m-d H:i:s', filemtime($file));
|
|
$result['files'][] = [
|
|
'name' => basename($file),
|
|
'size' => $size,
|
|
'modified' => $modified
|
|
];
|
|
}
|
|
|
|
// Testdaten speichern
|
|
try {
|
|
$this->analyticsStorage->storeRawData('debug_test', [
|
|
'timestamp' => time(),
|
|
'message' => 'Debug test'
|
|
]);
|
|
$result['messages'][] = "Testdaten erfolgreich gespeichert";
|
|
} catch (\Exception $e) {
|
|
$result['status'] = 'error';
|
|
$result['messages'][] = "Fehler beim Speichern von Testdaten: " . $e->getMessage();
|
|
}
|
|
|
|
return $result;
|
|
}
|
|
}
|
|
```
|
|
|
|
## Weiterführende Informationen
|
|
|
|
- [Analytics Framework Übersicht](index.md)
|
|
- [Analytics Konfiguration](configuration.md)
|
|
- [Performance-Monitoring](/components/performance/index.md)
|