inferyx-monitoring
Batch pipeline monitor with email alerts and Admin UI.
Install directory: /opt/pipeline-monitor
Admin URL: https://<your-host>/monitoring/admin/ (nginx required)
PyPI: inferyx-monitoring
Quick reference
| Task | Command |
|---|---|
| Fresh install | See Install from scratch |
| Upgrade | pip install --upgrade → release.sh upgrade --skip-pip |
| Uninstall | release.sh uninstall --skip-pip |
| Remove everything | release.sh uninstall --purge --skip-pip |
| Service status | sudo systemctl status inferyx-monitoring |
| Logs | sudo journalctl -u inferyx-monitoring -n 50 |
Deployment runbook (upgrade, rollback, health checks): docs/DEPLOYMENT.md
Maintainer build docs: docs/BUILD.md (not for server operators).
Visual steps (git only, not in the PyPI package): docs/html/index.html. Build is project setup, git check-in, then pip check-in. Deploy is install, upgrade, rollback, then uninstall. Property descriptions: docs/html/config.html.
Prerequisites
| Requirement | Notes |
|---|---|
| OS | Ubuntu 22.04+ (or Debian with apt) |
| Python | 3.10+ (python3, python3-venv) |
| User | inferyx system user (created by install script) |
| nginx | Reverse proxy for /monitoring/admin/ and /monitoring/api/ |
| Network | SMTP, Inferyx API, Google OAuth and/or AWS IDC SAML |
Install from scratch
Step 1 — Install Python package
Replace VERSION with the target release (e.g. 1.0.56):
export VERSION=1.0.56
export IM_HOME=/opt/pipeline-monitor
sudo mkdir -p "$IM_HOME"
sudo useradd --system --home-dir "$IM_HOME" --shell /usr/sbin/nologin inferyx 2>/dev/null || true
sudo -u inferyx python3 -m venv "$IM_HOME/.venv"
sudo -u inferyx "$IM_HOME/.venv/bin/pip" install --upgrade pip
sudo -u inferyx "$IM_HOME/.venv/bin/pip" install "inferyx-monitoring==${VERSION}"
Or from a local wheel:
sudo -u inferyx "$IM_HOME/.venv/bin/pip" install /path/to/inferyx_monitoring-${VERSION}-py3-none-any.whl
Step 2 — Run install script
sudo bash "$IM_HOME/.venv/share/inferyx-monitoring/release.sh" install --skip-pip
This creates:
| Path | Purpose |
|---|---|
/opt/pipeline-monitor/.env |
SMTP, API, alert settings |
/opt/pipeline-monitor/auth.policy |
Admin UI, OAuth, paths |
/opt/pipeline-monitor/batch_file.csv |
Batch schedules |
/opt/pipeline-monitor/secrets/ |
session_secret, OAuth secrets |
/opt/pipeline-monitor/www/ |
Admin UI static files |
/opt/pipeline-monitor/logs/ |
Monitor log |
inferyx-monitoring.service |
systemd unit |
Step 3 — Configure
sudo nano /opt/pipeline-monitor/.env
sudo nano /opt/pipeline-monitor/auth.policy
sudo nano /opt/pipeline-monitor/batch_file.csv
Required after install:
.env— SMTP,PIPELINE_API_BASE_URL,PIPELINE_API_TOKEN_HEADER, alert toggles (PIPELINE_ALERT_*)batch_file.csv— batch rows with a realTokenper batch (not in.env)auth.policy—ui.public_base_url, login providers, paths under/opt/pipeline-monitor
Secrets (never commit):
sudo mkdir -p /opt/pipeline-monitor/secrets
sudo openssl rand -hex 32 | sudo tee /opt/pipeline-monitor/secrets/session_secret
sudo chmod 600 /opt/pipeline-monitor/secrets/*
sudo chown -R inferyx:inferyx /opt/pipeline-monitor
.env templates: inferyx_pipeline_monitor/data/.env.example (in package: .venv/.../data/)
AWS IAM Identity Center (SAML 2.0)
Choose SAML 2.0 (not OAuth) when creating the AWS IDC application.
| AWS console field | auth.policy key |
Example |
|---|---|---|
| Application ACS URL | acs_url |
https://devops.inferyx.com/monitoring/api/auth/callback/aws_idc |
| Application SAML audience | entity_id |
https://devops.inferyx.com/monitoring |
| IAM Identity Center SAML issuer URL | idp_entity_id |
from IDC metadata |
| IAM Identity Center sign-in URL | idp_sso_url |
from IDC metadata |
| IDC certificate | idp_certificate_path |
/opt/pipeline-monitor/secrets/aws_idc_idp.crt |
"aws_idc": {
"enabled": true,
"entity_id": "https://devops.inferyx.com/monitoring",
"acs_url": "https://devops.inferyx.com/monitoring/api/auth/callback/aws_idc",
"idp_entity_id": "https://portal.sso.<region>.amazonaws.com/saml/assertion/<id>",
"idp_sso_url": "https://portal.sso.<region>.amazonaws.com/saml/assertion/<id>",
"idp_certificate_path": "/opt/pipeline-monitor/secrets/aws_idc_idp.crt",
"allowed_domains": ["inferyx.com"]
}
SP metadata (optional download for AWS setup):
https://devops.inferyx.com/monitoring/api/auth/saml/aws_idc/metadata
Google Workspace stays on OAuth 2.0 (auth.google).
Step 4 — nginx
sudo cp /opt/pipeline-monitor/.venv/share/inferyx-monitoring/nginx.conf.example \
/etc/nginx/sites-available/pipeline-monitor
sudo ln -sf /etc/nginx/sites-available/pipeline-monitor /etc/nginx/sites-enabled/
sudo nginx -t && sudo systemctl reload nginx
Edit server_name and SSL paths in the nginx file for production.
Step 5 — Verify
sudo systemctl status inferyx-monitoring
curl -s http://127.0.0.1:8090/api/health
curl -s http://127.0.0.1:8090/api/ui/status
Open https://<your-host>/monitoring/admin/ in a browser.
Upgrade
export VERSION=1.0.56 # new version
export IM_HOME=/opt/pipeline-monitor
sudo -u inferyx "$IM_HOME/.venv/bin/pip" install --upgrade "inferyx-monitoring==${VERSION}"
sudo bash "$IM_HOME/.venv/share/inferyx-monitoring/release.sh" upgrade --skip-pip
Upgrade without service restart:
sudo bash "$IM_HOME/.venv/share/inferyx-monitoring/release.sh" upgrade --skip-pip --no-restart
The upgrade script:
- Deploys new Admin UI to
/opt/pipeline-monitor/www/ - Merges new
.envkeys (existing values kept) - Migrates
batch_file.csvcolumns when needed (addsToken/Status; drops legacyAlert*CSV columns) - Updates systemd unit
- Restarts
inferyx-monitoringservice
Your config is never overwritten: .env secrets, batch_file.csv rows, and auth.policy values stay as-is unless you edit them.
Post-upgrade checklist (1.0.56+)
- Open Admin UI → Batch Data (or edit CSV) and set
Tokenfor each Active batch - In Application Settings /
.env, set alert toggles as needed (PIPELINE_ALERT_MISSED,_FAILED,_RUNNING,_NO_DATA) - Remove unused
PIPELINE_API_TOKEN=from.envif present (no longer used) - Confirm
PIPELINE_API_TOKEN_HEADERis still set (e.g.token) sudo systemctl status inferyx-monitoringand check logs if API calls fail
Uninstall / remove
Stop service, keep config
Keeps /opt/pipeline-monitor (.env, CSV, secrets, logs):
sudo bash /opt/pipeline-monitor/.venv/share/inferyx-monitoring/release.sh uninstall --skip-pip
Remove everything
Deletes /opt/pipeline-monitor entirely:
sudo bash /opt/pipeline-monitor/.venv/share/inferyx-monitoring/release.sh uninstall --purge --skip-pip
Manual cleanup (optional)
# nginx
sudo rm -f /etc/nginx/sites-enabled/pipeline-monitor
sudo rm -f /etc/nginx/sites-available/pipeline-monitor
sudo nginx -t && sudo systemctl reload nginx
# service user (only if nothing else uses it)
sudo userdel inferyx 2>/dev/null || true
Reinstall from scratch
After --purge, repeat Install from scratch.
Configuration files
| File | Template | Description |
|---|---|---|
.env |
data/.env.example |
SMTP, API base URL / token header, alert toggles |
batch_file.csv |
data/batch_file.csv.example |
Batch names, schedules, per-batch Token |
auth.policy |
release/auth.policy.example |
Admin UI, OAuth/SAML, file paths |
All paths in auth.policy should point under /opt/pipeline-monitor/ on the server.
Batch CSV
Required columns: Name, Frequency, Token
Optional: ExpectedStartTime, AvgExecutionTime, ExpectedDayOfMonth, Status (Active / Suspended)
API auth uses the Token column per batch (header name from PIPELINE_API_TOKEN_HEADER in .env). There is no global PIPELINE_API_TOKEN.
Frequency: Daily, Hourly, Monthly, Monday–Sunday, OnDemand, Continuous.
Use a weekday name for weekly jobs (do not use Weekly). For multiple runs per day, set several times in ExpectedStartTime.
Alert types are enabled/disabled globally in .env (Application Settings), not in the CSV:
| Variable | Controls | Default |
|---|---|---|
PIPELINE_ALERT_MISSED |
Did not start (missed) | true |
PIPELINE_ALERT_FAILED |
Failed status | true |
PIPELINE_ALERT_RUNNING |
Running too long / stuck | true |
PIPELINE_ALERT_NO_DATA |
API/auth lookup failure | true |
Scheduled (Daily, Hourly, Weekly, …)
Name,Frequency,ExpectedStartTime,AvgExecutionTime,ExpectedDayOfMonth,Token,Status
payroll_job,Daily,9:00:00,"30 mins",,YOUR_TOKEN,Active
Alerts: missed, failed, stuck, no_data (when enabled in .env)
On-demand (runtime trigger)
Name,Frequency,ExpectedStartTime,AvgExecutionTime,ExpectedDayOfMonth,Token,Status
manual_export,OnDemand,,"30 mins",,YOUR_TOKEN,Active
Use OnDemand (or Adhoc, Manual, Unscheduled). Leave start time empty.
AvgExecutionTime enables stuck alerts (API start + avg + grace).
Polling uses CHECK_WINDOW_MINUTES windows, not 24/7.
Continuous (always-on)
Name,Frequency,ExpectedStartTime,AvgExecutionTime,ExpectedDayOfMonth,Token,Status
stream_job,Continuous,,,,YOUR_TOKEN,Active
Alerts: failed and no_data only (when enabled in .env).
Alert tuning (.env)
Key variables (full list in .env.example):
| Variable | Default | Purpose |
|---|---|---|
PIPELINE_CHECK_MODE |
schedule_windows |
Poll in short windows vs continuous |
PIPELINE_CHECK_WINDOW_MINUTES |
10 |
Poll window length |
PIPELINE_SCHEDULE_GRACE_MINUTES |
5 |
Delay before missed/stuck alerts |
PIPELINE_ALERT_MISSED |
true |
Enable missed (did not start) alerts |
PIPELINE_ALERT_FAILED |
true |
Enable failed-status alerts |
PIPELINE_ALERT_RUNNING |
true |
Enable stuck / running-too-long alerts |
PIPELINE_ALERT_NO_DATA |
true |
Enable API/auth error alerts |
PIPELINE_AUDIT_RETENTION_DAYS |
30 |
Keep Activity History for N days; only older rows are deleted (0 = forever) |
PIPELINE_LOG_RETENTION_DAYS |
30 |
Rotate monitor.log daily; delete rotated files older than N days (0 = keep) |
PIPELINE_ALERT_ONCE_PER_DAY_ALL_SCENARIOS |
true |
One new email per issue per day |
PIPELINE_ALERT_REPLY_TO_THREAD |
false |
Follow-ups as reply-all in same thread |
Test email threading:
sudo -u inferyx /opt/pipeline-monitor/.venv/bin/inferyx-monitoring --test-mail-thread
Troubleshooting
| Symptom | Fix |
|---|---|
No such file ... release.sh |
Run pip install inferyx-monitoring first |
| Service restart loop | Check .env — journalctl -u inferyx-monitoring -n 50 |
nginx 404 on /monitoring/admin/ |
Use nginx.conf.example; check ui_base_path in auth.policy |
| Admin UI "Unavailable" | curl http://127.0.0.1:8090/api/ui/status |
| Missed vs no_data | Empty API after schedule → missed; API error → no_data |
| Batch API 401 / no_data | Set Token on that CSV row; check PIPELINE_API_TOKEN_HEADER |
| Alerts not sending | Check PIPELINE_ALERT_MISSED / _FAILED / _RUNNING / _NO_DATA in .env |
| OAuth / SAML login fails | Google: match redirect_uri. AWS IDC: use SAML 2.0; match acs_url / entity_id; check IdP cert file |
See CHANGELOG.md.
Service commands
sudo systemctl start inferyx-monitoring
sudo systemctl stop inferyx-monitoring
sudo systemctl restart inferyx-monitoring
sudo systemctl status inferyx-monitoring
sudo journalctl -u inferyx-monitoring -f
Or via package CLI:
sudo -u inferyx /opt/pipeline-monitor/.venv/bin/inferyx-monitoring-ctl status
sudo -u inferyx /opt/pipeline-monitor/.venv/bin/inferyx-monitoring-ctl restart
Metadata
Release files for inferyx-monitoring 1.1.51
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | Actions |
|---|---|---|---|---|
| inferyx_monitoring-1.1.51.tar.gz | 368.0 kB | Without provenance | Details for inferyx_monitoring-1.1.51.tar.gz |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Actions Reset |
|---|---|---|---|---|
| inferyx_monitoring-1.1.51-py3-none-any.whl | Python 3 | none | any | Details for inferyx_monitoring-1.1.51-py3-none-any.whl |
Total release size: 756.3 kB
Release files / inferyx_monitoring-1.1.51.tar.gz
| Download URL | inferyx_monitoring-1.1.51.tar.gz |
|---|---|
| Size | 368.0 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
685f6ef5291221d6f032d1d8cb0d0dc7bd73187320b8a5fb5b137b16aacf03b5
|
|
BLAKE2b-256 checksum How to use checksums |
66c9b9c7357017505f478c9336216a35b66fd5ed2a016bb1485165d6211c86fd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.16
|
Release files / inferyx_monitoring-1.1.51-py3-none-any.whl
| Download URL | inferyx_monitoring-1.1.51-py3-none-any.whl |
|---|---|
| Size | 388.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
f5935fc3703204dab4136b95d5d134dd70e6a315e17337170096b728b7152109
|
|
BLAKE2b-256 checksum How to use checksums |
08df72a57337600acdb7815a5dc182816e549eeef21e1edbe615be51b092e92b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.16
|
Security for inferyx-monitoring 1.1.51
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.
To learn more about protecting yourself from malicious actors, visit our package security documentation.