public static void DoTheBounce() { Environment.SetEnvironmentVariable("GRPC_TRACE", "api"); Environment.SetEnvironmentVariable("GRPC_VERBOSITY", "debug"); Grpc.Core.GrpcEnvironment.SetLogger(new Grpc.Core.Logging.ConsoleLogger()); var targetA = EnvVarOrDefault("TARGET_A", "localhost:5001"); var targetB = EnvVarOrDefault("TARGET_B", "localhost:5002"); Console.WriteLine($"A: {targetA} B: {targetB}"); var nextTargetA = false; var chanceToDoIt = 0.70; var channel = new Channel(targetA, ChannelCredentials.Insecure); var client = new Bouncer.BouncerClient(channel); try { var reply = client.BounceIt(new BounceRequest { TargetA = targetA, TargetB = targetB, DoTargetA = nextTargetA, ChanceOfBounce = chanceToDoIt, TabLevel = "" }); Console.WriteLine($"Reply: {reply.Msg}"); } catch (RpcException e) { Console.WriteLine("Woops, looks like we got an exception. " + "Just make sure to run this a few times to get " + "some data for Jaeger."); Console.WriteLine("*** RpcException Start ***"); Console.WriteLine(e); Console.WriteLine("*** RpcException End ***"); } }
BounceIt(BounceRequest request, ServerCallContext context) { var T = request.TabLevel; Console.WriteLine(T + "BounceIt() got a request."); PrintRequestHeaders(context, T); var builder = _tracer.BuildSpan("grpc://BounceIt"); ISpanContext parentSpanCtx = ExtractSpanContextOrDefault(_tracer, context); if (parentSpanCtx != null) { builder.AsChildOf(parentSpanCtx); } using (var scope = builder.StartActive(true)) { var span = scope.Span; var chanceToDoIt = request.ChanceOfBounce; var randomizedChance = new Random().NextDouble(); var exceptionRisk = new Random().NextDouble() - 0.2; var returnMessage = "Hello!"; var sleepyTimeMs = (int)(randomizedChance * 1000); if (chanceToDoIt >= randomizedChance) { span.Log(DateTime.Now, $"Doing another bounce: {chanceToDoIt} >= {randomizedChance}"); var targetA = request.TargetA; var targetB = request.TargetB; var doTargetA = request.DoTargetA; var nextTargetA = !doTargetA; var target = doTargetA ? targetA : targetB; var channel = new Channel(target, ChannelCredentials.Insecure); var client = new Bouncer.BouncerClient(channel); var policy = Policy .Handle <RpcException>() .WaitAndRetry(new[] { TimeSpan.FromSeconds(1), TimeSpan.FromSeconds(5), TimeSpan.FromSeconds(10), }, (exception, timespan, attempt, context) => { Console.WriteLine(T + $">> Failed attempt: {attempt}"); span.SetTag("FailedAttempts", $"{attempt}"); span.Log($"Attempt #{attempt} failed. Waiting for {timespan} until trying again."); }); policy.Execute(() => { var bounceRequest = new BounceRequest { TargetA = targetA, TargetB = targetB, DoTargetA = nextTargetA, ChanceOfBounce = chanceToDoIt, TabLevel = request.TabLevel + " " }; var metadata = CreateInjectMetadataFromSpan(_tracer, span); Console.WriteLine(T + "Doing another bounce!"); var reply = client.BounceIt(bounceRequest, metadata); returnMessage += " " + reply.Msg; }); } else if (chanceToDoIt >= exceptionRisk) { Thread.Sleep(sleepyTimeMs); Console.WriteLine($"Exception thrown: {chanceToDoIt} >= {exceptionRisk}"); span.Log($"Exception thrown: {chanceToDoIt} >= {exceptionRisk}"); span.SetTag("Error", "True"); throw new Exception("Woopsie daisy! Got an exception!"); } Console.Write(T + $"Sleeping for {sleepyTimeMs}ms..."); Thread.Sleep(sleepyTimeMs); Console.WriteLine($"Woke up"); return(Task.FromResult(new BounceReply { Msg = returnMessage })); } }