Test Failed
Push — develop ( 24eb6c...ad5e7f )
by Nicolas
02:52 queued 14s
created

glances.exports.glances_influxdb3.Export.init()   A

Complexity

Conditions 4

Size

Total Lines 25
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 4
eloc 18
nop 1
dl 0
loc 25
rs 9.5
c 0
b 0
f 0
1
#
2
# This file is part of Glances.
3
#
4
# SPDX-FileCopyrightText: 2025 Nicolas Hennion <[email protected]>
5
#
6
# SPDX-License-Identifier: LGPL-3.0-only
7
#
8
9
"""InfluxDB (for InfluxDB 3.x) interface class."""
10
11
import sys
12
from platform import node
13
14
from influxdb_client_3 import InfluxDBClient3
15
16
from glances.exports.export import GlancesExport
17
from glances.logger import logger
18
19
20
class Export(GlancesExport):
21
    """This class manages the InfluxDB export module."""
22
23
    def __init__(self, config=None, args=None):
24
        """Init the InfluxDB export IF."""
25
        super().__init__(config=config, args=args)
26
27
        # Mandatory configuration keys (additional to host and port)
28
        self.host = None
29
        self.port = None
30
        self.org = None
31
        self.database = None
32
        self.token = None
33
34
        # Optional configuration keys
35
        self.prefix = None
36
        self.tags = None
37
        self.hostname = None
38
39
        # Load the InfluxDB configuration file
40
        self.export_enable = self.load_conf(
41
            "influxdb3",
42
            mandatories=["host", "port", "org", "database", "token"],
43
            options=["prefix", "tags"],
44
        )
45
        if not self.export_enable:
46
            exit("Missing influxdb3 config")
47
48
        # The hostname is always add as a tag
49
        self.hostname = node().split(".")[0]
50
51
        # Init the InfluxDB client
52
        self.client = self.init()
53
54
    def init(self):
55
        """Init the connection to the InfluxDB server."""
56
        if not self.export_enable:
57
            return None
58
59
        try:
60
            db = InfluxDBClient3(
61
                host=self.host,
62
                org=self.org,
63
                database=self.database,
64
                token=self.token,
65
            )
66
        except Exception as e:
67
            logger.critical(f"Cannot connect to InfluxDB database '{self.database}' ({e})")
68
            sys.exit(2)
69
70
        if self.database == db._database:
71
            logger.info(
72
                f"Stats will be exported to InfluxDB server {self.host}:{self.port} in {self.database} database"
73
            )
74
        else:
75
            logger.critical(f"InfluxDB database '{self.database}' did not exist. Please create it")
76
            sys.exit(2)
77
78
        return db
79
80
    def export(self, name, columns, points):
81
        """Write the points to the InfluxDB server."""
82
        # Manage prefix
83
        if self.prefix is not None:
84
            name = self.prefix + "." + name
85
        # Write input to the InfluxDB database
86
        if not points:
87
            logger.debug(f"Cannot export empty {name} stats to InfluxDB")
88
        else:
89
            try:
90
                self.client.write(
91
                    record=self.normalize_for_influxdb(name, columns, points),
92
                    time_precision="s",
93
                )
94
            except Exception as e:
95
                # Log level set to warning instead of error (see: issue #1561)
96
                logger.warning(f"Cannot export {name} stats to InfluxDB ({e})")
97
            else:
98
                logger.debug(f"Export {name} stats to InfluxDB")
99