getsentry / sentry-capacitor

The official Sentry SDK for Capacitor
https://sentry.io
MIT License
116 stars 31 forks source link

Various errors in logcat with version 0.12.3 #450

Closed mlostekk closed 9 months ago

mlostekk commented 10 months ago

Environment

I am running version 0.12.3 with a big codebase that used sentry browser before, now its all mapped to sentry capacitor in order to run in a capacitor project and i see various errors

Such as:

Sentry                   D  Processing Envelope with 1 item(s)
Sentry                   D  Error when deserializing UTC timestamp format, it might be millis timestamp format.
                            java.lang.IllegalArgumentException: timestamp is not ISO format 1693490685.952
                                at io.sentry.DateUtils.getDateTime(DateUtils.java:44)
                                at io.sentry.JsonObjectReader.dateOrNull(JsonObjectReader.java:146)
                                at io.sentry.JsonObjectReader.nextDateOrNull(JsonObjectReader.java:138)
                                at io.sentry.SentryEvent$Deserializer.deserialize(SentryEvent.java:323)
                                at io.sentry.SentryEvent$Deserializer.deserialize(SentryEvent.java:307)
                                at io.sentry.JsonSerializer.deserialize(JsonSerializer.java:154)
                                at io.sentry.OutboxSender.processEnvelope(OutboxSender.java:134)
                                at io.sentry.OutboxSender.processFile(OutboxSender.java:74)
                                at io.sentry.OutboxSender.processEnvelopeFile(OutboxSender.java:112)
                                at io.sentry.android.core.EnvelopeFileObserver.onEvent(EnvelopeFileObserver.java:64)
                                at android.os.FileObserver$ObserverThread.onEvent(FileObserver.java:166)
                                at android.os.FileObserver$ObserverThread.observe(Native Method)
                                at android.os.FileObserver$ObserverThread.run(FileObserver.java:116)
Sentry                   E  Failed to deserialize object in list.
                            java.lang.IllegalStateException: Expected BEGIN_OBJECT but was END_ARRAY at line 1 column 3468 path $.breadcrumbs[0]
                                at io.sentry.vendor.gson.stream.JsonReader.beginObject(JsonReader.java:392)
                                at io.sentry.Breadcrumb$Deserializer.deserialize(Breadcrumb.java:596)
                                at io.sentry.Breadcrumb$Deserializer.deserialize(Breadcrumb.java:591)
                                at io.sentry.JsonObjectReader.nextList(JsonObjectReader.java:94)
                                at io.sentry.SentryBaseEvent$Deserializer.deserializeValue(SentryBaseEvent.java:440)
                                at io.sentry.SentryEvent$Deserializer.deserialize(SentryEvent.java:366)
                                at io.sentry.SentryEvent$Deserializer.deserialize(SentryEvent.java:307)
                                at io.sentry.JsonSerializer.deserialize(JsonSerializer.java:154)
                                at io.sentry.OutboxSender.processEnvelope(OutboxSender.java:134)
                                at io.sentry.OutboxSender.processFile(OutboxSender.java:74)
                                at io.sentry.OutboxSender.processEnvelopeFile(OutboxSender.java:112)
                                at io.sentry.android.core.EnvelopeFileObserver.onEvent(EnvelopeFileObserver.java:64)
                                at android.os.FileObserver$ObserverThread.onEvent(FileObserver.java:166)
                                at android.os.FileObserver$ObserverThread.observe(Native Method)
                                at android.os.FileObserver$ObserverThread.run(FileObserver.java:116)
