Cara melanjutkan Graph Cacti ketika berganti Interface atau Device

Cari tahu nama filr rrd dari graph lama yang ingin dilanjutkan

Pergi ke menu Management > Graphs, klik Graph Lama yang ingin dilanjutkan lalu klik Edit Data Source

Salin nama rrd setelah <path_rra>/

Buat graph baru

Cari tahu nama file rrd dari graph baru yang ingin melanjutkan

Pergi ke menu Management > Graphs, klik Graph Lama yang ingin dilanjutkan lalu klik Edit Data Source

Salin nama rrd setelah <path_rra>/

SSH ke server cacti dan pergi ke web root directory cacti

cd /path/webroot/cacti

pergi ke directory rra

cd rra/

Salin rrd lama ke rrd baru

cp oldname.rrd newname.rrd 

Test dan monitoring graph yang baru dibuat apakah sudah memiliki data history dari graph lama.

Sampai tahap ini memindahkan graph lama ke graph baru sudah selesai

(Opsional) Selanjutnya silakan hapus graph lama (jika diperlukan)

Cara menggabungkan graph lama dengan graph baru

Jika kita sudah terlalu lama membuat graph baru dan ingin menggabungkan dengan graph lama caranya sebagai berikut:

Cari tahu nama file rrd graph lama dan file rrd graph baru, caranya sama dengan langkah diatas

Install paket python rrd

apt-get install python3-rrdtool -y

Cari tahun kapan tanggal dan jam cutoff (graph lama berhenti), lalu ubah kedalam format Unix Epoch Timestamp:

date -d "2026-08-03 23:30:00" +%s
# Hasil contoh: 1785774600

Buat script helper menggunakan python

nano /tmp/merge_rrd.py

Masukkan baris berikut:

#!/usr/bin/env python3
import sys
import os
import subprocess

def merge_rrds(old_rrd, new_rrd, out_rrd, cutoff_timestamp):
    print(f"[*] Mengonversi RRD ke XML...")
    old_xml = "/tmp/old_data.xml"
    new_xml = "/tmp/new_data.xml"
    out_xml = "/tmp/out_data.xml"

    # 1. Dump RRD ke XML
    subprocess.run(f"rrdtool dump {old_rrd} > {old_xml}", shell=True, check=True)
    subprocess.run(f"rrdtool dump {new_rrd} > {new_xml}", shell=True, check=True)

    print(f"[*] Memproses data XML dengan batas timestamp: {cutoff_timestamp}...")
    
    # 2. Baca kedua file XML
    with open(old_xml, 'r') as f:
        old_lines = f.readlines()
    with open(new_xml, 'r') as f:
        new_lines = f.readlines()

    # Ekstrak data historis MikroTik (sebelum cutoff)
    old_data_map = {}
    for line in old_lines:
        if '<row>' in line and '<v>' in line:
            # Format baris: <!-- YYYY-MM-DD HH:MM:SS WIT / 1726617600 --> <row><v> ... </v></row>
            if '<!--' in line and '-->' in line:
                try:
                    ts = int(line.split('/')[1].split('-->')[0].strip())
                    if ts <= cutoff_timestamp:
                        # Ambil tag <row> sampai </row>
                        row_content = line[line.find('<row>'):]
                        old_data_map[ts] = row_content
                except (IndexError, ValueError):
                    continue

    # 3. Timpa baris sebelum cutoff pada file XML baru dengan data lama MikroTik
    final_lines = []
    for line in new_lines:
        if '<row>' in line and '<v>' in line and '<!--' in line:
            try:
                ts = int(line.split('/')[1].split('-->')[0].strip())
                if ts <= cutoff_timestamp and ts in old_data_map:
                    # Ganti data RRD baru dengan data RRD lama MikroTik
                    comment_part = line[:line.find('<row>')]
                    line = comment_part + old_data_map[ts]
            except (IndexError, ValueError):
                pass
        final_lines.append(line)

    # 4. Tulis hasil ke XML akhir
    with open(out_xml, 'w') as f:
        f.writelines(final_lines)

    print(f"[*] Merestore XML ke file RRD baru: {out_rrd}...")
    # 5. Restore XML menjadi file RRD
    subprocess.run(f"rrdtool restore {out_xml} {out_rrd} -f", shell=True, check=True)

    # Bersihkan file temporary
    for tmp_file in [old_xml, new_xml, out_xml]:
        if os.path.exists(tmp_file):
            os.remove(tmp_file)

    print("[+] Proses penggabungan RRD selesai dengan sukses!")

if __name__ == "__main__":
    if len(sys.argv) < 5:
        print("Penggunaan: python3 merge_rrd.py <old_rrd> <new_rrd> <out_rrd> <cutoff_timestamp>")
        print("Contoh: python3 merge_rrd.py mikrotik.rrd bird.rrd combined.rrd 1726617600")
        sys.exit(1)

    old_rrd = sys.argv[1]
    new_rrd = sys.argv[2]
    out_rrd = sys.argv[3]
    cutoff = int(sys.argv[4])

    merge_rrds(old_rrd, new_rrd, out_rrd, cutoff)

Berikan izin eksekusi:

chmod +x /tmp/merge_rrd.py

Eksekusi script python yang telah dibuat dalam format berikut

python3 /tmp/merge_rrd.py \
  <path file rrd lama> \
  <path file rrd baru> \
  <path file output> \
  <tgl jam cutoff Unix Epoch>

Contoh:

python3 /tmp/merge_rrd.py \
  /path/webroot/cacti/rra/old.rrd \
  /path/webroot/cacti/rra/new.rrd \
  /tmp/output_combined.rrd \
  1785774600

Salin hasil output combined ke graph baru

cp /tmp/output_combined.rrd /path/webroot/cacti/rra/new.rrd