public async Task RunTraceTestOnSelfHosted(string packageVersion)
        {
            var agentPort      = TcpPortProvider.GetOpenPort();
            var aspNetCorePort = TcpPortProvider.GetOpenPort();

            using (var agent = new MockTracerAgent(agentPort))
                using (var process = StartSample(agent.Port, arguments: null, packageVersion: packageVersion, aspNetCorePort: aspNetCorePort))
                {
                    agent.SpanFilters.Add(IsNotServerLifeCheck);

                    var wh = new EventWaitHandle(false, EventResetMode.AutoReset);

                    process.OutputDataReceived += (sender, args) =>
                    {
                        if (args.Data != null)
                        {
                            if (args.Data.Contains("Now listening on:") || args.Data.Contains("Unable to start Kestrel"))
                            {
                                wh.Set();
                            }

                            Output.WriteLine($"[webserver][stdout] {args.Data}");
                        }
                    };
                    process.BeginOutputReadLine();

                    process.ErrorDataReceived += (sender, args) =>
                    {
                        if (args.Data != null)
                        {
                            Output.WriteLine($"[webserver][stderr] {args.Data}");
                        }
                    };

                    process.BeginErrorReadLine();

                    wh.WaitOne(5000);

                    var maxMillisecondsToWait = 15_000;
                    var intervalMilliseconds  = 500;
                    var intervals             = maxMillisecondsToWait / intervalMilliseconds;
                    var serverReady           = false;

                    // wait for server to be ready to receive requests
                    while (intervals-- > 0)
                    {
                        try
                        {
                            serverReady = await SubmitRequest(aspNetCorePort, "/alive-check") == HttpStatusCode.OK;
                        }
                        catch
                        {
                            // ignore
                        }

                        if (serverReady)
                        {
                            break;
                        }

                        Thread.Sleep(intervalMilliseconds);
                    }

                    if (!serverReady)
                    {
                        throw new Exception("Couldn't verify the application is ready to receive requests.");
                    }

                    var testStart = DateTime.Now;

                    var paths = Expectations.Select(e => e.OriginalUri).ToArray();
                    await SubmitRequests(aspNetCorePort, paths);

                    var spans =
                        agent.WaitForSpans(
                            Expectations.Count,
                            operationName: TopLevelOperationName,
                            minDateTime: testStart)
                        .OrderBy(s => s.Start)
                        .ToList();

                    if (!process.HasExited)
                    {
                        process.Kill();
                    }

                    SpanTestHelpers.AssertExpectationsMet(Expectations, spans);
                }
        }
