public async Task Invoke(IIncomingGrainCallContext context) { bool isOrleansGrain = context.InterfaceMethod == null || context.InterfaceMethod.DeclaringType == null || context.InterfaceMethod.Module.Assembly.FullName.StartsWith("Orleans"); //TODO add test that validate that we are not introducing new grain in micro dot bool isMicrodotGrain = isOrleansGrain == false && context.InterfaceMethod.DeclaringType.Name == nameof(IRequestProcessingGrain); bool isServiceGrain = isOrleansGrain == false && isMicrodotGrain == false; var grainTags = new Lazy <GrainTags>(() => new GrainTags(context)); // Drop the request if we're overloaded var loadSheddingConfig = _loadSheddingConfig(); if ( (loadSheddingConfig.ApplyToMicrodotGrains && isMicrodotGrain) || (loadSheddingConfig.ApplyToServiceGrains && isServiceGrain) ) { //Can brake the flow by throwing Overloaded RejectRequestIfLateOrOverloaded(grainTags); } var loggingConfig = _grainLoggingConfig(); bool shouldLog = (loggingConfig.LogOrleansGrains && isOrleansGrain) || (loggingConfig.LogMicrodotGrains && isMicrodotGrain) || (loggingConfig.LogServiceGrains && isServiceGrain); shouldLog = shouldLog && !ShouldSkipLoggingUnderRatio(loggingConfig, TracingContext.TryGetRequestID()); GrainCallEvent grainEvent = null; if (shouldLog) { RequestTimings.GetOrCreate(); // Ensure request timings is created here and not in the grain call. RequestTimings.Current.Request.Start(); grainEvent = _eventPublisher.CreateEvent(); grainEvent.ParentSpanId = TracingContext.TryGetParentSpanID(); grainEvent.SpanId = Guid.NewGuid().ToString("N"); TracingContext.SetParentSpan(grainEvent.SpanId); } Exception ex = null; try { await context.Invoke(); } catch (Exception e) { ex = e; throw; } finally { if (shouldLog) { RequestTimings.Current.Request.Stop(); PublishEvent(ex, grainTags, grainEvent); } } }
private void PublishEvent(Exception ex, Lazy <GrainTags> grainTags, GrainCallEvent grainEvent) { grainEvent.GrainID = grainTags.Value.GrainId; grainEvent.SiloAddress = grainTags.Value.SiloAddress; grainEvent.SiloDeploymentId = _clusterIdentity.DeploymentId; grainEvent.TargetType = grainTags.Value.TargetType; grainEvent.TargetMethod = grainTags.Value.TargetMethod; grainEvent.Exception = ex; grainEvent.ErrCode = ex != null ? null : (int?)0; _eventPublisher.TryPublish(grainEvent); }