--- /dev/null
+from . import UiApiController, BaseController, Endpoint
+from .. import logger
+
+
+@UiApiController('/logging')
+class Logging(BaseController):
+
+ @Endpoint('POST', path='js-error')
+ def jsError(self, url, message, stack):
+ logger.error('frontend error (%s): %s\n %s\n', url, message, stack)
import { HTTP_INTERCEPTORS, HttpClientModule } from '@angular/common/http';
-import { NgModule } from '@angular/core';
+import { ErrorHandler, NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { BrowserAnimationsModule } from '@angular/platform-browser/animations';
import { CephModule } from './ceph/ceph.module';
import { CoreModule } from './core/core.module';
import { ApiInterceptorService } from './shared/services/api-interceptor.service';
+import { JsErrorHandler } from './shared/services/js-error-handler.service';
import { SharedModule } from './shared/shared.module';
export class CustomOption extends ToastOptions {
],
exports: [SharedModule],
providers: [
+ {
+ provide: ErrorHandler,
+ useClass: JsErrorHandler,
+ },
{
provide: HTTP_INTERCEPTORS,
useClass: ApiInterceptorService,
import { ConfigurationService } from './configuration.service';
import { DashboardService } from './dashboard.service';
import { HostService } from './host.service';
+import { LoggingService } from './logging.service';
import { MonitorService } from './monitor.service';
import { OsdService } from './osd.service';
import { PerformanceCounterService } from './performance-counter.service';
RgwDaemonService,
RgwUserService,
PerformanceCounterService,
+ LoggingService,
TcmuIscsiService
]
})
--- /dev/null
+import { HttpClient } from '@angular/common/http';
+import { Injectable } from '@angular/core';
+
+@Injectable()
+export class LoggingService {
+
+ constructor(private http: HttpClient) {
+ }
+
+ jsError(url, message, stack) {
+ const request = {
+ url: url,
+ message: message,
+ stack: stack
+ };
+ return this.http.post('ui-api/logging/js-error', request);
+ }
+
+}
--- /dev/null
+import { ErrorHandler, Injectable, Injector } from '@angular/core';
+import { LoggingService } from '../api/logging.service';
+
+@Injectable()
+export class JsErrorHandler implements ErrorHandler {
+
+ constructor(private injector: Injector) { }
+
+ handleError(error) {
+ const loggingService = this.injector.get(LoggingService);
+ const url = window.location.href;
+ const message = error && error.message;
+ const stack = error && error.stack;
+ loggingService.jsError(url, message, stack).subscribe();
+ throw error;
+ }
+
+}