def setUp(self): super().setUp() self.metrics_definitions = [ MetricDefinition('Histogram', 'sample_histogram', 'Sample histogram', []), MetricDefinition('Counter', 'sample_counter', 'Sample counter', []) ]
def setUp(self): super().setUp() self.metrics_definitions = [ MetricDefinition("Histogram", "sample_histogram", "Sample histogram", []), MetricDefinition("Counter", "sample_counter", "Sample counter", []), ]
def node_metrics_definitions(): """Return a list of MetricDefinitions for memory and cpu metrics.""" definitions = [ MetricDefinition('Gauge', 'maas_node_mem_{}'.format(field), 'Memory information field {}'.format(field), labels=['service_type']) for field in MEMINFO_FIELDS ] definitions.append( MetricDefinition('Counter', 'maas_node_cpu_time', 'CPU time', labels=['service_type', 'state'])) return definitions
def test_record_call_latency_sync(self): definitions = [ MetricDefinition("Histogram", "histo", "An histogram", ["foo", "bar"]) ] prometheus_metrics = PrometheusMetrics( definitions=definitions, registry=prometheus_client.CollectorRegistry(), ) label_call_args = [] def get_labels(*args, **kwargs): label_call_args.append((args, kwargs)) return {"foo": "FOO", "bar": "BAR"} @prometheus_metrics.record_call_latency("histo", get_labels=get_labels) def func(param1, param2=None): return param1 obj = object() result = func(obj, param2="baz") self.assertIs(result, obj) # the get_labels function is called with the same args as the function self.assertEqual(label_call_args, [((obj, ), {"param2": "baz"})]) self.assertIn( 'histo_count{bar="BAR",foo="FOO"} 1.0', prometheus_metrics.generate_latest().decode("ascii"), )
def test_record_call_latency_async(self): definitions = [ MetricDefinition('Histogram', 'histo', 'An histogram', ['foo', 'bar']) ] prometheus_metrics = PrometheusMetrics( definitions=definitions, registry=prometheus_client.CollectorRegistry()) label_call_args = [] def get_labels(*args, **kwargs): label_call_args.append((args, kwargs)) return {'foo': 'FOO', 'bar': 'BAR'} @prometheus_metrics.record_call_latency('histo', get_labels=get_labels) @inlineCallbacks def func(param1, param2=None): yield returnValue(param1) obj = object() result = yield func(obj, param2='baz') self.assertIs(result, obj) # the get_labels function is called with the same args as the function self.assertEqual(label_call_args, [((obj, ), {'param2': 'baz'})]) self.assertIn('histo_count{bar="BAR",foo="FOO"} 1.0', prometheus_metrics.generate_latest().decode('ascii'))
def test_register_atexit_global_registry(self): mock_register = self.patch(atexit, 'register') definitions = [ MetricDefinition('Gauge', 'a_gauge', 'A Gauge', ['foo', 'bar']) ] prometheus_metrics = PrometheusMetrics(definitions=definitions) mock_register.assert_called_once_with( prometheus_metrics._cleanup_metric_files)
def test_no_register_atexit_custom_registry(self): mock_register = self.patch(atexit, 'register') definitions = [ MetricDefinition('Gauge', 'a_gauge', 'A Gauge', ['foo', 'bar']) ] PrometheusMetrics(definitions=definitions, registry=prometheus_client.CollectorRegistry()) mock_register.assert_not_called()
def test_update_call_value_class(self): definitions = [MetricDefinition('Counter', 'a_counter', 'A Counter')] prometheus_metrics = PrometheusMetrics( definitions=definitions, registry=prometheus_client.CollectorRegistry()) prometheus_metrics.update('a_counter', 'set', value=22) self.assertIn('a_counter 22.0', prometheus_metrics.generate_latest().decode('ascii'))
def node_metrics_definitions(): """Return a list of MetricDefinitions for memory and cpu metrics.""" definitions = [ MetricDefinition( "Gauge", "maas_node_mem_{}".format(field), "Memory information field {}".format(field), labels=["service_type"], ) for field in MEMINFO_FIELDS ] definitions.append( MetricDefinition( "Counter", "maas_node_cpu_time", "CPU time", labels=["service_type", "state"], )) return definitions
def test_with_update_handlers(self): def update_gauge(metrics): metrics.update('a_gauge', 'set', value=33) prometheus_metrics = PrometheusMetrics( definitions=[MetricDefinition('Gauge', 'a_gauge', 'A Gauge', [])], update_handlers=[update_gauge], registry=prometheus_client.CollectorRegistry()) self.assertIn('a_gauge 33.0', prometheus_metrics.generate_latest().decode('ascii'))
def test_update_call_value_class(self): definitions = [MetricDefinition("Counter", "a_counter", "A Counter")] prometheus_metrics = PrometheusMetrics( definitions=definitions, registry=prometheus_client.CollectorRegistry(), ) prometheus_metrics.update("a_counter", "set", value=22) self.assertIn( "a_counter 22.0", prometheus_metrics.generate_latest().decode("ascii"), )
def test_with_update_handlers(self): def update_gauge(metrics): metrics.update("a_gauge", "set", value=33) prometheus_metrics = PrometheusMetrics( definitions=[MetricDefinition("Gauge", "a_gauge", "A Gauge", [])], update_handlers=[update_gauge], registry=prometheus_client.CollectorRegistry(), ) self.assertIn( "a_gauge 33.0", prometheus_metrics.generate_latest().decode("ascii"), )
def test_update(self): definitions = [ MetricDefinition('Gauge', 'a_gauge', 'A Gauge', ['foo', 'bar']) ] prometheus_metrics = PrometheusMetrics( definitions=definitions, registry=prometheus_client.CollectorRegistry()) prometheus_metrics.update('a_gauge', 'set', value=22, labels={ 'foo': 'FOO', 'bar': 'BAR' }) self.assertIn('a_gauge{bar="BAR",foo="FOO"} 22.0', prometheus_metrics.generate_latest().decode('ascii'))
def test_update(self): definitions = [ MetricDefinition("Gauge", "a_gauge", "A Gauge", ["foo", "bar"]) ] prometheus_metrics = PrometheusMetrics( definitions=definitions, registry=prometheus_client.CollectorRegistry(), ) prometheus_metrics.update("a_gauge", "set", value=22, labels={ "foo": "FOO", "bar": "BAR" }) self.assertIn( 'a_gauge{bar="BAR",foo="FOO"} 22.0', prometheus_metrics.generate_latest().decode("ascii"), )
# Copyright 2019 Canonical Ltd. This software is licensed under the # GNU Affero General Public License version 3 (see the file LICENSE). """Prometheus metrics.""" from provisioningserver.prometheus.utils import ( create_metrics, MetricDefinition, ) METRICS_DEFINITIONS = [ MetricDefinition('Histogram', 'maas_http_request_latency', 'HTTP request latency', ['method', 'path', 'status', 'op']), MetricDefinition('Histogram', 'maas_websocket_call_latency', 'Latency of a Websocket handler call', ['call']), ] PROMETHEUS_METRICS = create_metrics(METRICS_DEFINITIONS)
# Copyright 2019 Canonical Ltd. This software is licensed under the # GNU Affero General Public License version 3 (see the file LICENSE). """Prometheus metrics.""" from provisioningserver.prometheus.utils import ( create_metrics, MetricDefinition, ) METRICS_DEFINITIONS = [ MetricDefinition('Histogram', 'maas_http_request_latency', 'HTTP request latency', ['method', 'path', 'status']), ] PROMETHEUS_METRICS = create_metrics(METRICS_DEFINITIONS)
"""Prometheus metrics.""" from provisioningserver.prometheus.collectors import ( node_metrics_definitions, update_cpu_metrics, update_memory_metrics, ) from provisioningserver.prometheus.utils import ( create_metrics, MetricDefinition, ) from provisioningserver.utils.ipaddr import get_machine_default_gateway_ip METRICS_DEFINITIONS = [ # rackd metrics MetricDefinition('Histogram', 'maas_rack_region_rpc_call_latency', 'Latency of Rack-Region RPC call', ['call']), MetricDefinition('Histogram', 'maas_tftp_file_transfer_latency', 'Latency of TFTP file downloads', ['filename']), # regiond metrics MetricDefinition('Histogram', 'maas_http_request_latency', 'HTTP request latency', ['method', 'path', 'status', 'op']), MetricDefinition( 'Histogram', 'maas_http_response_size', 'HTTP response size', ['method', 'path', 'status', 'op'], buckets=[5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000]), MetricDefinition('Histogram', 'maas_http_request_query_count', 'HTTP request query count', ['method', 'path', 'status', 'op'],
prom_cli, PROMETHEUS_SUPPORTED, ) from provisioningserver.prometheus.utils import ( create_metrics, MetricDefinition, PrometheusMetrics, ) from twisted.application.internet import TimerService log = LegacyLogger() STATS_DEFINITIONS = [ MetricDefinition( 'Gauge', 'machine_status', 'Number of machines per status', ['status']), MetricDefinition( 'Gauge', 'nodes', 'Number of nodes per type (e.g. racks, machines, etc)', ['type']), MetricDefinition( 'Gauge', 'networks', 'General statistics for subnets', ['type']), MetricDefinition( 'Gauge', 'machine_resources', 'Amount of combined resources for all machines', ['resource']), MetricDefinition( 'Gauge', 'kvm_pods', 'General stats for KVM pods', ['type']),
prom_cli, PROMETHEUS_SUPPORTED, ) from provisioningserver.prometheus.utils import ( create_metrics, MetricDefinition, PrometheusMetrics, ) from twisted.application.internet import TimerService log = LegacyLogger() STATS_DEFINITIONS = [ MetricDefinition( 'Gauge', 'maas_machines', 'Number of machines by status', ['status']), MetricDefinition( 'Gauge', 'maas_nodes', 'Number of nodes per type (e.g. racks, machines, etc)', ['type']), MetricDefinition( 'Gauge', 'maas_net_spaces', 'Number of network spaces'), MetricDefinition( 'Gauge', 'maas_net_fabrics', 'Number of network fabrics'), MetricDefinition( 'Gauge', 'maas_net_vlans', 'Number of network VLANs'), MetricDefinition( 'Gauge', 'maas_net_subnets_v4', 'Number of IPv4 subnets'), MetricDefinition( 'Gauge', 'maas_net_subnets_v6', 'Number of IPv6 subnets'),
get_subnets_utilisation_stats, ) from maasserver.utils.orm import transactional from maasserver.utils.threads import deferToDatabase from provisioningserver.logger import LegacyLogger from provisioningserver.prometheus import prom_cli, PROMETHEUS_SUPPORTED from provisioningserver.prometheus.utils import ( create_metrics, MetricDefinition, PrometheusMetrics, ) log = LegacyLogger() STATS_DEFINITIONS = [ MetricDefinition("Gauge", "maas_machines", "Number of machines by status", ["status"]), MetricDefinition( "Gauge", "maas_nodes", "Number of nodes per type (e.g. racks, machines, etc)", ["type"], ), MetricDefinition("Gauge", "maas_net_spaces", "Number of network spaces"), MetricDefinition("Gauge", "maas_net_fabrics", "Number of network fabrics"), MetricDefinition("Gauge", "maas_net_vlans", "Number of network VLANs"), MetricDefinition("Gauge", "maas_net_subnets_v4", "Number of IPv4 subnets"), MetricDefinition("Gauge", "maas_net_subnets_v6", "Number of IPv6 subnets"), MetricDefinition( "Gauge", "maas_net_subnet_ip_count", "Number of IPs in a subnet by status",
node_metrics_definitions, update_cpu_metrics, update_memory_metrics, ) from provisioningserver.prometheus.utils import ( create_metrics, MetricDefinition, ) from provisioningserver.utils.ipaddr import get_machine_default_gateway_ip _HTTP_REQUEST_LABELS = ['method', 'path', 'status', 'op'] _WEBSOCKET_CALL_LABELS = ['call'] METRICS_DEFINITIONS = [ # rackd metrics MetricDefinition('Histogram', 'maas_rack_region_rpc_call_latency', 'Latency of Rack-Region RPC call', ['call']), MetricDefinition('Histogram', 'maas_tftp_file_transfer_latency', 'Latency of TFTP file downloads', ['filename']), # regiond metrics MetricDefinition('Histogram', 'maas_http_request_latency', 'HTTP request latency', _HTTP_REQUEST_LABELS), MetricDefinition( 'Histogram', 'maas_http_response_size', 'HTTP response size', _HTTP_REQUEST_LABELS, buckets=[5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000, 10000]), MetricDefinition('Histogram', 'maas_http_request_query_count', 'HTTP request query count', _HTTP_REQUEST_LABELS,
update_memory_metrics, ) from provisioningserver.prometheus.utils import ( create_metrics, MetricDefinition, ) from provisioningserver.utils.ipaddr import get_machine_default_gateway_ip _HTTP_REQUEST_LABELS = ["method", "path", "status", "op"] _WEBSOCKET_CALL_LABELS = ["call"] METRICS_DEFINITIONS = [ # rackd metrics MetricDefinition( "Histogram", "maas_rack_region_rpc_call_latency", "Latency of Rack-Region RPC call", ["call"], ), MetricDefinition( "Histogram", "maas_tftp_file_transfer_latency", "Latency of TFTP file downloads", ["filename"], ), # regiond metrics MetricDefinition( "Histogram", "maas_http_request_latency", "HTTP request latency", _HTTP_REQUEST_LABELS, ),