From 013bf62f7c807d5ae648badef6c705ec061052ac Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 26 Jul 2017 14:48:36 -0400 Subject: [PATCH 1/3] Streamline analytics properties. // FREEBIE --- Signal/src/AppDelegate.m | 1 - SignalServiceKit/src/Util/OWSAnalytics.h | 2 - SignalServiceKit/src/Util/OWSAnalytics.m | 106 ++++++++--------------- 3 files changed, 38 insertions(+), 71 deletions(-) diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index d6c131d7c..f64715365 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -795,7 +795,6 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; [DeviceSleepManager.sharedInstance removeBlockWithBlockObject:self]; - [OWSAnalytics appLaunchDidComplete]; [AppVersion.instance appLaunchDidComplete]; [self ensureRootViewController]; diff --git a/SignalServiceKit/src/Util/OWSAnalytics.h b/SignalServiceKit/src/Util/OWSAnalytics.h index f49bc058e..1fd8aa2a1 100755 --- a/SignalServiceKit/src/Util/OWSAnalytics.h +++ b/SignalServiceKit/src/Util/OWSAnalytics.h @@ -38,8 +38,6 @@ typedef NS_ENUM(NSUInteger, OWSAnalyticsSeverity) { + (void)appLaunchDidBegin; -+ (void)appLaunchDidComplete; - + (long)orderOfMagnitudeOf:(long)value; @end diff --git a/SignalServiceKit/src/Util/OWSAnalytics.m b/SignalServiceKit/src/Util/OWSAnalytics.m index 3106f5259..4fa32b049 100755 --- a/SignalServiceKit/src/Util/OWSAnalytics.m +++ b/SignalServiceKit/src/Util/OWSAnalytics.m @@ -3,20 +3,14 @@ // #import "OWSAnalytics.h" -#import "AppVersion.h" #import "OWSQueues.h" #import "TSStorageManager.h" #import #import +#include NS_ASSUME_NONNULL_BEGIN -#if TARGET_IPHONE_SIMULATOR - -#define NO_SIGNAL_ANALYTICS - -#else - #ifdef DEBUG // TODO: Disable analytics for debug builds. @@ -24,14 +18,8 @@ NS_ASSUME_NONNULL_BEGIN #endif -#endif - NSString *const kOWSAnalytics_EventsCollection = @"kOWSAnalytics_EventsCollection"; -NSString *const kOWSAnalytics_Collection = @"kOWSAnalytics_Collection"; -NSString *const kOWSAnalytics_KeyLaunchCount = @"kOWSAnalytics_KeyLaunchCount"; -NSString *const kOWSAnalytics_KeyLaunchCompleteCount = @"kOWSAnalytics_KeyLaunchCompleteCount"; - // Percentage of analytics events to discard. 0 <= x <= 100. const int kOWSAnalytics_DiscardFrequency = 0; @@ -54,9 +42,6 @@ NSString *NSStringForOWSAnalyticsSeverity(OWSAnalyticsSeverity severity) @property (atomic) BOOL hasRequestInFlight; -@property (atomic) NSNumber *launchCount; -@property (atomic) NSNumber *launchCompleteCount; - @end #pragma mark - @@ -276,25 +261,46 @@ NSString *NSStringForOWSAnalyticsSeverity(OWSAnalyticsSeverity severity) return queue; } +- (NSString *)operatingSystemVersionString +{ + static NSString *result = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + NSOperatingSystemVersion operatingSystemVersion = [[NSProcessInfo processInfo] operatingSystemVersion]; + result = [NSString stringWithFormat:@"%zd.%zd.%zd", + operatingSystemVersion.majorVersion, + operatingSystemVersion.minorVersion, + operatingSystemVersion.patchVersion]; + }); + return result; +} + +- (NSString *)deviceHardwareModel +{ + static NSString *result = nil; + static dispatch_once_t onceToken; + dispatch_once(&onceToken, ^{ + size_t size; + char *kHwModel = "hw.model"; + sysctlbyname(kHwModel, NULL, &size, NULL, 0); + + char *answer = malloc(size); + sysctlbyname(kHwModel, answer, &size, NULL, 0); + + result = [NSString stringWithCString:answer encoding:NSUTF8StringEncoding]; + + free(answer); + }); + return result; +} + - (NSDictionary *)eventSuperProperties { NSMutableDictionary *result = [NSMutableDictionary new]; - if (AppVersion.instance.firstAppVersion) { - result[@"app_version_first"] = AppVersion.instance.firstAppVersion; - } - if (AppVersion.instance.lastAppVersion) { - result[@"app_version_last"] = AppVersion.instance.lastAppVersion; - } - if (AppVersion.instance.currentAppVersion) { - result[@"app_version_current"] = AppVersion.instance.currentAppVersion; - } - NSNumber *launchCount = self.launchCount; - if (launchCount) { - result[@"launch_count"] = @([self orderOfMagnitudeOf:launchCount.longValue]); - } - // TODO: Order of magnitude: thread count. - // TODO: Order of magnitude: total message count. - + result[@"app_version"] = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; + result[@"platform"] = @"ios"; + result[@"ios_version"] = self.operatingSystemVersionString; + result[@"device_model"] = self.deviceHardwareModel; return result; } @@ -426,42 +432,6 @@ NSString *NSStringForOWSAnalyticsSeverity(OWSAnalyticsSeverity severity) - (void)appLaunchDidBegin { OWSProdInfo(@"app_launch"); - - [self.dbConnection readWithBlock:^(YapDatabaseReadTransaction *transaction) { - NSNumber *oldLaunchCount = - [transaction objectForKey:kOWSAnalytics_KeyLaunchCount inCollection:kOWSAnalytics_Collection]; - NSNumber *newLaunchCount = @(oldLaunchCount.longValue + 1); - self.launchCount = newLaunchCount; - - NSNumber *oldLaunchCompleteCount = - [transaction objectForKey:kOWSAnalytics_KeyLaunchCompleteCount inCollection:kOWSAnalytics_Collection]; - self.launchCompleteCount = @(oldLaunchCompleteCount.longValue); - }]; - [self.dbConnection - asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { - [transaction setObject:self.launchCount - forKey:kOWSAnalytics_KeyLaunchCount - inCollection:kOWSAnalytics_Collection]; - }]; -} - -+ (void)appLaunchDidComplete -{ - [self.sharedInstance appLaunchDidComplete]; -} - -- (void)appLaunchDidComplete -{ - OWSProdInfo(@"app_launch_complete"); - - self.launchCompleteCount = @(self.launchCompleteCount.longValue + 1); - - [self.dbConnection - asyncReadWriteWithBlock:^(YapDatabaseReadWriteTransaction *_Nonnull transaction) { - [transaction setObject:self.launchCompleteCount - forKey:kOWSAnalytics_KeyLaunchCompleteCount - inCollection:kOWSAnalytics_Collection]; - }]; } #pragma mark - Logging From f973af5a83056d5d14f4ea00de08bf35faf9f50d Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 26 Jul 2017 14:58:58 -0400 Subject: [PATCH 2/3] Streamline analytics properties. // FREEBIE --- Signal/src/AppDelegate.m | 2 +- .../Migrations/OWS103EnableVideoCalling.m | 3 +- Signal/src/environment/VersionMigrations.m | 2 +- .../src/Account/TSAccountManager.m | 8 +- .../src/Account/TSPreKeyManager.m | 19 ++--- .../src/Contacts/ContactsUpdater.m | 2 +- .../Attachments/OWSAttachmentsProcessor.m | 2 +- .../src/Messages/OWSMessageSender.m | 10 +-- .../src/Messages/TSMessagesManager.m | 26 +----- .../API/OWSDeviceProvisioningCodeService.m | 2 +- .../API/OWSDeviceProvisioningService.m | 2 +- .../src/Network/API/OWSDevicesService.m | 4 +- .../src/Storage/TSStorageManager.m | 19 +---- SignalServiceKit/src/Util/OWSAnalytics.h | 83 ------------------- 14 files changed, 34 insertions(+), 150 deletions(-) diff --git a/Signal/src/AppDelegate.m b/Signal/src/AppDelegate.m index f64715365..9d49b498c 100644 --- a/Signal/src/AppDelegate.m +++ b/Signal/src/AppDelegate.m @@ -263,7 +263,7 @@ static NSString *const kURLHostVerifyPrefix = @"verify"; - (void)application:(UIApplication *)application didFailToRegisterForRemoteNotificationsWithError:(NSError *)error { - OWSProdErrorWNSError(@"app_delegate_error_failed_to_register_for_remote_notifications", error); + OWSProdError(@"app_delegate_error_failed_to_register_for_remote_notifications"); #ifdef DEBUG DDLogWarn(@"%@ We're in debug mode. Faking success for remote registration with a fake push identifier", self.tag); [PushManager.sharedManager.pushNotificationFutureSource trySetResult:[[NSMutableData dataWithLength:32] copy]]; diff --git a/Signal/src/environment/Migrations/OWS103EnableVideoCalling.m b/Signal/src/environment/Migrations/OWS103EnableVideoCalling.m index 678ac2055..ef2859f95 100644 --- a/Signal/src/environment/Migrations/OWS103EnableVideoCalling.m +++ b/Signal/src/environment/Migrations/OWS103EnableVideoCalling.m @@ -35,8 +35,7 @@ static NSString *const OWS103EnableVideoCallingMigrationId = @"103"; } failure:^(NSURLSessionDataTask *task, NSError *error) { if (!IsNSErrorNetworkFailure(error)) { - OWSProdErrorWNSError( - @"error_enable_video_calling_request_failed", error); + OWSProdError(@"error_enable_video_calling_request_failed"); } DDLogError(@"%@ failed with error: %@", self.tag, error); }]; diff --git a/Signal/src/environment/VersionMigrations.m b/Signal/src/environment/VersionMigrations.m index 4ba182cbf..1e3a20a2e 100644 --- a/Signal/src/environment/VersionMigrations.m +++ b/Signal/src/environment/VersionMigrations.m @@ -151,7 +151,7 @@ } failure:^(NSURLSessionDataTask *task, NSError *error) { if (!IsNSErrorNetworkFailure(error)) { - OWSProdErrorWNSError(@"error_update_attributes_request_failed", error); + OWSProdError(@"error_update_attributes_request_failed"); } success = NO; DDLogError(@"Updating attributess failed with error: %@", error.description); diff --git a/SignalServiceKit/src/Account/TSAccountManager.m b/SignalServiceKit/src/Account/TSAccountManager.m index 6ce48ff9a..ab0831f20 100644 --- a/SignalServiceKit/src/Account/TSAccountManager.m +++ b/SignalServiceKit/src/Account/TSAccountManager.m @@ -160,7 +160,7 @@ NSString *const kNSNotificationName_LocalNumberDidChange = @"kNSNotificationName remainingRetries:remainingRetries - 1]; } else { if (!IsNSErrorNetworkFailure(error)) { - OWSProdErrorWNSError(@"accounts_error_register_push_tokens_failed", error); + OWSProdError(@"accounts_error_register_push_tokens_failed"); } failureHandler(error); } @@ -197,7 +197,7 @@ NSString *const kNSNotificationName_LocalNumberDidChange = @"kNSNotificationName } failure:^(NSURLSessionDataTask *task, NSError *error) { if (!IsNSErrorNetworkFailure(error)) { - OWSProdErrorWNSError(@"accounts_error_verification_code_request_failed", error); + OWSProdError(@"accounts_error_verification_code_request_failed"); } DDLogError(@"%@ Failed to request verification code request with error:%@", self.tag, error); failureBlock(error); @@ -270,7 +270,7 @@ NSString *const kNSNotificationName_LocalNumberDidChange = @"kNSNotificationName } failure:^(NSURLSessionDataTask *task, NSError *error) { if (!IsNSErrorNetworkFailure(error)) { - OWSProdErrorWNSError(@"accounts_error_verify_account_request_failed", error); + OWSProdError(@"accounts_error_verify_account_request_failed"); } DDLogWarn(@"%@ Error verifying code: %@", self.tag, error.debugDescription); switch (error.code) { @@ -326,7 +326,7 @@ NSString *const kNSNotificationName_LocalNumberDidChange = @"kNSNotificationName } failure:^(NSURLSessionDataTask *task, NSError *error) { if (!IsNSErrorNetworkFailure(error)) { - OWSProdErrorWNSError(@"accounts_error_unregister_account_request_failed", error); + OWSProdError(@"accounts_error_unregister_account_request_failed"); } DDLogError(@"%@ Failed to unregister with error: %@", self.tag, error); failureBlock(error); diff --git a/SignalServiceKit/src/Account/TSPreKeyManager.m b/SignalServiceKit/src/Account/TSPreKeyManager.m index 4e9097f6d..6a926ef2f 100644 --- a/SignalServiceKit/src/Account/TSPreKeyManager.m +++ b/SignalServiceKit/src/Account/TSPreKeyManager.m @@ -183,9 +183,9 @@ static const NSTimeInterval kSignedPreKeyUpdateFailureMaxFailureDuration = 10 * failure:^(NSURLSessionDataTask *task, NSError *error) { if (!IsNSErrorNetworkFailure(error)) { if (modeCopy == RefreshPreKeysMode_SignedAndOneTime) { - OWSProdErrorWNSError(@"error_prekeys_update_failed_signed_and_onetime", error); + OWSProdError(@"error_prekeys_update_failed_signed_and_onetime"); } else { - OWSProdErrorWNSError(@"error_prekeys_update_failed_just_signed", error); + OWSProdError(@"error_prekeys_update_failed_just_signed"); } } @@ -305,7 +305,7 @@ static const NSTimeInterval kSignedPreKeyUpdateFailureMaxFailureDuration = 10 * } failure:^(NSURLSessionDataTask *task, NSError *error) { if (!IsNSErrorNetworkFailure(error)) { - OWSProdErrorWNSError(@"error_prekeys_current_signed_prekey_request_failed", error); + OWSProdError(@"error_prekeys_current_signed_prekey_request_failed"); } DDLogWarn(@"%@ Could not retrieve current signed key from the service.", self.tag); @@ -316,7 +316,7 @@ static const NSTimeInterval kSignedPreKeyUpdateFailureMaxFailureDuration = 10 * } failure:^(NSURLSessionDataTask *task, NSError *error) { if (!IsNSErrorNetworkFailure(error)) { - OWSProdErrorWNSError(@"error_prekeys_available_prekeys_request_failed", error); + OWSProdError(@"error_prekeys_available_prekeys_request_failed"); } DDLogError(@"%@ Failed to retrieve the number of available prekeys.", self.tag); @@ -401,12 +401,11 @@ static const NSTimeInterval kSignedPreKeyUpdateFailureMaxFailureDuration = 10 * } } - OWSProdInfoWParams(@"prekeys_deleted_old_signed_prekey", ^{ - return (@{ - @"generated" : [dateFormatter stringFromDate:signedPrekey.generatedAt], - @"accepted" : @(signedPrekey.wasAcceptedByService), - }); - }); + if (signedPrekey.wasAcceptedByService) { + OWSProdInfo(@"prekeys_deleted_old_accepted_signed_prekey"); + } else { + OWSProdInfo(@"prekeys_deleted_old_unaccepted_signed_prekey"); + } oldSignedPreKeyCount--; [storageManager removeSignedPreKey:signedPrekey.Id]; diff --git a/SignalServiceKit/src/Contacts/ContactsUpdater.m b/SignalServiceKit/src/Contacts/ContactsUpdater.m index b4583ef60..2d68dae6d 100644 --- a/SignalServiceKit/src/Contacts/ContactsUpdater.m +++ b/SignalServiceKit/src/Contacts/ContactsUpdater.m @@ -206,7 +206,7 @@ NS_ASSUME_NONNULL_BEGIN } failure:^(NSURLSessionDataTask *task, NSError *error) { if (!IsNSErrorNetworkFailure(error)) { - OWSProdErrorWNSError(@"contacts_error_contacts_intersection_failed", error); + OWSProdError(@"contacts_error_contacts_intersection_failed"); } NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response; diff --git a/SignalServiceKit/src/Messages/Attachments/OWSAttachmentsProcessor.m b/SignalServiceKit/src/Messages/Attachments/OWSAttachmentsProcessor.m index 2f0be843d..d799b4f0c 100644 --- a/SignalServiceKit/src/Messages/Attachments/OWSAttachmentsProcessor.m +++ b/SignalServiceKit/src/Messages/Attachments/OWSAttachmentsProcessor.m @@ -187,7 +187,7 @@ static const CGFloat kAttachmentDownloadProgressTheta = 0.001f; } failure:^(NSURLSessionDataTask *task, NSError *error) { if (!IsNSErrorNetworkFailure(error)) { - OWSProdErrorWNSError(@"error_attachment_request_failed", error); + OWSProdError(@"error_attachment_request_failed"); } DDLogError(@"Failed retrieval of attachment with error: %@", error); if (attachment.serverId < 100) { diff --git a/SignalServiceKit/src/Messages/OWSMessageSender.m b/SignalServiceKit/src/Messages/OWSMessageSender.m index 65866243a..1d50095ec 100644 --- a/SignalServiceKit/src/Messages/OWSMessageSender.m +++ b/SignalServiceKit/src/Messages/OWSMessageSender.m @@ -539,7 +539,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; NSError *error; [attachmentStream writeData:dataCopy error:&error]; if (error) { - OWSProdErrorWNSError(@"message_sender_error_could_not_write_attachment", error); + OWSProdError(@"message_sender_error_could_not_write_attachment"); return failureHandler(error); } @@ -652,7 +652,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; [self unregisteredRecipient:recipient message:message thread:thread]; } - OWSProdErrorWNSError(@"message_sender_error_could_not_find_contacts_3", error); + OWSProdError(@"message_sender_error_could_not_find_contacts_3"); // No need to repeat trying to find a failure. Apart from repeatedly failing, it would also cause us // to print redundant error messages. [error setIsRetryable:NO]; @@ -1013,7 +1013,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; NSDictionary *serializedResponse = [NSJSONSerialization JSONObjectWithData:responseData options:0 error:&error]; if (error) { - OWSProdErrorWNSError(@"message_sender_error_could_not_parse_mismatched_devices_json", error); + OWSProdError(@"message_sender_error_could_not_parse_mismatched_devices_json"); [error setIsRetryable:YES]; return failureHandler(error); } @@ -1217,7 +1217,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; } failure:^(NSURLSessionDataTask *task, NSError *error) { if (!IsNSErrorNetworkFailure(error)) { - OWSProdErrorWNSError(@"message_sender_error_recipient_prekey_request_failed", error); + OWSProdError(@"message_sender_error_recipient_prekey_request_failed"); } DDLogError(@"Server replied to PreKeyBundle request with error: %@", error); NSHTTPURLResponse *response = (NSHTTPURLResponse *)task.response; @@ -1290,7 +1290,7 @@ NSString *const OWSMessageSenderRateLimitedException = @"RateLimitedException"; NSDictionary *jsonDict = [MTLJSONAdapter JSONDictionaryFromModel:messageParams error:&error]; if (error) { - OWSProdErrorWNSError(@"message_send_error_could_not_serialize_message_json", error); + OWSProdError(@"message_send_error_could_not_serialize_message_json"); return nil; } diff --git a/SignalServiceKit/src/Messages/TSMessagesManager.m b/SignalServiceKit/src/Messages/TSMessagesManager.m index ea6161d8c..9e0b05598 100644 --- a/SignalServiceKit/src/Messages/TSMessagesManager.m +++ b/SignalServiceKit/src/Messages/TSMessagesManager.m @@ -42,22 +42,6 @@ NS_ASSUME_NONNULL_BEGIN -#define kOWSAnalyticsParameterEnvelopeIsLegacy @"envelope_is_legacy" -#define kOWSAnalyticsParameterEnvelopeHasContent @"has_content" -#define kOWSAnalyticsParameterEnvelopeType @"envelope_type" -#define kOWSAnalyticsParameterEnvelopeEncryptedLength @"encrypted_length" - -#define AnalyticsParametersFromEnvelope(__envelope) \ - ^{ \ - NSData *__encryptedData = __envelope.hasContent ? __envelope.content : __envelope.legacyMessage; \ - return (@{ \ - kOWSAnalyticsParameterEnvelopeIsLegacy : @(__envelope.hasLegacyMessage), \ - kOWSAnalyticsParameterEnvelopeHasContent : @(__envelope.hasContent), \ - kOWSAnalyticsParameterEnvelopeType : [self descriptionForEnvelopeType:__envelope], \ - kOWSAnalyticsParameterEnvelopeEncryptedLength : @(__encryptedData.length), \ - }); \ - } - // The debug logs can be more verbose than the analytics events. // // In this case `descriptionForEnvelope` is valuable enough to @@ -69,7 +53,7 @@ NS_ASSUME_NONNULL_BEGIN __LINE__, \ __analyticsEventName, \ [self descriptionForEnvelope:__envelope]); \ - OWSProdErrorWParams(__analyticsEventName, AnalyticsParametersFromEnvelope(__envelope)) \ + OWSProdError(__analyticsEventName) \ } @interface TSMessagesManager () @@ -371,7 +355,7 @@ NS_ASSUME_NONNULL_BEGIN } } @catch (NSException *exception) { DDLogError(@"Received an incorrectly formatted protocol buffer: %@", exception.debugDescription); - OWSProdFailWNSException(@"message_manager_error_invalid_protocol_message", exception); + OWSProdFail(@"message_manager_error_invalid_protocol_message"); } completion(); @@ -410,11 +394,7 @@ NS_ASSUME_NONNULL_BEGIN NSUInteger kMaxEncryptedDataLength = 250 * 1024; if (encryptedData.length > kMaxEncryptedDataLength) { - OWSProdErrorWParams(@"message_manager_error_oversize_message", ^{ - return (@{ - @"message_size" : @([OWSAnalytics orderOfMagnitudeOf:(long)encryptedData.length]), - }); - }); + OWSProdError(@"message_manager_error_oversize_message"); completion(nil); return; } diff --git a/SignalServiceKit/src/Network/API/OWSDeviceProvisioningCodeService.m b/SignalServiceKit/src/Network/API/OWSDeviceProvisioningCodeService.m index e9198be64..1baebe043 100644 --- a/SignalServiceKit/src/Network/API/OWSDeviceProvisioningCodeService.m +++ b/SignalServiceKit/src/Network/API/OWSDeviceProvisioningCodeService.m @@ -51,7 +51,7 @@ NSString *const OWSDeviceProvisioningCodeServiceProvisioningCodeKey = @"verifica } failure:^(NSURLSessionDataTask *task, NSError *error) { if (!IsNSErrorNetworkFailure(error)) { - OWSProdErrorWNSError(@"error_provisioning_code_request_failed", error); + OWSProdError(@"error_provisioning_code_request_failed"); } DDLogVerbose(@"ProvisioningCode request failed with error: %@", error); failureCallback(error); diff --git a/SignalServiceKit/src/Network/API/OWSDeviceProvisioningService.m b/SignalServiceKit/src/Network/API/OWSDeviceProvisioningService.m index fa7c26b7a..9af433813 100644 --- a/SignalServiceKit/src/Network/API/OWSDeviceProvisioningService.m +++ b/SignalServiceKit/src/Network/API/OWSDeviceProvisioningService.m @@ -48,7 +48,7 @@ NS_ASSUME_NONNULL_BEGIN } failure:^(NSURLSessionDataTask *task, NSError *error) { if (!IsNSErrorNetworkFailure(error)) { - OWSProdErrorWNSError(@"error_provisioning_request_failed", error); + OWSProdError(@"error_provisioning_request_failed"); } DDLogVerbose(@"Provisioning request failed with error: %@", error); failureCallback(error); diff --git a/SignalServiceKit/src/Network/API/OWSDevicesService.m b/SignalServiceKit/src/Network/API/OWSDevicesService.m index e8e83b1df..93d3293da 100644 --- a/SignalServiceKit/src/Network/API/OWSDevicesService.m +++ b/SignalServiceKit/src/Network/API/OWSDevicesService.m @@ -33,7 +33,7 @@ NS_ASSUME_NONNULL_BEGIN } failure:^(NSURLSessionDataTask *task, NSError *error) { if (!IsNSErrorNetworkFailure(error)) { - OWSProdErrorWNSError(@"error_get_devices_failed", error); + OWSProdError(@"error_get_devices_failed"); } DDLogVerbose(@"Get devices request failed with error: %@", error); failureCallback(error); @@ -53,7 +53,7 @@ NS_ASSUME_NONNULL_BEGIN } failure:^(NSURLSessionDataTask *task, NSError *error) { if (!IsNSErrorNetworkFailure(error)) { - OWSProdErrorWNSError(@"error_unlink_device_failed", error); + OWSProdError(@"error_unlink_device_failed"); } DDLogVerbose(@"Get devices request failed with error: %@", error); failureCallback(error); diff --git a/SignalServiceKit/src/Storage/TSStorageManager.m b/SignalServiceKit/src/Storage/TSStorageManager.m index 8cc7e89ac..e77595a78 100644 --- a/SignalServiceKit/src/Storage/TSStorageManager.m +++ b/SignalServiceKit/src/Storage/TSStorageManager.m @@ -86,11 +86,7 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; - (nullable Class)unarchiver:(NSKeyedUnarchiver *)unarchiver cannotDecodeObjectOfClassName:(NSString *)name originalClasses:(NSArray *)classNames { - OWSProdErrorWParams(@"storage_error_could_not_decode_class", ^{ - return (@{ - @"class_name" : name, - }); - }); + OWSProdError(@"storage_error_could_not_decode_class"); return [OWSUnknownObject class]; } @@ -187,14 +183,7 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; return [unarchiver decodeObjectForKey:@"root"]; } @catch (NSException *exception) { // Sync log in case we bail. - OWSProdErrorWParams(@"storage_error_deserialization", ^{ - return (@{ - @"collection" : collection, - kOWSAnalyticsParameterNSExceptionName : exception.name, - kOWSAnalyticsParameterNSExceptionReason : exception.reason, - kOWSAnalyticsParameterNSExceptionClassName : NSStringFromClass([exception class]), - }); - }); + OWSProdError(@"storage_error_deserialization"); @throw exception; } }; @@ -264,7 +253,7 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; BOOL success = [ressourceURL setResourceValues:resourcesAttrs error:&error]; if (error || !success) { - OWSProdCriticalWNSError(@"storage_error_file_protection", error); + OWSProdCritical(@"storage_error_file_protection"); } } @@ -383,7 +372,7 @@ static NSString *keychainDBPassAccount = @"TSDatabasePass"; NSError *keySetError; [SAMKeychain setPassword:newDBPassword forService:keychainService account:keychainDBPassAccount error:&keySetError]; if (keySetError) { - OWSProdCriticalWNSError(@"storage_error_could_not_store_database_password", keySetError); + OWSProdCritical(@"storage_error_could_not_store_database_password"); [self deletePasswordFromKeychain]; diff --git a/SignalServiceKit/src/Util/OWSAnalytics.h b/SignalServiceKit/src/Util/OWSAnalytics.h index 1fd8aa2a1..21226d24d 100755 --- a/SignalServiceKit/src/Util/OWSAnalytics.h +++ b/SignalServiceKit/src/Util/OWSAnalytics.h @@ -44,33 +44,6 @@ typedef NS_ENUM(NSUInteger, OWSAnalyticsSeverity) { typedef NSDictionary *_Nonnull (^OWSProdAssertParametersBlock)(); -#define kOWSAnalyticsParameterDescription @"description" -#define kOWSAnalyticsParameterNSErrorDomain @"nserror_domain" -#define kOWSAnalyticsParameterNSErrorCode @"nserror_code" -#define kOWSAnalyticsParameterNSErrorDescription @"nserror_description" -#define kOWSAnalyticsParameterNSExceptionName @"nsexception_name" -#define kOWSAnalyticsParameterNSExceptionReason @"nsexception_reason" -#define kOWSAnalyticsParameterNSExceptionClassName @"nsexception_classname" - -// We don't include the error description because it may have PII. -#define AnalyticsParametersFromNSError(__nserror) \ - ^{ \ - return (@{ \ - kOWSAnalyticsParameterNSErrorDomain : (__nserror.domain ?: @"unknown"), \ - kOWSAnalyticsParameterNSErrorCode : @(__nserror.code), \ - }); \ - } - -#define AnalyticsParametersFromNSException(__exception) \ - ^{ \ - return (@{ \ - kOWSAnalyticsParameterNSExceptionName : (__exception.name ?: @"unknown"), \ - kOWSAnalyticsParameterNSExceptionReason : (__exception.reason ?: @"unknown"), \ - kOWSAnalyticsParameterNSExceptionClassName : \ - (__exception ? NSStringFromClass([__exception class]) : @"unknown"), \ - }); \ - } - // These methods should be used to assert errors for which we want to fire analytics events. // // In production, returns __Value, the assert value, so that we can handle this case. @@ -125,26 +98,6 @@ typedef NSDictionary *_Nonnull (^OWSProdAssertParametersBlock)() #define OWSProdCFail(__eventName) OWSProdCFailWParams(__eventName, nil) -// The debug logs can be more verbose than the analytics events. -// -// In this case `debugDescription` is valuable enough to -// log but too dangerous to include in the analytics event. -#define OWSProdFailWNSError(__eventName, __nserror) \ - { \ - DDLogError(@"%s:%d %@: %@", __PRETTY_FUNCTION__, __LINE__, __eventName, __nserror.debugDescription); \ - OWSProdFailWParams(__eventName, AnalyticsParametersFromNSError(__nserror)) \ - } - -// The debug logs can be more verbose than the analytics events. -// -// In this case `exception` is valuable enough to -// log but too dangerous to include in the analytics event. -#define OWSProdFailWNSException(__eventName, __exception) \ - { \ - DDLogError(@"%s:%d %@: %@", __PRETTY_FUNCTION__, __LINE__, __eventName, __exception); \ - OWSProdFailWParams(__eventName, AnalyticsParametersFromNSException(__exception)) \ - } - #define OWSProdCFail(__eventName) OWSProdCFailWParams(__eventName, nil) #define OWSProdEventWParams(__severityLevel, __eventName, __parametersBlock) \ @@ -172,26 +125,6 @@ typedef NSDictionary *_Nonnull (^OWSProdAssertParametersBlock)() #define OWSProdError(__eventName) OWSProdEventWParams(OWSAnalyticsSeverityError, __eventName, nil) -// The debug logs can be more verbose than the analytics events. -// -// In this case `debugDescription` is valuable enough to -// log but too dangerous to include in the analytics event. -#define OWSProdErrorWNSError(__eventName, __nserror) \ - { \ - DDLogError(@"%s:%d %@: %@", __PRETTY_FUNCTION__, __LINE__, __eventName, __nserror.debugDescription); \ - OWSProdErrorWParams(__eventName, AnalyticsParametersFromNSError(__nserror)) \ - } - -// The debug logs can be more verbose than the analytics events. -// -// In this case `exception` is valuable enough to -// log but too dangerous to include in the analytics event. -#define OWSProdErrorWNSException(__eventName, __exception) \ - { \ - DDLogError(@"%s:%d %@: %@", __PRETTY_FUNCTION__, __LINE__, __eventName, __exception); \ - OWSProdErrorWParams(__eventName, AnalyticsParametersFromNSException(__exception)) \ - } - #pragma mark - Critical Events #define OWSProdCriticalWParams(__eventName, __parametersBlock) \ @@ -199,20 +132,4 @@ typedef NSDictionary *_Nonnull (^OWSProdAssertParametersBlock)() #define OWSProdCritical(__eventName) OWSProdEventWParams(OWSAnalyticsSeverityCritical, __eventName, nil) -#define OWSProdCriticalWNSError(__eventName, __nserror) \ - { \ - DDLogError(@"%s:%d %@: %@", __PRETTY_FUNCTION__, __LINE__, __eventName, __nserror.debugDescription); \ - OWSProdCriticalWParams(__eventName, AnalyticsParametersFromNSError(__nserror)) \ - } - -// The debug logs can be more verbose than the analytics events. -// -// In this case `exception` is valuable enough to -// log but too dangerous to include in the analytics event. -#define OWSProdCriticalWNSException(__eventName, __exception) \ - { \ - DDLogError(@"%s:%d %@: %@", __PRETTY_FUNCTION__, __LINE__, __eventName, __exception); \ - OWSProdCriticalWParams(__eventName, AnalyticsParametersFromNSException(__exception)) \ - } - NS_ASSUME_NONNULL_END From 531489a8284e5924e8a15f2cdb4d645abde76787 Mon Sep 17 00:00:00 2001 From: Matthew Chen Date: Wed, 26 Jul 2017 14:59:19 -0400 Subject: [PATCH 3/3] Streamline analytics properties. // FREEBIE --- SignalServiceKit/src/Util/OWSAnalytics.m | 21 --------------------- 1 file changed, 21 deletions(-) diff --git a/SignalServiceKit/src/Util/OWSAnalytics.m b/SignalServiceKit/src/Util/OWSAnalytics.m index 4fa32b049..8046647d8 100755 --- a/SignalServiceKit/src/Util/OWSAnalytics.m +++ b/SignalServiceKit/src/Util/OWSAnalytics.m @@ -7,7 +7,6 @@ #import "TSStorageManager.h" #import #import -#include NS_ASSUME_NONNULL_BEGIN @@ -275,32 +274,12 @@ NSString *NSStringForOWSAnalyticsSeverity(OWSAnalyticsSeverity severity) return result; } -- (NSString *)deviceHardwareModel -{ - static NSString *result = nil; - static dispatch_once_t onceToken; - dispatch_once(&onceToken, ^{ - size_t size; - char *kHwModel = "hw.model"; - sysctlbyname(kHwModel, NULL, &size, NULL, 0); - - char *answer = malloc(size); - sysctlbyname(kHwModel, answer, &size, NULL, 0); - - result = [NSString stringWithCString:answer encoding:NSUTF8StringEncoding]; - - free(answer); - }); - return result; -} - - (NSDictionary *)eventSuperProperties { NSMutableDictionary *result = [NSMutableDictionary new]; result[@"app_version"] = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleShortVersionString"]; result[@"platform"] = @"ios"; result[@"ios_version"] = self.operatingSystemVersionString; - result[@"device_model"] = self.deviceHardwareModel; return result; }