Question

Je travaille avec un grand tas de fichiers RRD, où je dois beaucoup interroger les données - et surtout en lisant toutes les données et en les transmettant.

Actuellement, j'utilise rrdtool fetch <filename> CF --start XXX --end YYY, mais comme il ne renvoie que des données pour un CF à la fois, je dois d'abord faire une requête séparée pour trouver les CF (= exécuter et analyser rrdtool info <filename>) puis courir rrdtool fetch Pour chaque Cf. La sortie est cependant triviale pour analyser.

Alternativement, il y a rrdtool xport DEF:XX=<filename>:RRA:CF ... XPORT:XX:XX ... avec plusieurs "ensembles" de ces dernières commandes pour chaque chose que je veux. À la hausse, cela peut me donner toutes les données en une seule fois, mais j'ai encore besoin d'avoir une assez bonne idée Quel Données que je veux au préalable. De plus, cela ne fait que cracher du XML (toujours un problème pour analyser).

J'ai le sentiment qu'il me manque quelque chose de très évident, car cela ne peut tout simplement pas être un si gros problème pour obtenir une liste d'horodatage → Les numéros d'un fichier ... des indices?

Était-ce utile?

La solution

Pendant que là sont des patchs autour Pour ajouter un soutien JSON, il n'y a actuellement aucun moyen de contourner:

  • Analyser au moins deux formats de sortie différents (rrdtool infoa ascii puis soit xml de rrdtool xport ou des données tabulaires de rrdtool fetch).
  • Vider l'intégralité du contenu du fichier en XML via rrdtool dump puis réimplémenter pas mal de librrdinternes.

Autres conseils

J'ai écrit un analyseur qui tourne la sortie de rrdtool info /tmp/pb_1_amp.rrd dans un réseau imbriqué. Donc de:

filename = "/tmp/pb_1_amp.rrd"
rrd_version = "0003"
step = 1800
last_update = 1372685403
header_size = 1208
ds[amp].index = 0
ds[amp].type = "GAUGE"
ds[amp].minimal_heartbeat = 3200
ds[amp].min = 0.0000000000e+00
ds[amp].max = 1.0000000000e+02
ds[amp].last_ds = "5.6"
ds[amp].value = 1.6800000000e+01
ds[amp].unknown_sec = 0
rra[0].cf = "AVERAGE"
rra[0].rows = 576
rra[0].cur_row = 385
rra[0].pdp_per_row = 1
rra[0].xff = 5.0000000000e-01
rra[0].cdp_prep[0].value = NaN
rra[0].cdp_prep[0].unknown_datapoints = 0
rra[1].cf = "AVERAGE"
rra[1].rows = 672
rra[1].cur_row = 159
rra[1].pdp_per_row = 6
rra[1].xff = 5.0000000000e-01
rra[1].cdp_prep[0].value = 1.6999833333e+01
rra[1].cdp_prep[0].unknown_datapoints = 0
rra[2].cf = "AVERAGE"
rra[2].rows = 732
rra[2].cur_row = 639
rra[2].pdp_per_row = 24
rra[2].xff = 5.0000000000e-01
rra[2].cdp_prep[0].value = 1.6999833333e+01
rra[2].cdp_prep[0].unknown_datapoints = 0
rra[3].cf = "AVERAGE"
rra[3].rows = 1460
rra[3].cur_row = 593
rra[3].pdp_per_row = 144
rra[3].xff = 5.0000000000e-01
rra[3].cdp_prep[0].value = 6.6083527778e+02
rra[3].cdp_prep[0].unknown_datapoints = 0

à:

Array
(
    [filename] => /tmp/pb_1_amp.rrd
    [rrd_version] => 0003
    [step] => 1800
    [last_update] => 1372685403
    [header_size] => 1208
    [ds] => Array
        (
            [amp] => Array
                (
                    [index] => 0
                    [type] => GAUGE
                    [minimal_heartbeat] => 3200
                    [min] => 0.0000000000e+00
                    [max] => 1.0000000000e+02
                    [last_ds] => 5.6
                    [value] => 1.6800000000e+01
                    [unknown_sec] => 0
                )

        )

    [rra] => Array
        (
            [0] => Array
                (
                    [cf] => AVERAGE
                    [rows] => 576
                    [cur_row] => 385
                    [pdp_per_row] => 1
                    [xff] => 5.0000000000e-01
                    [cdp_prep] => Array
                        (
                            [0] => Array
                                (
                                    [value] => NaN
                                    [unknown_datapoints] => 0
                                )

                        )

                )

            [1] => Array
                (
                    [cf] => AVERAGE
                    [rows] => 672
                    [cur_row] => 159
                    [pdp_per_row] => 6
                    [xff] => 5.0000000000e-01
                    [cdp_prep] => Array
                        (
                            [0] => Array
                                (
                                    [value] => 1.6999833333e+01
                                    [unknown_datapoints] => 0
                                )

                        )

                )

            [2] => Array
                (
                    [cf] => AVERAGE
                    [rows] => 732
                    [cur_row] => 639
                    [pdp_per_row] => 24
                    [xff] => 5.0000000000e-01
                    [cdp_prep] => Array
                        (
                            [0] => Array
                                (
                                    [value] => 1.6999833333e+01
                                    [unknown_datapoints] => 0
                                )

                        )

                )

            [3] => Array
                (
                    [cf] => AVERAGE
                    [rows] => 1460
                    [cur_row] => 593
                    [pdp_per_row] => 144
                    [xff] => 5.0000000000e-01
                    [cdp_prep] => Array
                        (
                            [0] => Array
                                (
                                    [value] => 6.6083527778e+02
                                    [unknown_datapoints] => 0
                                )

                        )

                )

        )

)

C'est en PHP mais il devrait être facile de porter à n'importe quelle autre langue. Voici le code:

$store = array();
foreach ($lines as $line) {
    list($raw_key, $raw_val) = explode(' = ', $line);

    $keys      = preg_split('/[\.\[\]]/', $raw_key, -1, PREG_SPLIT_NO_EMPTY);
    $key_count = count($keys);
    $pointer   = &$store;

    foreach ($keys as $key_num => $key) {
        if (!array_key_exists($key, $pointer)) {
            $pointer[$key] = array();
        }
        $pointer = &$pointer[$key];
        if ($key_num+1 === $key_count) {
            $pointer = trim($raw_val, '"');
        }
    }
}

Il suppose le rrdtool info La sortie est divisée par Newline (\n) et trouvé dans $lines. J'espère que cela t'aides.

Si vous voulez que la «table des matières» utilise rrdtool info, si vous voulez tout le contenu, utilisez rrdtool dump.

Mais ... pourquoi voudriez-vous cela?

Cheers Tobi

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top