Monitor batch pipelines via API and email alerts — install and deploy on Linux servers from PyPI
Project description
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 |
Maintainer build docs: docs/DEVELOPMENT.md (not for server operators).
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.
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_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
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file inferyx_monitoring-1.0.57.tar.gz.
File metadata
- Download URL: inferyx_monitoring-1.0.57.tar.gz
- Upload date:
- Size: 188.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
82f8ad962a4c73c859918b4b4a9ba44875807779c780c1027c88b10d297ddd4c
|
|
| MD5 |
b0b7b3047f61e7259896819246738309
|
|
| BLAKE2b-256 |
fd47690486db9803b6502adb968c6d85ac4a66cf82c725c0d7e1ac0dcb3968d5
|
File details
Details for the file inferyx_monitoring-1.0.57-py3-none-any.whl.
File metadata
- Download URL: inferyx_monitoring-1.0.57-py3-none-any.whl
- Upload date:
- Size: 200.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d70615610f3f7e6f380a6f1dbff6841fa266ee2703ed2e8c1b919ec914ebd1df
|
|
| MD5 |
90533a62d65e2a0fe56ff65b57f85931
|
|
| BLAKE2b-256 |
8792454bd5b94abfb3971af01c85e35383461d8179ef98a095e62e91cdd9ac7b
|