VMware vSphereの監視

最終更新日: 30 年 2023 月 XNUMX 日

LogicMonitor は、すぐに使用できる VMware vSphere の監視を提供します。 この監視スイートは、vSphere Web サービスと自動化 API を利用して、VMware vCenter Server Appliance (VCSA)、VMware ESXi ホスト、および仮想マシンを監視します。

互換性

2023 年 XNUMX 月の時点で、LogicMonitor の VMware vSphere パッケージは以下と互換性があることが知られています。

  • VMware vCenter Server Appliance 6.7 ~ vCenter Server 8.0.x
  • VMware ESXi 6.5 GA ~ ESXi 8.0.x

セットアップ要件

  • VMware vSphere ロジックモジュール
  • LogicMonitor_Collector_Snippets データソース
  • コレクター 32.400 以降
  • vCenter および ESXi 読み取り専用ユーザーの認証情報
  • VMware ツール
    VMware Tools は次からダウンロードできます。 VMWare カスタマーコネクト.

注: vSphere パフォーマンス カウンターを有効にし、デフォルト設定 (カウンター レベルと間隔) で構成する必要があります。 デフォルト以外の構成を使用すると、一部のデータポイントでデータが適切にレポートされなくなる可能性があります。

読み取り専用ユーザーの作成または選択

読み取り専用ユーザーを作成するプロセスは、スタンドアロン ESXi ホストまたは vCenter サーバーを監視する場合によって異なります。

  • ESXi ホスト: 詳細については、次を参照してください。
  • vCenter サーバー:
    • vCenter が Active Directory (AD) と統合されている場合、AD 内に対応するグループがある vCenter 内のグループ。 AD で vCenter 環境に対する読み取り専用権限を持つユーザーを作成し、対応する AD グループに追加します。 vCenter の認証情報は、username@domain ([メール保護])パスワード付き。
    • vCenter が AD と統合されていない場合は、ESXi ホスト ユーザーを作成する場合と同様のプロセスを使用して、新しい読み取り専用を作成する必要があります。 ただし、ESXi ホストと vCenter の主な違いは、vCenter 認証情報の形式が次のとおりであることに注意することが重要です。 [メール保護] (例えば [メール保護])パスワード付き。

VMware vSphere リソースの追加

推奨事項: VMware vSphere リソースを追加するには、Groovy スクリプト、プロパティ、およびフィルター設定で拡張スクリプト Netscan メソッドを使用します。 詳細については、「」を参照してください。 強化されたスクリプト ネットスキャン。 あるいは、「リソースへのプロパティの手動割り当て」を参照してください。

特定の VMware vCenter に対して、拡張スクリプト Netscan は、ネストされたリソース グループを作成します。 vCenter の組織構造に一致するリソース グループとリソース データセンター、クラスター、リソース プール、ユーザー定義の vCenter フォルダー、ESXi ホスト、および仮想マシンの。 NetScan のプロパティとフィルタを使用すると、どのリソース グループを作成するか、またどの ESXi ホストと仮想マシンをリソースとして LogicMonitor に追加するかを制御できます。

警告: LogicMonitor の推奨フィルター (一覧表示) を構成しない場合、NetScan は、ターゲット vCenter 環境で定義されているすべての ESXi ホストおよび仮想マシンを個別の LogicMonitor リソースとして追加しようとします。

  1. あなたの中で ロジックモニターポータル > モジュール > 応募者と、VMware vSphere LogicModule をインストールします。
  2. MFAデバイスに移動する  「リソース」 > 「追加」 > 「複数のデバイス」 > 「高度な NetScan」.
      高度な NetScan を追加する ページが表示されます
  3. この NetScan に関連付ける名前を入力します。 たとえば、「VMware vCenter」や「VMware vSphere」などです。 
  4. NetScan を実行するコレクタを選択します。
    デフォルトでは、NetScan は NetScan を実行するコレクタに新しいリソースを割り当てます。
  5. 選択 強化されたスクリプト NetScan   方法 ドロップダウンリスト。
  6. 「拡張スクリプト」セクションから、次を選択します。 デバイスの資格情報 > このスキャンにはカスタム認証情報を使用します。
  7. NetScan に必要な VMware API 認証情報を提供する次のプロパティを追加し、NetScan がリソースを作成および編成する方法と場所を変更します。
プロパティ必須
vcenter.uservCenter 読み取り専用ユーザー[メール保護]有り
vcenter.passvCenter 読み取り専用パスワード************有り
vcenter.ホスト名vCenter のホスト名

vcenter.url が設定されていない場合は、この値を使用して vCenter への接続が試行されます。
IPアドレスまたはFQDN有り
vcenter.表示名vCenter Server Appliance の表示名vcenter01有り
vcenter.urlVCSAにアクセスするためのURLhttps://<vcenter.hostname>/sdkいいえ
esx ユーザーESXi ホストへの接続に使用する認証情報

すべての ESXi ホストに同じ認証情報が使用されます。 このプロパティが設定されていない場合は、vCenter に指定された認証情報が使用されます。 提供された認証情報でホストに接続できない場合でも、デバイスは検出されるため、認証情報を ESXi ホスト リソースまたは親リソース グループに手動で設定する必要があります。
読み取り専用ユーザーいいえ
esx.パスESXi ホストへの接続に使用する認証情報。************いいえ
ルートフォルダ検出されたすべてのデバイスが LogicMonitor に配置されるルート フォルダー。 値は入れ子にすることができます。 リソース グループが存在しない場合は、NetScan によって作成されます。Customer01/VMware vSphere/vCenter01/いいえ
Discover.esxitrue の場合、LogicMonitor は esxi ホストを追加します。
注: このプロパティは仮想マシンの検出には影響しません。これらのプロパティは個別に切り替えることができます。
true、false (デフォルトは true)いいえ
Discover.vmtrue の場合、LogicMonitor は VM を検出します。

注: このプロパティは ESXi 検出には影響しません。これらのプロパティは個別に切り替えることができます。


