/// <summary>
        /// Add a response from a single machine
        /// </summary>
        public void AddResponse(BatchQueryResponse response)
        {
            if (response == null)
            {
                return;
            }

            if (response.RequestDetails != null)
            {
                lock (this.responseDetails)
                {
                    this.responseDetails.AddRange(response.RequestDetails);
                }
            }

            if (response.Responses == null)
            {
                return;
            }

            foreach (var counterResponse in response.Responses)
            {
                // will not lock here. No need since the dict is readonly at this point
                Tuple<bool, CounterAggregator> data;
                if (!this.requestMapping.TryGetValue(counterResponse.UserContext, out data))
                {
                    Events.Write.UnknownCounterResponse(counterResponse.UserContext);
                    continue;
                }

                data.Item2.AddMachineResponse(counterResponse);
            }
        }
Beispiel #2
0
        internal static HttpResponseMessage CreateErrorResponse()
        {
            var response = new BatchQueryResponse();

            response.Responses.Add(new CounterQueryResponse {
                HttpResponseCode = 404
            });

            return(CreateResponse(response));
        }
Beispiel #3
0
        public void AggregatorAggregatesOverlapCorrectly()
        {
            var aCounter = new BatchCounterQuery {
                CounterName = "a", UserContext = "a"
            };

            var batchRequest = new BatchQueryRequest();

            batchRequest.Queries.Add(aCounter);

            var agg = new BatchResponseAggregator(batchRequest);

            var oneResponse = new BatchQueryResponse
            {
                Responses      = { this.CreateHitCountResponse("a", 100) },
                RequestDetails =
                {
                    new RequestDetails
                    {
                        Server = new ServerInfo
                        {
                            Hostname = "something",
                            Port     = 42
                        },
                        HttpResponseCode = 200
                    }
                }
            };
            var twoResponse = new BatchQueryResponse
            {
                Responses      = { this.CreateHitCountResponse("a", 200) },
                RequestDetails =
                {
                    new RequestDetails
                    {
                        Server = new ServerInfo
                        {
                            Hostname = "somewhere",
                            Port     = 42
                        },
                        HttpResponseCode = 200
                    }
                }
            };

            agg.AddResponse(oneResponse);
            agg.AddResponse(twoResponse);

            var finalResponse = agg.GetResponse();

            Assert.IsNotNull(finalResponse);
            Assert.AreEqual(2, finalResponse.RequestDetails.Count);
            Assert.AreEqual(1, finalResponse.Responses.Count);
            Assert.AreEqual(300, finalResponse.Responses[0].Samples[0].HitCount);
        }
Beispiel #4
0
        private static void VerifyHitCounter(BatchQueryResponse responseData, string key, int expectedValue)
        {
            var queryResponse =
                (responseData.Responses as List <CounterQueryResponse>).Find(res => res.UserContext.Equals(key));

            Assert.IsNotNull(queryResponse);

            if (expectedValue > 0)
            {
                Assert.IsTrue(queryResponse.HttpResponseCode == 200);
                Assert.IsNotNull(queryResponse);
                Assert.AreEqual(1, queryResponse.Samples.Count);
                var hitCountSample = queryResponse.Samples[0];
                Assert.IsTrue(expectedValue == (int)hitCountSample.HitCount);
            }
            else
            {
                Assert.IsFalse(queryResponse.HttpResponseCode == 200);
            }
        }
