Repository: NetApp/harvest
Pull request #438 (2021-08-21 18:08:49)

feat: include ZAPI counters in autosupport
ONTAP requested the list of counters to help prioritize ZAPI to REST transition work

Refactored autosupport collection by giving each collector the opportunity to add their own autosupport information. This better encapsulates Zapi information and avoids copying client connection logic. The Zapi collector already knows how to handle 7-mode.

- fixed: Don't gather node uuids from 7-mode

By default, four minutes after startup, an autosupport payload will be written, but not sent. This provides visibility into the autosupport payload Harvest sends.

cgrinds: ```
{
  "Target": {
    "Version": "9.10.1",
    "Model": "cdot",
    "Serial": "1-80-000011",
    "Ping": 0,
    "ClusterUuid": "37387241-8b57-11e9-8974-00a098e0219a"
  },
  "Harvest": {
    "HostHash": "df62c133cbd0fef8ccda100e3c04c33eb3b2d911",
    "UUID": "fe19da98aea5c555d95292170e7251e037819ee6",
    "Version": "2.0.2",
    "Release": "rc2",
    "Commit": "HEAD",
    "BuildDate": "undefined",
    "NumClusters": 1
  },
  "Platform": {
    "OS": "darwin",
    "Arch": "darwin",
    "Memory": {
      "TotalKb": 33554432,
      "AvailableKb": 12654856,
      "UsedKb": 20899576
    },
    "CPUs": 1
  },
  "Nodes": {
    "Count": 2,
    "DataPoints": 33,
    "PollTime": 205164,
    "ApiTime": 204230,
    "ParseTime": 467,
    "PluginTime": 40,
    "Uuids": [
      "95f94e8d-8b4e-11e9-8974-00a098e0219a",
      "e0362156-8b4d-11e9-b263-00a098e0060e"
    ]
  },
  "Volumes": {
    "Count": 462,
    "DataPoints": 16618,
    "PollTime": 2241051,
    "ApiTime": 603180,
    "ParseTime": 149403,
    "PluginTime": 3921
  },
  "Collectors": [
    {
      "Name": "Zapi",
      "Template": "node.yaml",
      "BatchSize": "500",
      "ClientTimeout": "180",
      "Schedules": [
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "180s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 17,
        "List": [
          "node-details-info cpu-busytime",
          "node-details-info env-failed-fan-count",
          "node-details-info env-failed-fan-message",
          "node-details-info env-failed-power-supply-count",
          "node-details-info env-failed-power-supply-message",
          "node-details-info env-over-temperature",
          "node-details-info is-node-healthy",
          "node-details-info maximum-aggregate-size",
          "node-details-info maximum-number-of-volumes",
          "node-details-info maximum-volume-size",
          "node-details-info node",
          "node-details-info node-location",
          "node-details-info node-model",
          "node-details-info node-serial-number",
          "node-details-info node-uptime",
          "node-details-info node-vendor",
          "node-details-info product-version"
        ]
      }
    },
    {
      "Name": "Zapi",
      "Template": "aggr.yaml",
      "BatchSize": "500",
      "ClientTimeout": "180",
      "Schedules": [
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "180s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 46,
        "List": [
          "aggr-attributes aggregate-name",
          "aggr-attributes aggregate-uuid",
          "aggr-attributes aggr-ownership-attributes home-name",
          "aggr-attributes aggr-raid-attributes aggregate-type",
          "aggr-attributes aggr-raid-attributes disk-count",
          "aggr-attributes aggr-raid-attributes plex-count",
          "aggr-attributes aggr-raid-attributes raid-size",
          "aggr-attributes aggr-raid-attributes state",
          "aggr-attributes aggr-inode-attributes files-private-used",
          "aggr-attributes aggr-inode-attributes files-total",
          "aggr-attributes aggr-inode-attributes files-used",
          "aggr-attributes aggr-inode-attributes inodefile-private-capacity",
          "aggr-attributes aggr-inode-attributes inodefile-public-capacity",
          "aggr-attributes aggr-inode-attributes maxfiles-available",
          "aggr-attributes aggr-inode-attributes maxfiles-possible",
          "aggr-attributes aggr-inode-attributes maxfiles-used",
          "aggr-attributes aggr-inode-attributes percent-inode-used-capacity",
          "aggr-attributes aggr-space-attributes capacity-tier-used",
          "aggr-attributes aggr-space-attributes data-compacted-count",
          "aggr-attributes aggr-space-attributes data-compaction-space-saved",
          "aggr-attributes aggr-space-attributes data-compaction-space-saved-percent",
          "aggr-attributes aggr-space-attributes hybrid-cache-size-total",
          "aggr-attributes aggr-space-attributes percent-used-capacity",
          "aggr-attributes aggr-space-attributes performance-tier-inactive-user-data",
          "aggr-attributes aggr-space-attributes performance-tier-inactive-user-data-percent",
          "aggr-attributes aggr-space-attributes physical-used",
          "aggr-attributes aggr-space-attributes physical-used-percent",
          "aggr-attributes aggr-space-attributes sis-shared-count",
          "aggr-attributes aggr-space-attributes sis-space-saved",
          "aggr-attributes aggr-space-attributes sis-space-saved-percent",
          "aggr-attributes aggr-space-attributes size-available",
          "aggr-attributes aggr-space-attributes size-total",
          "aggr-attributes aggr-space-attributes size-used",
          "aggr-attributes aggr-space-attributes total-reserved-space",
          "aggr-attributes aggr-volume-count-attributes flexvol-count",
          "aggr-attributes aggr-snapshot-attributes files-total",
          "aggr-attributes aggr-snapshot-attributes files-used",
          "aggr-attributes aggr-snapshot-attributes maxfiles-available",
          "aggr-attributes aggr-snapshot-attributes maxfiles-possible",
          "aggr-attributes aggr-snapshot-attributes maxfiles-used",
          "aggr-attributes aggr-snapshot-attributes percent-inode-used-capacity",
          "aggr-attributes aggr-snapshot-attributes percent-used-capacity",
          "aggr-attributes aggr-snapshot-attributes size-available",
          "aggr-attributes aggr-snapshot-attributes size-total",
          "aggr-attributes aggr-snapshot-attributes size-used",
          "aggr-attributes aggr-snapshot-attributes snapshot-reserve-percent"
        ]
      }
    },
    {
      "Name": "Zapi",
      "Template": "volume.yaml",
      "BatchSize": "500",
      "ClientTimeout": "180",
      "Schedules": [
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "180s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 38,
        "List": [
          "volume-attributes volume-autosize-attributes maximum-size",
          "volume-attributes volume-autosize-attributes grow-threshold-percent",
          "volume-attributes volume-id-attributes instance-uuid",
          "volume-attributes volume-id-attributes name",
          "volume-attributes volume-id-attributes node",
          "volume-attributes volume-id-attributes owning-vserver-name",
          "volume-attributes volume-id-attributes containing-aggregate-name",
          "volume-attributes volume-id-attributes style-extended",
          "volume-attributes volume-inode-attributes files-used",
          "volume-attributes volume-inode-attributes files-total",
          "volume-attributes volume-sis-attributes compression-space-saved",
          "volume-attributes volume-sis-attributes deduplication-space-saved",
          "volume-attributes volume-sis-attributes total-space-saved",
          "volume-attributes volume-sis-attributes percentage-compression-space-saved",
          "volume-attributes volume-sis-attributes percentage-deduplication-space-saved",
          "volume-attributes volume-sis-attributes percentage-total-space-saved",
          "volume-attributes volume-space-attributes expected-available",
          "volume-attributes volume-space-attributes filesystem-size",
          "volume-attributes volume-space-attributes logical-available",
          "volume-attributes volume-space-attributes logical-used",
          "volume-attributes volume-space-attributes logical-used-by-afs",
          "volume-attributes volume-space-attributes logical-used-by-snapshots",
          "volume-attributes volume-space-attributes logical-used-percent",
          "volume-attributes volume-space-attributes physical-used",
          "volume-attributes volume-space-attributes physical-used-percent",
          "volume-attributes volume-space-attributes size",
          "volume-attributes volume-space-attributes size-available",
          "volume-attributes volume-space-attributes size-total",
          "volume-attributes volume-space-attributes size-used",
          "volume-attributes volume-space-attributes percentage-size-used",
          "volume-attributes volume-space-attributes size-used-by-snapshots",
          "volume-attributes volume-space-attributes size-available-for-snapshots",
          "volume-attributes volume-space-attributes snapshot-reserve-available",
          "volume-attributes volume-space-attributes snapshot-reserve-size",
          "volume-attributes volume-space-attributes percentage-snapshot-reserve",
          "volume-attributes volume-space-attributes percentage-snapshot-reserve-used",
          "volume-attributes volume-state-attributes state",
          "volume-attributes volume-state-attributes status"
        ]
      }
    },
    {
      "Name": "Zapi",
      "Template": "snapmirror.yaml",
      "BatchSize": "500",
      "ClientTimeout": "180",
      "Schedules": [
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "180s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 27,
        "List": [
          "snapmirror-info break-failed-count",
          "snapmirror-info break-successful-count",
          "snapmirror-info destination-volume",
          "snapmirror-info destination-volume-node",
          "snapmirror-info destination-vserver",
          "snapmirror-info is-healthy",
          "snapmirror-info lag-time",
          "snapmirror-info last-transfer-duration",
          "snapmirror-info last-transfer-end-timestamp",
          "snapmirror-info last-transfer-size",
          "snapmirror-info last-transfer-type",
          "snapmirror-info newest-snapshot-timestamp",
          "snapmirror-info relationship-id",
          "snapmirror-info relationship-status",
          "snapmirror-info relationship-type",
          "snapmirror-info relationship-group-type",
          "snapmirror-info resync-failed-count",
          "snapmirror-info resync-successful-count",
          "snapmirror-info schedule",
          "snapmirror-info source-volume",
          "snapmirror-info source-vserver",
          "snapmirror-info source-node",
          "snapmirror-info total-transfer-bytes",
          "snapmirror-info total-transfer-time-secs",
          "snapmirror-info unhealthy-reason",
          "snapmirror-info update-failed-count",
          "snapmirror-info update-successful-count"
        ]
      }
    },
    {
      "Name": "Zapi",
      "Template": "disk.yaml",
      "BatchSize": "500",
      "ClientTimeout": "180",
      "Schedules": [
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "180s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 20,
        "List": [
          "storage-disk-info disk-uid",
          "storage-disk-info disk-name",
          "storage-disk-info disk-inventory-info bytes-per-sector",
          "storage-disk-info disk-inventory-info capacity-sectors",
          "storage-disk-info disk-inventory-info disk-type",
          "storage-disk-info disk-inventory-info is-shared",
          "storage-disk-info disk-inventory-info model",
          "storage-disk-info disk-inventory-info serial-number",
          "storage-disk-info disk-inventory-info shelf",
          "storage-disk-info disk-inventory-info shelf-bay",
          "storage-disk-info disk-ownership-info home-node-name",
          "storage-disk-info disk-ownership-info owner-node-name",
          "storage-disk-info disk-ownership-info is-failed",
          "storage-disk-info disk-stats-info average-latency",
          "storage-disk-info disk-stats-info disk-io-kbps",
          "storage-disk-info disk-stats-info power-on-time-interval",
          "storage-disk-info disk-stats-info sectors-read",
          "storage-disk-info disk-stats-info sectors-written",
          "storage-disk-info disk-raid-info disk-outage-info reason",
          "storage-disk-info disk-raid-info disk-shared-info aggregate-list shared-aggregate-info aggregate-name"
        ]
      }
    },
    {
      "Name": "Zapi",
      "Template": "shelf.yaml",
      "BatchSize": "500",
      "ClientTimeout": "180",
      "Schedules": [
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "180s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 9,
        "List": [
          "storage-shelf-info disk-count",
          "storage-shelf-info module-type",
          "storage-shelf-info serial-number",
          "storage-shelf-info shelf",
          "storage-shelf-info shelf-model",
          "storage-shelf-info shelf-uid",
          "storage-shelf-info state",
          "storage-shelf-info vendor-name",
          "storage-shelf-info op-status"
        ]
      }
    },
    {
      "Name": "Zapi",
      "Template": "status.yaml",
      "ClientTimeout": "180",
      "Schedules": [
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "180s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 1,
        "List": [
          " status"
        ]
      }
    },
    {
      "Name": "Zapi",
      "Template": "subsystem.yaml",
      "BatchSize": "500",
      "ClientTimeout": "180",
      "Schedules": [
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "180s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 4,
        "List": [
          "diagnosis-subsystem-config-info health",
          "diagnosis-subsystem-config-info subsystem",
          "diagnosis-subsystem-config-info outstanding-alert-count",
          "diagnosis-subsystem-config-info suppressed-alert-count"
        ]
      }
    },
    {
      "Name": "Zapi",
      "Template": "lun.yaml",
      "BatchSize": "500",
      "ClientTimeout": "180",
      "Schedules": [
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "180s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 9,
        "List": [
          "lun-info node",
          "lun-info path",
          "lun-info qtree",
          "lun-info size",
          "lun-info size-used",
          "lun-info state",
          "lun-info uuid",
          "lun-info volume",
          "lun-info vserver"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "system_node.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 25,
        "List": [
          " instance_name",
          " avg_processor_busy",
          " cpu_elapsed_time",
          " uptime",
          " memory",
          " total_data",
          " total_latency",
          " total_ops",
          " cifs_ops",
          " nfs_ops",
          " iscsi_ops",
          " fcp_ops",
          " nvmf_ops",
          " disk_data_read",
          " disk_data_written",
          " hdd_data_read",
          " hdd_data_written",
          " ssd_data_read",
          " ssd_data_written",
          " net_data_recv",
          " net_data_sent",
          " fcp_data_recv",
          " fcp_data_sent",
          " nvmf_data_recv",
          " mvmf_data_sent"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "hostadapter.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 4,
        "List": [
          " instance_name",
          " node_name",
          " bytes_read",
          " bytes_written"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "path.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 11,
        "List": [
          " instance_name",
          " instance_uuid",
          " node_name",
          " read_iops",
          " read_data",
          " write_data",
          " write_iops",
          " total_data",
          " total_iops",
          " read_latency",
          " write_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "disk.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 23,
        "List": [
          " instance_uuid",
          " instance_name",
          " cp_read_chain",
          " cp_read_latency",
          " cp_reads",
          " disk_busy",
          " disk_capacity",
          " disk_speed",
          " io_pending",
          " io_queued",
          " node_name",
          " physical_disk_name",
          " raid_group",
          " raid_type",
          " total_transfers",
          " user_read_chain",
          " user_read_blocks",
          " user_read_latency",
          " user_reads",
          " user_write_chain",
          " user_write_blocks",
          " user_write_latency",
          " user_writes"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "fcvi.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 6,
        "List": [
          " instance_name",
          " instance_uuid",
          " node_name",
          " rdma_write_throughput",
          " rdma_write_ops",
          " rdma_write_avg_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "ext_cache_obj.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 20,
        "List": [
          " instance_name",
          " instance_uuid",
          " node_name",
          " disk_reads_replaced",
          " accesses",
          " hit_percent",
          " inserts",
          " evicts",
          " invalidates",
          " usage",
          " hit",
          " hit_normal_lev0",
          " hit_metadata_file",
          " hit_directory",
          " hit_indirect",
          " miss",
          " miss_normal_lev0",
          " miss_metadata_file",
          " miss_directory",
          " miss_indirect"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "wafl.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 23,
        "List": [
          " instance_uuid",
          " node_name",
          " avg_non_wafl_msg_latency",
          " avg_wafl_msg_latency",
          " avg_wafl_repl_msg_latency",
          " wafl_msg_total",
          " wafl_repl_msg_total",
          " non_wafl_msg_total",
          " cp_count",
          " cp_phase_times",
          " read_io_type",
          " total_cp_msecs",
          " total_cp_util",
          " wafl_memory_used",
          " wafl_memory_free",
          " wafl_reads_from_cache",
          " wafl_reads_from_cloud",
          " wafl_reads_from_cloud_s2c_bin",
          " wafl_reads_from_disk",
          " wafl_reads_from_ext_cache",
          " wafl_reads_from_fc_miss",
          " wafl_reads_from_pmem",
          " wafl_reads_from_ssd"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "wafl_hya_per_aggr.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 19,
        "List": [
          " instance_name",
          " node_name",
          " ssd_total",
          " ssd_total_used",
          " ssd_available",
          " ssd_read_cached",
          " ssd_write_cached",
          " read_ops_replaced",
          " read_ops_replaced_percent",
          " write_blks_replaced",
          " write_blks_replaced_percent",
          " hya_read_hit_latency_average",
          " hya_read_miss_latency_average",
          " hya_write_ssd_latency_average",
          " hya_write_hdd_latency_average",
          " read_cache_ins_rate",
          " wc_write_blks_total",
          " evict_remove_rate",
          " evict_destage_rate"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "wafl_hya_sizer.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 3,
        "List": [
          " instance_name",
          " node_name",
          " cache_stats"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "nic_common.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 17,
        "List": [
          " instance_name",
          " instance_uuid",
          " node_name",
          " rx_bytes",
          " tx_bytes",
          " link_speed",
          " link_current_state",
          " link_up_to_downs",
          " nic_type",
          " rx_alignment_errors",
          " rx_crc_errors",
          " rx_length_errors",
          " rx_total_errors",
          " rx_errors",
          " tx_errors",
          " tx_hw_errors",
          " tx_total_errors"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "namespace.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 13,
        "List": [
          " instance_name",
          " vserver_name",
          " read_data",
          " write_data",
          " read_ops",
          " write_ops",
          " other_ops",
          " avg_read_latency",
          " avg_write_latency",
          " avg_other_latency",
          " queue_full",
          " remote_bytes",
          " remote_ops"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "nvmf_lif.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 15,
        "List": [
          " instance_name",
          " instance_uuid",
          " vserver_name",
          " node_name",
          " port_id",
          " read_data",
          " read_ops",
          " avg_read_latency",
          " write_data",
          " write_ops",
          " avg_write_latency",
          " other_ops",
          " avg_other_latency",
          " total_ops",
          " avg_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "fcp.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 54,
        "List": [
          " instance_name",
          " instance_uuid",
          " node_name",
          " avg_other_latency",
          " avg_read_latency",
          " avg_write_latency",
          " read_data",
          " write_data",
          " total_data",
          " read_ops",
          " write_ops",
          " other_ops",
          " total_ops",
          " link_speed",
          " link_down",
          " link_failure",
          " loss_of_signal",
          " loss_of_sync",
          " prim_seq_err",
          " queue_full",
          " reset_count",
          " shared_int_count",
          " spurious_int_count",
          " threshold_full",
          " discarded_frames_count",
          " int_count",
          " invalid_transmission_word",
          " isr_count",
          " invalid_crc",
          " nvmf_avg_other_latency",
          " nvmf_avg_read_latency",
          " nvmf_avg_remote_other_latency",
          " nvmf_avg_remote_read_latency",
          " nvmf_avg_remote_write_latenc",
          " nvmf_avg_write_latency",
          " nvmf_caw_data",
          " nvmf_caw_ops",
          " nvmf_command_slots",
          " nvmf_other_ops",
          " nvmf_read_data",
          " nvmf_read_ops",
          " nvmf_remote_caw_data",
          " nvmf_remote_caw_ops",
          " nvmf_remote_other_ops",
          " nvmf_remote_read_data",
          " nvmf_remote_read_ops",
          " nvmf_remote_total_data",
          " nvmf_remote_total_ops",
          " nvmf_remote_write_data",
          " nvmf_remote_write_ops",
          " nvmf_total_data",
          " nvmf_total_ops",
          " nvmf_write_data",
          " nvmf_write_ops"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "object_store_client_op.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 8,
        "List": [
          " instance_name",
          " instance_uuid",
          " node_name",
          " average_latency",
          " get_throughput_bytes",
          " put_throughput_bytes",
          " stats",
          " throughput_ops"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "volume_node.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 33,
        "List": [
          " instance_name",
          " cifs_read_data",
          " cifs_write_data",
          " cifs_read_ops",
          " cifs_write_ops",
          " cifs_other_ops",
          " cifs_read_latency",
          " cifs_write_latency",
          " cifs_other_latency",
          " nfs_read_data",
          " nfs_write_data",
          " nfs_read_ops",
          " nfs_write_ops",
          " nfs_other_ops",
          " nfs_read_latency",
          " nfs_write_latency",
          " nfs_other_latency",
          " iscsi_read_data",
          " iscsi_write_data",
          " iscsi_read_ops",
          " iscsi_write_ops",
          " iscsi_other_ops",
          " iscsi_read_latency",
          " iscsi_write_latency",
          " iscsi_other_latency",
          " fcp_read_data",
          " fcp_write_data",
          " fcp_read_ops",
          " fcp_write_ops",
          " fcp_other_ops",
          " fcp_read_latency",
          " fcp_write_latency",
          " fcp_other_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "token_manager.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 12,
        "List": [
          " node_name",
          " instance_name",
          " instance_uuid",
          " token_copy_success",
          " token_create_success",
          " token_zero_success",
          " token_copy_failure",
          " token_create_failure",
          " token_zero_failure",
          " token_copy_bytes",
          " token_create_bytes",
          " token_zero_bytes"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "resource_headroom_cpu.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 13,
        "List": [
          " instance_name",
          " node_name",
          " current_latency",
          " current_ops",
          " current_utilization",
          " optimal_point_latency",
          " optimal_point_ops",
          " optimal_point_utilization",
          " optimal_point_confidence_factor",
          " ewma_daily",
          " ewma_hourly",
          " ewma_monthly",
          " ewma_weekly"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "resource_headroom_aggr.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 13,
        "List": [
          " instance_name",
          " node_name",
          " current_latency",
          " current_ops",
          " current_utilization",
          " optimal_point_latency",
          " optimal_point_ops",
          " optimal_point_utilization",
          " optimal_point_confidence_factor",
          " ewma_daily",
          " ewma_hourly",
          " ewma_monthly",
          " ewma_weekly"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "processor.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 5,
        "List": [
          " node_name",
          " instance_name",
          " instance_uuid",
          " domain_busy",
          " processor_busy"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "cifs_node.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 11,
        "List": [
          " instance_name",
          " cifs_op_count",
          " cifs_ops",
          " cifs_read_ops",
          " cifs_write_ops",
          " cifs_latency",
          " cifs_read_latency",
          " cifs_write_latency",
          " connections",
          " established_sessions",
          " open_files"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "nfsv3_node.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 52,
        "List": [
          " instance_name",
          " nfsv3_ops",
          " nfsv3_read_ops",
          " nfsv3_write_ops",
          " nfsv3_throughput",
          " nfsv3_read_throughput",
          " nfsv3_write_throughput",
          " read_avg_latency",
          " write_avg_latency",
          " latency",
          " access_total",
          " commit_total",
          " create_total",
          " fsinfo_total",
          " fsstat_total",
          " getattr_total",
          " link_total",
          " lookup_total",
          " mkdir_total",
          " mknod_total",
          " null_total",
          " pathconf_total",
          " read_symlink_total",
          " read_total",
          " readdir_total",
          " readdirplus_total",
          " remove_total",
          " rename_total",
          " rmdir_total",
          " setattr_total",
          " symlink_total",
          " write_total",
          " access_avg_latency",
          " commit_avg_latency",
          " create_avg_latency",
          " fsinfo_avg_latency",
          " fsstat_avg_latency",
          " getattr_avg_latency",
          " link_avg_latency",
          " lookup_avg_latency",
          " mkdir_avg_latency",
          " mknod_avg_latency",
          " null_avg_latency",
          " pathconf_avg_latency",
          " read_symlink_avg_latency",
          " readdir_avg_latency",
          " readdirplus_avg_latency",
          " remove_avg_latency",
          " rename_avg_latency",
          " rmdir_avg_latency",
          " setattr_avg_latency",
          " symlink_avg_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "nfsv4_node.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 82,
        "List": [
          " instance_name",
          " latency",
          " total_ops",
          " nfs4_read_throughput",
          " nfs4_throughput",
          " nfs4_write_throughput",
          " access_total",
          " close_total",
          " commit_total",
          " create_total",
          " delegpurge_total",
          " delegreturn_total",
          " getattr_total",
          " getfh_total",
          " link_total",
          " lock_total",
          " lockt_total",
          " locku_total",
          " lookup_total",
          " lookupp_total",
          " null_total",
          " nverify_total",
          " open_confirm_total",
          " open_downgrade_total",
          " open_total",
          " openattr_total",
          " putfh_total",
          " putpubfh_total",
          " putrootfh_total",
          " read_total",
          " readdir_total",
          " readlink_total",
          " release_lock_owner_total",
          " remove_total",
          " rename_total",
          " renew_total",
          " restorefh_total",
          " savefh_total",
          " secinfo_total",
          " setattr_total",
          " setclientid_confirm_total",
          " setclientid_total",
          " verify_total",
          " write_total",
          " access_avg_latency",
          " close_avg_latency",
          " commit_avg_latency",
          " create_avg_latency",
          " delegpurge_avg_latency",
          " delegreturn_avg_latency",
          " getattr_avg_latency",
          " getfh_avg_latency",
          " link_avg_latency",
          " lock_avg_latency",
          " lockt_avg_latency",
          " locku_avg_latency",
          " lookup_avg_latency",
          " lookupp_avg_latency",
          " null_avg_latency",
          " nverify_avg_latency",
          " open_avg_latency",
          " open_confirm_avg_latency",
          " open_downgrade_avg_latency",
          " openattr_avg_latency",
          " putfh_avg_latency",
          " putpubfh_avg_latency",
          " putrootfh_avg_latency",
          " read_avg_latency",
          " readdir_avg_latency",
          " readlink_avg_latency",
          " release_lock_owner_avg_latency",
          " remove_avg_latency",
          " rename_avg_latency",
          " renew_avg_latency",
          " restorefh_avg_latency",
          " savefh_avg_latency",
          " secinfo_avg_latency",
          " setattr_avg_latency",
          " setclientid_avg_latency",
          " setclientid_confirm_avg_latency",
          " verify_avg_latency",
          " write_avg_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "nfsv4_1_node.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 110,
        "List": [
          " instance_name",
          " latency",
          " total_ops",
          " nfs41_read_throughput",
          " nfs41_throughput",
          " nfs41_write_throughput",
          " access_total",
          " backchannel_ctl_total",
          " bind_conn_to_session_total",
          " close_total",
          " commit_total",
          " create_session_total",
          " create_total",
          " delegpurge_total",
          " delegreturn_total",
          " destroy_clientid_total",
          " destroy_session_total",
          " exchange_id_total",
          " free_stateid_total",
          " get_dir_delegation_total",
          " getattr_total",
          " getdeviceinfo_total",
          " getdevicelist_total",
          " getfh_total",
          " layoutcommit_total",
          " layoutget_total",
          " layoutreturn_total",
          " link_total",
          " lock_total",
          " lockt_total",
          " locku_total",
          " lookup_total",
          " lookupp_total",
          " null_total",
          " nverify_total",
          " open_downgrade_total",
          " open_total",
          " openattr_total",
          " putfh_total",
          " putpubfh_total",
          " putrootfh_total",
          " read_total",
          " readdir_total",
          " readlink_total",
          " reclaim_complete_total",
          " remove_total",
          " rename_total",
          " restorefh_total",
          " savefh_total",
          " secinfo_no_name_total",
          " secinfo_total",
          " sequence_total",
          " set_ssv_total",
          " setattr_total",
          " test_stateid_total",
          " verify_total",
          " want_delegation_total",
          " write_total",
          " access_avg_latency",
          " backchannel_ctl_avg_latency",
          " bind_conn_to_session_avg_latency",
          " close_avg_latency",
          " commit_avg_latency",
          " create_avg_latency",
          " create_session_avg_latency",
          " delegpurge_avg_latency",
          " delegreturn_avg_latency",
          " destroy_clientid_avg_latency",
          " destroy_session_avg_latency",
          " exchange_id_avg_latency",
          " free_stateid_avg_latency",
          " get_dir_delegation_avg_latency",
          " getattr_avg_latency",
          " getdeviceinfo_avg_latency",
          " getdevicelist_avg_latency",
          " getfh_avg_latency",
          " layoutcommit_avg_latency",
          " layoutget_avg_latency",
          " layoutreturn_avg_latency",
          " link_avg_latency",
          " lock_avg_latency",
          " lockt_avg_latency",
          " locku_avg_latency",
          " lookup_avg_latency",
          " lookupp_avg_latency",
          " null_avg_latency",
          " nverify_avg_latency",
          " open_avg_latency",
          " open_downgrade_avg_latency",
          " openattr_avg_latency",
          " putfh_avg_latency",
          " putpubfh_avg_latency",
          " putrootfh_avg_latency",
          " read_avg_latency",
          " readdir_avg_latency",
          " readlink_avg_latency",
          " reclaim_complete_avg_latency",
          " remove_avg_latency",
          " rename_avg_latency",
          " restorefh_avg_latency",
          " savefh_avg_latency",
          " secinfo_avg_latency",
          " secinfo_no_name_avg_latency",
          " sequence_avg_latency",
          " set_ssv_avg_latency",
          " setattr_avg_latency",
          " test_stateid_avg_latency",
          " verify_avg_latency",
          " want_delegation_avg_latency",
          " write_avg_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "qtree.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 9,
        "List": [
          " instance_uuid",
          " instance_name",
          " vserver_name",
          " node_name",
          " parent_vol",
          " cifs_ops",
          " nfs_ops",
          " internal_ops",
          " total_ops"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "volume.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 15,
        "List": [
          " instance_uuid",
          " instance_name",
          " vserver_name",
          " node_name",
          " parent_aggr",
          " read_data",
          " write_data",
          " read_ops",
          " write_ops",
          " other_ops",
          " total_ops",
          " read_latency",
          " write_latency",
          " other_latency",
          " avg_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "lun.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 23,
        "List": [
          " instance_name",
          " vserver_name",
          " read_data",
          " write_data",
          " read_ops",
          " write_ops",
          " xcopy_reqs",
          " writesame_reqs",
          " writesame_unmap_reqs",
          " caw_reqs",
          " avg_read_latency",
          " avg_write_latency",
          " avg_xcopy_latency",
          " unmap_reqs",
          " writesame_unmap_reqs",
          " enospc",
          " queue_full",
          " remote_bytes",
          " remote_ops",
          " read_partial_blocks",
          " write_partial_blocks",
          " write_align_histo",
          " read_align_histo"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "nfsv3.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 52,
        "List": [
          " instance_name",
          " nfsv3_ops",
          " nfsv3_read_ops",
          " nfsv3_write_ops",
          " nfsv3_throughput",
          " nfsv3_read_throughput",
          " nfsv3_write_throughput",
          " read_avg_latency",
          " write_avg_latency",
          " latency",
          " access_total",
          " commit_total",
          " create_total",
          " fsinfo_total",
          " fsstat_total",
          " getattr_total",
          " link_total",
          " lookup_total",
          " mkdir_total",
          " mknod_total",
          " null_total",
          " pathconf_total",
          " read_symlink_total",
          " read_total",
          " readdir_total",
          " readdirplus_total",
          " remove_total",
          " rename_total",
          " rmdir_total",
          " setattr_total",
          " symlink_total",
          " write_total",
          " access_avg_latency",
          " commit_avg_latency",
          " create_avg_latency",
          " fsinfo_avg_latency",
          " fsstat_avg_latency",
          " getattr_avg_latency",
          " link_avg_latency",
          " lookup_avg_latency",
          " mkdir_avg_latency",
          " mknod_avg_latency",
          " null_avg_latency",
          " pathconf_avg_latency",
          " read_symlink_avg_latency",
          " readdir_avg_latency",
          " readdirplus_avg_latency",
          " remove_avg_latency",
          " rename_avg_latency",
          " rmdir_avg_latency",
          " setattr_avg_latency",
          " symlink_avg_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "nfsv4.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 82,
        "List": [
          " instance_name",
          " latency",
          " total_ops",
          " nfs4_read_throughput",
          " nfs4_throughput",
          " nfs4_write_throughput",
          " access_total",
          " close_total",
          " commit_total",
          " create_total",
          " delegpurge_total",
          " delegreturn_total",
          " getattr_total",
          " getfh_total",
          " link_total",
          " lock_total",
          " lockt_total",
          " locku_total",
          " lookup_total",
          " lookupp_total",
          " null_total",
          " nverify_total",
          " open_confirm_total",
          " open_downgrade_total",
          " open_total",
          " openattr_total",
          " putfh_total",
          " putpubfh_total",
          " putrootfh_total",
          " read_total",
          " readdir_total",
          " readlink_total",
          " release_lock_owner_total",
          " remove_total",
          " rename_total",
          " renew_total",
          " restorefh_total",
          " savefh_total",
          " secinfo_total",
          " setattr_total",
          " setclientid_confirm_total",
          " setclientid_total",
          " verify_total",
          " write_total",
          " access_avg_latency",
          " close_avg_latency",
          " commit_avg_latency",
          " create_avg_latency",
          " delegpurge_avg_latency",
          " delegreturn_avg_latency",
          " getattr_avg_latency",
          " getfh_avg_latency",
          " link_avg_latency",
          " lock_avg_latency",
          " lockt_avg_latency",
          " locku_avg_latency",
          " lookup_avg_latency",
          " lookupp_avg_latency",
          " null_avg_latency",
          " nverify_avg_latency",
          " open_avg_latency",
          " open_confirm_avg_latency",
          " open_downgrade_avg_latency",
          " openattr_avg_latency",
          " putfh_avg_latency",
          " putpubfh_avg_latency",
          " putrootfh_avg_latency",
          " read_avg_latency",
          " readdir_avg_latency",
          " readlink_avg_latency",
          " release_lock_owner_avg_latency",
          " remove_avg_latency",
          " rename_avg_latency",
          " renew_avg_latency",
          " restorefh_avg_latency",
          " savefh_avg_latency",
          " secinfo_avg_latency",
          " setattr_avg_latency",
          " setclientid_avg_latency",
          " setclientid_confirm_avg_latency",
          " verify_avg_latency",
          " write_avg_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "nfsv4_1.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 110,
        "List": [
          " instance_name",
          " latency",
          " total_ops",
          " nfs41_read_throughput",
          " nfs41_throughput",
          " nfs41_write_throughput",
          " access_total",
          " backchannel_ctl_total",
          " bind_conn_to_session_total",
          " close_total",
          " commit_total",
          " create_session_total",
          " create_total",
          " delegpurge_total",
          " delegreturn_total",
          " destroy_clientid_total",
          " destroy_session_total",
          " exchange_id_total",
          " free_stateid_total",
          " get_dir_delegation_total",
          " getattr_total",
          " getdeviceinfo_total",
          " getdevicelist_total",
          " getfh_total",
          " layoutcommit_total",
          " layoutget_total",
          " layoutreturn_total",
          " link_total",
          " lock_total",
          " lockt_total",
          " locku_total",
          " lookup_total",
          " lookupp_total",
          " null_total",
          " nverify_total",
          " open_downgrade_total",
          " open_total",
          " openattr_total",
          " putfh_total",
          " putpubfh_total",
          " putrootfh_total",
          " read_total",
          " readdir_total",
          " readlink_total",
          " reclaim_complete_total",
          " remove_total",
          " rename_total",
          " restorefh_total",
          " savefh_total",
          " secinfo_no_name_total",
          " secinfo_total",
          " sequence_total",
          " set_ssv_total",
          " setattr_total",
          " test_stateid_total",
          " verify_total",
          " want_delegation_total",
          " write_total",
          " access_avg_latency",
          " backchannel_ctl_avg_latency",
          " bind_conn_to_session_avg_latency",
          " close_avg_latency",
          " commit_avg_latency",
          " create_avg_latency",
          " create_session_avg_latency",
          " delegpurge_avg_latency",
          " delegreturn_avg_latency",
          " destroy_clientid_avg_latency",
          " destroy_session_avg_latency",
          " exchange_id_avg_latency",
          " free_stateid_avg_latency",
          " get_dir_delegation_avg_latency",
          " getattr_avg_latency",
          " getdeviceinfo_avg_latency",
          " getdevicelist_avg_latency",
          " getfh_avg_latency",
          " layoutcommit_avg_latency",
          " layoutget_avg_latency",
          " layoutreturn_avg_latency",
          " link_avg_latency",
          " lock_avg_latency",
          " lockt_avg_latency",
          " locku_avg_latency",
          " lookup_avg_latency",
          " lookupp_avg_latency",
          " null_avg_latency",
          " nverify_avg_latency",
          " open_avg_latency",
          " open_downgrade_avg_latency",
          " openattr_avg_latency",
          " putfh_avg_latency",
          " putpubfh_avg_latency",
          " putrootfh_avg_latency",
          " read_avg_latency",
          " readdir_avg_latency",
          " readlink_avg_latency",
          " reclaim_complete_avg_latency",
          " remove_avg_latency",
          " rename_avg_latency",
          " restorefh_avg_latency",
          " savefh_avg_latency",
          " secinfo_avg_latency",
          " secinfo_no_name_avg_latency",
          " sequence_avg_latency",
          " set_ssv_avg_latency",
          " setattr_avg_latency",
          " test_stateid_avg_latency",
          " verify_avg_latency",
          " want_delegation_avg_latency",
          " write_avg_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "cifs_vserver.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 13,
        "List": [
          " instance_uuid",
          " instance_name",
          " cifs_op_count",
          " cifs_ops",
          " cifs_read_ops",
          " cifs_write_ops",
          " cifs_latency",
          " cifs_read_latency",
          " cifs_write_latency",
          " connections",
          " established_sessions",
          " open_files",
          " signed_sessions"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "lif.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 11,
        "List": [
          " instance_uuid",
          " instance_name",
          " node_name",
          " vserver_name",
          " current_port",
          " recv_data",
          " recv_packet",
          " recv_errors",
          " sent_data",
          " sent_packet",
          " sent_errors"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "iscsi_lif.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 15,
        "List": [
          " instance_name",
          " instance_uuid",
          " vserver_name",
          " node_name",
          " protocol_errors",
          " read_data",
          " write_data",
          " iscsi_read_ops",
          " avg_read_latency",
          " iscsi_write_ops",
          " avg_write_latency",
          " iscsi_other_ops",
          " avg_other_latency",
          " cmd_transfered",
          " avg_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "fcp_lif.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 15,
        "List": [
          " instance_name",
          " instance_uuid",
          " vserver_name",
          " node_name",
          " port_id",
          " read_data",
          " read_ops",
          " avg_read_latency",
          " write_data",
          " write_ops",
          " avg_write_latency",
          " other_ops",
          " avg_other_latency",
          " total_ops",
          " avg_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "copy_manager.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 7,
        "List": [
          " instance_name",
          " instance_uuid",
          " bce_copy_count_curr",
          " ocs_copy_count_curr",
          " sce_copy_count_curr",
          " spince_copy_count_curr",
          " KB_copied"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "wafl_comp_aggr_vol_bin.yaml",
      "ClientTimeout": "60s",
      "Schedules": [
        {
          "Name": "counter",
          "Schedule": "1200s"
        },
        {
          "Name": "instance",
          "Schedule": "600s"
        },
        {
          "Name": "data",
          "Schedule": "60s"
        }
      ],
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 5,
        "List": [
          " instance_name",
          " vserver_name",
          " vol_name",
          " cloud_bin_operation",
          " cloud_bin_op_latency_average"
        ]
      }
    }
  ]
}
```
cgrinds: # 7-mode cluster

