in gcpdiag/runbook/lb/latency.py [0:0]
def execute(self):
"""Check backend latency for the specified forwarding rule"""
self.forwarding_rule = lb.get_forwarding_rule(
op.get(flags.PROJECT_ID), op.get(flags.FORWARDING_RULE_NAME),
op.get(flags.REGION))
project_id = op.get(flags.PROJECT_ID)
# Define default threshold value
threshold = op.get(flags.BACKEND_LATENCY_THRESHOLD) if op.get(
flags.BACKEND_LATENCY_THRESHOLD) is not None else 200
forwarding_rule = self.forwarding_rule
fr_name = op.get(flags.FORWARDING_RULE_NAME)
load_balancer_type = self.forwarding_rule.load_balancer_type
region = op.get(flags.REGION)
query = ''
average_latency = None
op.info('Forwarding rule name: ' + str(self.forwarding_rule))
# Construct the MQL query string, incorporating filter and time range
if load_balancer_type == lb.LoadBalancerType.REGIONAL_EXTERNAL_APPLICATION_LB:
#To Do: Add support for Network Load Balancers and Pass through Load Balancers
#To Do: Allow users to chose a specific time range
query = f'''
fetch http_external_regional_lb_rule
| metric
'loadbalancing.googleapis.com/https/external/regional/backend_latencies'
| filter (resource.forwarding_rule_name == '{fr_name}' && resource.region == '{region}')
| align delta(1m)
| every 1m
| group_by [],
[value_backend_latencies_average:
mean(value.backend_latencies)]
| within 15m
'''
if load_balancer_type in [
lb.LoadBalancerType.CLASSIC_APPLICATION_LB,
lb.LoadBalancerType.GLOBAL_EXTERNAL_APPLICATION_LB,
]:
query = f'''
fetch https_lb_rule
| metric
'loadbalancing.googleapis.com/https/backend_latencies'
| filter (resource.forwarding_rule_name == '{fr_name}')
| align delta(1m)
| every 1m
| group_by [],
[value_backend_latencies_average:
mean(value.backend_latencies)]
| within 15m
'''
if load_balancer_type == lb.LoadBalancerType.REGIONAL_INTERNAL_APPLICATION_LB:
query = f'''
fetch internal_http_lb_rule
| metric
'loadbalancing.googleapis.com/https/internal/backend_latencies'
| filter (resource.forwarding_rule_name == '{fr_name}' && resource.region == '{region}')
| align delta(1m)
| every 1m
| group_by [],
[value_backend_latencies_average:
mean(value.backend_latencies)]
| within 15m
'''
try:
# Execute the query using the monitoring API
metric = monitoring.query(project_id, query)
values = []
if metric:
for _, item in metric.items(
): # Iterate over the items in the metric dictionary
if 'values' in item:
values = item['values']
else:
values = [[0]]
if values is not None:
flattened_values = [
float(item) for sublist in values for item in sublist
]
average_latency = sum(flattened_values) / len(
flattened_values) if flattened_values else 0
if average_latency > threshold:
op.add_failed(forwarding_rule,
reason=op.prep_msg(op.FAILURE_REASON,
average_latency=round(
average_latency, 2),
threshold=threshold),
remediation=op.prep_msg(op.FAILURE_REMEDIATION))
else:
op.add_ok(forwarding_rule,
reason=op.prep_msg(op.SUCCESS_REASON,
average_latency=round(average_latency, 2),
threshold=threshold))
return metric
except Exception as e:
# Catch any other errors
op.info('An unexpected error occurred during LbBackendLatency execution.')
op.info('Error details: ' + str(e))
raise