Пример #1
0
 public virtual void Log(string message, Category category, Priority priority)
 {
     if (category == Category.Exception)
     {
         try
         {
             throw new Exception(message);
         }
         catch (Exception exp)
         {
             Report(exp, new Dictionary <string, string?>
             {
                 { nameof(category), category.ToString() },
                 { nameof(priority), priority.ToString() }
             });
         }
     }
     else
     {
         TelemetryServices.All().TrackTrace(message, new Dictionary <string, string?>
         {
             { nameof(category), category.ToString() },
             { nameof(priority), priority.ToString() }
         });
     }
 }
Пример #2
0
 async Task IncreaseSteps()
 {
     StepsCount++;
     TelemetryServices.All()
     .TrackEvent("StepsCountChanged", new Dictionary <string, string>
     {
         { "NewValue", StepsCount.ToString() }
     });
 }
        protected override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            // ToDo:
            // Current-Time-Zone
            // Desired-Time-Zone
            // Client-App-Version
            // Client-Culture
            // Client-Route
            // Client-Theme
            // Client-Debug-Mode
            // System-Language
            // Client-Sys-Language
            // Client-Platform

            // ToDo: Use IDeviceService & IDateTimeProvider

            if (!request.Headers.Any(h => h.Key == "Client-Type"))
            {
                request.Headers.Add("Client-Type", "Xamarin");

                if (Device.Idiom != TargetIdiom.Unsupported)
                {
                    request.Headers.Add("Client-Screen-Size", Device.Idiom == TargetIdiom.Phone ? "MobileAndPhablet" : "DesktopAndTablet");
                }

                request.Headers.Add("Client-Date-Time", DefaultDateTimeProvider.Current.GetCurrentUtcDateTime().UtcDateTime.ToString("o", CultureInfo.InvariantCulture));

                request.Headers.Add("X-CorrelationId", Guid.NewGuid().ToString());

                request.Headers.Add("Bit-Client-Type", "CS-Client");
            }

            DateTimeOffset startDate = DateTimeOffset.Now;

            HttpResponseMessage response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);

            if (string.IsNullOrEmpty(response.ReasonPhrase) && response.Headers.TryGetValues("Reason-Phrase", out IEnumerable <string> reasonPhrases) && reasonPhrases.Any())
            {
                response.ReasonPhrase = reasonPhrases.Single();
            }

            Dictionary <string, string> properties = new Dictionary <string, string>
            {
                { "ReasonPhrase", response.ReasonPhrase }
            };

            if (response.Headers.TryGetValues("X-CorrelationId", out IEnumerable <string> values) && values.Any())
            {
                properties.Add("X-CorrelationId", values.First());
            }

            TimeSpan duration = DateTimeOffset.Now - startDate;

            TelemetryServices.All().TrackRequest(request.RequestUri.LocalPath, startDate, duration, response.StatusCode.ToString(), response.IsSuccessStatusCode, request.RequestUri, request.Method.ToString(), properties);

            return(response);
        }
Пример #4
0
        public async void OnNavigatedTo(INavigationParameters parameters)
        {
            DateTimeOffset startDate = DateTimeOffset.Now;
            bool           success   = true;
            string?        navUri    = null;

            try
            {
                await Task.Yield();
                await OnNavigatedToAsync(parameters);

                await Task.Yield();

                try
                {
                    navUri = NavigationService.GetNavigationUriPath();
                }
                catch
                {
                    navUri = GetType().Name;
                }
            }
            catch (Exception exp)
            {
                success = false;
                ExceptionHandler.OnExceptionReceived(exp);
            }
            finally
            {
                if (parameters.TryGetNavigationMode(out NavigationMode navigationMode) && navigationMode == NavigationMode.New)
                {
                    string pageName = GetViewModelName();

                    Dictionary <string, string?> properties = new Dictionary <string, string?> {
                    };

                    foreach (KeyValuePair <string, object> prp in parameters)
                    {
                        if (ShouldLogNavParam(prp.Key) && prp.Key != KnownNavigationParameters.CreateTab && !properties.ContainsKey(prp.Key))
                        {
                            properties.Add(prp.Key, prp.Value?.ToString() ?? "NULL");
                        }
                    }

                    properties.Add("PageViewSucceeded", success.ToString(CultureInfo.InvariantCulture));
                    properties.Add("NavUri", navUri);

                    TimeSpan duration = DateTimeOffset.Now - startDate;

                    TelemetryServices.All().TrackPageView(pageName, duration, properties);
                }
            }
        }
