Storage Adapters

Telegen’s storage adapters collect metrics from enterprise storage arrays via vendor APIs.

Overview

Storage adapters support:

Vendor Products API
Dell PowerStore, PowerScale REST API
HPE Primera, 3PAR WSAPI
Pure Storage FlashArray, FlashBlade REST API v2
NetApp ONTAP, E-Series ONTAP REST API

Dell PowerStore

Configuration

collector:
  storage:
    dell:
      enabled: true
      poll_interval: 60s
      
      targets:
        - name: "powerstore-prod-01"
          address: "https://powerstore.example.com"
          username: "monitor"
          password: "${DELL_PASSWORD}"
          verify_ssl: true
          
          metrics:
            performance: true
            capacity: true
            alerts: true
            hardware: true

Metrics Collected

Metric Description
dell_powerstore_volume_read_iops Read IOPS per volume
dell_powerstore_volume_write_iops Write IOPS per volume
dell_powerstore_volume_read_latency_us Read latency (microseconds)
dell_powerstore_volume_write_latency_us Write latency (microseconds)
dell_powerstore_volume_size_bytes Volume total size
dell_powerstore_volume_used_bytes Volume used space
dell_powerstore_cluster_capacity_total_bytes Total cluster capacity
dell_powerstore_cluster_capacity_used_bytes Used cluster capacity
dell_powerstore_data_reduction_ratio Data reduction ratio
dell_powerstore_hardware_health Hardware component health

Labels

Label Description
array Array name
volume Volume name
appliance Appliance ID
host Host attachment

HPE Primera/3PAR

Configuration

collector:
  storage:
    hpe:
      enabled: true
      poll_interval: 60s
      
      targets:
        - name: "primera-prod"
          address: "https://primera.example.com:8080"
          username: "monitor"
          password: "${HPE_PASSWORD}"
          verify_ssl: true
          
          metrics:
            system: true
            cpgs: true
            volumes: true
            hosts: true
            ports: true

Metrics Collected

Metric Description
hpe_primera_capacity_total_bytes Total system capacity
hpe_primera_capacity_allocated_bytes Allocated capacity
hpe_primera_capacity_free_bytes Free capacity
hpe_primera_efficiency_ratio Compaction ratio
hpe_primera_volume_size_bytes Volume size
hpe_primera_volume_used_bytes Volume used space
hpe_primera_cpg_capacity_bytes CPG capacity
hpe_primera_port_bandwidth_bytes Port bandwidth
hpe_primera_node_cpu_percent Node CPU usage
hpe_primera_node_cache_hit_percent Cache hit ratio

Labels

Label Description
array Array name
volume Volume name
cpg Common provisioning group
node Controller node
port FC/iSCSI port

Pure Storage FlashArray

Configuration

collector:
  storage:
    pure:
      enabled: true
      poll_interval: 60s
      
      targets:
        - name: "pure-prod-01"
          address: "https://purestorage.example.com"
          api_token: "${PURE_API_TOKEN}"
          
          metrics:
            arrays: true
            volumes: true
            hosts: true
            pods: true
            replication: true

Generating API Token

# On Pure Storage array
pureuser@array01> pureapitoken create --user monitor

Metrics Collected

Metric Description
pure_flasharray_capacity_bytes Total array capacity
pure_flasharray_used_bytes Used capacity
pure_flasharray_data_reduction Data reduction ratio
pure_flasharray_volume_size_bytes Volume provisioned size
pure_flasharray_volume_used_bytes Volume used space
pure_flasharray_volume_read_iops Volume read IOPS
pure_flasharray_volume_write_iops Volume write IOPS
pure_flasharray_volume_read_latency_us Read latency
pure_flasharray_volume_write_latency_us Write latency
pure_flasharray_pod_status Pod replication status
pure_flasharray_hardware_status Hardware health

Labels

Label Description
array Array name
volume Volume name
host Connected host
pod Replication pod
drive Drive bay

NetApp ONTAP

Configuration

collector:
  storage:
    netapp:
      enabled: true
      poll_interval: 60s
      
      targets:
        - name: "ontap-prod"
          address: "https://ontap.example.com"
          username: "monitor"
          password: "${NETAPP_PASSWORD}"
          verify_ssl: true
          
          metrics:
            aggregates: true
            volumes: true
            luns: true
            network: true
            performance: true

Required Permissions

Create a read-only monitoring role:

