diff --git a/cluster/platform/pure-exporter/DEPLOYMENT-SUMMARY.md b/cluster/platform/pure-exporter/DEPLOYMENT-SUMMARY.md new file mode 100644 index 0000000..6c29ed1 --- /dev/null +++ b/cluster/platform/pure-exporter/DEPLOYMENT-SUMMARY.md @@ -0,0 +1,155 @@ +# Pure FlashArray OpenMetrics Exporter - Deployment Summary + +**Deployment Date:** 2026-06-19 +**Status:** ✅ Successfully Deployed +**Namespace:** monitoring +**Array:** utilidor.local.mk-labs.cloud (10.1.71.5) + +## What Was Deployed + +### 1. **Container Deployment** +- **Image:** `quay.io/purestorage/pure-fa-om-exporter:v1.0.27` (latest stable) +- **Port:** 9490 (standard exporter port) +- **Resources:** 50m CPU / 64Mi memory (requests), 200m CPU / 128Mi memory (limits) +- **Health Checks:** Liveness and readiness probes on / endpoint +- **Security:** Running as non-root user (65534) + +### 2. **Secret Configuration** +- **Secret Name:** `pure-fa-exporter-token` +- **Contains:** tokens.yaml with FlashArray endpoint and API token +- **Array ID:** utilidor +- **Endpoint:** utilidor.local.mk-labs.cloud +- **API Token:** 6157dea0-4c0d-b14b-6e6a-453aa649355d (jarvis readonly user) + +### 3. **Service** +- **Type:** ClusterIP (east/west traffic only) +- **Port:** 9490 +- **Selector:** app.kubernetes.io/name=pure-fa-exporter + +### 4. **ServiceMonitor** +- **Scrape Interval:** 60s (storage metrics low frequency) +- **Scrape Timeout:** 30s +- **Path:** /metrics?endpoint=utilidor +- **Label Selector:** release=monitoring (for kube-prometheus-stack) +- **Relabeling:** Adds 'array' label from endpoint parameter + +### 5. **ArgoCD Application** +- **Wave:** 3 (monitoring infrastructure) +- **Sync Policy:** Automated with prune and self-heal +- **Source:** cluster/platform/pure-exporter/ +- **Health:** ✅ Healthy +- **Sync Status:** ✅ Synced + +## Verification Results + +### ✅ Pod Status +``` +NAME READY STATUS RESTARTS AGE +pure-fa-exporter-7d45dcfb7-9rxj2 1/1 Running 0 21s +``` + +### ✅ Service Endpoint +``` +NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE +pure-fa-exporter ClusterIP 10.111.204.251 9490/TCP 29s +``` + +### ✅ Metrics Available +Successfully scraped FlashArray metrics including: +- `purefa_info` - System information (Purity//FA 6.5.13) +- `purefa_alerts_open` - Alert events +- `purefa_array_performance_*` - Performance metrics (IOPS, bandwidth, latency) +- `purefa_array_space_*` - Capacity metrics +- `purefa_volume_*` - Volume metrics +- `purefa_host_*` - Host metrics +- And many more... + +Sample output: +``` +purefa_info{array_name="utilidor",os="Purity//FA",subscription_type="FlashArray",system_id="b78a62d3-57fc-45ab-b73f-6203fb30f28d",version="6.5.13"} 1 +``` + +## Files Created + +All manifests committed to homelab repo: + +1. **application.yaml** - ArgoCD Application definition (wave 3) +2. **deployment.yaml** - Exporter deployment with health checks and resource limits +3. **secret.yaml** - FlashArray API credentials (tokens.yaml format) +4. **service.yaml** - ClusterIP service exposing /metrics +5. **servicemonitor.yaml** - Prometheus Operator integration + +**Git Commit:** cb5ffc1 - "Add Pure FlashArray OpenMetrics exporter to monitoring namespace" + +## Next Steps for JARVIS + +1. **Verify Prometheus Scraping** + - Check Prometheus UI → Status → Targets + - Look for `serviceMonitor/monitoring/pure-fa-exporter/0` target + - Should show state: UP + +2. **Test Metrics in Prometheus** + - Navigate to Prometheus UI → Graph + - Query: `purefa_info` - Should return array information + - Query: `purefa_array_space_bytes{space="capacity"}` - Total capacity + - Query: `purefa_array_performance_throughput_iops` - IOPS metrics + +3. **Grafana Dashboard (Optional)** + - The Pure Storage community provides Grafana dashboards + - Reference: https://github.com/PureStorage-OpenConnect/pure-fa-openmetrics-exporter/tree/master/extra/grafana + - Can import dashboard JSON for fleet-wide overview + +## Configuration Notes + +### Multi-Target Exporter Pattern +The exporter follows Prometheus multi-target pattern: +- Single exporter instance can scrape multiple arrays +- Array selection via `?endpoint=` query parameter +- Array credentials in tokens.yaml (array_id → endpoint + api_token mapping) + +### Scrape Frequency +- **Current:** 60s interval +- **Rationale:** Storage metrics are relatively static, high frequency unnecessary +- **Adjustable:** Modify servicemonitor.yaml if faster updates needed + +### Security Context +- Runs as non-root user (UID 65534) +- Read-only token mount +- No elevated privileges required + +## Troubleshooting + +If metrics are not appearing in Prometheus: + +1. **Check ServiceMonitor Selection** + ```bash + kubectl get servicemonitor -n monitoring pure-fa-exporter -o yaml + ``` + Ensure `release: monitoring` label exists for prometheus-operator selector + +2. **Verify Exporter Logs** + ```bash + kubectl logs -n monitoring -l app.kubernetes.io/name=pure-fa-exporter + ``` + +3. **Test Endpoint Directly** + ```bash + kubectl run curl-test --image=curlimages/curl:latest --rm -i --restart=Never -n monitoring -- \ + curl -s http://pure-fa-exporter:9490/metrics?endpoint=utilidor | head + ``` + +4. **Check Prometheus Operator Logs** + ```bash + kubectl logs -n monitoring -l app.kubernetes.io/name=prometheus-operator + ``` + +## References + +- **Official Repo:** https://github.com/PureStorage-OpenConnect/pure-fa-openmetrics-exporter +- **Metrics Specification:** See repo for full purefa_* metric namespace documentation +- **Deployment Pattern:** Based on portworx-csi GitOps structure +- **ServiceMonitor Pattern:** Based on kube-prometheus-stack conventions + +--- + +**Deployment completed successfully.** Prometheus should begin scraping FlashArray metrics within 60 seconds.