/// <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); } }
internal static HttpResponseMessage CreateErrorResponse() { var response = new BatchQueryResponse(); response.Responses.Add(new CounterQueryResponse { HttpResponseCode = 404 }); return(CreateResponse(response)); }
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); }
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 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); }
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)); }