Metadata-Version: 2.4
Name: inferyx-monitoring
Version: 1.0.10
Summary: Monitor batch pipelines via API and email alerts — install and deploy on Linux servers from PyPI
Author-email: Inferyx DevOps <devops@inferyx.com>
License: Copyright (c) 2026 Inferyx. All rights reserved.
        
        Proprietary software. Unauthorized copying, distribution, or use is prohibited
        unless agreed in writing with Inferyx.
        
        For open-source release, replace this file with your chosen license (e.g. MIT, Apache-2.0)
        before publishing to public PyPI.
        
Project-URL: Homepage, https://github.com/inferyx/inferyx-devops
Project-URL: Repository, https://github.com/inferyx/inferyx-devops
Project-URL: Documentation, https://github.com/inferyx/inferyx-devops/tree/monitor
Keywords: batch,monitoring,pipeline,email,inferyx
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: System Administrators
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Operating System :: OS Independent
Classifier: Topic :: System :: Monitoring
Requires-Python: >=3.9
Description-Content-Type: text/markdown
License-File: LICENSE
Requires-Dist: pandas>=2.0.0
Requires-Dist: requests>=2.31.0
Requires-Dist: python-dateutil>=2.8.2
Provides-Extra: dev
Requires-Dist: build; extra == "dev"
Requires-Dist: twine; extra == "dev"
Requires-Dist: check-manifest; extra == "dev"
Dynamic: license-file

# inferyx-monitoring — Server deployment

Monitor batch jobs from CSV, poll status via API, and send email alerts for failures, missed runs, long-running jobs, and missing API data.

**Package:** `inferyx-monitoring`  
**CLI:** `inferyx-monitoring`

---

## Paths (default)

| Item | Path |
|------|------|
| Install directory | `/opt/pipeline-monitor` |
| Config | `/opt/pipeline-monitor/.env` |
| Batch list | `/opt/pipeline-monitor/jfl_batch.csv` |
| Log file | `/opt/pipeline-monitor/pipeline_script.log` |
| Python venv | `/opt/pipeline-monitor/venv` |
| Service user | `inferyx` |
| systemd unit | `inferyx-monitoring.service` |

---

## 1. Prerequisites

- Linux with **systemd** (Ubuntu 20.04+ / 22.04)
- **Python 3.9+**
- Outbound network to PyPI, SMTP, and your batch API
- `sudo` for systemd

```bash
sudo apt update
sudo apt install -y python3 python3-venv python3-pip
```

---

## 2. Install from PyPI

```bash
sudo useradd --system --home-dir /opt/pipeline-monitor --shell /usr/sbin/nologin inferyx || true
sudo mkdir -p /opt/pipeline-monitor
sudo chown inferyx:inferyx /opt/pipeline-monitor

sudo -u inferyx python3 -m venv /opt/pipeline-monitor/venv
sudo -u inferyx /opt/pipeline-monitor/venv/bin/pip install --upgrade pip inferyx-monitoring
```

Private index:

```bash
sudo -u inferyx /opt/pipeline-monitor/venv/bin/pip install inferyx-monitoring \
  --index-url https://your-private-pypi/simple/
```

---

## 3. Create config (first time)

```bash
cd /opt/pipeline-monitor
sudo -u inferyx /opt/pipeline-monitor/venv/bin/inferyx-monitoring --init-config --work-dir .
```

Creates `.env` and `jfl_batch.csv` **only if missing**.  
`pip install --upgrade` **never** overwrites your live `.env` or `jfl_batch.csv`.

Edit config:

```bash
sudo -u inferyx vi /opt/pipeline-monitor/.env
sudo -u inferyx vi /opt/pipeline-monitor/jfl_batch.csv
sudo chmod 600 /opt/pipeline-monitor/.env
```

### Required `.env` keys

