in blueprints/cloud-operations/network-quota-monitoring/src/plugins/series-subnets.py [0:0]
def timeseries(resources):
'Returns used/available/ratio timeseries for addresses by subnetwork.'
LOGGER.info('timeseries')
# return descriptors
for dtype, name in DESCRIPTOR_ATTRS.items():
yield MetricDescriptor(f'subnetwork/{dtype}', name,
('project', 'network', 'subnetwork', 'region'),
dtype.endswith('ratio'))
# aggregate per-resource counts in total per-subnet counts
subnet_nets = {
k: ipaddress.ip_network(v['cidr_range'])
for k, v in resources['subnetworks'].items()
}
# TODO: add counter functions for PSA
subnet_counts = {k: 0 for k in resources['subnetworks']}
counters = itertools.chain(_subnet_addresses(resources),
_subnet_forwarding_rules(resources, subnet_nets),
_subnet_instances(resources))
for subnet_self_link, count in counters:
subnet_counts[subnet_self_link] += count
# compute and return metrics
for subnet_self_link, count in subnet_counts.items():
max_ips = subnet_nets[subnet_self_link].num_addresses - 4
subnet = resources['subnetworks'][subnet_self_link]
labels = {
'network': resources['networks'][subnet['network']]['name'],
'project': subnet['project_id'],
'region': subnet['region'],
'subnetwork': subnet['name']
}
yield TimeSeries('subnetwork/addresses_available', max_ips, labels)
yield TimeSeries('subnetwork/addresses_used', count, labels)
yield TimeSeries('subnetwork/addresses_used_ratio',
0 if count == 0 else count / max_ips, labels)