true、false (デフォルトは true)
いいえ
view.hostAndCluster切り替えて、ホストとクラスターのインベントリ ビューを作成します。
データセンター > クラスタ > ホスト > リソース プール > VM

true の場合、LogicMonitor はこのフォルダー構造を再作成します。
true、false (デフォルトは true)いいえ
view.vmsAndTemplatesVM とテンプレートのインベントリ ビューの作成に切り替えます。
データセンター > クラスター > フォルダー > VM

LogicMonitor はこのフォルダー構造を再作成します。
Note: オプションに関係なく、VM テンプレートは検出されません。
true、false (デフォルトは true)いいえ
view.standaloneVmホストとクラスターのビューが使用されるとき、およびリソース プールにない VM がスタンドアロン VM と呼ばれるデフォルトのフォルダーに配置されるときを切り替えます。

LogicMonitor はこのフォルダー構造を再作成します。 
true、false (デフォルトは true)いいえ
  1. [フィルター] セクションで、次のフィルター プロパティを使用して、特定のリソース (仮想マシン、ESXi ホスト) を検出から除外します。
    これらのフィルターは、Active Discovery フィルターと同じように動作します。 次のデバイス レベルのプロパティが自動的に検出され、フィルタリングできます。 利用可能なフィルター操作は次のとおりです。 Equal、NotEqual、GreaterThan、GreaterEqual、LessThan、LessEqual、Contain、NotContain、Exist、NotExist、RegexMatch、RegexNotMatch
    次のリストは、これらのフィルターの使用方法の例を示しています。 

推奨事項: 大規模な vCenter 環境では、フィルタ操作または値を段階的に変更して、監視対象リソースをオンボードに追加できます。 たとえば、一度に XNUMX つのデータセンターだけを検出またはインポートするようにフィルターを構成したり、一度にいくつかのクラスターだけを検出またはインポートしたりするようにフィルターを構成すると、自動バランス型コレクター グループが監視ワークロードを分散する時間を確保できます。 

警告: リストされているフィルター プロパティを構成しない場合、NetScan はターゲット vCenter 環境で定義されているすべての ESXi ホストと仮想マシンを追加しようとします。

プロパティ操作必須
netscan.foundDNS等しいNetScan は仮想マシンの DNS 名 (true または false) を検出できました。いいえ
netscan.powerstate等しいネットスキャンが実行されたときの電源状態。 パワーオフの仮想マシンを検出からフィルタリングするために使用されます。電源が入っているいいえ
vcenter.データセンター等しい特定のフォルダー/リソース プールなどにあるすべての VM をフィルターで除外するために使用されます。 フィルタエントリごとに XNUMX つの値。データセンター01いいえ
等しくないデータセンター02いいえ
vcenter.cluster等しいリソースを検出/除外する vSphere クラスター。 デフォルトの動作では、対象の vCenter のすべてのクラスターが検出/インポートされます。 フィルタエントリごとに XNUMX つの値。クラスター01、クラスター02いいえ
等しくない開発者、
ホイール試乗
いいえ
vcenter.リソースプール等しいリソース プール。そのリソースを検出/除外します。デフォルトの動作では、すべての vCenter リソース プールがリソース グループとして、すべての VM がリソースとして検出/インポートされます。 フィルタエントリごとに XNUMX つの値。製品、ミッションクリティカル
vcenter.フォルダー等しくないvCenter フォルダー。そのリソースを検出/除外します。 デフォルトの動作では、すべての vCenter フォルダがリソース グループとして、すべての VM がリソースとして検出/インポートされます。 フィルタエントリごとに XNUMX つの値。vCLSいいえ
等しいMaryVM、JosephVMいいえ
vcenter.ホスト名RegexNotMatch検出または除外する ESXi ホストまたは仮想マシン。 デフォルトの動作では、すべての vCenter ESXi ホストおよび VM がリソースとして検出またはインポートされます。 フィルタエントリごとに XNUMX つの値。.*[Tt]est.*いいえ
vcenter.tags等しくないcategory.tag 形式のタグに基づいて検出または除外するリソース。 デフォルトの動作では、VM タグの値は無視されます。 フィルタエントリごとに XNUMX つの値。開発、テスト、モニタリングなしいいえ
  1. 選択 Groovyスクリプトを埋め込む 次のスクリプトを埋め込みます。

警告: スクリプトを編集しないでください。 編集された拡張スクリプト NetScan はサポートされていません。 LogicMonitor が提供するスクリプトを編集した場合、問題が発生した場合、LogicMonitor サポートは (独自の裁量により) サポートされているスクリプトで編集内容を上書きするよう要求する場合があります。 拡張スクリプト NetScan は、LM Envision リソースの作成を 600 時間あたり 600 以下に制限します。 XNUMX を超えるリソースを作成するには、すべてのリソースが追加されるまで NetScan を XNUMX 時間ごとに繰り返すようにスケジュールします。

/*******************************************************************************
 * © 2007-2023 - LogicMonitor, Inc. All rights reserved.
 ******************************************************************************/
 
import com.logicmonitor.common.sse.utils.GroovyScriptHelper
import com.logicmonitor.mod.Snippets
import com.santaba.agent.AgentVersion
import java.text.DecimalFormat
import com.vmware.vim25.InvalidLoginFaultMsg
import groovy.json.JsonSlurper
import groovy.json.JsonOutput
 
def debug = false
def log = false
 
// Bail out early if we don't have the correct minimum collector version to ensure netscan runs properly
if (AgentVersion.AGENT_VERSION.toInteger() < 32400) {
    throw new Exception("Upgrade collector running netscan to 32.400 or higher to run full featured enhanced netscan. Currently running version ${new DecimalFormat('00.000').format(collectorVersion / 1000)}.")
}
 
// Set props object based on whether or not we are running inside a netscan or debug console
def props
// Required properties
def host, displayName
try {
    host = hostProps.get('system.hostname') // This is the vCenter
    props = hostProps
    displayName = props.get('system.displayname')
    debug = true  // Set debug to true to ensure we do not output sensitive properties
}
catch (MissingPropertyException) {
    props = netscanProps
    host = props.get('vcenter.hostname')
    displayName = props.get('vcenter.displayname') ?: host
}
 
