Esempio n. 1
0
        /// <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;
            }));
        }
Esempio n. 2
0
        /// <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();
                }
            }
        }
Esempio n. 3
0
        /// <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;
            }));
        }