Beispiel #1
0
        public void Run(string experimentName, string host, int users, int operations)
        {
            var experiment = new Experiment(experimentName, "This is a test experiment", getUnixTimeNow(), new Variation[] { new Variation("A", "Variation A", 0.5), new Variation("B", "Variation B", 0.5) });
            var client     = new Client(host);
            var random     = new Random();
            var places     = new string[] { "Amsterdam", "Berlin", "Dublin", "Vancouver" };
            var semaphore  = new Semaphore(users, users);

            try
            {
                Task.Run(async() => await client.CreateExperiment(experiment)).Wait();
            }
            catch { }
            var tasks = new Task[users];

            foreach (var ci in Enumerable.Range(0, users))
            {
                tasks[ci] = (Task.Run(async() =>
                {
                    Console.WriteLine($"Started client_{ci}");
                    ActivationResponse response;
                    do
                    {
                        response = await client.ActivateExperiment(experimentName, new UserState($"user_{ci}"));
                        if (response == null)
                        {
                            Console.WriteLine($"Error Activating Variant, user_{ci}");
                            await Task.Delay(10);
                        }
                    } while (response == null);
                    if (response.Variant == "A")
                    {
                        Interlocked.Increment(ref VariantACount);
                    }
                    var bookingProbability = response.Variant == "A" ? 0.15 : 0.22;
                    for (int i = 0; i < operations; i++)
                    {
                        var trackData = new EventTrackData(response.UserState, getUnixTimeNow());
                        trackData.nmetrics.Add("price", (random.NextDouble() * 50000 + 10000));
                        trackData.nmetrics.Add("bedrooms", random.Next(1, 4));
                        trackData.metrics.Add("location", places[random.Next(0, places.Length)]);

                        await TrackEvent(client, "view_property", ci, trackData);

                        if (random.NextDouble() < bookingProbability)
                        {
                            await TrackEvent(client, "property_booked", ci, trackData);
                            Interlocked.Increment(ref Booked);
                        }
                    }
                    Console.WriteLine($"Ended client_{ci}");
                }));
            }
            Task.WaitAll(tasks);
        }
Beispiel #2
0
        private async Task TrackEvent(Client client, string name, int ci, EventTrackData trackData)
        {
            Interlocked.Increment(ref TotalEvents);
            bool result;

            do
            {
                result = await client.TrackEvent(name, trackData);

                if (!result)
                {
                    Console.WriteLine($"Error tracking event, user_{ci}");
                    await Task.Delay(10);
                }
            } while (result == false);
        }