Monitoring — overview
Visibility into a running NomaUBL install splits across four surfaces — three in the web UI, one on the host. This page is the map: which surface answers which operational question, when to look where, what's missing and where to wire external monitoring.
| Surface | What it answers | Where |
|---|---|---|
| Tech Dashboard | Live KPIs — invoices processed today, in flight, failed; per-PA submission state; scheduler activity. | Application → Tech Dashboard (existing page). |
| Processing Log | Per-document trace — every step of every invoice, with the timing, the XSD/Schematron result, the PA call. | Management → Processing Log (existing page). |
| Service log file | The JVM's stderr / stdout — startup, configuration loading, scheduler ticks, database errors. | <APP_HOME>/nomaubl-<env>.log on the host. |
| HTTP endpoints | Machine-readable build info + license state. | /api/build-info and /api/license on the running service. |
The two web UI surfaces are the operator's view; the log file + endpoints are the infrastructure's view (load balancers, external monitoring, CI smoke tests).
When to look where
| Situation | Surface |
|---|---|
| "Did today's batch run successfully?" | Tech Dashboard — invoices processed today panel. |
| "What's the status of invoice #12345?" | Processing Log — search by document number. |
| "Why is invoice #12345 stuck?" | Processing Log — drill into the step trace. |
| "Why isn't the scheduler firing?" | Service log file — look for scheduler tick lines. |
| "Did the JVM crash?" | Service log file + ./nomaubl.sh status (Linux / macOS) or nomaubl.cmd status (Windows). |
| "Is the database reachable?" | Service log file — look for Connected to db-nomaubl on start. |
| "Is the PA reachable?" | Service log file — look for pa-default API call lines. |
| "Is the license still valid?" | curl /api/license — returns valid / expired / restricted. |
| "What version is running?" | curl /api/build-info — returns version + build timestamp. |
| "Did a process restart happen overnight?" | ./nomaubl.sh status / nomaubl.cmd status shows current PID; the log file shows the startup banner. |
The first two go through the UI; everything below goes through the CLI or a curl. The next page (Service and logs) walks the CLI side in detail.
Permissions
Visibility:
| Surface | Permission |
|---|---|
| Tech Dashboard | Available to every signed-in user — but the KPIs themselves respect each user's data filter (e.g. per-company scope). |
| Processing Log | Restricted to roles with the processing-log permission (typically operators + admins). |
| Service log file / endpoints | Available to anyone with SSH / RDP / HTTP access to the host. Restrict via the firewall and the reverse proxy — /api/build-info and /api/license are unauthenticated. |
The two unauthenticated HTTP endpoints don't leak secrets (no passwords, no tokens, only build metadata + license summary), but they do leak the version of NomaUBL you run. For public-facing installs, gate them behind the reverse proxy or your VPN if that matters.
At a glance
What NomaUBL does NOT expose
Knowing the gaps prevents misplaced searches:
| Missing | Where to get it instead |
|---|---|
Prometheus /metrics | Not built in. Scrape the host with node_exporter; mine the log file for application-level counters; or build a small JMX exporter on top of the JVM. |
| OpenTelemetry traces | Not built in. The processing pipeline emits structured per-step logs — pipe those into a log-based tracing system if you need waterfall views. |
| Per-request latency histograms | The Tech Dashboard surfaces aggregates; for percentiles + request-by-request, wire an APM in front of the reverse proxy. |
| Heap / GC stats | Standard JVM JMX — connect VisualVM or JConsole over JMX, or expose JMX via a JMX-to-Prometheus exporter. |
| Live database connection-pool metrics | NomaUBL uses a simple per-call connection model, not a pooled one. Connection count is a function of in-flight requests — observable through Oracle's V$SESSION or PostgreSQL's pg_stat_activity. |
Most external-monitoring needs reduce to: scrape the host with the standard tools, mine the log file, wire an APM upstream. The framework itself stays focused on the in-app surfaces.
Day-zero monitoring setup
A minimal "production-ready" monitoring posture for a single host install:
- Auto-start via systemd with
Restart=on-failure— see Service and systemd. - Log rotation with logrotate (
copytruncate) — same page. - Liveness probe from your load balancer / uptime monitor hitting
/api/build-infoevery 30 seconds. - License alert — a small script that hits
/api/licensedaily and pages ifvalid: false. - Log forwarding — pipe
nomaubl-<env>.logto your central log store (Loki, ELK, Datadog Logs). The framework writes plain stderr/stdout — every line-based log shipper picks it up. - Database monitoring — the engine's own tooling (Oracle:
V$SESSION, AWR; PostgreSQL:pg_stat_activity,pg_stat_statements; or whatever dashboards your DBA already runs).
Items 3, 4 and 5 are the cheap wins that catch 80% of production incidents.
What you actually do — quick map
| Goal | Read |
|---|---|
| Walk the Tech Dashboard cards. | Application → Tech Dashboard. |
| Investigate a stuck or failed invoice. | Management → Processing Log. |
Use the wrapper's status + log tailing for incidents (Linux or Windows). | Service and logs. |
| Wire external monitoring (LB probes, alerting, log forwarding). | Service and logs. |
What's next
- Service and logs — the CLI + endpoints layer in detail.
- Application → Tech Dashboard — the in-app live view.
- Management → Processing Log — per-document trace.