Skip to content
This repository has been archived by the owner on Jun 24, 2022. It is now read-only.

Commit

Permalink
Converted debug metrics 200.0 and 200.3 to keeper metrics (#1509)
Browse files Browse the repository at this point in the history
* Converted debug metrics 200.0 and 200.3 to keeper metrics

* Added optional oncePerUTCDay paramater to publishDebugMetric

* Renamed UniqueDailyDebugMetricsHelper to UniqueDailyMetricsHelper
  • Loading branch information
craigzour authored Apr 21, 2021
1 parent 393f335 commit e681f0d
Show file tree
Hide file tree
Showing 6 changed files with 69 additions and 57 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,8 @@ package app.covidshield.module

import app.covidshield.extensions.launch
import app.covidshield.services.metrics.DebugMetricsHelper
import app.covidshield.services.metrics.MetricType
import app.covidshield.services.metrics.MetricsService
import app.covidshield.services.metrics.UniqueDailyDebugMetricsHelper
import com.facebook.react.bridge.Promise
import com.facebook.react.bridge.ReactApplicationContext
import com.facebook.react.bridge.ReactContextBaseJavaModule
Expand All @@ -26,11 +26,7 @@ class DebugMetricsModule(private val context: ReactApplicationContext) : ReactCo
// This is the current final step we have and it is published from the React layer
if (stepNumber == 8.0) {
DebugMetricsHelper.incrementSuccessfulDailyBackgroundChecks(context)

if (UniqueDailyDebugMetricsHelper.canPublishMetric("200.3", context)) {
MetricsService.publishDebugMetric(200.3, context)
UniqueDailyDebugMetricsHelper.markMetricAsPublished("200.3", context)
}
MetricsService.publishMetric(MetricType.ScheduledCheckSuccessfulToday, true, context)
}

promise.resolve(null)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import app.covidshield.extensions.log
import app.covidshield.services.metrics.MetricType
import app.covidshield.services.metrics.MetricsService
import okhttp3.*

Expand All @@ -16,7 +17,7 @@ class PackageReceiver () : BroadcastReceiver() {
log("onReceive", mapOf("action" to action))

if (action == "android.intent.action.MY_PACKAGE_REPLACED") {
MetricsService.publishPackageUpdatedMetric(context);
MetricsService.publishMetric(MetricType.PackageUpdated, false, context)
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@ import androidx.work.WorkerParameters
import app.covidshield.MainActivity
import app.covidshield.R
import app.covidshield.services.metrics.MetricsService
import app.covidshield.services.metrics.UniqueDailyDebugMetricsHelper
import com.facebook.react.ReactApplication
import com.facebook.react.modules.core.RCTNativeAppEventEmitter
import com.google.android.gms.nearby.Nearby
Expand All @@ -26,7 +25,6 @@ import kotlinx.coroutines.delay
import kotlinx.coroutines.tasks.await
import java.lang.Exception


class ExposureCheckNotificationWorker (private val context: Context, parameters: WorkerParameters) :
CoroutineWorker(context, parameters) {

Expand Down Expand Up @@ -77,10 +75,7 @@ class ExposureCheckNotificationWorker (private val context: Context, parameters:
val enIsEnabled = exposureNotificationClient.isEnabled.await()
val enStatus = exposureNotificationClient.status.await()
if (!enIsEnabled || enStatus.contains(ExposureNotificationStatus.INACTIVATED)) {
if (UniqueDailyDebugMetricsHelper.canPublishMetric("200.2", context)) {
MetricsService.publishDebugMetric(200.2, context)
UniqueDailyDebugMetricsHelper.markMetricAsPublished("200.2", context)
}
MetricsService.publishDebugMetric(200.2, context, oncePerUTCDay = true)
Log.d("background", "ExposureCheckNotificationWorker - ExposureNotification: Not enabled or not activated")
MetricsService.publishDebugMetric(7.1, context, "ExposureNotification: enIsEnabled = $enIsEnabled AND enStatus = ${enStatus.map { it.ordinal }}.")
return Result.success()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@ import androidx.work.CoroutineWorker
import androidx.work.WorkerParameters
import app.covidshield.extensions.log
import app.covidshield.models.ExposureStatus
import app.covidshield.services.metrics.MetricType
import app.covidshield.services.metrics.MetricsService
import app.covidshield.services.metrics.UniqueDailyDebugMetricsHelper
import app.covidshield.shared.DateFns
import app.covidshield.storage.StorageDirectory
import app.covidshield.storage.StorageService
Expand All @@ -17,7 +17,6 @@ import com.facebook.react.modules.core.RCTNativeAppEventEmitter
import com.google.android.gms.nearby.Nearby
import com.google.android.gms.nearby.exposurenotification.ExposureNotificationStatus
import com.google.gson.Gson
import com.reactlibrary.securekeystore.Storage
import kotlinx.coroutines.*
import kotlinx.coroutines.tasks.await

Expand All @@ -38,10 +37,7 @@ class ExposureCheckSchedulerWorker (val context: Context, parameters: WorkerPara
override suspend fun doWork(): Result {
Log.d("background", "ExposureCheckSchedulerWorker - doWork")

if (UniqueDailyDebugMetricsHelper.canPublishMetric("200.0", context)) {
MetricsService.publishDebugMetric(200.0, context)
UniqueDailyDebugMetricsHelper.markMetricAsPublished("200.0", context)
}
MetricsService.publishMetric(MetricType.ScheduledCheckStartedToday, true, context)

try {
val status = storageService.retrieve(StorageDirectory.ExposureStatus)
Expand All @@ -60,12 +56,7 @@ class ExposureCheckSchedulerWorker (val context: Context, parameters: WorkerPara
val enStatus = exposureNotificationClient.status.await()

if (!enIsEnabled || enStatus.contains(ExposureNotificationStatus.INACTIVATED)) {

if (UniqueDailyDebugMetricsHelper.canPublishMetric("200.1", context)) {
MetricsService.publishDebugMetric(200.1, context)
UniqueDailyDebugMetricsHelper.markMetricAsPublished("200.1", context)
}

MetricsService.publishDebugMetric(200.1, context, oncePerUTCDay = true)
Log.d("background", "ExposureCheckSchedulerWorker - ExposureNotification: Not enabled or not activated")
MetricsService.publishDebugMetric(2.1, context, "ExposureNotification: enIsEnabled = $enIsEnabled AND enStatus = ${enStatus.map { it.ordinal }}.")
return Result.success()
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,64 +3,93 @@ package app.covidshield.services.metrics
import android.content.Context
import android.content.pm.PackageInfo
import app.covidshield.BuildConfig
import app.covidshield.extensions.log
import okhttp3.*
import org.json.JSONArray
import org.json.JSONObject
import java.io.IOException
import java.util.concurrent.TimeUnit

enum class MetricType(val identifier: String) {
PackageUpdated("android-package-replaced"),
ScheduledCheckStartedToday("scheduled-check-started-today"),
ScheduledCheckSuccessfulToday("scheduled-check-successful-today")
}

object MetricsService {

private const val metricUrl = BuildConfig.METRICS_URL
private const val metricApiKey = BuildConfig.METRICS_API_KEY

private val okHttpClient by lazy { OkHttpClient() }

fun publishPackageUpdatedMetric(context: Context) {
val jsonObject = JSONObject();
fun publishMetric(type: MetricType, oncePerUTCDay: Boolean, context: Context) {

jsonObject.put("identifier", "android-package-replaced")
jsonObject.put("region", "None")
jsonObject.put("timestamp", TimeUnit.MILLISECONDS.toMillis(System.currentTimeMillis()))
fun pushMetric() {
val jsonObject = JSONObject();

jsonObject.put("identifier", type.identifier)
jsonObject.put("region", "None")
jsonObject.put("timestamp", System.currentTimeMillis())

val serializedGlobalMetricsPayload = serializeGlobalMetricsPayload(jsonObject, context)
this.push(serializedGlobalMetricsPayload)
val serializedGlobalMetricsPayload = serializeGlobalMetricsPayload(jsonObject, context)
this.push(serializedGlobalMetricsPayload)
}

if (oncePerUTCDay) {
if (UniqueDailyMetricsHelper.canPublishMetric(type.identifier, context)) {
pushMetric()
UniqueDailyMetricsHelper.markMetricAsPublished(type.identifier, context)
}
} else {
pushMetric()
}
}

@JvmStatic
@JvmOverloads
fun publishDebugMetric(stepNumber: Double, context: Context, message: String = "n/a") {
fun publishDebugMetric(stepNumber: Double, context: Context, message: String = "n/a", oncePerUTCDay: Boolean = false) {

if (!DebugMetricsHelper.canPublishDebugMetrics(context)) return

fun serializeMetricPayload(stepNumber: Double, lifecycleId: String, lifeCycleDailyCount: Number, successfulDailyBackgroundChecks: Number): JSONObject {
val jsonObject = JSONObject();
fun pushMetric() {

jsonObject.put("identifier", "ExposureNotificationCheck")
jsonObject.put("region", "None")
jsonObject.put("timestamp", TimeUnit.MILLISECONDS.toMillis(System.currentTimeMillis()))
jsonObject.put("step", stepNumber.toString())
jsonObject.put("lifecycleId", lifecycleId)
jsonObject.put("lifeCycleDailyCount", lifeCycleDailyCount.toString())
jsonObject.put("successfulDailyBackgroundChecks", successfulDailyBackgroundChecks.toString())
jsonObject.put("message", message)

if (BuildConfig.TEST_MODE == "true") {
val deviceIdentifier = DebugMetricsHelper.getDeviceIdentifier(context)
jsonObject.put("deviceIdentifier", deviceIdentifier)
fun serializeMetricPayload(stepNumber: Double, lifecycleId: String, lifeCycleDailyCount: Number, successfulDailyBackgroundChecks: Number): JSONObject {
val jsonObject = JSONObject();

jsonObject.put("identifier", "ExposureNotificationCheck")
jsonObject.put("region", "None")
jsonObject.put("timestamp", System.currentTimeMillis())
jsonObject.put("step", stepNumber.toString())
jsonObject.put("lifecycleId", lifecycleId)
jsonObject.put("lifeCycleDailyCount", lifeCycleDailyCount.toString())
jsonObject.put("successfulDailyBackgroundChecks", successfulDailyBackgroundChecks.toString())
jsonObject.put("message", message)

if (BuildConfig.TEST_MODE == "true") {
val deviceIdentifier = DebugMetricsHelper.getDeviceIdentifier(context)
jsonObject.put("deviceIdentifier", deviceIdentifier)
}

return jsonObject
}

return jsonObject
}
val lifecycleIdentifier = DebugMetricsHelper.getLifecycleIdentifier()
val lifecycleDailyCount = DebugMetricsHelper.getLifecycleDailyCount(context)
val successfulDailyBackgroundChecks = DebugMetricsHelper.getSuccessfulDailyBackgroundChecks(context)
val serializedMetricPayload = serializeMetricPayload(stepNumber, lifecycleIdentifier, lifecycleDailyCount, successfulDailyBackgroundChecks)
val serializedGlobalMetricsPayload = serializeGlobalMetricsPayload(serializedMetricPayload, context)

val lifecycleIdentifier = DebugMetricsHelper.getLifecycleIdentifier()
val lifecycleDailyCount = DebugMetricsHelper.getLifecycleDailyCount(context)
val successfulDailyBackgroundChecks = DebugMetricsHelper.getSuccessfulDailyBackgroundChecks(context)
val serializedMetricPayload = serializeMetricPayload(stepNumber, lifecycleIdentifier, lifecycleDailyCount, successfulDailyBackgroundChecks)
val serializedGlobalMetricsPayload = serializeGlobalMetricsPayload(serializedMetricPayload, context)
this.push(serializedGlobalMetricsPayload)
}

this.push(serializedGlobalMetricsPayload)
if (oncePerUTCDay) {
if (UniqueDailyMetricsHelper.canPublishMetric(stepNumber.toString(), context)) {
pushMetric()
UniqueDailyMetricsHelper.markMetricAsPublished(stepNumber.toString(), context)
}
} else {
pushMetric()
}
}

private fun serializeGlobalMetricsPayload(metricPayload: JSONObject, context: Context): JSONObject {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import android.content.Context
import app.covidshield.utils.DateUtils
import java.util.*

object UniqueDailyDebugMetricsHelper {
object UniqueDailyMetricsHelper {

private const val SharedPreferencesFileKey = "covid-shield-unique-daily-debug-metrics"

Expand Down

0 comments on commit e681f0d

Please sign in to comment.