Skip to content

Commit

Permalink
Merge pull request #234 from newrelic/prod7411
Browse files Browse the repository at this point in the history
New Relic iOS agent 7.4.11 (Production)
  • Loading branch information
cdillard-NewRelic authored Apr 29, 2024
2 parents a6fea93 + 095c02e commit 27af526
Show file tree
Hide file tree
Showing 65 changed files with 1,570 additions and 655 deletions.
2 changes: 1 addition & 1 deletion .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ jobs:

- uses: maxim-lobanov/setup-xcode@v1
with:
xcode-version: '14.2'
xcode-version: '14.3'

- name: Install lcov
run: brew install lcov
Expand Down
88 changes: 34 additions & 54 deletions Agent.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

3 changes: 2 additions & 1 deletion Agent/Analytics/Constants.h
Original file line number Diff line number Diff line change
Expand Up @@ -80,15 +80,16 @@ extern NSString *const kNRMA_Attrib_dtId;
extern NSString *const kNRMA_Attrib_dtTraceId;
extern NSString *const kNRMA_Attrib_name;
extern NSString *const kNRMA_Attrib_offline;
extern NSString *const kNRMA_Attrib_background;

extern NSString *const kNRMA_Val_errorType_HTTP;
extern NSString *const kNRMA_Val_errorType_Network;

extern NSString *const kNRMA_Attrib_file;
extern NSString *const kNRMA_Attrib_file_private;
extern NSString *const kNRMA_EventStoreFilename;

extern NSString *const kNRMA_Offline_folder;

// Integer Analytics Constants
static int kNRMA_Attrib_Max_Name_Length = 256;
static int kNRMA_Attrib_Max_Value_Size_Bytes = 4096;
Expand Down
2 changes: 2 additions & 0 deletions Agent/Analytics/Constants.m
Original file line number Diff line number Diff line change
Expand Up @@ -85,12 +85,14 @@
NSString * const kNRMA_Attrib_dtTraceId = @"trace.id";
NSString * const kNRMA_Attrib_name = @"name";
NSString * const kNRMA_Attrib_offline = @"offline";
NSString * const kNRMA_Attrib_background = @"background";

NSString * const kNRMA_Val_errorType_HTTP = @"HTTPError";
NSString * const kNRMA_Val_errorType_Network = @"NetworkFailure";


NSString * const kNRMA_Attrib_file = @"attributes.txt";
NSString * const kNRMA_Attrib_file_private = @"privateAttributes.txt";
NSString * const kNRMA_EventStoreFilename = @"eventsStore.txt";

NSString * const kNRMA_Offline_folder = @"offlineStorage";
9 changes: 9 additions & 0 deletions Agent/Analytics/Events/NRMAMobileEvent.m
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,13 @@
// Copyright © 2023 New Relic. All rights reserved.
//

#import <UIKit/UIKit.h>

#import "NRMAMobileEvent.h"
#import "Constants.h"
#import "NRMAFlags.h"
#import "NewRelicInternalUtils.h"
#import "NewRelicAgentInternal.h"

static NSString* const kTimestampKey = @"Timestamp";
static NSString* const kSessionElapsedTimeKey = @"SessionElapsedTime";
Expand Down Expand Up @@ -38,6 +41,12 @@ - (nonnull instancetype) initWithTimestamp:(NSTimeInterval)timestamp
}
}
}
// Handle Background attribute addition.
if([NRMAFlags shouldEnableBackgroundReporting]) {
if ([NewRelicAgentInternal sharedInstance].currentApplicationState == UIApplicationStateBackground) {
[self addAttribute:kNRMA_Attrib_background value:@YES];
}
}
}

return self;
Expand Down
6 changes: 5 additions & 1 deletion Agent/Analytics/NRMAAnalytics.h
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,11 @@
- (void) sessionWillEnd;
//value is either a NSString or NSNumber;
- (BOOL) setSessionAttribute:(NSString*)name value:(id)value;
- (BOOL) setSessionAttribute:(NSString*)name value:(id)value persistent:(BOOL)isPersistent;

- (BOOL) incrementSessionAttribute:(NSString*)name value:(NSNumber*)number;
- (BOOL) incrementSessionAttribute:(NSString*)name value:(NSNumber*)number persistent:(BOOL)persistent;

