So the next script is something I built to pull metric, inventory and relationship data from vCenter on a regular basis using PowerCLI, I then extended the script to collect metrics from vRops once PowerCLI 6.3 Release 1 was available.

I borrowed get-stats2 function from lucd for the datastore metric collection as he did a great job on it and there is no point reinventing the wheel 🙂

The way I use this script is to schedule it with a user that has read only access to the vCenter &/or vRops environment.

You will need to configure and add all the metrics in the MetricConfig.xml file that you wish to collect, I have already left some of the default stuff I collect as an example.. those of you familiar with get-stat will know what to specify in the <MetricName></MetricName> nodes.

In the PCLICollector.ps1 script make sure to update the path to the MetricConfig.xml file.

[xml]$Config = Get-Content 'D:\PCLICollector\MetricConfig.xml'

inside the MetricConfig.xml make sure to update the paths to <ElementList></ElementList> which is used to load the list’s of hosts, vms (Elementlist_HOST.csv or Elementlist_VM.csv), … for the real time metric collection.

You will also need to update all the output paths within <LocalSettings></LocalSettings>

If you wish to collect metrics in Real Time you will need to specify the list of machines within Elementlist_HOST.csv or Elementlist_VM.csv file, I did this as my requirement was not to collect real time data for every object in vCenter but only the ones I was troubleshooting… also note that you must update the <Jobs></Jobs> section in the MetricConfig.xml as it execute several power shell jobs to collect the real time data in parallel…. you will need to adjust the number of jobs depending on the CPU capacity of your collector box.

I am not going to go over the script in this post as its 1108 lines long…  just run the script without parameters and you will get the instructions on how to use it.. if you have any questions please feel free to post them in the comments.

#Powershell collector scripts for vCenter Inventory, Relationships, Performance and Capacity data
<#

    .SYNOPSIS
        Created to collect stuff from Virtual Center or vRops

        Usage:

        -----------------------------------------------
        Performance Metric Collection
        -----------------------------------------------

        VM Collection
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'VM' -CollectionType 'PERFORMANCE'
		or
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'VM' -CollectionType 'PERFORMANCE' -startdate '2016/03/15 18:00' -enddate '2016/03/15 00:00'


        HOST Collection
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'HOST' -CollectionType 'PERFORMANCE'	
		or
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'HOST' -CollectionType 'PERFORMANCE' -startdate '2016/03/15 18:00' -enddate '2016/03/15 00:00'


        DATASTORE Collection
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'DATASTORE' -CollectionType 'PERFORMANCE'	
		or
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'DATASTORE' -CollectionType 'PERFORMANCE' -startdate '2016/03/15 18:00' -enddate '2016/03/15 00:00'


        CLUSTER Collection
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'CLUSTER' -CollectionType 'PERFORMANCE'
		or
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'CLUSTER' -CollectionType 'PERFORMANCE' -startdate '2016/03/15 18:00' -enddate '2016/03/15 00:00'



        -----------------------------------------------
        Performance Real Time Collection - Collects Last hour of data from script execution.
        -----------------------------------------------
            Must be run within the hour otherwise the data will be rolled up and the array of objects to collect must go in the file Elementlist_'MetricSource'.csv
        
        VM Collection
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'VM' -CollectionType 'PERFORMANCERT'

        HOST Collection
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'HOST' -CollectionType 'PERFORMANCERT'	

        CLUSTER Collection
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'CLUSTER' -CollectionType 'PERFORMANCERT'


        -----------------------------------------------
        Performance Metric Collection from vROPS
        -----------------------------------------------

        VM Collection
        .\PCLICollector.ps1 -Server vrops.vMan.ch -MetricSource 'VM-OM' -CollectionType 'PERFORMANCEOM'
		or
        .\PCLICollector.ps1 -Server vrops.vMan.ch -MetricSource 'VM-OM' -CollectionType 'PERFORMANCEOM' -startdate '2016/03/15 18:00' -enddate '2016/03/15 00:00'


        HOST Collection
        .\PCLICollector.ps1 -Server vrops.vMan.ch -MetricSource 'HOST-OM' -CollectionType 'PERFORMANCEOM'	
		or
        .\PCLICollector.ps1 -Server vrops.vMan.ch -MetricSource 'HOST-OM' -CollectionType 'PERFORMANCEOM' -startdate '2016/03/15 18:00' -enddate '2016/03/15 00:00'


        DATASTORE Collection
        .\PCLICollector.ps1 -Server vrops.vMan.ch -MetricSource 'DATASTORE-OM' -CollectionType 'PERFORMANCEOM'	
		or
        .\PCLICollector.ps1 -Server vrops.vMan.ch -MetricSource 'DATASTORE-OM' -CollectionType 'PERFORMANCEOM' -startdate '2016/03/15 18:00' -enddate '2016/03/15 00:00'


        CLUSTER Collection
        .\PCLICollector.ps1 -Server vrops.vMan.ch -MetricSource 'CLUSTER-OM' -CollectionType 'PERFORMANCEOM'
		or
        .\PCLICollector.ps1 -Server vrops.vMan.ch -MetricSource 'CLUSTER-OM' -CollectionType 'PERFORMANCEOM' -startdate '2016/03/15 18:00' -enddate '2016/03/15 00:00'


        S3 Estimate run - All VM's Daily 30min


        -----------------------------------------------
        Inventory Collection
        -----------------------------------------------

        #Count of VM's per Datastore.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType DSVMCOUNT


        #Count of VM's per Host.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VMHOSTCOUNT


        #Count of VM's per Cluster.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VMCLUCOUNT


        #Sum of vCPU's USED per Host.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VCPUHOSTSUM


        #Sum of vCPU's USED per Cluster.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VCPUCLUSUM


        #Sum of vCPU's USED per VMVCPUS.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VMVCPUS


        #Sum of vCPU's USED per VMVMEM.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VMVMEM


        #Sum of vCPU's USED per HOSTMEM.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType HOSTMEM


        #Sum of vCPU's USED per HOSTCPUCORES.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType HOSTCPUCORES



        -----------------------------------------------
        Relationship Collection
        -----------------------------------------------

        #VM to Datastore(s)

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VMDSRELATION


        #VM to Cluster

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VMCLURELATION


        #VM to HOST

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VMHOSTRELATION


        #HOST to Datastore(s)

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType HOSTDSRELATION


        #HOST to Cluster

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType HOSTCLURELATION


        #Cluster to Datacenter

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType CLUDCRELATION

#>

param
(
    [String]$Server,
    [String]$MetricSource,
    [String]$CollectionType,
    [String]$User,
    [String]$Password,
    [DateTime]$StartDate = (Get-date).adddays(-1),
    [DateTime]$EndDate = (Get-date)
)

#Variables

