QNReportItem.m 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257
  1. //
  2. // QNReportItem.m
  3. // QiniuSDK
  4. //
  5. // Created by yangsen on 2020/5/12.
  6. // Copyright © 2020 Qiniu. All rights reserved.
  7. //
  8. #import "QNReportItem.h"
  9. #import "QNAsyncRun.h"
  10. #import "QNLogUtil.h"
  11. @interface QNReportItem()
  12. @property(nonatomic, strong)NSMutableDictionary *keyValues;
  13. @end
  14. @implementation QNReportItem
  15. + (instancetype)item{
  16. QNReportItem *item = [[QNReportItem alloc] init];
  17. return item;
  18. }
  19. - (instancetype)init{
  20. if (self = [super init]) {
  21. [self initData];
  22. }
  23. return self;
  24. }
  25. - (void)initData{
  26. _keyValues = [NSMutableDictionary dictionary];
  27. }
  28. - (void)setReportValue:(id _Nullable)value forKey:(NSString * _Nullable)key{
  29. if (!value || !key || ![key isKindOfClass:[NSString class]]) {
  30. return;
  31. }
  32. if ([value isKindOfClass:[NSString class]] && [(NSString *)value length] > 1024) {
  33. value = [(NSString *)value substringToIndex:1024];
  34. }
  35. [self.keyValues setValue:value forKey:key];
  36. }
  37. - (void)removeReportValueForKey:(NSString * _Nullable)key{
  38. if (!key) {
  39. return;
  40. }
  41. [self.keyValues removeObjectForKey:key];
  42. }
  43. - (NSString *)toJson{
  44. NSString *jsonString = @"{}";
  45. if (!self.keyValues || self.keyValues.count == 0) {
  46. return jsonString;
  47. }
  48. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self.keyValues
  49. options:NSJSONWritingFragmentsAllowed
  50. error:nil];
  51. if (!jsonData) {
  52. return jsonString;
  53. }
  54. jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  55. return jsonString;
  56. }
  57. @end
  58. @implementation QNUploadInfoReporter(ReportItem)
  59. - (void)reportItem:(QNReportItem *)item token:(NSString *)token{
  60. NSString *itemJsonString = [item toJson];
  61. QNLogInfo(@"up log:%@", itemJsonString);
  62. if (itemJsonString && ![itemJsonString isEqualToString:@"{}"]) {
  63. [kQNReporter report:itemJsonString token:token];
  64. }
  65. }
  66. @end
  67. @implementation QNResponseInfo(Report)
  68. - (NSNumber *)requestReportStatusCode{
  69. return @(self.statusCode);
  70. }
  71. - (NSString *)requestReportErrorType{
  72. NSString *errorType = nil;
  73. if (self.statusCode == -1){
  74. errorType = @"network_error";
  75. } else if (self.statusCode == kQNLocalIOError){
  76. errorType = @"local_io_error";
  77. } else if (self.statusCode == 100){
  78. errorType = @"protocol_error";
  79. } else if (self.statusCode > 199 && self.statusCode < 300) {
  80. // NSURLErrorFailingURLErrorKey
  81. } else if (self.statusCode > 299){
  82. errorType = @"response_error";
  83. } else if (self.statusCode == -1003){
  84. errorType = @"unknown_host";
  85. } else if (self.statusCode == -1009){
  86. errorType = @"network_slow";
  87. } else if (self.statusCode == -1001){
  88. errorType = @"timeout";
  89. } else if (self.statusCode == -1004){
  90. errorType = @"cannot_connect_to_host";
  91. } else if (self.statusCode == -1005 || self.statusCode == -1021){
  92. errorType = @"transmission_error";
  93. } else if ((self.statusCode <= -1200 && self.statusCode >= -1206) || self.statusCode == -2000 || self.statusCode == -9807){
  94. errorType = @"ssl_error";
  95. } else if (self.statusCode == -1015 || self.statusCode == -1016 || self.statusCode == -1017){
  96. errorType = @"parse_error";
  97. } else if (self.statusCode == -1007 || self.statusCode == -1010 || self.statusCode == kQNMaliciousResponseError){
  98. errorType = @"malicious_response";
  99. } else if (self.statusCode == kQNUnexpectedSysCallError
  100. || (self.statusCode > -1130 && self.statusCode <= -1010)){
  101. errorType = @"unexpected_syscall_error";
  102. } else if (self.statusCode == kQNRequestCancelled
  103. || self.statusCode == NSURLErrorCancelled){
  104. errorType = @"user_canceled";
  105. } else {
  106. errorType = @"unknown_error";
  107. }
  108. return errorType;
  109. }
  110. - (NSString *)qualityResult{
  111. NSString *result = nil;
  112. if (self.statusCode > 199 && self.statusCode < 300) {
  113. result = @"ok";
  114. } else if (self.statusCode > 399 &&
  115. (self.statusCode < 500 || self.statusCode == 573 || self.statusCode == 579 ||
  116. self.statusCode == 608 || self.statusCode == 612 || self.statusCode == 614 || self.statusCode == 630 || self.statusCode == 631 ||
  117. self.statusCode == 701)) {
  118. result = @"bad_request";
  119. } else if (self.statusCode == kQNZeroDataSize){
  120. result = @"zero_size_file";
  121. } else if (self.statusCode == kQNFileError){
  122. result = @"invalid_file";
  123. } else if (self.statusCode == kQNInvalidToken
  124. || self.statusCode == kQNInvalidArgument){
  125. result = @"invalid_args";
  126. }
  127. if (result == nil) {
  128. result = [self requestReportErrorType];
  129. }
  130. return result;
  131. }
  132. @end
  133. //MARK:-- 日志类型
  134. NSString * const QNReportLogTypeRequest = @"request";
  135. NSString * const QNReportLogTypeBlock = @"block";
  136. NSString * const QNReportLogTypeQuality = @"quality";
  137. //MARK:-- 请求信息打点⽇志
  138. NSString * const QNReportRequestKeyLogType = @"log_type";
  139. NSString * const QNReportRequestKeyUpTime = @"up_time";
  140. NSString * const QNReportRequestKeyStatusCode = @"status_code";
  141. NSString * const QNReportRequestKeyRequestId = @"req_id";
  142. NSString * const QNReportRequestKeyHost = @"host";
  143. NSString * const QNReportRequestKeyHttpVersion = @"http_version";
  144. NSString * const QNReportRequestKeyRemoteIp = @"remote_ip";
  145. NSString * const QNReportRequestKeyPort = @"port";
  146. NSString * const QNReportRequestKeyTargetBucket = @"target_bucket";
  147. NSString * const QNReportRequestKeyTargetKey = @"target_key";
  148. NSString * const QNReportRequestKeyTotalElapsedTime = @"total_elapsed_time";
  149. NSString * const QNReportRequestKeyDnsElapsedTime = @"dns_elapsed_time";
  150. NSString * const QNReportRequestKeyConnectElapsedTime = @"connect_elapsed_time";
  151. NSString * const QNReportRequestKeyTLSConnectElapsedTime = @"tls_connect_elapsed_time";
  152. NSString * const QNReportRequestKeyRequestElapsedTime = @"request_elapsed_time";
  153. NSString * const QNReportRequestKeyWaitElapsedTime = @"wait_elapsed_time";
  154. NSString * const QNReportRequestKeyResponseElapsedTime = @"response_elapsed_time";
  155. NSString * const QNReportRequestKeyFileOffset = @"file_offset";
  156. NSString * const QNReportRequestKeyBytesSent = @"bytes_sent";
  157. NSString * const QNReportRequestKeyBytesTotal = @"bytes_total";
  158. NSString * const QNReportRequestKeyPid = @"pid";
  159. NSString * const QNReportRequestKeyTid = @"tid";
  160. NSString * const QNReportRequestKeyTargetRegionId = @"target_region_id";
  161. NSString * const QNReportRequestKeyCurrentRegionId = @"current_region_id";
  162. NSString * const QNReportRequestKeyErrorType = @"error_type";
  163. NSString * const QNReportRequestKeyErrorDescription = @"error_description";
  164. NSString * const QNReportRequestKeyUpType = @"up_type";
  165. NSString * const QNReportRequestKeyOsName = @"os_name";
  166. NSString * const QNReportRequestKeyOsVersion = @"os_version";
  167. NSString * const QNReportRequestKeySDKName = @"sdk_name";
  168. NSString * const QNReportRequestKeySDKVersion = @"sdk_version";
  169. NSString * const QNReportRequestKeyClientTime = @"client_time";
  170. NSString * const QNReportRequestKeyHttpClient = @"http_client";
  171. NSString * const QNReportRequestKeyNetworkType = @"network_type";
  172. NSString * const QNReportRequestKeySignalStrength = @"signal_strength";
  173. NSString * const QNReportRequestKeyPrefetchedDnsSource = @"prefetched_dns_source";
  174. NSString * const QNReportRequestKeyDnsSource = @"dns_source";
  175. NSString * const QNReportRequestKeyDnsErrorMessage = @"dns_error_message";
  176. NSString * const QNReportRequestKeyPrefetchedBefore = @"prefetched_before";
  177. NSString * const QNReportRequestKeyPrefetchedErrorMessage = @"prefetched_error_message";
  178. NSString * const QNReportRequestKeyNetworkMeasuring = @"network_measuring";
  179. NSString * const QNReportRequestKeyPerceptiveSpeed = @"perceptive_speed";
  180. NSString * const QNReportRequestKeyHijacking = @"hijacking";
  181. //MARK:-- 分块上传统计⽇志
  182. NSString * const QNReportBlockKeyLogType = @"log_type";
  183. NSString * const QNReportBlockKeyUpTime = @"up_time";
  184. NSString * const QNReportBlockKeyTargetBucket = @"target_bucket";
  185. NSString * const QNReportBlockKeyTargetKey = @"target_key";
  186. NSString * const QNReportBlockKeyTargetRegionId = @"target_region_id";
  187. NSString * const QNReportBlockKeyCurrentRegionId = @"current_region_id";
  188. NSString * const QNReportBlockKeyTotalElapsedTime = @"total_elapsed_time";
  189. NSString * const QNReportBlockKeyBytesSent = @"bytes_sent";
  190. NSString * const QNReportBlockKeyRecoveredFrom = @"recovered_from";
  191. NSString * const QNReportBlockKeyFileSize = @"file_size";
  192. NSString * const QNReportBlockKeyPid = @"pid";
  193. NSString * const QNReportBlockKeyTid = @"tid";
  194. NSString * const QNReportBlockKeyUpApiVersion = @"up_api_version";
  195. NSString * const QNReportBlockKeyClientTime = @"client_time";
  196. NSString * const QNReportBlockKeyOsName = @"os_name";
  197. NSString * const QNReportBlockKeyOsVersion = @"os_version";
  198. NSString * const QNReportBlockKeySDKName = @"sdk_name";
  199. NSString * const QNReportBlockKeySDKVersion = @"sdk_version";
  200. NSString * const QNReportBlockKeyPerceptiveSpeed = @"perceptive_speed";
  201. NSString * const QNReportBlockKeyHijacking = @"hijacking";
  202. //MARK:-- 上传质量统计
  203. NSString * const QNReportQualityKeyLogType = @"log_type";
  204. NSString * const QNReportQualityKeyUpType = @"up_type";
  205. NSString * const QNReportQualityKeyUpTime = @"up_time";
  206. NSString * const QNReportQualityKeyResult = @"result";
  207. NSString * const QNReportQualityKeyTargetBucket = @"target_bucket";
  208. NSString * const QNReportQualityKeyTargetKey = @"target_key";
  209. NSString * const QNReportQualityKeyTotalElapsedTime = @"total_elapsed_time";
  210. NSString * const QNReportQualityKeyUcQueryElapsedTime = @"uc_query_elapsed_time";
  211. NSString * const QNReportQualityKeyRequestsCount = @"requests_count";
  212. NSString * const QNReportQualityKeyRegionsCount = @"regions_count";
  213. NSString * const QNReportQualityKeyBytesSent = @"bytes_sent";
  214. NSString * const QNReportQualityKeyFileSize = @"file_size";
  215. NSString * const QNReportQualityKeyCloudType = @"cloud_type";
  216. NSString * const QNReportQualityKeyErrorType = @"error_type";
  217. NSString * const QNReportQualityKeyErrorDescription = @"error_description";
  218. NSString * const QNReportQualityKeyOsName = @"os_name";
  219. NSString * const QNReportQualityKeyOsVersion = @"os_version";
  220. NSString * const QNReportQualityKeySDKName = @"sdk_name";
  221. NSString * const QNReportQualityKeySDKVersion = @"sdk_version";
  222. NSString * const QNReportQualityKeyPerceptiveSpeed = @"perceptive_speed";
  223. NSString * const QNReportQualityKeyHijacking = @"hijacking";