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)); }
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); }
public ErrorState(Context ctx, IPostprocessorRunSummary runSummary) : base(ctx) { this.runSummary = runSummary; }
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 }); }
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 }); }