151 lines
4.8 KiB
Go
151 lines
4.8 KiB
Go
package diagnostic
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"errors"
|
|
"strings"
|
|
)
|
|
|
|
type SystemInformationError struct {
|
|
Err error `json:"error"`
|
|
RawInfo string `json:"rawInfo"`
|
|
}
|
|
|
|
func (err SystemInformationError) Error() string {
|
|
return err.Err.Error()
|
|
}
|
|
|
|
func (err SystemInformationError) MarshalJSON() ([]byte, error) {
|
|
s := map[string]string{
|
|
"error": err.Err.Error(),
|
|
"rawInfo": err.RawInfo,
|
|
}
|
|
|
|
return json.Marshal(s)
|
|
}
|
|
|
|
type SystemInformationGeneralError struct {
|
|
OperatingSystemInformationError error
|
|
MemoryInformationError error
|
|
FileDescriptorsInformationError error
|
|
DiskVolumeInformationError error
|
|
}
|
|
|
|
func (err SystemInformationGeneralError) Error() string {
|
|
builder := &strings.Builder{}
|
|
builder.WriteString("errors found:")
|
|
|
|
if err.OperatingSystemInformationError != nil {
|
|
builder.WriteString(err.OperatingSystemInformationError.Error() + ", ")
|
|
}
|
|
|
|
if err.MemoryInformationError != nil {
|
|
builder.WriteString(err.MemoryInformationError.Error() + ", ")
|
|
}
|
|
|
|
if err.FileDescriptorsInformationError != nil {
|
|
builder.WriteString(err.FileDescriptorsInformationError.Error() + ", ")
|
|
}
|
|
|
|
if err.DiskVolumeInformationError != nil {
|
|
builder.WriteString(err.DiskVolumeInformationError.Error() + ", ")
|
|
}
|
|
|
|
return builder.String()
|
|
}
|
|
|
|
func (err SystemInformationGeneralError) MarshalJSON() ([]byte, error) {
|
|
data := map[string]SystemInformationError{}
|
|
|
|
var sysErr SystemInformationError
|
|
if errors.As(err.OperatingSystemInformationError, &sysErr) {
|
|
data["operatingSystemInformationError"] = sysErr
|
|
}
|
|
|
|
if errors.As(err.MemoryInformationError, &sysErr) {
|
|
data["memoryInformationError"] = sysErr
|
|
}
|
|
|
|
if errors.As(err.FileDescriptorsInformationError, &sysErr) {
|
|
data["fileDescriptorsInformationError"] = sysErr
|
|
}
|
|
|
|
if errors.As(err.DiskVolumeInformationError, &sysErr) {
|
|
data["diskVolumeInformationError"] = sysErr
|
|
}
|
|
|
|
return json.Marshal(data)
|
|
}
|
|
|
|
type DiskVolumeInformation struct {
|
|
Name string `json:"name"` // represents the filesystem in linux/macos or device name in windows
|
|
SizeMaximum uint64 `json:"sizeMaximum"` // represents the maximum size of the disk in kilobytes
|
|
SizeCurrent uint64 `json:"sizeCurrent"` // represents the current size of the disk in kilobytes
|
|
}
|
|
|
|
func NewDiskVolumeInformation(name string, maximum, current uint64) *DiskVolumeInformation {
|
|
return &DiskVolumeInformation{
|
|
name,
|
|
maximum,
|
|
current,
|
|
}
|
|
}
|
|
|
|
type SystemInformation struct {
|
|
MemoryMaximum uint64 `json:"memoryMaximum,omitempty"` // represents the maximum memory of the system in kilobytes
|
|
MemoryCurrent uint64 `json:"memoryCurrent,omitempty"` // represents the system's memory in use in kilobytes
|
|
FileDescriptorMaximum uint64 `json:"fileDescriptorMaximum,omitempty"` // represents the maximum number of file descriptors of the system
|
|
FileDescriptorCurrent uint64 `json:"fileDescriptorCurrent,omitempty"` // represents the system's file descriptors in use
|
|
OsSystem string `json:"osSystem,omitempty"` // represents the operating system name i.e.: linux, windows, darwin
|
|
HostName string `json:"hostName,omitempty"` // represents the system host name
|
|
OsVersion string `json:"osVersion,omitempty"` // detailed information about the system's release version level
|
|
OsRelease string `json:"osRelease,omitempty"` // detailed information about the system's release
|
|
Architecture string `json:"architecture,omitempty"` // represents the system's hardware platform i.e: arm64/amd64
|
|
CloudflaredVersion string `json:"cloudflaredVersion,omitempty"` // the runtime version of cloudflared
|
|
GoVersion string `json:"goVersion,omitempty"`
|
|
GoArch string `json:"goArch,omitempty"`
|
|
Disk []*DiskVolumeInformation `json:"disk,omitempty"`
|
|
}
|
|
|
|
func NewSystemInformation(
|
|
memoryMaximum,
|
|
memoryCurrent,
|
|
filesMaximum,
|
|
filesCurrent uint64,
|
|
osystem,
|
|
name,
|
|
osVersion,
|
|
osRelease,
|
|
architecture,
|
|
cloudflaredVersion,
|
|
goVersion,
|
|
goArchitecture string,
|
|
disk []*DiskVolumeInformation,
|
|
) *SystemInformation {
|
|
return &SystemInformation{
|
|
memoryMaximum,
|
|
memoryCurrent,
|
|
filesMaximum,
|
|
filesCurrent,
|
|
osystem,
|
|
name,
|
|
osVersion,
|
|
osRelease,
|
|
architecture,
|
|
cloudflaredVersion,
|
|
goVersion,
|
|
goArchitecture,
|
|
disk,
|
|
}
|
|
}
|
|
|
|
type SystemCollector interface {
|
|
// If the collection is successful it will return `SystemInformation` struct,
|
|
// and a nil error.
|
|
//
|
|
// This function expects that the caller sets the context timeout to prevent
|
|
// long-lived collectors.
|
|
Collect(ctx context.Context) (*SystemInformation, error)
|
|
}
|