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() } }); } }
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); }
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); } } }
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); }
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); } } }
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); } }
public virtual void TrackEvent(string name, IDictionary <string, string?> properties) { TelemetryServices.All().TrackEvent(name, properties); }
public virtual void Log(string message, IDictionary <string, string?> properties) { TelemetryServices.All().TrackTrace(message, properties); }