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); } }
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); } }
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); } }