Пример #5
0
        protected async override Task StoreToken(string jsonToken, CancellationToken cancellationToken)
        {
            if (UseSecureStorage())
            {
                throw new NotImplementedException();
            }
            else
            {
                WebPreferences.Set("Token", jsonToken);
            }

            TelemetryServices.All().SetUserId((await GetBitJwtTokenAsync(cancellationToken).ConfigureAwait(false)).UserId);
        }
        protected virtual async Task StoreToken(string jsonToken, CancellationToken cancellationToken)
        {
            if (UseSecureStorage())
            {
                await SecureStorage.SetAsync("Token", jsonToken).ConfigureAwait(false);
            }
            else
            {
                Preferences.Set("Token", jsonToken);
            }

            TelemetryServices.All().SetUserId((await GetBitJwtTokenAsync(cancellationToken).ConfigureAwait(false)).UserId);
        }
Пример #7
0
        public async void OnNavigatedTo(INavigationParameters parameters)
        {
            DateTimeOffset startDate = DateTimeOffset.Now;
            bool           success   = true;

            try
            {
                await Task.Yield();
                await OnNavigatedToAsync(parameters);

                await Task.Yield();
            }
            catch (Exception exp)
            {
                success = false;
                BitExceptionHandler.Current.OnExceptionReceived(exp);
            }
            finally
            {
                if (parameters.GetNavigationMode() == NavigationMode.New)
                {
                    string pageName = GetViewModelName();

                    Dictionary <string, string> properties = new Dictionary <string, string> {
                    };

                    foreach (KeyValuePair <string, object> prp in parameters)
                    {
                        if (ShouldLogNavParam(prp.Key))
                        {
                            properties.Add(prp.Key, prp.Value?.ToString() ?? "NULL");
                        }
                    }

                    properties.Add("PageViewSucceeded", success.ToString(CultureInfo.InvariantCulture));

                    TimeSpan duration = DateTimeOffset.Now - startDate;

                    TelemetryServices.All().TrackPageView(pageName, duration, properties);
                }
            }
        }
