func (e *Exporter) scrapeMetrics(json *gabs.Container, ch chan<- prometheus.Metric) { elements, _ := json.ChildrenMap() for key, element := range elements { switch key { case "message": log.Errorf("Problem collecting metrics: %s\n", element.Data().(string)) return case "version": data := element.Data() version, ok := data.(string) if !ok { log.Errorf(fmt.Sprintf("Bad conversion! Unexpected value \"%v\" for version\n", data)) } else { gauge, _ := e.Gauges.Fetch("metrics_version", "Marathon metrics version", "version") gauge.WithLabelValues(version).Set(1) gauge.Collect(ch) } case "counters": e.scrapeCounters(element) case "gauges": e.scrapeGauges(element) case "histograms": e.scrapeHistograms(element) case "meters": e.scrapeMeters(element) case "timers": e.scrapeTimers(element) } } }
func (e *Exporter) scrapeMeter(key string, json *gabs.Container) (bool, error) { count, ok := json.Path("count").Data().(float64) if !ok { return false, errors.New(fmt.Sprintf("Bad meter! %s has no count\n", key)) } units, ok := json.Path("units").Data().(string) if !ok { return false, errors.New(fmt.Sprintf("Bad meter! %s has no units\n", key)) } name := renameMetric(key) help := fmt.Sprintf(meterHelp, key, units) counter, new := e.Counters.Fetch(name+"_count", help) counter.WithLabelValues().Set(count) gauge, _ := e.Gauges.Fetch(name, help, "rate") properties, _ := json.ChildrenMap() for key, property := range properties { if strings.Contains(key, "rate") { if value, ok := property.Data().(float64); ok { gauge.WithLabelValues(renameRate(key)).Set(value) } } } return new, nil }
// Merge guest volume/block device configuration with any volumes found in // host container. func mergeVolumeConfig(volumeconfig []volumeConfig, guest *gabs.Container) (err error) { var mounts *gabs.Container if guest.ExistsP("mount") { mounts = guest.S("mount") } else { mounts, _ = guest.ObjectP("mount") } mmap, _ := mounts.ChildrenMap() for _, mount := range mmap { var source string var path string var ok bool if source, ok = mount.Path("source").Data().(string); !ok { continue } if path, ok = mount.Path("path").Data().(string); !ok { continue } if source == "blk" && strings.HasPrefix(path, "/dev/ld") { return fmt.Errorf("Guest configuration defines " + "/dev/ld* block devices, cannot merge with " + "host volumes") } } blkIndex := 0 for _, v := range volumeconfig { mp := "/" + v.name obj, _ := guest.Object("mount", mp) obj.Set("blk", "source") obj.Set(fmt.Sprintf("/dev/ld%va", blkIndex), "path") blkIndex += 1 } return }
func (e *Exporter) scrapeTimer(key string, json *gabs.Container) (bool, error) { count, ok := json.Path("count").Data().(float64) if !ok { return false, errors.New(fmt.Sprintf("Bad timer! %s has no count\n", key)) } units, ok := json.Path("rate_units").Data().(string) if !ok { return false, errors.New(fmt.Sprintf("Bad timer! %s has no units\n", key)) } name := renameMetric(key) help := fmt.Sprintf(timerHelp, key, units) counter, new := e.Counters.Fetch(name+"_count", help) counter.WithLabelValues().Set(count) rates, _ := e.Gauges.Fetch(name+"_rate", help, "rate") percentiles, _ := e.Gauges.Fetch(name, help, "percentile") min, _ := e.Gauges.Fetch(name+"_min", help) max, _ := e.Gauges.Fetch(name+"_max", help) mean, _ := e.Gauges.Fetch(name+"_mean", help) stddev, _ := e.Gauges.Fetch(name+"_stddev", help) properties, _ := json.ChildrenMap() for key, property := range properties { switch key { case "mean_rate", "m1_rate", "m5_rate", "m15_rate": if value, ok := property.Data().(float64); ok { rates.WithLabelValues(renameRate(key)).Set(value) } case "p50", "p75", "p95", "p98", "p99", "p999": if value, ok := property.Data().(float64); ok { percentiles.WithLabelValues("0." + key[1:]).Set(value) } case "min": if value, ok := property.Data().(float64); ok { min.WithLabelValues().Set(value) } case "max": if value, ok := property.Data().(float64); ok { max.WithLabelValues().Set(value) } case "mean": if value, ok := property.Data().(float64); ok { mean.WithLabelValues().Set(value) } case "stddev": if value, ok := property.Data().(float64); ok { stddev.WithLabelValues().Set(value) } } } return new, nil }
func (e *Exporter) scrapeTimers(json *gabs.Container) { elements, _ := json.ChildrenMap() for key, element := range elements { new, err := e.scrapeTimer(key, element) if err != nil { log.Debug(err) } else if new { log.Infof("Added timer %q\n", key) } } }