# On ONTAP cluster
security login role create -role monitor -cmddirname "volume show" -access readonly
security login role create -role monitor -cmddirname "aggregate show" -access readonly
security login role create -role monitor -cmddirname "lun show" -access readonly
security login role create -role monitor -cmddirname "statistics" -access readonly
security login create -user-or-group-name monitor -role monitor -application http -authmethod password

Metrics Collected

Metric Description
netapp_ontap_aggregate_size_bytes Aggregate total size
netapp_ontap_aggregate_used_bytes Aggregate used space
netapp_ontap_volume_size_bytes Volume size
netapp_ontap_volume_used_bytes Volume used space
netapp_ontap_volume_iops Volume IOPS
netapp_ontap_volume_throughput_bytes Volume throughput
netapp_ontap_volume_latency_us Volume latency
netapp_ontap_lun_size_bytes LUN size
netapp_ontap_lun_used_bytes LUN used space
netapp_ontap_port_speed_bytes Port speed
netapp_ontap_cluster_health Cluster health status

Labels

Label Description
cluster Cluster name
node Node name
aggregate Aggregate name
volume Volume name
svm Storage VM name
lun LUN path

Common Dashboards

Capacity Planning

# Total capacity across all arrays
sum(storage_capacity_total_bytes) by (vendor)

# Capacity utilization
sum(storage_capacity_used_bytes) / sum(storage_capacity_total_bytes) * 100

# Days until full (at current growth rate)
(storage_capacity_total_bytes - storage_capacity_used_bytes)
/ deriv(storage_capacity_used_bytes[7d])
/ 86400

Performance

# Total IOPS across arrays
sum(rate(storage_volume_read_iops[5m]) + rate(storage_volume_write_iops[5m]))

# Average latency
avg(storage_volume_read_latency_us + storage_volume_write_latency_us) / 2

# Top 10 volumes by IOPS
topk(10, rate(storage_volume_read_iops[5m]) + rate(storage_volume_write_iops[5m]))

Health Alerts

groups:
  - name: storage
    rules:
      - alert: StorageArrayCapacityHigh
        expr: storage_capacity_used_bytes / storage_capacity_total_bytes > 0.85
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Storage array {{ $labels.array }} is over 85% capacity"
      
      - alert: StorageVolumeLatencyHigh
        expr: storage_volume_read_latency_us > 10000
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "Volume {{ $labels.volume }} has high latency"
      
      - alert: StorageHardwareFailure
        expr: storage_hardware_status != 1
        for: 1m
        labels:
          severity: critical
        annotations:
          summary: "Hardware issue on {{ $labels.array }}"

Security Considerations

Credential Management

Use environment variables or secrets:

collector:
  storage:
    pure:
      targets:
        - name: "pure-prod"
          address: "https://pure.example.com"
          # Reference environment variable
          api_token: "${PURE_API_TOKEN}"

In Kubernetes:

apiVersion: v1
kind: Secret
metadata:
  name: storage-credentials
type: Opaque
stringData:
  PURE_API_TOKEN: "your-token-here"
  DELL_PASSWORD: "your-password"
  NETAPP_PASSWORD: "your-password"

Network Security

  • Use HTTPS with valid certificates
  • Restrict collector IP access on storage arrays
  • Use read-only monitoring accounts
  • Rotate credentials regularly

Multi-Array Example

telegen:
  mode: collector
  service_name: "storage-collector"

otlp:
  endpoint: "otel-collector:4317"

collector:
  storage:
    # Dell PowerStore
    dell:
      enabled: true
      poll_interval: 60s
      targets:
        - name: "powerstore-dc1"
          address: "https://10.0.10.100"
          username: "monitor"
          password: "${DELL_PASSWORD}"
        - name: "powerstore-dc2"
          address: "https://10.0.20.100"
          username: "monitor"
          password: "${DELL_PASSWORD}"
    
    # Pure Storage
    pure:
      enabled: true
      poll_interval: 60s
      targets:
        - name: "pure-prod"
          address: "https://10.0.10.110"
          api_token: "${PURE_TOKEN_PROD}"
        - name: "pure-dev"
          address: "https://10.0.10.111"
          api_token: "${PURE_TOKEN_DEV}"
    
    # NetApp
    netapp:
      enabled: true
      poll_interval: 60s
      targets:
        - name: "ontap-nas"
          address: "https://10.0.10.120"
          username: "monitor"
          password: "${NETAPP_PASSWORD}"

Next Steps