From a0c6efafd25d9d697aeea055f6b491f6560918d8 Mon Sep 17 00:00:00 2001 From: Pierre Dommerc Date: Wed, 28 Jun 2023 12:20:29 +0200 Subject: [PATCH] feat(nc): monitoring update (#3609) --- nym-connect/desktop/src/pages/menu/index.tsx | 3 +- .../menu/settings/MonitoringSettings.tsx | 4 --- .../desktop/src/pages/menu/settings/index.tsx | 1 - nym-connect/desktop/src/routes/index.tsx | 2 +- nym-connect/desktop/src/sentry.ts | 2 ++ nym-connect/native/android/app/build.gradle | 2 +- .../src/main/java/net/nymtech/nyms5/App.kt | 29 +++++++++++++++++++ .../java/net/nymtech/nyms5/MainActivity.kt | 7 ++--- .../main/java/net/nymtech/nyms5/NymProxy.kt | 4 +++ .../java/net/nymtech/nyms5/ProxyWorker.kt | 4 +++ .../app/src/main/res/values/strings.xml | 4 +-- 11 files changed, 47 insertions(+), 15 deletions(-) diff --git a/nym-connect/desktop/src/pages/menu/index.tsx b/nym-connect/desktop/src/pages/menu/index.tsx index 67b3dc0131..da4f2be73d 100644 --- a/nym-connect/desktop/src/pages/menu/index.tsx +++ b/nym-connect/desktop/src/pages/menu/index.tsx @@ -1,5 +1,5 @@ import React from 'react'; -import { Apps, HelpOutline, Settings } from '@mui/icons-material'; +import { Apps, HelpOutline, Settings, BugReport } from '@mui/icons-material'; import { Stack, Link, List, ListItem, ListItemButton, ListItemIcon, ListItemText } from '@mui/material'; import { Link as RouterLink } from 'react-router-dom'; import { AppVersion } from 'src/components/AppVersion'; @@ -7,6 +7,7 @@ import { AppVersion } from 'src/components/AppVersion'; const menuSchema = [ { title: 'Supported apps', icon: Apps, path: 'apps' }, { title: 'How to connect guide', icon: HelpOutline, path: 'guide' }, + { title: 'Please help us improve the app', icon: BugReport, path: 'monitoring' }, { title: 'Settings', icon: Settings, path: 'settings' }, ]; diff --git a/nym-connect/desktop/src/pages/menu/settings/MonitoringSettings.tsx b/nym-connect/desktop/src/pages/menu/settings/MonitoringSettings.tsx index 0bc23a55bd..92e15a155d 100644 --- a/nym-connect/desktop/src/pages/menu/settings/MonitoringSettings.tsx +++ b/nym-connect/desktop/src/pages/menu/settings/MonitoringSettings.tsx @@ -34,10 +34,6 @@ export const MonitoringSettings = () => { occur or if the app crashes, it will automatically send a report. Also it tracks various performance metrics. We use sentry.io service to handle this. - - Note: A report can include your external IP, this can be useful to catch issues related to IP location. - All recorded data is used by Nym developers and for app development purposes only. - diff --git a/nym-connect/desktop/src/pages/menu/settings/index.tsx b/nym-connect/desktop/src/pages/menu/settings/index.tsx index c6dbfc5998..bc58b69f1b 100644 --- a/nym-connect/desktop/src/pages/menu/settings/index.tsx +++ b/nym-connect/desktop/src/pages/menu/settings/index.tsx @@ -7,7 +7,6 @@ import { toggleLogViewer } from 'src/utils'; const menuSchema = [ { title: 'Select your gateway', path: 'gateway' }, { title: 'Select a service provider', path: 'service-provider' }, - { title: 'Help improve the app', path: 'monitoring' }, ]; export const SettingsMenu = () => ( diff --git a/nym-connect/desktop/src/routes/index.tsx b/nym-connect/desktop/src/routes/index.tsx index e490fec83a..8af5a703e3 100644 --- a/nym-connect/desktop/src/routes/index.tsx +++ b/nym-connect/desktop/src/routes/index.tsx @@ -25,11 +25,11 @@ export const AppRoutes = () => { } /> } /> } /> + } /> } /> } /> } /> - } /> diff --git a/nym-connect/desktop/src/sentry.ts b/nym-connect/desktop/src/sentry.ts index 835131c2ec..13f7529c30 100644 --- a/nym-connect/desktop/src/sentry.ts +++ b/nym-connect/desktop/src/sentry.ts @@ -43,6 +43,8 @@ async function initSentry() { getVersion().then((version) => { Sentry.setTag('app_version', version); }); + + Sentry.setUser({ id: 'nym', ip_address: undefined }); } export default initSentry; diff --git a/nym-connect/native/android/app/build.gradle b/nym-connect/native/android/app/build.gradle index 23d75605c4..5cd2701c53 100644 --- a/nym-connect/native/android/app/build.gradle +++ b/nym-connect/native/android/app/build.gradle @@ -99,7 +99,6 @@ android { } dependencies { - implementation 'androidx.core:core-ktx:1.10.1' implementation 'androidx.lifecycle:lifecycle-runtime-ktx:2.6.1' implementation 'androidx.activity:activity-compose:1.7.2' @@ -124,4 +123,5 @@ dependencies { debugImplementation 'androidx.compose.ui:ui-tooling' debugImplementation 'androidx.compose.ui:ui-test-manifest' implementation 'com.github.kittinunf.fuel:fuel:3.0.0-alpha1' + implementation 'io.sentry:sentry-android:6.24.0' } diff --git a/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/App.kt b/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/App.kt index 8a59ada991..105270644c 100644 --- a/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/App.kt +++ b/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/App.kt @@ -2,6 +2,8 @@ package net.nymtech.nyms5 import android.app.Application import android.content.Context +import android.content.pm.PackageManager +import android.os.Build import android.util.Log import androidx.datastore.core.DataStore import androidx.datastore.preferences.core.Preferences @@ -9,11 +11,15 @@ import androidx.datastore.preferences.core.booleanPreferencesKey import androidx.datastore.preferences.preferencesDataStore import androidx.work.Configuration import androidx.work.DelegatingWorkerFactory +import io.sentry.Scope +import io.sentry.Sentry import io.sentry.android.core.SentryAndroid +import io.sentry.protocol.User import kotlinx.coroutines.flow.first import kotlinx.coroutines.flow.map import kotlinx.coroutines.runBlocking + val Context.dataStore: DataStore by preferencesDataStore(name = "settings") val monitoringKey = booleanPreferencesKey("monitoring") @@ -40,11 +46,34 @@ class App : Application(), Configuration.Provider { options.dsn = "https://6872f5818bc147ef9c0fce114fcaac8a@o967446.ingest.sentry.io/4505306218102784" options.enableAllAutoBreadcrumbs(true) + options.isEnableUserInteractionTracing = true + options.isEnableUserInteractionBreadcrumbs = true // TODO should be adjusted in production env + options.sampleRate = 1.0 options.tracesSampleRate = 1.0 options.profilesSampleRate = 1.0 } + + Sentry.configureScope { scope: Scope -> + val packageManager = applicationContext.packageManager + val packageInfo = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + packageManager.getPackageInfo( + packageName, + PackageManager.PackageInfoFlags.of(0) + ) + } else { + packageManager.getPackageInfo(packageName, 0) + } + scope.setTag("app_version", packageInfo.versionName) + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) { + scope.setTag("app_version_code", packageInfo.longVersionCode.toString()) + } + } + + val user = User() + user.id = "nym" + Sentry.setUser(user) } } } diff --git a/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/MainActivity.kt b/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/MainActivity.kt index 6e5a472be5..3530d6db81 100644 --- a/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/MainActivity.kt +++ b/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/MainActivity.kt @@ -50,6 +50,7 @@ import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.ui.Alignment import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalClipboardManager +import androidx.compose.ui.platform.testTag import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource import androidx.compose.ui.text.AnnotatedString @@ -249,7 +250,7 @@ fun S5ClientSwitch( Spacer(modifier = modifier.width(14.dp)) Switch(checked = connected, enabled = !loading, onCheckedChange = { onSwitch(!connected) - }) + }, modifier = Modifier.testTag("switch_connect")) } if (connected && !loading) { Column(modifier = modifier.padding(16.dp)) { @@ -332,12 +333,10 @@ fun Monitoring( tint = Color.Yellow ) Spacer(modifier = modifier.width(16.dp)) - Text(stringResource(R.string.monitoring_desc_3), color = Color.Yellow) + Text(stringResource(R.string.monitoring_desc_2), color = Color.Yellow) } Spacer(modifier = modifier.height(18.dp)) Text(stringResource(R.string.monitoring_desc_1)) - Spacer(modifier = modifier.height(18.dp)) - Text(stringResource(R.string.monitoring_desc_2)) } } diff --git a/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/NymProxy.kt b/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/NymProxy.kt index 57d57454cf..8ff13e7c45 100644 --- a/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/NymProxy.kt +++ b/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/NymProxy.kt @@ -1,6 +1,7 @@ package net.nymtech.nyms5 import android.util.Log +import io.sentry.Sentry const val nymNativeLib = "nym_socks5_listener" @@ -27,6 +28,7 @@ class NymProxy { startClient(serviceProvider, onStartCbObj, onStopCbObj) } catch (e: Throwable) { Log.e(tag, "$nymNativeLib:startClient internal error: $e") + Sentry.captureException(e) } } @@ -36,6 +38,7 @@ class NymProxy { stopClient() } catch (e: Throwable) { Log.e(tag, "$nymNativeLib:stopClient internal error: $e") + Sentry.captureException(e) } } @@ -50,6 +53,7 @@ class NymProxy { } } catch (e: Throwable) { Log.e(tag, "$nymNativeLib:getClientState internal error: $e") + Sentry.captureException(e) } return State.UNINITIALIZED } diff --git a/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/ProxyWorker.kt b/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/ProxyWorker.kt index 779fbf9101..c2f71c3118 100644 --- a/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/ProxyWorker.kt +++ b/nym-connect/native/android/app/src/main/java/net/nymtech/nyms5/ProxyWorker.kt @@ -17,6 +17,7 @@ import androidx.work.WorkerParameters import androidx.work.workDataOf import fuel.Fuel import fuel.get +import io.sentry.Sentry import kotlinx.serialization.Serializable import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json @@ -100,6 +101,7 @@ class ProxyWorker( tag, "failed to make the work run in the context of a foreground service" ) + Sentry.captureException(e) } return try { @@ -127,6 +129,7 @@ class ProxyWorker( tag, "an error occurred while fetching the service providers list: $e" ) + Sentry.captureException(e) Log.w(tag, "using a default service provider $defaultSp") } @@ -139,6 +142,7 @@ class ProxyWorker( Result.success() } catch (e: Throwable) { Log.e(tag, "error: ${e.message}") + Sentry.captureException(e) Result.failure() } } diff --git a/nym-connect/native/android/app/src/main/res/values/strings.xml b/nym-connect/native/android/app/src/main/res/values/strings.xml index ee21a78dc9..ff0cb1857d 100644 --- a/nym-connect/native/android/app/src/main/res/values/strings.xml +++ b/nym-connect/native/android/app/src/main/res/values/strings.xml @@ -12,7 +12,5 @@ DpB3cHAchJiNBQi5FrZx2csXb1mrHkpYh9Wzf8Rjsuko.ANNWrvHqMYuertHGHUrZdBntQhpzfbWekB39qez9U2Vx@2BuMSfMW3zpeAjKXyKLhmY4QW1DXurrtSPEJ6CjX3SEh Connected to the mixnet Help Nym developers to fix errors, crashes and improve the application by enabling this option. If errors occur or if the app crashes, it will automatically send a report. Also it tracks various performance metrics. We use sentry.io service to handle this. - Note: A report can include your external IP, this can be useful to catch issues related to IP location. - All recorded data is used by Nym developers and for app development purposes only. - You must restart the application for the change to take effect. + You must restart the application for the change to take effect. \ No newline at end of file