https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=43137

            Bug ID: 43137
           Summary: Add system health monitoring with status indicators in
                    the staff interface header
   Initiative type: ---
        Sponsorship ---
            status:
           Product: Koha
           Version: Main
          Hardware: All
                OS: All
            Status: NEW
          Severity: enhancement
          Priority: P5 - low
         Component: Architecture, internals, and plumbing
          Assignee: [email protected]
          Reporter: [email protected]
        QA Contact: [email protected]
  Target Milestone: ---

Koha depends on several services (search engine, background job workers, SFTP
endpoints) but provides no at-a-glance visibility into their health. Staff
discover problems only when operations fail -- a patron search returns nothing,
a batch job silently stops, or EDI transfers accumulate.

Proposed solution:

A system health framework that checks services, collects warnings and critical
messages, and surfaces a summary indicator in the staff interface header.

API response structure:

GET /api/v1/health

{
    "core": [
        {
            "id": "search_engine",
            "label": "Search engine",
            "warnings": [
                "Index koha_biblios last reindexed 3 days ago"
            ],
            "critical": [
                "Elasticsearch cluster is red: 2 shards unassigned"
            ]
        },
        {
            "id": "background_jobs",
            "label": "Background jobs",
            "warnings": [],
            "critical": []
        },
        {
            "id": "sftp",
            "label": "SFTP connections",
            "warnings": [
                "EDI vendor X: connection timeout on last attempt"
            ],
            "critical": []
        }
    ],
    "plugins": {}
}

- 'core' is an array of check results from Koha's own service checks
- 'plugins' is a hash keyed by plugin class -- populated by companion bug
(plugin hook)
- Each check has 'warnings' and 'critical' arrays of human-readable messages
- Empty arrays = healthy

Header indicator logic:

- Red: any 'critical' list is non-empty (core or plugins)
- Yellow: any 'warnings' list is non-empty, no criticals
- Green: all lists empty
- Click navigates to detail view (new tab in about.pl System information, or
standalone page)

Core health checks to implement initially:

- Search engine (Elasticsearch/Zebra): cluster/daemon reachability, index
staleness
- Background jobs: oldest pending job exceeds threshold (workers not picking
up), failed jobs accumulating
- SFTP connections: configured EDI/acquisition targets failing to connect

Architecture:

1. Health check classes (Koha::Health::SearchEngine,
Koha::Health::BackgroundJobs, Koha::Health::SFTP):
   - Each implements check() returning { id, label, warnings => [...], critical
=> [...] }
   - Checks must be cheap -- query local state only

2. API endpoint GET /api/v1/health:
   - Runs all core checks
   - Calls health_check plugin hook (see companion bug)
   - Caches the full assembled response (core + plugins) in Memcached with 30s
TTL
   - A single cache key serves all users since health status is global
   - 60 terminals polling every 60s = ~1 req/s; with 30s cache only 2 actual
check runs per minute
   - Permission-gated

3. Staff interface:
   - JS poller in header.inc, hits endpoint every 60s
   - Renders summary dot with tooltip showing count of warnings/criticals
   - Detail view groups checks by source (core section, then per-plugin
sections)

Display considerations:

- Detail view could be a new tab on about.pl alongside existing system
information
- Or a standalone page -- either way, should render core and plugin sections
grouped
- Healthy checks still appear (as OK) so staff can see what is being monitored

Caching:

The endpoint caches the full assembled response in Memcached with a 30s TTL. A
single cache key (koha:health) serves all users since health status is global
-- not per-user or per-branch. 60 staff terminals polling every 60s means
roughly 1 request per second on average. With a 30s cache, at most 2 actual
health check runs happen per minute regardless of terminal count. Cache is
TTL-based only -- no explicit invalidation needed since 30s staleness is
acceptable for a status dot.

-- 
You are receiving this mail because:
You are the assignee for the bug.
You are watching all bug changes.
_______________________________________________
Koha-bugs mailing list -- [email protected]
To unsubscribe send an email to [email protected]
website : http://www.koha-community.org/
git : http://git.koha-community.org/
bugs : http://bugs.koha-community.org/

Reply via email to