def timeseries()

in blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-psa.py [0:0]


def timeseries(resources):
  'Returns used/available/ratio timeseries for addresses by PSA ranges.'
  LOGGER.info('timeseries')
  for dtype, name in DESCRIPTOR_ATTRS.items():
    yield MetricDescriptor(f'network/psa/{dtype}', name,
                           ('project', 'network', 'subnetwork'),
                           dtype.endswith('ratio'))
  psa_nets = {
      k: {
          'network_link':
              v['network'],
          'network_prefix':
              ipaddress.ip_network('{}/{}'.format(v['address'],
                                                  v['prefixLength']))
      } for k, v in resources['global_addresses'].items() if v['prefixLength']
  }
  psa_counts = {}
  for address, ip_count, network in itertools.chain(
      _sql_addresses(resources.get('sql_instances', {})),
      _filestore_addresses(resources.get('filestore_instances', {})),
      _memorystore_addresses(resources.get('memorystore_instances', {}))):
    ip_address = ipaddress.ip_address(address)
    for k, v in psa_nets.items():
      if network == v['network_link'] and ip_address in v['network_prefix']:
        psa_counts[k] = psa_counts.get(k, 0) + ip_count
        break

  for k, v in psa_counts.items():
    max_ips = psa_nets[k]['network_prefix'].num_addresses - 4
    psa_range = resources['global_addresses'][k]
    labels = {
        'network': psa_range['network'],
        'project': psa_range['project_id'],
        'psa_range': psa_range['name']
    }

    yield TimeSeries('network/psa/addresses_available', max_ips, labels)
    yield TimeSeries('network/psa/addresses_used', v, labels)
    yield TimeSeries('network/psa/addresses_used_ratio',
                     0 if v == 0 else v / max_ips, labels)