Sentry                   E  Missing required field "op"
                            java.lang.IllegalStateException: Missing required field "op"
                                at io.sentry.SpanContext$Deserializer.deserialize(SpanContext.java:341)
                                at io.sentry.protocol.Contexts$Deserializer.deserialize(Contexts.java:170)
                                at io.sentry.SentryBaseEvent$Deserializer.deserializeValue(SentryBaseEvent.java:408)
                                at io.sentry.SentryEvent$Deserializer.deserialize(SentryEvent.java:366)
                                at io.sentry.SentryEvent$Deserializer.deserialize(SentryEvent.java:307)
                                at io.sentry.JsonSerializer.deserialize(JsonSerializer.java:154)
                                at io.sentry.OutboxSender.processEnvelope(OutboxSender.java:134)
                                at io.sentry.OutboxSender.processFile(OutboxSender.java:74)
                                at io.sentry.OutboxSender.processEnvelopeFile(OutboxSender.java:112)
                                at io.sentry.android.core.EnvelopeFileObserver.onEvent(EnvelopeFileObserver.java:64)
                                at android.os.FileObserver$ObserverThread.onEvent(FileObserver.java:166)
                                at android.os.FileObserver$ObserverThread.observe(Native Method)
                                at android.os.FileObserver$ObserverThread.run(FileObserver.java:116)
Sentry                   E  Error when deserializing
                            java.lang.IllegalStateException: Missing required field "op"
                                at io.sentry.SpanContext$Deserializer.deserialize(SpanContext.java:341)
                                at io.sentry.protocol.Contexts$Deserializer.deserialize(Contexts.java:170)
                                at io.sentry.SentryBaseEvent$Deserializer.deserializeValue(SentryBaseEvent.java:408)
                                at io.sentry.SentryEvent$Deserializer.deserialize(SentryEvent.java:366)
                                at io.sentry.SentryEvent$Deserializer.deserialize(SentryEvent.java:307)
                                at io.sentry.JsonSerializer.deserialize(JsonSerializer.java:154)
                                at io.sentry.OutboxSender.processEnvelope(OutboxSender.java:134)
                                at io.sentry.OutboxSender.processFile(OutboxSender.java:74)
                                at io.sentry.OutboxSender.processEnvelopeFile(OutboxSender.java:112)
                                at io.sentry.android.core.EnvelopeFileObserver.onEvent(EnvelopeFileObserver.java:64)
                                at android.os.FileObserver$ObserverThread.onEvent(FileObserver.java:166)
                                at android.os.FileObserver$ObserverThread.observe(Native Method)
                                at android.os.FileObserver$ObserverThread.run(FileObserver.java:116)
Sentry                   D  Item 1 of type Event returned null by the parser.
Sentry                   W  Envelope had a failed capture at item 1. No more items will be sent.

It its worth to note that the very same breadcrumbs, events and errors work just fine with

        "@sentry/browser": "^7.56.0"

Is the capacitor project well maintained? It seems to me that the envelopes produced by the sentry core are not compatible with the output parsing and sending of the capacitor project / native android project.

mlostekk commented 10 months ago

Furthermore i see loooots of

Sentry                   E  Failed to deserialize object in list.
                            java.lang.IllegalStateException: Expected BEGIN_OBJECT but was END_ARRAY at line 1 column 3468 path $.breadcrumbs[0]
                                at io.sentry.vendor.gson.stream.JsonReader.beginObject(JsonReader.java:392)
                                at io.sentry.Breadcrumb$Deserializer.deserialize(Breadcrumb.java:596)
                                at io.sentry.Breadcrumb$Deserializer.deserialize(Breadcrumb.java:591)
                                at io.sentry.JsonObjectReader.nextList(JsonObjectReader.java:94)
                                at io.sentry.SentryBaseEvent$Deserializer.deserializeValue(SentryBaseEvent.java:440)
                                at io.sentry.SentryEvent$Deserializer.deserialize(SentryEvent.java:366)
                                at io.sentry.SentryEvent$Deserializer.deserialize(SentryEvent.java:307)
                                at io.sentry.JsonSerializer.deserialize(JsonSerializer.java:154)
                                at io.sentry.OutboxSender.processEnvelope(OutboxSender.java:134)
                                at io.sentry.OutboxSender.processFile(OutboxSender.java:74)
                                at io.sentry.OutboxSender.processEnvelopeFile(OutboxSender.java:112)
                                at io.sentry.android.core.EnvelopeFileObserver.onEvent(EnvelopeFileObserver.java:64)
                                at android.os.FileObserver$ObserverThread.onEvent(FileObserver.java:166)
                                at android.os.FileObserver$ObserverThread.observe(Native Method)
                                at android.os.FileObserver$ObserverThread.run(FileObserver.java:116)
