Пример #1
0
 def setUp(self):
     super().setUp()
     self.metrics_definitions = [
         MetricDefinition('Histogram', 'sample_histogram',
                          'Sample histogram', []),
         MetricDefinition('Counter', 'sample_counter', 'Sample counter', [])
     ]
Пример #2
0
 def setUp(self):
     super().setUp()
     self.metrics_definitions = [
         MetricDefinition("Histogram", "sample_histogram",
                          "Sample histogram", []),
         MetricDefinition("Counter", "sample_counter", "Sample counter",
                          []),
     ]
Пример #3
0
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
Пример #4
0
    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"),
        )
Пример #5
0
    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'))
Пример #6
0
 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)
Пример #7
0
 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()
Пример #8
0
 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'))
Пример #9
0
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
Пример #10
0
    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'))
Пример #11
0
 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"),
     )
Пример #12
0
    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"),
        )
Пример #13
0
 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'))
Пример #14
0
 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"),
     )
Пример #15
0
# 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)
Пример #16
0
# 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)
Пример #17
0
"""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'],
Пример #18
0
    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']),
Пример #19
0
    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'),
Пример #20
0
    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",
Пример #21
0
    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,
Пример #22
0
    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,
    ),