Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
47 changes: 27 additions & 20 deletions receiver/vcenterreceiver/processors.go
Original file line number Diff line number Diff line change
Expand Up @@ -198,14 +198,16 @@ func (v *vcenterMetricScraper) buildHostMetrics(
v.recordHostPerformanceMetrics(hostPerfMetrics)
}

if hs.Config == nil || hs.Config.VsanHostConfig == nil || hs.Config.VsanHostConfig.ClusterInfo == nil {
v.logger.Info("couldn't determine UUID necessary for vSAN metrics for host " + hs.Name)
v.mb.EmitForResource(metadata.WithResource(rb.Emit()))
return vmRefToComputeRef, nil
}
vSANMetrics := v.scrapeData.hostVSANMetricsByUUID[hs.Config.VsanHostConfig.ClusterInfo.NodeUuid]
if vSANMetrics != nil {
v.recordHostVSANMetrics(vSANMetrics)
if v.hasEnabledVSANMetrics() {
if hs.Config == nil || hs.Config.VsanHostConfig == nil || hs.Config.VsanHostConfig.ClusterInfo == nil {
v.logger.Info("couldn't determine UUID necessary for vSAN metrics for host " + hs.Name)
v.mb.EmitForResource(metadata.WithResource(rb.Emit()))
return vmRefToComputeRef, nil
}
vSANMetrics := v.scrapeData.hostVSANMetricsByUUID[hs.Config.VsanHostConfig.ClusterInfo.NodeUuid]
if vSANMetrics != nil {
v.recordHostVSANMetrics(vSANMetrics)
}
}
v.mb.EmitForResource(metadata.WithResource(rb.Emit()))

Expand Down Expand Up @@ -332,9 +334,11 @@ func (v *vcenterMetricScraper) buildVMMetrics(
v.recordVMPerformanceMetrics(perfMetrics)
}

vSANMetrics := v.scrapeData.vmVSANMetricsByUUID[vm.Config.InstanceUuid]
if vSANMetrics != nil {
v.recordVMVSANMetrics(vSANMetrics)
if v.hasEnabledVSANMetrics() {
vSANMetrics := v.scrapeData.vmVSANMetricsByUUID[vm.Config.InstanceUuid]
if vSANMetrics != nil {
v.recordVMVSANMetrics(vSANMetrics)
}
}
v.mb.EmitForResource(metadata.WithResource(rb.Emit()))

Expand Down Expand Up @@ -380,16 +384,19 @@ func (v *vcenterMetricScraper) buildClusterMetrics(
}
// Record and emit Cluster metric data points
v.recordClusterStats(ts, cr, vmGroupInfo)
vSANConfig := cr.ConfigurationEx.(*types.ClusterConfigInfoEx).VsanConfigInfo
if vSANConfig == nil || vSANConfig.Enabled == nil || !*vSANConfig.Enabled || vSANConfig.DefaultConfig == nil {
v.logger.Info("couldn't determine UUID necessary for vSAN metrics for cluster " + cr.Name)
v.mb.EmitForResource(metadata.WithResource(rb.Emit()))
return err
}

vSANMetrics := v.scrapeData.clusterVSANMetricsByUUID[vSANConfig.DefaultConfig.Uuid]
if vSANMetrics != nil {
v.recordClusterVSANMetrics(vSANMetrics)
if v.hasEnabledVSANMetrics() {
vSANConfig := cr.ConfigurationEx.(*types.ClusterConfigInfoEx).VsanConfigInfo
if vSANConfig == nil || vSANConfig.Enabled == nil || !*vSANConfig.Enabled || vSANConfig.DefaultConfig == nil {
v.logger.Info("couldn't determine UUID necessary for vSAN metrics for cluster " + cr.Name)
v.mb.EmitForResource(metadata.WithResource(rb.Emit()))
return err
}

vSANMetrics := v.scrapeData.clusterVSANMetricsByUUID[vSANConfig.DefaultConfig.Uuid]
if vSANMetrics != nil {
v.recordClusterVSANMetrics(vSANMetrics)
}
}

v.mb.EmitForResource(metadata.WithResource(rb.Emit()))
Expand Down
72 changes: 54 additions & 18 deletions receiver/vcenterreceiver/scraper.go
Original file line number Diff line number Diff line change
Expand Up @@ -88,6 +88,36 @@ func newVcenterScrapeData() *vcenterScrapeData {
}
}

func (v *vcenterMetricScraper) hasEnabledVSANMetrics() bool {
metrics := v.config.MetricsBuilderConfig.Metrics

// Check cluster vSAN metrics
if metrics.VcenterClusterVsanCongestions.Enabled ||
metrics.VcenterClusterVsanLatencyAvg.Enabled ||
metrics.VcenterClusterVsanOperations.Enabled ||
metrics.VcenterClusterVsanThroughput.Enabled {
return true
}

// Check host vSAN metrics
if metrics.VcenterHostVsanCacheHitRate.Enabled ||
metrics.VcenterHostVsanCongestions.Enabled ||
metrics.VcenterHostVsanLatencyAvg.Enabled ||
metrics.VcenterHostVsanOperations.Enabled ||
metrics.VcenterHostVsanThroughput.Enabled {
return true
}

// Check VM vSAN metrics
if metrics.VcenterVMVsanLatencyAvg.Enabled ||
metrics.VcenterVMVsanOperations.Enabled ||
metrics.VcenterVMVsanThroughput.Enabled {
return true
}

return false
}

func (v *vcenterMetricScraper) Start(ctx context.Context, _ component.Host) error {
connectErr := v.client.EnsureConnection(ctx)
// don't fail to start if we cannot establish connection, just log an error
Expand Down Expand Up @@ -246,13 +276,15 @@ func (v *vcenterMetricScraper) scrapeComputes(ctx context.Context, dc *mo.Datace
}
}

// Get all Cluster vSAN metrics and store for later retrieval
vSANMetrics, err := v.client.VSANClusters(ctx, v.scrapeData.clusterRefs)
if err != nil {
errs.AddPartial(1, fmt.Errorf("failed to retrieve vSAN metrics for Clusters: %w", err))
return
if v.hasEnabledVSANMetrics() {
// Get all Cluster vSAN metrics and store for later retrieval (only if vSAN metrics are enabled)
vSANMetrics, err := v.client.VSANClusters(ctx, v.scrapeData.clusterRefs)
if err != nil {
errs.AddPartial(1, fmt.Errorf("failed to retrieve vSAN metrics for Clusters: %w", err))
return
}
v.scrapeData.clusterVSANMetricsByUUID = vSANMetrics.MetricResultsByUUID
}
v.scrapeData.clusterVSANMetricsByUUID = vSANMetrics.MetricResultsByUUID
}

// scrapeHosts scrapes and stores all relevant metric/property data for a Datacenter's HostSystems
Expand Down Expand Up @@ -287,12 +319,15 @@ func (v *vcenterMetricScraper) scrapeHosts(ctx context.Context, dc *mo.Datacente
v.scrapeData.hostPerfMetricsByRef = results.resultsByRef
}

vSANMetrics, err := v.client.VSANHosts(ctx, v.scrapeData.clusterRefs)
if err != nil {
errs.AddPartial(1, fmt.Errorf("failed to retrieve vSAN metrics for Hosts: %w", err))
return
if v.hasEnabledVSANMetrics() {
// Get all Host vSAN metrics and store for later retrieval
vSANMetrics, err := v.client.VSANHosts(ctx, v.scrapeData.clusterRefs)
if err != nil {
errs.AddPartial(1, fmt.Errorf("failed to retrieve vSAN metrics for Hosts: %w", err))
return
}
v.scrapeData.hostVSANMetricsByUUID = vSANMetrics.MetricResultsByUUID
}
v.scrapeData.hostVSANMetricsByUUID = vSANMetrics.MetricResultsByUUID
}

// scrapeResourcePools scrapes and stores all relevant property data for a Datacenter's ResourcePools/vApps
Expand Down Expand Up @@ -343,12 +378,13 @@ func (v *vcenterMetricScraper) scrapeVirtualMachines(ctx context.Context, dc *mo
v.scrapeData.vmPerfMetricsByRef = results.resultsByRef
}

// Get all VirtualMachine vSAN metrics and store for later retrieval
vSANMetrics, err := v.client.VSANVirtualMachines(ctx, v.scrapeData.clusterRefs)
if err != nil {
errs.AddPartial(1, fmt.Errorf("failed to retrieve vSAN metrics for VirtualMachines: %w", err))
return
if v.hasEnabledVSANMetrics() {
// Get all VirtualMachine vSAN metrics and store for later retrieval
vSANMetrics, err := v.client.VSANVirtualMachines(ctx, v.scrapeData.clusterRefs)
if err != nil {
errs.AddPartial(1, fmt.Errorf("failed to retrieve vSAN metrics for VirtualMachines: %w", err))
return
}
v.scrapeData.vmVSANMetricsByUUID = vSANMetrics.MetricResultsByUUID
}

v.scrapeData.vmVSANMetricsByUUID = vSANMetrics.MetricResultsByUUID
}