// Required properties
def user = props.get('vcenter.user') ?: props.get('vcsa.user') ?: props.get('esx.user')
def pass = props.get('vcenter.pass') ?: props.get('vcsa.pass') ?: props.get('esx.pass')
def addr = props.get('vcenter.url')  ?: props.get('vcsa.url')  ?: props.get('esx.url') ?: "https://${host}/sdk"
 
// Optional properties
def eUser = props.get('esx.user') // Additional credentials for a standalone host
def ePass = props.get('esx.pass')
 
def rootFolder = props.get('rootFolder') // Root folder can be nested, i.e. 'site1/subfolder1'
 
// Default to true
def includeVMs                  = (props.get('discover.vm')                                                   ?: true).toBoolean() // Toggle if we want to discover VMs, true = discover
def includeESXiHosts            = (props.get('discover.esxi',        props.get('filter.esxiHosts'))           ?: true).toBoolean() // Toggle if we want to discover ESXi hosts, true = discover
def includeHostsAndClustersView = (props.get('view.hostandcluster',  props.get('filter.hostandclusterview'))  ?: true).toBoolean() // Toggle for if we want to create the Host and Cluster view, true = create
def includeVMsAndTemplatesView  = (props.get('view.vmsandtemplates', props.get('filter.vmsandtemplatesview')) ?: true).toBoolean() // Toggle for if we want to create the VM and templates view (only VMs will be discovered), true = create
def includeStandaloneVM         = (props.get('view.standaloneVm',    props.get('filter.standaloneVm'))        ?: true).toBoolean() // Toggle for if we want to create the standalone VM folder, true = create
binding.setProperty('includeStandaloneVM', includeStandaloneVM) // Make it global
 
// Default to false
def applyVCenterCredentialsToESXHost = (props.get('esx.vcentercredentials') ?: false).toBoolean() // Toggle for if we want standalone ESXi hosts to also get vcenter.user/pass credentials. Note the ESXi modules only care about the ESX credentials.
 
 
modLoader = GroovyScriptHelper.getInstance()._getScript('Snippets', Snippets.getLoader()).withBinding(getBinding())
def emit      = modLoader.load("lm.emit", "1.1")
def debugSnip = modLoader.load("lm.debug", "1.0")
def lmDebug   = debugSnip.debugSnippetFactory(out, debug, log, "VMware_vSphere_ESN")
def lmvSphere = modLoader.load("vmware.vsphere", "1.0")
def vSphere   = lmvSphere.vSphereWebServicesAPIFactory(addr, user, pass, lmDebug)
 
String cacheFilename = "VMware_${host}_devices"
Map sensitiveProps = [
    "vcenter.pass" : pass,
    "vcsa.pass"    : pass,
    "esx.pass"     : ePass,
]
 
// Determine whether there are devices cached on disk that still need to be added from previous netscan runs
if (processResourcesJson(emit, cacheFilename, sensitiveProps, lmDebug)) return 0
 
List<Map> resources = []
Map<String, String> ilpCredentials = [:]
Map tags
// Determine the vSphere host that we are making API queries to
Map<String, Integer> productType = ['vpx' :   0, 'embeddedEsx' : 1]
def productId = productType[vSphere.getAbout().productLineId]
switch (productId) {
    case 0: // vCenter
        ilpCredentials['vcenter.user'] = user
        ilpCredentials['vcenter.pass'] = pass
        ilpCredentials['vcenter.addr'] = addr
        tags = lmvSphere.vSphereAutomationAPIFactory(host, user, pass).withCloseable(){ it.getTagMap() } // Get all vCenter tags
        lmDebug.LMDebugPrint( "DEBUG: vCenter tags found: ${tags}" )
        break
    case 1: // ESXi
        ilpCredentials['esx.user'] = user
        ilpCredentials['esx.pass'] = pass
        ilpCredentials['esx.addr'] = addr
        break
        // gsx(VMware_Server) and esx(VMware_ESX) are not supported
}
 
def vms = vSphere.getMOs('VirtualMachine').each{ vSphere.updateEntityLineage(it) }
def hosts = vSphere.getMOs('HostSystem').each{ vSphere.updateEntityLineage(it) }
// Discover each VM
if (includeVMs) {
    vms.each { _vm ->
        Map device = [:]
 
        def MOR = _vm.MOR
        if (!MOR) {
            lmDebug.LMDebugPrint("DEBUG: MOR not found for ${_vm}, skipping")
            return
        }
 
        def compLine = vSphere.getComputeLineage(MOR?.val)
        def vmLine = vSphere.getVmLineage(MOR?.val)
        def compFolder = (includeHostsAndClustersView) ? folderFormatter(compLine, rootFolder) : null
        def vmFolder   = (includeVMsAndTemplatesView)  ? folderFormatter(vmLine,   rootFolder) : null
 
        if (!compFolder && !vmFolder) {
            lmDebug.LMDebugPrint("DEBUG: VM ${_vm.name} skipped due to no containing folder determined. This could be due to different filters being set.")
            return
        }
 
        def guest = _vm.guest
        def ips = []
 
        guest?.net?.eachWithIndex { nic, number -> ips << nic?.ipAddress }
        def hostname = ips.flatten().findAll { it.contains('.') }
 
        def foundDNS = true
        if (!hostname) { // Couldn't find any IPs
            lmDebug.LMDebugPrint("No IPs could not be found for VM: ${_vm.name}")
            if (guest?.hostName) {
                hostname[0] = guest?.hostName
            } else {
                hostname[0] = _vm.name
                foundDNS = false
            }
        }
 
        if (productId == 0 && hostname?.contains(host)) { // This is the vCenter VM
            def baseFolder = (vmFolder ?: folderFormatter(vmLine, rootFolder))?.split('/')[0]
            // Rely on the vmFolder here. If customer is not including standalone VMs, but the vCenter is a standalone VM, discover it anyway
            device = [
                    'hostname'   : "${host}",
                    'displayname': "${displayName}",
                    'hostProps'  : [
                            'system.categories': 'VMware_vCenter,VMware_VM'
                    ],
                    'groupName'  : [baseFolder, compFolder, vmFolder].minus(null)
            ]
        } else {
            device = [
                    'hostname'   : hostname[0],
                    'displayname': _vm.name,
                    'hostProps'  : [
                            'system.categories': 'VMware_VM'
                    ],
                    'groupName'  : [compFolder, vmFolder].minus(null)
            ]
        }
 
        // If the netscan is running on a vCenter device
        if (productId == 0) {
            // Add vCenter tags
            def tagP = tags[MOR?.value as String]?.values.collect { k, v ->
                v.collect { "${k}.${it}" }
            }.flatten().join(",")
            device.hostProps.'vcenter.tags' = tagP
 
            // Add all parent entities as device properties
            def lineage = lineageParser(compLine + vmLine)
            lineage.each { k, v -> device.hostProps?."vcenter.${k.toLowerCase()}" = v.join(',') }
        }
 
        device.hostProps.'netscan.powerstate' = _vm.runtime.powerState // Add power state for filtering
        device.hostProps.'netscan.foundDNS' = foundDNS as String
        device.hostProps += ilpCredentials
 
        resources.add(device)
    }
}
 