Beispiel #5
0
        public void AggregatorIgnoresUnknownCounterInResponse()
        {
            var aCounter = new BatchCounterQuery {
                CounterName = "a", UserContext = "a"
            };

            var batchRequest = new BatchQueryRequest();

            batchRequest.Queries.Add(aCounter);

            var agg = new BatchResponseAggregator(batchRequest);

            var oneResponse = new BatchQueryResponse
            {
                Responses      = { this.CreateHitCountResponse("i am a key tree", 100) },
                RequestDetails =
                {
                    new RequestDetails
                    {
                        Server = new ServerInfo
                        {
                            Hostname = "something",
                        },
                        HttpResponseCode = 200
                    }
                }
            };

            agg.AddResponse(oneResponse);

            var finalResponse = agg.GetResponse();

            Assert.IsNotNull(finalResponse);
            Assert.AreEqual(1, finalResponse.Responses.Count);
            Assert.AreEqual(0, finalResponse.Responses[0].Samples.Count);
        }
        private static void VerifyHitCounter(BatchQueryResponse responseData, string key, int expectedValue)
        {
            var queryResponse =
                (responseData.Responses as List<CounterQueryResponse>).Find(res => res.UserContext.Equals(key));
            Assert.IsNotNull(queryResponse);

            if (expectedValue > 0)
            {
                Assert.IsTrue(queryResponse.HttpResponseCode == 200);
                Assert.IsNotNull(queryResponse);
                Assert.AreEqual(1, queryResponse.Samples.Count);
                var hitCountSample = queryResponse.Samples[0];
                Assert.IsTrue(expectedValue == (int)hitCountSample.HitCount);
            }
            else
            {
                Assert.IsFalse(queryResponse.HttpResponseCode == 200);
            }
        }
        public async void BatchQueryAggregatesFanoutCorrectly()
        {
            const string tacoTruck = "/Tacos";
            const string competingBurritoTruck = "/Burritos";

            var dimensionSet = new DimensionSet(new HashSet<Dimension>());
            var counter = await this.dataManager.CreateHitCounter(tacoTruck, dimensionSet);

            // locally store dim1
            counter.Increment(100, new DimensionSpecification());
            this.dataManager.Flush();

            var data = new BatchQueryRequest();
            data.Queries.Add(new BatchCounterQuery { CounterName = tacoTruck, UserContext = tacoTruck});
            data.Queries.Add(new BatchCounterQuery
                             {
                                 CounterName = competingBurritoTruck,
                                 UserContext = competingBurritoTruck
                             });
            data.Sources.Add(new ServerInfo {Hostname = "a", Port = 42});
            data.Sources.Add(new ServerInfo {Hostname = "b", Port = 42});

            var sampleStart = DateTime.Now;
            var sampleEnd = sampleStart.AddHours(1);

            // remotely return 100 for dim2 only
            DistributedQueryClient.RequesterFactory = new MockHttpRequesterFactory(message =>
                    {
                        var batchResponse = new BatchQueryResponse();
                        batchResponse.RequestDetails.Add(new RequestDetails
                                                         {
                                                             Server =
                                                                 new ServerInfo
                                                                 {
                                                                     Hostname = "bob",
                                                                     Port = 42
                                                                 },
                                                             HttpResponseCode = 200
                                                         });
                        var counterResponse = new CounterQueryResponse
                                              {
                                                  HttpResponseCode = 200, 
                                                  UserContext = competingBurritoTruck,
                                                  Samples = new List<DataSample> {
                                                    new DataSample { HitCount = 100, Dimensions = new Dictionary<string, string>(), SampleType = DataSampleType.HitCount, StartTime = sampleStart.ToMillisecondTimestamp(), EndTime = sampleEnd.ToMillisecondTimestamp() }
                                                    }
                                               };
                        batchResponse.Responses.Add(counterResponse);
                        return MockDataFactory.CreateResponse(batchResponse);
                    });
            
            var response = await
                           this.httpClient.PostAsync(TestUtils.GetUri(this.server, RestCommands.BatchQueryCommand,
                                                                      string.Empty),
                                                     GetRequestPayload(data));
            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
            var responseData = await MockDataFactory.ReadResponseData<BatchQueryResponse>(response);
            Assert.IsNotNull(responseData);
            Assert.AreEqual(3, responseData.RequestDetails.Count);
            Assert.IsTrue(responseData.RequestDetails.All(x => x.HttpResponseCode == 200));
            Assert.AreEqual(2, responseData.Responses.Count);
            Assert.AreEqual(1, responseData.Responses.Count(x => x.UserContext.Equals(tacoTruck) && x.Samples[0].HitCount == 100));
            Assert.AreEqual(1, responseData.Responses.Count(x => x.UserContext.Equals(competingBurritoTruck) && x.Samples[0].HitCount == 200));
        }
        public void AggregatorAggregatesCorrectlyWhenNoOverlaps()
        {
            var aCounter = new BatchCounterQuery { CounterName = "a", UserContext = "a" };
            var bCounter = new BatchCounterQuery { CounterName = "b", UserContext = "b" };

            var batchRequest = new BatchQueryRequest();
            batchRequest.Queries.Add(aCounter);
            batchRequest.Queries.Add(bCounter);

            var agg = new BatchResponseAggregator(batchRequest);

            var aOnlyResponse = new BatchQueryResponse
                                {
                                    Responses = {this.CreateHitCountResponse("a", 100)},
                                    RequestDetails =
                                    {
                                        new RequestDetails
                                        {
                                            Server = new ServerInfo
                                            {
                                                Hostname = "something",
                                                Port = 42
                                            },
                                            HttpResponseCode = 200
                                        }
                                    }
                                };
            var bOnlyResponse = new BatchQueryResponse
                                {
                                    Responses = {this.CreateHitCountResponse("b", 200)},
                                    RequestDetails =
                                    {
                                        new RequestDetails
                                        {
                                            Server = new ServerInfo
                                            {
                                                Hostname = "somewhere",
                                                Port = 42
                                            },
                                            HttpResponseCode = 200
                                        }
                                    }
                                };

            agg.AddResponse(aOnlyResponse);
            agg.AddResponse(bOnlyResponse);

            var finalResponse = agg.GetResponse();
            Assert.IsNotNull(finalResponse);
            Assert.AreEqual(2, finalResponse.RequestDetails.Count);
            Assert.AreEqual(2, finalResponse.Responses.Count);
            Assert.AreEqual(1, finalResponse.Responses.Count(x => x.UserContext.Equals("a") && x.Samples[0].HitCount == 100));
            Assert.AreEqual(1, finalResponse.Responses.Count(x => x.UserContext.Equals("b") && x.Samples[0].HitCount == 200));
        }
        public void AggregatorIgnoresUnknownCounterInResponse()
        {
            var aCounter = new BatchCounterQuery { CounterName = "a", UserContext = "a" };

            var batchRequest = new BatchQueryRequest();
            batchRequest.Queries.Add(aCounter);

            var agg = new BatchResponseAggregator(batchRequest);

            var oneResponse = new BatchQueryResponse
                              {
                                  Responses = {this.CreateHitCountResponse("i am a key tree", 100)},
                                  RequestDetails =
                                  {
                                      new RequestDetails
                                      {
                                          Server = new ServerInfo
                                                   {
                                                       Hostname = "something",
                                                   },
                                          HttpResponseCode = 200
                                      }
                                  }
                              };

            agg.AddResponse(oneResponse);

            var finalResponse = agg.GetResponse();
            Assert.IsNotNull(finalResponse);
            Assert.AreEqual(1, finalResponse.Responses.Count);
            Assert.AreEqual(0, finalResponse.Responses[0].Samples.Count);
        }
        public void AggregatorAggregatesOverlapCorrectly()
        {
            var aCounter = new BatchCounterQuery { CounterName = "a", UserContext = "a" };

            var batchRequest = new BatchQueryRequest();
            batchRequest.Queries.Add(aCounter);

            var agg = new BatchResponseAggregator(batchRequest);

            var oneResponse = new BatchQueryResponse
                              {
                                  Responses = {this.CreateHitCountResponse("a", 100)},
                                  RequestDetails =
                                  {
                                      new RequestDetails
                                      {
                                          Server = new ServerInfo
                                          {
                                              Hostname = "something",
                                              Port = 42
                                          },
                                          HttpResponseCode = 200
                                      }
                                  }
                              };
            var twoResponse = new BatchQueryResponse
                              {
                                  Responses = {this.CreateHitCountResponse("a", 200)},
                                  RequestDetails =
                                  {
                                      new RequestDetails
                                      {
                                          Server = new ServerInfo
                                          {
                                              Hostname = "somewhere",
                                              Port = 42
                                          },
                                          HttpResponseCode = 200
                                      }
                                  }
                              };

            agg.AddResponse(oneResponse);
            agg.AddResponse(twoResponse);

            var finalResponse = agg.GetResponse();
            Assert.IsNotNull(finalResponse);
            Assert.AreEqual(2, finalResponse.RequestDetails.Count);
            Assert.AreEqual(1, finalResponse.Responses.Count);
            Assert.AreEqual(300, finalResponse.Responses[0].Samples[0].HitCount);
        }