- (BOOL) setUserId:(NSString*)userId;
- (BOOL) removeSessionAttributeNamed:(NSString*)name;
- (BOOL) removeAllSessionAttributes;
Expand All @@ -54,7 +58,7 @@
- (void) clearLastSessionsAnalytics;

- (BOOL) checkOfflineStatus;

- (BOOL) checkBackgroundStatus;
//this utilizes setSessionAttribute:value: which validates the user input 'name'.
- (BOOL) setLastInteraction:(NSString*)name;

Expand Down
43 changes: 33 additions & 10 deletions Agent/Analytics/NRMAAnalytics.mm
Original file line number Diff line number Diff line change
Expand Up @@ -48,8 +48,6 @@ @implementation NRMAAnalytics
id<AttributeValidatorProtocol> _attributeValidator;
}

static NSString* const eventStoreFilename = @"eventsStore.txt";

static PersistentStore<std::string,BaseValue>* __attributeStore;
+ (PersistentStore<std::string, BaseValue> &) attributeDupStore
{
Expand Down Expand Up @@ -111,9 +109,9 @@ - (id) initWithSessionStartTimeMS:(long long) sessionStartTime {
if(self){
// Handle New Event System NRMAnalytics Constructor
if([NRMAFlags shouldEnableNewEventSystem]){
NSString *filename = [[NewRelicInternalUtils getStorePath] stringByAppendingPathComponent:eventStoreFilename];
NSString *filename = [[NewRelicInternalUtils getStorePath] stringByAppendingPathComponent:kNRMA_EventStoreFilename];

PersistentEventStore *eventStore = [[PersistentEventStore alloc] initWithFilename:filename andMinimumDelay:30];
PersistentEventStore *eventStore = [[PersistentEventStore alloc] initWithFilename:filename andMinimumDelay:.025];

_eventManager = [[NRMAEventManager alloc] initWithPersistentStore:eventStore];
_attributeValidator = [[BlockAttributeValidator alloc] initWithNameValidator:^BOOL(NSString *name) {
Expand Down Expand Up @@ -265,7 +263,7 @@ - (BOOL) addInteractionEvent:(NSString*)name

return [_eventManager addEvent:[event autorelease]];
} else {
return _analyticsController->addInteractionEvent([name UTF8String], duration_secs, [self checkOfflineStatus]);
return _analyticsController->addInteractionEvent([name UTF8String], duration_secs, [self checkOfflineStatus], [self checkBackgroundStatus]);
}
}

Expand Down Expand Up @@ -506,7 +504,7 @@ - (BOOL)addNetworkRequestEvent:(NRMANetworkRequestData *)requestData
if ([NRMAFlags shouldEnableNetworkRequestEvents]) {
NewRelic::NetworkRequestData* networkRequestData = [requestData getNetworkRequestData];
NewRelic::NetworkResponseData* networkResponseData = [responseData getNetworkResponseData];
return _analyticsController->addRequestEvent(*networkRequestData, *networkResponseData, std::move(payload), [self checkOfflineStatus]);
return _analyticsController->addRequestEvent(*networkRequestData, *networkResponseData, std::move(payload), [self checkOfflineStatus], [self checkBackgroundStatus]);
}
return NO;
}
Expand All @@ -518,7 +516,7 @@ - (BOOL)addNetworkErrorEvent:(NRMANetworkRequestData *)requestData
NewRelic::NetworkRequestData* networkRequestData = [requestData getNetworkRequestData];
NewRelic::NetworkResponseData* networkResponseData = [responseData getNetworkResponseData];

return _analyticsController->addNetworkErrorEvent(*networkRequestData, *networkResponseData,std::move(payload), [self checkOfflineStatus]);
return _analyticsController->addNetworkErrorEvent(*networkRequestData, *networkResponseData,std::move(payload), [self checkOfflineStatus], [self checkBackgroundStatus]);
}

return NO;
Expand All @@ -531,7 +529,7 @@ - (BOOL)addHTTPErrorEvent:(NRMANetworkRequestData *)requestData
NewRelic::NetworkRequestData* networkRequestData = [requestData getNetworkRequestData];
NewRelic::NetworkResponseData* networkResponseData = [responseData getNetworkResponseData];

return _analyticsController->addHTTPErrorEvent(*networkRequestData, *networkResponseData, std::move(payload), [self checkOfflineStatus]);
return _analyticsController->addHTTPErrorEvent(*networkRequestData, *networkResponseData, std::move(payload), [self checkOfflineStatus], [self checkBackgroundStatus]);
}
return NO;
}
Expand Down Expand Up @@ -661,6 +659,9 @@ - (BOOL) setSessionAttribute:(NSString*)name value:(id)value {
if([NewRelicInternalUtils isFloat:number]) {
return _analyticsController->addSessionAttribute([name UTF8String], [number doubleValue]);
}
if ([NewRelicInternalUtils isBool:number]) {
return _analyticsController->addSessionAttribute([name UTF8String], (bool)[number boolValue]);
}
return NO;
} else if ([value isKindOfClass:[NSString class]]) {
NSString* string = (NSString*)value;
Expand Down Expand Up @@ -915,6 +916,13 @@ - (BOOL) checkOfflineStatus {
return false;
}

- (BOOL) checkBackgroundStatus {
if([NRMAFlags shouldEnableBackgroundReporting]) {
return ([NewRelicAgentInternal sharedInstance].currentApplicationState == UIApplicationStateBackground);
}
return false;
}

- (BOOL)recordUserAction:(NRMAUserAction *)userAction {
if (userAction == nil) { return NO; };

Expand Down Expand Up @@ -973,6 +981,20 @@ - (BOOL) incrementSessionAttribute:(NSString*)name value:(NSNumber*)number
}
}