lucas-zimerman commented 10 months ago

Hi and thanks for opening this issue!

How are you adding those breadcrumbs? (for example, adding to the scope, or directly to the event)

mlostekk commented 10 months ago

We have the following project structure

root package.json (core game)

"dependencies": {
    "@babel/polyfill": "^7.4.0",
    "@pixi/filter-adjustment": "^2.7.0",
    "@sentry/types": "^7.56.0",
    "@sgorg/fps-tracking-tool": "^1.2.2",
    "@sgorg/game-backend-client": "^6.0.0",
    "@sgorg/x-promo-game-client": "^2.2.0",
    "@softgames/ad-flow": "^5.0.4",
    "@softgames/event-tracking": "^6.1.0",
    "@softgames/math-utils": "^2.1.0",
    "@softgames/re-save-manager": "^1.0.6",
    "@tweenjs/tween.js": "^17.3.0",
    "@types/lodash": "^4.14.185",
    "axios": "^1.3.4",
    "blueimp-md5": "^2.19.0",
    "buffer": "^6.0.3",
    "caniuse-lite": "^1.0.30001473",
    "csv-parse": "^4.16.3",
    "dat.gui": "^0.7.9",
    "dsbridge": "^3.1.4",
    "eventemitter3": "^3.1.0",
    "fontfaceobserver": "^2.1.0",
    "howler": "^2.2.0",
    "inversify": "^6.0.1",
    "lodash": "^4.17.21",
    "mobile-device-detect": "^0.4.3",
    "pako": "^1.0.10",
    "path-browserify": "^1.0.1",
    "pixi-dragonbones": "^5.7.0-1",
    "pixi-filters": "^2.7.1",
    "pixi-heaven": "^0.1.22",
    "pixi-multistyle-text": "^0.8.0",
    "pixi-particles": "^4.2.0",
    "pixi-scrollbox": "2.2.3",
    "pixi-spine": "^1.6.2",
    "pixi-viewport": "4.21.1",
    "pixi.js": "^4.8.4",
    "redux": "^4.0.1",
    "redux-actions": "^2.6.5",
    "redux-thunk": "^2.3.0",
    "reflect-metadata": "^0.1.13",
    "revolt-fx": "1.0.1",
    "rxjs": "^6.5.3",
    "sat": "^0.7.1",
    "seedrandom": "^3.0.1",
    "stats.js": "^0.17.0",
    "stream-browserify": "^3.0.0",
    "typescript-plugin-css-modules": "^3.4.0",
    "ua-parser-js": "^1.0.35",
    "url": "^0.11.0",
    "uuid": "^9.0.0",
    "xstate": "4.13.0"
  },
  "devDependencies": {
    "@babel/core": "^7.4.3",
    "@babel/plugin-syntax-dynamic-import": "^7.8.3",
    "@babel/preset-env": "^7.4.3",
    "@capacitor/cli": "^5.0.5",
    "@istanbuljs/nyc-config-typescript": "^0.1.3",
    "@sentry/webpack-plugin": "^2.7.0",
    "@slack/bolt": "^3.3.0",
    "@types/ajv": "^1.0.0",
    "@types/chai": "^4.1.7",
    "@types/chai-as-promised": "^7.1.0",
    "@types/dat.gui": "^0.7.6",
    "@types/facebook-instant-games": "^7.0.2",
    "@types/fontfaceobserver": "0.0.6",
    "@types/glob": "^7.1.1",
    "@types/howler": "^2.2.1",
    "@types/inversify": "^2.0.33",
    "@types/mocha": "^7.0.2",
    "@types/node": "^11.13.4",
    "@types/pako": "^1.0.1",
    "@types/pixi.js": "^4.8.9",
    "@types/redux-actions": "^2.6.0",
    "@types/redux-thunk": "^2.1.0",
    "@types/rx": "^4.1.1",
    "@types/sat": "0.0.30",
    "@types/seedrandom": "^2.4.28",
    "@types/stats.js": "^0.17.0",
    "@types/tween.js": "^17.2.0",
    "@types/webpack-env": "^1.16.0",
    "@types/yargs": "^15.0.8",
    "@types/yoga-layout": "^1.9.1",
    "@typescript-eslint/eslint-plugin": "^4.7.0",
    "@typescript-eslint/parser": "^4.7.0",
    "ajv": "^6.10.0",
    "audiosprite": "^0.7.2",
    "babel-loader": "^8.2.2",
    "bowser": "^2.10.0",
    "build-number-generator": "0.0.4",
    "canvas": "^2.6.1",
    "chai": "^4.2.0",
    "chai-as-promised": "^7.1.1",
    "chalk": "4.1.2",
    "changelog-verify": "^1.1.2",
    "clean-webpack-plugin": "^2.0.1",
    "clipboardy": "^3.0.0",
    "console-remote-client": "^2.1.17",
    "copy-webpack-plugin": "^11.0.0",
    "cross-spawn": "^7.0.3",
    "css-loader": "^6.8.1",
    "csv-writer": "^1.6.0",
    "directory-tree": "^2.2.5",
    "dot-properties": "^1.0.1",
    "dotenv": "^7.0.0",
    "dragonbones-tools": "^0.1.2",
    "eslint": "^7.13.0",
    "eslint-config-airbnb-typescript": "^12.0.0",
    "eslint-config-prettier": "^7.2.0",
    "eslint-plugin-import": "^2.22.1",
    "eslint-plugin-jsx-a11y": "^6.4.1",
    "eslint-plugin-react": "^7.21.5",
    "eslint-plugin-sonarjs": "^0.19.0",
    "eslint-webpack-plugin": "^3.2.0",
    "folder-hash": "^4.0.2",
    "fork-ts-checker-webpack-plugin": "^7.3.0",
    "glob": "^7.1.3",
    "googleapis": "^39.2.0",
    "html-loader": "^4.2.0",
    "html-webpack-plugin": "^5.5.0",
    "html-webpack-tags-plugin": "^3.0.2",
    "hull.js": "^0.2.11",
    "husky": "^3.0.9",
    "image-size": "^1.0.1",
    "imagemin": "^7.0.1",
    "imagemin-jpegtran": "^7.0.0",
    "imagemin-mozjpeg": "^10.0.0",
    "imagemin-pngquant": "^9.0.2",
    "imagemin-webp": "^8.0.0",
    "jsdom": "22.1.0",
    "jsdom-global": "3.0.2",
    "json-minimizer-webpack-plugin": "^4.0.0",
    "jsonlint": "^1.6.3",
    "markdown-loader": "^8.0.0",
    "mocha": "^8.1.1",
    "nyc": "^15.0.1",
    "open": "^8.0.4",
    "prettier": "^1.18.2",
    "pretty-quick": "^2.0.2",
    "prompts": "^2.4.0",
    "request": "^2.88.2",
    "source-map-support": "^0.5.12",
    "spritesmith": "^3.4.0",
    "style-loader": "^3.3.3",
    "terser-webpack-plugin": "^5.3.7",
    "texturepacker-command-line": "0.0.5",
    "ts-loader": "^7.0.5",
    "ts-node": "^8.10.2",
    "tsconfig-paths": "^3.9.0",
    "tsconfig-paths-webpack-plugin": "^4.0.1",
    "tslib": "^2.5.3",
    "tslint": "^6.1.3",
    "typesafe-actions": "^4.0.0",
    "typescript": "^5.1.3",
    "version-changelog": "^3.1.1",
    "webpack": "^5.76.2",
    "webpack-bundle-analyzer": "^4.4.1",
    "webpack-cli": "^5.0.1",
    "webpack-dashboard": "^3.2.0",
    "webpack-dev-server": "^4.13.1",
    "webpack-merge": "^5.8.0",
    "webpack-sentry-plugin": "^2.0.3",
    "webpack-shell-plugin-next": "^2.3.1",
    "yargs": "^16.0.4-candidate.0",
    "zip-webpack-plugin": "^4.0.1"
  },