[xml]$Config = Get-Content 'D:\Powershell\PCLICollector\MetricConfig.xml'
$uploadFolderPath =  $Config.VMDatacollector.UploadSettings.LocalSettings | select RawFileFolder,INVFileFolder,RELFileFolder,RTFileFolder,ArchiveFolder,LogFolder

$Invoke = $Config.VMDataCollector.PerfConfigs.$MetricSource.ObjectType
$Interval = $Config.VMDataCollector.PerfConfigs.$MetricSource.Interval

$MetricXPath = '/VMDataCollector/PerfConfigs/' +$MetricSource+ '/Config'

#Jobs
$maxJobCount = $Config.VMDatacollector.Jobs.MaxJobCount
$sleepTimer = $Config.VMDatacollector.Jobs.SleepTimerSec

##################
### FUNCTIONS
##################

# Logs

Function Log([String]$message, [String]$LogType, [String]$LogFile){
    $date = Get-Date -UFormat '%m-%d-%Y %H:%M:%S'
    $message = $date + "`t" + $LogType + "`t" + $message
    $message >> $LogFile
}

#Below function borrowed from http://www.lucd.info/2011/06/19/datastore-usage-statistics/


function Get-Stat2 {
<#
.SYNOPSIS  Retrieve vSphere statistics
.DESCRIPTION The function is an alternative to the Get-Stat cmdlet.
  It's primary use is to provide functionality that is missing
  from the Get-Stat cmdlet.
.NOTES  Author:  Luc Dekens
.PARAMETER Entity
  Specify the VIObject for which you want to retrieve statistics
  This needs to be an SDK object
.PARAMETER Start
  Start of the interval for which to retrive statistics
.PARAMETER Finish
  End of the interval for which to retrive statistics
.PARAMETER Stat
  The identifiers of the metrics to retrieve
.PARAMETER Instance
  The instance property of the statistics to retrieve
.PARAMETER Interval
  Specify for which interval you want to retrieve statistics.
  Allowed values are RT, HI1, HI2, HI3 and HI4
.PARAMETER MaxSamples
  The maximum number of samples for each metric
.PARAMETER QueryMetrics
  Switch to indicate that the function should return the available
  metrics for the Entity specified
.PARAMETER QueryInstances
  Switch to indicate that the function should return the valid instances
  for a specific Entity and Stat
.EXAMPLE
  PS> Get-Stat2 -Entity $vm.Extensiondata -Stat "cpu.usage.average" -Interval "RT"
#>
 
  [CmdletBinding()]
  param (
  [parameter(Mandatory = $true,  ValueFromPipeline = $true)]
  [PSObject]$Entity,
  [DateTime]$Start,
  [DateTime]$Finish,
  [String[]]$Stat,
  [String]$Instance = "",
  [ValidateSet("RT","HI1","HI2","HI3","HI4")]
  [String]$Interval = "RT",
  [int]$MaxSamples,
  [switch]$QueryMetrics,
  [switch]$QueryInstances)
 
  # Test if entity is valid
  $EntityType = $Entity.GetType().Name
 
  if(!(("HostSystem",
        "VirtualMachine",
        "ClusterComputeResource",
        "Datastore",
        "ResourcePool") -contains $EntityType)) {
    Throw "-Entity parameters should be of type HostSystem, VirtualMachine, ClusterComputeResource, Datastore or ResourcePool"
  }
 
  $perfMgr = Get-View (Get-View ServiceInstance).content.perfManager
 
  # Create performance counter hashtable
  $pcTable = New-Object Hashtable
  $keyTable = New-Object Hashtable
  foreach($pC in $perfMgr.PerfCounter){
    if($pC.Level -ne 99){
      if(!$pctable.containskey($pC.GroupInfo.Key + "." + $pC.NameInfo.Key + "." + $pC.RollupType)){
        $pctable.Add(($pC.GroupInfo.Key + "." + $pC.NameInfo.Key + "." + $pC.RollupType),$pC.Key)
        $keyTable.Add($pC.Key, $pC)
      }
    }
  }
 
  # Test for a valid $Interval
  if($Interval.ToString().Split(" ").count -gt 1){
    Throw "Only 1 interval allowed."
  }
 
  $intervalTab = @{"RT"=$null;"HI1"=0;"HI2"=1;"HI3"=2;"HI4"=3}
  $dsValidIntervals = "HI2","HI3","HI4"
  $intervalIndex = $intervalTab[$Interval]
 
  if($EntityType -ne "datastore"){
    if($Interval -eq "RT"){
      $numinterval = 20
    }
    else{
      $numinterval = $perfMgr.HistoricalInterval[$intervalIndex].SamplingPeriod
    }
  }
  else{
    if($dsValidIntervals -contains $Interval){
      $numinterval = $null
      if(!$Start){
        $Start = (Get-Date).AddSeconds($perfMgr.HistoricalInterval[$intervalIndex].SamplingPeriod - $perfMgr.HistoricalInterval[$intervalIndex].Length)
      }
      if(!$Finish){
        $Finish = Get-Date
      }
    }
    else{
      Throw "-Interval parameter $Interval is invalid for datastore metrics."
    }
  }
 
  # Test if QueryMetrics is given
  if($QueryMetrics){
    $metrics = $perfMgr.QueryAvailablePerfMetric($Entity.MoRef,$null,$null,$numinterval)
    $metricslist = @()
    foreach($pmId in $metrics){
      $pC = $keyTable[$pmId.CounterId]
      $metricslist += New-Object PSObject -Property @{
        Group = $pC.GroupInfo.Key
        Name = $pC.NameInfo.Key
        Rollup = $pC.RollupType
        Id = $pC.Key
        Level = $pC.Level
        Type = $pC.StatsType
        Unit = $pC.UnitInfo.Key
      }
    }
    return ($metricslist | Sort-Object -unique -property Group,Name,Rollup)
  }
 
  # Test if start is valid
  if($Start -ne $null -and $Start -ne ""){
    if($Start.gettype().name -ne "DateTime") {
      Throw "-Start parameter should be a DateTime value"
    }
  }
 
  # Test if finish is valid
  if($Finish -ne $null -and $Finish -ne ""){
    if($Finish.gettype().name -ne "DateTime") {
      Throw "-Start parameter should be a DateTime value"
    }
  }
 
  # Test start-finish interval
  if($Start -ne $null -and $Finish -ne $null -and $Start -ge $Finish){
    Throw "-Start time should be 'older' than -Finish time."
  }
 
  # Test if stat is valid
  $unitarray = @()
  $InstancesList = @()
 
  foreach($st in $Stat){
    if($pcTable[$st] -eq $null){
      Throw "-Stat parameter $st is invalid."
    }
    $pcInfo = $perfMgr.QueryPerfCounter($pcTable[$st])
    $unitarray += $pcInfo[0].UnitInfo.Key
    $metricId = $perfMgr.QueryAvailablePerfMetric($Entity.MoRef,$null,$null,$numinterval)
 
    # Test if QueryInstances in given
    if($QueryInstances){
      $mKey = $pcTable[$st]
      foreach($metric in $metricId){
        if($metric.CounterId -eq $mKey){
          $InstancesList += New-Object PSObject -Property @{
            Stat = $st
            Instance = $metric.Instance
          }
        }
      }
    }
    else{
      # Test if instance is valid
      $found = $false
      $validInstances = @()
      foreach($metric in $metricId){
        if($metric.CounterId -eq $pcTable[$st]){
          if($metric.Instance -eq "") {$cInstance = '""'} else {$cInstance = $metric.Instance}
          $validInstances += $cInstance
          if($Instance -eq $metric.Instance){$found = $true}
        }
      }
      if(!$found){
        Throw "-Instance parameter invalid for requested stat: $st.`nValid values are: $validInstances"
      }
    }
  }
  if($QueryInstances){
    return $InstancesList
  }
 
  $PQSpec = New-Object VMware.Vim.PerfQuerySpec
  $PQSpec.entity = $Entity.MoRef
  $PQSpec.Format = "normal"
  $PQSpec.IntervalId = $numinterval
  $PQSpec.MetricId = @()
  foreach($st in $Stat){
    $PMId = New-Object VMware.Vim.PerfMetricId
    $PMId.counterId = $pcTable[$st]
    if($Instance -ne $null){
      $PMId.instance = $Instance
    }
    $PQSpec.MetricId += $PMId
  }
  $PQSpec.StartTime = $Start
  $PQSpec.EndTime = $Finish
  if($MaxSamples -eq 0 -or $numinterval -eq 20){
    $PQSpec.maxSample = $null
  }
  else{
    $PQSpec.MaxSample = $MaxSamples
  }
  $Stats = $perfMgr.QueryPerf($PQSpec)
 
  # No data available
  if($Stats[0].Value -eq $null) {return $null}
 
  # Extract data to custom object and return as array
  $data = @()
  for($i = 0; $i -lt $Stats[0].SampleInfo.Count; $i ++ ){
    for($j = 0; $j -lt $Stat.Count; $j ++ ){
      $data += New-Object PSObject -Property @{
        CounterId = $Stats[0].Value[$j].Id.CounterId
        CounterName = $Stat[$j]
        Instance = $Stats[0].Value[$j].Id.Instance
        Timestamp = $Stats[0].SampleInfo[$i].Timestamp
        Interval = $Stats[0].SampleInfo[$i].Interval
        Value = $Stats[0].Value[$j].Value[$i]
        Unit = $unitarray[$j]
        Entity = $Entity.Name
        EntityId = $Entity.MoRef.ToString()
      }
    }
  }
  if($MaxSamples -eq 0){
    $data | Sort-Object -Property Timestamp -Descending
  }
  else{
    $data | Sort-Object -Property Timestamp -Descending | select -First $MaxSamples
  }
}