Example #2
0
        public void RunTraceTestOnSelfHosted(string packageVersion, bool addClientIp)
        {
            var agentPort      = TcpPortProvider.GetOpenPort();
            var aspNetCorePort = TcpPortProvider.GetOpenPort();

            var expectations = CreateExpectations(addClientIp);
            var envVars      = ZipkinEnvVars;

            if (addClientIp)
            {
                envVars["SIGNALFX_ADD_CLIENT_IP_TO_SERVER_SPANS"] = "1";
            }

            using (var agent = new MockZipkinCollector(agentPort))
                using (var process = StartSample(agent.Port, arguments: null, packageVersion: packageVersion, aspNetCorePort: aspNetCorePort, envVars))
                {
                    agent.SpanFilters.Add(IsNotServerLifeCheck);

                    var wh = new EventWaitHandle(false, EventResetMode.AutoReset);

                    process.OutputDataReceived += (sender, args) =>
                    {
                        if (args.Data != null)
                        {
                            if (args.Data.Contains("Now listening on:") || args.Data.Contains("Unable to start Kestrel"))
                            {
                                wh.Set();
                            }

                            Output.WriteLine($"[webserver][stdout] {args.Data}");
                        }
                    };
                    process.BeginOutputReadLine();

                    process.ErrorDataReceived += (sender, args) =>
                    {
                        if (args.Data != null)
                        {
                            Output.WriteLine($"[webserver][stderr] {args.Data}");
                        }
                    };

                    process.BeginErrorReadLine();

                    wh.WaitOne(5000);

                    var maxMillisecondsToWait = 15_000;
                    var intervalMilliseconds  = 500;
                    var intervals             = maxMillisecondsToWait / intervalMilliseconds;
                    var serverReady           = false;

                    // wait for server to be ready to receive requests
                    while (intervals-- > 0)
                    {
                        try
                        {
                            serverReady = SubmitRequest(aspNetCorePort, "/alive-check").StatusCode == HttpStatusCode.OK;
                        }
                        catch
                        {
                            // ignore
                        }

                        if (serverReady)
                        {
                            break;
                        }

                        Thread.Sleep(intervalMilliseconds);
                    }

                    if (!serverReady)
                    {
                        throw new Exception("Couldn't verify the application is ready to receive requests.");
                    }

                    var testStart = DateTime.Now;

                    var paths     = expectations.Select(e => e.OriginalUri).ToArray();
                    var responses = SubmitRequests(aspNetCorePort, paths);

                    foreach (var response in responses.Where(res => res.StatusCode == HttpStatusCode.OK))
                    {
                        Assert.True(
                            response.Headers.Contains("Server-Timing"),
                            $"No Server-Timing header attached. Headers present: {string.Join(", ", response.Headers.Select(h => $"{h.Key}={h.Value}"))}");
                        Assert.True(
                            response.Headers.Contains("Access-Control-Expose-Headers"),
                            $"No Access-Control-Expose-Headers header attached. Headers present: {string.Join(", ", response.Headers.Select(h => $"{h.Key}={h.Value}"))}");
                    }

                    var spans =
                        agent.WaitForSpans(
                            expectations.Count,
                            minDateTime: testStart)
                        .OrderBy(s => s.Start)
                        .ToList();

                    if (!process.HasExited)
                    {
                        process.Kill();
                    }

                    SpanTestHelpers.AssertExpectationsMet(expectations, spans);
                }
        }
        public void AdditionalDiagnosticListenerSpan(bool addClientIp)
        {
            var agentPort      = TcpPortProvider.GetOpenPort();
            var aspNetCorePort = TcpPortProvider.GetOpenPort();
            var envVars        = ZipkinEnvVars;

            envVars["SIGNALFX_INSTRUMENTATION_ASPNETCORE_DIAGNOSTIC_LISTENERS"] = "Unused,HotChocolate.Execution,Another.Unused";

            if (addClientIp)
            {
                envVars["SIGNALFX_ADD_CLIENT_IP_TO_SERVER_SPANS"] = "true";
            }

            using (var agent = new MockZipkinCollector(agentPort))
                using (var process = StartSample(agent.Port, arguments: null, packageVersion: string.Empty, aspNetCorePort: aspNetCorePort, envVars: envVars))
                {
                    agent.SpanFilters.Add(IsNotServerLifeCheck);

                    var wh = new EventWaitHandle(false, EventResetMode.AutoReset);

                    process.OutputDataReceived += (sender, args) =>
                    {
                        if (args.Data != null)
                        {
                            if (args.Data.Contains("Now listening on:") || args.Data.Contains("Unable to start Kestrel"))
                            {
                                wh.Set();
                            }

                            Output.WriteLine($"[webserver][stdout] {args.Data}");
                        }
                    };
                    process.BeginOutputReadLine();

                    process.ErrorDataReceived += (sender, args) =>
                    {
                        if (args.Data != null)
                        {
                            Output.WriteLine($"[webserver][stderr] {args.Data}");
                        }
                    };

                    process.BeginErrorReadLine();

                    wh.WaitOne(5000);

                    var maxMillisecondsToWait = 15_000;
                    var intervalMilliseconds  = 500;
                    var intervals             = maxMillisecondsToWait / intervalMilliseconds;
                    var serverReady           = false;

                    // wait for server to be ready to receive requests
                    while (intervals-- > 0)
                    {
                        try
                        {
                            serverReady = SubmitRequest(aspNetCorePort, "/alive-check") == HttpStatusCode.OK;
                        }
                        catch
                        {
                            // ignore
                        }

                        if (serverReady)
                        {
                            break;
                        }

                        Thread.Sleep(intervalMilliseconds);
                    }

                    if (!serverReady)
                    {
                        throw new Exception("Couldn't verify the application is ready to receive requests.");
                    }

                    var testStart = DateTime.Now;

                    var paths = Expectations.Select(e => e.OriginalUri).ToArray();
                    SubmitRequests(aspNetCorePort, paths);

                    var spans =
                        agent.WaitForSpans(
                            Expectations.Count,
                            minDateTime: testStart)
                        .OrderBy(s => s.Start)
                        .ToList();

                    if (!process.HasExited)
                    {
                        process.Kill();
                    }

                    Console.WriteLine($"Spans: {spans}");

                    var expectations = addClientIp ? ExpectationsWithClientIp : Expectations;
                    SpanTestHelpers.AssertExpectationsMet(expectations, spans);
                }
        }
