getsentry / sentry-javascript

Official Sentry SDKs for JavaScript
https://sentry.io
MIT License
8.02k stars 1.59k forks source link

[Event Lifecycle Hooks] Serialized Events Cause DX Issues #13285

Open souredoutlook opened 3 months ago

souredoutlook commented 3 months ago

Problem Statement

Any time a developer wants to mutate their event data before it's sent to Sentry they need to use a beforeX hook.

These hooks provide serialized events to work with which is convenient for evaluating an event's key's values but inconvenient for mutating the event without access to any of the event methods.

Example:

I want to upcycle a spans duration into a custom metric:

  beforeSendSpan: (span)=>{
    if (span.op.includes("ui.react")) {

      Sentry.metrics.distribution(`${span.op}.duration`, span.timestamp - span.start_timestamp, {
        tags: { componentName: span.description },
        unit: "millisecond",
      });

      console.log("Adding metric ",`${span.op}.duration`)
    }

    return span
  }

This metric is not connected to the sampled span and this API will be going away.

I can't use span.setAttribute here because the span is already serialized.

Solution Brainstorm

Provide lifecycle hooks that can hook into events prior to serialization so that event methods can be used on them.

andreiborza commented 3 months ago

Hey, thanks for filing this. I've added it to our backlog.

Users can also set attributes on span.data in our beforeSendSpan hook, e.g. span.data?.['new-attr'] = 123.

lforst commented 2 weeks ago

I think our API should be powerful enough for all use-cases described here. We expose certain hooks on the Client like .on('spanStart') and .on('spanEnd'). These hooks also allow you to mutate the underlying entity.

Maybe I don't understand correctly but it would probably help to have a bit more concrete suggestions for what these hooks should look like and behave before we can implement this.