public void BeforeEach()
        {
            logSources         = Substitute.For <ILogSourcesManager>();
            telemetry          = Substitute.For <Telemetry.ITelemetryCollector>();
            mockedSyncContext  = new ManualSynchronizationContext();
            heartbeat          = Substitute.For <IHeartBeatTimer>();
            progressAggregator = Substitute.For <Progress.IProgressAggregator>();
            settingsAccessor   = Substitute.For <Settings.IGlobalSettingsAccessor>();
            logSource1         = Substitute.For <ILogSource>();
            logProviderFac1    = Substitute.For <ILogProviderFactory>();
            logSource1.Provider.Factory.Returns(logProviderFac1);
            logSource1.Provider.ConnectionParams.Returns(new ConnectionParams($"{ConnectionParamsKeys.PathConnectionParam}=/log.txt"));
            logSource1.Provider.Stats.Returns(new LogProviderStats()
            {
                ContentsEtag = null
            });
            logSourcePP1 = Substitute.For <ILogSourcePostprocessor>();
            logSourcePP1.Kind.Returns(PostprocessorKind.SequenceDiagram);
            pp1outputXmlSection = Substitute.For <Persistence.ISaxXMLStorageSection>();
            logSource1.LogSourceSpecificStorageEntry.OpenSaxXMLSection("postproc-sequencediagram.xml", Persistence.StorageSectionOpenFlag.ReadOnly).Returns(pp1outputXmlSection);
            pp1outputXmlSection.Reader.Returns(Substitute.For <XmlReader>());
            pp1PostprocessorOutput = Substitute.For <IPostprocessorOutputETag>();
            outputDataDeserializer = Substitute.For <IOutputDataDeserializer>();
            outputDataDeserializer.Deserialize(PostprocessorKind.SequenceDiagram, Arg.Any <LogSourcePostprocessorDeserializationParams>()).Returns(pp1PostprocessorOutput);
            pp1RunSummary = Substitute.For <IPostprocessorRunSummary>();
            logSourcePP1.Run(null).ReturnsForAnyArgs(Task.FromResult(pp1RunSummary));
            pp1RunSummary.GetLogSpecificSummary(null).ReturnsForAnyArgs((IPostprocessorRunSummary)null);

            manager = new LogJoint.Postprocessing.PostprocessorsManager(
                logSources, telemetry, mockedSyncContext, mockedSyncContext, heartbeat, progressAggregator, settingsAccessor, outputDataDeserializer, new TraceSourceFactory());

            manager.RegisterLogType(new LogSourceMetadata(logProviderFac1, logSourcePP1));
        }
