+ [ios] add tracing logic
Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/11b19496 Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/11b19496 Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/11b19496 Branch: refs/heads/0.15-dev Commit: 11b19496abe91afcbcf99abb49519c8ad4c4121b Parents: e340991 Author: é½å±± <sunjjb...@163.com> Authored: Wed Jul 12 16:02:26 2017 +0800 Committer: é½å±± <sunjjb...@163.com> Committed: Wed Jul 12 16:02:26 2017 +0800 ---------------------------------------------------------------------- ios/playground/WeexDemo/WXDemoViewController.m | 1 - .../WeexSDK/Sources/Model/WXJSExceptionInfo.h | 1 + ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m | 8 +- ios/sdk/WeexSDK/Sources/Utility/WXLog.m | 1 + .../WeexSDK/Sources/Utility/WXTracingManager.h | 18 ++- .../WeexSDK/Sources/Utility/WXTracingManager.m | 115 +++++++++++++++++-- 6 files changed, 130 insertions(+), 14 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/11b19496/ios/playground/WeexDemo/WXDemoViewController.m ---------------------------------------------------------------------- diff --git a/ios/playground/WeexDemo/WXDemoViewController.m b/ios/playground/WeexDemo/WXDemoViewController.m index bec41f9..2284ea7 100644 --- a/ios/playground/WeexDemo/WXDemoViewController.m +++ b/ios/playground/WeexDemo/WXDemoViewController.m @@ -148,7 +148,6 @@ WXLogDebug(@"%@", @"Render Finish..."); dispatch_async(dispatch_get_main_queue(), ^{ [WXTracingManager startTracing:weakSelf.instance.instanceId ref:nil parentRef:nil className:nil name:nil ph:WXTracingInstant fName:WXTRenderFinish parentId:nil]; - [WXTracingManager getTracingData:weakSelf.instance.instanceId]; }); [weakSelf updateInstanceState:WeexInstanceAppear]; }; http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/11b19496/ios/sdk/WeexSDK/Sources/Model/WXJSExceptionInfo.h ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Model/WXJSExceptionInfo.h b/ios/sdk/WeexSDK/Sources/Model/WXJSExceptionInfo.h index b800a87..c5b14ab 100644 --- a/ios/sdk/WeexSDK/Sources/Model/WXJSExceptionInfo.h +++ b/ios/sdk/WeexSDK/Sources/Model/WXJSExceptionInfo.h @@ -53,6 +53,7 @@ */ @property(nonatomic,strong, readonly) NSString * jsfmVersion; + /** * @abstract Initializes a WXJSException instance * @param instanceId the id of instance http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/11b19496/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m index 5c5d6b1..4e2b8a7 100644 --- a/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m +++ b/ios/sdk/WeexSDK/Sources/Model/WXSDKInstance.m @@ -147,7 +147,7 @@ typedef enum : NSUInteger { WXResourceRequest *request = [WXResourceRequest requestWithURL:url resourceType:WXResourceTypeMainBundle referrer:@"" cachePolicy:NSURLRequestUseProtocolCachePolicy]; [self _renderWithRequest:request options:options data:data]; - [WXTracingManager startTracing:self.instanceId ref:nil parentRef:nil className:nil name:WXTDataHanding ph:WXTracingBegin fName:@"renderWithURL" parentId:nil]; + [WXTracingManager startTracing:self.instanceId ref:nil parentRef:nil className:nil name:WXTNetworkHanding ph:WXTracingBegin fName:@"renderWithURL" parentId:nil]; } - (void)renderView:(NSString *)source options:(NSDictionary *)options data:(id)data @@ -158,7 +158,8 @@ typedef enum : NSUInteger { _jsData = data; [self _renderWithMainBundleString:source]; - [WXTracingManager startTracing:self.instanceId ref:nil parentRef:nil className:nil name:WXTDataHanding ph:WXTracingBegin fName:@"renderView" parentId:nil]; + + [WXTracingManager setBundleJSType:source instanceId:self.instanceId]; } - (void)_renderWithMainBundleString:(NSString *)mainBundleString @@ -201,6 +202,8 @@ typedef enum : NSUInteger { [[WXSDKManager bridgeMgr] createInstance:self.instanceId template:mainBundleString options:dictionary data:_jsData]; + [WXTracingManager startTracing:self.instanceId ref:nil parentRef:nil className:nil name:WXTDataHanding ph:WXTracingBegin fName:@"renderWithMainBundleString" parentId:nil]; + WX_MONITOR_PERF_SET(WXPTBundleSize, [mainBundleString lengthOfBytesUsingEncoding:NSUTF8StringEncoding], self); } @@ -291,6 +294,7 @@ typedef enum : NSUInteger { WX_MONITOR_INSTANCE_PERF_END(WXPTJSDownload, strongSelf); [strongSelf _renderWithMainBundleString:jsBundleString]; + [WXTracingManager setBundleJSType:jsBundleString instanceId:weakSelf.instanceId]; }; _mainBundleLoader.onFailed = ^(NSError *loadError) { http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/11b19496/ios/sdk/WeexSDK/Sources/Utility/WXLog.m ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXLog.m b/ios/sdk/WeexSDK/Sources/Utility/WXLog.m index d086455..dd6794d 100644 --- a/ios/sdk/WeexSDK/Sources/Utility/WXLog.m +++ b/ios/sdk/WeexSDK/Sources/Utility/WXLog.m @@ -85,6 +85,7 @@ static id<WXLogProtocol> _externalLog; [[WXSDKManager bridgeMgr] resetEnvironment]; } + } + (WXLogLevel)logLevel http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/11b19496/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.h ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.h b/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.h index 2cb88ac..3d18c39 100644 --- a/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.h +++ b/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.h @@ -20,6 +20,7 @@ #import <Foundation/Foundation.h> #import "WXSDKInstance.h" +#define WXTNetworkHanding @"WXTNetworkHanding" #define WXTDataHanding @"WXTDataHanding" #define WXTJSCall @"jsCall" #define WXTRender @"WXTRender" @@ -32,10 +33,20 @@ typedef enum : NSUInteger { // global - WXTracingDataHanding = 0, + WXTracingNetworkHanding = 0, + WXTracingDataHanding, WXTracingRender } WXTracingTag; + +@interface WXTracingApi:NSObject + +@property (nonatomic, copy) NSString *name; // +@property (nonatomic, copy) NSString *className; // +@property (nonatomic, copy) NSString *method; // + +@end + @interface WXTracing:NSObject @property (nonatomic, copy) NSString *ref; // compnonet id @@ -56,8 +67,9 @@ typedef enum : NSUInteger { @property (nonatomic, copy) NSString *iid; @property (nonatomic) long long counter; -@property (nonatomic) WXTracingTag tag; +@property (nonatomic, copy) NSString *tag; @property (nonatomic, strong) NSMutableArray *tracings; +@property (nonatomic, copy) NSString *bundleJSType; // @end @@ -67,6 +79,8 @@ typedef enum : NSUInteger { +(void)startTracing:(WXTracing*)tracing; +(void)startTracing:(NSString *)iid ref:(NSString*)ref parentRef:(NSString*)parentRef className:(NSString *)className name:(NSString *)name ph:(NSString *)ph fName:(NSString *)fName parentId:(NSString *)parentId; +(WXTracingTask*)getTracingData; ++(void)setBundleJSType:(NSString *)jsBundleString instanceId:(NSString *)iid; +(void)getTracingData:(NSString *)instanceId; ++(NSDictionary *)getTacingApi; @end http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/11b19496/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.m ---------------------------------------------------------------------- diff --git a/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.m b/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.m index d1569d3..2d7a29a 100644 --- a/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.m +++ b/ios/sdk/WeexSDK/Sources/Utility/WXTracingManager.m @@ -21,6 +21,10 @@ #import "WXComponentFactory.h" #import "WXModuleFactory.h" #import "WXSDKManager.h" +#import <WeexSDK/WXComponentFactory.h> +#import <WeexSDK/WXModuleFactory.h> +#import <WeexSDK/WXHandlerFactory.h> + @implementation WXTracing @@ -97,8 +101,8 @@ if(![WXTracingEnd isEqualToString:tracing.ph]){ // end is should not update tracing.traceId = ++task.counter; } - if([WXTDataHanding isEqualToString:tracing.name] && [WXTracingBegin isEqualToString:tracing.ph]){ - task.tag = WXTDataHanding; + if([WXTNetworkHanding isEqualToString:tracing.name] && [WXTracingBegin isEqualToString:tracing.ph]){ + task.tag = WXTNetworkHanding; } NSTimeInterval ts = [[NSDate date] timeIntervalSince1970]*1000; tracing.ts = ts ; @@ -108,6 +112,24 @@ } } ++(void)setBundleJSType:(NSString *)jsBundleString instanceId:(NSString *)iid +{ + if([self isTracing] && iid.length >0){ + WXTracingTask *task = [[WXTracingManager sharedInstance].tracingTasks objectForKey:iid]; + if(jsBundleString.length >0){ + NSRange range = [jsBundleString rangeOfString:@"}"]; + if (range.location != NSNotFound) { + NSString *searchStr = [jsBundleString substringToIndex:range.location+range.length]; + if ([searchStr rangeOfString:@"Vue"].location != NSNotFound){ + task.bundleJSType = @"Vue"; + }else if([searchStr rangeOfString:@"Rax"].location != NSNotFound){ + task.bundleJSType = @"Rax"; + } + } + } + } +} + +(void)startTracing:(NSString *)iid ref:(NSString*)ref parentRef:(NSString*)parentRef className:(NSString *)className name:(NSString *)name ph:(NSString *)ph fName:(NSString *)fName parentId:(NSString *)parentId { if([self isTracing]){ @@ -196,25 +218,47 @@ if(![WXTJSCall isEqualToString:tracing.name]){ tracing.className = [self getclassName:tracing]; } - if(task.tag == WXTDataHanding){ + if([WXTNetworkHanding isEqualToString:task.tag]){ + if([WXTDataHanding isEqualToString:tracing.name]){ + NSMutableArray *tracings = task.tracings; + [tracings enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(WXTracing *bTracing, NSUInteger idx, BOOL *stop) { + if(([WXTNetworkHanding isEqualToString:bTracing.name] || [bTracing.ref isEqualToString:tracing.ref])&&[WXTracingBegin isEqualToString:bTracing.ph]){ + WXTracing *newTracing = [self copyTracing:bTracing]; + newTracing.iid = tracing.iid; + newTracing.ph = WXTracingEnd; + newTracing.ts = tracing.ts ; + newTracing.duration = newTracing.ts - bTracing.ts ; + bTracing.duration = newTracing.duration; + [task.tracings addObject:newTracing]; + NSLog(@"jerry0 %f,%f",bTracing.ts,bTracing.duration); + *stop = YES; + } + }]; + task.tag = WXTDataHanding; + } + } + + if([WXTDataHanding isEqualToString:task.tag]){ if([WXTJSCall isEqualToString:tracing.name]){ - NSMutableArray *tracings = [task.tracings copy]; + NSMutableArray *tracings = task.tracings; [tracings enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(WXTracing *bTracing, NSUInteger idx, BOOL *stop) { if(([WXTDataHanding isEqualToString:bTracing.name] || [bTracing.ref isEqualToString:tracing.ref])&&[WXTracingBegin isEqualToString:bTracing.ph]){ WXTracing *newTracing = [self copyTracing:bTracing]; - newTracing.iid = newTracing.iid; + newTracing.iid = tracing.iid; newTracing.ph = WXTracingEnd; - newTracing.ts = [[NSDate date] timeIntervalSince1970]*1000 ; + newTracing.ts = tracing.ts ; newTracing.duration = newTracing.ts - bTracing.ts ; + bTracing.duration = newTracing.duration; [task.tracings addObject:newTracing]; + NSLog(@"jerry1 %f,%f",bTracing.ts,bTracing.duration); *stop = YES; } }]; - task.tag = WXTracingRender; + task.tag = WXTRender; } } if([WXTracingEnd isEqualToString:tracing.ph]){ // deal end - NSMutableArray *tracings = [task.tracings copy]; + NSMutableArray *tracings = task.tracings; [tracings enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(WXTracing *bTracing, NSUInteger idx, BOOL *stop) { if(tracing.ref.length > 0 && bTracing.ref.length>0){ if(![tracing.ref isEqualToString:bTracing.ref]){ @@ -229,6 +273,8 @@ } tracing.duration = tracing.ts - bTracing.ts ; tracing.traceId = bTracing.traceId; + bTracing.duration = tracing.duration; + NSLog(@"jerry2 %f,%f",bTracing.ts,bTracing.duration); *stop = YES; } }]; @@ -248,9 +294,60 @@ NSArray *tracings = [task.tracings copy]; for (WXTracing *tracing in tracings) { if(![WXTracingBegin isEqualToString:tracing.ph]){ - NSLog(@"%lld %@ %@ %@ %f %f %@ %@",tracing.traceId,tracing.fName,tracing.name,tracing.className,tracing.ts,tracing.duration,tracing.ref,tracing.parentRef); +// NSLog(@"%lld %@ %@ %@ %f %f %@ %@",tracing.traceId,tracing.fName,tracing.name,tracing.className,tracing.ts,tracing.duration,tracing.ref,tracing.parentRef); + } + } +} + ++(NSDictionary *)getTacingApi +{ + NSMutableDictionary *dict = [NSMutableDictionary new]; + NSMutableArray *componetArray = [NSMutableArray new]; + NSMutableArray *moduleArray = [NSMutableArray new]; + NSMutableArray *handleArray = [NSMutableArray new]; + NSDictionary *componentConfigs = [WXComponentFactory componentConfigs]; + void (^componentBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) { + NSMutableDictionary *componentConfig = [mObj mutableCopy]; + NSDictionary *cDict = [WXComponentFactory componentMethodMapsWithName:componentConfig[@"name"]]; + if(cDict && [cDict count]>0 && [cDict[@"methods"] count]>0){ + [componentConfig setObject:cDict[@"methods"] forKey:@"methods"]; + } + [componetArray addObject:componentConfig]; + }; + [componentConfigs enumerateKeysAndObjectsUsingBlock:componentBlock]; + if(componetArray && [componetArray count]>0){ + [dict setObject:componetArray forKey:@"componet"]; + } + NSDictionary *moduleConfigs = [WXModuleFactory moduleConfigs]; + void (^moduleBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) { + NSDictionary *mDict = [WXModuleFactory moduleMethodMapsWithName:mKey]; + NSMutableDictionary *subDict = [NSMutableDictionary new]; + [subDict setObject:mKey forKey:@"name"]; + [subDict setObject:mObj forKey:@"class"]; + if([mDict objectForKey:mKey]){ + [subDict setObject:[mDict objectForKey:mKey] forKey:@"methods"]; } + [moduleArray addObject:subDict]; + }; + [moduleConfigs enumerateKeysAndObjectsUsingBlock:moduleBlock]; + if(moduleArray && [moduleArray count]>0){ + [dict setObject:moduleArray forKey:@"module"]; } + + + NSDictionary *handleConfigs = [[WXHandlerFactory handlerConfigs] mutableCopy]; + void (^handleBlock)(id, id, BOOL *) = ^(id mKey, id mObj, BOOL * mStop) { + NSMutableDictionary *subDict = [NSMutableDictionary new]; + [subDict setObject:mKey forKey:@"class"]; + [subDict setObject:NSStringFromClass([mObj class]) forKey:@"name"]; + [handleArray addObject:subDict]; + }; + [handleConfigs enumerateKeysAndObjectsUsingBlock:handleBlock]; + if(handleArray && [handleArray count]>0){ + [dict setObject:handleArray forKey:@"handle"]; + } + + return dict; } @end