Exemple #1
0
        public ZipkinExporter(ImmutableTracerSettings settings)
        {
            Log.Debug("Creating new Zipkin exporter");

            _settings       = settings ?? throw new ArgumentNullException(nameof(settings));
            _tracesEndpoint = _settings.ExporterSettings.AgentUri;
        }
        public CIAgentWriter(ImmutableTracerSettings settings, ISampler sampler, int maxBufferSize = DefaultMaxBufferSize)
        {
            var isPartialFlushEnabled = settings.ExporterSettings.PartialFlushEnabled;
            var apiRequestFactory     = TracesTransportStrategy.Get(settings.ExporterSettings);
            var api = new Api(apiRequestFactory, null, rates => sampler.SetDefaultSampleRates(rates), isPartialFlushEnabled);

            _agentWriter = new AgentWriter(api, null, maxBufferSize: maxBufferSize);
        }
 public CITracerManager(ImmutableTracerSettings settings, IAgentWriter agentWriter, ISampler sampler, IScopeManager scopeManager, IDogStatsd statsd, RuntimeMetricsWriter runtimeMetricsWriter, ITraceIdConvention traceIdConvention, DirectLogSubmissionManager logSubmissionManager, ITelemetryController telemetry, string defaultServiceName)
     : base(settings, agentWriter, sampler, scopeManager, statsd, runtimeMetricsWriter, traceIdConvention, logSubmissionManager, telemetry, defaultServiceName, new Trace.Processors.ITraceProcessor[]
 {
     new Trace.Processors.NormalizerTraceProcessor(),
     new Trace.Processors.TruncatorTraceProcessor(),
     new Processors.OriginTagTraceProcessor(settings.ExporterSettings.PartialFlushEnabled, agentWriter is CIAgentlessWriter),
 })
 {
 }
Exemple #4
0
        public void SetAnalyticsSampleRate(IntegrationId integration, ImmutableTracerSettings settings, bool enabledWithGlobalSetting)
        {
            if (settings != null)
            {
#pragma warning disable 618 // App analytics is deprecated, but still used
                AnalyticsSampleRate = settings.GetIntegrationAnalyticsSampleRate(integration, enabledWithGlobalSetting);
#pragma warning restore 618
            }
        }
        /// <summary>
        ///  Initializes the managed-side thread sample reader.
        /// </summary>
        /// <param name="tracerSettings">Configuration settings.</param>
        public static void Initialize(ImmutableTracerSettings tracerSettings)
        {
            _tracerSettings = tracerSettings;

            var thread = new Thread(SampleReadingThread)
            {
                Name         = BackgroundThreadName,
                IsBackground = true
            };

            thread.Start();
        }
 protected override TracerManager CreateTracerManagerFrom(
     ImmutableTracerSettings settings,
     IAgentWriter agentWriter,
     ISampler sampler,
     IScopeManager scopeManager,
     IDogStatsd statsd,
     RuntimeMetricsWriter runtimeMetrics,
     DirectLogSubmissionManager logSubmissionManager,
     ITelemetryController telemetry,
     string defaultServiceName)
 {
     return(new CITracerManager(settings, agentWriter, sampler, scopeManager, statsd, runtimeMetrics, logSubmissionManager, telemetry, defaultServiceName));
 }
        public void RecordTracerSettings(ImmutableTracerSettings settings)
        {
            for (var i = 0; i < settings.Integrations.Settings.Length; i++)
            {
                var integration = settings.Integrations.Settings[i];
                if (integration.Enabled == false)
                {
                    _integrationsById[i].WasExplicitlyDisabled = 1;
                }
            }

            SetHasChanges();
        }
        protected ThreadSampleExporter(ImmutableTracerSettings tracerSettings)
        {
            FixedLogRecordAttributes = new ReadOnlyCollection <KeyValue>(new List <KeyValue>
            {
                GdiProfilingConventions.LogRecord.Attributes.Source,
                GdiProfilingConventions.LogRecord.Attributes.Period((long)tracerSettings.ThreadSamplingPeriod.TotalMilliseconds),
                GdiProfilingConventions.LogRecord.Attributes.Format(tracerSettings.ExporterSettings.ProfilerExportFormat),
                GdiProfilingConventions.LogRecord.Attributes.Type
            });

            LogsEndpointUrl = tracerSettings.ExporterSettings.LogsEndpointUrl;

            LogsData = GdiProfilingConventions.CreateLogsData(tracerSettings.GlobalTags);
        }
