func ComputeIjMetrics()

in pkg/analyzer/metrics.go [156:222]


func ComputeIjMetrics(nonMetricFieldCount int, report *model.Report, result *[]any, logger *slog.Logger) error {
	for _, info := range IjMetricDescriptors {
		switch info.maxValue {
		case 65535:
			*result = append(*result, uint16(0))
		case 4294967295:
			*result = append(*result, uint32(0))
		case 2147483647:
			*result = append(*result, int32(-1))
		default:
			*result = append(*result, -1)
		}
	}

	(*result)[nonMetricFieldCount+metricNameToDescriptor["startUpCompleted"].index] = int32(report.TotalDuration)

	for _, activity := range report.Activities {
		err := setMetric(nonMetricFieldCount, activity, report, result)
		if err != nil {
			return err
		}
	}

	for _, activity := range report.PrepareAppInitActivities {
		switch activity.Name {
		case "plugin descriptors loading":
			(*result)[nonMetricFieldCount+metricNameToDescriptor["plugin descriptor loading"].index] = uint16(activity.Duration)
		default:
			err := setMetric(nonMetricFieldCount, activity, report, result)
			if err != nil {
				return err
			}
		}
	}

	for _, activity := range report.TraceEvents {
		if activity.Phase == "i" && (activity.Name == "splash" || activity.Name == "splash shown") {
			(*result)[nonMetricFieldCount+metricNameToDescriptor["splash initialization"].index] = int32(activity.Timestamp / 1000)
		}
	}

	var notFoundMetrics []string
	for _, metric := range IjMetricDescriptors {
		if (*result)[nonMetricFieldCount+metric.index] != -1 {
			continue
		}

		if metric.isRequired {
			if metric.Name != "bootstrap_d" {
				logger.Error("metric is required, but not found, report will be skipped", "metric", metric.Name)
				return nil
			}
		}

		// undefined
		(*result)[nonMetricFieldCount+metric.index] = 0
		if metric.sinceVersion != "" && version.Compare(report.Version, metric.sinceVersion, ">=") {
			notFoundMetrics = append(notFoundMetrics, metric.Name)
		}
	}

	if len(notFoundMetrics) > 0 {
		logger.Info("metrics not found", "name", notFoundMetrics)
	}

	return nil
}