Skip to content

Commit e4bc9e2

Browse files
authored
Add load balancer monitoring endpoints (#745)
1 parent c9600f7 commit e4bc9e2

2 files changed

Lines changed: 397 additions & 3 deletions

File tree

monitoring.go

Lines changed: 193 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ import (
1010
)
1111

1212
const (
13-
monitoringBasePath = "v2/monitoring"
14-
alertPolicyBasePath = monitoringBasePath + "/alerts"
15-
dropletMetricsBasePath = monitoringBasePath + "/metrics/droplet"
13+
monitoringBasePath = "v2/monitoring"
14+
alertPolicyBasePath = monitoringBasePath + "/alerts"
15+
dropletMetricsBasePath = monitoringBasePath + "/metrics/droplet"
16+
loadBalancerMetricsBasePath = monitoringBasePath + "/metrics/load_balancer"
1617

1718
DropletCPUUtilizationPercent = "v1/insights/droplet/cpu"
1819
DropletMemoryUtilizationPercent = "v1/insights/droplet/memory_utilization_percent"
@@ -67,6 +68,34 @@ type MonitoringService interface {
6768
GetDropletCachedMemory(context.Context, *DropletMetricsRequest) (*MetricsResponse, *Response, error)
6869
GetDropletFreeMemory(context.Context, *DropletMetricsRequest) (*MetricsResponse, *Response, error)
6970
GetDropletTotalMemory(context.Context, *DropletMetricsRequest) (*MetricsResponse, *Response, error)
71+
72+
GetLoadBalancerFrontendHttpRequestsPerSecond(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
73+
GetLoadBalancerFrontendConnectionsCurrent(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
74+
GetLoadBalancerFrontendConnectionsLimit(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
75+
GetLoadBalancerFrontendCpuUtilization(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
76+
GetLoadBalancerFrontendNetworkThroughputHttp(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
77+
GetLoadBalancerFrontendNetworkThroughputUdp(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
78+
GetLoadBalancerFrontendNetworkThroughputTcp(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
79+
GetLoadBalancerFrontendNlbTcpNetworkThroughput(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
80+
GetLoadBalancerFrontendNlbUdpNetworkThroughput(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
81+
GetLoadBalancerFrontendFirewallDroppedBytes(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
82+
GetLoadBalancerFrontendFirewallDroppedPackets(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
83+
GetLoadBalancerFrontendHttpResponses(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
84+
GetLoadBalancerFrontendTlsConnectionsCurrent(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
85+
GetLoadBalancerFrontendTlsConnectionsLimit(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
86+
GetLoadBalancerFrontendTlsConnectionsExceedingRateLimit(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
87+
GetLoadBalancerDropletsHttpSessionDurationAvg(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
88+
GetLoadBalancerDropletsHttpSessionDuration50P(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
89+
GetLoadBalancerDropletsHttpSessionDuration95P(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
90+
GetLoadBalancerDropletsHttpResponseTimeAvg(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
91+
GetLoadBalancerDropletsHttpResponseTime50P(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
92+
GetLoadBalancerDropletsHttpResponseTime95P(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
93+
GetLoadBalancerDropletsHttpResponseTime99P(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
94+
GetLoadBalancerDropletsQueueSize(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
95+
GetLoadBalancerDropletsHttpResponses(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
96+
GetLoadBalancerDropletsConnections(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
97+
GetLoadBalancerDropletsHealthChecks(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
98+
GetLoadBalancerDropletsDowntime(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error)
7099
}
71100

72101
// MonitoringServiceOp handles communication with monitoring related methods of the
@@ -163,6 +192,13 @@ type DropletBandwidthMetricsRequest struct {
163192
Direction string
164193
}
165194

195+
// LoadBalancerMetricsRequest holds the information needed to retrieve Load Balancer various metrics.
196+
type LoadBalancerMetricsRequest struct {
197+
LoadBalancerID string
198+
Start time.Time
199+
End time.Time
200+
}
201+
166202
// MetricsResponse holds a Metrics query response.
167203
type MetricsResponse struct {
168204
Status string `json:"status"`
@@ -372,3 +408,157 @@ func (s *MonitoringServiceOp) getDropletMetrics(ctx context.Context, path string
372408

373409
return root, resp, err
374410
}
411+
412+
// GetLoadBalancerFrontendHttpRequestsPerSecond retrieves frontend HTTP requests per second for a given load balancer.
413+
func (s *MonitoringServiceOp) GetLoadBalancerFrontendHttpRequestsPerSecond(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
414+
return s.getLoadBalancerMetrics(ctx, "/frontend_http_requests_per_second", args)
415+
}
416+
417+
// GetLoadBalancerFrontendConnectionsCurrent retrieves frontend total current active connections for a given load balancer.
418+
func (s *MonitoringServiceOp) GetLoadBalancerFrontendConnectionsCurrent(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
419+
return s.getLoadBalancerMetrics(ctx, "/frontend_connections_current", args)
420+
}
421+
422+
// GetLoadBalancerFrontendConnectionsLimit retrieves frontend max connections limit for a given load balancer.
423+
func (s *MonitoringServiceOp) GetLoadBalancerFrontendConnectionsLimit(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
424+
return s.getLoadBalancerMetrics(ctx, "/frontend_connections_limit", args)
425+
}
426+
427+
// GetLoadBalancerFrontendCpuUtilization retrieves frontend average percentage cpu utilization for a given load balancer.
428+
func (s *MonitoringServiceOp) GetLoadBalancerFrontendCpuUtilization(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
429+
return s.getLoadBalancerMetrics(ctx, "/frontend_cpu_utilization", args)
430+
}
431+
432+
// GetLoadBalancerFrontendNetworkThroughputHttp retrieves frontend HTTP throughput for a given load balancer.
433+
func (s *MonitoringServiceOp) GetLoadBalancerFrontendNetworkThroughputHttp(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
434+
return s.getLoadBalancerMetrics(ctx, "/frontend_network_throughput_http", args)
435+
}
436+
437+
// GetLoadBalancerFrontendNetworkThroughputUdp retrieves frontend UDP throughput for a given load balancer.
438+
func (s *MonitoringServiceOp) GetLoadBalancerFrontendNetworkThroughputUdp(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
439+
return s.getLoadBalancerMetrics(ctx, "/frontend_network_throughput_udp", args)
440+
}
441+
442+
// GetLoadBalancerFrontendNetworkThroughputTcp retrieves frontend TCP throughput for a given load balancer.
443+
func (s *MonitoringServiceOp) GetLoadBalancerFrontendNetworkThroughputTcp(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
444+
return s.getLoadBalancerMetrics(ctx, "/frontend_network_throughput_tcp", args)
445+
}
446+
447+
// GetLoadBalancerFrontendNlbTcpNetworkThroughput retrieves frontend TCP throughput for a given network load balancer.
448+
func (s *MonitoringServiceOp) GetLoadBalancerFrontendNlbTcpNetworkThroughput(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
449+
return s.getLoadBalancerMetrics(ctx, "/frontend_nlb_tcp_network_throughput", args)
450+
}
451+
452+
// GetLoadBalancerFrontendNlbUdpNetworkThroughput retrieves frontend UDP throughput for a given network load balancer.
453+
func (s *MonitoringServiceOp) GetLoadBalancerFrontendNlbUdpNetworkThroughput(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
454+
return s.getLoadBalancerMetrics(ctx, "/frontend_nlb_udp_network_throughput", args)
455+
}
456+
457+
// GetLoadBalancerFrontendFirewallDroppedBytes retrieves firewall dropped bytes for a given load balancer.
458+
func (s *MonitoringServiceOp) GetLoadBalancerFrontendFirewallDroppedBytes(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
459+
return s.getLoadBalancerMetrics(ctx, "/frontend_firewall_dropped_bytes", args)
460+
}
461+
462+
// GetLoadBalancerFrontendFirewallDroppedPackets retrieves firewall dropped packets for a given load balancer.
463+
func (s *MonitoringServiceOp) GetLoadBalancerFrontendFirewallDroppedPackets(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
464+
return s.getLoadBalancerMetrics(ctx, "/frontend_firewall_dropped_packets", args)
465+
}
466+
467+
// GetLoadBalancerFrontendHttpResponses retrieves frontend HTTP rate of response code for a given load balancer.
468+
func (s *MonitoringServiceOp) GetLoadBalancerFrontendHttpResponses(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
469+
return s.getLoadBalancerMetrics(ctx, "/frontend_http_responses", args)
470+
}
471+
472+
// GetLoadBalancerFrontendTlsConnectionsCurrent retrieves frontend current TLS connections rate for a given load balancer.
473+
func (s *MonitoringServiceOp) GetLoadBalancerFrontendTlsConnectionsCurrent(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
474+
return s.getLoadBalancerMetrics(ctx, "/frontend_tls_connections_current", args)
475+
}
476+
477+
// GetLoadBalancerFrontendTlsConnectionsLimit retrieves frontend max TLS connections limit for a given load balancer.
478+
func (s *MonitoringServiceOp) GetLoadBalancerFrontendTlsConnectionsLimit(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
479+
return s.getLoadBalancerMetrics(ctx, "/frontend_tls_connections_limit", args)
480+
}
481+
482+
// GetLoadBalancerFrontendTlsConnectionsExceedingRateLimit retrieves frontend closed TLS connections for exceeded rate limit for a given load balancer.
483+
func (s *MonitoringServiceOp) GetLoadBalancerFrontendTlsConnectionsExceedingRateLimit(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
484+
return s.getLoadBalancerMetrics(ctx, "/frontend_tls_connections_exceeding_rate_limit", args)
485+
}
486+
487+
// GetLoadBalancerDropletsHttpSessionDurationAvg retrieves droplet average HTTP session duration for a given load balancer.
488+
func (s *MonitoringServiceOp) GetLoadBalancerDropletsHttpSessionDurationAvg(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
489+
return s.getLoadBalancerMetrics(ctx, "/droplets_http_session_duration_avg", args)
490+
}
491+
492+
// GetLoadBalancerDropletsHttpSessionDuration50P retrieves droplet 50th percentile HTTP session duration for a given load balancer.
493+
func (s *MonitoringServiceOp) GetLoadBalancerDropletsHttpSessionDuration50P(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
494+
return s.getLoadBalancerMetrics(ctx, "/droplets_http_session_duration_50p", args)
495+
}
496+
497+
// GetLoadBalancerDropletsHttpSessionDuration95P retrieves droplet 95th percentile HTTP session duration for a given load balancer.
498+
func (s *MonitoringServiceOp) GetLoadBalancerDropletsHttpSessionDuration95P(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
499+
return s.getLoadBalancerMetrics(ctx, "/droplets_http_session_duration_95p", args)
500+
}
501+
502+
// GetLoadBalancerDropletsHttpResponseTimeAvg retrieves droplet average HTTP response time for a given load balancer.
503+
func (s *MonitoringServiceOp) GetLoadBalancerDropletsHttpResponseTimeAvg(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
504+
return s.getLoadBalancerMetrics(ctx, "/droplets_http_response_time_avg", args)
505+
}
506+
507+
// GetLoadBalancerDropletsHttpResponseTime50P retrieves droplet 50th percentile HTTP response time for a given load balancer.
508+
func (s *MonitoringServiceOp) GetLoadBalancerDropletsHttpResponseTime50P(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
509+
return s.getLoadBalancerMetrics(ctx, "/droplets_http_response_time_50p", args)
510+
}
511+
512+
// GetLoadBalancerDropletsHttpResponseTime95P retrieves droplet 95th percentile HTTP response time for a given load balancer.
513+
func (s *MonitoringServiceOp) GetLoadBalancerDropletsHttpResponseTime95P(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
514+
return s.getLoadBalancerMetrics(ctx, "/droplets_http_response_time_95p", args)
515+
}
516+
517+
// GetLoadBalancerDropletsHttpResponseTime99P retrieves droplet 99th percentile HTTP response time for a given load balancer.
518+
func (s *MonitoringServiceOp) GetLoadBalancerDropletsHttpResponseTime99P(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
519+
return s.getLoadBalancerMetrics(ctx, "/droplets_http_response_time_99p", args)
520+
}
521+
522+
// GetLoadBalancerDropletsQueueSize retrieves droplet queue size for a given load balancer.
523+
func (s *MonitoringServiceOp) GetLoadBalancerDropletsQueueSize(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
524+
return s.getLoadBalancerMetrics(ctx, "/droplets_queue_size", args)
525+
}
526+
527+
// GetLoadBalancerDropletsHttpResponses retrieves droplet HTTP rate of response code for a given load balancer.
528+
func (s *MonitoringServiceOp) GetLoadBalancerDropletsHttpResponses(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
529+
return s.getLoadBalancerMetrics(ctx, "/droplets_http_responses", args)
530+
}
531+
532+
// GetLoadBalancerDropletsConnections retrieves droplet active connections for a given load balancer.
533+
func (s *MonitoringServiceOp) GetLoadBalancerDropletsConnections(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
534+
return s.getLoadBalancerMetrics(ctx, "/droplets_connections", args)
535+
}
536+
537+
// GetLoadBalancerDropletsHealthChecks retrieves droplet health check status for a given load balancer.
538+
func (s *MonitoringServiceOp) GetLoadBalancerDropletsHealthChecks(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
539+
return s.getLoadBalancerMetrics(ctx, "/droplets_health_checks", args)
540+
}
541+
542+
// GetLoadBalancerDropletsDowntime retrieves droplet downtime status for a given load balancer.
543+
func (s *MonitoringServiceOp) GetLoadBalancerDropletsDowntime(ctx context.Context, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
544+
return s.getLoadBalancerMetrics(ctx, "/droplets_downtime", args)
545+
}
546+
547+
func (s *MonitoringServiceOp) getLoadBalancerMetrics(ctx context.Context, path string, args *LoadBalancerMetricsRequest) (*MetricsResponse, *Response, error) {
548+
fullPath := loadBalancerMetricsBasePath + path
549+
req, err := s.client.NewRequest(ctx, http.MethodGet, fullPath, nil)
550+
if err != nil {
551+
return nil, nil, err
552+
}
553+
554+
q := req.URL.Query()
555+
q.Add("lb_id", args.LoadBalancerID)
556+
q.Add("start", fmt.Sprintf("%d", args.Start.Unix()))
557+
q.Add("end", fmt.Sprintf("%d", args.End.Unix()))
558+
req.URL.RawQuery = q.Encode()
559+
560+
root := new(MetricsResponse)
561+
resp, err := s.client.Do(ctx, req, root)
562+
563+
return root, resp, err
564+
}

0 commit comments

Comments
 (0)