```
{
  "Target": {
    "Version": "8.2.5",
    "Model": "7mode",
    "Serial": "651441000023",
    "Ping": 0,
    "ClusterUuid": "0536905729"
  },
  "Harvest": {
    "HostHash": "df62c133cbd0fef8ccda100e3c04c33eb3b2d911",
    "UUID": "7ef25baf393a4a42436be4550d88da17e8653726",
    "Version": "2.0.2",
    "Release": "rc2",
    "Commit": "HEAD",
    "BuildDate": "undefined",
    "NumClusters": 1
  },
  "Platform": {
    "OS": "darwin",
    "Arch": "darwin",
    "Memory": {
      "TotalKb": 33554432,
      "AvailableKb": 13046004,
      "UsedKb": 20508428
    },
    "CPUs": 1
  },
  "Nodes": {
    "Count": 1,
    "DataPoints": 8,
    "PollTime": 603696,
    "ApiTime": 601806,
    "ParseTime": 463,
    "PluginTime": 3,
    "Uuids": []
  },
  "Volumes": {
    "Count": 3,
    "DataPoints": 33,
    "PollTime": 747527,
    "ApiTime": 594873,
    "ParseTime": 1779,
    "PluginTime": 6
  },
  "Collectors": [
    {
      "Name": "Zapi",
      "Template": "node.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 9,
        "List": [
          "system-info memory-size",
          "system-info maximum-aggregate-size",
          "system-info maximum-flexible-volume-count",
          "system-info maximum-flexible-volume-size",
          "system-info system-name",
          "system-info system-model",
          "system-info system-serial-number",
          "system-info vendor-id",
          "system-info product-version"
        ]
      }
    },
    {
      "Name": "Zapi",
      "Template": "aggr.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 37,
        "List": [
          "aggr-info name",
          "aggr-info uuid",
          "aggr-info home-name",
          "aggr-info type",
          "aggr-info state",
          "aggr-info disk-count",
          "aggr-info plex-count",
          "aggr-info raid-size",
          "aggr-info volume-count",
          "aggr-info size-available",
          "aggr-info size-total",
          "aggr-info size-used",
          "aggr-info size-percentage-used",
          "aggr-info aggregate-space-details aggregate-space-info aggregate-space fs-space-info fs-files-private-used",
          "aggr-info aggregate-space-details aggregate-space-info aggregate-space fs-space-info fs-files-total",
          "aggr-info aggregate-space-details aggregate-space-info aggregate-space fs-space-info fs-files-used",
          "aggr-info aggregate-space-details aggregate-space-info aggregate-space fs-space-info fs-inodefile-private-capacity",
          "aggr-info aggregate-space-details aggregate-space-info aggregate-space fs-space-info fs-inodefile-public-capacity",
          "aggr-info aggregate-space-details aggregate-space-info aggregate-space fs-space-info fs-maxfiles-available",
          "aggr-info aggregate-space-details aggregate-space-info aggregate-space fs-space-info fs-maxfiles-possible",
          "aggr-info aggregate-space-details aggregate-space-info aggregate-space fs-space-info fs-maxfiles-used",
          "aggr-info aggregate-space-details aggregate-space-info aggregate-space fs-space-info fs-percent-inode-used-capacity",
          "aggr-info aggregate-space-details aggregate-space-info aggregate-space fs-space-info fs-hybrid-cache-size-total",
          "aggr-info aggregate-space-details aggregate-space-info aggregate-space fs-space-info fs-total-reserved-space",
          "aggr-info aggregate-space-details aggregate-space-info aggregate-space fs-space-info fs-sis-percent-saved",
          "aggr-info aggregate-space-details aggregate-space-info aggregate-space fs-space-info fs-sis-saved-space",
          "aggr-info aggregate-space-details aggregate-space-info aggregate-space fs-space-info fs-sis-shared-space",
          "aggr-info aggregate-space-details aggregate-space-info snapshot-space snapshot-space-info snapshot-files-total",
          "aggr-info aggregate-space-details aggregate-space-info snapshot-space snapshot-space-info snapshot-files-used",
          "aggr-info aggregate-space-details aggregate-space-info snapshot-space snapshot-space-info snapshot-maxfiles-available",
          "aggr-info aggregate-space-details aggregate-space-info snapshot-space snapshot-space-info snapshot-maxfiles-possible",
          "aggr-info aggregate-space-details aggregate-space-info snapshot-space snapshot-space-info snapshot-maxfiles-used",
          "aggr-info aggregate-space-details aggregate-space-info snapshot-space snapshot-space-info snapshot-percent-inode-used-capacity",
          "aggr-info aggregate-space-details aggregate-space-info snapshot-space snapshot-space-info snapshot-percent-used-capacity",
          "aggr-info aggregate-space-details aggregate-space-info snapshot-space snapshot-space-info snapshot-size-available",
          "aggr-info aggregate-space-details aggregate-space-info snapshot-space snapshot-space-info snapshot-size-total",
          "aggr-info aggregate-space-details aggregate-space-info snapshot-space snapshot-space-info snapshot-size-used"
        ]
      }
    },
    {
      "Name": "Zapi",
      "Template": "volume.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 20,
        "List": [
          "volume-info name",
          "volume-info type",
          "volume-info uuid",
          "volume-info state",
          "volume-info containing-aggregate",
          "volume-info files-total",
          "volume-info files-used",
          "volume-info filesystem-size",
          "volume-info size-available",
          "volume-info size-total",
          "volume-info size-used",
          "volume-info percentage-used",
          "volume-info autosize grow-threshold-percent",
          "volume-info autosize maximum-size",
          "volume-info sis compress-saved",
          "volume-info sis dedup-saved",
          "volume-info sis percent-compress-saved",
          "volume-info sis percent-dedup-saved",
          "volume-info sis percent-total-saved",
          "volume-info sis total-saved"
        ]
      }
    },
    {
      "Name": "Zapi",
      "Template": "disk.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 10,
        "List": [
          "disk-detail-info bytes-per-sector",
          "disk-detail-info disk-model",
          "disk-detail-info disk-type",
          "disk-detail-info disk-uid",
          "disk-detail-info is-offline",
          "disk-detail-info name",
          "disk-detail-info poweron-hours",
          "disk-detail-info raw-disk-sectors",
          "disk-detail-info serial-number",
          "disk-detail-info shelf"
        ]
      }
    },
    {
      "Name": "Zapi",
      "Template": "shelf.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 6,
        "List": [
          "shelf-environ-channel-info channel-name",
          "shelf-environ-channel-info shelf-environ-shelf-list shelf-environ-shelf-info shelf-id",
          "shelf-environ-channel-info shelf-environ-shelf-list shelf-environ-shelf-info shelf-status",
          "shelf-environ-channel-info shelf-environ-shelf-list shelf-environ-shelf-info shelf-type",
          "shelf-environ-channel-info shelf-environ-shelf-list shelf-environ-shelf-info status-reads-attempted",
          "shelf-environ-channel-info shelf-environ-shelf-list shelf-environ-shelf-info status-reads-failed"
        ]
      }
    },
    {
      "Name": "Zapi",
      "Template": "status.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 1,
        "List": [
          " status"
        ]
      }
    },
    {
      "Name": "Zapi",
      "Template": "subsystem.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 4,
        "List": [
          "diagnosis-subsystem-config-info health",
          "diagnosis-subsystem-config-info subsystem",
          "diagnosis-subsystem-config-info outstanding-alert-count",
          "diagnosis-subsystem-config-info suppressed-alert-count"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "system_node.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 21,
        "List": [
          " instance_name",
          " avg_processor_busy",
          " cpu_busy",
          " cpu_elapsed_time",
          " uptime",
          " total_ops",
          " sys_avg_latency",
          " cifs_ops",
          " nfs_ops",
          " iscsi_ops",
          " fcp_ops",
          " disk_data_read",
          " disk_data_written",
          " hdd_data_read",
          " hdd_data_written",
          " ssd_data_read",
          " ssd_data_written",
          " net_data_recv",
          " net_data_sent",
          " fcp_data_recv",
          " fcp_data_sent"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "hostadapter.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 4,
        "List": [
          " instance_name",
          " node_name",
          " bytes_read",
          " bytes_written"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "path.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 11,
        "List": [
          " instance_name",
          " instance_uuid",
          " node_name",
          " read_iops",
          " read_data",
          " write_data",
          " write_iops",
          " total_data",
          " total_iops",
          " read_latency",
          " write_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "disk.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 21,
        "List": [
          " instance_name",
          " cp_read_chain",
          " cp_read_latency",
          " cp_reads",
          " disk_busy",
          " disk_capacity",
          " disk_speed",
          " io_pending",
          " io_queued",
          " physical_disk_name",
          " raid_group",
          " raid_type",
          " total_transfers",
          " user_read_chain",
          " user_read_blocks",
          " user_read_latency",
          " user_reads",
          " user_write_chain",
          " user_write_blocks",
          " user_write_latency",
          " user_writes"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "ext_cache_obj.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 20,
        "List": [
          " instance_name",
          " instance_uuid",
          " node_name",
          " disk_reads_replaced",
          " accesses",
          " hit_percent",
          " inserts",
          " evicts",
          " invalidates",
          " usage",
          " hit",
          " hit_normal_lev0",
          " hit_metadata_file",
          " hit_directory",
          " hit_indirect",
          " miss",
          " miss_normal_lev0",
          " miss_metadata_file",
          " miss_directory",
          " miss_indirect"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "wafl.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 13,
        "List": [
          " instance_uuid",
          " avg_wafl_msg_latency",
          " avg_non_wafl_msg_latency",
          " avg_wafl_repl_msg_latency",
          " wafl_msg_total",
          " wafl_repl_msg_total",
          " non_wafl_msg_total",
          " cp_count",
          " cp_phase_times",
          " read_io_type",
          " total_cp_msecs",
          " wafl_memory_used",
          " wafl_memory_free"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "wafl_hya_per_aggr.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 19,
        "List": [
          " instance_name",
          " node_name",
          " ssd_total",
          " ssd_total_used",
          " ssd_available",
          " ssd_read_cached",
          " ssd_write_cached",
          " read_ops_replaced",
          " read_ops_replaced_percent",
          " write_blks_replaced",
          " write_blks_replaced_percent",
          " hya_read_hit_latency_average",
          " hya_read_miss_latency_average",
          " hya_write_ssd_latency_average",
          " hya_write_hdd_latency_average",
          " read_cache_ins_rate",
          " wc_write_blks_total",
          " evict_remove_rate",
          " evict_destage_rate"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "wafl_hya_sizer.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 3,
        "List": [
          " instance_name",
          " node_name",
          " cache_stats"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "nic_common.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 17,
        "List": [
          " instance_name",
          " instance_uuid",
          " node_name",
          " rx_bytes",
          " tx_bytes",
          " link_speed",
          " link_current_state",
          " link_up_to_downs",
          " nic_type",
          " rx_alignment_errors",
          " rx_crc_errors",
          " rx_length_errors",
          " rx_total_errors",
          " rx_errors",
          " tx_errors",
          " tx_hw_errors",
          " tx_total_errors"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "fcp.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 10,
        "List": [
          " instance_name",
          " instance_uuid",
          " node_name",
          " fcp_read_latency",
          " fcp_write_latency",
          " fcp_read_data",
          " fcp_write_data",
          " fcp_read_ops",
          " fcp_write_ops",
          " fcp_ops"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "volume_node.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 33,
        "List": [
          " instance_name",
          " cifs_read_data",
          " cifs_write_data",
          " cifs_read_ops",
          " cifs_write_ops",
          " cifs_other_ops",
          " cifs_read_latency",
          " cifs_write_latency",
          " cifs_other_latency",
          " nfs_read_data",
          " nfs_write_data",
          " nfs_read_ops",
          " nfs_write_ops",
          " nfs_other_ops",
          " nfs_read_latency",
          " nfs_write_latency",
          " nfs_other_latency",
          " iscsi_read_data",
          " iscsi_write_data",
          " iscsi_read_ops",
          " iscsi_write_ops",
          " iscsi_other_ops",
          " iscsi_read_latency",
          " iscsi_write_latency",
          " iscsi_other_latency",
          " fcp_read_data",
          " fcp_write_data",
          " fcp_read_ops",
          " fcp_write_ops",
          " fcp_other_ops",
          " fcp_read_latency",
          " fcp_write_latency",
          " fcp_other_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "token_manager.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 10,
        "List": [
          " instance_name",
          " token_copy_success",
          " token_create_success",
          " token_zero_success",
          " token_copy_failure",
          " token_create_failure",
          " token_zero_failure",
          " token_copy_bytes",
          " token_create_bytes",
          " token_zero_bytes"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "processor.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 4,
        "List": [
          " node_name",
          " instance_name",
          " domain_busy",
          " processor_busy"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "cifs_node.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 8,
        "List": [
          " instance_name",
          " cifs_op_count",
          " cifs_ops",
          " cifs_read_ops",
          " cifs_write_ops",
          " cifs_latency",
          " cifs_read_latency",
          " cifs_write_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "nfsv3_node.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 7,
        "List": [
          " instance_name",
          " nfsv3_ops",
          " nfsv3_read_ops",
          " nfsv3_write_ops",
          " nfsv3_read_latency",
          " nfsv3_write_latency",
          " nfsv3_avg_op_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "nfsv4_node.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 7,
        "List": [
          " instance_name",
          " nfsv3_avg_latency",
          " nfsv4_ops",
          " nfsv4_ready_latency",
          " nfsv4_write_latency",
          " nfsv4_read_ops",
          " nfsv4_write_ops"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "volume.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 15,
        "List": [
          " instance_uuid",
          " instance_name",
          " vserver_name",
          " node_name",
          " parent_aggr",
          " read_data",
          " write_data",
          " read_ops",
          " write_ops",
          " other_ops",
          " total_ops",
          " read_latency",
          " write_latency",
          " other_latency",
          " avg_latency"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "lun.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 13,
        "List": [
          " instance_name",
          " read_data",
          " write_data",
          " read_ops",
          " write_ops",
          " avg_read_latency",
          " avg_write_latency",
          " avg_xcopy_latency",
          " queue_full",
          " read_partial_blocks",
          " write_partial_blocks",
          " write_align_histo",
          " read_align_histo"
        ]
      }
    },
    {
      "Name": "ZapiPerf",
      "Template": "iscsi_lif.yaml",
      "Exporters": [
        "Prometheus"
      ],
      "Counters": {
        "Count": 14,
        "List": [
          " instance_name",
          " instance_uuid",
          " vserver_name",
          " protocol_errors",
          " read_data",
          " write_data",
          " iscsi_read_ops",
          " avg_read_latency",
          " iscsi_write_ops",
          " avg_write_latency",
          " iscsi_other_ops",
          " avg_other_latency",
          " cmd_transfered",
          " avg_latency"
        ]
      }
    }
  ]
}
```