if (includeESXiHosts) {
    hosts.each{ _host ->
        Map device = [:]
 
        def MOR = _host.MOR
        if (!MOR) {
            lmDebug.LMDebugPrint( "DEBUG: MOR not found for ${_host}, skipping" )
            return
        }
 
        def compLine = vSphere.getComputeLineage(_host.MOR?.val)
        def compFolder = folderFormatter(compLine, rootFolder)
 
        def vSphere1
        lmDebug.LMDebugPrint( "DEBUG: Attempting to login to the ESX host ${_host}" )
 
        def addr1 = "https://${_host.name}/sdk"
        def user1 = eUser ?: user
        def pass1 = ePass ?: pass
        try {
            vSphere1 = lmvSphere.vSphereWebServicesAPIFactory(addr1, user1, pass1, 10, 10)
        } catch (InvalidLoginFaultMsg e) {
            lmDebug.LMDebugPrint( "DEBUG: Unable to login to ESXi host ${_host} at ${addr1}, skipping..." )
        }
        if (!vSphere1) {
            lmDebug.LMDebugPrint( "DEBUG: Unable to connect to ESXi host ${_host.name} with the provided credentials" )
 
            // We were unable to connect to the ESXi host directly, just add it as a standard device
            device = [
                    'hostname'   : _host.name,
                    'displayname': _host.name,
                    'hostProps'  : [:], // Do not set the system category 'VMware_ESXi' since we can't actually use this as an ESXi device
                    'groupName'  : ["${compFolder}/ESXi hosts"].minus(null)
            ]
        } else {
            lmDebug.LMDebugPrint( "DEBUG: Successful connection to ESXi host ${_host.name}" )
            def esxHost = vSphere1.getMOs('HostSystem')[0]
            device = [
                    'hostname'   : esxHost.name,
                    'displayname': esxHost.name,
                    'hostProps'  : [
                        'esx.user'         : user1,
                        'esx.pass'         : pass1,
                        'esx.addr'         : addr1,
                        'system.categories': 'VMware_ESXi'
                    ],
                    'groupName'  : ["${compFolder}/ESXi hosts"].minus(null)
            ]
        }
 
        device.hostProps.'vcenter.hostname' = host
        if (applyVCenterCredentialsToESXHost) { device.hostProps += ilpCredentials }
 
        // If the netscan is running on a vCenter device
        if (productId == 0) {
            // Add vCenter tags
            def tagP = tags[MOR?.value as String]?.values.collect{ k, v ->
                v.collect{ "${k}.${it}" }
            }.flatten().join(",")
            device.hostProps.'vcenter.tags' = tagP
 
            // Add all parent entities as device properties
            def lineage = lineageParser(compLine)
            lineage.each{ k, v -> device.hostProps?."vcenter.${k.toLowerCase()}" = v.join(',') }
        }
 
        resources.add(device)
    }
}
 
emitWriteJsonResources(emit, cacheFilename, resources, lmDebug)
 
return 0
 
 
/**
 * Function for transforming the inventory view/device lineage -> formatted LM group structure
 *
 * @param lineage Lineage generated from vSphere.getComputeLineage/vSphere.getVMLineage functions
 * @param rootFolder optional property to set the root folder for the vSphere that all other folders will be nested in
 * @return String of the formatted folder for netscan groupName parameter
 */
String folderFormatter(List<Map> lineage, String rootFolder = '') {
    if (lineage.size() > 1) {
        def folder = lineage.collect{
            switch (it.type.toUpperCase()) {
                case 'FOLDER' :
                    if (it.parent[0] == null) { // This is the parent folder
                        return ((rootFolder) ?: "VMware - ${it.name}")
                    } else if (it.name == 'vm') {
                        return 'VMs' // VMs and templates folder
                    } else {
                        return it.name
                    }
                    break
                case 'DATACENTER' :
                    return "Datacenter - ${it.name}"
                    break
                case 'CLUSTERCOMPUTERESOURCE' :
                    return "Cluster - ${it.name}"
                    break
                case 'RESOURCEPOOL' :
                    return "Resource Pool - ${it.name}"
                    break
                case 'VIRTUALMACHINE' :
                case 'HOSTSYSTEM' :
                    // The devices we want to discover
                    return it.name
                    break
                case 'COMPUTERESOURCE' :
                    return 'Standalone ESXi hosts'
                default:
                    return it.name
            }
            // Don't put the device in a folder named after it
        }[0..-2]
 
        if (lineage.size() >= 2) {
            // Check for standalone VMs that are not in a resourcePool, and put them in their own standalone folder
            if ( lineage[-1].type == 'VIRTUALMACHINE' && (lineage[-2].type != 'RESOURCEPOOL' && lineage[-2].type != 'FOLDER')) {
                if (includeStandaloneVM) {
                    folder << 'Standalone VMs'
                } else {
                    // This is a standalone, and if we don't want to include it, return nothing
                    return null
                }
            }
        }
        return folder.join('/')
    } else {
        return
    }
}
 
 
/**
 * Determines which nested folders/datacenter/cluster/resourcepool/etc. that an object belongs to.
 * Ignores the auto-generated folders that all VMs exist in. These folders are not visible in the VM, but do exist in the backend
 *
 * @param lineage Lineage generated from vSphere.getComputeLineage/vSphere.getVMLineage functions
 * @return Map of the folders/datacenter/cluster/resourcepool/etc. that are provided from the lineage
 */
