Capabilities we want to achieve
- Track and report outcome of operations (success/error)
- Measure and report duration of operations
- Label all reported events with operation name, plus the names of related bundle, package, and entry point
- Application-specific behavior: based on message ID and priority, route events to different infrastructure mechanisms, e.g. sentry / New Relic / etc. This layer will be implemented by application and injected into AppHost.
Proposed API
Examples
-
Call an asynchronous function and report its duration and outcome:
const saveResult = await shell.log.span(LOG_EVID_PUBLISH, () => {
return shell.GetAPI(SaveAPI).save()
})
This will wrap the promise returned by SaveAPI.save() and track its duration and outcome. It will report events of 'start' and 'finish' to application-specific logging layer. These events will be automatically labeled with related bundle/package/entry point. The app-specific logging layer will route the events to application-specific infrastructure services.
-
Call a synchronous function and report its duration and outcome:
const selection = shell.log.span(LOG_EVID_SELECT_COMP, () => {
return shell.GetAPI(SelectionAPI).select(inputEvent)
})
This will track its duration and outcome of the passed arrow function. It will report events of 'start' and 'finish' to application-specific logging layer. These events will be automatically labeled with related bundle/package/entry point. The app-specific logging layer will route the events to application-specific infrastructure services.
-
Report a one-off event:
shell.log.warning(LOG_EVID_COMP_NOT_FOUND, { compRef: myCompRef })
This will report the event and to application-specific logging layer. The event will be automatically labeled with related bundle/package/entry point. The app-specific logging layer will route the event to application-specific infrastructure services.
Full listing
export type LogSeverity = 'debug' | 'info' | 'warning' | 'error';
export type LogSpanFlag = 'open' | 'close';
export interface HostLogger {
event(
severity: LogSeverity,
source: string,
id: string,
keyValuePairs?: Object,
spanFlag?: LogSpanFlag): void;
}
export interface ShellLogger {
debug(messageId: string, keyValuePairs?: Object): void;
info(messageId: string, keyValuePairs?: Object): void;
warning(messageId: string, keyValuePairs?: Object): void;
error(messageId: string, keyValuePairs?: Object): void;
// report duration+outcome of an operation:
span(messageId: string, keyValuePairs: Object, action: () => void): void;
asyncSpan(messageId: string, keyValuePairs: Object, action: () => Promise<any>): void;
}
New interfaces and properties:
- HostLogger interface: the application-specific logging layer. Its responsibility is route events to application-specific infrastructure services, e.g. sentry, New Relic, etc. Main application will inject its custom HostLogger object into AppHost by passing it to createAppHost().
- ShellLogger interface: a fine-grained interface for use by packages. It will be exposed from the Shell object, as a new property named log. The ShellLogger will delegate to HostLogger of the AppHost. So basically ShellLogger is a syntactic sugar over HostLogger.
Capabilities we want to achieve
Proposed API
Examples
Call an asynchronous function and report its duration and outcome:
This will wrap the promise returned by SaveAPI.save() and track its duration and outcome. It will report events of 'start' and 'finish' to application-specific logging layer. These events will be automatically labeled with related bundle/package/entry point. The app-specific logging layer will route the events to application-specific infrastructure services.
Call a synchronous function and report its duration and outcome:
This will track its duration and outcome of the passed arrow function. It will report events of 'start' and 'finish' to application-specific logging layer. These events will be automatically labeled with related bundle/package/entry point. The app-specific logging layer will route the events to application-specific infrastructure services.
Report a one-off event:
This will report the event and to application-specific logging layer. The event will be automatically labeled with related bundle/package/entry point. The app-specific logging layer will route the event to application-specific infrastructure services.
Full listing
New interfaces and properties: