
How I pair-programmed with Google Antigravity powered by Gemini 4 Argon to build a zero-dependency Go TUI and OpenTelemetry/Prometheus observability stack for Oracle Databases and Linux SAN storage.
Managing enterprise Oracle RAC, Oracle Restart, and Single Instance databases over SSH often feels like juggling a dozen terminal tabs at 3:00 AM. You have sqlplus open in one window, crsctl status resource -t in another, lsnrctl status in a third, rman in a fourth, and multipath -ll or df -i in a fifth to figure out why a LUN path dropped or why ORA-09925: Unable to create audit trail file just locked out connections.
What if you had a single, zero-dependency binary that:
TUI) with full mouse support over SSH?AUTOEXTEND), Blocking Locks, ASM, RMAN, and Alert Logs, but also Linux Kernel parameters, HugePages, Filesystem Inodes, Fibre Channel HBAs, and SAN Multipath (multipath -ll)?OTLP JSON) & Prometheus (/metrics) Exporter on port 9161, complete with a 1-command Docker POC (Prometheus + 15 Alert Rules + 26-Panel Grafana Dashboard)?Meet ora-tui — and in this post, I’ll share how I built and evolved it from scratch to v1.6.0 using Google Antigravity powered by Gemini 4 Argon.
The entire lifecycle of ora-tui—from low-level Linux /proc and /sys/class/fc_host parsers to SQL*Plus pipe-delimited collectors, authentic 1990s VGA palettes, an embedded OpenTelemetry server, and automated RPM/DEB packaging—was built in Google Antigravity using Gemini 4 Argon.
What made the Antigravity + Gemini 4 Argon workflow stand out during this project:
AUTOEXTEND ON were showing misleading percentages, it immediately rewrote the SQL collector to compute real capacity against MAXBYTES. When we tested against a real RHEL 8 Oracle 19c server, it distinguished dynamic READY listener services (registered via PMON/LREG) from static UNKNOWN entries in listener.ora, and tightened the Alert Log parser to match strict ^ORA- lines while ignoring false positives from OPatch metadata.#0000AF Royal Blue, #00AFAF Teal, #5FFFFF Bright Cyan, #FFFF5F Bright Yellow, #A8A8A8 Silver menu bar) and recreated the exact look and feel—including a 1980s IBM 5151 Green Phosphor CRT theme with 100% full-width hardware inverse-video selection bars.GOOS=linux GOARCH=amd64 CGO_ENABLED=0), ran unit tests on real SQL*Plus and multipath -ll outputs, packaged .rpm and .deb installers via nfpm, and built a complete auto-provisioned Prometheus + Grafana Docker POC.Here is what ora-tui looks like right in your terminal (ora-tui --preview):
╔══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
║ ══ NORTON COMMANDER ORA-TUI v1.6.0 :: ORACLE CLUSTER, DB & SERVER MANAGER ══ ║
╠══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╣
║ Modo: [ORACLE RAC] │ Host: ora-rac01.corp.local │ Cluster: crs-prod-cluster │ Ver: 19.24.0.0.0 │ Tema: NORTON ║
║ HOME: /u01/app/oracle/product/19.0.0/dbhome_1 (oracle) │ 2 Inst OPEN │ 4 PDBs │ 4 Sesiones (1 Locks) │ 1 Errores ORA-║
╠═════════════════════════════╦════════════════════════════════════════════════════════════════════════════════════════╣
║ MENU [Flechas ↑↓ + Enter] ║ PANTALLA ACTIVA: VISTA INTEGRAL + VENTANA EMERGENTE (Borde Simple ┌─┐ y Doble ╔═╗) ║
╠═════════════════════════════╬════════════════════════════════════════════════════════════════════════════════════════╣
║ ▸ 1. Cluster & DB Estado ║ ┌─ NODOS DEL CLUSTER & INSTANCIAS (ORACLE RAC / SINGLE) ─────────────────────────────┐ ║
║ 2. Usuarios Conectados ║ │ NODO ESTADO CRS CSSD ASM INST MODO FRA_USO │ ║
║ 3. Tablespaces & Files ║ │ ora-rac01 ONLINE ONLINE ONLINE ONLINE(+ASM1) PRODCDB1 READ WRITE [████░░░░]│ ║
║ 4. Tablas & Objetos ║ │ ora-rac02 ONLINE ONLINE ONLINE ONLINE(+ASM2) PRODCDB2 READ WRITE [████░░░░]│ ║
║ 5. ASM & Red Listeners ║ └────────────────────────────────────────────────────────────────────────────────────┘ ║
║ 6. RMAN, Flashback & DG ║ ┌─ USUARIOS CONECTADOS (gv$session) ───────────┬─ TABLESPACES & SAN MULTIPATH ───────┐ ║
║ 7. Alert Log & Errores ║ │ SID,SER# USUARIO ESTADO EVENTO / LOCK │ RECURSO ESTADO / USO % │ ║
║ 8. Servidor, Discos & SAN ║ │ 142,48219 ERP_APP ACTIVE db file seq rd │ ERP_DATA_TBS [█████████░] 93.0% !! │ ║
║ 9. Centro Mantenimiento ║ │ 289,11042 CRM_BATCH ACTIVE enq: TX lock │ mpatha (ASM) 4/4 PATHS ACTIVE (OK) │ ║
║ c. Cambiar Tema Color ║ │ 512,9931 CRM_ADMIN INACT BLOCKER (289) │ mpathc (FRA) 3/4 DEGRADED (FAULTY) │ ║
║ b. Cambiar Marcos ┌─┐/╔═╗ ║ │ 604,33105 BI_REPORT ACTIVE ON CPU (512MB) │ /u01 Inodos 14.2% (Libre ORA-9925)│ ║
║ F1/h. Mostrar/Ocultar Ayu ║ └──────────────────────────────────────────────┴─────────────────────────────────────┘ ║
║ t. Cambiar Topologia ║ ║
║ q. Salir (Quit) ║ ╔══════════════════════════════════════════════════════════════════════════╗ ║
║ ║ ║ ══ VENTANA DE MANTENIMIENTO [Seleccione con Flechas ↑↓ + Enter] ══ ║ ║
║ ║ ╠══════════════════════════════════════════════════════════════════════════╣ ║
║ ║ ║ ▸ [1] Drenar / Aislar Nodo Cluster (Relocate Services + Stop CRS) ║ ║
║ ║ ║ [2] Parar / Arrancar Instancia o Base de Datos (srvctl / sqlplus) ║ ║
║ ║ ║ [3] Ampliar Tablespace Crítico (+Datafile 32G a ERP_DATA_TBS 93%) ║ ║
║ ║ ║ [4] Matar Sesión Bloqueante (KILL SESSION '512,9931,@2' IMMEDIATE) ║ ║
║ ║ ║ [5] Auditoría Completa SAN Multipath (multipath -ll) & HBA FC ║ ║
║ ║ ║ [Esc] Cancelar / Cerrar Ventana ║ ║
║ ║ ╚══════════════════════════════════════════════════════════════════════════╝ ║
╠═════════════════════════════╩════════════════════════════════════════════════════════════════════════════════════════╣
║ ┌─ C:\ORACLE> CONSOLA MS-DOS & AUDITORIA EN VIVO ──────────────────────────────────────────────────────────────────┐ ║
║ │ C:\> [08:05:01] Auto-Discovery: Modo=ORACLE RAC │ Cluster=crs-prod-cluster │ Release=19.24.0.0.0 │ ║
║ │ C:\> [08:05:02] ALERTA SAN: mpathc presenta 1 camino caído (3/4 DEGRADED) │ Tablespace ERP_DATA_TBS al 93.0% │ ║
║ └──────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘ ║
╚══════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝
c key)Pressing c at any time cycles through four themes on the fly:
#0000AF Royal Blue panels, #5FFFFF Bright Cyan borders, #FFFF5F Bright Yellow column headers, #00AFAF Teal cursor bar, and a black MS-DOS C:\ORACLE> bottom console.#A8A8A8) top menu bar with the red [≡] system icon, Royal Blue editor window with double white frames, green active selection bar, and the classic Teal (#00AFAF) Project: bottom window.#001000 phosphor background with glowing #00FF5F text and 100% full-row hardware inverse video on selected items.CGO_ENABLED=0One of the biggest pain points of deploying Go tools on Oracle Linux / RHEL database servers is C library dependencies (glibc mismatches or missing libclntsh.so Instant Client libraries).
ora-tui is compiled with CGO_ENABLED=0:
/etc/oracle/ocr.loc, /etc/oracle/olr.loc, /etc/oratab, inventory.xml, and /proc/[0-9]*/cmdline (ora_pmon_*, db_pmon_*, asm_pmon_*) to detect whether the host is Oracle RAC, Oracle Restart, or Single Instance (from 11gR2 up to 23ai).grid, RDBMS binaries belong to oracle, and clusterware stack commands require root. ora-tui inspects directory ownership via os.Stat and dynamically switches UID/GID (syscall.Credential / sudo -n -u) for sqlplus, srvctl, lsnrctl, rman, and adrci, reserving root strictly for crsctl or SCSI bus rescans.↑/↓/PgUp/PgDn) displaying the complete multi-line command output in real time.olsnodes), Daemons (CRS, CSSD, EVMD, ASM), Instances (gv$instance), PDBs (gv$pdbs), RAC Services, and a 4-step Graceful Node Drain wizard.gv$session): Active/inactive sessions, wait events, SQL_ID, PGA memory usage, TX/TM blocking lock chains, KILL SESSION IMMEDIATE, and live DBMS_XPLAN execution plans.AUTOEXTEND MAXBYTES, visual progress bars, and 1-click datafile addition.FRESH/STALE optimizer statistics, online table shrink (SHRINK SPACE CASCADE), index rebuilds, and UTL_RECOMP invalid object compilation.USABLE_FILE_MB, OFFLINE_DISKS) and local/SCAN listeners distinguishing READY (dynamic PMON/LREG) from UNKNOWN (listener.ora static) handlers.MRP0 + Transport/Apply Lag monitoring.ORA- Errors: Real-time alert_<SID>.log parser and ADRCI trace purge workflows.Module 8):
1m/5m/15m) vs CPU cores, Physical RAM, Swap & vm.swappiness, Static HugePages (2MB), verification that Transparent HugePages = [never], Kernel Async I/O slots (fs.aio-nr / fs.aio-max-nr), and File Descriptors (fs.file-nr).df -PTm & df -Pi): Space and Inode usage % across /u01, /, /var, /tmp to prevent dreaded ORA-09925 lockouts caused by millions of .aud/.trc files.multipath -ll) & Fibre Channel HBAs: Verifies that all physical SAN paths for every LUN are active (4/4 ACTIVE) and immediately flags degraded LUNs (3/4 DEGRADED - FAULTY), checks /sys/class/fc_host/host* HBA speed/state (16G/32G Online), and provides live SCSI/Multipath rescanning.--opentelemetry) + 1-Command Docker POCWant 24/7 historical graphs and alerting without installing heavy Java agents? Start ora-tui with --opentelemetry (or run it as a background systemd service via ora-tui-otel.service):
# Run in headless daemon mode on port 9161 (conflict-free with Oracle ports):
sudo ora-tui --opentelemetry --daemon --otel-port=9161
# Or enable the bundled systemd service:
sudo systemctl enable --now ora-tui-otel
It exposes 52 metrics across:
http://<oracle-host>:9161/metrics — Prometheus / OpenMetrics formathttp://<oracle-host>:9161/otel/v1/metrics — OpenTelemetry OTLP/HTTP JSON (resourceMetrics)http://<oracle-host>:9161/api/v1/state — Full JSON State SnapshotPOC/ Folder on Any Docker HostInside the repository (and packaged under /usr/share/ora-tui/POC/), we included a self-contained POC/ folder with an interactive setup script (./configure-poc.sh).
Every time you run ./configure-poc.sh on your Docker server, it prompts for the Oracle hostname or IP you want to monitor, configures Prometheus with 15 Oracle & SAN alert rules, checks connectivity, and launches Grafana with a 26-panel Full Observability Dashboard automatically loaded as the Home screen:
git clone https://github.com/mario-ezquerro/oratui.git
cd oratui/POC
chmod +x configure-poc.sh
./configure-poc.sh
==========================================================================
CONFIGURACIÓN DE LA POC ORA-TUI (PROMETHEUS + GRAFANA)
==========================================================================
👉 Introduce el nombre o IP del host Oracle a monitorizar [servidor-oracle.local]: 192.168.1.50
👉 Introduce el puerto OpenTelemetry de ora-tui [9161]: 9161
>>> Generando configuración de Prometheus para monitorizar: 192.168.1.50:9161 ...
>>> Verificando conexión con http://192.168.1.50:9161/healthz ...
[OK] Conexión exitosa con ora-tui en 192.168.1.50:9161.
>>> Levantando / recargando contenedores Docker (Prometheus + Grafana)...
Open http://<docker-host>:3000 (admin / admin) and all 26 panels—covering Clusterware, Instances, FRA %, PDBs, Tablespaces, ASM Diskgroups, Active/Blocking Sessions, PGA Memory, RMAN Backups, Data Guard Lag, ORA- Alert Log errors, Linux Load/RAM/HugePages, Filesystem Inodes, and SAN Multipath health—are live out of the box!
dnf, rpm, apt-get, or --mock Mode)You can install the prebuilt .rpm or .deb directly from GitHub, or test it on macOS/Linux without an Oracle database using --mock:
# RHEL / Oracle Linux 8 & 9:
sudo dnf install -y https://github.com/mario-ezquerro/oratui/raw/main/dist/ora-tui-1.6.0-1.x86_64.rpm
# Debian / Ubuntu:
curl -fL -o /tmp/ora-tui.deb https://github.com/mario-ezquerro/oratui/raw/main/dist/ora-tui_1.6.0-1_amd64.deb
sudo apt-get install -y /tmp/ora-tui.deb
# Or run the interactive simulator anywhere from source:
git clone https://github.com/mario-ezquerro/oratui.git
cd oratui
make mock
🔗 GitHub Repository: https://github.com/mario-ezquerro/oratui
Have questions or ideas for new Oracle / SAN checks? Drop a comment below or open an issue on GitHub!
discussTL;DR Welcome back to Dev Opportunity Radar! This is a weekly series where I share opportunities,...
devchallengeWe are so excited to announce the winners of the Hacktoberfest Open-Source AI Challenge: Touch...
googlecloudHow I designed, connected, scaled, governed, evaluated, and QLoRA fine-tuned an enterprise SecOps & FinOps agent on Google Cloud.
gemmaYes. Speculative decoding with Google's 59 MB QAT multi-token prediction (MTP) drafters speeds up Gemma 4 E4B 1.72x and E2B 1.40x on an 8 GB RTX 3050, and 1.49x and 1.18x on a 4 GB laptop GTX 1650 Ti, served by llama.cpp one request at a time, with unchanged GSM8K and BFCL scores.
nvidiaThe same Tesla T4 on the same Google Cloud VM decoded Gemma 4 E2B at 115 tokens/s at 45 °C and 107 at 77 °C. The card sits at its 70 W limit, a hotter chip draws more power at the same clock, so the clock drops. No thermal throttle fires, and no spec sheet mentions it.
duckdbServerless DuckDB on Google Cloud, in your own project. Files on GCS, tables in BigQuery (read and write), what I measured, and what I learned.
Workflows from the Neura Market marketplace related to this DeepSeek resource