getsentry / sentry-capacitor

The official Sentry SDK for Capacitor

Home Page:https://sentry.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Various errors in logcat with version 0.12.3

mlostekk opened this issue · comments

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.

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)

Hi and thanks for opening this issue!

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

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)

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)

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.

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

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.

@Fwang36 Is there any updates to this issue?

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

No idea, we have moved away from sentry capacitor.

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?

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

Hey 👋 apologies everyone for the frustration, I've just rolled getsentry/sentry-java#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