/// <summary> /// Initializes global instrumentation values. /// </summary> public static void Initialize() { if (Interlocked.Exchange(ref _firstInitialization, 0) != 1) { // Initialize() was already called before return; } Log.Debug("Initialization started."); try { Log.Debug("Enabling by ref instrumentation."); NativeMethods.EnableByRefInstrumentation(); Log.Information("ByRef instrumentation enabled."); } catch (Exception ex) { Log.Error(ex, "ByRef instrumentation cannot be enabled: "); } try { Log.Debug("Enabling calltarget state by ref."); NativeMethods.EnableCallTargetStateByRef(); Log.Information("CallTarget State ByRef enabled."); } catch (Exception ex) { Log.Error(ex, "CallTarget state ByRef cannot be enabled: "); } try { Log.Debug("Sending CallTarget integration definitions to native library."); var payload = InstrumentationDefinitions.GetAllDefinitions(); NativeMethods.InitializeProfiler(payload.DefinitionsId, payload.Definitions); foreach (var def in payload.Definitions) { def.Dispose(); } Log.Information <int>("The profiler has been initialized with {count} definitions.", payload.Definitions.Length); } catch (Exception ex) { Log.Error(ex, ex.Message); } try { Serverless.InitIfNeeded(); } catch (Exception ex) { Serverless.Error("Error while loading Serverless definitions", ex); } try { Log.Debug("Sending CallTarget derived integration definitions to native library."); var payload = InstrumentationDefinitions.GetDerivedDefinitions(); NativeMethods.AddDerivedInstrumentations(payload.DefinitionsId, payload.Definitions); foreach (var def in payload.Definitions) { def.Dispose(); } Log.Information <int>("The profiler has been initialized with {count} derived definitions.", payload.Definitions.Length); } catch (Exception ex) { Log.Error(ex, ex.Message); } InitializeNoNativeParts(); Log.Debug("Initialization finished."); }
/// <summary> /// Initializes global instrumentation values. /// </summary> public static void Initialize() { if (Interlocked.Exchange(ref _firstInitialization, 0) != 1) { // Initialize() was already called before return; } Log.Debug("Initialization started."); try { Log.Debug("Enabling by ref instrumentation."); NativeMethods.EnableByRefInstrumentation(); Log.Information("ByRef instrumentation enabled."); } catch (Exception ex) { Log.Error(ex, "ByRef instrumentation cannot be enabled: "); } try { Log.Debug("Enabling calltarget state by ref."); NativeMethods.EnableCallTargetStateByRef(); Log.Information("CallTarget State ByRef enabled."); } catch (Exception ex) { Log.Error(ex, "CallTarget state ByRef cannot be enabled: "); } try { Log.Debug("Sending CallTarget integration definitions to native library."); var payload = InstrumentationDefinitions.GetAllDefinitions(); NativeMethods.InitializeProfiler(payload.DefinitionsId, payload.Definitions); foreach (var def in payload.Definitions) { def.Dispose(); } Log.Information <int>("The profiler has been initialized with {count} definitions.", payload.Definitions.Length); } catch (Exception ex) { Log.Error(ex, ex.Message); } try { Serverless.InitIfNeeded(); } catch (Exception ex) { Serverless.Error("Error while loading Serverless definitions", ex); } try { Log.Debug("Sending CallTarget derived integration definitions to native library."); var payload = InstrumentationDefinitions.GetDerivedDefinitions(); NativeMethods.AddDerivedInstrumentations(payload.DefinitionsId, payload.Definitions); foreach (var def in payload.Definitions) { def.Dispose(); } Log.Information <int>("The profiler has been initialized with {count} derived definitions.", payload.Definitions.Length); } catch (Exception ex) { Log.Error(ex, ex.Message); } try { Log.Debug("Initializing TraceAttribute instrumentation."); var payload = InstrumentationDefinitions.GetTraceAttributeDefinitions(); NativeMethods.AddTraceAttributeInstrumentation(payload.DefinitionsId, payload.AssemblyName, payload.TypeName); Log.Information("TraceAttribute instrumentation enabled with Assembly={AssemblyName} and Type={TypeName}.", payload.AssemblyName, payload.TypeName); } catch (Exception ex) { Log.Error(ex, ex.Message); } InitializeNoNativeParts(); var tracer = Tracer.Instance; // before this line you should not call anything related to TracerManager.Instance // otherwise you can have multiple instances of Tracer if (tracer is null) { Log.Debug("Skipping TraceMethods initialization because Tracer.Instance was null after InitializeNoNativeParts was invoked"); } else { try { Log.Debug("Initializing TraceMethods instrumentation."); var traceMethodsConfiguration = tracer.Settings.TraceMethods; var payload = InstrumentationDefinitions.GetTraceMethodDefinitions(); NativeMethods.InitializeTraceMethods(payload.DefinitionsId, payload.AssemblyName, payload.TypeName, traceMethodsConfiguration); Log.Information("TraceMethods instrumentation enabled with Assembly={AssemblyName}, Type={TypeName}, and Configuration={}.", payload.AssemblyName, payload.TypeName, traceMethodsConfiguration); } catch (Exception ex) { Log.Error(ex, ex.Message); } } InitializeThreadSampling(); Log.Debug("Initialization finished."); }