Beispiel #11
0
        public async void BatchQueryAggregatesFanoutCorrectly()
        {
            const string tacoTruck             = "/Tacos";
            const string competingBurritoTruck = "/Burritos";

            var dimensionSet = new DimensionSet(new HashSet <Dimension>());
            var counter      = await this.dataManager.CreateHitCounter(tacoTruck, dimensionSet);

            // locally store dim1
            counter.Increment(100, new DimensionSpecification());
            this.dataManager.Flush();

            var data = new BatchQueryRequest();

            data.Queries.Add(new BatchCounterQuery {
                CounterName = tacoTruck, UserContext = tacoTruck
            });
            data.Queries.Add(new BatchCounterQuery
            {
                CounterName = competingBurritoTruck,
                UserContext = competingBurritoTruck
            });
            data.Sources.Add(new ServerInfo {
                Hostname = "a", Port = 42
            });
            data.Sources.Add(new ServerInfo {
                Hostname = "b", Port = 42
            });

            var sampleStart = DateTime.Now;
            var sampleEnd   = sampleStart.AddHours(1);

            // remotely return 100 for dim2 only
            DistributedQueryClient.RequesterFactory = new MockHttpRequesterFactory(message =>
            {
                var batchResponse = new BatchQueryResponse();
                batchResponse.RequestDetails.Add(new RequestDetails
                {
                    Server =
                        new ServerInfo
                    {
                        Hostname = "bob",
                        Port     = 42
                    },
                    HttpResponseCode = 200
                });
                var counterResponse = new CounterQueryResponse
                {
                    HttpResponseCode = 200,
                    UserContext      = competingBurritoTruck,
                    Samples          = new List <DataSample> {
                        new DataSample {
                            HitCount = 100, Dimensions = new Dictionary <string, string>(), SampleType = DataSampleType.HitCount, StartTime = sampleStart.ToMillisecondTimestamp(), EndTime = sampleEnd.ToMillisecondTimestamp()
                        }
                    }
                };
                batchResponse.Responses.Add(counterResponse);
                return(MockDataFactory.CreateResponse(batchResponse));
            });

            var response = await
                           this.httpClient.PostAsync(TestUtils.GetUri(this.server, RestCommands.BatchQueryCommand,
                                                                      string.Empty),
                                                     GetRequestPayload(data));

            Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
            var responseData = await MockDataFactory.ReadResponseData <BatchQueryResponse>(response);

            Assert.IsNotNull(responseData);
            Assert.AreEqual(3, responseData.RequestDetails.Count);
            Assert.IsTrue(responseData.RequestDetails.All(x => x.HttpResponseCode == 200));
            Assert.AreEqual(2, responseData.Responses.Count);
            Assert.AreEqual(1, responseData.Responses.Count(x => x.UserContext.Equals(tacoTruck) && x.Samples[0].HitCount == 100));
            Assert.AreEqual(1, responseData.Responses.Count(x => x.UserContext.Equals(competingBurritoTruck) && x.Samples[0].HitCount == 200));
        }