public static IApiRequestFactory GetAgentIntakeFactory(ImmutableExporterSettings settings)
    {
        // use the same transport for telemetry as we do for traces
        var strategy = settings.TracesTransport;

        switch (strategy)
        {
        case TracesTransportType.WindowsNamedPipe:
            Log.Information <string, string, int>("Using {FactoryType} for telemetry transport, with pipe name {PipeName} and timeout {Timeout}ms.", nameof(NamedPipeClientStreamFactory), settings.TracesPipeName, settings.TracesPipeTimeoutMs);
            return(new HttpStreamRequestFactory(new NamedPipeClientStreamFactory(settings.TracesPipeName, settings.TracesPipeTimeoutMs), DatadogHttpClient.CreateTelemetryAgentClient(), GetBaseEndpoint()));

        case TracesTransportType.Default:
        default:
            var agentUri = UriHelpers.Combine(settings.AgentUri, TelemetryConstants.AgentTelemetryEndpoint);
#if NETCOREAPP
            Log.Information("Using {FactoryType} for telemetry transport.", nameof(HttpClientRequestFactory));
            return(new HttpClientRequestFactory(agentUri, TelemetryHttpHeaderNames.GetDefaultAgentHeaders(), timeout: Timeout));
#else
            Log.Information("Using {FactoryType} for telemetry transport.", nameof(ApiWebRequestFactory));
            return(new ApiWebRequestFactory(agentUri, TelemetryHttpHeaderNames.GetDefaultAgentHeaders(), timeout: Timeout));
#endif
        }
 public Uri GetEndpoint(string relativePath)
 {
     return(UriHelpers.Combine(_baseEndpoint, relativePath));
 }
 public Uri GetEndpoint(string relativePath) => UriHelpers.Combine(_baseEndpoint, relativePath);
        public static TelemetrySettings FromSource(IConfigurationSource?source)
        {
            string?configurationError = null;

            var apiKey = source?.GetString(ConfigurationKeys.ApiKey);
            var agentlessExplicitlyEnabled = source?.GetBool(ConfigurationKeys.Telemetry.AgentlessEnabled);

            var agentlessEnabled = false;

            if (agentlessExplicitlyEnabled == true)
            {
                if (string.IsNullOrEmpty(apiKey))
                {
                    configurationError = "Telemetry configuration error: Agentless mode was enabled, but no API key was available.";
                }
                else
                {
                    agentlessEnabled = true;
                }
            }
            else if (agentlessExplicitlyEnabled is null)
            {
                // if there's an API key, we use agentless mode, otherwise we use the agent
                agentlessEnabled = !string.IsNullOrEmpty(apiKey);
            }

            // disabled by default unless using agentless
            var telemetryEnabled = source?.GetBool(ConfigurationKeys.Telemetry.Enabled)
                                   ?? agentlessEnabled;

            AgentlessSettings?agentless = null;

            if (telemetryEnabled && agentlessEnabled)
            {
                // We have an API key, so try to send directly to intake
                Uri agentlessUri;

                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
                    agentlessUri = UriHelpers.Combine(telemetryUri, "/");
                }
                else
                {
                    if (!string.IsNullOrEmpty(requestedTelemetryUri))
                    {
                        // URI parsing failed
                        configurationError = configurationError is null
                                                 ? $"Telemetry configuration error: The provided telemetry Uri '{requestedTelemetryUri}' was not a valid absolute Uri. Using default intake Uri."
                                                 : configurationError + ", The provided telemetry Uri '{requestedTelemetryUri}' was not a valid absolute Uri. Using default intake Uri.";
                    }

                    // use the default intake. Use SIGNALFX_SITE if provided, otherwise use default
                    var siteFromEnv = source?.GetString(ConfigurationKeys.Site);
                    var ddSite      = string.IsNullOrEmpty(siteFromEnv) ? "datadoghq.com" : siteFromEnv;
                    agentlessUri = new Uri($"{TelemetryConstants.TelemetryIntakePrefix}.{ddSite}/");
                }

                agentless = new AgentlessSettings(agentlessUri, apiKey !);
            }

            return(new TelemetrySettings(telemetryEnabled, configurationError, agentless));
        }