Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat(browser): Add captureUserFeedback #7729

Merged
merged 10 commits into from Apr 5, 2023
Merged

Conversation

krystofwoldrich
Copy link
Member

@krystofwoldrich krystofwoldrich commented Apr 4, 2023

Before submitting a pull request, please take a look at our
Contributing guidelines and verify:

  • If you've added code that should be tested, please add tests.

  • Ensure your code lints and the test suite passes (yarn lint) & (yarn test).

  • closes: Add an API for User Feedback #6252

Next

  • Add integration test
  • Make user feedback tree shakable

@github-actions
Copy link
Contributor

github-actions bot commented Apr 4, 2023

size-limit report 📦

Path Size
@sentry/browser - ES5 CDN Bundle (gzipped + minified) 20.89 KB (+0.8% 🔺)
@sentry/browser - ES5 CDN Bundle (minified) 65.29 KB (+0.84% 🔺)
@sentry/browser - ES6 CDN Bundle (gzipped + minified) 19.44 KB (+0.83% 🔺)
@sentry/browser - ES6 CDN Bundle (minified) 57.75 KB (+0.91% 🔺)
@sentry/browser - Webpack (gzipped + minified) 21.06 KB (+1.07% 🔺)
@sentry/browser - Webpack (minified) 68.73 KB (+0.79% 🔺)
@sentry/react - Webpack (gzipped + minified) 21.09 KB (+1.06% 🔺)
@sentry/nextjs Client - Webpack (gzipped + minified) 48.87 KB (+0.38% 🔺)
@sentry/browser + @sentry/tracing - ES5 CDN Bundle (gzipped + minified) 28.45 KB (+0.51% 🔺)
@sentry/browser + @sentry/tracing - ES6 CDN Bundle (gzipped + minified) 26.68 KB (+0.56% 🔺)
@sentry/replay ES6 CDN Bundle (gzipped + minified) 44.88 KB (+0.01% 🔺)
@sentry/replay - Webpack (gzipped + minified) 38.86 KB (0%)
@sentry/browser + @sentry/tracing + @sentry/replay - ES6 CDN Bundle (gzipped + minified) 63.76 KB (+0.29% 🔺)
@sentry/browser + @sentry/replay - ES6 CDN Bundle (gzipped + minified) 56.8 KB (+0.32% 🔺)

tunnel: client.getOptions().tunnel,
});

void transport.send(envelope);
Copy link
Member

@AbhiPrasad AbhiPrasad Apr 5, 2023

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's times like this I wish client.sendEnvelope was exposed - @lforst do you think we should just expose it?

m: We can only call transport.send if client.getOptions().enabled !== false

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

m: We can only call transport.send if client.getOptions().enabled !== false

I have a feeling this should be checked in a more central location. Doesn't have to be this PR.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's times like this I wish client.sendEnvelope was exposed - @lforst do you think we should just expose it?

Probably? It seems safer that this whole chain of grabbing stuff off the hub that may or may not be there. But honestly sendEnvelope seems a bit too low-level to just expose it on a pretty public place.

I vote we take the bundle size hit and go ahead and implement user feedback like we implemented sessions, errors, and transactions just to stay consistent - meaning we put it as a captureUserFeedback() method on the (browser-)client.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sounds good to me @krystofwoldrich - sorry for making you revert your work, but let's just add the methods to the browser client.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I don't mind either, but the stand-alone function is a bit easier for reuse in other JS SDKs,

if we implement it on the Browser client we have to export the user feedback envelope creator for other JS-based SDKs,

if we would implement it as a standalone function other JS SDKs can use the method right away.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Both electron and react native wrap browser - so it's only the node SDKs that won't have access to this, and I think that is fine.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Okay, that's fair not that many SDKs, just a note RN doesn't wrap Browser.

packages/browser/src/userfeedback.ts Outdated Show resolved Hide resolved
packages/browser/src/userfeedback.ts Outdated Show resolved Hide resolved
tunnel: client.getOptions().tunnel,
});

void transport.send(envelope);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

m: We can only call transport.send if client.getOptions().enabled !== false

I have a feeling this should be checked in a more central location. Doesn't have to be this PR.

tunnel: client.getOptions().tunnel,
});

void transport.send(envelope);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

it's times like this I wish client.sendEnvelope was exposed - @lforst do you think we should just expose it?

Probably? It seems safer that this whole chain of grabbing stuff off the hub that may or may not be there. But honestly sendEnvelope seems a bit too low-level to just expose it on a pretty public place.

I vote we take the bundle size hit and go ahead and implement user feedback like we implemented sessions, errors, and transactions just to stay consistent - meaning we put it as a captureUserFeedback() method on the (browser-)client.

@Lms24 Lms24 merged commit c90a60f into develop Apr 5, 2023
55 checks passed
@Lms24 Lms24 deleted the kw-add-user-feedback-api branch April 5, 2023 12:44
@fliespl
Copy link

fliespl commented Sep 27, 2023

How about adding envelope promises here and returning it?

Without it it's not possible to handle api error (at least to my knowledge).

@lforst
Copy link
Member

lforst commented Sep 28, 2023

@fliespl Would you mind elaborating?

@fliespl
Copy link

fliespl commented Sep 28, 2023

Currently if I want to build custom user feedback and send request using:

        const userFeedback = {
            event_id: eventId,
            name: data.get('name'),
            email: data.get('email'),
            comments: data.get('comments')
        };

        Sentry.captureUserFeedback(userFeedback);

there is no way to find out if it was successfully sent or not.

I was hoping for this function to reurn fetch/XHR promise that allows to do specific operation depending on success/failure.

@lforst
Copy link
Member

lforst commented Sep 29, 2023

@fliespl There are technical reasons for us not to expose whether an event (which user feedback is) was successfully sent or not. The SDK follows a fire-and-forget policy for all telemetry. The storing of events happens asynchronously and could be slow. The ingestion endpoint itself doesn't know whether a request was successfully sent so it will always return a success response with the exception of rate limiting.

We will likely not change anything about this.

@fliespl
Copy link

fliespl commented Sep 29, 2023

@lforst understood. I was hoping I could match: showReportDialog which shows error in case feedback is not sent, but that's because it operates differently I guess.

theCapypara added a commit to theCapypara/sentry-python that referenced this pull request Oct 13, 2023
This adds an API to the Sentry Python SDK that captures user feedback
via envelope.

This is implemented very similiarly to how it is done for the
JavaScript SDK,
see getsentry/sentry-javascript#7729.

Fixes getsentryGH-1064
theCapypara added a commit to theCapypara/sentry-python that referenced this pull request Oct 30, 2023
This adds an API to the Sentry Python SDK that captures user feedback
via envelope.

This is implemented very similiarly to how it is done for the
JavaScript SDK,
see getsentry/sentry-javascript#7729.

Fixes getsentryGH-1064
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Add an API for User Feedback
5 participants