/// <summary> /// Creates the file listener. /// </summary> /// <param name="providerGuid">The provider unique identifier.</param> /// <param name="etlFileName">Name of the etl file.</param> /// <param name="metricProducedAction">The metric produced action.</param> /// <param name="eventIdFilter">The event identifier filter.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>A <see cref="RawListener"/> instance.</returns> private static RawListener CreateFileListener( Guid providerGuid, string etlFileName, Action <ILocalAggregatedMetric> metricProducedAction, int eventIdFilter, CancellationToken cancellationToken) { return(RawListener.CreateEtlFileListener( new[] { etlFileName }, eventRecord => { if (eventRecord->EventHeader.ProviderId == providerGuid && eventRecord->EventHeader.Id == eventIdFilter) { metricProducedAction(LocalAggregatedMetric.ConvertToMetricData(eventRecord)); } }, eventTraceLog => { Logger.Log( LoggerLevel.Info, LogId, "CreateFileListener", "LocalAggregatedMetric, cancelled = {0}", cancellationToken.IsCancellationRequested); return !cancellationToken.IsCancellationRequested; })); }
/// <summary> /// Setups the aggregated metric listener. /// </summary> /// <param name="providerGuid">The provider unique identifier.</param> /// <param name="etlFileName">The name of the etw file from when read data. If null, realtime session will be used.</param> /// <param name="metricProducedAction">The when metric available.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <param name="activeCollector">The active collector.</param> private static void SetupAggregatedMetricListener( Guid providerGuid, string etlFileName, Action <ILocalAggregatedMetric> metricProducedAction, CancellationToken cancellationToken, out ActiveCollector activeCollector) { var providers = new Dictionary <Guid, ProviderConfiguration> { { providerGuid, new ProviderConfiguration(providerGuid, EtwTraceLevel.Verbose, 0, 0) } }; var etwSessionConfig = new CollectorConfiguration(EtwSessionsPrefix + "aggregated-") { SessionType = SessionType.Realtime, Providers = providers }; activeCollector = new ActiveCollector(etwSessionConfig.Name); activeCollector.StartCollector(etwSessionConfig); RawListener etwListener = null; try { etwListener = string.IsNullOrWhiteSpace(etlFileName) ? CreateRealTimeListener(providerGuid, etwSessionConfig.Name, metricProducedAction, 1, cancellationToken) : CreateFileListener(providerGuid, etlFileName, metricProducedAction, 1, cancellationToken); // TODO: Better to check providers periodically and retry several times. if (!ActiveCollector.TryUpdateProviders(etwSessionConfig)) { Logger.Log(LoggerLevel.Error, LogId, "Main", "Failed to update ETW providers. Terminating."); return; } try { etwListener.Process(); } finally { Logger.Log( cancellationToken.IsCancellationRequested ? LoggerLevel.Info : LoggerLevel.Error, LogId, "SetupEtwDataPipeline", "ETW Thread terminated unexpectedly, typically indicates that the ETW session was stopped."); } } finally { if (etwListener != null) { etwListener.Dispose(); } } }
/// <summary> /// Creates the real time listener. /// </summary> /// <param name="providerGuid">The provider unique identifier.</param> /// <param name="etlSessionConfigName">Name of the etl session configuration.</param> /// <param name="metricProducedAction">The metric produced action.</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>An instance of <see cref="RawListener"/>.</returns> private static RawListener CreateRealTimeListener( Guid providerGuid, string etlSessionConfigName, Action <ILocalRawMetric> metricProducedAction, CancellationToken cancellationToken) { return(RawListener.CreateRealTimeListener( etlSessionConfigName, eventRecord => { if (eventRecord->EventHeader.ProviderId == providerGuid) { metricProducedAction(LocalRawMetric.ConvertToMetricData(eventRecord)); } }, eventTraceLog => { Logger.Log( LoggerLevel.Info, LogId, "CreateRealTimeListener", "LocalRawMetric, cancelled = {0}", cancellationToken.IsCancellationRequested); return !cancellationToken.IsCancellationRequested; })); }
/// <summary> /// Creates the real time listener. /// </summary> /// <param name="providerGuid">The provider unique identifier.</param> /// <param name="etlSessionConfigName">Name of the etl session configuration.</param> /// <param name="action">The action.</param> /// <param name="eventIdFilter">Event Id filter to call the action</param> /// <param name="cancellationToken">The cancellation token.</param> /// <returns>The ETW listener</returns> private static RawListener CreateRealTimeListener( Guid providerGuid, string etlSessionConfigName, Action <IDiagnosticHeartbeat> action, int eventIdFilter, CancellationToken cancellationToken) { return(RawListener.CreateRealTimeListener( etlSessionConfigName, eventRecord => { if (eventRecord->EventHeader.ProviderId == providerGuid && eventRecord->EventHeader.Id == eventIdFilter) { action(DiagnosticHeartbeat.FromEtwEvent(eventRecord)); } }, eventTraceLog => { Logger.Log( LoggerLevel.Info, LogId, "CreateRealTimeListener", "DiagnosticHeartbeat, cancelled = {0}", cancellationToken.IsCancellationRequested); return !cancellationToken.IsCancellationRequested; })); }