File: collect.py

package info (click to toggle)
knot-resolver 6.0.17-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 16,376 kB
  • sloc: javascript: 42,732; ansic: 40,311; python: 12,580; cpp: 2,121; sh: 1,988; xml: 193; makefile: 181
file content (37 lines) | stat: -rw-r--r-- 1,409 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import logging
from typing import Dict, Optional

from knot_resolver.controller.interface import KresID
from knot_resolver.controller.registered_workers import command_registered_workers, get_registered_workers_kresids
from knot_resolver.datamodel import KresConfig
from knot_resolver.utils.modeling.parsing import DataFormat

logger = logging.getLogger(__name__)


async def collect_kresd_workers_metrics(config: KresConfig) -> Optional[Dict[KresID, object]]:
    if config.monitoring.metrics == "manager-only":
        logger.debug("Skipping kresd stat collection due to configuration")
        return None

    cmd = "collect_statistics()"
    if config.monitoring.metrics == "lazy":
        cmd = "collect_lazy_statistics()"
    logger.debug(f"Collecting stats from all kresd workers using method '{cmd}'")

    return await command_registered_workers(cmd)


async def report_json(config: KresConfig) -> bytes:
    metrics_raw = await collect_kresd_workers_metrics(config)
    metrics_dict: Dict[str, Optional[object]] = {}

    if metrics_raw:
        for kresd_id, kresd_metrics in metrics_raw.items():
            metrics_dict[str(kresd_id)] = kresd_metrics
    else:
        # if we have no metrics, return None for every kresd worker
        for kresd_id in get_registered_workers_kresids():
            metrics_dict[str(kresd_id)] = None

    return DataFormat.JSON.dict_dump(metrics_dict).encode()