private static CounterInfo BuildCounterInfo(Counter counter, DimensionSpecification queryParameters) { var counterInfo = new CounterInfo { Name = counter.Name, Type = counter.Type, StartTime = counter.StartTime.ToMillisecondTimestamp(), EndTime = counter.EndTime.ToMillisecondTimestamp(), Dimensions = counter.Dimensions.ToList(), DimensionValues = null, // null this out by default to avoid response bloat. }; // Queries for dimension values will come with a 'dimension=pattern' query parameter. // Dimension values can be further filtered with '<dimensionName>=pattern' string dimensionPattern; if (queryParameters.TryGetValue(ReservedDimensions.DimensionDimension, out dimensionPattern)) { counterInfo.DimensionValues = new Dictionary <string, ISet <string> >(); // We want to be able to filter dimension values by time (and only time) var dimensionQuery = new DimensionSpecification(); string timeValue; if (!queryParameters.TryGetValue(ReservedDimensions.StartTimeDimension, out timeValue)) { timeValue = MinimumStartTime; } dimensionQuery[ReservedDimensions.StartTimeDimension] = timeValue; if (!queryParameters.TryGetValue(ReservedDimensions.EndTimeDimension, out timeValue)) { timeValue = MaximumEndTime; } dimensionQuery[ReservedDimensions.EndTimeDimension] = timeValue; foreach (var dim in counter.Dimensions.Where(d => d.MatchGlob(dimensionPattern))) { string filterPattern; if (queryParameters.TryGetValue(dimensionPattern, out filterPattern)) { counterInfo.AddDimensionValues(dim, counter.GetDimensionValues(dim, dimensionQuery) .Where(dimensionValue => dimensionValue.MatchGlob(filterPattern))); } else { counterInfo.AddDimensionValues(dim, counter.GetDimensionValues(dim, dimensionQuery)); } } } return(counterInfo); }
/// <summary> /// Ask the counter aggregator to do all percentile computation as opposed to any metric system server. This will /// strip out the 'percentile=xxx' parameter in the request and return the filtered parameter list. If a /// percentile request was present, this will apply the percentile calculation in the final calculation of this object /// </summary> /// <param name="queryParameters">Parameters to filter</param> /// <returns>Filtered parameter set</returns> public IDictionary<string, string> ApplyPercentileCalculationAggregation(IDictionary<string, string> queryParameters) { if (queryParameters == null) { return new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase); } string percentileParameter; double percentileRequested; var dimensionSpec = new DimensionSpecification(queryParameters); if (!dimensionSpec.TryGetValue(ReservedDimensions.PercentileDimension, out percentileParameter) || !double.TryParse(percentileParameter, out percentileRequested) || percentileRequested < 0 || percentileRequested > 100) { this.shouldFilterToFinalPercentile = false; return queryParameters; } this.shouldFilterToFinalPercentile = true; this.requestedPercentile = percentileRequested; var retVal = new Dictionary<string, string>(dimensionSpec, StringComparer.OrdinalIgnoreCase); retVal.Remove(ReservedDimensions.PercentileDimension); return retVal; }
/// <summary> /// Ask the counter aggregator to do all percentile computation as opposed to any metric system server. This will /// strip out the 'percentile=xxx' parameter in the request and return the filtered parameter list. If a /// percentile request was present, this will apply the percentile calculation in the final calculation of this object /// </summary> /// <param name="queryParameters">Parameters to filter</param> /// <returns>Filtered parameter set</returns> public IDictionary <string, string> ApplyPercentileCalculationAggregation(IDictionary <string, string> queryParameters) { if (queryParameters == null) { return(new Dictionary <string, string>(StringComparer.OrdinalIgnoreCase)); } string percentileParameter; double percentileRequested; var dimensionSpec = new DimensionSpecification(queryParameters); if (!dimensionSpec.TryGetValue(ReservedDimensions.PercentileDimension, out percentileParameter) || !double.TryParse(percentileParameter, out percentileRequested) || percentileRequested < 0 || percentileRequested > 100) { this.shouldFilterToFinalPercentile = false; return(queryParameters); } this.shouldFilterToFinalPercentile = true; this.requestedPercentile = percentileRequested; var retVal = new Dictionary <string, string>(dimensionSpec, StringComparer.OrdinalIgnoreCase); retVal.Remove(ReservedDimensions.PercentileDimension); return(retVal); }
private static CounterInfo BuildCounterInfo(Counter counter, DimensionSpecification queryParameters) { var counterInfo = new CounterInfo { Name = counter.Name, Type = counter.Type, StartTime = counter.StartTime.ToMillisecondTimestamp(), EndTime = counter.EndTime.ToMillisecondTimestamp(), Dimensions = counter.Dimensions.ToList(), DimensionValues = null, // null this out by default to avoid response bloat. }; // Queries for dimension values will come with a 'dimension=pattern' query parameter. // Dimension values can be further filtered with '<dimensionName>=pattern' string dimensionPattern; if (queryParameters.TryGetValue(ReservedDimensions.DimensionDimension, out dimensionPattern)) { counterInfo.DimensionValues = new Dictionary<string, ISet<string>>(); // We want to be able to filter dimension values by time (and only time) var dimensionQuery = new DimensionSpecification(); string timeValue; if (!queryParameters.TryGetValue(ReservedDimensions.StartTimeDimension, out timeValue)) { timeValue = MinimumStartTime; } dimensionQuery[ReservedDimensions.StartTimeDimension] = timeValue; if (!queryParameters.TryGetValue(ReservedDimensions.EndTimeDimension, out timeValue)) { timeValue = MaximumEndTime; } dimensionQuery[ReservedDimensions.EndTimeDimension] = timeValue; foreach (var dim in counter.Dimensions.Where(d => d.MatchGlob(dimensionPattern))) { string filterPattern; if (queryParameters.TryGetValue(dimensionPattern, out filterPattern)) { counterInfo.AddDimensionValues(dim, counter.GetDimensionValues(dim, dimensionQuery) .Where(dimensionValue => dimensionValue.MatchGlob(filterPattern))); } else { counterInfo.AddDimensionValues(dim, counter.GetDimensionValues(dim, dimensionQuery)); } } } return counterInfo; }