#Load Snapins for VMWare

function LoadSnapins(){
    $snapinList = @( "VMware.VimAutomation.Core",“VMware.VimAutomation.vROps”)

    $loaded = Get-PSSnapin -Name $snapinList -ErrorAction SilentlyContinue | % {$_.Name}
    $registered = Get-PSSnapin -Name $snapinList -Registered -ErrorAction SilentlyContinue | % {$_.Name}
    $notLoaded = $registered | ? {$loaded -notcontains $_}

    foreach ($snapin in $registered) {
        if ($loaded -notcontains $snapin) {
        Add-PSSnapin $snapin
        }
    }
}

# Connect to VC

Function ConnectVC($FunkVC, $FunkLogFileLoc){
    Log -Message "Connecting to VC: $FunkVC" -LogType "INFO" -LogFile $FunkLogFileLoc
    $Funkconnstat = Connect-VIServer -server $FunkVC
        if ($Funkconnstat){
            Log -Message "Connection succeeded to VC: $FunkVC" -LogType "INFO" -LogFile $FunkLogFileLoc
            Write-Host "Connection succeeded to VC: $FunkVC"
        }
        else{
            Log -Message "Failed to connect to VC: $FunkVC" -LogType "ERROR" -LogFile $FunkLogFileLoc
            Write-Host "Failed to connect to VC: $FunkVC"
        }
}

# Connect to OM Server

Function ConnectOM($FunkOM, $FunkLogFileLoc){
    Log -Message "Connecting to VC: $FunkOM" -LogType "INFO" -LogFile $FunkLogFileLoc
    $Funkconnstat = Connect-OMServer -server $FunkOM
        if ($Funkconnstat){
            Log -Message "Connection succeeded to Operations Manager: $FunkOM" -LogType "INFO" -LogFile $FunkLogFileLoc
            Write-Host "Connection succeeded to Operations Manager: $FunkOM"
        }
        else{
            Log -Message "Failed to connect to Operations Manager: $FunkOM" -LogType "ERROR" -LogFile $FunkLogFileLoc
            Write-Host "Failed to connect to Operations Manager: $FunkOM"
        }
}

#Disconnect from VC

Function DisconnectVC($FunkDCVC, $FunkDCLogFileLoc){
    Log -Message "Disconnecting from VC: $FunkDCVC" -LogType "INFO" -LogFile $FunkDCLogFileLoc
    $DCFunkconnstat = Disconnect-VIServer -server $FunkDCVC -Force:$false 
        if ($DCFunkconnstat){
            Log -Message "Connection to VC: $FunkDCVC Dropped" -LogType "INFO" -LogFile $FunkDCLogFileLoc
            Write-Host "Connection to VC: $FunkDCVC Dropped"
        }
        else{
            Log -Message "Failed to disconnect from to VC: $FunkDCVC GOD HELP US ALL!" -LogType "ERROR" -LogFile $FunkDCLogFileLoc
            Write-Host "Failed to disconnect from to VC: $FunkDCVC GOD HELP US ALL!"
        }
}

#Disconnect from OM

Function DisconnectOM($FunkDCOM, $FunkDCLogFileLoc){
    Log -Message "Disconnecting from OM: $FunkDCOM" -LogType "INFO" -LogFile $FunkDCLogFileLoc
    $DCFunkconnstat = Disconnect-OMServer -server $FunkDCOM -Force:$false
        if ($DCFunkconnstat){
            Log -Message "Connection to OM: $FunkDCOM Dropped" -LogType "INFO" -LogFile $FunkDCLogFileLoc
            Write-Host "Connection to OM: $FunkDCOM Dropped"
        }
        else{
            Log -Message "Failed to disconnect from to OM: $FunkDCOM GOD HELP US ALL!" -LogType "ERROR" -LogFile $FunkDCLogFileLoc
            Write-Host "Failed to disconnect from to OM: $FunkDCOM GOD HELP US ALL!"
        }
}

#PerformanceList Script Block.

