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); } }