Example #4
0
    public void SubmitsTraces()
    {
        SetEnvironmentVariable("OTEL_SERVICE_NAME", ServiceName);

        int agentPort      = TcpPortProvider.GetOpenPort();
        int aspNetCorePort = TcpPortProvider.GetOpenPort();

        using (var agent = new MockZipkinCollector(Output, agentPort))
            using (Process process = StartTestApplication(agent.Port, arguments: null, packageVersion: string.Empty, aspNetCorePort: aspNetCorePort))
            {
                if (process.HasExited)
                {
                    throw new InvalidOperationException($"Test application has exited with code: {process.ExitCode}");
                }

                var wh = new EventWaitHandle(false, EventResetMode.AutoReset);

                process.OutputDataReceived += (sender, args) =>
                {
                    if (args.Data != null)
                    {
                        if (args.Data.Contains("Now listening on:") || args.Data.Contains("Unable to start Kestrel"))
                        {
                            wh.Set();
                        }

                        Output.WriteLine($"[webserver][stdout] {args.Data}");
                    }
                };
                process.BeginOutputReadLine();

                process.ErrorDataReceived += (sender, args) =>
                {
                    if (args.Data != null)
                    {
                        Output.WriteLine($"[webserver][stderr] {args.Data}");
                    }
                };
                process.BeginErrorReadLine();

                wh.WaitOne(5000);

                var maxMillisecondsToWait = 15_000;
                var intervalMilliseconds  = 500;
                var intervals             = maxMillisecondsToWait / intervalMilliseconds;
                var serverReady           = false;

                // wait for server to be ready to receive requests
                while (intervals-- > 0)
                {
                    var aliveCheckRequest = new RequestInfo()
                    {
                        HttpMethod = "GET", Url = "/alive-check"
                    };
                    try
                    {
                        serverReady = SubmitRequest(aspNetCorePort, aliveCheckRequest, false) == HttpStatusCode.OK;
                    }
                    catch
                    {
                        // ignore
                    }

                    if (serverReady)
                    {
                        Output.WriteLine("The server is ready.");
                        break;
                    }

                    Thread.Sleep(intervalMilliseconds);
                }

                if (!serverReady)
                {
                    throw new Exception("Couldn't verify the application is ready to receive requests.");
                }

                var testStart = DateTime.Now;

                SubmitRequests(aspNetCorePort);
                var graphQLValidateSpans = agent.WaitForSpans(_expectedGraphQLValidateSpanCount, operationName: _graphQLValidateOperationName, returnAllOperations: false)
                                           .GroupBy(s => s.SpanId)
                                           .Select(grp => grp.First())
                                           .OrderBy(s => s.Start);
                var graphQLExecuteSpans = agent.WaitForSpans(_expectedGraphQLExecuteSpanCount, operationName: _graphQLExecuteOperationName, returnAllOperations: false)
                                          .GroupBy(s => s.SpanId)
                                          .Select(grp => grp.First())
                                          .OrderBy(s => s.Start);

                if (!process.HasExited)
                {
                    process.Kill();
                }

                var spans = graphQLValidateSpans.Concat(graphQLExecuteSpans).ToList();
                SpanTestHelpers.AssertExpectationsMet(_expectations, spans);
            }
    }