$scriptBlock = {
param
(
    [String]$Element,
    [String]$HOSTNAME,
    [String]$Server,
    [String]$MetricSource,
    [DateTime]$start,
    [DateTime]$finish,
    [XML]$CFG
    
)


$uploadFolderPath =  $CFG.VMDatacollector.UploadSettings.LocalSettings | select RawFileFolder,RTFileFolder,LogFolder
$MetricXPath = '/VMDataCollector/PerfConfigs/' +$MetricSource+ '/Config'

        Add-PSSnapin VMware.VimAutomation.Core
         Connect-VIServer -server $Server
         foreach ($node in @($CFG | Select-Xml -XPath $MetricXPath))
            {
            #Collection Date, not run time
            $MetricName += @($node.Node.MetricName)
            }
            $StartDateFile = $Start.tostring("yyyyMMdd-hhmmss")            
            $EndDateFile = $Finish.tostring("yyyyMMdd-hhmmss")
            $outputfile = $uploadFolderPath.RTFileFolder+$HOSTNAME+'_'+$MetricSource+'_'+$StartDateFile+'_'+$EndDateFile+'.csv'
            $Stats = New-Object Hashtable
            $Stats = Get-stat -entity $element -start $start -finish $finish -stat $MetricName -realtime |`
            Select Entity,Timestamp,MetricId,Unit,Instance,Value | Export-Csv $outputfile -NoTypeInformation -UseCulture
            Disconnect-VIServer -server $Server -Confirm $false

}

#-------------Boom Start Script-------------#

Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Loading PowerCLI Snapins'

LoadSnapins

Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Run baby run!'

switch($CollectionType)
    {

#########################
# Metric Collection
#########################

PERFORMANCE {

    if ($MetricSource -eq "DATASTORE" ){

        $VCLog = $uploadFolderPath.LogFolder+$CollectionType+'_'+'VCCONNECTIONS.log'
         ConnectVC -FunkVC $Server -FunkLogFileLoc $VCLog
         Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Running Datastore Metric Collection'
         Write-host $MetricXPat
         foreach ($node in @($Config | Select-Xml -XPath $MetricXPath))
            {
            #Collection Date, not run time
            $MetricName += @($node.Node.MetricName)
            }
            $ds = Get-Datastore
            $StartDateFile = $StartDate.tostring("yyyyMMdd")            
            $EndDateFile = $EndDate.tostring("yyyyMMdd")
            $OutputFile = $uploadFolderPath.RawFileFolder+$MetricSource+'_'+$Interval+'_'+$StartDateFile+'_'+$EndDateFile+'_'+$Server+'.csv'
            $LogFileLoc = $uploadFolderPath.LogFolder+$MetricSource+'_'+$Interval+'_'+$StartDateFile+'_'+$EndDateFile+'_'+$Server+'.log'
            Log -Message "Start Data collection for Datastores" -LogType "INFO" -LogFile $LogFileLoc
            Foreach ($Datastore in $ds) {
                $DatastoreDATA = (Get-Datastore $Datastore).Extensiondata
                $report += Get-Stat2 -entity $DatastoreDATA -stat $MetricName -interval $Interval -start $StartDate -finish $EndDate
                 }
            $report | Select Entity,Timestamp,CounterName,Unit,Instance,Value | Export-Csv $OutputFile -NoTypeInformation -UseCulture
            Log -Message "Finished Data collection for Datastores" -LogType "INFO" -LogFile $LogFileLoc
        DisconnectVC -FunkDCVC $Server -FunkDCLogFileLoc $VCLog
      }

  else {

        $VCLog = $uploadFolderPath.LogFolder+$CollectionType+'_'+'VCCONNECTIONS.log'
         ConnectVC -FunkVC $Server -FunkLogFileLoc $VCLog
         $ColObjs = & $Invoke
         Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Running' $MetricSource 'Metric Collection'
         foreach ($node in @($Config | Select-Xml -XPath $MetricXPath))
            {
            #Collection Date, not run time
            $MetricName += @($node.Node.MetricName)
            }
            $StartDateFile = $StartDate.tostring("yyyyMMdd")            
            $EndDateFile = $EndDate.tostring("yyyyMMdd")
            $OutputFile = $uploadFolderPath.RawFileFolder+$MetricSource+'_'+$Interval+'_'+$StartDateFile+'_'+$EndDateFile+'_'+$Server+'.csv'
            $LogFileLoc = $uploadFolderPath.LogFolder+$MetricSource+'_'+$Interval+'_'+$StartDateFile+'_'+$EndDaverile+'_'+$Server+'.log'
            Log -Message "Start Data collection for $MetricSource" -LogType "INFO" -LogFile $LogFileLoc
            $Stats = New-Object Hashtable
            $Stats = Get-stat -entity $ColObjs -start $StartDate.ToString("yyyy/MM/dd") -finish $EndDate.ToString("yyyy/MM/dd") -stat $MetricName -intervalsec $Interval |`
            Select Entity,Timestamp,MetricId,Unit,Instance,Value | Export-Csv $OutputFile -NoTypeInformation -UseCulture
            Log -Message "Finished Data collection for $MetricName / $MetricLabel" -LogType "INFO" -LogFile $LogFileLoc
        DisconnectVC -FunkDCVC $Server -FunkDCLogFileLoc $VCLog

  }

}

PERFORMANCERT {


        $ElementListPath = $Config.VMDatacollector.Jobs.ElementList
        $ElementListPath = $ElementListPath+'Elementlist_'+$MetricSource+'.csv'
        $Elements = import-csv $ElementListPath
        
        
        $jobQueue = New-Object System.Collections.ArrayList
        
        $finish = Get-Date
        $start = $finish.AddHours(-1)

        # Create our job queue.


            # Main loop of the script.  
            # Loop through each VM and start a new job if we have less than $maxJobCount outstanding jobs.  
            # If the $maxJobCount has been reached, sleep 3 seconds and check again.  
            foreach ($Element in $Elements) {
              # Wait until job queue has a slot available.
              while ($jobQueue.count -ge $maxJobCount) {
                echo "jobQueue count is $($jobQueue.count): Waiting for jobs to finish before adding more."
                foreach ($jobObject in $jobQueue.toArray()) {
            	    if ($jobObject.job.state -eq 'Completed') { 
            	      echo "jobQueue count is $($jobQueue.count): Removing job: $($jobObject.element.HOSTNAME)"
            	      $jobQueue.remove($jobObject) 		
            	    }
            	  }
            	sleep $sleepTimer
              }  
  
              echo "jobQueue count is $($jobQueue.count): Adding new job: $($element.HOSTNAME)"
              
            $HOSTNAME = $Element.HOSTNAME
              
               $job = Start-Job -name $Element.HOSTNAME -ScriptBlock $scriptBlock -ArgumentList $Element.HOSTNAME, $HOSTNAME, $Server, $MetricSource, $start, $finish, $Config                    

              $jobObject          = "" | select Element, job
              $jobObject.Element  = $Element
              $jobObject.job      = $job
              $jobQueue.add($jobObject) | Out-Null
            }

Get-Job | Wait-Job | Out-Null


}

