|
1 | 1 | package collector |
2 | 2 |
|
3 | 3 | import ( |
4 | | - "io" |
5 | | - "os/exec" |
6 | 4 | "regexp" |
7 | 5 | "sort" |
8 | 6 | "strconv" |
@@ -135,69 +133,41 @@ func ParseNodesMetrics(input []byte) *NodesMetrics { |
135 | 133 |
|
136 | 134 | // Execute the sinfo command and return its output |
137 | 135 | func NodesData(logger log.Logger, part string) ([]byte, error) { |
138 | | - cmd := exec.Command("sinfo", "-h", "-o %D|%T|%b", "-p", part, "| sort", "| uniq") |
139 | | - stdout, err := cmd.StdoutPipe() |
140 | | - if err != nil { |
141 | | - level.Error(logger).Log("msg", "Failed to create stdout pipe", "err", err) |
142 | | - return nil, err |
143 | | - } |
144 | | - if err := cmd.Start(); err != nil { |
145 | | - level.Error(logger).Log("msg", "Failed to start command", "err", err) |
146 | | - return nil, err |
147 | | - } |
148 | | - out, _ := io.ReadAll(stdout) |
149 | | - if err := cmd.Wait(); err != nil { |
150 | | - level.Error(logger).Log("msg", "Failed to wait for command", "err", err) |
151 | | - return nil, err |
152 | | - } |
153 | | - return out, nil |
| 136 | + return Execute(logger, "sinfo", []string{"-h", "-o", "%D|%T|%b", "-p", part}) |
154 | 137 | } |
155 | 138 |
|
156 | 139 | func SlurmGetTotal(logger log.Logger) (float64, error) { |
157 | | - cmd := exec.Command("bash", "-c", "scontrol show nodes -o | grep -c NodeName=[a-z]*[0-9]*") |
158 | | - stdout, err := cmd.StdoutPipe() |
159 | | - if err != nil { |
160 | | - level.Error(logger).Log("msg", "Failed to create stdout pipe", "err", err) |
161 | | - return 0, err |
162 | | - } |
163 | | - stderr, err := cmd.StderrPipe() |
| 140 | + out, err := Execute(logger, "scontrol", []string{"show", "nodes", "-o"}) |
164 | 141 | if err != nil { |
165 | | - level.Error(logger).Log("msg", "Failed to create stderr pipe", "err", err) |
166 | 142 | return 0, err |
167 | 143 | } |
168 | | - if err := cmd.Start(); err != nil { |
169 | | - level.Error(logger).Log("msg", "Failed to start command", "err", err) |
170 | | - return 0, err |
171 | | - } |
172 | | - out, _ := io.ReadAll(stdout) |
173 | | - err_out, _ := io.ReadAll(stderr) |
174 | | - if err := cmd.Wait(); err != nil { |
175 | | - level.Error(logger).Log("msg", "Failed to wait for command", "err", err, "stdout", string(out), "stderr", string(err_out)) |
176 | | - return 0, err |
| 144 | + // Filter out empty lines before counting |
| 145 | + lines := strings.Split(string(out), "\n") |
| 146 | + count := 0 |
| 147 | + for _, line := range lines { |
| 148 | + if strings.TrimSpace(line) != "" { |
| 149 | + count++ |
| 150 | + } |
177 | 151 | } |
178 | | - data := strings.Split(string(out), "\n") |
179 | | - total, _ := strconv.ParseFloat(data[0], 64) |
180 | | - return total, nil |
| 152 | + return float64(count), nil |
181 | 153 | } |
182 | 154 |
|
183 | 155 | func SlurmGetPartitions(logger log.Logger) ([]string, error) { |
184 | | - cmd := exec.Command("sinfo", "-h", "-o %R", "| sort", "| uniq") |
185 | | - stdout, err := cmd.StdoutPipe() |
| 156 | + out, err := Execute(logger, "sinfo", []string{"-h", "-o", "%R"}) |
186 | 157 | if err != nil { |
187 | | - level.Error(logger).Log("msg", "Failed to create stdout pipe", "err", err) |
188 | | - return nil, err |
189 | | - } |
190 | | - if err := cmd.Start(); err != nil { |
191 | | - level.Error(logger).Log("msg", "Failed to start command", "err", err) |
192 | | - return nil, err |
193 | | - } |
194 | | - out, _ := io.ReadAll(stdout) |
195 | | - if err := cmd.Wait(); err != nil { |
196 | | - level.Error(logger).Log("msg", "Failed to wait for command", "err", err) |
197 | 158 | return nil, err |
198 | 159 | } |
199 | 160 | partitions := strings.Split(string(out), "\n") |
200 | | - return partitions, nil |
| 161 | + // Trim whitespace and remove empty strings |
| 162 | + var cleanedPartitions []string |
| 163 | + for _, p := range partitions { |
| 164 | + p = strings.TrimSpace(p) |
| 165 | + if p != "" { |
| 166 | + cleanedPartitions = append(cleanedPartitions, p) |
| 167 | + } |
| 168 | + } |
| 169 | + sort.Strings(cleanedPartitions) |
| 170 | + return RemoveDuplicates(cleanedPartitions), nil |
201 | 171 | } |
202 | 172 |
|
203 | 173 | /* |
|
0 commit comments