root/platform/native package.json (capacitor application)

  "dependencies": {
    "@capacitor-firebase/analytics": "^5.0.1",
    "@capacitor-firebase/app": "^5.0.1",
    "@capacitor-firebase/crashlytics": "^5.0.1",
    "@capacitor-firebase/performance": "^5.0.1",
    "@capacitor/android": "^5.0.4",
    "@capacitor/app": "^5.0.6",
    "@capacitor/core": "^5.0.4",
    "@capacitor/device": "^5.0.6",
    "@capacitor/ios": "^5.0.5",
    "@sentry/capacitor": "0.12.3",
    "@sentry/tracing": "7.64.0",
    "@softgames/capacitor-ad-mob": "^0.4.0",
    "firebase": "^9.23.0"
  },
  "devDependencies": {
    "@capacitor/cli": "^5.0.4"
  }

We are not doing any native communcation with SentryCapacitor. The JS initialization looks like this

SentrySDKCapacitor.init({
            // @ts-ignore
            release: __VERSION__,
            dsn: '<<dns>>',
            // We recommend adjusting this value in production, or using tracesSampler for finer control
            tracesSampleRate: 1.0,
            environment: process.env.NODE_ENV,
            debug: true,
        });

furthermore the is nothing we explicitly call from SentryJS. I have removed all code that directly accesses sentry.

