Forum: PC-Programmierung rrdtool Datenbank erstellen


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Eduard I. (eiten)


Lesenswert?

Hallo zusammen,
ist schon eine ganze weile her, dass ich mit tobis rrdtool etwas gemacht 
habe, und bin wohl etwas eingerostet. Ich versuche aktuell die 
Festplattenaktivitäten aufzuzeichnen, mit folgendem Script (wird von 
cron jede Minute aufgerufen):
1
#!/usr/bin/env bash
2
path=/var/lib/rrd/disk_io
3
drivestat=$(iostat -o JSON)
4
timestamp=$(date +%s)
5
6
echo ${drivestat} | jq -c '.[].hosts.[]' | while read -r node; do
7
  nodename=$(echo ${node} | jq -r .nodename)
8
  echo ${node} | jq -c '.statistics.[].disk.[]' | while read -r drive; do
9
    name=$(echo ${drive} | jq -r .disk_device)
10
    filename=${path}/${nodename}_${name}.rrd
11
    kb_read=$(echo ${drive} | jq -r .kB_read)
12
    kb_wrtn=$(echo ${drive} | jq -r .kB_wrtn)
13
    if [ ! -f filename ]; then
14
      rrdcreate ${filename}       \
15
        --step=60s                \
16
        DS:read:GAUGE:90s:0:U     \
17
        DS:wrtn:GAUGE:90s:0:U     \
18
        RRA:AVERAGE:0.5:60s:14d   \
19
        RRA:MIN:0.5:60s:14d       \
20
        RRA:MAX:0.5:60s:14d       \
21
        RRA:AVERAGE:0.5:300s:62d  \
22
        RRA:MIN:0.5:300s:62d      \
23
        RRA:MAX:0.5:300s:62d      \
24
        RRA:AVERAGE:0.5:1h:366d   \
25
        RRA:MIN:0.5:1h:366d       \
26
        RRA:MAX:0.5:1h:366d       \
27
        RRA:AVERAGE:0.5:1d:3660d  \
28
        RRA:MIN:0.5:1d:3660d      \
29
        RRA:MAX:0.5:1d:3660d
30
    fi
31
    rrdupdate ${filename} ${timestamp}:$((${kb_read}*1024)):$((${kb_wrtn}*1024))
32
  done
33
done

