()
| 103 | } |
| 104 | |
| 105 | func main() { |
| 106 | metrics, err := scanAllDirs() |
| 107 | if err != nil { |
| 108 | log.Fatalf("Failed to scan directories: %v", err) |
| 109 | } |
| 110 | |
| 111 | // Duplicates are not expected since Prometheus enforces unique metric names at registration. |
| 112 | uniqueMetrics := make(map[string]Metric) |
| 113 | for _, m := range metrics { |
| 114 | uniqueMetrics[m.Name] = m |
| 115 | } |
| 116 | metrics = make([]Metric, 0, len(uniqueMetrics)) |
| 117 | for _, m := range uniqueMetrics { |
| 118 | metrics = append(metrics, m) |
| 119 | } |
| 120 | |
| 121 | // Sort metrics by name for consistent output across runs. |
| 122 | sort.Slice(metrics, func(i, j int) bool { |
| 123 | return metrics[i].Name < metrics[j].Name |
| 124 | }) |
| 125 | |
| 126 | writeMetrics(metrics, os.Stdout) |
| 127 | |
| 128 | logf("Successfully parsed %d metrics", len(metrics)) |
| 129 | } |
| 130 | |
| 131 | // scanAllDirs scans all configured directories for metric definitions. |
| 132 | func scanAllDirs() ([]Metric, error) { |
nothing calls this directly
no test coverage detected