Esempio n. 1
0
        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
                }));
            }
        }