Exemple #9
0
        public CIAgentlessWriter(ImmutableTracerSettings settings, ISampler sampler, ICIAgentlessWriterSender sender)
        {
            _eventQueue = new BlockingCollection <IEvent>(MaxItemsInQueue);
            _flushTaskCompletionSource = new TaskCompletionSource <bool>(TaskCreationOptions.RunContinuationsAsynchronously);
            _flushDelayEvent           = new AutoResetEvent(false);

            _ciTestCycleBuffer = new CITestCyclePayload();

            _sender = sender;

            _periodicFlush = Task.Factory.StartNew(InternalFlushEventsAsync, this, TaskCreationOptions.LongRunning);
            _periodicFlush.ContinueWith(t => Log.Error(t.Exception, "Error in sending ciapp events"), TaskContinuationOptions.OnlyOnFaulted);

            Log.Information("CIAgentlessWriter Initialized.");
        }
Exemple #10
0
        public void RecordTracerSettings(
            ImmutableTracerSettings tracerSettings,
            string defaultServiceName,
            AzureAppServices appServicesMetadata)
        {
            // Increment number of times this has been called
            var reconfigureCount = Interlocked.Increment(ref _tracerInstanceCount);
            var appData          = new ApplicationTelemetryData(
                serviceName: defaultServiceName,
                env: tracerSettings.Environment,
                tracerVersion: TracerConstants.AssemblyVersion,
                languageName: "dotnet",
                languageVersion: FrameworkDescription.Instance.ProductVersion)
            {
                ServiceVersion = tracerSettings.ServiceVersion,
                RuntimeName    = FrameworkDescription.Instance.Name,
            };

            _settings = new CurrentSettings(tracerSettings, appData);

            // The remaining properties can't change, so only need to set them the first time
            if (reconfigureCount != 1)
            {
                SetHasChanges();
                return;
            }

            _azureApServicesMetadata = appServicesMetadata;
            var host = HostMetadata.Instance;

            _hostData = new HostTelemetryData
            {
                ContainerId   = ContainerMetadata.GetContainerId(),
                Os            = FrameworkDescription.Instance.OSPlatform,
                OsVersion     = Environment.OSVersion.ToString(),
                Hostname      = host.Hostname,
                KernelName    = host.KernelName,
                KernelRelease = host.KernelRelease,
                KernelVersion = host.KernelVersion,
            };

            _isTracerInitialized = true;
            SetHasChanges();
        }
Exemple #11
0
        public TelemetrySettings(IConfigurationSource source, ImmutableTracerSettings tracerSettings)
        {
            var explicitlyEnabled = source?.GetBool(ConfigurationKeys.Telemetry.Enabled);

            TelemetryEnabled = explicitlyEnabled ?? false;

            var apiKey = source?.GetString(ConfigurationKeys.ApiKey);

            if (explicitlyEnabled != false && !string.IsNullOrEmpty(apiKey))
            {
                // We have an API key, so try to send directly to intake
                ApiKey           = apiKey;
                TelemetryEnabled = true;

                var requestedTelemetryUri = source?.GetString(ConfigurationKeys.Telemetry.Uri);
                if (!string.IsNullOrEmpty(requestedTelemetryUri) &&
                    Uri.TryCreate(requestedTelemetryUri, UriKind.Absolute, out var telemetryUri))
                {
                    // telemetry URI provided and well-formed
                    TelemetryUri = telemetryUri;
                }
                else
                {
                    // use the default intake. Use DD_SITE if provided, otherwise use default
                    var siteFromEnv = source.GetString(ConfigurationKeys.Site);
                    var ddSite      = string.IsNullOrEmpty(siteFromEnv) ? "datadoghq.com" : siteFromEnv;
                    TelemetryUri = new Uri($"{TelemetryConstants.TelemetryIntakePrefix}.{ddSite}/");
                }
            }
            else if (TelemetryEnabled)
            {
                // no API key provided, so send to the agent instead
                // We only support http at the moment so disable telemetry for now if we're using something else
                if (tracerSettings.Exporter.TracesTransport == TracesTransportType.Default)
                {
                    TelemetryUri = new Uri(tracerSettings.Exporter.AgentUri, TelemetryConstants.AgentTelemetryEndpoint);
                }
                else
                {
                    TelemetryEnabled = false;
                }
            }
        }
        private IApiRequestFactory GetRequestFactory(ImmutableTracerSettings settings)
        {
            IApiRequestFactory factory          = null;
            TimeSpan           agentlessTimeout = TimeSpan.FromSeconds(15);

#if NETCOREAPP
            Log.Information("Using {FactoryType} for trace transport.", nameof(HttpClientRequestFactory));
            factory = new HttpClientRequestFactory(settings.ExporterSettings.AgentUri, AgentHttpHeaderNames.DefaultHeaders, timeout: agentlessTimeout);
#else
            Log.Information("Using {FactoryType} for trace transport.", nameof(ApiWebRequestFactory));
            factory = new ApiWebRequestFactory(settings.ExporterSettings.AgentUri, AgentHttpHeaderNames.DefaultHeaders, timeout: agentlessTimeout);
#endif

            if (!string.IsNullOrWhiteSpace(_settings.ProxyHttps))
            {
                var proxyHttpsUriBuilder = new UriBuilder(_settings.ProxyHttps);

                var userName = proxyHttpsUriBuilder.UserName;
                var password = proxyHttpsUriBuilder.Password;

                proxyHttpsUriBuilder.UserName = string.Empty;
                proxyHttpsUriBuilder.Password = string.Empty;

                if (proxyHttpsUriBuilder.Scheme == "https")
                {
                    // HTTPS proxy is not supported by .NET BCL
                    Log.Error($"HTTPS proxy is not supported. ({proxyHttpsUriBuilder})");
                    return(factory);
                }

                NetworkCredential credential = null;
                if (!string.IsNullOrWhiteSpace(userName))
                {
                    credential = new NetworkCredential(userName, password);
                }

                Log.Information("Setting proxy to: {ProxyHttps}", proxyHttpsUriBuilder.Uri.ToString());
                factory.SetProxy(new WebProxy(proxyHttpsUriBuilder.Uri, true, _settings.ProxyNoProxy, credential), credential);
            }

            return(factory);
        }
        protected override IAgentWriter GetAgentWriter(ImmutableTracerSettings settings, IDogStatsd statsd, ISampler sampler)
        {
            // Check for agentless scenario
            if (_settings.Agentless)
            {
                if (!string.IsNullOrEmpty(_settings.ApiKey))
                {
                    return(new CIAgentlessWriter(new CIWriterHttpSender(GetRequestFactory(settings))));
                }
                else
                {
                    Environment.FailFast("An API key is required in Agentless mode.");
                    return(null);
                }
            }
            else
            {
                // With agent scenario:

                // Set the tracer buffer size to the max
                var traceBufferSize = 1024 * 1024 * 45; // slightly lower than the 50mb payload agent limit.
                return(new CIAgentWriter(settings, sampler, traceBufferSize));
            }
        }
