github.com/1and1/oneandone-cloudserver-sdk-go@v1.4.1/monitoringcenter.go (about)

     1  package oneandone
     2  
     3  import (
     4  	"errors"
     5  	"net/http"
     6  	"time"
     7  )
     8  
     9  type MonServerUsageSummary struct {
    10  	Identity
    11  	Agent  *monitoringAgent  `json:"agent,omitempty"`
    12  	Alerts *monitoringAlerts `json:"alerts,omitempty"`
    13  	Status *monitoringStatus `json:"status,omitempty"`
    14  	ApiPtr
    15  }
    16  
    17  type MonServerUsageDetails struct {
    18  	Identity
    19  	Status         *statusState       `json:"status,omitempty"`
    20  	Agent          *monitoringAgent   `json:"agent,omitempty"`
    21  	Alerts         *monitoringAlerts  `json:"alerts,omitempty"`
    22  	CpuStatus      *utilizationStatus `json:"cpu,omitempty"`
    23  	DiskStatus     *utilizationStatus `json:"disk,omitempty"`
    24  	RamStatus      *utilizationStatus `json:"ram,omitempty"`
    25  	PingStatus     *pingStatus        `json:"internal_ping,omitempty"`
    26  	TransferStatus *transferStatus    `json:"transfer,omitempty"`
    27  	ApiPtr
    28  }
    29  
    30  type monitoringStatus struct {
    31  	State        string       `json:"state,omitempty"`
    32  	Cpu          *statusState `json:"cpu,omitempty"`
    33  	Disk         *statusState `json:"disk,omitempty"`
    34  	InternalPing *statusState `json:"internal_ping,omitempty"`
    35  	Ram          *statusState `json:"ram,omitempty"`
    36  	Transfer     *statusState `json:"transfer,omitempty"`
    37  }
    38  
    39  type utilizationStatus struct {
    40  	CriticalThreshold int         `json:"critical,omitempty"`
    41  	WarningThreshold  int         `json:"warning,omitempty"`
    42  	Status            string      `json:"status,omitempty"`
    43  	Data              []usageData `json:"data,omitempty"`
    44  	Unit              *usageUnit  `json:"unit,omitempty"`
    45  }
    46  
    47  type pingStatus struct {
    48  	CriticalThreshold int        `json:"critical,omitempty"`
    49  	WarningThreshold  int        `json:"warning,omitempty"`
    50  	Status            string     `json:"status,omitempty"`
    51  	Data              []pingData `json:"data,omitempty"`
    52  	Unit              *pingUnit  `json:"unit,omitempty"`
    53  }
    54  
    55  type transferStatus struct {
    56  	CriticalThreshold int            `json:"critical,omitempty"`
    57  	WarningThreshold  int            `json:"warning,omitempty"`
    58  	Status            string         `json:"status,omitempty"`
    59  	Data              []transferData `json:"data,omitempty"`
    60  	Unit              *transferUnit  `json:"unit,omitempty"`
    61  }
    62  
    63  type monitoringAgent struct {
    64  	AgentInstalled       bool `json:"agent_installed"`
    65  	MissingAgentAlert    bool `json:"missing_agent_alert"`
    66  	MonitoringNeedsAgent bool `json:"monitoring_needs_agent"`
    67  }
    68  
    69  type monitoringAlerts struct {
    70  	Ports     *monitoringAlertInfo `json:"ports,omitempty"`
    71  	Process   *monitoringAlertInfo `json:"process,omitempty"`
    72  	Resources *monitoringAlertInfo `json:"resources,omitempty"`
    73  }
    74  
    75  type monitoringAlertInfo struct {
    76  	Ok       int `json:"ok"`
    77  	Warning  int `json:"warning"`
    78  	Critical int `json:"critical"`
    79  }
    80  
    81  type usageData struct {
    82  	Date        string  `json:"date,omitempty"`
    83  	UsedPercent float32 `json:"used_percent"`
    84  }
    85  
    86  type usageUnit struct {
    87  	UsedPercent string `json:"used_percent,omitempty"`
    88  }
    89  
    90  type pingUnit struct {
    91  	PackagesLost string `json:"pl,omitempty"`
    92  	AccessTime   string `json:"rta,omitempty"`
    93  }
    94  
    95  type pingData struct {
    96  	Date         string  `json:"date,omitempty"`
    97  	PackagesLost int     `json:"pl"`
    98  	AccessTime   float32 `json:"rta"`
    99  }
   100  
   101  type transferUnit struct {
   102  	Downstream string `json:"downstream,omitempty"`
   103  	Upstream   string `json:"upstream,omitempty"`
   104  }
   105  
   106  type transferData struct {
   107  	Date       string `json:"date,omitempty"`
   108  	Downstream int    `json:"downstream"`
   109  	Upstream   int    `json:"upstream"`
   110  }
   111  
   112  // GET /monitoring_center
   113  func (api *API) ListMonitoringServersUsages(args ...interface{}) ([]MonServerUsageSummary, error) {
   114  	url, err := processQueryParams(createUrl(api, monitorCenterPathSegment), args...)
   115  	if err != nil {
   116  		return nil, err
   117  	}
   118  	result := []MonServerUsageSummary{}
   119  	err = api.Client.Get(url, &result, http.StatusOK)
   120  	if err != nil {
   121  		return nil, err
   122  	}
   123  	for index, _ := range result {
   124  		result[index].api = api
   125  	}
   126  	return result, nil
   127  }
   128  
   129  // GET /monitoring_center/{server_id}
   130  func (api *API) GetMonitoringServerUsage(ser_id string, period string, dates ...time.Time) (*MonServerUsageDetails, error) {
   131  	if period == "" {
   132  		return nil, errors.New("Time period must be provided.")
   133  	}
   134  
   135  	params := make(map[string]interface{}, len(dates)+1)
   136  	params["period"] = period
   137  
   138  	if len(dates) == 2 {
   139  		if dates[0].After(dates[1]) {
   140  			return nil, errors.New("Start date cannot be after end date.")
   141  		}
   142  
   143  		params["start_date"] = dates[0].Format(time.RFC3339)
   144  		params["end_date"] = dates[1].Format(time.RFC3339)
   145  
   146  	} else if len(dates) > 0 {
   147  		return nil, errors.New("Start and end dates must be provided.")
   148  	}
   149  	url := createUrl(api, monitorCenterPathSegment, ser_id)
   150  	url = appendQueryParams(url, params)
   151  	result := new(MonServerUsageDetails)
   152  	err := api.Client.Get(url, &result, http.StatusOK)
   153  	if err != nil {
   154  		return nil, err
   155  	}
   156  	result.api = api
   157  	return result, nil
   158  }