Real-time monitoring and visualization of Ixia/Keysight IxOS chassis port utilization with parallel polling, time-series storage, and interactive dashboards.
Monitor multiple IxOS chassis simultaneously with real-time visibility into:
- Port Ownership - Track which user/session owns each port
- Link Status - Monitor port connectivity (up/down)
- Transmit State - Track traffic state (active/idle)
- Resource Utilization - View total, owned, and free ports
Key Benefits:
- β‘ Parallel polling - Monitor 10+ chassis in ~2 seconds
- π Time-series visualization - Historical analysis with Grafana
- π³ One-command deployment - Docker Compose for quick setup
- π Synchronized timestamps - Aligned data across all chassis
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β IxOS CHASSIS FLEET β
β [Chassis 1] βββ [Chassis 2] βββ ... βββ [Chassis N] β
β :8443 :8443 :8443 β
ββββββββββββββββββββββββββββββββ¬βββββββββββββββββββββββββββββββββββββββ
β REST API (Parallel Polling)
β
ββββββββββββββββββββββββββββββββΌβββββββββββββββββββββββββββββββββββββββ
β HOST MACHINE β
β ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ β
β β IxOS Poller (Python) β β
β β β’ portInfoPoller.py β Port metrics (InfluxDB) β β
β β β’ perfMetricsPoller.py β Performance metrics (Prometheus)β β
β β β’ Parallel polling with ThreadPoolExecutor β β
β ββββββββββββββββββββββ¬ββββββββββββββββββββ¬βββββββββββββββββββββ β
βββββββββββββββββββββββββΌββββββββββββββββββββΌββββββββββββββββββββββββββ
β β
HTTP :8086 β β HTTP :9001
β β
βββββββββββββββββββββββββΌββββββββββββββββββββΌββββββββββββββββββββββββββ
β DOCKER COMPOSE STACK β
β β
β ββββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ β
β β InfluxDB β β Prometheus β β Grafana β β
β β :8086 β β :9090 β β :3000 β β
β β β β β β β β
β β β’ Port metrics β β β’ Perf metrics β β β’ Dashboards β β
β β β’ Time-series DB β β β’ System health β β β’ Visualization β β
β β β’ Infinite store β β β’ 15d retention β β β’ Multi-source β β
β ββββββββββββββββββββ ββββββββββββββββββββ βββββββββββββββββββ β
β β
β π¦ Persistent Volumes: influxdb-data, prometheus-data, grafana-data β
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
Data Flow:
- Python poller queries all chassis in parallel (2-3s for 10+ chassis)
- Port metrics β InfluxDB | Performance metrics β Prometheus
- Grafana visualizes both data sources with synchronized timestamps
- β‘ Parallel Polling - ThreadPoolExecutor for simultaneous chassis queries
- π Synchronized Timestamps - Aligned data across all chassis
- π Dual Storage - InfluxDB (port data) + Prometheus (system metrics)
- π¨ Interactive Dashboards - State Timeline, Time Series, Gauges
- π³ Docker Compose - One-command infrastructure deployment
- π‘οΈ Health Monitoring - Automatic service health checks
- πΎ Persistent Storage - Data survives container restarts
- π§ Configurable - Environment-based configuration
- Docker 20.10+ & Docker Compose 2.0+
- Python 3.7+ with pip
- Network access to IxOS chassis (REST API enabled)
- 2GB free disk space
git clone https://github.com/yourusername/IxPortUtilizationPlotter.git
cd IxPortUtilizationPlotter
cp env.example .env.env file (TO start Docker services):
INFLUXDB_PORT=8086
PROMETHEUS_PORT=9090
GRAFANA_PORT=3000
# InfluxDB Configuration
INFLUXDB_ADMIN_USER=admin
INFLUXDB_ADMIN_PASSWORD=admin
INFLUXDB_ORG=keysight
INFLUXDB_BUCKET=ixosChassisStatistics
INFLUXDB_TOKEN='eegHpR9kkgxg5KG7rklj2zQI86-5z7yNETx0P0qQpSnw1owDxSL5IF-uQruOP-J8M_xmrhT3KWECh-QGbsdyYA=='
INFLUXDB_RETENTION=0 # 0 = infinite retention, or specify in seconds
# Grafana Configuration
GRAFANA_ADMIN_USER=admin
GRAFANA_ADMIN_PASSWORD=admin
INFLUXDB_TOKEN=<your-super-secret-token-change-me># Start Docker infrastructure (InfluxDB, Prometheus, Grafana)
docker compose up -d# Polling interval in seconds - This is for my influxDB to select metrics push intevals
POLLING_INTERVAL=120
# Polling interval in seconds - This is for my prometheus to select metrics push intevals
POLLING_INTERVAL_PERF_METRICS=110
CHASSIS_LIST = [
{"ip": "10.36.75.205", "username": "admin", "password": "admin"},
]
# Install Python dependencies
pip install -r requirements.txt
# Start pollers on host
chmod +x run_pollers.sh stop_pollers.sh
./run_pollers.sh| Service | URL | Credentials |
|---|---|---|
| Grafana | http://localhost:3000 | admin / admin |
| InfluxDB | http://localhost:8086 | admin / keysight12345 |
| Prometheus | http://localhost:9090 | No auth |
# View logs
docker compose logs -f # All services
docker compose logs -f influxdb # Specific service
tail -f portInfoPoller.log # Poller logs
# Control services
docker compose stop # Stop all
docker compose restart # Restart all
./stop_pollers.sh # Stop pollers
# Health checks
docker compose ps # Service status
curl http://localhost:8086/health # InfluxDB health
curl http://localhost:9090/-/healthy # Prometheus health| Document | Description |
|---|---|
| SOLUTION_DEPLOYMENT.md | Complete deployment guide with troubleshooting |
| ENVIRONMENT_VARIABLES.md | All environment variables reference |
| config.py | Chassis list and poller configuration |
| prometheus.yml | Prometheus scrape configuration |
| Issue | Solution |
|---|---|
| No data in Grafana | Verify INFLUXDB_TOKEN matches in .env and config.py |
| Connection timeout | Check chassis is reachable: ping <chassis_ip> |
| Port already in use | Customize ports in .env: INFLUXDB_PORT=8087 |
| Poller not starting | Check logs: tail -f portInfoPoller.log |
| Stale data in timeline | Add elapsed() filter to Flux query (see Common Queries) |
Detailed troubleshooting: See SOLUTION_DEPLOYMENT.md
Measurement: portUtilization
| Type | Name | Description | Example |
|---|---|---|---|
| Tags | chassis |
Chassis IP | 10.36.75.205 |
card |
Card number | 1 |
|
port |
Port number | 5 |
|
| Fields | owner |
Port owner | Free or user/session |
linkState |
Link status | linkUp, linkDown |
|
transmitState |
Traffic state | active, idle |
|
totalPorts |
Total ports | 48 |
|
ownedPorts |
Owned ports | 12 |
|
freePorts |
Available ports | 36 |
Parallel vs Sequential Polling:
| Chassis Count | Sequential | Parallel | Improvement |
|---|---|---|---|
| 1 chassis | 2s | 2s | 0% |
| 5 chassis | 10s | 2-3s | 70-80% |
| 10 chassis | 20s | 2-3s | 85-90% |
| 20 chassis | 40s | 3-4s | 90-92% |
IxPortUtilizationPlotter/
βββ π³ Docker Infrastructure
β βββ docker-compose.yml # Service orchestration
β βββ prometheus.yml # Prometheus config
β βββ grafana/provisioning/ # Auto-configured data sources
β
βββ π Python Pollers
β βββ portInfoPoller.py # Port metrics (InfluxDB)
β βββ perfMetricsPoller.py # Performance metrics (Prometheus)
β βββ influxDBclient.py # InfluxDB operations
β βββ IxOSRestAPICaller.py # IxOS REST API client
β βββ RestApi/ # Low-level REST interface
β
βββ βοΈ Configuration
β βββ .env # Docker environment vars
β βββ config.py # Chassis list & settings
β βββ requirements.txt # Python dependencies
β
βββ π Management Scripts
β βββ run_pollers.sh # Start pollers
β βββ stop_pollers.sh # Stop pollers
β
βββ π Documentation
βββ README.md # This file
βββ SOLUTION_DEPLOYMENT.md # Detailed deployment guide
βββ ENVIRONMENT_VARIABLES.md # Configuration reference
Features:
- π’ Green = Free ports (available)
- π΄ Red = Owned ports (user/session)
- π Synchronized timestamps across all chassis
- π Real-time updates with historical view
Visualization: Multiple chassis monitored simultaneously with instant visibility into port transitions and resource utilization.
Contributions welcome! Open an issue or submit a pull request.
Open source project for Keysight/Ixia IxOS chassis monitoring.
Built with β€οΈ for network test automation teams
π Happy Monitoring!
.png)
.png)