PERFORMANCEOM {

        Import-Module VMware.VimAutomation.vROps
        $OMLog = $uploadFolderPath.LogFolder+$CollectionType+'_'+'OMCONNECTIONS.log'
         ConnectOM -FunkOM $Server -FunkLogFileLoc $OMLog
         $ColObjs = Get-OMResource | where-object {$_.ResourceKind -eq $Invoke}
         Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Running' $MetricSource 'Metric Collection'
         foreach ($node in @($Config | Select-Xml -XPath $MetricXPath))
            {
            #Collection Date, not run time
            $MetricName = $node.Node.MetricName
            $RollupType = $node.Node.Rollup
            $IntervalCount = $node.Node.IntervalCount
            $StartDateFile = $StartDate.tostring("yyyyMMdd-hhmmss")            
            $EndDateFile = $EndDate.tostring("yyyyMMdd-hhmmss")
            $OutputFile = $uploadFolderPath.RawFileFolder+$MetricSource+'_'+$Interval+'_'+$StartDateFile+'_'+$EndDateFile+'_'+$Server+'.csv'
            $LogFileLoc = $uploadFolderPath.LogFolder+$MetricSource+'_'+$Interval+'_'+$StartDateFile+'_'+$EndDateFile+'_'+$Server+'.log'
            Log -Message "Start $MetricName collection for $MetricSource" -LogType "INFO" -LogFile $LogFileLoc
            $Stats = New-Object Hashtable
            $Stats = Get-OMStat -Resource $ColObjs -Key $MetricName -IntervalType $Interval -IntervalCount 1 -RollupType "AVG" -From $StartDate.ToString("yyyy/MM/dd hh:mm:ss") -To $EndDate.ToString("yyyy/MM/dd hh:mm:ss") |`
            Select Value, Resource, Time, Key, RollupType | Export-Csv $OutputFile -NoTypeInformation -UseCulture
            Log -Message "Finished Data collection for $MetricName / $MetricLabel" -LogType "INFO" -LogFile $LogFileLoc
            }
        DisconnectOM -FunkDCOM $Server -FunkDCLogFileLoc $OMLog


}

DSVMCOUNT { 
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Collecting' $CollectionType 'Inventory Data'
            $DSVMCOUNTDate = Get-Date
            $DSVMCOUNTDate = $DSVMCOUNTDate.ToString("yyyyMMdd")
            $DSVMCOUNTFile = $uploadFolderPath.INVFileFolder+$CollectionType+'_'+$DSVMCOUNTDate+'_'+$Server+'.csv'
            $DSVMCOUNTLogFileLoc = $uploadFolderPath.LogFolder+$CollectionType+'_'+$DSVMCOUNTDate+'_'+$Server+'.log'
            ConnectVC -FunkVC $Server -FunkLogFileLoc $DSVMCOUNTLogFileLoc
            Log -Message "Starting Inventory collection for $CollectionType" -LogType "INFO" -LogFile $DSVMCOUNTLogFileLoc
            Get-Datastore | Select Name, `
            @{N="NumVM";E={($_ | Get-VM).Count}} | `
            Export-Csv -path $DSVMCOUNTFile -NoTypeInformation
            Log -Message "Finished Inventory collection for $CollectionType" -LogType "INFO" -LogFile $DSVMCOUNTLogFileLoc
            DisconnectVC -FunkDCVC $Server -FunkDCLogFileLoc $DSVMCOUNTLogFileLoc
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Finished Collecting' $CollectionType 'Inventory Data'
            }

VMHOSTCOUNT {
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Collecting' $CollectionType 'Inventory Data'
            $VMHOSTCOUNTDate = Get-Date
            $VMHOSTCOUNTDate = $VMHOSTCOUNTDate.ToString("yyyyMMdd")
            $VMHOSTCOUNTFile = $uploadFolderPath.INVFileFolder+$CollectionType+'_'+$VMHOSTCOUNTDate+'_'+$Server+'.csv'
            $VMHOSTCOUNTLogFileLoc = $uploadFolderPath.LogFolder+$CollectionType+'_'+$VMHOSTCOUNTDate+'_'+$Server+'.log'
            ConnectVC -FunkVC $Server -FunkLogFileLoc $VMHOSTCOUNTLogFileLoc
            Log -Message "Starting Inventory collection for $CollectionType" -LogType "INFO" -LogFile $VMHOSTCOUNTLogFileLoc
            Get-VMHost | Select Name, `
            @{N="NumVM";E={($_ | Get-VM).Count}} | `
            Export-Csv -path $VMHOSTCOUNTFile -NoTypeInformation
            Log -Message "Finished Inventory collection for $CollectionType" -LogType "INFO" -LogFile $VMHOSTCOUNTLogFileLoc
            DisconnectVC -FunkDCVC $Server -FunkDCLogFileLoc $VMHOSTCOUNTLogFileLoc
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Finished Collecting' $CollectionType 'Inventory Data'
            }

VMCLUCOUNT {
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Collecting' $CollectionType 'Inventory Data'
            $VMCLUCOUNTDate = Get-Date
            $VMCLUCOUNTDate = $VMCLUCOUNTDate.ToString("yyyyMMdd")
            $VMCLUCOUNTFile = $uploadFolderPath.INVFileFolder+$CollectionType+'_'+$VMCLUCOUNTDate+'_'+$Server+'.csv'
            $VMCLUCOUNTLogFileLoc = $uploadFolderPath.LogFolder+$CollectionType+'_'+$VMCLUCOUNTDate+'_'+$Server+'.log'
            ConnectVC -FunkVC $Server -FunkLogFileLoc $VMCLUCOUNTLogFileLoc
            Log -Message "Starting Inventory collection for $CollectionType" -LogType "INFO" -LogFile $VMCLUCOUNTLogFileLoc
            Get-Cluster | Select Name, `
            @{N="NumVM";E={($_ | Get-VM).Count}} | `
            Export-Csv -path $VMCLUCOUNTFile -NoTypeInformation
            Log -Message "Finished Inventory collection for $CollectionType" -LogType "INFO" -LogFile $VMCLUCOUNTLogFileLoc
            DisconnectVC -FunkDCVC $Server -FunkDCLogFileLoc $VMCLUCOUNTLogFileLoc
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Finished Collecting' $CollectionType 'Inventory Data'
            }

VCPUHOSTSUM  {
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Collecting' $CollectionType 'Inventory Data'
            $VCPUHOSTSUMDate = Get-Date
            $VCPUHOSTSUMDate = $VCPUHOSTSUMDate.ToString("yyyyMMdd")
            $VCPUHOSTSUMFile = $uploadFolderPath.INVFileFolder+$CollectionType+'_'+$VCPUHOSTSUMDate+'_'+$Server+'.csv'
            $VCPUHOSTSUMLogFileLoc = $uploadFolderPath.LogFolder+$CollectionType+'_'+$VCPUHOSTSUMDate+'_'+$Server+'.log'
            ConnectVC -FunkVC $Server -FunkLogFileLoc $VCPUHOSTSUMLogFileLoc
            Log -Message "Starting Inventory collection for $CollectionType" -LogType "INFO" -LogFile $VCPUHOSTSUMLogFileLoc
            $(foreach ($vmhost in get-vmhost){ $vms=$vmhost|get-vm; $vmsVcpucount=($vms|Measure-Object -Property numcpu -Sum).sum; "" `
            | Select @{N='Host';E={$vmhost.name}},
            @{N='vCPUs';E={$vmsVcpucount}}}) | `
            Export-Csv -path $VCPUHOSTSUMFile -NoTypeInformation
            Log -Message "Finished Inventory collection for $CollectionType" -LogType "INFO" -LogFile $VCPUHOSTSUMLogFileLoc
            DisconnectVC -FunkDCVC $Server -FunkDCLogFileLoc $VCPUHOSTSUMLogFileLoc
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Finished Collecting' $CollectionType 'Inventory Data'
            }

VCPUCLUSUM  {
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Collecting' $CollectionType 'Inventory Data'
            $VCPUCLUSUMDate = Get-Date
            $VCPUCLUSUMDate = $VCPUCLUSUMDate.ToString("yyyyMMdd")
            $VCPUCLUSUMFile = $uploadFolderPath.INVFileFolder+$CollectionType+'_'+$VCPUCLUSUMDate+'_'+$Server+'.csv'
            $VCPUCLUSUMLogFileLoc = $uploadFolderPath.LogFolder+$CollectionType+'_'+$VCPUCLUSUMDate+'_'+$Server+'.log'
            ConnectVC -FunkVC $Server -FunkLogFileLoc $VCPUCLUSUMLogFileLoc
            Log -Message "Starting Inventory collection for $CollectionType" -LogType "INFO" -LogFile $VCPUCLUSUMLogFileLoc
            Get-Cluster |
            Select-Object -Property Name,
            @{Name="vCPUs";E={$_ | Get-VM | Measure-Object -Property NumCpu -Sum | Select-Object -ExpandProperty Sum }} `
            | Export-Csv -path $VCPUCLUSUMFile -NoTypeInformation
            Log -Message "Finished Inventory collection for $CollectionType" -LogType "INFO" -LogFile $VCPUCLUSUMLogFileLoc
            DisconnectVC -FunkDCVC $Server -FunkDCLogFileLoc $VCPUCLUSUMLogFileLoc
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Finished Collecting' $CollectionType 'Inventory Data'
            }