Exemple #14
0
 public TelemetrySettingsTests()
 {
     _tracerSettings   = new(new TracerSettings());
     _defaultAgentUrl  = $"{_tracerSettings.Exporter.AgentUri}{TelemetryConstants.AgentTelemetryEndpoint}";
     _defaultIntakeUrl = "https://instrumentation-telemetry-intake.datadoghq.com/";
 }
Exemple #15
0
 public CurrentSettings(ImmutableTracerSettings settings, ApplicationTelemetryData applicationData)
 {
     Settings        = settings;
     ApplicationData = applicationData;
 }
Exemple #16
0
 public ThreadSampleExporterFactory(ImmutableTracerSettings tracerSettings)
 {
     _tracerSettings = tracerSettings;
 }
Exemple #17
0
 public PprofThreadSampleExporter(ImmutableTracerSettings tracerSettings)
     : base(tracerSettings)
 {
 }
Exemple #18
0
 internal PlainTextThreadSampleExporter(ImmutableTracerSettings tracerSettings)
     : base(tracerSettings)
 {
 }
        internal static void SetHttpStatusCode(this Span span, int statusCode, bool isServer, ImmutableTracerSettings tracerSettings)
        {
            if (statusCode < 100 || statusCode >= 600)
            {
                // not a valid status code. Likely the default integer value
                return;
            }

            string statusCodeString = ConvertStatusCodeToString(statusCode);

            if (span.Tags is IHasStatusCode statusCodeTags)
            {
                statusCodeTags.HttpStatusCode = statusCodeString;
            }
            else
            {
                span.SetTag(Tags.HttpStatusCode, statusCodeString);
            }

            // Check the customers http statuses that should be marked as errors
            if (tracerSettings.IsErrorStatusCode(statusCode, isServer))
            {
                span.Error = true;

                // if an error message already exists (e.g. from a previous exception), don't replace it
                if (string.IsNullOrEmpty(span.GetTag(Tags.ErrorMsg)))
                {
                    span.SetTag(Tags.ErrorMsg, $"The HTTP response has status code {statusCodeString}.");
                }
            }
        }
 protected override ISampler GetSampler(ImmutableTracerSettings settings)
 {
     return(new CISampler());
 }
 public ZipkinSerializer(ImmutableTracerSettings settings)
 {
     _settings = settings;
 }
 public ZipkinSpan(Span span, ImmutableTracerSettings settings)
 {
     _span = span;
     _tags = BuildTags(span, settings);
 }
Exemple #23
0
 public static TelemetrySettings FromDefaultSources(ImmutableTracerSettings tracerSettings)
 => new TelemetrySettings(GlobalSettings.CreateDefaultConfigurationSource(), tracerSettings);