public Task <ActionResult> CaptureTrace( [FromQuery] int?pid = null, [FromQuery] Guid?uid = null, [FromQuery] string name = null, [FromQuery] Models.TraceProfile profile = DefaultTraceProfiles, [FromQuery][Range(-1, int.MaxValue)] int durationSeconds = 30, [FromQuery] string egressProvider = null) { ProcessKey?processKey = GetProcessKey(pid, uid, name); return(InvokeForProcess(processInfo => { TimeSpan duration = Utilities.ConvertSecondsToTimeSpan(durationSeconds); var aggregateConfiguration = TraceUtilities.GetTraceConfiguration(profile, _counterOptions.CurrentValue.GetIntervalSeconds()); return StartTrace(processInfo, aggregateConfiguration, duration, egressProvider); }, processKey, Utilities.ArtifactType_Trace)); }
public Task <ActionResult> CaptureTraceCustom( [FromBody][Required] Models.EventPipeConfiguration configuration, [FromQuery] int?pid = null, [FromQuery] Guid?uid = null, [FromQuery] string name = null, [FromQuery][Range(-1, int.MaxValue)] int durationSeconds = 30, [FromQuery] string egressProvider = null) { ProcessKey?processKey = GetProcessKey(pid, uid, name); return(InvokeForProcess(processInfo => { foreach (Models.EventPipeProvider provider in configuration.Providers) { if (!CounterValidator.ValidateProvider(_counterOptions.CurrentValue, provider, out string errorMessage)) { throw new ValidationException(errorMessage); } } TimeSpan duration = Utilities.ConvertSecondsToTimeSpan(durationSeconds); var traceConfiguration = TraceUtilities.GetTraceConfiguration(configuration.Providers, configuration.RequestRundown, configuration.BufferSizeInMB); return StartTrace(processInfo, traceConfiguration, duration, egressProvider); }, processKey, Utilities.ArtifactType_Trace)); }
protected override async Task <CollectionRuleActionResult> ExecuteCoreAsync( TaskCompletionSource <object> startCompletionSource, CancellationToken token) { TimeSpan duration = Options.Duration.GetValueOrDefault(TimeSpan.Parse(CollectTraceOptionsDefaults.Duration)); string egressProvider = Options.Egress; MonitoringSourceConfiguration configuration; if (Options.Profile.HasValue) { TraceProfile profile = Options.Profile.Value; float metricsIntervalSeconds = _counterOptions.CurrentValue.GetIntervalSeconds(); configuration = TraceUtilities.GetTraceConfiguration(profile, metricsIntervalSeconds); } else { EventPipeProvider[] optionsProviders = Options.Providers.ToArray(); bool requestRundown = Options.RequestRundown.GetValueOrDefault(CollectTraceOptionsDefaults.RequestRundown); int bufferSizeMegabytes = Options.BufferSizeMegabytes.GetValueOrDefault(CollectTraceOptionsDefaults.BufferSizeMegabytes); configuration = TraceUtilities.GetTraceConfiguration(optionsProviders, requestRundown, bufferSizeMegabytes); } string fileName = TraceUtilities.GenerateTraceFileName(EndpointInfo); KeyValueLogScope scope = Utils.CreateArtifactScope(Utils.ArtifactType_Trace, EndpointInfo); EgressOperation egressOperation = new EgressOperation( async(outputStream, token) => { using IDisposable operationRegistration = _operationTrackerService.Register(EndpointInfo); await TraceUtilities.CaptureTraceAsync(startCompletionSource, EndpointInfo, configuration, duration, outputStream, token); }, egressProvider, fileName, EndpointInfo, ContentTypes.ApplicationOctetStream, scope); ExecutionResult <EgressResult> result = await egressOperation.ExecuteAsync(_serviceProvider, token); string traceFilePath = result.Result.Value; return(new CollectionRuleActionResult() { OutputValues = new Dictionary <string, string>(StringComparer.Ordinal) { { CollectionRuleActionConstants.EgressPathOutputValueName, traceFilePath } } }); }