public MockTracerAgent(int port = 8126, int retries = 5)
        {
            // try up to 5 consecutive ports before giving up
            while (true)
            {
                // seems like we can't reuse a listener if it fails to start,
                // so create a new listener each time we retry
                var listener = new HttpListener();
                listener.Prefixes.Add($"http://localhost:{port}/");

                try
                {
                    listener.Start();

                    // successfully listening
                    Port      = port;
                    _listener = listener;

                    _listenerThread = new Thread(HandleHttpRequests);
                    _listenerThread.Start();

                    return;
                }
                catch (HttpListenerException) when(retries > 0)
                {
                    // only catch the exception if there are retries left
                    port = TcpPortProvider.GetOpenPort();
                    retries--;
                }

                // always close listener if exception is thrown,
                // whether it was caught or not
                listener.Close();
            }
        }
Example #2
0
        public MockTracerAgent(int port = 8126, int retries = 5, bool useStatsd = false)
        {
            _cancellationTokenSource = new CancellationTokenSource();

            if (useStatsd)
            {
                const int basePort = 11555;

                var retriesLeft = retries;

                while (true)
                {
                    try
                    {
                        _udpClient = new UdpClient(basePort + retriesLeft);
                    }
                    catch (Exception) when(retriesLeft > 0)
                    {
                        retriesLeft--;
                        continue;
                    }

                    _statsdThread = new Thread(HandleStatsdRequests)
                    {
                        IsBackground = true
                    };
                    _statsdThread.Start();

                    StatsdPort = basePort + retriesLeft;

                    break;
                }
            }

            // try up to 5 consecutive ports before giving up
            while (true)
            {
                // seems like we can't reuse a listener if it fails to start,
                // so create a new listener each time we retry
                var listener = new HttpListener();
                listener.Prefixes.Add($"http://127.0.0.1:{port}/");
                listener.Prefixes.Add($"http://localhost:{port}/");

                try
                {
                    listener.Start();

                    // successfully listening
                    Port      = port;
                    _listener = listener;

                    _listenerThread = new Thread(HandleHttpRequests);
                    _listenerThread.Start();

                    return;
                }
                catch (HttpListenerException) when(retries > 0)
                {
                    // only catch the exception if there are retries left
                    port = TcpPortProvider.GetOpenPort();
                    retries--;
                }

                // always close listener if exception is thrown,
                // whether it was caught or not
                listener.Close();
            }
        }
        public MockTracerAgent(int port = 8126, int retries = 5, bool useStatsd = false, bool doNotBindPorts = false, int?requestedStatsDPort = null)
        {
            _cancellationTokenSource = new CancellationTokenSource();

            if (doNotBindPorts)
            {
                // This is for any tests that want to use a specific port but never actually bind
                Port = port;
                return;
            }

            var listeners = new List <string>();

            if (useStatsd)
            {
                if (requestedStatsDPort != null)
                {
                    // This port is explicit, allow failure if not available
                    StatsdPort = requestedStatsDPort.Value;
                    _udpClient = new UdpClient(requestedStatsDPort.Value);
                }
                else
                {
                    const int basePort = 11555;

                    var retriesLeft = retries;

                    while (true)
                    {
                        try
                        {
                            _udpClient = new UdpClient(basePort + retriesLeft);
                        }
                        catch (Exception) when(retriesLeft > 0)
                        {
                            retriesLeft--;
                            continue;
                        }

                        StatsdPort = basePort + retriesLeft;
                        break;
                    }
                }

                _statsdTask = Task.Run(HandleStatsdRequests);

                listeners.Add($"Stats at port {StatsdPort}");
            }

            // try up to 5 consecutive ports before giving up
            while (true)
            {
                // seems like we can't reuse a listener if it fails to start,
                // so create a new listener each time we retry
                var listener = new HttpListener();
                listener.Prefixes.Add($"http://127.0.0.1:{port}/");
                listener.Prefixes.Add($"http://localhost:{port}/");

                var containerHostname = EnvironmentHelpers.GetEnvironmentVariable("CONTAINER_HOSTNAME");
                if (containerHostname != null)
                {
                    listener.Prefixes.Add($"{containerHostname}:{port}/");
                }

                try
                {
                    listener.Start();

                    // successfully listening
                    Port      = port;
                    _listener = listener;

                    listeners.Add($"Traces at port {Port}");
                    _tracesListenerTask = Task.Run(HandleHttpRequests);

                    return;
                }
                catch (HttpListenerException) when(retries > 0)
                {
                    // only catch the exception if there are retries left
                    port = TcpPortProvider.GetOpenPort();
                    retries--;
                }
                finally
                {
                    ListenerInfo = string.Join(", ", listeners);
                }

                // always close listener if exception is thrown,
                // whether it was caught or not
                listener.Close();
            }
        }