in src/ServiceProfiler.EventPipe.Otel/Azure.Monitor.OpenTelemetry.Profiler.Core/OpenTelemetryProfilerProvider.cs [52:106]
public async Task<bool> StartServiceProfilerAsync(IProfilerSource source, CancellationToken cancellationToken = default)
{
_logger.LogTrace("Entering {name}.", nameof(StartServiceProfilerAsync));
try
{
if (!await _singleProfilingSemaphore.WaitAsync(TimeSpan.FromSeconds(1), cancellationToken).ConfigureAwait(false))
{
_logger.LogDebug("No semaphore fetched within given time to check profiling state. There is another profiling in progress. Give it up.");
return false;
}
}
catch (Exception ex) when (ex is ObjectDisposedException || ex is OperationCanceledException)
{
_logger.LogDebug("Semaphore disposed or cancelled. Profiler won't start.");
return false;
}
// Successfully acquired semaphore here.
bool profilerStarted = false;
_logger.LogTrace("Got the semaphore. Try starting the Profiler.");
_logger.LogInformation(StartProfilerTriggered);
string localCacheFolder = _userCacheManager.TempTraceDirectory.FullName;
Directory.CreateDirectory(localCacheFolder);
_currentTraceFilePath = Path.ChangeExtension(Path.Combine(localCacheFolder, Guid.NewGuid().ToString()), TraceFileExtension);
_logger.LogDebug("Trace File Path: {traceFilePath}", _currentTraceFilePath);
try
{
_logger.LogDebug("Call TraceControl.Enable().");
await _traceControl.EnableAsync(_currentTraceFilePath, cancellationToken).ConfigureAwait(false);
// Dispose any previous trace session listener
_listener?.Dispose();
_listener = _traceSessionListenerFactory.Create();
_logger.LogDebug("New traceSessionListener created.");
profilerStarted = true;
}
catch (Exception ex)
{
_logger.LogError(ex, "Failed to start eventpipe profiling.");
throw;
}
if (profilerStarted)
{
_logger.LogInformation(StartProfilerSucceeded);
}
return profilerStarted;
}