Patch:
diff --git a/.gitignore b/.gitignore
index 9376c15a..4c6543ca 100644
--- a/.gitignore
+++ b/.gitignore
@@ -18,4 +18,5 @@
 # build directories
 bin/
 dist/
-cert/
\ No newline at end of file
+cert/
+asup/
\ No newline at end of file
diff --git a/cmd/collectors/zapi/collector/zapi.go b/cmd/collectors/zapi/collector/zapi.go
index 228fdf2b..9b50345b 100644
--- a/cmd/collectors/zapi/collector/zapi.go
+++ b/cmd/collectors/zapi/collector/zapi.go
@@ -1,9 +1,11 @@
 /*
  * Copyright NetApp Inc, 2021 All rights reserved
  */
+
 package zapi
 
 import (
+	"fmt"
 	"goharvest2/cmd/collectors/zapi/plugins/shelf"
 	"goharvest2/cmd/collectors/zapi/plugins/snapmirror"
 	"goharvest2/cmd/collectors/zapiperf/plugins/fcp"
@@ -412,6 +414,111 @@ func (me *Zapi) PollData() (*matrix.Matrix, error) {
 	return me.Matrix, nil
 }
 
+func (me *Zapi) CollectAutoSupport(p *collector.Payload) {
+	var exporterTypes []string
+	for _, exporter := range me.Exporters {
+		exporterTypes = append(exporterTypes, exporter.GetClass())
+	}
+
+	var counters = make([]string, 0)
+	if me.Params != nil {
+		c := me.Params.GetChildS("counters")
+		c.FlatList(&counters, "")
+	}
+
+	var schedules = make([]collector.Schedule, 0)
+	tasks := me.Params.GetChildS("schedule")
+	if tasks != nil && len(tasks.GetChildren()) > 0 {
+		for _, task := range tasks.GetChildren() {
+			schedules = append(schedules, collector.Schedule{
+				Name:     task.GetNameS(),
+				Schedule: task.GetContentS(),
+			})
+		}
+	}
+
+	clientTimeout := strconv.Itoa(client.DefaultTimeout)
+	clientNode := me.Params.GetChildS("client_timeout")
+	if clientNode != nil {
+		clientTimeout = clientNode.GetContentS()
+	}
+
+	// Add collector information
+	p.AddCollectorAsup(collector.AsupCollector{
+		Name:      me.Name,
+		Query:     me.Query,
+		BatchSize: me.batchSize,
+		Exporters: exporterTypes,
+		Counters: collector.Counters{
+			Count: len(counters),
+			List:  counters,
+		},
+		Schedules:     schedules,
+		ClientTimeout: clientTimeout,
+	})
+
+	if me.Name == "Zapi" && (me.Object == "Volume" || me.Object == "Node") {
+		p.Target.Version = me.GetHostVersion()
+		p.Target.Model = me.GetHostModel()
+		p.Target.Serial = me.GetHostUUID()
+		p.Target.ClusterUuid = me.Client.ClusterUuid()
+
+		md := me.GetMetadata()
+		info := collector.InstanceInfo{
+			Count:      md.LazyValueInt64("count", "instance"),
+			DataPoints: md.LazyValueInt64("count", "data"),
+			PollTime:   md.LazyValueInt64("poll_time", "data"),
+			ApiTime:    md.LazyValueInt64("api_time", "data"),
+			ParseTime:  md.LazyValueInt64("parse_time", "data"),
+			PluginTime: md.LazyValueInt64("plugin_time", "data"),
+		}
+
+		if me.Object == "Node" {
+			nodes, err := me.getNodeUuids()
+			if err != nil {
+				// log but don't return so the other info below is collected
+				me.Logger.Error().
+					Err(err).
+					Msg("Unable to get nodes.")
+				nodes = make([]string, 0)
+			}
+			info.Uuids = &nodes
+			p.Nodes = &info
+		} else if me.Object == "Volume" {
+			p.Volumes = &info
+		}
+	}
+}
+
+func (me *Zapi) getNodeUuids() ([]string, error) {
+	var (
+		response *node.Node
+		nodes    []*node.Node
+		err      error
+		uuids    []string
+	)
+
+	// 7-mode does not have this information
+	if !me.Client.IsClustered() {
+		return make([]string, 0), err
+	}
+	request := "cluster-node-get-iter"
+
+	if response, err = me.Client.InvokeRequestString(request); err != nil {
+		return nil, fmt.Errorf("failure invoking zapi: %s %w", request, err)
+	}
+
+	if attrs := response.GetChildS("attributes-list"); attrs != nil {
+		nodes = attrs.GetChildren()
+	}
+
+	for _, n := range nodes {
+		uuid := n.GetChildContentS("node-uuid")
+		uuids = append(uuids, uuid)
+	}
+	return uuids, nil
+}
+
 // Interface guards
 var (
 	_ collector.Collector = (*Zapi)(nil)
diff --git a/cmd/poller/collector/asup.go b/cmd/poller/collector/asup.go
new file mode 100644
index 00000000..3f85f3a6
--- /dev/null
+++ b/cmd/poller/collector/asup.go
@@ -0,0 +1,305 @@
+package collector
+
+import (
+	"context"
+	"crypto/sha1"
+	"encoding/hex"
+	"encoding/json"
+	"errors"
+	"fmt"
+	"github.com/shirou/gopsutil/cpu"
+	"github.com/shirou/gopsutil/host"
+	"github.com/shirou/gopsutil/v3/mem"
+	"goharvest2/cmd/harvest/version"
+	"goharvest2/pkg/logging"
+	"goharvest2/pkg/matrix"
+	"os"
+	"os/exec"
+	"path"
+	"time"
+)
+
+type Payload struct {
+	Target     *TargetInfo
+	Harvest    *harvestInfo
+	Platform   *platformInfo
+	Nodes      *InstanceInfo
+	Volumes    *InstanceInfo
+	Collectors *[]AsupCollector
+	path       string
+}
+
+type TargetInfo struct {
+	Version     string
+	Model       string
+	Serial      string
+	Ping        float64
+	ClusterUuid string
+}
+
+type InstanceInfo struct {
+	Count      int64
+	DataPoints int64
+	PollTime   int64
+	ApiTime    int64
+	ParseTime  int64
+	PluginTime int64
+	Uuids      *[]string `json:"Uuids,omitempty"`
+}
+
+type platformInfo struct {
+	OS     string
+	Arch   string
+	Memory struct {
+		TotalKb     uint64
+		AvailableKb uint64
+		UsedKb      uint64
+	}
+	CPUs uint8
+}
+
+type harvestInfo struct {
+	HostHash    string
+	UUID        string
+	Version     string
+	Release     string
+	Commit      string
+	BuildDate   string
+	NumClusters uint8
+}
+
+type Counters struct {
+	Count int
+	List  []string
+}
+
+type Schedule struct {
+	Name     string
+	Schedule string
+}
+
+type AsupCollector struct {
+	Name          string
+	Query         string
+	BatchSize     string `json:"BatchSize,omitempty"`
+	ClientTimeout string
+	Schedules     []Schedule
+	Exporters     []string
+	Counters      Counters
+}
+
+const workingDir = "asup"
+
+func (p *Payload) AddCollectorAsup(a AsupCollector) {
+	if p.Collectors == nil {
+		p.Collectors = &[]AsupCollector{}
+	}
+	*p.Collectors = append(*p.Collectors, a)
+}
+
+func SendAutosupport(collectors []Collector, status *matrix.Matrix, pollerName string) error {
+
+	var (
+		msg *Payload
+		err error
+	)
+
+	if msg, err = BuildAndWriteAutoSupport(collectors, status, pollerName); err != nil {
+		return fmt.Errorf("failed to build ASUP message poller:%s %w", pollerName, err)
+	}
+
+	if err = sendAsupMessage(msg); err != nil {
+		return fmt.Errorf("failed to send ASUP message poller:%s %w", pollerName, err)
+	}
+
+	return nil
+}
+
+// This function forks the autosupport binary
+func sendAsupMessage(msg *Payload) error {
+	err := sendAsupVia(msg, "./bin/asup")
+	if errors.Is(err, os.ErrNotExist) {
+		err = sendAsupVia(msg, "../harvest-private/harvest-asup/bin/asup")
+	}
+	if err != nil {
+		return err
+	}
+	return nil
+}
+
+func sendAsupVia(msg *Payload, asupExecPath string) error {
+	asupTimeOutLimit := 10 * time.Second
+
+	// Invoke autosupport binary
+	cont, cancel := context.WithTimeout(context.Background(), asupTimeOutLimit)
+	defer cancel()
+	logging.Get().Info().
+		Str("payloadPath", msg.path).
+		Msg("Fork autosupport binary.")
+
+	exitStatus := 0
+	err := exec.CommandContext(cont, asupExecPath, "--payload", msg.path, "--working-dir", workingDir).Run()
+	if err != nil {
+		if exitError, ok := err.(*exec.ExitError); ok {
+			exitStatus = exitError.ExitCode()
+		}
+	}
+
+	// make sure to timeout after x minutes, kill that process
+	if errors.Is(cont.Err(), context.DeadlineExceeded) {
+		return fmt.Errorf("autosupport call to %s timed out:%w", asupExecPath, err)
+	}
+
+	if err != nil {
+		logging.Get().Error().
+			Err(err).
+			Str("payloadPath", msg.path).
+			Msg("Unable to execute autosupport binary")
+		return err
+	}
+
+	logging.Get().Info().
+		Str("payloadPath", msg.path).
+		Int("exitStatus", exitStatus).
+		Msg("Autosupport binary forked successfully.")
+
+	return nil
+}
+
+func BuildAndWriteAutoSupport(collectors []Collector, status *matrix.Matrix, pollerName string) (*Payload, error) {
+
+	var (
+		msg  *Payload
+		arch string
+		cpus uint8
+	)
+
+	// add info about platform (where Harvest is running)
+	arch, cpus = getCPUInfo()
+	msg = &Payload{
+		Platform: &platformInfo{
+			Arch: arch,
+			CPUs: cpus,
+			OS:   getOSName(),
+		},
+		Target: &TargetInfo{
+			Ping: status.LazyValueFloat64("ping", "host"),
+		},
+	}
+	attachMemory(msg)
+
+	// give each collector the opportunity to attach autosupport information
+	for _, c := range collectors {
+		c.CollectAutoSupport(msg)
+	}
+
+	hostname, _ := os.Hostname()
+	// add harvest release info
+	msg.Harvest = &harvestInfo{
+		// harvest uuid creation from sha1 of cluster uuid
+		UUID:        sha1Sum(msg.Target.ClusterUuid),
+		Version:     version.VERSION,
+		Release:     version.Release,
+		Commit:      version.Commit,
+		BuildDate:   version.BuildDate,
+		HostHash:    sha1Sum(hostname),
+		NumClusters: 1,
+	}
+	payloadPath, err := writeAutoSupport(msg, pollerName)
+	if err != nil {
+		return nil, err
+	}
+	msg.path = payloadPath
+	return msg, nil
+}
+
+func writeAutoSupport(msg *Payload, pollerName string) (string, error) {
+	var (
+		payloadPath string
+		err         error
+	)
+
+	if payloadPath, err = getPayloadPath(workingDir, pollerName); err != nil {
+		return "", err
+	}
+
+	// name of the file: {poller_name}_payload.json
+	file, err := os.OpenFile(payloadPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm)
+	if err != nil {
+		return "", fmt.Errorf("autosupport failed to open payloadPath:%s %w", payloadPath, err)
+	}
+	defer func(file *os.File) {
+		_ = file.Close()
+	}(file)
+	encoder := json.NewEncoder(file)
+	encoder.SetIndent("", " ")
+	if err = encoder.Encode(msg); err != nil {
+		return "", fmt.Errorf("autosupport failed to encode payloadPath:%s %w", payloadPath, err)
+	}
+	return payloadPath, nil
+}
+
+func attachMemory(msg *Payload) {
+	virtualMemory, err := mem.VirtualMemory()
+	if err != nil {
+		return
+	}
+	msg.Platform.Memory.TotalKb = virtualMemory.Total / 1024
+	msg.Platform.Memory.AvailableKb = virtualMemory.Available / 1024
+	msg.Platform.Memory.UsedKb = virtualMemory.Used / 1024
+}
+
+func getCPUInfo() (string, uint8) {
+
+	var (
+		arch     string
+		cpuCount int
+		cpuInfo  []cpu.InfoStat
+		hostInfo *host.InfoStat
+		err      error
+	)
+
+	if cpuInfo, err = cpu.Info(); err == nil {
+		if cpuInfo != nil {
+			cpuCount = len(cpuInfo)
+		}
+	}
+
+	if hostInfo, err = host.Info(); err == nil {
+		if hostInfo != nil {
+			arch = (*hostInfo).Platform
+		}
+	}
+
+	return arch, uint8(cpuCount)
+}
+
+func getOSName() string {
+	info, err := host.Info()
+	if err != nil {
+		return ""
+	}
+	return info.OS
+}
+
+// Gives asup payload json file path based on input.
+// Ex. asupDir = asup, pollerName = poller-1
+// o/p would be asup/payload/poller-1_payload.json
+func getPayloadPath(asupDir string, pollerName string) (string, error) {
+	payloadDir := path.Join(asupDir, "payload")
+
+	// Create the asup payload directory if needed
+	if _, err := os.Stat(payloadDir); os.IsNotExist(err) {
+		if err = os.MkdirAll(payloadDir, 0777); err != nil {
+			return "", fmt.Errorf("could not create asup payload directory %s: %w", payloadDir, err)
+		}
+	}
+
+	return path.Join(payloadDir, fmt.Sprintf("%s_%s", pollerName, "payload.json")), nil
+}
+
+func sha1Sum(s string) string {
+	hash := sha1.New()
+	hash.Write([]byte(s))
+	return hex.EncodeToString(hash.Sum(nil))
+}
diff --git a/cmd/poller/collector/collector.go b/cmd/poller/collector/collector.go
index 6486edc2..4ee6d850 100644
--- a/cmd/poller/collector/collector.go
+++ b/cmd/poller/collector/collector.go
@@ -8,7 +8,7 @@
 	A Harvest collector should normally "inherit" all these
 	attributes and implement only the PollData function.
 	The AbstractCollector will make sure that the collector
-	is properly initializied, metadata are updated and
+	is properly initialized, metadata are updated and
 	data poll(s) and plugins run as scheduled. The collector
 	can also choose to override any of the attributes
 	implemented by AbstractCollector.
@@ -49,10 +49,6 @@ type Collector interface {
 	GetObject() string
 	GetParams() *node.Node
 	GetOptions() *options.Options
-	GetMetadata() *matrix.Matrix
-	GetHostVersion() string
-	GetHostModel() string
-	GetHostUUID() string
 	GetCollectCount() uint64
 	AddCollectCount(uint64)
 	GetStatus() (uint8, string, string)
@@ -64,6 +60,7 @@ type Collector interface {
 	LinkExporter(exporter.Exporter)
 	LoadPlugins(*node.Node, Collector) error
 	LoadPlugin(string, *plugin.AbstractPlugin) plugin.Plugin
+	CollectAutoSupport(p *Payload)
 }
 
 // Status defines the possible states of a collector
@@ -485,7 +482,7 @@ func (me *AbstractCollector) SetMetadata(m *matrix.Matrix) {
 	me.Metadata = m
 }
 
-// WantedExporters retrievs the names of the exporters to which the collector
+// WantedExporters retrieves the names of the exporters to which the collector
 // needs to export data
 func (me *AbstractCollector) WantedExporters(configFp string) []string {
 	names, err := conf.GetUniqueExporters(me.Params, configFp)
@@ -540,3 +537,7 @@ func (me *AbstractCollector) LoadPlugins(params *node.Node, c Collector) error {
 	me.Logger.Debug().Msgf("initialized %d plugins", len(me.Plugins))
 	return nil
 }
+
+// CollectAutoSupport allows a Collector to add autosupport information
+func (me *AbstractCollector) CollectAutoSupport(_ *Payload) {
+}
diff --git a/cmd/poller/poller.go b/cmd/poller/poller.go
index 42824e46..00e95cc5 100644
--- a/cmd/poller/poller.go
+++ b/cmd/poller/poller.go
@@ -38,7 +38,6 @@ import (
 	"goharvest2/cmd/poller/options"
 	"goharvest2/cmd/poller/plugin"
 	"goharvest2/cmd/poller/schedule"
-	"goharvest2/cmd/tools/asup"
 	"goharvest2/pkg/conf"
 	"goharvest2/pkg/errors"
 	"goharvest2/pkg/logging"
@@ -57,6 +56,7 @@ import (
 	"strings"
 	"sync"
 	"syscall"
+	"time"
 )
 
 // default params
@@ -67,6 +67,7 @@ var (
 	logMaxBackups   = logging.DefaultLogMaxBackups
 	logMaxAge       = logging.DefaultLogMaxAge
 	asupSchedule    = "24h" // send every 24 hours
+	asupFirstWrite  = "4m"  // after this time, write 1st autosupport payload (for testing)
 )
 
 // init with default configuration by default it gets logged both to console and  harvest.log
@@ -296,6 +297,19 @@ func (p *Poller) Init() error {
 		logger.Info().Msgf("Autosupport is disabled")
 	} else {
 		if p.targetIsOntap() {
+			// Write the payload after asupFirstWrite.
+			// This is to examine the autosupport contents
+			// Nothing is sent, sending happens based on the asupSchedule
+			duration, err := time.ParseDuration(asupFirstWrite)
+			if err != nil {
+				logger.Error().Err(err).
+					Str("asupFirstWrite", asupFirstWrite).
+					Msg("Failed to write 1st autosupport payload.")
+			} else {
+				time.AfterFunc(duration, func() {
+					p.firstAutoSupport()
+				})
+			}
 			if err = p.schedule.NewTaskString("asup", asupSchedule, p.startAsup, p.options.Asup); err != nil {
 				return err
 			}
@@ -314,9 +328,20 @@ func (p *Poller) Init() error {
 
 }
 
+func (p *Poller) firstAutoSupport() {
+	if p.collectors == nil {
+		return
+	}
+	if _, err := collector.BuildAndWriteAutoSupport(p.collectors, p.status, p.name); err != nil {
+		logger.Error().Err(err).
+			Str("poller", p.name).
+			Msg("First autosupport failed.")
+	}
+}
+
 func (p *Poller) startAsup() (*matrix.Matrix, error) {
 	if p.collectors != nil {
-		if err := asup.DoAsupMessage(p.options.Config, p.collectors, p.status, p.name); err != nil {
+		if err := collector.SendAutosupport(p.collectors, p.status, p.name); err != nil {
 			logger.Error().Err(err).
 				Str("poller", p.name).
 				Msg("Start autosupport failed.")
diff --git a/cmd/tools/asup/asup.go b/cmd/tools/asup/asup.go
deleted file mode 100644
index 676fac3e..00000000
--- a/cmd/tools/asup/asup.go
+++ /dev/null
@@ -1,437 +0,0 @@
-package asup
-
-import (
-	"context"
-	"crypto/sha1"
-	"encoding/hex"
-	"encoding/json"
-	"errors"
-	"fmt"
-	"github.com/shirou/gopsutil/cpu"
-	"github.com/shirou/gopsutil/host"
-	"github.com/shirou/gopsutil/v3/mem"
-	"goharvest2/cmd/harvest/version"
-	"goharvest2/cmd/poller/collector"
-	client "goharvest2/pkg/api/ontapi/zapi"
-	"goharvest2/pkg/conf"
-	"goharvest2/pkg/logging"
-	"goharvest2/pkg/matrix"
-	"goharvest2/pkg/tree/node"
-	"os"
-	"os/exec"
-	"path"
-	"time"
-)
-
-type asupMessage struct {
-	Target   *targetInfo
-	Nodes    *NodeInstanceInfo
-	Volumes  *instanceInfo
-	Platform *platformInfo
-	Harvest  *harvestInfo
-}
-
-type targetInfo struct {
-	Version     string
-	Model       string
-	Serial      string
-	Ping        float64
-	ClusterUuid string
-}
-
-type NodeInstanceInfo struct {
-	Count      int64
-	DataPoints int64
-	PollTime   int64
-	ApiTime    int64
-	ParseTime  int64
-	PluginTime int64
-	NodeUuid   []string
-}
-
-type instanceInfo struct {
-	Count      int64
-	DataPoints int64
-	PollTime   int64
-	ApiTime    int64
-	ParseTime  int64
-	PluginTime int64
-}
-
-type platformInfo struct {
-	OS       string
-	Arch     string
-	MemoryKb uint64
-	CPUs     uint8
-}
-
-type harvestInfo struct {
-	UUID        string
-	Version     string
-	Release     string
-	Commit      string
-	BuildDate   string
-	NumClusters uint8
-}
-
-func DoAsupMessage(config string, collectors []collector.Collector, status *matrix.Matrix, pollerName string) error {
-
-	var (
-		msg *asupMessage
-		err error
-	)
-
-	connection, err := newClient(config, pollerName)
-	if err != nil {
-		return fmt.Errorf("failed to create client poller:%s %w", pollerName, err)
-	}
-
-	if msg, err = buildAsupMessage(collectors, status, connection); err != nil {
-		return fmt.Errorf("failed to build ASUP message poller:%s %w", pollerName, err)
-	}
-
-	if err = sendAsupMessage(msg, pollerName); err != nil {
-		return fmt.Errorf("failed to send ASUP message poller:%s %w", pollerName, err)
-	}
-
-	return nil
-}
-
-// This function forks the autosupport binary
-func sendAsupMessage(msg *asupMessage, pollerName string) error {
-	err := sendAsupVia(msg, pollerName, "./bin/asup")
-	if errors.Is(err, os.ErrNotExist) {
-		err = sendAsupVia(msg, pollerName, "../harvest-private/harvest-asup/bin/asup")
-	}
-	if err != nil {
-		return err
-	}
-	return nil
-}
-
-func sendAsupVia(msg *asupMessage, pollerName string, asupExecPath string) error {
-	var (
-		payloadPath string
-		err         error
-	)
-	asupTimeOutLimit := 10 * time.Second
-	workingDir := "asup"
-
-	if payloadPath, err = getPayloadPath(workingDir, pollerName); err != nil {
-		return err
-	}
-
-	// name of the file: {poller_name}_payload.json
-	file, err := os.OpenFile(payloadPath, os.O_CREATE|os.O_WRONLY|os.O_TRUNC, os.ModePerm)
-	if err != nil {
-		return fmt.Errorf("autosupport failed to open payloadPath:%s %w", payloadPath, err)
-	}
-	defer func(file *os.File) {
-		_ = file.Close()
-	}(file)
-	encoder := json.NewEncoder(file)
-	encoder.SetIndent("", " ")
-	if err = encoder.Encode(msg); err != nil {
-		return fmt.Errorf("autosupport failed to encode payloadPath:%s %w", payloadPath, err)
-	}
-
-	// Invoke autosupport binary
-	cont, cancel := context.WithTimeout(context.Background(), asupTimeOutLimit)
-	defer cancel()
-	logging.Get().Info().
-		Str("payloadPath", payloadPath).
-		Msg("Fork autosupport binary.")
-
-	exitStatus := 0
-	err = exec.CommandContext(cont, asupExecPath, "--payload", payloadPath, "--working-dir", workingDir).Run()
-	if err != nil {
-		if exitError, ok := err.(*exec.ExitError); ok {
-			exitStatus = exitError.ExitCode()
-		}
-	}
-
-	// make sure to timeout after x minutes, kill that process
-	if errors.Is(cont.Err(), context.DeadlineExceeded) {
-		return fmt.Errorf("autosupport call to %s timed out:%w", asupExecPath, err)
-	}
-
-	if err != nil {
-		logging.Get().Error().
-			Err(err).
-			Str("payloadPath", payloadPath).
-			Msg("Unable to execute autosupport binary")
-		return err
-	}
-
-	logging.Get().Info().
-		Str("payloadPath", payloadPath).
-		Int("exitStatus", exitStatus).
-		Msg("Autosupport binary forked successfully.")
-
-	return nil
-}
-
-func buildAsupMessage(collectors []collector.Collector, status *matrix.Matrix, connection *client.Client) (*asupMessage, error) {
-
-	var (
-		msg  *asupMessage
-		arch string
-		cpus uint8
-	)
-
-	msg = new(asupMessage)
-
-	// add info about platform (where Harvest is running)
-	msg.Platform = new(platformInfo)
-	arch, cpus = getCPUInfo()
-	msg.Platform.Arch = arch
-	msg.Platform.CPUs = cpus
-	msg.Platform.MemoryKb = getRamSize()
-	msg.Platform.OS = getOSName()
-
-	// info about ONTAP host and instances
-	getInstanceInfo(collectors, status, connection, msg)
-
-	// add harvest release info
-	msg.Harvest = new(harvestInfo)
-	// harvest uuid creation from sha1 of cluster uuid
-	msg.Harvest.UUID = getSha1Uuid(msg.Target.ClusterUuid)
-	msg.Harvest.Version = version.VERSION
-	msg.Harvest.Release = version.Release
-	msg.Harvest.Commit = version.Commit
-	msg.Harvest.BuildDate = version.BuildDate
-	msg.Harvest.NumClusters = getNumClusters(collectors)
-	return msg, nil
-}
-
-func getInstanceInfo(collectors []collector.Collector, status *matrix.Matrix, connection *client.Client, msg *asupMessage) {
-	target := new(targetInfo)
-	nodes := new(NodeInstanceInfo)
-	vols := new(instanceInfo)
-
-	// get ping value from poller metadata
-	target.Ping, _ = status.LazyGetValueFloat64("ping", "host")
-
-	// scan collectors
-	for _, c := range collectors {
-		if c.GetName() == "Zapi" {
-			if c.GetObject() == "Node" {
-				md := c.GetMetadata()
-
-				nodes.getNodeInfo(md, connection)
-
-				target.Version = c.GetHostVersion()
-				target.Model = c.GetHostModel()
-				target.Serial = c.GetHostUUID()
-				err := target.getClusterInfo(connection)
-				if err != nil {
-					logging.Get().Warn().
-						Err(err).
-						Msg("Unable to get cluster info")
-				}
-			} else if c.GetObject() == "Volume" {
-				md := c.GetMetadata()
-				vols.Count, _ = md.LazyGetValueInt64("count", "instance")
-				vols.DataPoints, _ = md.LazyGetValueInt64("count", "data")
-				vols.PollTime, _ = md.LazyGetValueInt64("poll_time", "data")
-				vols.ApiTime, _ = md.LazyGetValueInt64("api_time", "data")
-				vols.ParseTime, _ = md.LazyGetValueInt64("parse_time", "data")
-				vols.PluginTime, _ = md.LazyGetValueInt64("plugin_time", "data")
-			}
-		}
-	}
-
-	msg.Target = target
-	msg.Nodes = nodes
-	msg.Volumes = vols
-}
-
-func getCPUInfo() (string, uint8) {
-
-	var (
-		arch     string
-		cpuCount int
-		cpuinfo  []cpu.InfoStat
-		hostinfo *host.InfoStat
-		err      error
-	)
-
-	if cpuinfo, err = cpu.Info(); err == nil {
-		if cpuinfo != nil {
-			cpuCount = len(cpuinfo)
-		}
-	}
-
-	if hostinfo, err = host.Info(); err == nil {
-		if hostinfo != nil {
-			arch = (*hostinfo).Platform
-		}
-	}
-
-	return arch, uint8(cpuCount)
-}
-
-func getRamSize() uint64 {
-
-	var (
-		//output           []byte
-		err error
-		//line, sizeString string
-		//fields           []string
-		memory *mem.VirtualMemoryStat
-		size   uint64
-	)
-
-	if memory, err = mem.VirtualMemory(); err == nil {
-		size = memory.Free / 1024
-	}
-
-	return size
-}
-
-func getOSName() string {
-	info, err := host.Info()
-	if err != nil {
-		return ""
-	}
-	return info.OS
-}
-
-func getNumClusters(collectors []collector.Collector) uint8 {
-	var count uint8
-
-	for _, c := range collectors {
-		if c.GetName() == "Zapi" || c.GetName() == "ZapiPerf" {
-			count++
-			break
-		}
-	}
-
-	return count
-}
-
-// Gives asup payload json file path based on input.
-// Ex. asupDir = asup, pollerName = poller-1
-// o/p would be asup/payload/poller-1_payload.json
-func getPayloadPath(asupDir string, pollerName string) (string, error) {
-	payloadDir := path.Join(asupDir, "payload")
-
-	// Create the asup payload directory if needed
-	if _, err := os.Stat(payloadDir); os.IsNotExist(err) {
-		if err = os.MkdirAll(payloadDir, 0777); err != nil {
-			return "", fmt.Errorf("could not create asup payload directory %s: %w", payloadDir, err)
-		}
-	}
-
-	return path.Join(payloadDir, fmt.Sprintf("%s_%s", pollerName, "payload.json")), nil
-}
-
-func getClusterNodeInfo(client *client.Client) ([]string, error) {
-	var (
-		response *node.Node
-		nodes    []*node.Node
-		err      error
-		uuids    []string
-	)
-
-	request := "cluster-node-get-iter"
-
-	if response, err = client.InvokeRequestString(request); err != nil {
-		return nil, fmt.Errorf("failure invoking zapi: %s %w", request, err)
-	}
-
-	if attrs := response.GetChildS("attributes-list"); attrs != nil {
-		nodes = attrs.GetChildren()
-	}
-
-	for _, n := range nodes {
-		uuid := n.GetChildContentS("node-uuid")
-		uuids = append(uuids, uuid)
-	}
-
-	return uuids, nil
-}
-
-func (target *targetInfo) getClusterInfo(connection *client.Client) error {
-	var (
-		response *node.Node
-		err      error
-	)
-
-	isClustered := target.Model == "cdot"
-	// fetch system name and serial number
-	request := "cluster-identity-get"
-	if !isClustered {
-		request = "system-get-info"
-	}
-
-	if response, err = connection.InvokeRequestString(request); err != nil {
-		return fmt.Errorf("failure invoking zapi: %s %w", request, err)
-	}
-
-	if isClustered {
-		if attrs := response.GetChildS("attributes"); attrs != nil {
-			if info := attrs.GetChildS("cluster-identity-info"); info != nil {
-				target.ClusterUuid = info.GetChildContentS("cluster-uuid")
-			}
-		}
-	} else {
-		if info := response.GetChildS("system-info"); info != nil {
-			// There is no uuid for non cluster mode, using system-id.
-			target.ClusterUuid = info.GetChildContentS("system-id")
-		}
-	}
-	return nil
-}
-
-func (node *NodeInstanceInfo) getNodeInfo(md *matrix.Matrix, connection *client.Client) {
-	uuids, err := getClusterNodeInfo(connection)
-	if err != nil {
-		// log but don't return so the other info below is collected
-		logging.Get().Error().
-			Err(err).
-			Msg("Unable to calculate sha1 of clusterUuid")
-		uuids = make([]string, 0)
-	}
-	node.Count, _ = md.LazyGetValueInt64("count", "instance")
-	node.DataPoints, _ = md.LazyGetValueInt64("count", "data")
-	node.PollTime, _ = md.LazyGetValueInt64("poll_time", "data")
-	node.ApiTime, _ = md.LazyGetValueInt64("api_time", "data")
-	node.ParseTime, _ = md.LazyGetValueInt64("parse_time", "data")
-	node.PluginTime, _ = md.LazyGetValueInt64("plugin_time", "data")
-	node.NodeUuid = uuids
-}
-
-func newClient(config, pollerName string) (*client.Client, error) {
-	var (
-		params     *node.Node
-		err        error
-		connection *client.Client
-	)
-
-	if params, err = conf.GetPoller(config, pollerName); err != nil {
-		return nil, err
-	}
-
-	if connection, err = client.New(params); err != nil {
-		return nil, err
-	}
-
-	if err = connection.Init(2); err != nil {
-		return nil, err
-	}
-
-	return connection, nil
-}
-
-func getSha1Uuid(clusterUuid string) string {
-	shaHash := sha1.New()
-	if _, err := shaHash.Write([]byte(clusterUuid)); err != nil {
-		logging.Get().Error().
-			Err(err).
-			Str("clusterUuid", clusterUuid).
-			Msg("Unable to calculate sha1 of clusterUuid")
-		return ""
-	}
-	return hex.EncodeToString(shaHash.Sum(nil))
-}
diff --git a/pkg/api/ontapi/zapi/client.go b/pkg/api/ontapi/zapi/client.go
index ccedffd2..e187abae 100644
--- a/pkg/api/ontapi/zapi/client.go
+++ b/pkg/api/ontapi/zapi/client.go
@@ -187,6 +187,11 @@ func (c *Client) Serial() string {
 	return c.system.serial
 }
 
+// ClusterUuid returns the cluster UUID of a c-mode system and system-id for 7-mode
+func (c *Client) ClusterUuid() string {
+	return c.system.clusterUuid
+}
+
 // Info returns a string with details about the ONTAP system identity
 func (c *Client) Info() string {
 	var model, version string
diff --git a/pkg/api/ontapi/zapi/system.go b/pkg/api/ontapi/zapi/system.go
index 6aa3d916..eff335b2 100644
--- a/pkg/api/ontapi/zapi/system.go
+++ b/pkg/api/ontapi/zapi/system.go
@@ -12,11 +12,12 @@ import (
 )
 
 type system struct {
-	name      string
-	serial    string
-	release   string
-	version   [3]int
-	clustered bool
+	name        string
+	serial      string
+	clusterUuid string
+	release     string
+	version     [3]int
+	clustered   bool
 }
 
 // See system_test.go for examples
@@ -123,12 +124,15 @@ func (c *Client) getSystem() error {
 			if info := attrs.GetChildS("cluster-identity-info"); info != nil {
 				s.name = info.GetChildContentS("cluster-name")
 				s.serial = info.GetChildContentS("cluster-serial-number")
+				s.clusterUuid = info.GetChildContentS("cluster-uuid")
 			}
 		}
 	} else {
 		if info := response.GetChildS("system-info"); info != nil {
 			s.name = info.GetChildContentS("system-name")
 			s.serial = info.GetChildContentS("system-serial-number")
+			// There is no uuid for non cluster mode, using system-id.
+			s.clusterUuid = info.GetChildContentS("system-id")
 		}
 	}
 	c.system = &s
diff --git a/pkg/matrix/lazy.go b/pkg/matrix/lazy.go
index a1b84c8f..66fd10b1 100644
--- a/pkg/matrix/lazy.go
+++ b/pkg/matrix/lazy.go
@@ -49,16 +49,10 @@ func (me *Matrix) LazyGetValueInt64(m, i string) (int64, bool) {
 	return 0, false
 }
 
-/*
-func (me *Matrix) LazyGetValueInt64(mkey, ikey string) int64 {
-	var v int64
-	if instance := me.GetInstance(ikey); instance != nil {
-		if metric := me.GetMetric(mkey); metric != nil {
-			v, _ = metric.GetValueInt64(instance)
-		}
-	}
-	return v
-}*/
+func (me *Matrix) LazyValueInt64(m, i string) int64 {
+	valueInt64, _ := me.LazyGetValueInt64(m, i)
+	return valueInt64
+}
 
 func (me *Matrix) LazyAddValueInt64(m, i string, v int64) error {
 	if metric := me.GetMetric(m); metric != nil {
@@ -128,3 +122,8 @@ func (me *Matrix) LazyGetValueFloat64(m, i string) (float64, bool) {
 	}
 	return 0.0, false
 }
+
+func (me *Matrix) LazyValueFloat64(m, i string) float64 {
+	valueFloat64, _ := me.LazyGetValueFloat64(m, i)
+	return valueFloat64
+}
diff --git a/pkg/tree/node/node.go b/pkg/tree/node/node.go
index 2370fd01..97dce9e9 100644
--- a/pkg/tree/node/node.go
+++ b/pkg/tree/node/node.go
@@ -10,6 +10,7 @@ import (
 	"fmt"
 	"goharvest2/pkg/color"
 	"goharvest2/pkg/util"
+	"regexp"
 	"strings"
 )
 
@@ -281,6 +282,41 @@ func (n *Node) UnmarshalXML(dec *xml.Decoder, root xml.StartElement) error {
 	return dec.DecodeElement((*node)(n), &root)
 }
 
+func (n *Node) FlatList(list *[]string, prefix string) {
+	if n == nil {
+		return
+	}
+	if len(n.Children) == 0 {
+		var sub string
+		if len(prefix) > 0 {
+			sub = prefix + " " + simpleName(n.GetContentS())
+		} else {
+			sub = simpleName(n.GetContentS())
+		}
+		*list = append(*list, sub)
+	} else {
+		nameS := n.GetNameS()
+		if len(nameS) > 0 && nameS != "counters" {
+			if prefix == "" {
+				prefix = nameS
+			} else {
+				prefix += " " + nameS
+			}
+		}
+		for _, child := range n.Children {
+			child.FlatList(list, prefix)
+		}
+	}
+}
+
+var wordRegex = regexp.MustCompile(`(\w|-)+`)
+
+// simpleName returns the first word in the string s
+// ignoring non-word characters. see node_test for examples
+func simpleName(s string) string {
+	return wordRegex.FindString(s)
+}
+
 func (n *Node) Print(depth int) {
 	name := "* "
 	content := " *"


Test patch:
diff --git a/pkg/tree/node/node_test.go b/pkg/tree/node/node_test.go
new file mode 100644
index 00000000..fef00b8e
--- /dev/null
+++ b/pkg/tree/node/node_test.go
@@ -0,0 +1,71 @@
+package node
+
+import (
+	"testing"
+)
+
+func Test_simpleName(t *testing.T) {
+	tests := []struct {
+		name string
+		s    string
+		want string
+	}{
+		{name: "empty", s: "", want: ""},
+		{name: "simple", s: "abc", want: "abc"},
+		{name: "simple 1 space", s: "abc ", want: "abc"},
+		{name: "simple more space", s: "abc      ", want: "abc"},
+		{name: "simple prefix", s: "^^abc  => asdf ", want: "abc"},
+		{name: "space prefix", s: "   abc  => asdf ", want: "abc"},
+		{name: "dashed", s: "cpu-busy => zig", want: "cpu-busy"},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			if got := simpleName(tt.s); got != tt.want {
+				t.Errorf("simpleName() = %v, want %v", got, tt.want)
+			}
+		})
+	}
+}
+
+func TestNode_FlatList(t *testing.T) {
+	tests := []struct {
+		name  string
+		tree  *Node
+		want  string
+		count int
+	}{
+		{name: "perf", tree: makeTree("counters", "instance_name"), want: "instance_name", count: 1},
+		{name: "conf", tree: makeTree("counters", "node-details-info", "cpu-busytime"),
+			want: "node-details-info cpu-busytime", count: 1},
+	}
+	for _, tt := range tests {
+		t.Run(tt.name, func(t *testing.T) {
+			list := make([]string, 0)
+			tt.tree.FlatList(&list, "")
+			if len(list) != tt.count {
+				t.Errorf("flat list has size= %v, want %v", len(list), tt.count)
+			}
+			if list[0] != tt.want {
+				t.Errorf("flat list[0] got=[%v], want=[%v]", list[0], tt.want)
+			}
+		})
+	}
+}
+
+func makeTree(names ...string) *Node {
+	tree := Node{
+		name:     []byte("root"),
+		Children: make([]*Node, 0),
+	}
+	cursor := &tree
+	for i, n := range names {
+		if i == len(names)-1 {
+			cursor.AddChild(&Node{Content: []byte(n)})
+		} else {
+			child := &Node{name: []byte(n)}
+			cursor.AddChild(child)
+			cursor = child
+		}
+	}
+	return tree.GetChildS(names[0])
+}