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
}