private List <ActionPropertyBag> GetMsalPropertyBagsForCorrelationId(string correlationId) { var retval = new List <ActionPropertyBag>(); lock (_lockActionIdToPropertyBag) { foreach (var propertyBag in _actionIdToPropertyBag.Values) { var contents = propertyBag.GetContents(); var actionType = contents.StringProperties[ActionPropertyNames.ActionTypeConstStrKey]; string propertyBagCorrelationId = contents.StringProperties[ActionPropertyNames.CorrelationIdConstStrKey]; propertyBagCorrelationId = propertyBagCorrelationId.TrimCurlyBraces(); string correlationIdTrimmed = correlationId.TrimCurlyBraces(); if (string.Compare(actionType, MatsConverter.AsString(ActionType.Msal), StringComparison.OrdinalIgnoreCase) == 0 && string.Compare(propertyBagCorrelationId, correlationIdTrimmed, StringComparison.OrdinalIgnoreCase) == 0) { retval.Add(propertyBag); } } } return(retval); }
private bool HasActionOutcome(AuthOutcome outcome, ConcurrentDictionary <string, string> properties) { if (properties.TryGetValue(ActionPropertyNames.OutcomeConstStrKey, out string outcomeStr)) { return(outcomeStr.Equals(MatsConverter.AsString(outcome))); } return(false); }
private bool IsOfActionType(ActionType actionType, ConcurrentDictionary <string, string> properties) { if (properties.TryGetValue(ActionPropertyNames.ActionTypeConstStrKey, out string actionTypeStr)) { return(actionTypeStr.Equals(MatsConverter.AsString(actionType))); } return(false); }
public static string GetUploadEventName(IPlatformProxy platformProxy, EventType eventType, string appName) { string eventName = MatsConverter.AsString(eventType); string osPlatform = platformProxy.GetMatsOsPlatform(); return(GetUploadEventNameGeneric( eventName.ToUpperInvariant(), appName.ToUpperInvariant(), osPlatform.ToUpperInvariant())); }
public IEnumerable <IPropertyBag> GetEventsForUpload() { lock (_lockActionIdToPropertyBag) { var keysToRemove = new List <string>(); var retval = new List <PropertyBag>(); foreach (var kvp in _actionIdToPropertyBag) { var propertyBag = kvp.Value; if (!propertyBag.ReadyForUpload) { var contents = propertyBag.GetContents(); if (!contents.Int64Properties.TryGetValue(ActionPropertyNames.StartTimeConstStrKey, out long startTime)) { _errorStore.ReportError("No start time on action", ErrorType.Action, ErrorSeverity.LibraryError); continue; } long currentTimeInMs = DateTimeUtils.GetMillisecondsSinceEpoch(DateTime.UtcNow); long durationInMs = currentTimeInMs - startTime; if (propertyBag.IsAggregable && durationInMs > _maxActionDurationMillis) { propertyBag.ReadyForUpload = true; } else if (durationInMs > _maxAggregationDurationMillis) // todo: report bug in C++ code where they're doing microseconds around this value instead of milliseconds { propertyBag.Add(ActionPropertyNames.EndTimeConstStrKey, currentTimeInMs); propertyBag.Add(ActionPropertyNames.OutcomeConstStrKey, MatsConverter.AsString(AuthOutcome.Incomplete)); propertyBag.ReadyForUpload = true; } else { // not ready for upload... continue; } } retval.Add(kvp.Value); keysToRemove.Add(kvp.Key); } foreach (string key in keysToRemove) { _actionIdToPropertyBag.Remove(key); } return(retval); } }
public void AddContext(IEnumerable <IPropertyBag> propertyBags) { foreach (var propertyBag in propertyBags) { propertyBag.Add(ContextPropertyNames.AppAudienceConstStrKey, MatsConverter.AsString(AudienceType)); propertyBag.Add(ContextPropertyNames.AppNameConstStrKey, AppName); propertyBag.Add(ContextPropertyNames.AppVerConstStrKey, AppVersion); propertyBag.Add(ContextPropertyNames.DeviceNetworkStateConstStrKey, DeviceNetworkState); propertyBag.Add(ContextPropertyNames.DptiConstStrKey, DptiInternal); propertyBag.Add(ContextPropertyNames.SessionIdConstStrKey, SessionId); propertyBag.Add(ContextPropertyNames.TypeConstStrKey, ContextPropertyValues.AuthenticationConstStrValue); propertyBag.Add(ContextPropertyNames.MatsSdkVerConstStrKey, ContextPropertyValues.MatsSdkVerConstStrValue); propertyBag.Add(ContextPropertyNames.PlatformConstStrKey, Platform); } }
private void EndGenericAction(string actionId, string outcome, ErrorSource errorSource, string error, string errorDescription, string accountCid) { if (string.IsNullOrEmpty(actionId)) { // This is an invalid action; we do not want to upload it. _errorStore.ReportError("Tried to end an action with an empty actionId", ErrorType.Action, ErrorSeverity.Warning); return; } ActionPropertyBag propertyBag = GetActionPropertyBagFromId(actionId); if (propertyBag == null) { _errorStore.ReportError("Trying to end an action that doesn't exist or was already uploaded", ErrorType.Action, ErrorSeverity.Warning); return; } if (propertyBag.ReadyForUpload) { return; } int startingCount = 1; var endTime = DateTime.UtcNow; propertyBag.Add(ActionPropertyNames.OutcomeConstStrKey, outcome); propertyBag.Add(ActionPropertyNames.FailureSourceConstStrKey, MatsConverter.AsString(errorSource)); propertyBag.Add(ActionPropertyNames.FailureConstStrKey, error); propertyBag.Add(ActionPropertyNames.FailureDescriptionConstStrKey, errorDescription); propertyBag.Add(ActionPropertyNames.EndTimeConstStrKey, DateTimeUtils.GetMillisecondsSinceEpoch(endTime)); // propertyBag->Add(ActionPropertyNames::getAccountIdConstStrKey(), accountCid); Commenting this out for GDPR reasons; once pipeline supports this we can upload again. propertyBag.Add(ActionPropertyNames.CountConstStrKey, startingCount); PopulateDuration(propertyBag); //Check if should aggregate here var contents = propertyBag.GetContents(); if (_eventFilter.ShouldAggregateAction(contents)) { EndAggregatedAction(actionId, propertyBag); } else { propertyBag.ReadyForUpload = true; } }
private ActionArtifacts CreateGenericAction(MatsScenario scenario, string correlationId, ActionType actionType) { string actionId = MatsId.Create(); MatsAction action = new MatsAction(actionId, scenario, correlationId); string corrIdTrim = correlationId.TrimCurlyBraces(); var propertyBag = new ActionPropertyBag(_errorStore); var startTimePoint = DateTime.UtcNow; propertyBag.Add(ActionPropertyNames.UploadIdConstStrKey, MatsId.Create()); propertyBag.Add(ActionPropertyNames.ActionTypeConstStrKey, MatsConverter.AsString(actionType)); propertyBag.Add(ScenarioPropertyNames.IdConstStrKey, scenario?.ScenarioId); propertyBag.Add(ActionPropertyNames.CorrelationIdConstStrKey, corrIdTrim); propertyBag.Add(ActionPropertyNames.StartTimeConstStrKey, DateTimeUtils.GetMillisecondsSinceEpoch(startTimePoint)); lock (_lockActionIdToPropertyBag) { _actionIdToPropertyBag[actionId] = propertyBag; } return(new ActionArtifacts(action, propertyBag)); }
public void EndMsalAction(MatsAction action, AuthOutcome outcome, ErrorSource errorSource, string error, string errorDescription) { EndGenericAction(action.ActionId, MatsConverter.AsString(outcome), errorSource, error, errorDescription, string.Empty); }
public MatsAction StartMsalAction(MatsScenario scenario, string correlationId, IEnumerable <string> scopes) { var actionArtifacts = CreateGenericAction(scenario, correlationId, ActionType.Msal); actionArtifacts.PropertyBag.Add(ActionPropertyNames.IdentityServiceConstStrKey, MatsConverter.AsString(IdentityService.AAD)); SetScopesProperty(actionArtifacts.PropertyBag, scopes); return(actionArtifacts.Action); }