Then this error

            throw new Error('martin.sentry.test.5');

Lets 100% to this error log

2023-09-01 07:36:54.177 Sentry                  com...ire.tripeaks.home.story.debug  E  Failed to deserialize object in list.
                                                                                        java.lang.IllegalStateException: Expected BEGIN_OBJECT but was END_ARRAY at line 1 column 3439 path $.breadcrumbs[0]
                                                                                            at io.sentry.vendor.gson.stream.JsonReader.beginObject(JsonReader.java:392)
                                                                                            at io.sentry.Breadcrumb$Deserializer.deserialize(Breadcrumb.java:596)
                                                                                            at io.sentry.Breadcrumb$Deserializer.deserialize(Breadcrumb.java:591)
                                                                                            at io.sentry.JsonObjectReader.nextList(JsonObjectReader.java:94)
                                                                                            at io.sentry.SentryBaseEvent$Deserializer.deserializeValue(SentryBaseEvent.java:440)
                                                                                            at io.sentry.SentryEvent$Deserializer.deserialize(SentryEvent.java:366)
                                                                                            at io.sentry.SentryEvent$Deserializer.deserialize(SentryEvent.java:307)
                                                                                            at io.sentry.JsonSerializer.deserialize(JsonSerializer.java:154)
                                                                                            at io.sentry.OutboxSender.processEnvelope(OutboxSender.java:134)
                                                                                            at io.sentry.OutboxSender.processFile(OutboxSender.java:74)
                                                                                            at io.sentry.OutboxSender.processEnvelopeFile(OutboxSender.java:112)
                                                                                            at io.sentry.android.core.EnvelopeFileObserver.onEvent(EnvelopeFileObserver.java:64)
                                                                                            at android.os.FileObserver$ObserverThread.onEvent(FileObserver.java:166)
                                                                                            at android.os.FileObserver$ObserverThread.observe(Native Method)
                                                                                            at android.os.FileObserver$ObserverThread.run(FileObserver.java:116)
2023-09-01 07:36:54.178 Sentry                  com...ire.tripeaks.home.story.debug  E  Missing required field "op"
                                                                                        java.lang.IllegalStateException: Missing required field "op"
                                                                                            at io.sentry.SpanContext$Deserializer.deserialize(SpanContext.java:341)
                                                                                            at io.sentry.protocol.Contexts$Deserializer.deserialize(Contexts.java:170)
                                                                                            at io.sentry.SentryBaseEvent$Deserializer.deserializeValue(SentryBaseEvent.java:408)
                                                                                            at io.sentry.SentryEvent$Deserializer.deserialize(SentryEvent.java:366)
                                                                                            at io.sentry.SentryEvent$Deserializer.deserialize(SentryEvent.java:307)
                                                                                            at io.sentry.JsonSerializer.deserialize(JsonSerializer.java:154)
                                                                                            at io.sentry.OutboxSender.processEnvelope(OutboxSender.java:134)
                                                                                            at io.sentry.OutboxSender.processFile(OutboxSender.java:74)
                                                                                            at io.sentry.OutboxSender.processEnvelopeFile(OutboxSender.java:112)
                                                                                            at io.sentry.android.core.EnvelopeFileObserver.onEvent(EnvelopeFileObserver.java:64)
                                                                                            at android.os.FileObserver$ObserverThread.onEvent(FileObserver.java:166)
                                                                                            at android.os.FileObserver$ObserverThread.observe(Native Method)
                                                                                            at android.os.FileObserver$ObserverThread.run(FileObserver.java:116)
