/// <summary> /// Collects environment variable to be set in test process by avoiding duplicates /// and detecting override of variable value by multiple adapters. /// </summary> /// <param name="dataCollectionWrapper"> /// The data Collection Wrapper. /// </param> /// <param name="dataCollectorEnvironmentVariables"> /// Environment variables required for already loaded plugin. /// </param> private void AddCollectorEnvironmentVariables( DataCollectorInformation dataCollectionWrapper, Dictionary <string, DataCollectionEnvironmentVariable> dataCollectorEnvironmentVariables) { if (dataCollectionWrapper.TestExecutionEnvironmentVariables != null) { var collectorFriendlyName = dataCollectionWrapper.DataCollectorConfig.FriendlyName; foreach (var namevaluepair in dataCollectionWrapper.TestExecutionEnvironmentVariables) { DataCollectionEnvironmentVariable alreadyRequestedVariable; if (dataCollectorEnvironmentVariables.TryGetValue(namevaluepair.Key, out alreadyRequestedVariable)) { // Dev10 behavior is to consider environment variables values as case sensitive. if (string.Equals(namevaluepair.Value, alreadyRequestedVariable.Value, StringComparison.Ordinal)) { alreadyRequestedVariable.AddRequestingDataCollector(collectorFriendlyName); } else { // Data collector is overriding an already requested variable, possibly an error. dataCollectionWrapper.Logger.LogError( this.dataCollectionEnvironmentContext.SessionDataCollectionContext, string.Format( CultureInfo.CurrentUICulture, Resources.Resources.DataCollectorRequestedDuplicateEnvironmentVariable, collectorFriendlyName, namevaluepair.Key, namevaluepair.Value, alreadyRequestedVariable.FirstDataCollectorThatRequested, alreadyRequestedVariable.Value)); } } else { if (EqtTrace.IsVerboseEnabled) { // new variable, add to the list. EqtTrace.Verbose("DataCollectionManager.AddCollectionEnvironmentVariables: Adding Environment variable '{0}' value '{1}'", namevaluepair.Key, namevaluepair.Value); } dataCollectorEnvironmentVariables.Add( namevaluepair.Key, new DataCollectionEnvironmentVariable(namevaluepair, collectorFriendlyName)); } } } }
/// <summary> /// Loads and initializes data collector using data collector settings. /// </summary> /// <param name="dataCollectorSettings"> /// The data collector settings. /// </param> /// <param name="settingsXml"> runsettings Xml</param> private void LoadAndInitialize(DataCollectorSettings dataCollectorSettings, string settingsXml) { DataCollectorInformation dataCollectorInfo; DataCollectorConfig dataCollectorConfig; try { // Look up the extension and initialize it if one is found. var extensionManager = this.DataCollectorExtensionManager; var dataCollectorUri = string.Empty; this.TryGetUriFromFriendlyName(dataCollectorSettings.FriendlyName, out dataCollectorUri); DataCollector dataCollector = null; if (!string.IsNullOrWhiteSpace(dataCollectorUri)) { dataCollector = this.TryGetTestExtension(dataCollectorUri); } if (dataCollector == null) { this.LogWarning(string.Format(CultureInfo.CurrentUICulture, Resources.Resources.DataCollectorNotFound, dataCollectorSettings.FriendlyName)); return; } if (this.RunDataCollectors.ContainsKey(dataCollector.GetType())) { // Collector is already loaded (may be configured twice). Ignore duplicates and return. return; } dataCollectorConfig = new DataCollectorConfig(dataCollector.GetType()); // Attempt to get the data collector information verifying that all of the required metadata for the collector is available. dataCollectorInfo = new DataCollectorInformation( dataCollector, dataCollectorSettings.Configuration, dataCollectorConfig, this.dataCollectionEnvironmentContext, this.attachmentManager, this.events, this.messageSink, settingsXml); } catch (Exception ex) { if (EqtTrace.IsErrorEnabled) { EqtTrace.Error("DataCollectionManager.LoadAndInitialize: exception while creating data collector {0} : {1}", dataCollectorSettings.FriendlyName, ex); } // No data collector info, so send the error with no direct association to the collector. this.LogWarning(string.Format(CultureInfo.CurrentUICulture, Resources.Resources.DataCollectorInitializationError, dataCollectorSettings.FriendlyName, ex)); return; } try { dataCollectorInfo.InitializeDataCollector(); lock (this.RunDataCollectors) { // Add data collectors to run cache. this.RunDataCollectors[dataCollectorConfig.DataCollectorType] = dataCollectorInfo; } } catch (Exception ex) { if (EqtTrace.IsErrorEnabled) { EqtTrace.Error("DataCollectionManager.LoadAndInitialize: exception while initializing data collector {0} : {1}", dataCollectorSettings.FriendlyName, ex); } // Log error. dataCollectorInfo.Logger.LogError(this.dataCollectionEnvironmentContext.SessionDataCollectionContext, string.Format(CultureInfo.CurrentCulture, Resources.Resources.DataCollectorInitializationError, dataCollectorConfig.FriendlyName, ex.Message)); // Dispose datacollector. dataCollectorInfo.DisposeDataCollector(); } }
/// <summary> /// Loads and initializes datacollector using datacollector settings. /// </summary> /// <param name="dataCollectorSettings"> /// The data collector settings. /// </param> private void LoadAndInitialize(DataCollectorSettings dataCollectorSettings) { var collectorTypeName = dataCollectorSettings.AssemblyQualifiedName; DataCollectorInformation dataCollectorInfo; DataCollectorConfig dataCollectorConfig; try { var dataCollector = this.dataCollectorLoader.Load(dataCollectorSettings.CodeBase, dataCollectorSettings.AssemblyQualifiedName); if (dataCollector == null) { this.LogWarning(string.Format(CultureInfo.CurrentUICulture, Resources.Resources.DataCollectorNotFound, collectorTypeName, string.Empty)); return; } if (this.RunDataCollectors.ContainsKey(dataCollector.GetType())) { // Collector is already loaded (may be configured twice). Ignore duplicates and return. return; } dataCollectorConfig = new DataCollectorConfig(dataCollector.GetType()); // Attempt to get the data collector information verifying that all of the required metadata for the collector is available. dataCollectorInfo = new DataCollectorInformation( dataCollector, dataCollectorSettings.Configuration, dataCollectorConfig, this.dataCollectionEnvironmentContext, this.attachmentManager, this.events, this.messageSink); if (!dataCollectorInfo.DataCollectorConfig.TypeUri.Equals(dataCollectorSettings.Uri)) { // If the data collector was not found, send an error. this.LogWarning(string.Format(CultureInfo.CurrentCulture, Resources.Resources.DataCollectorNotFound, dataCollectorConfig.DataCollectorType.FullName, dataCollectorSettings.Uri)); return; } } catch (Exception ex) { if (EqtTrace.IsErrorEnabled) { EqtTrace.Error("DataCollectionManager.LoadAndInitialize: exception while creating data collector {0} : {1}", collectorTypeName, ex); } // No data collector info, so send the error with no direct association to the collector. this.LogWarning(string.Format(CultureInfo.CurrentUICulture, Resources.Resources.DataCollectorInitializationError, collectorTypeName, ex.Message)); return; } try { dataCollectorInfo.InitializeDataCollector(); lock (this.RunDataCollectors) { // Add data collectors to run cache. this.RunDataCollectors[dataCollectorConfig.DataCollectorType] = dataCollectorInfo; } } catch (Exception ex) { if (EqtTrace.IsErrorEnabled) { EqtTrace.Error("DataCollectionManager.LoadAndInitialize: exception while initializing data collector {0}: " + ex, collectorTypeName); } // Log error. dataCollectorInfo.Logger.LogError(this.dataCollectionEnvironmentContext.SessionDataCollectionContext, string.Format(CultureInfo.CurrentCulture, Resources.Resources.DataCollectorInitializationError, dataCollectorConfig.FriendlyName, ex.Message)); // Dispose datacollector. dataCollectorInfo.DisposeDataCollector(); } }
private static string GetTelemetryKey(string telemetryPrefix, DataCollectorInformation dataCollectorInformation) { return(string.Format("{0}.{1}", telemetryPrefix, dataCollectorInformation.DataCollectorConfig?.TypeUri?.ToString())); }
private void RecordProfilerMetricForConflictedVariable(string profilerVariable, string telemetryPrefix, DataCollectorInformation dataCollectorInformation, string name, string value, string existingValue) { // If data collector is requesting same profiler record it same as new if (string.Equals(value, existingValue, StringComparison.OrdinalIgnoreCase)) { RecordProfilerMetricForNewVariable(profilerVariable, telemetryPrefix, dataCollectorInformation, name, value); return; } if (!string.Equals(profilerVariable, name, StringComparison.Ordinal)) { return; } var existingProfilerGuid = GetProfilerGuid(existingValue); if (ClrIeProfilerGuid == existingProfilerGuid) { if (dataCollectorInformation.TestExecutionEnvironmentVariables != null && dataCollectorInformation.TestExecutionEnvironmentVariables.Any(pair => pair.Key.StartsWith(ClrIeInstrumentationMethodConfigurationPrefix32Variable)) && dataCollectorInformation.TestExecutionEnvironmentVariables.Any(pair => pair.Key.StartsWith(ClrIeInstrumentationMethodConfigurationPrefix64Variable))) { requestData.MetricsCollection.Add(GetTelemetryKey(telemetryPrefix, dataCollectorInformation), ClrIeProfilerGuid.ToString()); return; } } requestData.MetricsCollection.Add(GetTelemetryKey(telemetryPrefix, dataCollectorInformation), $"{existingProfilerGuid}({OverwrittenProfilerName}:{GetProfilerGuid(value)})"); }
private void RecordProfilerMetricForNewVariable(string profilerVariable, string telemetryPrefix, DataCollectorInformation dataCollectorInformation, string name, string value) { if (!string.Equals(profilerVariable, name, StringComparison.Ordinal)) { return; } requestData.MetricsCollection.Add(GetTelemetryKey(telemetryPrefix, dataCollectorInformation), GetProfilerGuid(value).ToString()); }
/// <inheritdoc/> public void RecordEnvironmentVariableConflict(DataCollectorInformation dataCollectorInformation, string name, string value, string existingValue) { RecordProfilerMetricForConflictedVariable(CorProfilerVariable, TelemetryDataConstants.DataCollectorsCorProfiler, dataCollectorInformation, name, value, existingValue); RecordProfilerMetricForConflictedVariable(CoreClrProfilerVariable, TelemetryDataConstants.DataCollectorsCoreClrProfiler, dataCollectorInformation, name, value, existingValue); }
/// <inheritdoc/> public void RecordEnvironmentVariableAddition(DataCollectorInformation dataCollectorInformation, string name, string value) { RecordProfilerMetricForNewVariable(CorProfilerVariable, TelemetryDataConstants.DataCollectorsCorProfiler, dataCollectorInformation, name, value); RecordProfilerMetricForNewVariable(CoreClrProfilerVariable, TelemetryDataConstants.DataCollectorsCoreClrProfiler, dataCollectorInformation, name, value); }