telemetryManager.ts 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { Observable } from "babylonjs/Misc/observable";
  2. import { Engine } from "babylonjs/Engines/engine";
  3. /**
  4. * The data structure of a telemetry event.
  5. */
  6. export interface TelemetryData {
  7. event: string;
  8. session: string;
  9. date: Date;
  10. now: number;
  11. viewerId?: string;
  12. detail: any;
  13. }
  14. /**
  15. * Receives Telemetry events and raises events to the API
  16. */
  17. export class TelemetryManager {
  18. public onEventBroadcastedObservable: Observable<TelemetryData> = new Observable();
  19. private _currentSessionId: string;
  20. private _event: (event: string, viewerId?: string, details?: any) => void = this._eventEnabled;
  21. /**
  22. * Receives a telemetry event
  23. * @param event The name of the Telemetry event
  24. * @param details An additional value, or an object containing a list of property/value pairs
  25. */
  26. public get broadcast() {
  27. return this._event;
  28. }
  29. /**
  30. * Log a Telemetry event for errors raised on the WebGL context.
  31. * @param engine The Babylon engine with the WebGL context.
  32. */
  33. public flushWebGLErrors(engine: Engine, viewerId?: string) {
  34. if (!engine) {
  35. return;
  36. }
  37. let logErrors = true;
  38. while (logErrors) {
  39. let error = engine.getError();
  40. if (error === 0) {
  41. logErrors = false;
  42. } else {
  43. this.broadcast("WebGL Error", viewerId, { error: error });
  44. }
  45. }
  46. }
  47. /**
  48. * Enable or disable telemetry events
  49. * @param enabled Boolan, true if events are enabled
  50. */
  51. public set enable(enabled: boolean) {
  52. if (enabled) {
  53. this._event = this._eventEnabled;
  54. } else {
  55. this._event = this._eventDisabled;
  56. }
  57. }
  58. /**
  59. * Called on event when disabled, typically do nothing here
  60. */
  61. private _eventDisabled(): void {
  62. // nothing to do
  63. }
  64. /**
  65. * Called on event when enabled
  66. * @param event - The name of the Telemetry event
  67. * @param details An additional value, or an object containing a list of property/value pairs
  68. */
  69. private _eventEnabled(event: string, viewerId?: string, details?: any): void {
  70. let telemetryData: TelemetryData = {
  71. viewerId,
  72. event: event,
  73. session: this.session,
  74. date: new Date(),
  75. now: window.performance ? window.performance.now() : Date.now(),
  76. detail: null
  77. };
  78. if (typeof details === "object") {
  79. for (var attr in details) {
  80. if (details.hasOwnProperty(attr)) {
  81. telemetryData[attr] = details[attr];
  82. }
  83. }
  84. } else if (details) {
  85. telemetryData.detail = details;
  86. }
  87. this.onEventBroadcastedObservable.notifyObservers(telemetryData);
  88. }
  89. /**
  90. * Returns the current session ID or creates one if it doesn't exixt
  91. * @return The current session ID
  92. */
  93. public get session(): string {
  94. if (!this._currentSessionId) {
  95. //String + Timestamp + Random Integer
  96. this._currentSessionId = "SESSION_" + Date.now() + Math.floor(Math.random() * 0x10000);
  97. }
  98. return this._currentSessionId;
  99. }
  100. /**
  101. * Disposes the telemetry manager
  102. */
  103. public dispose() {
  104. this.onEventBroadcastedObservable.clear();
  105. }
  106. }
  107. export const telemetryManager = new TelemetryManager();