Ankündigung

Einklappen
Keine Ankündigung bisher.

rrd: ERROR: This RRD was created on another architecture

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    rrd: ERROR: This RRD was created on another architecture

    Hallo zusammen,

    ich versuche aktuell meine RRDs vom Wiregate in eine Docker-Umgebung (Synology) zu migrieren. Dabei bekomme ich immer Fehlermeldungen wenn ich versuche diese in der CV anzuzeigen. Auf dem WG läuft eine CV mit version 0.10.2.

    Wenn ich einen Docker Container mit 0.10.2 oder "testing" starte und die RRDs dort einbinde, bekomme ich den Error-Code 409 mit:
    Code:
    ERROR: This RRD was created on another architecture​
    Ich habe die RRDs mit scp direkt vom WG auf die Synology kopiert, aber anscheinend ist das nicht ausreichend. Muss ich die Files anders kopieren oder noch irgendwie konvertieren?

    Danke und VG
    Micha

    #2
    Da kann ich auch nur nach der Fehlermeldung googlen und da findet man diverse Hinweise, dass man das auf den Quellgerät exportieren und auf dem Zielgerät importieren soll. Der Export auf dem Wiregate dürfte wohl noch das kleinere Problem sein. Der Import auf dem Synology vermutlich schwieriger. Mangels Synology Gerät hab ich da keinerlei Erfahrungen. Wenn man da per SSH draufkommt und das RRD-Import Tool dort installieren kann, dann sollte es einfach gehen. Ansonsten evtl mit nem extra Docker Container, der das entsprechende Tool enthält und den man dann einmalig benutzt um die RRDs zu importieren?
    Gruß
    Tobias

    Kommentar


      #3
      Die RRDs haben ein Problem: die sind nicht für den Austausch zwischen Geräten gedacht und können daher nicht zwischen verschiedenen Architekturen wechseln. Beliebtes Problem ist z.B. ein Wechsel zwischen PC (x64) und RPi (ARM).
      Dafür sind die halt sehr effizient...

      Mögliche Lösungen:
      1. Auf der Start-Architektur die Daten in eine Text-Datei exportieren und auf der Ziel-Architektur importieren (Googlen sollte eine Anleitung bringen)
      2. Einfach auf die alten Daten verzichten und eine neue RRD starten
      3. Von RRD auf "was modernes" wie InfluxDB wechseln - entweder mit Migration (vgl. Lösung 1) oder einfach neu (vgl. Lösung 2)
      TS2, B.IQ, DALI, WireGate für 1wire so wie Server für Logik und als KNX Visu die CometVisu auf HomeCockpit Minor. - Bitte keine PNs, Fragen gehören in das Forum, damit jeder was von den Antworten hat!

      Kommentar


        #4
        Danke für die Infos!

        Zitat von Chris M. Beitrag anzeigen
        Mögliche Lösungen:
        1. Von RRD auf "was modernes" wie InfluxDB wechseln - entweder mit Migration (vgl. Lösung 1) oder einfach neu (vgl. Lösung 2)
        Tatsächlich bin ich dabei eine Migration umzusetzen. Da das tatsächlich nicht so ganz trivial ist, würde ich hier mein Vorgehen dokumentieren damit ich es später wieder finde und evtl auch anderen helfen kann. Und evtl kann jmd noch weitere Tipps/Verbesserungsvorschläge geben ;-)

        - Export auf Wiregate:
        Code:
        cd /var/www/rrd/
        rrdtool dump 28.5168DE030000_temp.rrd 28.5168DE030000_temp.xml
        -- hier fehlt noch das Script um einen Dump für alle RRDs zu erstellen​

        - XML Dump => Line Protocol
        -- Aus dem xml Dump muss man ein csv oder line Protocol file für den Import in die Influx-DB machen. Ich habe mich für das Line Protocol entschieden und mit Hilfe von Copilot folgendes Python Script erstellt:
        Code:
        import os
        from lxml import etree
        import re
        import math
        # Create a parser that includes comments
        parser = etree.XMLParser(remove_comments=False)
        # Get a list of all XML files in the "xml" directory
        xml_files = [f for f in os.listdir('xml') if f.endswith('.xml')]
        for xml_file in xml_files:
            # Parse XML file with the parser
            tree = etree.parse(os.path.join('xml', xml_file), parser)
            root = tree.getroot()
            # Initialize line count and file count
            line_count = 0
            file_count = 0
            # Open line protocol file for writing in the "line" directory
            filename = os.path.splitext(xml_file)[0]
            txtfile = open(os.path.join('line', f'{filename}_{file_count}.line.txt'), 'w', newline='\n')
          
            # Iterate over <row> elements within <database>
            for row in root.iter('row'):
                # Extract timestamp from comment
                comment = row.getprevious()
                if comment is not None:
                    comment = comment.text.strip()
                    match = re.search(r'/ (\d+)', comment)
                    if match is not None:
                        timestamp = match.group(1)
                        # Extract value
                        value = row.find('v').text.replace(',', '.')
                        # Convert timestamp and value to appropriate types
                        timestamp = int(timestamp)
                        # Convert timestamp to nanoseconds
                        timestamp *= 1000000000
                        # Check if value is a number
                        try:
                            value = float(value.strip(' "').replace(',', '.'))
                            value = round(value, 2)
                        except ValueError:
                            continue  # Skip this row if value is not a number
                        # Check if value is "nan"
                        if math.isnan(value):
                            continue  # Skip this row if value is "nan"
                        # Write line protocol
                        txtfile.write(f'{filename} value={value} {timestamp}\n')
                        # Increment line count
                        line_count += 1
                        # If 1000 lines have been written, close the current file and open a new one
                        if line_count == 75:
                            txtfile.close()
                            line_count = 0
                            file_count += 1
                            txtfile = open(os.path.join('line', f'{filename}_{file_count}.line.txt'), 'w', newline='\n')
        # Close the last output file if it's open
        if not txtfile.closed:
            txtfile.close()​
        -- das Script erwartet eine Menge von xml files in einem Ordner
        -- in dem Unterordner "line" werden dann die Line Protocol Files gespeichert
        -- durch ein Problem beim Import großer Files, erstelle ich mehrere kleine Line Protocol Files

        - Import in InfluxDB
        -- den Import übernimmt dann ein Shell Script:
        Code:
        #!/bin/bash
        # Check if directory is provided
        if [ -z "$1" ]
        then
            echo "No directory provided. Usage: ./$0 <directory>"
            exit 1
        fi
        # Directory containing the line protocol files
        dir="$1"
        touch errors.txt
        mkdir -p "$dir/_done"
        log_file="influx_write.log"
        err_file="influx_write.err"
        > "$log_file"
        > "$err_file"
        # Calculate total number of files
        total_files=$(ls -1 "$dir"/*.txt | wc -l)
        processed_files=0
        start_time=$(date +%s)
        # Iterate over all .txt files in the directory
        for file in "$dir"/*.txt
        do
          # Import the file into InfluxDB
          echo "Processing file: $file" | tee -a "$log_file"
          influx write --bucket test2 --file "$file" --rate-limit "1MB/s" --debug --skipRowOnError --errors-file errors.txt >> "$log_file" 2> "$err_file"
        
          mv "$file" "$dir/_done"
          ((processed_files++))
         
          current_time=$(date +%s)
          elapsed_time=$((current_time - start_time))
          avg_time_per_file=$(awk -v et="$elapsed_time" -v pf="$processed_files" 'BEGIN { print (et / pf) }')
          remaining_files=$((total_files - processed_files))
          estimated_remaining_time=$(awk -v atpf="$avg_time_per_file" -v rf="$remaining_files" 'BEGIN { print (atpf * rf) }')
          estimated_remaining_time=${estimated_remaining_time%.*}
          progress=$((100 * processed_files / total_files))
          echo "Progress: $progress%, Elapsed time: $elapsed_time seconds, Estimated remaining time: $estimated_remaining_time seconds" | tee -a "$log_file"
        done​
        -- das Script erwartet einen Command Line Parameter mit einem Verzeichnis in dem die Line Protocol Files liegen

        Mit meinen ersten Tests hat das soweit schon ganz gut funktioniert. Mal schauen wie es aussieht wenn ich dann alle RRDs migriere ...

        Danke und VG
        Micha

        Kommentar

        Lädt...
        X