private async Task <TraceResponse> StartTraceAsync(string host, StartTraceRequest request) { var url = $"http://{host}:{Constants.DEFAULT_SERVER_PORT_HTTP}/start_trace"; _logger.LogInformation("Calling start_trace on {serviceName}", host); var jsonContent = JsonSerializer.Serialize(request); var resp = await _client.PostAsync(url, new StringContent(jsonContent, Encoding.UTF8, "application/json")); if (!resp.IsSuccessStatusCode) { _logger.LogError("Received response with status code {statusCode}", resp.StatusCode); return(new TraceResponse(await resp.Content.ReadAsStringAsync())); } var response = await JsonSerializer.DeserializeAsync <TraceResponse>(await resp.Content.ReadAsStreamAsync()); _logger.LogInformation("Received response {response}", response); return(response); }
public async Task <ActionResult <TraceResponse> > StartTrace(StartTraceRequest startRequest) { using (var scope = _tracer .BuildSpan("start_trace") .IgnoreActiveSpan() .StartActive()) { _logger.LogInformation("http:start_trace request: {startRequest}", startRequest); var baggage = startRequest.Baggage; var span = scope.Span; span.SetBaggageItem(Constants.BAGGAGE_KEY, baggage); if (startRequest.Sampled) { Tags.SamplingPriority.Set(span, 1); } var response = await _behavior.PrepareResponseAsync(startRequest.Downstream); _logger.LogInformation("http:start_trace response: {response}", response); return(response); } }
public async Task <ActionResult> Client(string behavior, string client, string s1name, string s2name, string s2transport, string s3name, string s3transport, bool sampled) { if (behavior != "trace") { return(ResultFromCrossdock(CrossdockResult.Result.Error, $"Unknown behavior: {behavior}")); } if (client != "csharp") { return(ResultFromCrossdock(CrossdockResult.Result.Error, $"Unknown client: {client}")); } if (string.IsNullOrEmpty(s1name)) { return(ResultFromCrossdock(CrossdockResult.Result.Error, $"Value must not be null or empty: {s1name}")); } if (string.IsNullOrEmpty(s2name)) { return(ResultFromCrossdock(CrossdockResult.Result.Error, $"Value must not be null or empty: {s2name}")); } if (string.IsNullOrEmpty(s2transport)) { return(ResultFromCrossdock(CrossdockResult.Result.Error, $"Value must not be null or empty: {s2transport}")); } if (string.IsNullOrEmpty(s3name)) { return(ResultFromCrossdock(CrossdockResult.Result.Error, $"Value must not be null or empty: {s3name}")); } if (string.IsNullOrEmpty(s3transport)) { return(ResultFromCrossdock(CrossdockResult.Result.Error, $"Value must not be null or empty: {s3transport}")); } var baggage = RandomBaggage(); var level3 = new Downstream(s3name, s3name, TransportToPort(s3transport), StringToTransport(s3transport), "S3", null); var level2 = new Downstream(s2name, s2name, TransportToPort(s2transport), StringToTransport(s2transport), "S2", level3); var level1 = new StartTraceRequest("S1", sampled, baggage, level2); var response = await StartTraceAsync(s1name, level1); if (response == null || !string.IsNullOrEmpty(response.NotImplementedError)) { return(ResultFromCrossdock(CrossdockResult.Result.Error, response?.NotImplementedError)); } for (var r = response; r != null; r = r.Downstream) { if (!string.IsNullOrEmpty(r.NotImplementedError)) { _logger.LogInformation("SKIP: {reason}", r.NotImplementedError); return(ResultFromCrossdock(CrossdockResult.Result.Skip, r.NotImplementedError)); } } var traceID = response.Span.TraceId; if (string.IsNullOrEmpty(traceID)) { return(ResultFromCrossdock(CrossdockResult.Result.Error, $"Trace ID is empty in S1({s1name})")); } var result = ValidateTrace(level1.Downstream, response, s1name, 1, traceID, sampled, baggage); if (result != null) { return(ResultFromCrossdock(CrossdockResult.Result.Error, result)); } _logger.LogInformation("PASS"); return(ResultFromCrossdock(CrossdockResult.Result.Success, "trace checks out")); }