Пример #8
0
        public async override Task Logout(object?state = null, string?client_id = null, CancellationToken cancellationToken = default)
        {
            Token?token = await GetCurrentTokenAsync(cancellationToken).ConfigureAwait(false);

            if (token != null)
            {
                if (UseSecureStorage())
                {
                    throw new NotImplementedException();
                }
                else
                {
                    WebPreferences.Remove("Token");
                }

                TelemetryServices.All().SetUserId(null);

                if (!string.IsNullOrEmpty(token.IdToken))
                {
                    throw new NotImplementedException();
                }
            }
        }
        public virtual async Task Logout(object?state = null, string?client_id = null, CancellationToken cancellationToken = default)
        {
            Token?token = await GetCurrentTokenAsync(cancellationToken).ConfigureAwait(false);

            if (token != null)
            {
                if (UseSecureStorage())
                {
                    SecureStorage.Remove("Token");
                }
                else
                {
                    Preferences.Remove("Token");
                }

                TelemetryServices.All().SetUserId(null);

                if (!string.IsNullOrEmpty(token.id_token))
                {
                    await WebAuthenticator.AuthenticateAsync(GetLogoutUrl(token.id_token !, state, client_id), ClientAppProfile.OAuthRedirectUri).ConfigureAwait(false);
                }
            }
        }
        protected override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
        {
            if (request == null)
            {
                throw new ArgumentNullException(nameof(request));
            }

            if (request.RequestUri.Segments?.Last() == "$ref")
            {
                return(new HttpResponseMessage(HttpStatusCode.OK));
            }

            // ToDo:
            // Desired-Time-Zone

            Dictionary <string, string?> properties = new Dictionary <string, string?>
            {
            };

            Guid xCorrelationID;

            if (!request.Headers.Any(h => h.Key == "Client-Type"))
            {
#if DotNet
                request.Headers.Add("Client-Type", System.Runtime.InteropServices.RuntimeInformation.ProcessArchitecture == System.Runtime.InteropServices.Architecture.Wasm ? "Wasm" : "Xamarin");
#else
                request.Headers.Add("Client-Type", "Xamarin");
#endif
                request.Headers.Add("Client-Date-Time", DateTimeProvider.GetCurrentUtcDateTime().UtcDateTime.ToString("o", CultureInfo.InvariantCulture));

                xCorrelationID = Guid.NewGuid();

                request.Headers.Add("X-Correlation-ID", xCorrelationID.ToString());

                request.Headers.Add("Bit-Client-Type", "CS-Client");

                request.Headers.Add("Client-App-Version", AppInfo.VersionString);

                request.Headers.Add("Client-Culture", CultureInfo.CurrentUICulture.Name);

                request.Headers.Add("System-Language", CultureInfo.CurrentUICulture.ThreeLetterISOLanguageName);

                request.Headers.Add("Client-Sys-Language", CultureInfo.CurrentUICulture.ThreeLetterISOLanguageName);

                try
                {
                    request.Headers.Add("Client-Route", DependencyDelegates.Current.GetNavigationUriPath?.Invoke());
                }
                catch { }

                request.Headers.Add("Client-Platform", DeviceInfo.Platform.ToString());

                request.Headers.Add("Current-Time-Zone", TimeZoneInfo.Local.Id);

#if Android || iOS || UWP
                await MainThread.InvokeOnMainThreadAsync(() =>
                {
                    request.Headers.Add("Client-Theme", AppInfo.RequestedTheme.ToString());
                    if (DeviceInfo.Idiom != Xamarin.Essentials.DeviceIdiom.Unknown)
                    {
                        request.Headers.Add("Client-Screen-Size", DeviceInfo.Idiom == Xamarin.Essentials.DeviceIdiom.Phone ? "MobileAndPhablet" : "DesktopAndTablet");
                    }
                }).ConfigureAwait(false);
#endif

                request.Headers.Add("Client-Debug-Mode", (ClientAppProfile.Environment == "Development").ToString(CultureInfo.InvariantCulture));
            }
            else
            {
                xCorrelationID = Guid.Parse(request.Headers.ExtendedSingle("Finding X-Correlation-ID", h => h.Key == "X-Correlation-ID").Value.ExtendedSingle("Getting X-Correlation-ID value"));
            }

            DateTimeOffset startDate = DateTimeProvider.GetCurrentUtcDateTime();

            HttpResponseMessage?response = null;

            try
            {
                response = await base.SendAsync(request, cancellationToken).ConfigureAwait(false);

                return(response);
            }
#if Android
            catch (Java.Lang.Throwable exp) // https://github.com/xamarin/xamarin-android/issues/3216
            {
                throw exp switch
                      {
                          Java.IO.IOException _ => new IOException(exp.Message, exp),
                          _ => new Exception(exp.Message, exp),
                      };
            }
#endif
            catch (HttpRequestException exp)
            {
                properties.Add("RequestException", exp.ToString());
                throw;
            }
            finally
            {
                if (response != null)
                {
                    if (response.Headers.TryGetValues("Reason-Phrase", out IEnumerable <string> reasonPhrases) && reasonPhrases.Any())
                    {
                        response.ReasonPhrase = reasonPhrases.Single();
                    }
                }

                properties.Add("ReasonPhrase", response?.ReasonPhrase ?? "UnknownError");

                properties.Add("X-Correlation-ID", xCorrelationID.ToString());

                TimeSpan duration = DateTimeOffset.Now - startDate;

                TelemetryServices.All().TrackRequest(request.RequestUri.LocalPath, startDate, duration, response?.StatusCode.ToString() ?? "UnknownStatusCode", response?.IsSuccessStatusCode ?? false, request.RequestUri, request.Method.ToString(), properties);
            }
        }
Пример #11
0
 public virtual void TrackEvent(string name, IDictionary <string, string?> properties)
 {
     TelemetryServices.All().TrackEvent(name, properties);
 }
Пример #12
0
 public virtual void Log(string message, IDictionary <string, string?> properties)
 {
     TelemetryServices.All().TrackTrace(message, properties);
 }