in internal/processmetrics/fastmovingmetrics/fastmovingmetrics.go [186:268]
func collectHANAAvailabilityMetrics(ctx context.Context, ip *InstanceProperties, e commandlineexecutor.Execute, p commandlineexecutor.Params, scc sapcontrol.ClientInterface) ([]*mrpb.TimeSeries, error) {
log.CtxLogger(ctx).Debugw("Collecting HANA Availability and HA Availability metrics for instance", "instanceid", ip.SAPInstance.GetInstanceId())
now := tspb.Now()
sc := &sapcontrol.Properties{Instance: ip.SAPInstance}
var (
err error
sapControlResult int
processes map[int]*sapcontrol.ProcessStatus
metrics []*mrpb.TimeSeries
availabilityValue int64
)
if _, ok := ip.SkippedMetrics[pmHANAAvailabilityPath]; !ok {
processes, err = sc.GetProcessList(ctx, scc)
if err != nil {
return nil, err
}
// If GetProcessList API didn't return an error.
availabilityValue = hanaAvailability(ip, processes)
mPath := pmHANAAvailabilityPath
if ip.ReliabilityMetric {
metrics = append(metrics, createHeartbeatMetrics(ip, now, availabilityValue != 0))
if availabilityValue == 0 {
usagemetrics.Action(usagemetrics.ReliabilityHANANotAvailable)
} else {
usagemetrics.Action(usagemetrics.ReliabilityHANAAvailable)
}
} else {
metricevents.AddEvent(ctx, metricevents.Parameters{
Path: metricURL + mPath,
Message: "HANA System Availability",
Labels: appendLabels(ip, nil),
Value: strconv.FormatInt(availabilityValue, 10),
})
metrics = append(metrics, createMetrics(ip, mPath, nil, now, availabilityValue))
}
}
skipHAAvailability := ip.SkippedMetrics[pmHAAvailabilityPath]
skipHAReplication := ip.SkippedMetrics[pmHAReplicationPath]
if !skipHAAvailability && !skipHAReplication {
haReplicationValue, err := refreshHAReplicationConfig(ctx, ip)
if err != nil {
return nil, err
}
_, sapControlResult, err = sapcontrol.ExecProcessList(ctx, e, p)
if err != nil {
log.CtxLogger(ctx).Debugw("Error executing GetProcessList SAPControl command, failed to get exitStatus", log.Error(err))
return nil, err
}
log.CtxLogger(ctx).Debugw("HA availability for sapcontrol", "haReplicationValue", haReplicationValue, "sapControlResult", sapControlResult, "sapinstance", ip.SAPInstance)
haAvailabilityValue := haAvailabilityValue(ip, int64(sapControlResult), haReplicationValue)
extraLabels := map[string]string{
"ha_members": strings.Join(ip.SAPInstance.GetHanaHaMembers(), ","),
}
if ip.ReliabilityMetric {
if haAvailabilityValue == 0 {
usagemetrics.Action(usagemetrics.ReliabilityHANAHANotAvailable)
} else {
usagemetrics.Action(usagemetrics.ReliabilityHANAHAAvailable)
}
} else {
metricevents.AddEvent(ctx, metricevents.Parameters{
Path: metricURL + pmHAReplicationPath,
Message: "HA Replication",
Value: strconv.FormatInt(int64(haReplicationValue), 10),
Labels: appendLabels(ip, extraLabels),
})
metricevents.AddEvent(ctx, metricevents.Parameters{
Path: metricURL + pmHAAvailabilityPath,
Message: "HA Availability",
Value: strconv.FormatInt(int64(haAvailabilityValue), 10),
Labels: appendLabels(ip, nil),
})
log.CtxLogger(ctx).Debugw("Reporting HA metrics", "replication", haReplicationValue, "availability", haAvailabilityValue)
metrics = append(metrics, createMetrics(ip, pmHAReplicationPath, extraLabels, now, haReplicationValue))
metrics = append(metrics, createMetrics(ip, pmHAAvailabilityPath, nil, now, haAvailabilityValue))
}
}
log.CtxLogger(ctx).Debugw("Time taken to collect metrics in CollectReplicationHA()", "duration", time.Since(now.AsTime()))
return metrics, nil
}