Map<String, List<String>> lineageParser(List<Map> lineage) {
    Map<String, List<String>> out = [:].withDefault{[]}
 
    lineage.each{ out[it?.type] << it?.name }
    out.collectEntries{ k, v ->
        v.unique()
        switch (k.toUpperCase()) {
            case 'CLUSTERCOMPUTERESOURCE':
                k = 'CLUSTER'
                break
            case 'FOLDER':
                v.remove('vm') // Autogenerated folders
                v.remove('Datacenters')
                break
        }
        _out = [k, v]
    }
}
 
 
/**
 * Sanitizes filepath and instantiates File object
 *
 * @param filename String
 * @param fileExtension String
 * @return File object using sanitized relative filepath
*/
File newFile(String filename, String fileExtension) {
    // Ensure relative filepath is complete with extension type
    def filepath
    if (!filename.startsWith("./")) {
        filepath = "./${filename}"
    }
    if (!filepath.endsWith(".${fileExtension}")) {
        filepath = "${filepath}.${fileExtension}"
    }
 
    return new File(filepath)
}
 
 
/**
 * Replaces cached props stored with bogus values with their correct values
 *
 * @param cachedProps Map of hostProps values stored in file cache
 * @param sensitiveProps Map of sensitive properties configured in the netscan to use for updating cachedProps values
 * @return completeHostProps Map updated hostProps with no bogus values
*/
Map processCachedHostProps(Map cachedProps, Map sensitiveProps) {
    Map completeHostProps = cachedProps.collectEntries{ k, v ->
                                if (sensitiveProps.containsKey(k)) {
                                    return [k as String, sensitiveProps[k]]
                                }
                                else {
                                    return [k as String, v as String]
                                }
                            }
    // Verify that we do not have any remaining properties with fake values; stop the show if we do
    def missingKeys = completeHostProps.findAll{ k,v -> v == "***" }
    if (missingKeys) {
        throw new Exception(" Unable to update all cached sensitive properties with appropriate values.  Check Netscan properties and ensure the following keys have been added with values other than ***:\n\t${missingKeys.keySet().join(",")}")
    }
    return completeHostProps
}
 
 
/**
 * Processes a JSON file representing resources cached to disk on the collector
 *
 * @param emit Snippet object for lm.emit (requires version 1.0)
 * @param filename String
 * @param sensitiveProps Map of sensitive properties configured in the netscan to use for updating cachedProps values
 * @param lmDebug Snippet object class instantiation of lm.debug (requires version 1.0)
 * @return Boolean indicator of whether processing was successful
*/
Boolean processResourcesJson(emit, String filename, Map sensitiveProps, lmDebug) {
    File cacheFile = newFile(filename, "json")
    def cachedDevices
    try {
        cachedDevices = new JsonSlurper().parse(cacheFile)
    }
    catch (JsonException) {
        lmDebug.LMDebugPrint("No file found under ${cacheFile.name}; proceeding with API calls to retrieve devices.\n")
        return false
    }
 
    if (!cachedDevices) {
        lmDebug.LMDebugPrint("No cached devices found in ${cacheFile.name}; proceeding with API calls to retrieve devices.\n")
        return false
    }
    lmDebug.LMDebugPrint("${cachedDevices.size()} devices retrieved from cache file ${cacheFile.name}")
 
    // Updated cached devices to include proper values for sensitive properties stored in cache
    cachedDevices.each{ device ->
        if (device["hostProps"]) device["hostProps"] = processCachedHostProps(device["hostProps"], sensitiveProps)
    }
 
    emitWriteJsonResources(emit, filename, cachedDevices, lmDebug)
    return true
}
 
 
/**
 * Output resources to stdout and cache any remainders to JSON file on collector disk
 *
 * @param emit Snippet object for lm.emit (requires version 1.0)
 * @param filename String
 * @param resources List<Map> resources to be added from netscan
 * @param lmDebug Snippet object class instantiation of lm.debug (requires version 1.0)
*/
def emitWriteJsonResources(emit, String filename, List<Map> resources, lmDebug) {
    def chunkSize = 600
    def chunk = Math.min(resources.size(), chunkSize)
    lmDebug.LMDebugPrint("Adding ${chunk} devices.")
    // Output resources in chunk size deemed safe by platform team
    emit.resource(resources[0..chunk-1], lmDebug.debug)
 
    File cacheFile = newFile(filename, "json")
    // If the number of resources is less than or equal to our chunk size, our batching is complete and we can delete the file and exit
    if (resources.size() <= chunk) {
        cacheFile.delete()
        lmDebug.LMDebugPrint("All known devices have been reported.")
        return
    }
    // Remove sensitive properties prior to storing data in cache file; hardcode to true to ensure props are masked regardless of debug mode
    def remainingResources = emit.sanitizeResourceSensitiveProperties(resources, true)
    remainingResources = remainingResources[chunk..-1]
    def jsonRR = JsonOutput.toJson(remainingResources)
    // println JsonOutput.prettyPrint(jsonRR) // Uncomment for debugging purposes if needed
 
    lmDebug.LMDebug("Caching ${remainingResources.size()} devices to disk to add to portal in upcoming netscan executions.")
    cacheFile.write(jsonRR)
    return
}
  1.  スケジュール セクション、選択 このNetScanをスケジュールに従って実行する。 動的環境の場合、NetScan を XNUMX 時間ごとに実行するようにスケジュールできます。