VMVCPUS {
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Collecting' $CollectionType 'Inventory Data'
            $VMVCPUSDate = Get-Date
            $VMVCPUSDate = $VMVCPUSDate.ToString("yyyyMMdd")
            $VMVCPUSFile = $uploadFolderPath.INVFileFolder+$CollectionType+'_'+$VMVCPUSDate+'_'+$Server+'.csv'
            $VMVCPUSLogFileLoc = $uploadFolderPath.LogFolder+$CollectionType+'_'+$VMVCPUSDate+'_'+$Server+'.log'
            ConnectVC -FunkVC $Server -FunkLogFileLoc $VMVCPUSLogFileLoc
            Log -Message "Starting Inventory collection for $CollectionType" -LogType "INFO" -LogFile $VMVCPUSLogFileLoc
            Get-VM | select Name, NumCPU | Export-Csv -path $VMVCPUSFile -NoTypeInformation
            Log -Message "Finished Inventory collection for $CollectionType" -LogType "INFO" -LogFile $VMVCPUSLogFileLoc
            DisconnectVC -FunkDCVC $Server -FunkDCLogFileLoc $VMVCPUSLogFileLoc
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Finished Collecting' $CollectionType 'Inventory Data'
            }

VMVMEM {
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Collecting' $CollectionType 'Inventory Data'
            $VMVMEMDate = Get-Date
            $VMVMEMDate = $VMVMEMDate.ToString("yyyyMMdd")
            $VMVMEMFile = $uploadFolderPath.INVFileFolder+$CollectionType+'_'+$VMVMEMDate+'_'+$Server+'.csv'
            $VMVMEMLogFileLoc = $uploadFolderPath.LogFolder+$CollectionType+'_'+$VMVMEMDate+'_'+$Server+'.log'
            ConnectVC -FunkVC $Server -FunkLogFileLoc $VMVMEMLogFileLoc
            Log -Message "Starting Inventory collection for $CollectionType" -LogType "INFO" -LogFile $VMVMEMLogFileLoc
            Get-VM | select Name, MemoryGB| Export-Csv -path $VMVMEMFile -NoTypeInformation
            Log -Message "Finished Inventory collection for $CollectionType" -LogType "INFO" -LogFile $VMVMEMLogFileLoc
            DisconnectVC -FunkDCVC $Server -FunkDCLogFileLoc $VMVMEMLogFileLoc
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Finished Collecting' $CollectionType 'Inventory Data'
            }

HOSTMEM {
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Collecting' $CollectionType 'Inventory Data'
            $HOSTMEMDate = Get-Date
            $HOSTMEMDate = $HOSTMEMDate.ToString("yyyyMMdd")
            $HOSTMEMFile = $uploadFolderPath.INVFileFolder+$CollectionType+'_'+$HOSTMEMDate+'_'+$Server+'.csv'
            $HOSTMEMLogFileLoc = $uploadFolderPath.LogFolder+$CollectionType+'_'+$HOSTMEMDate+'_'+$Server+'.log'
            ConnectVC -FunkVC $Server -FunkLogFileLoc $HOSTMEMLogFileLoc
            Log -Message "Starting Inventory collection for $CollectionType" -LogType "INFO" -LogFile $HOSTMEMLogFileLoc
            Get-VMhost | select Name, MemoryTotalGB | Export-Csv -path $HOSTMEMFile -NoTypeInformation
            Log -Message "Finished Inventory collection for $CollectionType" -LogType "INFO" -LogFile $HOSTMEMLogFileLoc
            DisconnectVC -FunkDCVC $Server -FunkDCLogFileLoc $HOSTMEMLogFileLoc
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Finished Collecting' $CollectionType 'Inventory Data'
            }

