| 
									
										
										
										
											2015-09-26 08:36:40 -07:00
										 |  |  | // Copyright 2015 The Prometheus Authors
 | 
					
						
							|  |  |  | // Licensed under the Apache License, Version 2.0 (the "License");
 | 
					
						
							|  |  |  | // you may not use this file except in compliance with the License.
 | 
					
						
							|  |  |  | // You may obtain a copy of the License at
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // http://www.apache.org/licenses/LICENSE-2.0
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Unless required by applicable law or agreed to in writing, software
 | 
					
						
							|  |  |  | // distributed under the License is distributed on an "AS IS" BASIS,
 | 
					
						
							|  |  |  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
					
						
							|  |  |  | // See the License for the specific language governing permissions and
 | 
					
						
							|  |  |  | // limitations under the License.
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-03 04:35:24 -07:00
										 |  |  | //go:build !noloadavg
 | 
					
						
							| 
									
										
										
										
											2015-06-24 05:08:43 -07:00
										 |  |  | // +build !noloadavg
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | package collector | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							| 
									
										
										
										
											2022-07-27 11:59:39 -07:00
										 |  |  | 	"os" | 
					
						
							| 
									
										
										
										
											2015-06-24 05:08:43 -07:00
										 |  |  | 	"strconv" | 
					
						
							|  |  |  | 	"strings" | 
					
						
							|  |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-19 12:31:31 -07:00
										 |  |  | // Read loadavg from /proc.
 | 
					
						
							| 
									
										
										
										
											2015-10-17 06:07:39 -07:00
										 |  |  | func getLoad() (loads []float64, err error) { | 
					
						
							| 
									
										
										
										
											2022-07-27 11:59:39 -07:00
										 |  |  | 	data, err := os.ReadFile(procFilePath("loadavg")) | 
					
						
							| 
									
										
										
										
											2015-06-24 05:08:43 -07:00
										 |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2015-10-19 12:31:31 -07:00
										 |  |  | 		return nil, err | 
					
						
							| 
									
										
										
										
											2015-10-17 06:07:39 -07:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	loads, err = parseLoad(string(data)) | 
					
						
							|  |  |  | 	if err != nil { | 
					
						
							| 
									
										
										
										
											2015-10-19 12:31:31 -07:00
										 |  |  | 		return nil, err | 
					
						
							| 
									
										
										
										
											2015-06-24 05:08:43 -07:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-10-17 06:07:39 -07:00
										 |  |  | 	return loads, nil | 
					
						
							| 
									
										
										
										
											2015-06-24 05:08:43 -07:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-10-19 12:31:31 -07:00
										 |  |  | // Parse /proc loadavg and return 1m, 5m and 15m.
 | 
					
						
							| 
									
										
										
										
											2015-10-17 06:07:39 -07:00
										 |  |  | func parseLoad(data string) (loads []float64, err error) { | 
					
						
							|  |  |  | 	loads = make([]float64, 3) | 
					
						
							| 
									
										
										
										
											2015-06-24 05:08:43 -07:00
										 |  |  | 	parts := strings.Fields(data) | 
					
						
							| 
									
										
										
										
											2015-10-21 08:38:26 -07:00
										 |  |  | 	if len(parts) < 3 { | 
					
						
							| 
									
										
										
										
											2015-10-19 12:31:31 -07:00
										 |  |  | 		return nil, fmt.Errorf("unexpected content in %s", procFilePath("loadavg")) | 
					
						
							| 
									
										
										
										
											2015-06-24 05:08:43 -07:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-10-21 08:38:26 -07:00
										 |  |  | 	for i, load := range parts[0:3] { | 
					
						
							|  |  |  | 		loads[i], err = strconv.ParseFloat(load, 64) | 
					
						
							|  |  |  | 		if err != nil { | 
					
						
							| 
									
										
										
										
											2020-06-15 13:27:14 -07:00
										 |  |  | 			return nil, fmt.Errorf("could not parse load '%s': %w", load, err) | 
					
						
							| 
									
										
										
										
											2015-10-21 08:38:26 -07:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2015-10-17 06:07:39 -07:00
										 |  |  | 	return loads, nil | 
					
						
							| 
									
										
										
										
											2015-06-24 05:08:43 -07:00
										 |  |  | } |