Skip to content

Commit f5dc91b

Browse files
authored
feat: support iOS metrics (#1685)
- add support for computing ios metrics - do not show anr free sessions when it's null - do not show perceived anr free sessions when it's null fixes #1636 --------- Signed-off-by: detj <[email protected]>
1 parent b8bbbd7 commit f5dc91b

File tree

3 files changed

+1373
-1325
lines changed

3 files changed

+1373
-1325
lines changed

backend/api/measure/app.go

Lines changed: 95 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -700,8 +700,12 @@ func (a App) GetIssueFreeMetrics(
700700
) {
701701
crashFree = &metrics.CrashFreeSession{}
702702
perceivedCrashFree = &metrics.PerceivedCrashFreeSession{}
703-
anrFree = &metrics.ANRFreeSession{}
704-
perceivedANRFree = &metrics.PerceivedANRFreeSession{}
703+
704+
switch a.Platform {
705+
case platform.Android:
706+
anrFree = &metrics.ANRFreeSession{}
707+
perceivedANRFree = &metrics.PerceivedANRFreeSession{}
708+
}
705709

706710
selectedVersions, err := af.VersionPairs()
707711
if err != nil {
@@ -713,12 +717,19 @@ func (a App) GetIssueFreeMetrics(
713717
Select("uniqMergeIf(unique_sessions, app_version not in (?)) as unselected_sessions", selectedVersions.Parameterize()).
714718
Select("uniqMergeIf(crash_sessions, app_version in (?)) as selected_crash_sessions", selectedVersions.Parameterize()).
715719
Select("uniqMergeIf(crash_sessions, app_version not in (?)) as unselected_crash_sessions", selectedVersions.Parameterize()).
716-
Select("uniqMergeIf(anr_sessions, app_version in (?)) as selected_anr_sessions", selectedVersions.Parameterize()).
717-
Select("uniqMergeIf(anr_sessions, app_version not in (?)) as unselected_anr_sessions", selectedVersions.Parameterize()).
718720
Select("uniqMergeIf(perceived_crash_sessions, app_version in (?)) as selected_perceived_crash_sessions", selectedVersions.Parameterize()).
719-
Select("uniqMergeIf(perceived_crash_sessions, app_version not in (?)) as unselected_perceived_crash_sessions", selectedVersions.Parameterize()).
720-
Select("uniqMergeIf(perceived_anr_sessions, app_version in (?)) as selected_perceived_anr_sessions", selectedVersions.Parameterize()).
721-
Select("uniqMergeIf(perceived_anr_sessions, app_version not in (?)) as unselected_perceived_anr_sessions", selectedVersions.Parameterize()).
721+
Select("uniqMergeIf(perceived_crash_sessions, app_version not in (?)) as unselected_perceived_crash_sessions", selectedVersions.Parameterize())
722+
723+
switch a.Platform {
724+
case platform.Android:
725+
stmt.
726+
Select("uniqMergeIf(anr_sessions, app_version in (?)) as selected_anr_sessions", selectedVersions.Parameterize()).
727+
Select("uniqMergeIf(anr_sessions, app_version not in (?)) as unselected_anr_sessions", selectedVersions.Parameterize()).
728+
Select("uniqMergeIf(perceived_anr_sessions, app_version in (?)) as selected_perceived_anr_sessions", selectedVersions.Parameterize()).
729+
Select("uniqMergeIf(perceived_anr_sessions, app_version not in (?)) as unselected_perceived_anr_sessions", selectedVersions.Parameterize())
730+
}
731+
732+
stmt.
722733
Where("app_id = toUUID(?)", af.AppID).
723734
Where("timestamp >= ? and timestamp <= ?", af.From, af.To)
724735

@@ -727,52 +738,71 @@ func (a App) GetIssueFreeMetrics(
727738
var (
728739
selected, unselected uint64
729740
crashSelected, crashUnselected uint64
730-
anrSelected, anrUnselected uint64
731741
perceivedCrashSelected, perceivedCrashUnselected uint64
742+
anrSelected, anrUnselected uint64
732743
perceivedANRSelected, perceivedANRUnselected uint64
733744
crashFreeUnselected float64
734745
perceivedCrashFreeUnselected float64
735746
anrFreeUnselected float64
736747
perceivedANRFreeUnselected float64
737748
)
738749

739-
if err = server.Server.ChPool.QueryRow(ctx, stmt.String(), stmt.Args()...).Scan(
750+
dest := []any{
740751
&selected,
741752
&unselected,
742753
&crashSelected,
743754
&crashUnselected,
744-
&anrSelected,
745-
&anrUnselected,
746755
&perceivedCrashSelected,
747756
&perceivedCrashUnselected,
748-
&perceivedANRSelected,
749-
&perceivedANRUnselected,
750-
); err != nil {
757+
}
758+
759+
switch a.Platform {
760+
case platform.Android:
761+
dest = append(dest, &anrSelected, &anrUnselected, &perceivedANRSelected, &perceivedANRUnselected)
762+
}
763+
764+
if err = server.Server.ChPool.QueryRow(ctx, stmt.String(), stmt.Args()...).Scan(dest...); err != nil {
751765
return
752766
}
753767

754768
if selected == 0 {
755769
crashFree.CrashFreeSessions = math.NaN()
756-
anrFree.ANRFreeSessions = math.NaN()
757770
perceivedCrashFree.CrashFreeSessions = math.NaN()
758-
perceivedANRFree.ANRFreeSessions = math.NaN()
771+
772+
switch a.Platform {
773+
case platform.Android:
774+
anrFree.ANRFreeSessions = math.NaN()
775+
perceivedANRFree.ANRFreeSessions = math.NaN()
776+
}
759777
} else {
760778
crashFree.CrashFreeSessions = math.Round(1-float64(crashSelected/selected)) * 100
761-
anrFree.ANRFreeSessions = math.Round(1-float64(anrSelected/selected)) * 100
762779
perceivedCrashFree.CrashFreeSessions = math.Round(1-float64(perceivedCrashSelected/selected)) * 100
763-
perceivedANRFree.ANRFreeSessions = math.Round(1-float64(perceivedANRSelected/selected)) * 100
780+
781+
switch a.Platform {
782+
case platform.Android:
783+
anrFree.ANRFreeSessions = math.Round(1-float64(anrSelected/selected)) * 100
784+
perceivedANRFree.ANRFreeSessions = math.Round(1-float64(perceivedANRSelected/selected)) * 100
785+
}
764786
}
765787

766788
if unselected == 0 {
767789
crashFreeUnselected = math.NaN()
768790
perceivedCrashFreeUnselected = math.NaN()
769-
anrFreeUnselected = math.NaN()
770-
perceivedANRFreeUnselected = math.NaN()
791+
792+
switch a.Platform {
793+
case platform.Android:
794+
anrFreeUnselected = math.NaN()
795+
perceivedANRFreeUnselected = math.NaN()
796+
}
771797
} else {
772798
crashFreeUnselected = math.Round(1-float64(crashUnselected/unselected)) * 100
773799
perceivedCrashFreeUnselected = math.Round(1-float64(perceivedCrashUnselected/unselected)) * 100
774-
anrFreeUnselected = math.Round(1-float64(anrUnselected/unselected)) * 100
775-
perceivedANRFreeUnselected = math.Round(1-float64(perceivedANRUnselected/unselected)) * 100
800+
801+
switch a.Platform {
802+
case platform.Android:
803+
anrFreeUnselected = math.Round(1-float64(anrUnselected/unselected)) * 100
804+
perceivedANRFreeUnselected = math.Round(1-float64(perceivedANRUnselected/unselected)) * 100
805+
}
776806
}
777807

778808
// compute delta
@@ -791,18 +821,21 @@ func (a App) GetIssueFreeMetrics(
791821
perceivedCrashFree.Delta = 1
792822
}
793823

794-
if anrFreeUnselected != 0 {
795-
anrFree.Delta = math.Round(anrFree.ANRFreeSessions/anrFreeUnselected*100) / 100
796-
} else {
797-
anrFree.Delta = 1
798-
}
799-
800-
if perceivedANRFreeUnselected != 0 {
801-
perceivedANRFree.Delta = math.Round(perceivedANRFree.ANRFreeSessions/perceivedANRFreeUnselected*100) / 100
824+
switch a.Platform {
825+
case platform.Android:
826+
if anrFreeUnselected != 0 {
827+
anrFree.Delta = math.Round(anrFree.ANRFreeSessions/anrFreeUnselected*100) / 100
828+
} else {
829+
anrFree.Delta = 1
830+
}
802831

803-
} else {
804-
perceivedANRFree.Delta = 1
832+
if perceivedANRFreeUnselected != 0 {
833+
perceivedANRFree.Delta = math.Round(perceivedANRFree.ANRFreeSessions/perceivedANRFreeUnselected*100) / 100
834+
} else {
835+
perceivedANRFree.Delta = 1
836+
}
805837
}
838+
806839
} else {
807840
// because if there are no unselected
808841
// app versions, then:
@@ -816,19 +849,26 @@ func (a App) GetIssueFreeMetrics(
816849
perceivedCrashFree.Delta = 1
817850
}
818851

819-
if anrFree.ANRFreeSessions != 0 {
820-
anrFree.Delta = 1
821-
}
852+
switch a.Platform {
853+
case platform.Android:
854+
if anrFree.ANRFreeSessions != 0 {
855+
anrFree.Delta = 1
856+
}
822857

823-
if perceivedANRFree.ANRFreeSessions != 0 {
824-
perceivedANRFree.Delta = 1
858+
if perceivedANRFree.ANRFreeSessions != 0 {
859+
perceivedANRFree.Delta = 1
860+
}
825861
}
826862
}
827863

828864
crashFree.SetNaNs()
829865
perceivedCrashFree.SetNaNs()
830-
anrFree.SetNaNs()
831-
perceivedANRFree.SetNaNs()
866+
867+
switch a.Platform {
868+
case platform.Android:
869+
anrFree.SetNaNs()
870+
perceivedANRFree.SetNaNs()
871+
}
832872

833873
return
834874
}
@@ -2402,17 +2442,25 @@ func GetAppMetrics(c *gin.Context) {
24022442
ID: &id,
24032443
}
24042444

2405-
team, err := app.getTeam(ctx)
2406-
if err != nil {
2407-
msg := "failed to get team from app id"
2445+
if err := app.Populate(ctx); err != nil {
2446+
msg := `failed to fetch app details`
24082447
fmt.Println(msg, err)
2409-
c.JSON(http.StatusInternalServerError, gin.H{"error": msg})
2448+
status := http.StatusInternalServerError
2449+
2450+
if errors.Is(err, pgx.ErrNoRows) {
2451+
status = http.StatusNotFound
2452+
msg = fmt.Sprintf(`app with id %q does not exist`, app.ID)
2453+
}
2454+
2455+
c.JSON(status, gin.H{
2456+
"error": msg,
2457+
})
2458+
24102459
return
24112460
}
2412-
if team == nil {
2413-
msg := fmt.Sprintf("no team exists for app [%s]", app.ID)
2414-
c.JSON(http.StatusBadRequest, gin.H{"error": msg})
2415-
return
2461+
2462+
team := &Team{
2463+
ID: &app.TeamId,
24162464
}
24172465

24182466
userId := c.GetString("userId")

0 commit comments

Comments
 (0)