code: func (l *Linter) Lint() ([]Problem, error) {
  	// TODO(mdlayher): support for protobuf exposition format?
  	d := expfmt.NewDecoder(l.r, expfmt.FmtText)
  
  	var problems []Problem
  
  	var mf dto.MetricFamily
  	for {
  		if err := d.Decode(&mf); err != nil {
  			if err == io.EOF {
  				break
  			}
  
  			return nil, err
  		}
  
  		problems = append(problems, lint(mf)...)
  	}
  
  	// Ensure deterministic output.
  	sort.SliceStable(problems, func(i, j int) bool {
  		if problems[i].Metric < problems[j].Metric {
  			return true
  		}
  
  		return problems[i].Text < problems[j].Text
  	})
  
  	return problems, nil
  }
docs: // Lint performs a linting pass, returning a slice of Problems indicating any
  // issues found in the metrics stream.  The slice is sorted by metric name
  // and issue description.