private static void WriteFamily(StreamWriter streamWriter, MetricFamily metricFamily)
 {
     streamWriter.WriteLine("# HELP {0} {1}", metricFamily.name, metricFamily.help);
     streamWriter.WriteLine("# TYPE {0} {1}", metricFamily.name, metricFamily.type);
     foreach (var metric in metricFamily.metric)
     {
         WriteMetric(streamWriter, metricFamily, metric);
     }
 }
        private static string WriteMetric(MetricFamily family, Metric metric)
        {
            var s          = new StringBuilder();
            var familyName = family.name;

            if (metric.gauge != null)
            {
                s.AppendLine(SimpleValue(familyName, metric.gauge.value, metric.label));
            }
            else if (metric.counter != null)
            {
                s.AppendLine(SimpleValue(familyName, metric.counter.value, metric.label));
            }
            else if (metric.summary != null)
            {
                s.AppendLine(SimpleValue(familyName, metric.summary.sample_sum, metric.label, "_sum"));
                s.AppendLine(SimpleValue(familyName, metric.summary.sample_count, metric.label, "_count"));

                foreach (var quantileValuePair in metric.summary.quantile)
                {
                    var quantile = double.IsPositiveInfinity(quantileValuePair.quantile)
                        ? "+Inf"
                        : quantileValuePair.quantile.ToString(CultureInfo.InvariantCulture);
                    s.AppendLine(
                        SimpleValue(
                            familyName,
                            quantileValuePair.value,
                            metric.label.Concat(new[] { new LabelPair {
                                                            name = "quantile", value = quantile
                                                        } })));
                }
            }
            else if (metric.histogram != null)
            {
                s.AppendLine(SimpleValue(familyName, metric.histogram.sample_sum, metric.label, "_sum"));
                s.AppendLine(SimpleValue(familyName, metric.histogram.sample_count, metric.label, "_count"));
                foreach (var bucket in metric.histogram.bucket)
                {
                    var value = double.IsPositiveInfinity(bucket.upper_bound) ? "+Inf" : bucket.upper_bound.ToString(CultureInfo.InvariantCulture);
                    s.AppendLine(
                        SimpleValue(
                            familyName,
                            bucket.cumulative_count,
                            metric.label.Concat(new[] { new LabelPair {
                                                            name = "le", value = value
                                                        } }),
                            "_bucket"));
                }
            }
            else
            {
                // not supported
            }

            return(s.ToString());
        }
        private static string WriteFamily(MetricFamily metricFamily)
        {
            var s = new StringBuilder();

            s.AppendLine(string.Format("# HELP {0} {1}", metricFamily.name, metricFamily.help));
            s.AppendLine(string.Format("# TYPE {0} {1}", metricFamily.name, metricFamily.type));
            foreach (var metric in metricFamily.metric)
            {
                s.AppendLine(WriteMetric(metricFamily, metric));
            }

            return(s.ToString());
        }
예제 #4
0
        public static IEnumerable <MetricFamily> GetPrometheusMetricsSnapshot(this MetricsDataValueSource snapshot)
        {
            var result = new List <MetricFamily>();

            foreach (var group in snapshot.Contexts)
            {
                foreach (var metricGroup in group.ApdexScores.GroupBy(
                             source => source.IsMultidimensional ? source.MultidimensionalName : source.Name))
                {
                    var promMetricFamily = new MetricFamily
                    {
                        name = FormatName($"{group.Context}_{metricGroup.Key}"),
                        type = MetricType.GAUGE
                    };
                    foreach (var metric in metricGroup)
                    {
                        promMetricFamily.metric.AddRange(metric.ToPrometheusMetrics());
                    }

                    result.Add(promMetricFamily);
                }

                foreach (var metricGroup in group.Gauges.GroupBy(
                             source => source.IsMultidimensional ? source.MultidimensionalName : source.Name))
                {
                    var promMetricFamily = new MetricFamily
                    {
                        name = FormatName($"{group.Context}_{metricGroup.Key}"),
                        type = MetricType.GAUGE
                    };
                    foreach (var metric in metricGroup)
                    {
                        promMetricFamily.metric.AddRange(metric.ToPrometheusMetrics());
                    }

                    result.Add(promMetricFamily);
                }

                foreach (var metricGroup in group.Counters.GroupBy(
                             source => source.IsMultidimensional ? source.MultidimensionalName : source.Name))
                {
                    var promMetricFamily = new MetricFamily
                    {
                        name = FormatName($"{group.Context}_{metricGroup.Key}"),
                        type = MetricType.GAUGE
                    };

                    foreach (var metric in metricGroup)
                    {
                        promMetricFamily.metric.AddRange(metric.ToPrometheusMetrics());
                    }

                    result.Add(promMetricFamily);
                }

                foreach (var metricGroup in group.Meters.GroupBy(
                             source => source.IsMultidimensional ? source.MultidimensionalName : source.Name))
                {
                    var promMetricFamily = new MetricFamily
                    {
                        name = FormatName($"{group.Context}_{metricGroup.Key}_total"),
                        type = MetricType.COUNTER
                    };

                    foreach (var metric in metricGroup)
                    {
                        promMetricFamily.metric.AddRange(metric.ToPrometheusMetrics());
                    }

                    result.Add(promMetricFamily);
                }

                foreach (var metricGroup in group.Histograms.GroupBy(
                             source => source.IsMultidimensional ? source.MultidimensionalName : source.Name))
                {
                    var promMetricFamily = new MetricFamily
                    {
                        name = FormatName($"{group.Context}_{metricGroup.Key}"),
                        type = MetricType.SUMMARY,
                    };

                    foreach (var timer in metricGroup)
                    {
                        promMetricFamily.metric.AddRange(timer.ToPrometheusMetrics());
                    }

                    result.Add(promMetricFamily);
                }

                foreach (var metricGroup in group.Timers.GroupBy(
                             source => source.IsMultidimensional ? source.MultidimensionalName : source.Name))
                {
                    var promMetricFamily = new MetricFamily
                    {
                        name = FormatName($"{group.Context}_{metricGroup.Key}"),
                        type = MetricType.SUMMARY,
                    };

                    foreach (var timer in metricGroup)
                    {
                        promMetricFamily.metric.AddRange(timer.ToPrometheusMetrics());
                    }

                    result.Add(promMetricFamily);
                }
            }

            return(result);
        }