def execute()

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