HOSTCPUCORES {
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Collecting' $CollectionType 'Inventory Data'
            $HOSTCPUCORESDate = Get-Date
            $HOSTCPUCORESDate = $HOSTCPUCORESDate.ToString("yyyyMMdd")
            $HOSTCPUCORESFile = $uploadFolderPath.INVFileFolder+$CollectionType+'_'+$HOSTCPUCORESDate+'_'+$Server+'.csv'
            $HOSTCPUCORESLogFileLoc = $uploadFolderPath.LogFolder+$CollectionType+'_'+$HOSTCPUCORESDate+'_'+$Server+'.log'
            ConnectVC -FunkVC $Server -FunkLogFileLoc $HOSTCPUCORESLogFileLoc
            Log -Message "Starting Inventory collection for $CollectionType" -LogType "INFO" -LogFile $HOSTCPUCORESLogFileLoc
            Get-VMhost | select Name, NumCpu | Export-Csv -path $HOSTCPUCORESFile -NoTypeInformation
            Log -Message "Finished Inventory collection for $CollectionType" -LogType "INFO" -LogFile $HOSTCPUCORESLogFileLoc
            DisconnectVC -FunkDCVC $Server -FunkDCLogFileLoc $HOSTCPUCORESLogFileLoc
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Finished Collecting' $CollectionType 'Inventory Data'
            }

VMDSRELATION { 
            
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Collecting' $CollectionType 'Relationship Data'
            $VMDSRelDate = Get-Date
            $VMDSRelDate = $VMDSRelDate.ToString("yyyyMMdd")
            $VMDSRelationFile = $uploadFolderPath.RELFileFolder+$CollectionType+'_'+$VMDSRelDate+'_'+$Server+'.csv'
            $VMDSLogFileLoc = $uploadFolderPath.LogFolder+$CollectionType+'_'+$VMDSRelDate+'_'+$Server+'.log'
            ConnectVC -FunkVC $Server -FunkLogFileLoc $VMDSLogFileLoc
            Log -Message "Starting Relationship collection for $CollectionType" -LogType "INFO" -LogFile $VMDSLogFileLoc
            Get-VM | Select Name, `
            @{N="Datatore";E={Get-Datastore -VM $_}} | `
            Export-Csv -path $VMDSRelationFile -NoTypeInformation
            Log -Message "Finished Relationship collection for $CollectionType" -LogType "INFO" -LogFile $VMDSLogFileLoc
            DisconnectVC -FunkDCVC $Server -FunkDCLogFileLoc $VMDSLogFileLoc
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Finished Collecting' $CollectionType 'Relationship Data'
            }

VMCLURELATION {

            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Collecting' $CollectionType 'Relationship Data'
            $VMCLURelDate = Get-Date
            $VMCLURelDate = $VMCLURelDate.ToString("yyyyMMdd")
            $VMCLURelationFile = $uploadFolderPath.RELFileFolder+$CollectionType+'_'+$VMCLURelDate+'_'+$Server+'.csv'
            $VMCLULogFileLoc = $uploadFolderPath.LogFolder+$CollectionType+'_'+$VMCLURelDate+'_'+$Server+'.log'
            ConnectVC -FunkVC $Server -FunkLogFileLoc $VMCLULogFileLoc
            Log -Message "Starting Relationship collection for $CollectionType" -LogType "INFO" -LogFile $VMCLULogFileLoc
            Get-VM | Select Name, `
            @{N="Cluster";E={Get-Cluster -VM $_}} | `
            Export-Csv -path $VMCLURelationFile -NoTypeInformation
            Log -Message "Finished Relationship collection for $CollectionType" -LogType "INFO" -LogFile $VMCLULogFileLoc
            DisconnectVC -FunkDCVC $Server -FunkDCLogFileLoc $VMCLULogFileLoc
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Finished Collecting' $CollectionType 'Relationship Data'
            }

VMHOSTRELATION {

            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Collecting' $CollectionType 'Relationship Data'
            $VMHOSTRelDate = Get-Date
            $VMHOSTRelDate = $VMHOSTRelDate.ToString("yyyyMMdd")
            $VMHOSTRelationFile = $uploadFolderPath.RELFileFolder+$CollectionType+'_'+$VMHOSTRelDate+'_'+$Server+'.csv'
            $VMHOSTLogFileLoc = $uploadFolderPath.LogFolder+$CollectionType+'_'+$VMHOSTRelDate+'_'+$Server+'.log'
            ConnectVC -FunkVC $Server -FunkLogFileLoc $VMHOSTLogFileLoc
            Log -Message "Starting Relationship collection for $CollectionType" -LogType "INFO" -LogFile $VMHOSTLogFileLoc
            Get-VM | Select Name, `
            @{N="ESXHost";E={Get-VMHost -VM $_}} | `
            Export-Csv -path $VMHOSTRelationFile -NoTypeInformation
            Log -Message "Finished Relationship collection for $CollectionType" -LogType "INFO" -LogFile $VMHOSTLogFileLoc
            DisconnectVC -FunkDCVC $Server -FunkDCLogFileLoc $VMHOSTLogFileLoc
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Finished Collecting' $CollectionType 'Relationship Data'
            }

HOSTDSRELATION {

            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Collecting' $CollectionType 'Relationship Data'
            $HOSTDSRelDate = Get-Date
            $HOSTDSRelDate = $HOSTDSRelDate.ToString("yyyyMMdd")
            $HOSTDSRelationFile = $uploadFolderPath.RELFileFolder+$CollectionType+'_'+$HOSTDSRelDate+'_'+$Server+'.csv'
            $HOSTDSLogFileLoc = $uploadFolderPath.LogFolder+$CollectionType+'_'+$HOSTDSRelDate+'_'+$Server+'.log'
            ConnectVC -FunkVC $Server -FunkLogFileLoc $HOSTDSLogFileLoc
            Log -Message "Starting Relationship collection for $CollectionType" -LogType "INFO" -LogFile $HOSTDSLogFileLoc
            Get-VMHost | Select Name, `
            @{N="Datastore";E={Get-Datastore -HOST $_}} | `
            Export-Csv -path $HOSTDSRelationFile -NoTypeInformation
            Log -Message "Finished Relationship collection for $CollectionType" -LogType "INFO" -LogFile $HOSTDSLogFileLoc
            DisconnectVC -FunkDCVC $Server -FunkDCLogFileLoc $HOSTDSLogFileLoc
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Finished Collecting' $CollectionType 'Relationship Data'
            }

HOSTCLURELATION {

            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Collecting' $CollectionType 'Relationship Data'
            $HOSTCLURelDate = Get-Date
            $HOSTCLURelDate = $HOSTCLURelDate.ToString("yyyyMMdd")
            $HOSTCLURelationFile = $uploadFolderPath.RELFileFolder+$CollectionType+'_'+$HOSTCLURelDate+'_'+$Server+'.csv'
            $HOSTCLULogFileLoc = $uploadFolderPath.LogFolder+$CollectionType+'_'+$HOSTCLURelDate+'_'+$Server+'.log'
            ConnectVC -FunkVC $Server -FunkLogFileLoc $HOSTCLULogFileLoc
            Log -Message "Starting Relationship collection for $CollectionType" -LogType "INFO" -LogFile $HOSTCLULogFileLoc
            Get-VMHost | Select Name, `
            @{N="Cluster";E={Get-Cluster -HOST $_}} | `
            Export-Csv -path $HOSTCLURelationFile -NoTypeInformation
            Log -Message "Finished Relationship collection for $CollectionType" -LogType "INFO" -LogFile $HOSTCLULogFileLoc
            DisconnectVC -FunkDCVC $Server -FunkDCLogFileLoc $HOSTCLULogFileLoc
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Finished Collecting' $CollectionType 'Relationship Data'
            }

