added pageload tracking event
This commit is contained in:
parent
5ee5c39ff8
commit
11d635fdd4
@ -43,6 +43,10 @@ open class ActionOpenPageHandler: MVMCoreJSONActionHandlerProtocol {
|
|||||||
|
|
||||||
/// Adds client parameters and makes calls performRequest()
|
/// Adds client parameters and makes calls performRequest()
|
||||||
open func performRequestAddingClientParameters(with requestParameters: MVMCoreRequestParameters, model: ActionOpenPageModel, delegateObject: DelegateObject?, additionalData: [AnyHashable : Any]?) async throws -> MVMCoreLoadRequestOperation? {
|
open func performRequestAddingClientParameters(with requestParameters: MVMCoreRequestParameters, model: ActionOpenPageModel, delegateObject: DelegateObject?, additionalData: [AnyHashable : Any]?) async throws -> MVMCoreLoadRequestOperation? {
|
||||||
|
let coreLoadRequestOperation = MVMCoreLoadHandler.sharedGlobal()?.loadRequest(requestParameters, dataForPage: additionalData, delegateObject: delegateObject)
|
||||||
|
if let pageType = requestParameters.pageType, let identifier = coreLoadRequestOperation?.identifier {
|
||||||
|
MVMCoreLoggingHandler.shared()?.logCoreEvent(.pageStarted(pageType: pageType, requestUUID: identifier))
|
||||||
|
}
|
||||||
// Adds any client parameters to the request parameters.
|
// Adds any client parameters to the request parameters.
|
||||||
if let parametersToFetch = model.clientParameters,
|
if let parametersToFetch = model.clientParameters,
|
||||||
let fetchedParameters = try await ClientParameterHandler().getClientParameters(
|
let fetchedParameters = try await ClientParameterHandler().getClientParameters(
|
||||||
@ -53,7 +57,7 @@ open class ActionOpenPageHandler: MVMCoreJSONActionHandlerProtocol {
|
|||||||
requestParameters.add(fetchedParameters)
|
requestParameters.add(fetchedParameters)
|
||||||
}
|
}
|
||||||
try Task.checkCancellation()
|
try Task.checkCancellation()
|
||||||
return MVMCoreLoadHandler.sharedGlobal()?.loadRequest(requestParameters, dataForPage: additionalData, delegateObject: delegateObject)
|
return coreLoadRequestOperation
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Ensures background requests do not have showing errors.
|
/// Ensures background requests do not have showing errors.
|
||||||
|
|||||||
@ -114,6 +114,7 @@
|
|||||||
error.nativeDrivenErrorScreen = YES;
|
error.nativeDrivenErrorScreen = YES;
|
||||||
error.silentError = NO;
|
error.silentError = NO;
|
||||||
error.messageToDisplay = error.messageToDisplay ?: [MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorUnableToProcess];
|
error.messageToDisplay = error.messageToDisplay ?: [MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorUnableToProcess];
|
||||||
|
error.identifier = loadObject.identifier;
|
||||||
}
|
}
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -58,6 +58,9 @@
|
|||||||
// The full response json
|
// The full response json
|
||||||
@property (nullable, strong, nonatomic) NSDictionary *responseJSON;
|
@property (nullable, strong, nonatomic) NSDictionary *responseJSON;
|
||||||
|
|
||||||
|
//Unique Identifier for event tracking
|
||||||
|
@property (nonatomic, nonatomic, nonnull) NSString *identifier;
|
||||||
|
|
||||||
- (nullable instancetype)initWithPageJSON:(nullable NSDictionary *)pageJSON modulesJSON:(nullable NSDictionary *)modulesJSON requestParameters:(nullable MVMCoreRequestParameters *)requestParameters dataForPage:(nullable NSDictionary *)dataForPage delegateObject:(nullable DelegateObject *)delegateObject;
|
- (nullable instancetype)initWithPageJSON:(nullable NSDictionary *)pageJSON modulesJSON:(nullable NSDictionary *)modulesJSON requestParameters:(nullable MVMCoreRequestParameters *)requestParameters dataForPage:(nullable NSDictionary *)dataForPage delegateObject:(nullable DelegateObject *)delegateObject;
|
||||||
|
|
||||||
- (nullable instancetype)initWithRequestParameters:(nullable MVMCoreRequestParameters *)requestParameters dataForPage:(nullable NSDictionary *)dataForPage delegateObject:(nullable DelegateObject *)delegateObject;
|
- (nullable instancetype)initWithRequestParameters:(nullable MVMCoreRequestParameters *)requestParameters dataForPage:(nullable NSDictionary *)dataForPage delegateObject:(nullable DelegateObject *)delegateObject;
|
||||||
|
|||||||
@ -26,6 +26,7 @@
|
|||||||
@property (nullable, nonatomic, readonly) NSString *finalLoadSource;
|
@property (nullable, nonatomic, readonly) NSString *finalLoadSource;
|
||||||
@property (nonatomic) BOOL backgroundLoad;
|
@property (nonatomic) BOOL backgroundLoad;
|
||||||
@property (nonatomic, getter=areDependenciesAdded) BOOL dependenciesAdded;
|
@property (nonatomic, getter=areDependenciesAdded) BOOL dependenciesAdded;
|
||||||
|
@property (nonnull, nonatomic, readonly) NSString *identifier;
|
||||||
|
|
||||||
/// Legacy flag for if this operation will have an alert to show when finished.
|
/// Legacy flag for if this operation will have an alert to show when finished.
|
||||||
@property (nonatomic, readonly) BOOL alertToShow;
|
@property (nonatomic, readonly) BOOL alertToShow;
|
||||||
|
|||||||
@ -35,6 +35,7 @@
|
|||||||
// For temporarily storing any alert to show until we determine it's delegate.
|
// For temporarily storing any alert to show until we determine it's delegate.
|
||||||
@property (nonatomic, readwrite) BOOL alertToShow;
|
@property (nonatomic, readwrite) BOOL alertToShow;
|
||||||
@property (strong, nonatomic, nullable) MVMCoreErrorObject *errorForAlertToShow;
|
@property (strong, nonatomic, nullable) MVMCoreErrorObject *errorForAlertToShow;
|
||||||
|
@property (nullable, nonatomic, readwrite) NSString *identifier;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@ -48,6 +49,7 @@
|
|||||||
self.dataForPage = dataForPage;
|
self.dataForPage = dataForPage;
|
||||||
self.delegateObject = delegateObject;
|
self.delegateObject = delegateObject;
|
||||||
self.backgroundLoad = backgroundLoad;
|
self.backgroundLoad = backgroundLoad;
|
||||||
|
self.identifier = [NSUUID UUID].UUIDString;
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
}
|
}
|
||||||
@ -55,6 +57,7 @@
|
|||||||
- (nullable instancetype)initWithLoadObject:(nullable MVMCoreLoadObject *)loadObject backgroundLoad:(BOOL)backgroundLoad {
|
- (nullable instancetype)initWithLoadObject:(nullable MVMCoreLoadObject *)loadObject backgroundLoad:(BOOL)backgroundLoad {
|
||||||
|
|
||||||
if (self = [self initWithRequestParameters:loadObject.requestParameters dataForPage:loadObject.dataForPage delegateObject:loadObject.delegateObject backgroundLoad:backgroundLoad]) {
|
if (self = [self initWithRequestParameters:loadObject.requestParameters dataForPage:loadObject.dataForPage delegateObject:loadObject.delegateObject backgroundLoad:backgroundLoad]) {
|
||||||
|
loadObject.identifier = self.identifier;
|
||||||
self.loadObject = loadObject;
|
self.loadObject = loadObject;
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
@ -120,6 +123,7 @@
|
|||||||
|
|
||||||
// No load requested, finish.
|
// No load requested, finish.
|
||||||
MVMCoreLoadObject *loadObject = [[MVMCoreLoadObject alloc] initWithRequestParameters:nil dataForPage:self.dataForPage delegateObject:self.delegateObject];
|
MVMCoreLoadObject *loadObject = [[MVMCoreLoadObject alloc] initWithRequestParameters:nil dataForPage:self.dataForPage delegateObject:self.delegateObject];
|
||||||
|
loadObject.identifier = self.identifier;
|
||||||
loadObject.operation = self;
|
loadObject.operation = self;
|
||||||
[MVMCoreLoadRequestOperation loadFinished:loadObject loadedViewController:nil errorObject:nil];
|
[MVMCoreLoadRequestOperation loadFinished:loadObject loadedViewController:nil errorObject:nil];
|
||||||
} else if (self.loadObject) {
|
} else if (self.loadObject) {
|
||||||
@ -155,9 +159,19 @@
|
|||||||
[MVMCoreLoadRequestOperation handleLoadObject:loadObject error:nil];
|
[MVMCoreLoadRequestOperation handleLoadObject:loadObject error:nil];
|
||||||
} else {
|
} else {
|
||||||
|
|
||||||
|
if(loadObject.requestParameters.pageType) {
|
||||||
|
[[MVMCoreLoggingHandler sharedLoggingHandler] logPageLoadStartedFor:loadObject.requestParameters.pageType requestUUID:loadObject.identifier requestURL:@"requestURL"];
|
||||||
|
}
|
||||||
|
|
||||||
// Send a new request to the server.
|
// Send a new request to the server.
|
||||||
[MVMCoreLoadRequestOperation sendRequest:requestForMissingData loadObject:loadObject completionHandler:^(NSDictionary * _Nullable json) {
|
[MVMCoreLoadRequestOperation sendRequest:requestForMissingData loadObject:loadObject completionHandler:^(NSDictionary * _Nullable json) {
|
||||||
|
|
||||||
|
NSString *serverProcessTime = [(NSDictionary *)json objectChainOfKeysOrIndexes:@[@"ResponseInfo", @"timeStamp"]] ?: @"0";
|
||||||
|
|
||||||
|
if(loadObject.requestParameters.pageType && serverProcessTime) {
|
||||||
|
[[MVMCoreLoggingHandler sharedLoggingHandler] logPageLoadCompleteFor:loadObject.requestParameters.pageType serverProcessingTime:serverProcessTime requestURL:@"requestURL" requestUUID:loadObject.identifier isFromCache:loadObject.pageDataFromCache];
|
||||||
|
}
|
||||||
|
|
||||||
// Process the data retrieved from the server.
|
// Process the data retrieved from the server.
|
||||||
[MVMCoreLoadRequestOperation processJSONFromServer:json loadObject:loadObject completionHandler:^(MVMCoreLoadObject * _Nonnull loadObject, MVMCoreErrorObject * _Nullable error) {
|
[MVMCoreLoadRequestOperation processJSONFromServer:json loadObject:loadObject completionHandler:^(MVMCoreLoadObject * _Nonnull loadObject, MVMCoreErrorObject * _Nullable error) {
|
||||||
|
|
||||||
@ -226,7 +240,7 @@
|
|||||||
if (pageFromCache) {
|
if (pageFromCache) {
|
||||||
loadObject.pageType = self.requestParameters.pageType;
|
loadObject.pageType = self.requestParameters.pageType;
|
||||||
}
|
}
|
||||||
|
loadObject.identifier = self.identifier;
|
||||||
// Store if we loaded from the cache or not.
|
// Store if we loaded from the cache or not.
|
||||||
loadObject.pageDataFromCache = (pageFromCache != nil);
|
loadObject.pageDataFromCache = (pageFromCache != nil);
|
||||||
loadObject.moduleDataFromCache = (modulesFromCache != nil);
|
loadObject.moduleDataFromCache = (modulesFromCache != nil);
|
||||||
@ -292,10 +306,11 @@
|
|||||||
|
|
||||||
// Error json not correct format.
|
// Error json not correct format.
|
||||||
MVMCoreErrorObject *errorObject = [[MVMCoreLoadHandler sharedGlobal] errorForLoadObject:loadObject withTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorCritical] code:ErrorCodeJSONNotDictionary domain:ErrorDomainSystem];
|
MVMCoreErrorObject *errorObject = [[MVMCoreLoadHandler sharedGlobal] errorForLoadObject:loadObject withTitle:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorTitle] message:[MVMCoreGetterUtility hardcodedStringWithKey:HardcodedErrorCritical] code:ErrorCodeJSONNotDictionary domain:ErrorDomainSystem];
|
||||||
|
errorObject.identifier = loadObject.identifier;
|
||||||
[MVMCoreLoadRequestOperation loadAbortedWithError:errorObject loadObject:loadObject];
|
[MVMCoreLoadRequestOperation loadAbortedWithError:errorObject loadObject:loadObject];
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
error.identifier = loadObject.identifier;
|
||||||
// Error with the request/response
|
// Error with the request/response
|
||||||
[[MVMCoreLoadHandler sharedGlobal] attachLoadInformation:loadObject toError:error];
|
[[MVMCoreLoadHandler sharedGlobal] attachLoadInformation:loadObject toError:error];
|
||||||
[MVMCoreLoadRequestOperation loadAbortedWithError:error loadObject:loadObject];
|
[MVMCoreLoadRequestOperation loadAbortedWithError:error loadObject:loadObject];
|
||||||
@ -748,6 +763,7 @@
|
|||||||
|
|
||||||
// Once displyed, we are finished.
|
// Once displyed, we are finished.
|
||||||
[MVMCoreActionUtility displayViewController:viewController forLoadObject:loadObject presentationDelegate:loadObject.operation completionHandler:^{
|
[MVMCoreActionUtility displayViewController:viewController forLoadObject:loadObject presentationDelegate:loadObject.operation completionHandler:^{
|
||||||
|
NSLog(@"screen appear from displayViewController");
|
||||||
[MVMCoreLoadRequestOperation loadFinished:loadObject loadedViewController:viewController errorObject:error];
|
[MVMCoreLoadRequestOperation loadFinished:loadObject loadedViewController:viewController errorObject:error];
|
||||||
}];
|
}];
|
||||||
}
|
}
|
||||||
|
|||||||
@ -82,9 +82,42 @@ public enum MVMCoreEvent {
|
|||||||
actionId: String
|
actionId: String
|
||||||
)
|
)
|
||||||
|
|
||||||
|
case pageStarted(
|
||||||
|
pageType: String,
|
||||||
|
requestUUID: String
|
||||||
|
)
|
||||||
|
|
||||||
|
case pageLoadStarted(
|
||||||
|
pageType: String,
|
||||||
|
requestUUID: String,
|
||||||
|
requestURL: String
|
||||||
|
)
|
||||||
|
|
||||||
|
case pageLoadComplete(
|
||||||
|
pageType: String,
|
||||||
|
requestUUID: String,
|
||||||
|
serverProcessingTime: String,
|
||||||
|
requestURL: String,
|
||||||
|
isFromCache: Bool
|
||||||
|
)
|
||||||
|
|
||||||
|
case pageProcessingComplete(
|
||||||
|
pageType: String,
|
||||||
|
requestUUID: String,
|
||||||
|
webUrl: String?
|
||||||
|
)
|
||||||
|
|
||||||
|
case pageRenderComplete(
|
||||||
|
pageType: String,
|
||||||
|
requestUUID: String,
|
||||||
|
templateName: String?,
|
||||||
|
controllerName: String
|
||||||
|
)
|
||||||
|
|
||||||
public enum EventType: String {
|
public enum EventType: String {
|
||||||
case action
|
case action
|
||||||
case clientParameter
|
case clientParameter
|
||||||
|
case pageLoad
|
||||||
|
|
||||||
public var notification: Notification.Name {
|
public var notification: Notification.Name {
|
||||||
return Notification.Name(rawValue: rawValue)
|
return Notification.Name(rawValue: rawValue)
|
||||||
@ -102,6 +135,7 @@ public enum MVMCoreEvent {
|
|||||||
case .clientParameterStartFetch: return .clientParameter
|
case .clientParameterStartFetch: return .clientParameter
|
||||||
case .clientParameterTimeout: return .clientParameter
|
case .clientParameterTimeout: return .clientParameter
|
||||||
case .clientParameterFetchComplete: return .clientParameter
|
case .clientParameterFetchComplete: return .clientParameter
|
||||||
|
case .pageStarted, .pageLoadStarted, .pageLoadComplete, .pageProcessingComplete, .pageRenderComplete: return .pageLoad
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -123,5 +157,23 @@ extension MVMCoreLoggingHandler {
|
|||||||
func logCoreEvent(_ event: MVMCoreEvent, at timestamp: Int64 = Date.unixMillisecondsNow()) {
|
func logCoreEvent(_ event: MVMCoreEvent, at timestamp: Int64 = Date.unixMillisecondsNow()) {
|
||||||
recordEvent(event.type.rawValue, attributes: ["timestamp": timestamp, "event": event])
|
recordEvent(event.type.rawValue, attributes: ["timestamp": timestamp, "event": event])
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc public extension MVMCoreLoggingHandler {
|
||||||
|
|
||||||
|
@objc func logPageLoadStarted(for pageType: String, requestUUID: String, requestURL: String) {
|
||||||
|
logCoreEvent(.pageLoadStarted(pageType: pageType, requestUUID: requestUUID, requestURL: requestURL))
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc func logPageLoadComplete(for pageType: String, serverProcessingTime: String, requestURL: String, requestUUID: String, isFromCache: Bool) {
|
||||||
|
logCoreEvent(.pageLoadComplete(pageType: pageType, requestUUID: requestUUID, serverProcessingTime: serverProcessingTime, requestURL: requestURL, isFromCache: isFromCache))
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc func logPageProcessingComplete(for pageType: String, requestUUID: String, webUrl: String?) {
|
||||||
|
logCoreEvent(.pageProcessingComplete(pageType: pageType, requestUUID: requestUUID, webUrl: webUrl))
|
||||||
|
}
|
||||||
|
|
||||||
|
@objc func logPageRenderComplete(for pageType: String, requestUUID: String, templateName: String?, controllerName: String) {
|
||||||
|
logCoreEvent(.pageRenderComplete(pageType: pageType, requestUUID: requestUUID, templateName: templateName, controllerName: controllerName))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -28,6 +28,9 @@
|
|||||||
@property (nonatomic, assign) NSInteger httpStatusCode;
|
@property (nonatomic, assign) NSInteger httpStatusCode;
|
||||||
@property (nullable, strong, nonatomic) NSDictionary *serverResponseInfo;
|
@property (nullable, strong, nonatomic) NSDictionary *serverResponseInfo;
|
||||||
|
|
||||||
|
//Unique Identifier for event tracking
|
||||||
|
@property (nonatomic, nonatomic, nonnull) NSString *identifier;
|
||||||
|
|
||||||
// For the crash log.
|
// For the crash log.
|
||||||
@property (nullable, strong, nonatomic) NSDictionary *crashLog;
|
@property (nullable, strong, nonatomic) NSDictionary *crashLog;
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user