Example #1
0
        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);
            }
        }
Example #3
0
        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"));
        }