代码拉取完成,页面将自动刷新
package xprom
import (
"fmt"
dto "github.com/prometheus/client_model/go"
)
// source https://github.com/prometheus/prom2json/blob/master/prom2json.go
// Family mirrors the MetricFamily proto message.
type Family struct {
Name string `json:"name"`
Help string `json:"help"`
Type string `json:"type"`
Metrics []interface{} `json:"metrics,omitempty"` // Either metric or summary.
}
// Metric is for all "single value" metrics, i.e. Counter, Gauge, and Untyped.
type Metric struct {
Labels map[string]string `json:"labels,omitempty"`
TimestampMs string `json:"timestamp_ms,omitempty"`
Value string `json:"value"`
}
// Summary mirrors the Summary proto message.
type Summary struct {
Labels map[string]string `json:"labels,omitempty"`
TimestampMs string `json:"timestamp_ms,omitempty"`
Quantiles map[string]string `json:"quantiles,omitempty"`
Count string `json:"count"`
Sum string `json:"sum"`
}
// Histogram mirrors the Histogram proto message.
type Histogram struct {
Labels map[string]string `json:"labels,omitempty"`
TimestampMs string `json:"timestamp_ms,omitempty"`
Buckets map[string]string `json:"buckets,omitempty"`
Count string `json:"count"`
Sum string `json:"sum"`
}
// NewFamily consumes a MetricFamily and transforms it to the local Family type.
func NewFamily(dtoMF *dto.MetricFamily) *Family {
mf := &Family{
Name: dtoMF.GetName(),
Help: dtoMF.GetHelp(),
Type: dtoMF.GetType().String(),
Metrics: make([]interface{}, len(dtoMF.Metric)),
}
for i, m := range dtoMF.Metric {
switch dtoMF.GetType() {
case dto.MetricType_SUMMARY:
mf.Metrics[i] = Summary{
Labels: makeLabels(m),
TimestampMs: makeTimestamp(m),
Quantiles: makeQuantiles(m),
Count: fmt.Sprint(m.GetSummary().GetSampleCount()),
Sum: fmt.Sprint(m.GetSummary().GetSampleSum()),
}
case dto.MetricType_HISTOGRAM:
mf.Metrics[i] = Histogram{
Labels: makeLabels(m),
TimestampMs: makeTimestamp(m),
Buckets: makeBuckets(m),
Count: fmt.Sprint(m.GetHistogram().GetSampleCount()),
Sum: fmt.Sprint(m.GetHistogram().GetSampleSum()),
}
default:
mf.Metrics[i] = Metric{
Labels: makeLabels(m),
TimestampMs: makeTimestamp(m),
Value: fmt.Sprint(getValue(m)),
}
}
}
return mf
}
func MetricTypePtr(mt dto.MetricType) *dto.MetricType {
return &mt
}
func getValue(m *dto.Metric) float64 {
switch {
case m.Gauge != nil:
return m.GetGauge().GetValue()
case m.Counter != nil:
return m.GetCounter().GetValue()
case m.Untyped != nil:
return m.GetUntyped().GetValue()
default:
return 0.
}
}
func makeLabels(m *dto.Metric) map[string]string {
result := map[string]string{}
for _, lp := range m.Label {
result[lp.GetName()] = lp.GetValue()
}
return result
}
func makeTimestamp(m *dto.Metric) string {
if m.TimestampMs == nil {
return ""
}
return fmt.Sprint(m.GetTimestampMs())
}
func makeQuantiles(m *dto.Metric) map[string]string {
result := map[string]string{}
for _, q := range m.GetSummary().Quantile {
result[fmt.Sprint(q.GetQuantile())] = fmt.Sprint(q.GetValue())
}
return result
}
func makeBuckets(m *dto.Metric) map[string]string {
result := map[string]string{}
for _, b := range m.GetHistogram().Bucket {
result[fmt.Sprint(b.GetUpperBound())] = fmt.Sprint(b.GetCumulativeCount())
}
return result
}
func (f *Family) AddLabel(key, val string) {
for i, item := range f.Metrics {
switch m := item.(type) {
case Metric:
m.Labels[key] = val
f.Metrics[i] = m
}
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。