Exemple #2
0
 public LoadingState(Context ctx, IPostprocessorRunSummary lastRunSummary, TaskCompletionSource <int> flowCompletion) : base(ctx)
 {
     this.lastRunSummary = lastRunSummary;
     this.flowCompletion = flowCompletion;
     this.task           = ctx.modelSyncContext.InvokeAndAwait(async() =>
     {
         try
         {
             using (var existingSection = ctx.owner.logSourceRecord.logSource.LogSourceSpecificStorageEntry.OpenSaxXMLSection(
                        ctx.owner.metadata.MakePostprocessorOutputFileName(),
                        Persistence.StorageSectionOpenFlag.ReadOnly))
             {
                 if (existingSection.Reader == null)
                 {
                     return(null);
                 }
                 else
                 {
                     void updateProgress(object sender, HeartBeatEventArgs e)
                     {
                         if (e.IsNormalUpdate && Math.Abs(progress - existingSection.ReadProgress) > 1e-3)
                         {
                             progress = existingSection.ReadProgress;
                             ctx.fireChangeNotification();
                         }
                     }
                     ctx.heartbeat.OnTimer += updateProgress;
                     try
                     {
                         using (var perfop = new Profiling.Operation(ctx.tracer, "load output " + ctx.owner.metadata.Kind.ToString()))
                         {
                             return(await ctx.threadPoolSyncContext.Invoke(() => ctx.outputDataDeserializer.Deserialize(ctx.owner.metadata.Kind, new LogSourcePostprocessorDeserializationParams()
                             {
                                 Reader = existingSection.Reader,
                                 LogSource = ctx.owner.logSourceRecord.logSource,
                                 Cancellation = ctx.owner.logSourceRecord.cancellation.Token
                             })));
                         }
                     }
                     finally
                     {
                         ctx.heartbeat.OnTimer -= updateProgress;
                     }
                 }
             }
         }
         finally
         {
             ctx.scheduleRefresh();
         }
     });
 }
 public LogSourcePostprocessorState BuildData(
     LogSourcePostprocessorState.Status status,
     double?progress   = null,
     object outputData = null,
     IPostprocessorRunSummary lastRunSummary = null)
 {
     return(new LogSourcePostprocessorState
     {
         LogSource = logSourceRecord.logSource,
         Postprocessor = metadata,
         OutputStatus = status,
         Progress = progress,
         OutputData = outputData,
         LastRunSummary = lastRunSummary
     });
 }
        private void RefreshPostprocessorOutput(
            LogSourceRecordInternal logSourceRecord,
            PostprocessorOutputRecordInternal postprocessorOutputRecord,
            ref bool somethingChanged,
            bool assumeChanged)
        {
            LogSourcePostprocessorOutput.Status oldStatus  = postprocessorOutputRecord.status;
            IPostprocessorRunSummary            oldSummary = postprocessorOutputRecord.lastRunSummary;

            bool postprocessorOutputNeedsLoading =
                assumeChanged ||
                postprocessorOutputRecord.status != LogSourcePostprocessorOutput.Status.Finished;

            if (postprocessorOutputRecord.postprocessorTask != null)
            {
                if (postprocessorOutputRecord.postprocessorTask.IsCompleted)
                {
                    if (postprocessorOutputRecord.postprocessorTask.GetTaskException() != null)
                    {
                        postprocessorOutputRecord.lastRunSummary = new FailedRunSummary(postprocessorOutputRecord.postprocessorTask.GetTaskException());
                    }
                    else
                    {
                        var runSummary            = postprocessorOutputRecord.postprocessorTask.Result;
                        var logSpecificRunSummary = runSummary?.GetLogSpecificSummary(logSourceRecord.logSource) ?? runSummary;
                        postprocessorOutputRecord.lastRunSummary = logSpecificRunSummary;
                    }
                    postprocessorOutputRecord.ClearPostprocessorTask();
                    postprocessorOutputNeedsLoading = true;
                }
                else
                {
                    postprocessorOutputRecord.status = LogSourcePostprocessorOutput.Status.InProgress;
                    postprocessorOutputNeedsLoading  = false;
                }
            }

            if (postprocessorOutputNeedsLoading)
            {
                TryLoadParserOutputAndUpdateStatus(logSourceRecord, postprocessorOutputRecord);
            }

            somethingChanged = somethingChanged ||
                               (postprocessorOutputRecord.status != oldStatus) ||
                               (postprocessorOutputRecord.lastRunSummary != oldSummary);
        }
Exemple #5
0
 public ErrorState(Context ctx, IPostprocessorRunSummary runSummary) : base(ctx)
 {
     this.runSummary = runSummary;
 }
Exemple #6
0
 public OutdatedState(Context ctx, object output, IPostprocessorRunSummary lastRunSummary) : base(ctx)
 {
     this.output         = output;
     this.lastRunSummary = lastRunSummary;
 }
        static CorrelationStateSummary GetCorrelatorStateSummary(
            ImmutableArray <LogSourcePostprocessorState> correlationOutputs,
            ImmutableDictionary <string, CorrelatorRunResult> lastResult,
            RunSummary lastRunSummary,
            int _timeShiftsRevision
            )
        {
            if (correlationOutputs.Length < 2)
            {
                return(new CorrelationStateSummary {
                    Status = CorrelationStateSummary.StatusCode.PostprocessingUnavailable
                });
            }
            if (lastRunSummary?.IsFailure == true)
            {
                return(new CorrelationStateSummary {
                    Status = CorrelationStateSummary.StatusCode.ProcessingFailed, Report = lastRunSummary.Report
                });
            }
            var    correlatableLogsIds             = GetCorrelatableLogsConnectionIds(correlationOutputs);
            int    numMissingOutput                = 0;
            int    numProgressing                  = 0;
            int    numFailed                       = 0;
            int    numCorrelationContextMismatches = 0;
            int    numCorrelationResultMismatches  = 0;
            double?progress = null;

            foreach (var i in correlationOutputs)
            {
                if (i.OutputStatus == LogSourcePostprocessorState.Status.InProgress ||
                    i.OutputStatus == LogSourcePostprocessorState.Status.Loading)
                {
                    numProgressing++;
                    if (progress == null && i.Progress != null)
                    {
                        progress = i.Progress;
                    }
                }
                lastResult.TryGetValue(i.LogSource.GetSafeConnectionId(), out var typedOutput);
                if (typedOutput == null)
                {
                    ++numMissingOutput;
                }
                else
                {
                    if (!typedOutput.CorrelatedLogsConnectionIds.IsSupersetOf(correlatableLogsIds))
                    {
                        ++numCorrelationContextMismatches;
                    }
                    var actualOffsets = i.LogSource.IsDisposed ? TimeOffsets.Empty : i.LogSource.Provider.TimeOffsets;
                    if (typedOutput.Solution.BaseDelta != actualOffsets.BaseOffset)
                    {
                        ++numCorrelationResultMismatches;
                    }
                }
                if (i.OutputStatus == LogSourcePostprocessorState.Status.Failed)
                {
                    ++numFailed;
                }
            }
            if (numProgressing != 0)
            {
                return(new CorrelationStateSummary()
                {
                    Status = CorrelationStateSummary.StatusCode.ProcessingInProgress,
                    Progress = progress
                });
            }
            string report = lastRunSummary?.Report;

            if (numFailed != 0)
            {
                IPostprocessorRunSummary summaryWithError = correlationOutputs
                                                            .Select(output => output.LastRunSummary)
                                                            .OfType <IPostprocessorRunSummary>()
                                                            .Where(summary => summary.HasErrors)
                                                            .FirstOrDefault();
                if (summaryWithError != null)
                {
                    return(new CorrelationStateSummary()
                    {
                        Status = CorrelationStateSummary.StatusCode.ProcessingFailed,
                        Report = summaryWithError.Report
                    });
                }
                return(new CorrelationStateSummary()
                {
                    Status = CorrelationStateSummary.StatusCode.ProcessingFailed,
                    Report = report
                });
            }
            if (numMissingOutput != 0 || numCorrelationContextMismatches != 0 || numCorrelationResultMismatches != 0)
            {
                return(new CorrelationStateSummary()
                {
                    Status = CorrelationStateSummary.StatusCode.NeedsProcessing
                });
            }
            return(new CorrelationStateSummary()
            {
                Status = CorrelationStateSummary.StatusCode.Processed,
                Report = report
            });
        }