注: 後続の NetScan の実行では、VMware vCenter の変更に基づいてリソースまたはリソース グループが追加または移動されます。 ただし、NetScan にはリソースを削除する機能がありません。

  1. 選択 Save or 保存して実行.

NetScan を実行した後、追加されたリソースの数の履歴を確認するか、NetScan がリソースを作成しない場合はエラー メッセージを確認します。 必要に応じて作成します 動的リソース グループ ビジネス ニーズごとにリソースを整理し、ワークロード固有の監視資格情報を適用します。 

リソースへのプロパティの手動割り当て

Advanced Netscan を通じてホストを追加すると、関連するプロパティと資格情報が自動的に検出され、ホストに割り当てられます。 ホストを LogicMonitor に手動で追加する場合は、次のプロパティを使用します。 監視にリソースを手動で追加する方法の詳細については、を参照してください。 デバイスの追加.

ESXi ホスト

プロパティ必須
esx ユーザー ESXi 読み取り専用ユーザー有り
esx.パスESXi読み取り専用パスワード有り
esx.urlESXiにアクセスするためのURL
デフォルト値は https://<host>/sdk
いいえ

vCenter Server Appliance のホスト プロパティ

プロパティ必須
vcenter.uservCenter 読み取り専用ユーザー有り
vcenter.passvCenter 読み取り専用パスワード有り
vcenter.urlVCSAにアクセスするためのURL
デフォルト値は https://<host>/sdk
いいえ

注: 古い世代の vCenter モジュールとの下位互換性を確保するために、認証情報が設定されていない場合は、次の vCenter ユーザー プロパティが使用されます。 ただし、デバイスを構成する場合は、前述の vCenter Server Appliance のホスト プロパティ vcenter プレフィックスを使用することをお勧めします。

vCenter ユーザーのプロパティ

プロパティ
vcsa.uservCenter 読み取り専用ユーザー
vcsa.passvCenter 読み取り専用パスワード
esx ユーザーvCenter 読み取り専用ユーザー
esx.パスvCenter 読み取り専用パスワード

注: vSphere には、API 専用ユーザーは存在しません。 デフォルトでは、作成された読み取り専用ユーザーはホストの Web インターフェイスにアクセスできます。 それができない場合は、ユーザー/ロールの構成に問題があることを示している可能性があります。 vCenter 監視の場合、VAMI インターフェイス (ポート 5480 のデフォルト アクセス) にアクセスできる必要があります。

APIポートまたはURL

