Create system_collector_freebsd.go to allow FreeBSD build.
This commit is contained in:
		
							parent
							
								
									914d70fe78
								
							
						
					
					
						commit
						6b3294838c
					
				|  | @ -0,0 +1,172 @@ | |||
| //go:build freebsd
 | ||||
| 
 | ||||
| package diagnostic | ||||
| 
 | ||||
| import ( | ||||
| 	"context" | ||||
| 	"fmt" | ||||
| 	"os/exec" | ||||
| 	"runtime" | ||||
| 	"strconv" | ||||
| ) | ||||
| 
 | ||||
| type SystemCollectorImpl struct { | ||||
| 	version string | ||||
| } | ||||
| 
 | ||||
| func NewSystemCollectorImpl( | ||||
| 	version string, | ||||
| ) *SystemCollectorImpl { | ||||
| 	return &SystemCollectorImpl{ | ||||
| 		version, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| func (collector *SystemCollectorImpl) Collect(ctx context.Context) (*SystemInformation, error) { | ||||
| 	memoryInfo, memoryInfoRaw, memoryInfoErr := collectMemoryInformation(ctx) | ||||
| 	fdInfo, fdInfoRaw, fdInfoErr := collectFileDescriptorInformation(ctx) | ||||
| 	disks, disksRaw, diskErr := collectDiskVolumeInformationUnix(ctx) | ||||
| 	osInfo, osInfoRaw, osInfoErr := collectOSInformationUnix(ctx) | ||||
| 
 | ||||
| 	var memoryMaximum, memoryCurrent, fileDescriptorMaximum, fileDescriptorCurrent uint64 | ||||
| 	var osSystem, name, osVersion, osRelease, architecture string | ||||
| 
 | ||||
| 	err := SystemInformationGeneralError{ | ||||
| 		OperatingSystemInformationError: nil, | ||||
| 		MemoryInformationError:          nil, | ||||
| 		FileDescriptorsInformationError: nil, | ||||
| 		DiskVolumeInformationError:      nil, | ||||
| 	} | ||||
| 
 | ||||
| 	if memoryInfoErr != nil { | ||||
| 		err.MemoryInformationError = SystemInformationError{ | ||||
| 			Err:     memoryInfoErr, | ||||
| 			RawInfo: memoryInfoRaw, | ||||
| 		} | ||||
| 	} else { | ||||
| 		memoryMaximum = memoryInfo.MemoryMaximum | ||||
| 		memoryCurrent = memoryInfo.MemoryCurrent | ||||
| 	} | ||||
| 
 | ||||
| 	if fdInfoErr != nil { | ||||
| 		err.FileDescriptorsInformationError = SystemInformationError{ | ||||
| 			Err:     fdInfoErr, | ||||
| 			RawInfo: fdInfoRaw, | ||||
| 		} | ||||
| 	} else { | ||||
| 		fileDescriptorMaximum = fdInfo.FileDescriptorMaximum | ||||
| 		fileDescriptorCurrent = fdInfo.FileDescriptorCurrent | ||||
| 	} | ||||
| 
 | ||||
| 	if diskErr != nil { | ||||
| 		err.DiskVolumeInformationError = SystemInformationError{ | ||||
| 			Err:     diskErr, | ||||
| 			RawInfo: disksRaw, | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if osInfoErr != nil { | ||||
| 		err.OperatingSystemInformationError = SystemInformationError{ | ||||
| 			Err:     osInfoErr, | ||||
| 			RawInfo: osInfoRaw, | ||||
| 		} | ||||
| 	} else { | ||||
| 		osSystem = osInfo.OsSystem | ||||
| 		name = osInfo.Name | ||||
| 		osVersion = osInfo.OsVersion | ||||
| 		osRelease = osInfo.OsRelease | ||||
| 		architecture = osInfo.Architecture | ||||
| 	} | ||||
| 
 | ||||
| 	cloudflaredVersion := collector.version | ||||
| 	info := NewSystemInformation( | ||||
| 		memoryMaximum, | ||||
| 		memoryCurrent, | ||||
| 		fileDescriptorMaximum, | ||||
| 		fileDescriptorCurrent, | ||||
| 		osSystem, | ||||
| 		name, | ||||
| 		osVersion, | ||||
| 		osRelease, | ||||
| 		architecture, | ||||
| 		cloudflaredVersion, | ||||
| 		runtime.Version(), | ||||
| 		runtime.GOARCH, | ||||
| 		disks, | ||||
| 	) | ||||
| 
 | ||||
| 	return info, err | ||||
| } | ||||
| 
 | ||||
| func collectFileDescriptorInformation(ctx context.Context) ( | ||||
| 	*FileDescriptorInformation, | ||||
| 	string, | ||||
| 	error, | ||||
| ) { | ||||
| 	const ( | ||||
| 		fileDescriptorMaximumKey = "kern.maxfiles" | ||||
| 		fileDescriptorCurrentKey = "kern.num_files" | ||||
| 	) | ||||
| 
 | ||||
| 	command := exec.CommandContext(ctx, "sysctl", fileDescriptorMaximumKey, fileDescriptorCurrentKey) | ||||
| 
 | ||||
| 	stdout, err := command.Output() | ||||
| 	if err != nil { | ||||
| 		return nil, "", fmt.Errorf("error retrieving output from command '%s': %w", command.String(), err) | ||||
| 	} | ||||
| 
 | ||||
| 	output := string(stdout) | ||||
| 
 | ||||
| 	fileDescriptorInfo, err := ParseFileDescriptorInformationFromKV( | ||||
| 		output, | ||||
| 		fileDescriptorMaximumKey, | ||||
| 		fileDescriptorCurrentKey, | ||||
| 	) | ||||
| 	if err != nil { | ||||
| 		return nil, output, err | ||||
| 	} | ||||
| 
 | ||||
| 	// returning raw output in case other collected information
 | ||||
| 	// resulted in errors
 | ||||
| 	return fileDescriptorInfo, output, nil | ||||
| } | ||||
| 
 | ||||
| func collectMemoryInformation(ctx context.Context) ( | ||||
| 	*MemoryInformation, | ||||
| 	string, | ||||
| 	error, | ||||
| ) { | ||||
| 	const ( | ||||
| 		memoryMaximumKey   = "hw.memsize" | ||||
| 		memoryAvailableKey = "hw.memsize_usable" | ||||
| 	) | ||||
| 
 | ||||
| 	command := exec.CommandContext( | ||||
| 		ctx, | ||||
| 		"sysctl", | ||||
| 		memoryMaximumKey, | ||||
| 		memoryAvailableKey, | ||||
| 	) | ||||
| 
 | ||||
| 	stdout, err := command.Output() | ||||
| 	if err != nil { | ||||
| 		return nil, "", fmt.Errorf("error retrieving output from command '%s': %w", command.String(), err) | ||||
| 	} | ||||
| 
 | ||||
| 	output := string(stdout) | ||||
| 
 | ||||
| 	mapper := func(field string) (uint64, error) { | ||||
| 		const kiloBytes = 1024 | ||||
| 		value, err := strconv.ParseUint(field, 10, 64) | ||||
| 		return value / kiloBytes, err | ||||
| 	} | ||||
| 
 | ||||
| 	memoryInfo, err := ParseMemoryInformationFromKV(output, memoryMaximumKey, memoryAvailableKey, mapper) | ||||
| 	if err != nil { | ||||
| 		return nil, output, err | ||||
| 	} | ||||
| 
 | ||||
| 	// returning raw output in case other collected information
 | ||||
| 	// resulted in errors
 | ||||
| 	return memoryInfo, output, nil | ||||
| } | ||||
		Loading…
	
		Reference in New Issue