- (BOOL) incrementSessionAttribute:(NSString*)name value:(NSNumber*)number persistent:(BOOL)persistent {
if([NRMAFlags shouldEnableNewEventSystem]){
return [_sessionAttributeManager incrementSessionAttribute:name value:number];
} else {
if ([NewRelicInternalUtils isInteger:number]) {
return _analyticsController->incrementSessionAttribute([name UTF8String], (unsigned long long)[number longLongValue],(bool)persistent); //has internal exception handling.
} else if ([NewRelicInternalUtils isFloat:number]) {
return _analyticsController->incrementSessionAttribute([name UTF8String], [number doubleValue],(bool)persistent); //has internal exception handling.
} else {
return NO;
}
}
}

- (NSString*) analyticsJSONString {
if([NRMAFlags shouldEnableNewEventSystem]){
NSError *error = nil;
Expand Down Expand Up @@ -1035,7 +1057,7 @@ + (NSString*) getLastSessionsAttributes {

+ (NSString*) getLastSessionsEvents{
if([NRMAFlags shouldEnableNewEventSystem]) {
NSString *filename = [[NewRelicInternalUtils getStorePath] stringByAppendingPathComponent:eventStoreFilename];
NSString *filename = [[NewRelicInternalUtils getStorePath] stringByAppendingPathComponent:kNRMA_EventStoreFilename];
return [NRMAEventManager getLastSessionEventsFromFilename:filename];
} else {
try {
Expand Down Expand Up @@ -1076,7 +1098,8 @@ + (void) clearDuplicationStores

- (void) clearLastSessionsAnalytics {
if([NRMAFlags shouldEnableNewEventSystem]){
[_sessionAttributeManager clearLastSessionsAnalytics];
[_sessionAttributeManager removeAllSessionAttributes];
[_eventManager empty];
} else {
try {
_analyticsController->clearAttributesDuplicationStore();
Expand Down
3 changes: 1 addition & 2 deletions Agent/Analytics/NRMASAM.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

#import <Foundation/Foundation.h>
#import "BlockAttributeValidator.h"
#import "PersistentEventStore.h"

NS_ASSUME_NONNULL_BEGIN

Expand All @@ -24,8 +25,6 @@ NS_ASSUME_NONNULL_BEGIN
- (BOOL) removeAllSessionAttributes;

+ (NSString*) getLastSessionsAttributes;
- (void) clearLastSessionsAnalytics;
- (void) clearPersistedSessionAnalytics;

- (NSString*) sessionAttributeJSONString;
- (BOOL) setLastInteraction:(NSString*)name;
Expand Down
Loading

0 comments on commit 27af526

Please sign in to comment.