in gcpdiag/runbook/lb/latency.py [0:0]
def execute(self):
"""Check request count per second 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)
threshold = op.get(flags.REQUEST_COUNT_THRESHOLD) if op.get(
flags.REQUEST_COUNT_THRESHOLD) is not None else 150
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 = ''
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:
query = f'''
fetch http_external_regional_lb_rule
| metric 'loadbalancing.googleapis.com/https/external/regional/request_count'
| filter (resource.forwarding_rule_name == '{fr_name}' && resource.region == '{region}')
| align rate(1m)
| every 1m
| group_by [], [value_request_count_aggregate: aggregate(value.request_count)]
| 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/request_count'
| filter (resource.forwarding_rule_name == '{fr_name}')
| align rate(1m)
| every 1m
| group_by [], [value_request_count_aggregate: aggregate(value.request_count)]
| 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/request_count'
| filter (resource.forwarding_rule_name == '{fr_name}' && resource.region == '{region}')
| align rate(1m)
| every 1m
| group_by [], [value_request_count_aggregate: aggregate(value.request_count)]
| 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_rc = [
float(item) for sublist in values for item in sublist
]
self.average_request_count = sum(flattened_values_rc) / (
len(flattened_values_rc) * 60) if flattened_values_rc else 0
if self.average_request_count > threshold:
op.add_failed(forwarding_rule,
reason=op.prep_msg(op.FAILURE_REASON,
average_request_count=round(
self.average_request_count, 2),
threshold=threshold),
remediation=op.prep_msg(op.FAILURE_REMEDIATION))
else:
op.add_ok(forwarding_rule,
reason=op.prep_msg(op.SUCCESS_REASON,
average_request_count=round(
self.average_request_count, 2),
threshold=threshold))
return metric
except Exception as e:
# Catch any other errors
op.info('An unexpected error occurred during LBRequestCount execution.')
op.info('Error details: ' + str(e))
raise