func collectHANAAvailabilityMetrics()

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
}