vCenter ESXi Hardware Sensors
This DataSource is the vCenter equivalent of VMware_ESXi_HardwareSensors one.
The new DataSource is called VMware_vCenter_HostHardwareSensors ( lmLocator CDGEFM ), it targets system.virtualization =~ "VMware ESX vcenter" and provides hardware sensor instances that are titled host name - sensor name grouped by type.
Discovery Script
<span class="kwd">import</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">santaba</span><span class="pun">.</span><span class="pln">agent</span><span class="pun">.</span><span class="pln">groovyapi</span><span class="pun">.</span><span class="pln">esx</span><span class="pun">.</span><span class="pln">ESX
</span><span class="kwd">import</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">vmware</span><span class="pun">.</span><span class="pln">vim25</span><span class="pun">.</span><span class="pln">mo</span><span class="pun">.*</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">security</span><span class="pun">.</span><span>MessageDigest</span><span class="pln">
def host </span><span class="pun">=</span><span class="pln"> hostProps</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"system.hostname"</span><span class="pun">);</span><span class="pln">
def user </span><span class="pun">=</span><span class="pln"> hostProps</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"esx.user"</span><span class="pun">);</span><span class="pln">
def pass </span><span class="pun">=</span><span class="pln"> hostProps</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"esx.pass"</span><span class="pun">);</span><span class="pln">
def addr </span><span class="pun">=</span><span class="pln"> hostProps</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"esx.url"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">?:</span><span class="pln"> </span><span class="str">"https://${host}/sdk"</span><span class="pun">;</span><span class="pln">
</span><span class="com">// We are confident we can parse names for these devices</span><span class="pln">
def deviceSensorTypes </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"fan"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"storage"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"power"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"chassis"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"voltage"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"battery"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"processors"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"watchdog"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"cable/interconnect"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"memory"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"slot/connector"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"system"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"boot"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"logging"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"management subsystem health"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"temperature"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"other"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"platform alert"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"chip set"</span><span class="pun">];</span><span class="pln">
def svc </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> ESX</span><span class="pun">();</span><span class="pln">
svc</span><span class="pun">.</span><span class="pln">open</span><span class="pun">(</span><span class="pln">addr</span><span class="pun">,</span><span class="pln"> user</span><span class="pun">,</span><span class="pln"> pass</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln"> </span><span class="com">// timeout in 10 seconds</span><span class="pln">
def si </span><span class="pun">=</span><span class="pln"> svc</span><span class="pun">.</span><span class="pln">getServiceInstance</span><span class="pun">();</span><span class="pln">
def rootFolder </span><span class="pun">=</span><span class="pln"> si</span><span class="pun">.</span><span class="pln">getRootFolder</span><span class="pun">();</span><span class="pln">
</span><span class="com">// Get ESX hosts</span><span class="pln">
</span><span>HostSystem</span><span class="pun">[]</span><span class="pln"> esxHosts </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>InventoryNavigator</span><span class="pun">(</span><span class="pln">rootFolder</span><span class="pun">).</span><span class="pln">searchManagedEntities</span><span class="pun">(</span><span class="str">"HostSystem"</span><span class="pun">)</span><span class="pln">
esxHosts</span><span class="pun">.</span><span class="pln">each </span><span class="pun">{</span><span class="pln"> esx </span><span class="pun">-></span><span class="pln">
</span><span class="com">// Find and iterate over host sensors</span><span class="pln">
def numericSensors </span><span class="pun">=</span><span class="pln"> esx</span><span class="pun">?.</span><span class="pln">runtime</span><span class="pun">?.</span><span class="pln">healthSystemRuntime</span><span class="pun">?.</span><span class="pln">systemHealthInfo</span><span class="pun">?.</span><span class="pln">numericSensorInfo</span><span class="pun">;</span><span class="pln">
numericSensors</span><span class="pun">.</span><span class="pln">each</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
sensor </span><span class="pun">-></span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">sensor</span><span class="pun">.</span><span class="pln">sensorType </span><span class="pun">!=</span><span class="pln"> </span><span class="str">"Software Components"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
def name </span><span class="pun">=</span><span class="pln"> sensor</span><span class="pun">.</span><span class="pln">name</span><span class="pun">;</span><span class="pln">
</span><span class="com">// Check the name for a device format. Strip alert status from the name</span><span class="pln">
</span><span class="com">// Example: "[Device] Processor 0 CPU1 UPI Link 0: Config Error - Deassert"</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">deviceSensorTypes</span><span class="pun">.</span><span class="pln">contains</span><span class="pun">(</span><span class="pln">sensor</span><span class="pun">.</span><span class="pln">sensorType</span><span class="pun">.</span><span class="pln">toLowerCase</span><span class="pun">()))</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="com">// Remove status suffix</span><span class="pln">
name </span><span class="pun">=</span><span class="pln"> name</span><span class="pun">.</span><span class="pln">split</span><span class="pun">(</span><span class="str">" -"</span><span class="pun">).</span><span class="pln">first</span><span class="pun">();</span><span class="pln">
</span><span class="com">// Clean up the [device] prefix that shows up some times.</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">name</span><span class="pun">.</span><span class="pln">startsWith</span><span class="pun">(</span><span class="str">"[Device]"</span><span class="pun">))</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
name </span><span class="pun">=</span><span class="pln"> name</span><span class="pun">.</span><span class="pln">replace</span><span class="pun">(</span><span class="str">"[Device]"</span><span class="pun">,</span><span class="pln"> </span><span class="str">""</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
name </span><span class="pun">=</span><span class="pln"> esx</span><span class="pun">.</span><span class="pln">name </span><span class="pun">+</span><span class="pln"> </span><span class="str">' - '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> name</span><span class="pun">.</span><span class="pln">trim</span><span class="pun">().</span><span class="pln">capitalize</span><span class="pun">();</span><span class="pln">
def wildvalue </span><span class="pun">=</span><span class="pln"> </span><span>MessageDigest</span><span class="pun">.</span><span class="pln">getInstance</span><span class="pun">(</span><span class="str">"MD5"</span><span class="pun">).</span><span class="pln">digest</span><span class="pun">(</span><span class="pln">name</span><span class="pun">.</span><span class="pln">bytes</span><span class="pun">).</span><span class="pln">encodeHex</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">
def properties </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[:];</span><span class="pln">
properties</span><span class="pun">[</span><span class="str">"sensor_type"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> sensor</span><span class="pun">.</span><span class="pln">sensorType</span><span class="pun">.</span><span class="pln">capitalize</span><span class="pun">();</span><span class="pln">
properties</span><span class="pun">[</span><span class="str">"host"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> esx</span><span class="pun">.</span><span class="pln">name</span><span class="pun">;</span><span class="pln">
</span><span class="com">// Generate a unit string</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">sensor</span><span class="pun">.</span><span class="pln">baseUnits</span><span class="pun">)</span><span class="pln"> properties</span><span class="pun">[</span><span class="str">"sensor_units"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> sensor</span><span class="pun">.</span><span class="pln">baseUnits</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">sensor</span><span class="pun">.</span><span class="pln">baseUnits </span><span class="pun">&&</span><span class="pln"> sensor</span><span class="pun">.</span><span class="pln">rateUnits</span><span class="pun">)</span><span class="pln"> properties</span><span class="pun">[</span><span class="str">"sensor_units"</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="str">"${sensor.baseUnits}/${sensor.rateUnits}"</span><span class="pln">
println </span><span class="str">"${wildvalue}##${name}######${properties.collectEntries{ k, v -> ["</span><span class="kwd">auto</span><span class="pun">.</span><span class="pln">$</span><span class="pun">{</span><span class="pln">k</span><span class="pun">}=</span><span class="pln">$</span><span class="pun">{</span><span class="pln">v</span><span class="pun">}</span><span class="str">"]}.keySet().join('&');}"</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span>Collection Script
<span class="kwd">import</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">santaba</span><span class="pun">.</span><span class="pln">agent</span><span class="pun">.</span><span class="pln">groovyapi</span><span class="pun">.</span><span class="pln">esx</span><span class="pun">.</span><span class="pln">ESX
</span><span class="kwd">import</span><span class="pln"> com</span><span class="pun">.</span><span class="pln">vmware</span><span class="pun">.</span><span class="pln">vim25</span><span class="pun">.</span><span class="pln">mo</span><span class="pun">.*</span><span class="pln">
</span><span class="kwd">import</span><span class="pln"> java</span><span class="pun">.</span><span class="pln">security</span><span class="pun">.</span><span>MessageDigest</span><span class="pln">
def host </span><span class="pun">=</span><span class="pln"> hostProps</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"system.hostname"</span><span class="pun">);</span><span class="pln">
def user </span><span class="pun">=</span><span class="pln"> hostProps</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"esx.user"</span><span class="pun">);</span><span class="pln">
def pass </span><span class="pun">=</span><span class="pln"> hostProps</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"esx.pass"</span><span class="pun">);</span><span class="pln">
def addr </span><span class="pun">=</span><span class="pln"> hostProps</span><span class="pun">.</span><span class="kwd">get</span><span class="pun">(</span><span class="str">"esx.url"</span><span class="pun">)</span><span class="pln"> </span><span class="pun">?:</span><span class="pln"> </span><span class="str">"https://${host}/sdk"</span><span class="pun">;</span><span class="pln">
</span><span class="com">// We are confident we can parse names for these devices</span><span class="pln">
def deviceSensorTypes </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"fan"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"storage"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"power"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"chassis"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"voltage"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"battery"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"processors"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"watchdog"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"cable/interconnect"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"memory"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"slot/connector"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"system"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"boot"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"logging"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"management subsystem health"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"temperature"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"other"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"platform alert"</span><span class="pun">,</span><span class="pln">
</span><span class="str">"chip set"</span><span class="pun">];</span><span class="pln">
def sensorStateMap </span><span class="pun">=</span><span class="pln"> </span><span class="pun">[</span><span class="str">"green"</span><span class="pln"> </span><span class="pun">:</span><span class="lit">1</span><span class="pun">,</span><span class="pln">
</span><span class="str">"yellow"</span><span class="pln"> </span><span class="pun">:</span><span class="lit">2</span><span class="pun">,</span><span class="pln">
</span><span class="str">"red"</span><span class="pln"> </span><span class="pun">:</span><span class="lit">3</span><span class="pun">];</span><span class="pln">
def svc </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> ESX</span><span class="pun">();</span><span class="pln">
svc</span><span class="pun">.</span><span class="pln">open</span><span class="pun">(</span><span class="pln">addr</span><span class="pun">,</span><span class="pln"> user</span><span class="pun">,</span><span class="pln"> pass</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">);</span><span class="pln"> </span><span class="com">// timeout in 10 seconds</span><span class="pln">
def si </span><span class="pun">=</span><span class="pln"> svc</span><span class="pun">.</span><span class="pln">getServiceInstance</span><span class="pun">();</span><span class="pln">
def rootFolder </span><span class="pun">=</span><span class="pln"> si</span><span class="pun">.</span><span class="pln">getRootFolder</span><span class="pun">();</span><span class="pln">
</span><span class="com">// Get ESX hosts</span><span class="pln">
</span><span>HostSystem</span><span class="pun">[]</span><span class="pln"> esxHosts </span><span class="pun">=</span><span class="pln"> </span><span class="kwd">new</span><span class="pln"> </span><span>InventoryNavigator</span><span class="pun">(</span><span class="pln">rootFolder</span><span class="pun">).</span><span class="pln">searchManagedEntities</span><span class="pun">(</span><span class="str">"HostSystem"</span><span class="pun">)</span><span class="pln">
esxHosts</span><span class="pun">.</span><span class="pln">each </span><span class="pun">{</span><span class="pln"> esx </span><span class="pun">-></span><span class="pln">
</span><span class="com">// Find and iterate over host sensors</span><span class="pln">
def numericSensors </span><span class="pun">=</span><span class="pln"> esx</span><span class="pun">?.</span><span class="pln">runtime</span><span class="pun">?.</span><span class="pln">healthSystemRuntime</span><span class="pun">?.</span><span class="pln">systemHealthInfo</span><span class="pun">?.</span><span class="pln">numericSensorInfo</span><span class="pun">;</span><span class="pln">
numericSensors</span><span class="pun">.</span><span class="pln">each</span><span class="pun">()</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
sensor </span><span class="pun">-></span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">sensor</span><span class="pun">.</span><span class="pln">sensorType </span><span class="pun">!=</span><span class="pln"> </span><span class="str">"Software Components"</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
def name </span><span class="pun">=</span><span class="pln"> sensor</span><span class="pun">.</span><span class="pln">name</span><span class="pun">;</span><span class="pln">
</span><span class="com">// Check the name for a device format. Strip alert status from the name</span><span class="pln">
</span><span class="com">// Example: "[Device] Processor 0 CPU1 UPI Link 0: Config Error - Deassert"</span><span class="pln">
</span><span class="kwd">if</span><span class="pun">(</span><span class="pln">deviceSensorTypes</span><span class="pun">.</span><span class="pln">contains</span><span class="pun">(</span><span class="pln">sensor</span><span class="pun">.</span><span class="pln">sensorType</span><span class="pun">.</span><span class="pln">toLowerCase</span><span class="pun">()))</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
</span><span class="com">// Remove status suffix</span><span class="pln">
name </span><span class="pun">=</span><span class="pln"> name</span><span class="pun">.</span><span class="pln">split</span><span class="pun">(</span><span class="str">" -"</span><span class="pun">).</span><span class="pln">first</span><span class="pun">();</span><span class="pln">
</span><span class="com">// Clean up the [device] prefix that shows up some times.</span><span class="pln">
</span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">name</span><span class="pun">.</span><span class="pln">startsWith</span><span class="pun">(</span><span class="str">"[Device]"</span><span class="pun">))</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
name </span><span class="pun">=</span><span class="pln"> name</span><span class="pun">.</span><span class="pln">replace</span><span class="pun">(</span><span class="str">"[Device]"</span><span class="pun">,</span><span class="pln"> </span><span class="str">""</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
name </span><span class="pun">=</span><span class="pln"> esx</span><span class="pun">.</span><span class="pln">name </span><span class="pun">+</span><span class="pln"> </span><span class="str">' - '</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> name</span><span class="pun">.</span><span class="pln">trim</span><span class="pun">().</span><span class="pln">capitalize</span><span class="pun">();</span><span class="pln">
def wildvalue </span><span class="pun">=</span><span class="pln"> </span><span>MessageDigest</span><span class="pun">.</span><span class="pln">getInstance</span><span class="pun">(</span><span class="str">"MD5"</span><span class="pun">).</span><span class="pln">digest</span><span class="pun">(</span><span class="pln">name</span><span class="pun">.</span><span class="pln">bytes</span><span class="pun">).</span><span class="pln">encodeHex</span><span class="pun">().</span><span class="pln">toString</span><span class="pun">();</span><span class="pln">
println </span><span class="str">"${wildvalue}.state=${sensorStateMap.get(sensor.healthState.key, 0)}"</span><span class="pun">;</span><span class="pln">
println </span><span class="str">"${wildvalue}.reading=${sensor.currentReading}"</span><span class="pun">;</span><span class="pln">
println </span><span class="str">"${wildvalue}.modifier=${sensor.unitModifier}"</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span>
John_Duprey
Posted 7 years ago·Last reply 6 years ago
11 comments
Andrey_Kitsen
·6 years ago@Andy Escolastico sorry for the late response. @Stuart Weenig had reached out to me and we got it all reviewed and cleared.
Glad you're enjoying it.
Andy_Escolastic
·6 years agoImport successful! Thanks for the info and making this happen for us @Stuart Weenig!
Also thanks to the original author @John Duprey!
LM User
·6 years agoGive it a shot now. Just got news that it's been cleared.
LM User
·6 years agoI heard back from him over lunch. Apparently there used to be something akin to a queue system where these things would get processed. However, in case you are unaware, there is a significant rewrite in the works for the exchange (really awesome stuff making it more like an app store) and when that rewrite started, that workflow was one of the first things that got broken.
So in the meantime, the official word on how to make sure this is getting attention is to hit up the LM support team. They can internally slack the datasources channel where it will get the attention it needs.
For this one, i've already put that in motion as of a few minutes ago. Stay tuned...
Andy_Escolastic
·6 years agoThank you much Stuart. I'm not sure what the official approval process is and who's responsible for that. I just saw that Andrey has been really responsive to these sort of submissions.
LM User
·6 years agoAh I see. Pinged Andrey.
Andy_Escolastic
·6 years agoI guess it more about having it vetted before being released to the general public. Also I don't really have access to the XML, OP does. He just posted the scripts. I have no way to see what data points or settings are being used. Hence the request to vet the submission and approve so we can pull it into our environments.
LM User
·6 years agoI'm new to the exchange side of things and wasn't aware there was a security review process. I'll ping andrey and see if he can clarify. Is there a particular need to have it in the exchange? You could just export the xml and host it on github or something for others to get it there. Or are you looking for a "blessing" from LM?
Andy_Escolastic
·6 years agoAnyone?
Andy_Escolastic
·6 years ago@Andrey Kitsen You able to show this submission some love?
Andy_Escolastic
·6 years agoIts been a year since this was posted, can someone from LM please verify and approve this to the exchange?