Exemple #8
0
        public static CorrelatorStateSummary GetCorrelatorStateSummary(this IPostprocessorsManager postprocessorsManager)
        {
            var correlationOutputs =
                postprocessorsManager
                .LogSourcePostprocessorsOutputs
                .Where(output => output.PostprocessorMetadata.TypeID == PostprocessorIds.Correlator)
                .ToArray();

            if (correlationOutputs.Length < 2)
            {
                return(new CorrelatorStateSummary()
                {
                    Status = CorrelatorStateSummary.StatusCode.PostprocessingUnavailable
                });
            }
            var    correlatableLogsIds             = postprocessorsManager.GetCorrelatableLogsConnectionIds();
            int    numMissingOutput                = 0;
            int    numProgressing                  = 0;
            int    numFailed                       = 0;
            int    numCorrelationContextMismatches = 0;
            int    numCorrelationResultMismatches  = 0;
            double?progress = null;

            foreach (var i in correlationOutputs)
            {
                if (i.OutputStatus == LogSourcePostprocessorOutput.Status.InProgress)
                {
                    numProgressing++;
                    if (progress == null && i.Progress != null)
                    {
                        progress = i.Progress;
                    }
                }
                var typedOutput = i.OutputData as ICorrelatorPostprocessorOutput;
                if (typedOutput == null)
                {
                    ++numMissingOutput;
                }
                else
                {
                    if (!typedOutput.CorrelatedLogsConnectionIds.IsSupersetOf(correlatableLogsIds))
                    {
                        ++numCorrelationContextMismatches;
                    }
                    var actualOffsets = i.LogSource.IsDisposed ? TimeOffsets.Empty : i.LogSource.Provider.TimeOffsets;
                    if (typedOutput.Solution.BaseDelta != actualOffsets.BaseOffset)
                    {
                        ++numCorrelationResultMismatches;
                    }
                }
                if (i.OutputStatus == LogSourcePostprocessorOutput.Status.Failed)
                {
                    ++numFailed;
                }
            }
            if (numProgressing != 0)
            {
                return(new CorrelatorStateSummary()
                {
                    Status = CorrelatorStateSummary.StatusCode.ProcessingInProgress,
                    Progress = progress
                });
            }
            IPostprocessorRunSummary reportObject = correlationOutputs.First().LastRunSummary;
            string report = reportObject != null ? reportObject.Report : null;

            if (numMissingOutput != 0 || numCorrelationContextMismatches != 0 || numCorrelationResultMismatches != 0)
            {
                if (reportObject != null && reportObject.HasErrors)
                {
                    return(new CorrelatorStateSummary()
                    {
                        Status = CorrelatorStateSummary.StatusCode.ProcessingFailed,
                        Report = report
                    });
                }
                return(new CorrelatorStateSummary()
                {
                    Status = CorrelatorStateSummary.StatusCode.NeedsProcessing
                });
            }
            if (numFailed != 0)
            {
                return(new CorrelatorStateSummary()
                {
                    Status = CorrelatorStateSummary.StatusCode.ProcessingFailed,
                    Report = report
                });
            }
            return(new CorrelatorStateSummary()
            {
                Status = CorrelatorStateSummary.StatusCode.Processed,
                Report = report
            });
        }