Die Daten kommen auch in der rrd Datenbank an (siehe ds[read].last_ds 
und ds[wrtn].last_ds:
1
$ rrdtool info /var/lib/rrd/disk_io/server_sda.rrd
2
filename = "/var/lib/rrd/disk_io/server_sda.rrd"
3
rrd_version = "0003"
4
step = 60
5
last_update = 1731588631
6
header_size = 4064
7
ds[read].index = 0
8
ds[read].type = "GAUGE"
9
ds[read].minimal_heartbeat = 90
10
ds[read].min = 0.0000000000e+00
11
ds[read].max = NaN
12
ds[read].last_ds = "12205752320"
13
ds[read].value = 1.2205752320e+11
14
ds[read].unknown_sec = 21
15
ds[wrtn].index = 1
16
ds[wrtn].type = "GAUGE"
17
ds[wrtn].minimal_heartbeat = 90
18
ds[wrtn].min = 0.0000000000e+00
19
ds[wrtn].max = NaN
20
ds[wrtn].last_ds = "13989277696"
21
ds[wrtn].value = 1.3989277696e+11
22
ds[wrtn].unknown_sec = 21
23
rra[0].cf = "AVERAGE"
24
rra[0].rows = 20160
25
rra[0].cur_row = 14188
26
rra[0].pdp_per_row = 1
27
rra[0].xff = 5.0000000000e-01
28
rra[0].cdp_prep[0].value = NaN
29
rra[0].cdp_prep[0].unknown_datapoints = 0
30
rra[0].cdp_prep[1].value = NaN
31
rra[0].cdp_prep[1].unknown_datapoints = 0
32
rra[1].cf = "MIN"
33
rra[1].rows = 20160
34
rra[1].cur_row = 1277
35
rra[1].pdp_per_row = 1
36
rra[1].xff = 5.0000000000e-01
37
rra[1].cdp_prep[0].value = NaN
38
rra[1].cdp_prep[0].unknown_datapoints = 0
39
rra[1].cdp_prep[1].value = NaN
40
rra[1].cdp_prep[1].unknown_datapoints = 0
41
[...]

Allerdings kann ich keine Daten daraus fetchen:
1
$ rrdtool fetch /var/lib/rrd/disk_io/server_sda.rrd AVERAGE -s -10m
2
                           read                wrtn
3
4
1731588540: -nan -nan
5
1731588600: -nan -nan
6
1731588660: -nan -nan
7
1731588720: -nan -nan
8
1731588780: -nan -nan
9
1731588840: -nan -nan
10
1731588900: -nan -nan
11
1731588960: -nan -nan
12
1731589020: -nan -nan
13
1731589080: -nan -nan
14
1731589140: -nan -nan

Kann mir da mal jemdand auf die Sprünge helfen?

Danke, Edi

von Franko S. (frank_s866)


Lesenswert?

Eduard I. schrieb:
> Die Daten kommen auch in der rrd Datenbank an (siehe ds[read].last_ds
> und ds[wrtn].last_ds:$ rrdtool info /var/lib/rrd/disk_io/server_sda.rrd
> filename = "/var/lib/rrd/disk_io/server_sda.rrd"

Wenn ich einen rrdtool dump mache, stehen viele alte Werte (mit Datum 
vor der Erstellungszeit) mit NaN drinn.
Ich kenne mich mit dem Ding nicht aus aber soweit ich weiss ist das wie 
ein
Ringpuffer und wenn der halt noch nicht viele alte Werte hat dann kommt 
da bei AVERAGE eben NaN raus wenn 99% der Einträge aus NaN bestehen.

von Eduard I. (eiten)


Lesenswert?

Hallo Franko,

danke, ja, das ist mir schon klar. Allerdings ist ja die erste 
RRA-Definition AVERAGE über eine Minute.... das müsste doch schon nach 
ein paar Minuten im fetch was anzeigen?

von Andreas M. (amesser)


Lesenswert?

Sollte es nicht timestamp@value:value bei rrdupdate heißen?

von Eduard I. (eiten)


Lesenswert?


von Andreas M. (amesser)


Lesenswert?

Arg nee, meinen Beitrag einfach ignorieren.

von Andreas M. (amesser)


Lesenswert?

Mach doch mal einen kompletten Dump (rrddump) von der Datenbank 
vielleicht sieht man dort ja was.

: Bearbeitet durch User
von Eduard I. (eiten)


Lesenswert?

Leider nein, da ist bei den aktuellen Zeiten nichts drin:
1
                        <!-- 2024-11-14 16:07:00 CET / 1731596820 --> <row><v>NaN</v><v>NaN</v></row>
2
                        <!-- 2024-11-14 16:08:00 CET / 1731596880 --> <row><v>NaN</v><v>NaN</v></row>
3
                        <!-- 2024-11-14 16:09:00 CET / 1731596940 --> <row><v>NaN</v><v>NaN</v></row>
4
                        <!-- 2024-11-14 16:10:00 CET / 1731597000 --> <row><v>NaN</v><v>NaN</v></row>
5
                        <!-- 2024-11-14 16:11:00 CET / 1731597060 --> <row><v>NaN</v><v>NaN</v></row>
6
                        <!-- 2024-11-14 16:12:00 CET / 1731597120 --> <row><v>NaN</v><v>NaN</v></row>
7
                        <!-- 2024-11-14 16:13:00 CET / 1731597180 --> <row><v>NaN</v><v>NaN</v></row>
8
                        <!-- 2024-11-14 16:14:00 CET / 1731597240 --> <row><v>NaN</v><v>NaN</v></row>
9
                        <!-- 2024-11-14 16:15:00 CET / 1731597300 --> <row><v>NaN</v><v>NaN</v></row>
10
                        <!-- 2024-11-14 16:16:00 CET / 1731597360 --> <row><v>NaN</v><v>NaN</v></row>
11
                        <!-- 2024-11-14 16:17:00 CET / 1731597420 --> <row><v>NaN</v><v>NaN</v></row>
12
                        <!-- 2024-11-14 16:18:00 CET / 1731597480 --> <row><v>NaN</v><v>NaN</v></row>
13
                        <!-- 2024-11-14 16:19:00 CET / 1731597540 --> <row><v>NaN</v><v>NaN</v></row>
14
                        <!-- 2024-11-14 16:20:00 CET / 1731597600 --> <row><v>NaN</v><v>NaN</v></row>
15
                        <!-- 2024-11-14 16:21:00 CET / 1731597660 --> <row><v>NaN</v><v>NaN</v></row>
16
                        <!-- 2024-11-14 16:22:00 CET / 1731597720 --> <row><v>NaN</v><v>NaN</v></row>
17
                        <!-- 2024-11-14 16:23:00 CET / 1731597780 --> <row><v>NaN</v><v>NaN</v></row>
18
                        <!-- 2024-11-14 16:24:00 CET / 1731597840 --> <row><v>NaN</v><v>NaN</v></row>
19
                        <!-- 2024-11-14 16:25:00 CET / 1731597900 --> <row><v>NaN</v><v>NaN</v></row>
20
                        <!-- 2024-11-14 16:26:00 CET / 1731597960 --> <row><v>NaN</v><v>NaN</v></row>
21
                        <!-- 2024-11-14 16:27:00 CET / 1731598020 --> <row><v>NaN</v><v>NaN</v></row>

von Andreas M. (amesser)


Lesenswert?

Dann fällt mir nur noch ein "updatev" statt "update" zu benutzen und 
sich die Ausgabe anzuschauen.

von Franko S. (frank_s866)


Lesenswert?

Andreas M. schrieb:
> Dann fällt mir nur noch ein "updatev" statt "update" zu benutzen und
> sich die Ausgabe anzuschauen.

Da kommt immmer 0 zurück:
1
return_value = 0
2
return_value = 0
3
return_value = 0
4
return_value = 0
5
return_value = 0
6
return_value = 0
7
return_value = 0
8
return_value = 0
9
return_value = 0
10
return_value = 0
11
return_value = 0
12
return_value = 0

von Franko S. (frank_s866)


Lesenswert?

Eduard I. schrieb:
> if [ ! -f filename ]; then
Das muss $filename heissen, besser noch "$filename" dann geht es:

1731668940: -nan -nan
1731669000: -nan -nan
1731669060: -nan -nan
1731669120: -nan -nan
1731669180: -nan -nan
1731669240: -nan -nan
1731669300: 2,1665897131e+09 3,0228938752e+09
1731669360: 2,1666652160e+09 3,0416592213e+09
1731669420: 2,1666856960e+09 3,0590590293e+09
1731669480: 2,1667061760e+09 3,0697862485e+09
1731669540: -nan -nan

: Bearbeitet durch User
von Andreas M. (amesser)


Lesenswert?

Franko S. schrieb:
> Eduard I. schrieb:
>> if [ ! -f filename ]; then
> Das muss $filename heissen, besser noch "$filename" dann geht es:

Oha, die berühmten Tomaten auf den Augen.

von Eduard I. (eiten)


Lesenswert?

Franko S. schrieb:
> Das muss $filename heissen, besser noch "$filename" dann geht es:

DANKE!!!! Das wars! Die Dateien wurden jedes mal neu erstellt!

Der Vollständigkeit halber hier nochmals das komplette, funktionierende 
Skript:
1
#!/usr/bin/env bash
2
path=/var/lib/rrd/disk_io
3
drivestat=$(iostat -o JSON)
4
timestamp=$(date +%s)
5
6
echo ${drivestat} | jq -c '.[].hosts.[]' | while read -r node; do
7
  nodename=$(echo ${node} | jq -r .nodename)
8
  echo ${node} | jq -c '.statistics.[].disk.[]' | while read -r drive; do
9
    name=$(echo ${drive} | jq -r .disk_device)
10
    filename=${path}/${nodename}_${name}.rrd
11
    kb_read=$(echo ${drive} | jq -r .kB_read)
12
    kb_wrtn=$(echo ${drive} | jq -r .kB_wrtn)
13
    if [ ! -f "${filename}" ]; then
14
      rrdcreate ${filename}       \
15
        --step=60s                \
16
        DS:read:DERIVE:90s:0:U    \
17
        DS:wrtn:DERIVE:90s:0:U    \
18
        RRA:AVERAGE:0.5:60s:14d   \
19
        RRA:MIN:0.5:60s:14d       \
20
        RRA:MAX:0.5:60s:14d       \
21
        RRA:AVERAGE:0.5:300s:62d  \
22
        RRA:MIN:0.5:300s:62d      \
23
        RRA:MAX:0.5:300s:62d      \
24
        RRA:AVERAGE:0.5:1h:366d   \
25
        RRA:MIN:0.5:1h:366d       \
26
        RRA:MAX:0.5:1h:366d       \
27
        RRA:AVERAGE:0.5:1d:3660d  \
28
        RRA:MIN:0.5:1d:3660d      \
29
        RRA:MAX:0.5:1d:3660d
30
    fi
31
    rrdtool update "${filename}" ${timestamp}:$((${kb_read} * 1024)):$((${kb_wrtn} * 1024))
32
  done
33
done

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.