예제 #1
0
        public IList <MetricValue> Read()
        {
            lock (_lock)
            {
                var res        = new List <MetricValue>();
                var removeList = new List <string>();
                foreach (var pair in _metrics)
                {
                    StatsdMetric metric = pair.Value;
                    if (metric.NumUpdates <= 0 &&
                        ((_delCounter && metric.Type == StatsdMetric.StatsdType.StatsdCounter) ||
                         (_delTimer && metric.Type == StatsdMetric.StatsdType.StatsdTimer) ||
                         (_delGauge && metric.Type == StatsdMetric.StatsdType.StatsdGauge) ||
                         (_delSet && metric.Type == StatsdMetric.StatsdType.StatsdSet)))
                    {
                        removeList.Add(pair.Key);
                        continue;
                    }
                    var metricVal = new MetricValue
                    {
                        HostName           = _hostName,
                        PluginName         = "statsd",
                        PluginInstanceName = "",
                        TypeInstanceName   = metric.Name,
                        Values             = new[] { metric.GetMetric() }
                    };
                    switch (metric.Type)
                    {
                    case StatsdMetric.StatsdType.StatsdGauge:
                        metricVal.TypeName = "gauge";
                        break;

                    case StatsdMetric.StatsdType.StatsdTimer:
                        metricVal.TypeName          = "latency";
                        metricVal.TypeInstanceName += "-average";
                        break;

                    case StatsdMetric.StatsdType.StatsdSet:
                        metricVal.TypeName = "objects";
                        break;

                    default:
                        metricVal.TypeName = "derive";
                        break;
                    }
                    TimeSpan t     = DateTime.UtcNow - new DateTime(1970, 1, 1);
                    double   epoch = t.TotalMilliseconds / 1000;
                    metricVal.Epoch = Math.Round(epoch, 3);

                    res.Add(metricVal);

                    if (metric.Type == StatsdMetric.StatsdType.StatsdTimer)
                    {
                        if (_timerLower)
                        {
                            MetricValue lowerValue = metricVal.DeepCopy();
                            lowerValue.TypeInstanceName = metric.Name + "-lower";
                            lowerValue.Values[0]        = metric.Lat.Min;
                            res.Add(lowerValue);
                        }
                        if (_timerUpper)
                        {
                            MetricValue upperValue = metricVal.DeepCopy();
                            upperValue.TypeInstanceName = metric.Name + "-upper";
                            upperValue.Values[0]        = metric.Lat.Max;
                            res.Add(upperValue);
                        }

                        if (_timerSum)
                        {
                            MetricValue upperSum = metricVal.DeepCopy();
                            upperSum.TypeInstanceName = metric.Name + "-Sum";
                            upperSum.Values[0]        = metric.Lat.Sum;
                            res.Add(upperSum);
                        }
                        if (_timerCount)
                        {
                            MetricValue upperCount = metricVal.DeepCopy();
                            upperCount.TypeInstanceName = metric.Name + "-count";
                            upperCount.Values[0]        = metric.Lat.Num;
                            res.Add(upperCount);
                        }
                        Histogram histogram = metric.Lat.Histogram;
                        if (_percentiles != null && _percentiles.Length > 0 && histogram != null)
                        {
                            foreach (float percentile in _percentiles)
                            {
                                double val = histogram.GetPercentile(percentile);

                                MetricValue mv = metricVal.DeepCopy();
                                mv.TypeInstanceName = metric.Name + "-percentile-" + percentile;
                                mv.Values[0]        = val;
                                res.Add(mv);
                            }
                        }
                    }
                    metric.Reset();
                }
                Logger.Debug("Removing entries that were not updated:{0}", removeList.Count);
                foreach (string key in removeList)
                {
                    _metrics.Remove(key);
                }
                return(res);
            }
        }