2023-09-01 07:36:54.178 Sentry                  com...ire.tripeaks.home.story.debug  E  Error when deserializing
                                                                                        java.lang.IllegalStateException: Missing required field "op"
                                                                                            at io.sentry.SpanContext$Deserializer.deserialize(SpanContext.java:341)
                                                                                            at io.sentry.protocol.Contexts$Deserializer.deserialize(Contexts.java:170)
                                                                                            at io.sentry.SentryBaseEvent$Deserializer.deserializeValue(SentryBaseEvent.java:408)
                                                                                            at io.sentry.SentryEvent$Deserializer.deserialize(SentryEvent.java:366)
                                                                                            at io.sentry.SentryEvent$Deserializer.deserialize(SentryEvent.java:307)
                                                                                            at io.sentry.JsonSerializer.deserialize(JsonSerializer.java:154)
                                                                                            at io.sentry.OutboxSender.processEnvelope(OutboxSender.java:134)
                                                                                            at io.sentry.OutboxSender.processFile(OutboxSender.java:74)
                                                                                            at io.sentry.OutboxSender.processEnvelopeFile(OutboxSender.java:112)
                                                                                            at io.sentry.android.core.EnvelopeFileObserver.onEvent(EnvelopeFileObserver.java:64)
                                                                                            at android.os.FileObserver$ObserverThread.onEvent(FileObserver.java:166)
                                                                                            at android.os.FileObserver$ObserverThread.observe(Native Method)
                                                                                            at android.os.FileObserver$ObserverThread.run(FileObserver.java:116)
mlostekk commented 10 months ago

Hey @lucas-zimerman I have added you to the github repo which generates the Missing required field "op" part of the error. (https://github.com/mlostekk/sentry-broken-example)

bourquep commented 10 months ago

I'm experiencing the exact same thing: errors are not reported to Sentry, and I see Expected BEGIN_OBJECT but was END_ARRAY and Missing required field "op" errors in the Sentry debug logs.

afilp commented 10 months ago

@mlostekk Your repo URL shows "page not found".

Fwang36 commented 10 months ago

hey @lucas-zimerman, @mlostekk has an open support ticket and added me as well to the repro repo. I saw the issue after running the app.

Then I made a very basic capacitor app just using their Getting Started guide, added Sentry, and see the error Missing required field "op" when running in Android. I did nothing to the app other than adding a button that throws an error along with the Sentry.init() with just the debug and dsn options.

I do not get errors when running in web or ios.

mlostekk commented 10 months ago

@Fwang36 Is there any updates to this issue?

bourquep commented 9 months ago

Anyone knows which is the latest previous version that does not have this bug?

mlostekk commented 9 months ago

No idea, we have moved away from sentry capacitor.

zarko-tg commented 9 months ago

No idea, we have moved away from sentry capacitor.

@mlostekk As things don't look good for this plugin... may I ask which are the good alternatives?

mlostekk commented 9 months ago

Well, we have made a split for now. We use sentry browser for the TS part and firebase only for the native part. And as we start to get full stack traces in firebase also for the JS context, we will very likely completely move away from sentry soon if this dont start to move

romtsn commented 9 months ago

Hey 👋 apologies everyone for the frustration, I've just rolled https://github.com/getsentry/sentry-java/pull/2968 to address the issues, namely, prevent the warnings from being printed when not needed and also fix the missing op field error, which should now correctly process events and send them to sentry. Thanks for reporting! We'll try to ship it this or next week