QNReportItem.m 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  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. [self.keyValues setValue:value forKey:key];
  33. }
  34. - (void)removeReportValueForKey:(NSString * _Nullable)key{
  35. if (!key) {
  36. return;
  37. }
  38. [self.keyValues removeObjectForKey:key];
  39. }
  40. - (NSString *)toJson{
  41. NSString *jsonString = @"{}";
  42. if (!self.keyValues || self.keyValues.count == 0) {
  43. return jsonString;
  44. }
  45. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self.keyValues
  46. options:NSJSONWritingFragmentsAllowed
  47. error:nil];
  48. if (!jsonData) {
  49. return jsonString;
  50. }
  51. jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  52. return jsonString;
  53. }
  54. @end
  55. @implementation QNUploadInfoReporter(ReportItem)
  56. - (void)reportItem:(QNReportItem *)item token:(NSString *)token{
  57. QNAsyncRun(^{
  58. NSString *itemJsonString = [item toJson];
  59. QNLogInfo(@"up log:%@", itemJsonString);
  60. if (itemJsonString && ![itemJsonString isEqualToString:@"{}"]) {
  61. [self report:itemJsonString token:token];
  62. }
  63. });
  64. }
  65. @end
  66. @implementation QNResponseInfo(Report)
  67. - (NSNumber *)requestReportStatusCode{
  68. return @(self.statusCode);
  69. }
  70. - (NSString *)requestReportErrorType{
  71. NSString *errorType = nil;
  72. if (self.statusCode == -1){
  73. errorType = @"network_error";
  74. } else if (self.statusCode == kQNLocalIOError){
  75. errorType = @"local_io_error";
  76. } else if (self.statusCode == 100){
  77. errorType = @"protocol_error";
  78. } else if (self.statusCode > 199 && self.statusCode < 300) {
  79. // NSURLErrorFailingURLErrorKey
  80. } else if (self.statusCode > 299){
  81. errorType = @"response_error";
  82. } else if (self.statusCode == -1003){
  83. errorType = @"unknown_host";
  84. } else if (self.statusCode == -1009){
  85. errorType = @"network_slow";
  86. } else if (self.statusCode == -1001){
  87. errorType = @"timeout";
  88. } else if (self.statusCode == -1004){
  89. errorType = @"cannot_connect_to_host";
  90. } else if (self.statusCode == -1005 || self.statusCode == -1021){
  91. errorType = @"transmission_error";
  92. } else if (self.statusCode == -1200 || self.statusCode == -1201 || self.statusCode == -1202
  93. || self.statusCode == -1203 || self.statusCode == -1204 || self.statusCode == -1205
  94. || self.statusCode == -1206 || self.statusCode == -9807){
  95. errorType = @"ssl_error";
  96. } else if (self.statusCode == -1015 || self.statusCode == -1016 || self.statusCode == -1017){
  97. errorType = @"parse_error";
  98. } else if (self.statusCode == -1007 || self.statusCode == -1010 || self.statusCode == kQNMaliciousResponseError){
  99. errorType = @"malicious_response";
  100. } else if (self.statusCode == kQNUnexpectedSysCallError || (self.statusCode > -1130 && self.statusCode <= -1100)){
  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 QNReportRequestKeyPrefetchedBefore = @"prefetched_before";
  175. NSString * const QNReportRequestKeyPrefetchedErrorMessage = @"prefetched_error_message";
  176. NSString * const QNReportRequestKeyNetworkMeasuring = @"network_measuring";
  177. //MARK:-- 分块上传统计⽇志
  178. NSString * const QNReportBlockKeyLogType = @"log_type";
  179. NSString * const QNReportBlockKeyUpTime = @"up_time";
  180. NSString * const QNReportBlockKeyTargetBucket = @"target_bucket";
  181. NSString * const QNReportBlockKeyTargetKey = @"target_key";
  182. NSString * const QNReportBlockKeyTargetRegionId = @"target_region_id";
  183. NSString * const QNReportBlockKeyCurrentRegionId = @"current_region_id";
  184. NSString * const QNReportBlockKeyTotalElapsedTime = @"total_elapsed_time";
  185. NSString * const QNReportBlockKeyBytesSent = @"bytes_sent";
  186. NSString * const QNReportBlockKeyRecoveredFrom = @"recovered_from";
  187. NSString * const QNReportBlockKeyFileSize = @"file_size";
  188. NSString * const QNReportBlockKeyPid = @"pid";
  189. NSString * const QNReportBlockKeyTid = @"tid";
  190. NSString * const QNReportBlockKeyUpApiVersion = @"up_api_version";
  191. NSString * const QNReportBlockKeyClientTime = @"client_time";
  192. NSString * const QNReportBlockKeyOsName = @"os_name";
  193. NSString * const QNReportBlockKeyOsVersion = @"os_version";
  194. NSString * const QNReportBlockKeySDKName = @"sdk_name";
  195. NSString * const QNReportBlockKeySDKVersion = @"sdk_version";
  196. //MARK:-- 上传质量统计
  197. NSString * const QNReportQualityKeyLogType = @"log_type";
  198. NSString * const QNReportQualityKeyUpTime = @"up_time";
  199. NSString * const QNReportQualityKeyResult = @"result";
  200. NSString * const QNReportQualityKeyTargetBucket = @"target_bucket";
  201. NSString * const QNReportQualityKeyTargetKey = @"target_key";
  202. NSString * const QNReportQualityKeyTotalElapsedTime = @"total_elapsed_time";
  203. NSString * const QNReportQualityKeyRequestsCount = @"requests_count";
  204. NSString * const QNReportQualityKeyRegionsCount = @"regions_count";
  205. NSString * const QNReportQualityKeyBytesSent = @"bytes_sent";
  206. NSString * const QNReportQualityKeyCloudType = @"cloud_type";
  207. NSString * const QNReportQualityKeyErrorType = @"error_type";
  208. NSString * const QNReportQualityKeyErrorDescription = @"error_description";
  209. NSString * const QNReportQualityKeyOsName = @"os_name";
  210. NSString * const QNReportQualityKeyOsVersion = @"os_version";
  211. NSString * const QNReportQualityKeySDKName = @"sdk_name";
  212. NSString * const QNReportQualityKeySDKVersion = @"sdk_version";