CLUDCRELATION {

            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Collecting' $CollectionType 'Relationship Data'
            $CLUDCRelDate = Get-Date
            $CLUDCRelDate = $CLUDCRelDate.ToString("yyyyMMdd")
            $CLUDCRelationFile = $uploadFolderPath.RELFileFolder+$CollectionType+'_'+$CLUDCRelDate+'_'+$Server+'.csv'
            $CLUDCLogFileLoc = $uploadFolderPath.LogFolder+$CollectionType+'_'+$CLUDCRelDate+'_'+$Server+'.log'
            ConnectVC -FunkVC $Server -FunkLogFileLoc $CLUDCLogFileLoc
            Log -Message "Starting Relationship collection for $CollectionType" -LogType "INFO" -LogFile $CLUDCLogFileLoc
            Get-Cluster | Select Name, `
            @{N="Datacenter";E={Get-Datacenter -CLUSTER $_}} | `
            Export-Csv -path $CLUDCRelationFile -NoTypeInformation
            Log -Message "Finished Relationship collection for $CollectionType" -LogType "INFO" -LogFile $CLUDCLogFileLoc
            DisconnectVC -FunkDCVC $Server -FunkDCLogFileLoc $CLUDCLogFileLoc
            Write-Host (Get-Date -UFormat '%m-%d-%Y %H:%M:%S') 'Finished Collecting' $CollectionType 'Relationship Data'
            }

default{"
 
        Usage:

        -----------------------------------------------
        Performance Metric Collection
        -----------------------------------------------

        VM Collection
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'VM' -CollectionType 'PERFORMANCE'
		or
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'VM' -CollectionType 'PERFORMANCE' -startdate '2016/03/15 18:00' -enddate '2016/03/15 00:00'


        HOST Collection
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'HOST' -CollectionType 'PERFORMANCE'	
		or
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'HOST' -CollectionType 'PERFORMANCE' -startdate '2016/03/15 18:00' -enddate '2016/03/15 00:00'


        DATASTORE Collection
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'DATASTORE' -CollectionType 'PERFORMANCE'	
		or
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'DATASTORE' -CollectionType 'PERFORMANCE' -startdate '2016/03/15 18:00' -enddate '2016/03/15 00:00'


        CLUSTER Collection
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'CLUSTER' -CollectionType 'PERFORMANCE'
		or
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'CLUSTER' -CollectionType 'PERFORMANCE' -startdate '2016/03/15 18:00' -enddate '2016/03/15 00:00'



        -----------------------------------------------
        Performance Real Time Collection - Collects Last hour of data from script execution.
        -----------------------------------------------
            Must be run within the hour otherwise the data will be rolled up and the array of objects to collect must go in the file Elementlist_'MetricSource'.csv
        
        VM Collection
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'VM' -CollectionType 'PERFORMANCERT'

        HOST Collection
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'HOST' -CollectionType 'PERFORMANCERT'	

        CLUSTER Collection
        .\PCLICollector.ps1 -Server vc.vMan.ch -MetricSource 'CLUSTER' -CollectionType 'PERFORMANCERT'


        -----------------------------------------------
        Performance Metric Collection from vROPS
        -----------------------------------------------

        VM Collection
        .\PCLICollector.ps1 -Server vrops.vMan.ch -MetricSource 'VM-OM' -CollectionType 'PERFORMANCEOM'
		or
        .\PCLICollector.ps1 -Server vrops.vMan.ch -MetricSource 'VM-OM' -CollectionType 'PERFORMANCEOM' -startdate '2016/03/15 18:00' -enddate '2016/03/15 00:00'


        HOST Collection
        .\PCLICollector.ps1 -Server vrops.vMan.ch -MetricSource 'HOST-OM' -CollectionType 'PERFORMANCEOM'	
		or
        .\PCLICollector.ps1 -Server vrops.vMan.ch -MetricSource 'HOST-OM' -CollectionType 'PERFORMANCEOM' -startdate '2016/03/15 18:00' -enddate '2016/03/15 00:00'


        DATASTORE Collection
        .\PCLICollector.ps1 -Server vrops.vMan.ch -MetricSource 'DATASTORE-OM' -CollectionType 'PERFORMANCEOM'	
		or
        .\PCLICollector.ps1 -Server vrops.vMan.ch -MetricSource 'DATASTORE-OM' -CollectionType 'PERFORMANCEOM' -startdate '2016/03/15 18:00' -enddate '2016/03/15 00:00'


        CLUSTER Collection
        .\PCLICollector.ps1 -Server vrops.vMan.ch -MetricSource 'CLUSTER-OM' -CollectionType 'PERFORMANCEOM'
		or
        .\PCLICollector.ps1 -Server vrops.vMan.ch -MetricSource 'CLUSTER-OM' -CollectionType 'PERFORMANCEOM' -startdate '2016/03/15 18:00' -enddate '2016/03/15 00:00'


        -----------------------------------------------
        Inventory Collection
        -----------------------------------------------

        #Count of VM's per Datastore.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType DSVMCOUNT


        #Count of VM's per Host.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VMHOSTCOUNT


        #Count of VM's per Cluster.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VMCLUCOUNT


        #Sum of vCPU's USED per Host.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VCPUHOSTSUM


        #Sum of vCPU's USED per Cluster.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VCPUCLUSUM


        #Sum of vCPU's USED per VMVCPUS.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VMVCPUS


        #Sum of vCPU's USED per VMVMEM.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VMVMEM


        #Sum of vCPU's USED per HOSTMEM.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType HOSTMEM


        #Sum of vCPU's USED per HOSTCPUCORES.

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType HOSTCPUCORES



        -----------------------------------------------
        Relationship Collection
        -----------------------------------------------

        #VM to Datastore(s)

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VMDSRELATION


        #VM to Cluster

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VMCLURELATION


        #VM to HOST

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType VMHOSTRELATION


        #HOST to Datastore(s)

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType HOSTDSRELATION


        #HOST to Cluster

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType HOSTCLURELATION


        #Cluster to Datacenter

        .\PCLICollector.ps1 -Server vc.vMan.ch -CollectionType CLUDCRELATION

       "}
}

 

If you found this script / post useful… please feel free to check out some of the sponsored links as it helps with my hosting costs.

Script Download: pclicollector