示例#1
0
        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);
        }
示例#2
0
        /// <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);
        }
示例#4
0
        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;
        }