| Variable | Description |
|----------|-------------|
| `PIPELINE_SMTP_HOST` | SMTP hostname |
| `PIPELINE_SMTP_PORT` | SMTP port (e.g. `587`) |
| `PIPELINE_SMTP_USERNAME` | SMTP login |
| `PIPELINE_FROM_NAME` | From display name |
| `PIPELINE_SMTP_PASSWORD` | SMTP password |
| `PIPELINE_MAIL_TO` | Alert recipients |
| `PIPELINE_API_BASE_URL` | Batch API URL (`{name}` placeholder allowed) |
| `PIPELINE_API_TOKEN` | API token |
| `PIPELINE_API_TOKEN_HEADER` | Token header (`token` or `Authorization`) |
| `PIPELINE_DEVOPS_EMAIL` | `no_data` / script-failure recipient |

Optional: `PIPELINE_MAIL_CC`, `PIPELINE_MAIL_SUBJECT_*`, `PIPELINE_MAIL_BODY_*`, `PIPELINE_MAIL_SIGNATURE`, `PIPELINE_SCHEDULE_GRACE_MINUTES`, `PIPELINE_CHECK_INTERVAL`. See `.env.example` after `--init-config`.

### `jfl_batch.csv` columns

| Column | Required | Notes |
|--------|----------|-------|
| `Name` | Yes | Batch name in API |
| `Frequency` | Yes | `Daily`, `Hourly`, `Monthly`, weekday name, etc. |
| `ExpectedStartTime` | Scheduled | e.g. `9:30`, `16:30:00`, `12:00,15:00,18:00` |
| `AvgExecutionTime` | Recommended | e.g. `10 mins`, `1 Hr` |
| `ExpectedDayOfMonth` | Monthly | Day 1–31 |
| `Status` | Optional | `Active` or `Suspended` (default: Active) |

Example:

```csv
Name,Frequency,ExpectedStartTime,AvgExecutionTime,ExpectedDayOfMonth,Status
ppl_example,Daily,9:30:00,"10 mins",,Active
```

---

## 4. Test

```bash
sudo -u inferyx /opt/pipeline-monitor/venv/bin/inferyx-monitoring \
  --once --work-dir /opt/pipeline-monitor

tail -100 /opt/pipeline-monitor/pipeline_script.log
```

---

## 5. systemd service

```bash
sudo tee /etc/systemd/system/inferyx-monitoring.service <<'EOF'
[Unit]
Description=Inferyx Pipeline Batch Monitor
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=inferyx
Group=inferyx
WorkingDirectory=/opt/pipeline-monitor
ExecStart=/opt/pipeline-monitor/venv/bin/inferyx-monitoring --work-dir /opt/pipeline-monitor
Restart=always
RestartSec=10
Environment=PYTHONUNBUFFERED=1
Environment=PIPELINE_ENV_FILE=/opt/pipeline-monitor/.env
Environment=PIPELINE_LOG_FILE=/opt/pipeline-monitor/pipeline_script.log

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now inferyx-monitoring.service
sudo systemctl status inferyx-monitoring.service
```

Logs: `sudo journalctl -u inferyx-monitoring.service -f`

---

## 6. Upgrade

```bash
sudo -u inferyx /opt/pipeline-monitor/venv/bin/pip install --upgrade inferyx-monitoring
sudo systemctl restart inferyx-monitoring.service
```

---

## 7. Cron (optional, instead of systemd)

```cron
* * * * * /opt/pipeline-monitor/venv/bin/inferyx-monitoring --once --work-dir /opt/pipeline-monitor >> /opt/pipeline-monitor/cron.log 2>&1
```

---

## Troubleshooting

| Symptom | Check |
|---------|--------|
| Service won't start | `journalctl -u inferyx-monitoring.service -n 50` |
| No email | SMTP credentials and firewall on port 587/465 |
| No API data | API URL, token, batch names in CSV |
| Missed alert timing | Use 24h time (`16:30:00`); `PIPELINE_SCHEDULE_GRACE_MINUTES` |
| Skip a batch | `Status=Suspended` in CSV |
