2019-02-06 02:36:22 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								// Copyright 2019 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.
  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-07-30 07:10:08 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								//go:build !nodiskstats && (openbsd || linux || darwin || aix)
  
						 
					
						
							
								
									
										
										
										
											2019-02-06 02:36:22 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								// +build !nodiskstats
  
						 
					
						
							
								
									
										
										
										
											2024-07-30 07:10:08 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								// +build openbsd linux darwin aix
  
						 
					
						
							
								
									
										
										
										
											2019-02-06 02:36:22 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								package  collector  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								import  (  
						 
					
						
							
								
									
										
										
										
											2022-06-27 23:10:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"errors" 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-11 01:51:28 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"log/slog" 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-27 23:10:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-03-07 00:25:05 -08:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									"github.com/alecthomas/kingpin/v2" 
							 
						 
					
						
							
								
									
										
										
										
											2019-02-06 02:36:22 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									"github.com/prometheus/client_golang/prometheus" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								const  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									diskSubsystem  =  "disk" 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								var  (  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									diskLabelNames  =  [ ] string { "device" } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 06:00:37 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									diskstatsDeviceExcludeSet  bool 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									diskstatsDeviceExclude     =  kingpin . Flag ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"collector.diskstats.device-exclude" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"Regexp of diskstats devices to exclude (mutually exclusive to device-include)." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									) . Default ( diskstatsDefaultIgnoredDevices ) . PreAction ( func ( c  * kingpin . ParseContext )  error  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										diskstatsDeviceExcludeSet  =  true 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} ) . String ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									oldDiskstatsDeviceExclude  =  kingpin . Flag ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"collector.diskstats.ignored-devices" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"DEPRECATED: Use collector.diskstats.device-exclude" , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									) . Hidden ( ) . String ( ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									diskstatsDeviceInclude  =  kingpin . Flag ( "collector.diskstats.device-include" ,  "Regexp of diskstats devices to include (mutually exclusive to device-exclude)." ) . String ( ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-27 23:10:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2019-02-06 02:36:22 -08:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
									readsCompletedDesc  =  prometheus . NewDesc ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										prometheus . BuildFQName ( namespace ,  diskSubsystem ,  "reads_completed_total" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"The total number of reads completed successfully." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										diskLabelNames ,  nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									readBytesDesc  =  prometheus . NewDesc ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										prometheus . BuildFQName ( namespace ,  diskSubsystem ,  "read_bytes_total" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"The total number of bytes read successfully." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										diskLabelNames ,  nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									writesCompletedDesc  =  prometheus . NewDesc ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										prometheus . BuildFQName ( namespace ,  diskSubsystem ,  "writes_completed_total" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"The total number of writes completed successfully." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										diskLabelNames ,  nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									writtenBytesDesc  =  prometheus . NewDesc ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										prometheus . BuildFQName ( namespace ,  diskSubsystem ,  "written_bytes_total" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"The total number of bytes written successfully." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										diskLabelNames ,  nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									ioTimeSecondsDesc  =  prometheus . NewDesc ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										prometheus . BuildFQName ( namespace ,  diskSubsystem ,  "io_time_seconds_total" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"Total seconds spent doing I/Os." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										diskLabelNames ,  nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									readTimeSecondsDesc  =  prometheus . NewDesc ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										prometheus . BuildFQName ( namespace ,  diskSubsystem ,  "read_time_seconds_total" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"The total number of seconds spent by all reads." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										diskLabelNames , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									writeTimeSecondsDesc  =  prometheus . NewDesc ( 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										prometheus . BuildFQName ( namespace ,  diskSubsystem ,  "write_time_seconds_total" ) , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										"This is the total number of seconds spent by all writes." , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										diskLabelNames , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										nil , 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								)  
						 
					
						
							
								
									
										
										
										
											2022-06-27 23:10:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2024-09-11 01:51:28 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								func  newDiskstatsDeviceFilter ( logger  * slog . Logger )  ( deviceFilter ,  error )  {  
						 
					
						
							
								
									
										
										
										
											2022-06-27 23:10:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									if  * oldDiskstatsDeviceExclude  !=  ""  { 
							 
						 
					
						
							
								
									
										
										
										
											2022-09-28 06:00:37 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										if  ! diskstatsDeviceExcludeSet  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-11 01:51:28 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											logger . Warn ( "--collector.diskstats.ignored-devices is DEPRECATED and will be removed in 2.0.0, use --collector.diskstats.device-exclude" ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-27 23:10:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
											* diskstatsDeviceExclude  =  * oldDiskstatsDeviceExclude 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										}  else  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
											return  deviceFilter { } ,  errors . New ( "--collector.diskstats.ignored-devices and --collector.diskstats.device-exclude are mutually exclusive" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  * diskstatsDeviceExclude  !=  ""  &&  * diskstatsDeviceInclude  !=  ""  { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
										return  deviceFilter { } ,  errors . New ( "device-exclude & device-include are mutually exclusive" ) 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  * diskstatsDeviceExclude  !=  ""  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-11 01:51:28 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										logger . Info ( "Parsed flag --collector.diskstats.device-exclude" ,  "flag" ,  * diskstatsDeviceExclude ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-27 23:10:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									if  * diskstatsDeviceInclude  !=  ""  { 
							 
						 
					
						
							
								
									
										
										
										
											2024-09-11 01:51:28 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
										logger . Info ( "Parsed Flag --collector.diskstats.device-include" ,  "flag" ,  * diskstatsDeviceInclude ) 
							 
						 
					
						
							
								
									
										
										
										
											2022-06-27 23:10:40 -07:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
									} 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
									return  newDeviceFilter ( * diskstatsDeviceExclude ,  * diskstatsDeviceInclude ) ,  nil 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								}