VMware vSphereの監視
最終更新日: 30 年 2023 月 XNUMX 日LogicMonitor は、すぐに使用できる VMware vSphere の監視を提供します。 この監視スイートは、vSphere Web サービスと自動化 API を利用して、VMware vCenter Server Appliance (VCSA)、VMware ESXi ホスト、および仮想マシンを監視します。
- vSphere Web サービス/VMware vSphere API。 詳細については、「」を参照してください。 vSphere Web サービス API.
- vSphere オートメーション API。 詳細については、「」を参照してください。 vSphere Automation API リファレンス.
互換性
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 ホスト: 詳細については、次を参照してください。
- ESXi 7.x: VMware Host Client での ESXi ユーザーの追加.
- ESXi 8.x: VMware Host Client での権限の管理
- 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 リソースとして追加しようとします。
- あなたの中で ロジックモニターポータル > モジュール > 応募者と、VMware vSphere LogicModule をインストールします。
- MFAデバイスに移動する 「リソース」 > 「追加」 > 「複数のデバイス」 > 「高度な NetScan」.
また, 高度な NetScan を追加する ページが表示されます - この NetScan に関連付ける名前を入力します。 たとえば、「VMware vCenter」や「VMware vSphere」などです。
- NetScan を実行するコレクタを選択します。
デフォルトでは、NetScan は NetScan を実行するコレクタに新しいリソースを割り当てます。 - 選択 強化されたスクリプト NetScan 方法 ドロップダウンリスト。
- 「拡張スクリプト」セクションから、次を選択します。 デバイスの資格情報 > このスキャンにはカスタム認証情報を使用します。
- NetScan に必要な VMware API 認証情報を提供する次のプロパティを追加し、NetScan がリソースを作成および編成する方法と場所を変更します。
プロパティ | 値 | 例 | 必須 |
vcenter.user | vCenter 読み取り専用ユーザー | [メール保護] | ○ |
vcenter.pass | vCenter 読み取り専用パスワード | ************ | ○ |
vcenter.ホスト名 | vCenter のホスト名 vcenter.url が設定されていない場合は、この値を使用して vCenter への接続が試行されます。 | IPアドレスまたはFQDN | ○ |
vcenter.表示名 | vCenter Server Appliance の表示名 | vcenter01 | ○ |
vcenter.url | VCSAにアクセスするためのURL | https://<vcenter.hostname>/sdk | いいえ |
esx ユーザー | ESXi ホストへの接続に使用する認証情報 すべての ESXi ホストに同じ認証情報が使用されます。 このプロパティが設定されていない場合は、vCenter に指定された認証情報が使用されます。 提供された認証情報でホストに接続できない場合でも、デバイスは検出されるため、認証情報を ESXi ホスト リソースまたは親リソース グループに手動で設定する必要があります。 | 読み取り専用ユーザー | いいえ |
esx.パス | ESXi ホストへの接続に使用する認証情報。 | ************ | いいえ |
ルートフォルダ | 検出されたすべてのデバイスが LogicMonitor に配置されるルート フォルダー。 値は入れ子にすることができます。 リソース グループが存在しない場合は、NetScan によって作成されます。 | Customer01/VMware vSphere/vCenter01/ | いいえ |
Discover.esxi | true の場合、LogicMonitor は esxi ホストを追加します。 注: このプロパティは仮想マシンの検出には影響しません。これらのプロパティは個別に切り替えることができます。 | true、false (デフォルトは true) | いいえ |
Discover.vm | true の場合、LogicMonitor は VM を検出します。 注: このプロパティは ESXi 検出には影響しません。これらのプロパティは個別に切り替えることができます。 | true、false (デフォルトは true) | いいえ |
view.hostAndCluster | 切り替えて、ホストとクラスターのインベントリ ビューを作成します。 データセンター > クラスタ > ホスト > リソース プール > VM true の場合、LogicMonitor はこのフォルダー構造を再作成します。 | true、false (デフォルトは true) | いいえ |
view.vmsAndTemplates | VM とテンプレートのインベントリ ビューの作成に切り替えます。 データセンター > クラスター > フォルダー > VM LogicMonitor はこのフォルダー構造を再作成します。 注意:: オプションに関係なく、VM テンプレートは検出されません。 | true、false (デフォルトは true) | いいえ |
view.standaloneVm | ホストとクラスターのビューが使用されるとき、およびリソース プールにない VM がスタンドアロン VM と呼ばれるデフォルトのフォルダーに配置されるときを切り替えます。 LogicMonitor はこのフォルダー構造を再作成します。 | true、false (デフォルトは true) | いいえ |
- [フィルター] セクションで、次のフィルター プロパティを使用して、特定のリソース (仮想マシン、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 つの値。 | 開発、テスト、モニタリングなし | いいえ |
- 選択 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
}
- スケジュール セクション、選択 このNetScanをスケジュールに従って実行する。 動的環境の場合、NetScan を XNUMX 時間ごとに実行するようにスケジュールできます。
注: 後続の NetScan の実行では、VMware vCenter の変更に基づいてリソースまたはリソース グループが追加または移動されます。 ただし、NetScan にはリソースを削除する機能がありません。
- 選択 Save or 保存して実行.
NetScan を実行した後、追加されたリソースの数の履歴を確認するか、NetScan がリソースを作成しない場合はエラー メッセージを確認します。 必要に応じて作成します 動的リソース グループ ビジネス ニーズごとにリソースを整理し、ワークロード固有の監視資格情報を適用します。
リソースへのプロパティの手動割り当て
Advanced Netscan を通じてホストを追加すると、関連するプロパティと資格情報が自動的に検出され、ホストに割り当てられます。 ホストを LogicMonitor に手動で追加する場合は、次のプロパティを使用します。 監視にリソースを手動で追加する方法の詳細については、を参照してください。 デバイスの追加.
ESXi ホスト
プロパティ | 値 | 必須 |
esx ユーザー | ESXi 読み取り専用ユーザー | ○ |
esx.パス | ESXi読み取り専用パスワード | ○ |
esx.url | ESXiにアクセスするためのURL デフォルト値は https://<host>/sdk | いいえ |
vCenter Server Appliance のホスト プロパティ
プロパティ | 値 | 必須 |
vcenter.user | vCenter 読み取り専用ユーザー | ○ |
vcenter.pass | vCenter 読み取り専用パスワード | ○ |
vcenter.url | VCSAにアクセスするためのURL デフォルト値は https://<host>/sdk | いいえ |
注: 古い世代の vCenter モジュールとの下位互換性を確保するために、認証情報が設定されていない場合は、次の vCenter ユーザー プロパティが使用されます。 ただし、デバイスを構成する場合は、前述の vCenter Server Appliance のホスト プロパティ vcenter プレフィックスを使用することをお勧めします。
vCenter ユーザーのプロパティ
プロパティ | 値 |
vcsa.user | vCenter 読み取り専用ユーザー |
vcsa.pass | vCenter 読み取り専用パスワード |
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 ではない) を使用する必要があります)。
- ツリーでvCenterインスタンスを選択します。
- Video Cloud Studioで 構成 タブには何も表示されないことに注意してください。
- 選択 > 統計 > 編集.
- 「統計レベル」列のドロップダウンから、表にリストされている最初の項目として「レベル 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 が無効になると、ホストへのクエリとアラートの生成が停止されますが、すべての履歴データは維持されます。 レガシー モジュールを完全に削除することもできますが、削除するとすべての履歴データが失われるため、この移行は慎重に検討してください。 モジュールの無効化の詳細については、を参照してください。 データソースまたはインスタンスの監視を無効にする.