vCenter または ESXi ホストが非標準ポートで API を公開するように構成されている場合は、プロパティ vcenter.url または esx.url を適切な URL で設定できます (例: https://192.168.1.100:8443/sdk).

トラブルシューティング

  • VMware_vSphere モジュールからデータを収集できるにもかかわらず、VMware_vCenterAppliance モジュールで問題が発生した場合は、権限の問題が原因である可能性があります。 デフォルトの読み取り専用 vSphere ロールは、LogicMonitor に適切な権限を提供する必要がありますが、カスタム ロールが割り当てられている場合は、そのロールに対して「子に伝播する」オプションが有効になっていることを確認してください。 VAMI インターフェイス (https://) にログインすることで、ロールに適切な権限があるかどうかを確認できます。 :5480) を確認し、[監視] タブが表示されることを確認します。
  • クラスターに対する大規模なクエリは内部 DB に過度の負荷をかける可能性があり、その結果、データ収集の問題が発生します。 この問題を軽減するには、を参照してください。 パフォーマンス グラフが空で、次のエラーが表示される: 要求の処理は管理者によって制限されています (2107096) VMware のドキュメント。
  • vCenter サーバーのサイズが、管理しているホストと VM の数に合わせて適切に設定されていることを確認する必要があります。 サイズ要件については、VMware のドキュメントを参照してください。 同じマシン上にある場合は、vCenter データベースの要件を vCenter サーバーの要件に追加する必要があります。
    vCenter に十分なリソースがない場合、API (HTTPS) ポートへの一部の接続が拒否されるか (LogicMonitor の HTTPS データソースで簡単に確認できます)、一部のパフォーマンス クエリに対して「-1」の値が報告されることがあります。 これらの両方の状況では、グラフにギャップが発生します。 これは LogicMonitor の問題ではありません。
  • vCenter の 5 分間統計収集レベルが「レベル 1」に設定されている場合、一部のデータポイントはデータを返さない可能性があります。 監視対象の必要なすべてのカウンタにアクセスするには、vCenter 統計収集レベルを「レベル 2」に設定する必要があります。 これは、vSphere Web Client 内で次のように実行できます (「flex」または「flash」インターフェイス (HTML5 ではない) を使用する必要があります)。
    1. ツリーでvCenterインスタンスを選択します。
    2. Video Cloud Studioで 構成 タブには何も表示されないことに注意してください。
    3. 選択 > 統計 > 編集.
    4. 「統計レベル」列のドロップダウンから、表にリストされている最初の項目として「レベル 2」を選択します。

パッケージ内の VMware vSphere LogicModules

VMware vSphere モジュールは、監視対象のコンポーネントに基づいて XNUMX つの異なるカテゴリに分類されます。

VMware ESXi モジュールは、VMware ESXi ホストの可用性、パフォーマンス、およびハードウェア センサーの監視と、vCenter によって管理されていないスタンドアロン ESXi ホストの仮想マシンの監視を提供します。

表示名 説明置き換え
VMware_ESXi_CPUデータソースホストの CPU の使用率を追跡します。VMware_ESXi_リソース
VMware_ESXi_HostPerformance
VMware_ESXi_データストアスループットデータソースvSphere / vCenter ホストのパフォーマンス メトリックを監視します。VMware_ESXi_Datastoreパフォーマンス
VMware_ESXi_Datastoreの使用状況データソースESXi データストアのストレージ容量を監視します。 データは、データストアにアクセスできる場合にのみ有効です。VMware_ESXi_DatastoreCapacity
VMware_ESXi_DisksデータソースESXi ホストのディスク使用量を監視します。VMware_ESXi_HostPerformance
VMware_ESXi_HardwareHealthSensorデータソースESXi によって報告されるハードウェア健全性センサーを監視します。 監視されるセンサーは、ストレージ / メモリ / プロセッサー監視タブにあるハードウェア健全性センサーであり、VMware_ESXi_SystemHealthSensor によって報告されるシステム センサーとは別のものです。 ステータスが不明またはグレーのセンサーは、アクティブな検出から除外されます。vmware_esxi_hardwarehealthsensors
VMware_ESXi_HardwareSensorFans
VMware_ESXi_HardwareSensorPower
VMware_ESXi_HardwareSensor

VMware_ESXi_LogicalProcessorsデータソースESXi ホスト CPU の論理プロセッサの使用率を追跡します。VMware_ESXi_HostCPUコア数
VMware_ESXi_メモリデータソースESXi ホストで使用可能なメモリを監視します。VMware_ESXi_HostPerformance
VMware_ESXi_NetworkInterfacesデータソースESXi ホストのネットワーク インターフェイスの帯域幅を監視します。VMware_ESXi_HostInterfaces
VMware_ESXi_NetworkStateデータソースESX ホストのネットワークと分散ポート グループのステータスを監視します。VMware_ESXi_NetworkStatus
VMware_ESXi_PowerデータソースESXi ホストの電力使用量を監視します。N/A
VMware_ESXi_SystemHealthSensorデータソースVMware によって報告された、ESXi ホスト上のハードウェア健全性システム センサーを監視します。 監視されるシステム センサーは、追加のストレージ、メモリ、CPU センサー、ハードウェア センサーとは別のものです。N/A
VMware_ESXi_VirtualMachineDiskCapacityデータソース個々の仮想マシンの仮想ディスク ストレージ容量メトリックを監視します。VMware_vSphere_vDisk容量
VMware_ESXi_VirtualMachinePerformanceデータソースESXi 仮想マシンの CPU、ディスク、メモリ、およびネットワーク パフォーマンス メトリックを監視します。VMware_vSphere_VMパフォーマンス
VMware_ESXi_VirtualMachineSnapshotsデータソース個々の仮想マシン上のスナップショットの経過時間を監視します。VMware_vSphere_VM スナップショット
VMware_ESXi_VirtualMachineStatusデータソース電源、ハートビート、フォールト トレランス、ゲスト ツールの状態、および個々の仮想マシンの最後のパワーオンからの時間を追跡します。VMware_vSphere_VMステータス
VMware_vSphere_Network_TopologyトポロジーソースvCenter からのデータに基づいて VMware ネットワーク トポロジを生成します。VMware_vCenter_Network_Topology
VMware_vSphere_VirtualMachine_TopologyトポロジーソースvCenter からのデータに基づいて VMware 仮想マシン トポロジを生成します。VMware_vCenter_VM_トポロジ
addERI_ESXiプロパティソースホスト UUID、MAC アドレス、IQN、WWN を含む、トポロジ マッピング用の VMware ESXi ホストのデバイス外部リソース ID (ERI) を設定します。 ERI タイプ (ERT) を「ハイパーバイザー」に設定します。N/A
VMware_vSphere_情報プロパティソースvSphere ホストの追加情報を提供します。VMware_ESXi_ObjectCount
VMware_vCenter_ObjectCount
VMware_LM_トラブルシューターデータソースさまざまな設定をチェックして、ESXi/vCenter 収集が適切に機能することを確認します。 発見された問題を修正する方法をユーザーに指示します。N/A

VMware vCenterAppliance モジュールは、VMware vCenter Server Appliance の可用性とパフォーマンスの監視に関するデータを提供します。

表示名 説明置き換え
VMware_vCenterAppliance_Backupデータソース最新のバックアップ発生からリカバリ バックアップ情報を収集します。VMware_VCSA_バックアップ
VMware_vCenterAppliance_CPUデータソースvCenter ホストの CPU 情報を監視します。VMware_VCSA_CPU
VMware_vCenterAppliance_DiskPerformanceデータソースvCenter ホストのディスク パフォーマンスを監視します。VMware_VCSA_Diskパフォーマンス
VMware_vCenterAppliance_FileSystemPartitionsデータソースvCenter ホストのファイルシステム パーティションの使用率を監視します。VMware_VCSA_ファイルシステム容量
VMware_vCenterAppliance_FileSystemSwapデータソースvCenter ホストのディスク スワップの使用率を監視します。VMware_VCSA_スワップ
VMware_vCenterAppliance_HealthStatusデータソースapplmgmt、データベース ストレージ、ロード、メモリ、ソフトウェア パッケージ、ストレージ、スワップ、システムなどのさまざまなシステム サービスの vCenter ホストの健全性ステータスを監視します。VMware_VCSA_HealthStatus
VMware_vCenterAppliance_HighAvailabilityデータソースvCenter HA (VCHA) のステータスを監視します。VMware_vCenter_AdmissionControl
VMware_vCenter_HANodeHealth
VMware_vCenter_HAステータス
VMware_vCenterAppliance_MemoryデータソースvCenter ホストのメモリ情報を監視します。VMware_VCSA_メモリ
VMware_vCenterAppliance_NetworkInterfacesデータソースvCenter ホストのネットワーク接続を監視します。VMware_VCSA_ネットワーク
VMware_vCenterAppliance_PowerデータソースvCenter 環境の合計電力使用量を監視します。N/A
VMware_vCenterAppliance_ServicesデータソースvCenter ホストのサービスの実行状態を監視します。VMware_VCSA_サービス
addCategory_vCenterプロパティソースHA (VCHA) および VCSA バックアップを備えた vCenter クラスターなど、オプションの追加の vCenter 監視サービス (使用中の場合) のカテゴリを設定します。addCategory_vCenterHA
VMware_vSphere_情報プロパティソースvSphere ホストの追加情報を提供します。VMware_ESXi_ObjectCount
VMware_vCenter_ObjectCount
VMware_LM_トラブルシューターデータソースさまざまな設定をチェックして、ESXi/vCenter 収集が適切に機能することを確認します。 発見された問題を修正する方法をユーザーに指示します。N/A

VMware vSphere モジュールは、vSphere 環境 (仮想マシン、クラスター、リソース プール、データストアなど) の可用性とパフォーマンスの監視を提供します。

表示名 説明置き換え
VMware_vSphere_ClustersデータソースvCenter デバイス上の ESX ホスト クラスタの CPU およびメモリ メトリックを監視します。VMware_vCenter_Clusterパフォーマンス
VMware_vSphere_DatastoreClustersデータソースvCenter データストア クラスタのストレージ使用量を監視します。VMware_vCenter_DatastoreClusters
VMware_vSphere_DatastoreStatusデータソースvSphere データストアの稼働状況を監視します。VMware_vCenter_DatastoreStatus
VMware_vSphere_データストアスループットデータソースvSphere / vCenter ホストのパフォーマンス メトリックを監視します。VMware_vCenter_Datastoreパフォーマンス
VMware_vSphere_Datastoreの使用状況データソースvCenter データストアのストレージ使用量を監視します。 データは、データストアにアクセスできる場合にのみ有効です。VMware_vCenter_DatastoreCapacity
VMware_vSphere_HighAvailabilityデータソースvSphere High Availability (vSphere HA) とアドミッション コントロール (HA に利用可能なリソース、vSphere HA エージェント (FDM) で問題が発生しているかどうかなど) を監視します。VMware_vCenter_AdmissionControl
VMware_vSphere_HostStatusデータソースvCenter ESXi ホストの状態を監視します。VMware_vCenter_HostStatus
VMware_vSphere_NetworkStateデータソースvCenter ネットワークと分散仮想ポート グループのステータスを監視します。VMware_vCenter_NetworkStatus
VMware_vSphere_ResourcePoolsデータソースvCenter デバイス上のリソース プールの CPU およびメモリのメトリックを監視します。VMware_vCenter_ResourcePools
VMware_vSphere_VirtualMachineDiskCapacityデータソース個々の仮想マシンの仮想ディスク ストレージ容量メトリックを監視します。VMware_vCenter_VMDiskCapacity
VMware_vSphere_VirtualMachineNetworkInterfaceデータソース仮想マシン インターフェイスのデータ スループットとパケット送信を監視します。VMware_vCenter_VMInterface
VMware_vSphere_VirtualMachinePerformanceデータソース個々の仮想マシンの CPU、ディスク、メモリ、およびネットワークのパフォーマンス メトリックを監視します。VMware_vCenter_VMパフォーマンス
VMware_vSphere_VirtualMachineSnapshotsデータソース個々の仮想マシン上のスナップショットの経過時間を監視します。VMware_vCenter_VMSnapshots
VMware_vSphere_VirtualMachineStatusデータソース電源、ハートビート、フォールト トレランス、ゲスト ツールの状態、および個々の仮想マシンの最後のパワーオンからの時間を追跡します。VMware_vCenter_VMStatus
VMware_vCenter_Cluster_TopologyトポロジーソースvCenter からのデータに基づいて VMware クラスター トポロジを生成します。VMware_ESXi_トポロジ
VMware_vCenter_Datastore_TopologyトポロジーソースvCenter からのデータに基づいて VMware データストア トポロジを生成します。VMware_ESXi_トポロジ
VMware_vSphere_Network_TopologyトポロジーソースvCenter からのデータに基づいて VMware ネットワーク トポロジを生成します。VMware_vCenter_Network_Topology
VMware_vSphere_VirtualMachine_TopologyトポロジーソースvCenter からのデータに基づいて VMware 仮想マシン トポロジを生成します。VMware_vCenter_VM_トポロジ
addERI_vCenterプロパティソースUUID を含む、トポロジ マッピング用の VMware ESX vCenter のデバイス外部リソース ID (ERI) を設定します。 ERI タイプ (ERT) を「PhysicalServer」に設定します。N/A
addCategory_vCenterプロパティソースHA (VCHA) および VCSA バックアップを備えた vCenter クラスターなど、オプションの追加の vCenter 監視サービス (使用中の場合) のカテゴリを設定します。addCategory_vCenterHA
VMware_vSphere_情報プロパティソースvSphere ホストの追加情報を提供します。VMware_ESXi_ObjectCount
VMware_vCenter_ObjectCount
VMware_LM_トラブルシューターデータソースさまざまな設定をチェックして、ESXi/vCenter 収集が適切に機能することを確認します。 発見された問題を修正する方法をユーザーに指示します。N/A

このパッケージのモジュールによって追跡されるさまざまなメトリクスに静的データポイントのしきい値を設定する場合、LogicMonitor はテクノロジー所有者のベスト プラクティス KPI 推奨事項に従います。 必要に応じて、環境固有のニーズに合わせてこれらの事前定義されたしきい値を調整することをお勧めします。 データポイントのしきい値の調整の詳細については、を参照してください。 データポイントの静的しきい値の調整.

レガシーモジュールからの移行

現在、これらのレガシー モジュールのいずれかを使用して VMware デバイスを監視している場合、新しいモジュールのインポート時にデータが失われることはありません。 これは、モジュールの上書きを排除するためにモジュール名が変更されているためです。 詳細については、「」を参照してください。 非推奨のLogicModules.

ただし、モジュールの両方のセットがアクティブである限り、重複したデータが収集され、重複したアラートを受信することになります。 このため、vCenter Server に不要な負荷が追加されるのを避けるために、新しいモジュール セットをインポートした後に上記のモジュールを無効にし、それらが環境で意図したとおりに動作することを確認する必要があります。

DataSource が無効になると、ホストへのクエリとアラートの生成が停止されますが、すべての履歴データは維持されます。 レガシー モジュールを完全に削除することもできますが、削除するとすべての履歴データが失われるため、この移行は慎重に検討してください。 モジュールの無効化の詳細については、を参照してください。 データソースまたはインスタンスの監視を無効にする.

記事上で