public async ValueTask <EventHandlingStatus> HandleEvent(IMessageConsumeContext context) { using var activity = SubscriptionActivity .Create( $"{Constants.Components.EventHandler}.{DiagnosticName}/{context.MessageType}", ActivityKind.Internal, tags: _defaultTags ) ?.SetContextTags(context) ?.Start(); try { var status = await _innerHandler.HandleEvent(context).NoContext(); if (activity != null && status == EventHandlingStatus.Ignored) { activity.ActivityTraceFlags = ActivityTraceFlags.None; } activity?.SetActivityStatus(ActivityStatus.Ok()); return(status); } catch (Exception e) { activity?.SetActivityStatus(ActivityStatus.Error(e, $"Error handling {context.MessageType}")); throw; } }
public async Task UpsertSubscriptionActivity(SubscriptionActivity subscriptionActivity) { if (_dbContext.SubscriptionActivities.Count(x => x.AccountObjectId == subscriptionActivity.AccountObjectId && x.AccountTenantId == subscriptionActivity.AccountTenantId && x.UserPrincipalName == subscriptionActivity.UserPrincipalName) != 0) { _dbContext.Update(subscriptionActivity); } else { _dbContext.Add(subscriptionActivity); } await _dbContext.SaveChangesAsync().ConfigureAwait(false); }
public override async ValueTask Send( IMessageConsumeContext context, Func <IMessageConsumeContext, ValueTask>?next ) { if (context.Message == null || next == null) { return; } using var activity = Activity.Current?.Context != context.ParentContext ? SubscriptionActivity.Start( $"{Constants.Components.Consumer}.{context.SubscriptionId}/{context.MessageType}", ActivityKind.Consumer, context, _defaultTags ) : Activity.Current; if (activity?.IsAllDataRequested == true && context is DelayedAckConsumeContext delayedAckContext) { activity.SetContextTags(context)?.SetTag(TelemetryTags.Eventuous.Partition, delayedAckContext.PartitionId); } try { await next(context).NoContext(); if (activity != null) { if (context.WasIgnored()) { activity.ActivityTraceFlags = ActivityTraceFlags.None; } activity.SetActivityStatus(ActivityStatus.Ok()); } } catch (Exception e) { activity?.SetActivityStatus(ActivityStatus.Error(e, $"Error handling {context.MessageType}")); throw; } }
public override async ValueTask Consume(IMessageConsumeContext context) { if (context.Message == null) { return; } using var activity = Activity.Current?.Context != context.ParentContext ? SubscriptionActivity.Start(context, _defaultTags) : Activity.Current; activity?.SetContextTags(context)?.Start(); try { await _inner.Consume(context).NoContext(); } catch (Exception e) { activity?.SetStatus(ActivityStatus.Error(e, $"Error handling {context.MessageType}")); throw; } }
internal static async Task ManageSubscription(SubscriptionActivity currentSubscriptionActivity, string oid, string tid, string upn, IConfiguration config, IMsalAccountActivityStore msalAccountActivityStore, GraphServiceClient _graphServiceClient, IMsalTokenCacheProvider msalTokenCacheProvider) { string subscriptionId = null; string changeToken = null; string notiticationUrl = config.GetValue <string>("Files:SubscriptionService"); int subscriptionLifeTimeInMinutes = config.GetValue <int>("Files:SubscriptionLifeTime"); if (subscriptionLifeTimeInMinutes == 0) { subscriptionLifeTimeInMinutes = 15; } // Load the current subscription (if any) var currentSubscriptions = await _graphServiceClient.Subscriptions.Request().GetAsync(); var currentOneDriveSubscription = currentSubscriptions.FirstOrDefault(p => p.Resource == "me/drive/root"); // If present and still using the same subscription host then update the subscription expiration date if (currentOneDriveSubscription != null && currentOneDriveSubscription.NotificationUrl.Equals(notiticationUrl, StringComparison.InvariantCultureIgnoreCase)) { // Extend the expiration of the current subscription subscriptionId = currentOneDriveSubscription.Id; currentOneDriveSubscription.ExpirationDateTime = DateTimeOffset.UtcNow.AddMinutes(subscriptionLifeTimeInMinutes); currentOneDriveSubscription.ClientState = Constants.FilesSubscriptionServiceClientState; await _graphServiceClient.Subscriptions[currentOneDriveSubscription.Id].Request().UpdateAsync(currentOneDriveSubscription); // Check if the last change token was populated if (currentSubscriptionActivity == null) { currentSubscriptionActivity = await msalAccountActivityStore.GetSubscriptionActivityForUserSubscription(oid, tid, upn, subscriptionId); } if (currentSubscriptionActivity != null) { changeToken = currentSubscriptionActivity.LastChangeToken; } } else { // Add a new subscription var newSubscription = await _graphServiceClient.Subscriptions.Request().AddAsync(new Subscription() { ChangeType = "updated", NotificationUrl = notiticationUrl, Resource = "me/drive/root", ExpirationDateTime = DateTimeOffset.UtcNow.AddMinutes(subscriptionLifeTimeInMinutes), ClientState = Constants.FilesSubscriptionServiceClientState, LatestSupportedTlsVersion = "v1_2" }); subscriptionId = newSubscription.Id; } // Store the user principal name with the subscriptionid as that's the mechanism needed to connect change event with tenant/user var cacheEntriesToRemove = await msalAccountActivityStore.UpdateSubscriptionId(subscriptionId, oid, tid, upn); // If we've found old MSAL cache entries for which we've removed the respective MsalActivity records we should also // drop these from the MSAL cache itself if (cacheEntriesToRemove.Any()) { foreach (var cacheEntry in cacheEntriesToRemove) { await(msalTokenCacheProvider as IntegratedTokenCacheAdapter).RemoveKeyFromCache(cacheEntry); } } if (changeToken == null) { // Initialize the subscription and get the latest change token, to avoid getting back all the historical changes IDriveItemDeltaCollectionPage deltaCollection = await _graphServiceClient.Me.Drive.Root.Delta("latest").Request().GetAsync(); var deltaLink = deltaCollection.AdditionalData["@odata.deltaLink"]; if (!string.IsNullOrEmpty(deltaLink.ToString())) { changeToken = ProcessChanges.GetChangeTokenFromUrl(deltaLink.ToString()); } } // Store a record per user/subscription to track future delta queries if (currentSubscriptionActivity == null) { currentSubscriptionActivity = new SubscriptionActivity(oid, tid, upn) { SubscriptionId = subscriptionId, LastChangeToken = changeToken }; } currentSubscriptionActivity.LastChangeToken = changeToken; currentSubscriptionActivity.SubscriptionId = subscriptionId; await msalAccountActivityStore.UpsertSubscriptionActivity(currentSubscriptionActivity); }