getsentry / sentry-symfony

The official Symfony SDK for Sentry (sentry.io)
https://sentry.io
MIT License
695 stars 170 forks source link

Support for using own Representation Serializer #671

Open annuh opened 2 years ago

annuh commented 2 years ago

I would like to support something similar as discussed in this issue: https://github.com/getsentry/sentry-php/issues/889

image

A solution for this would be this:

use Sentry\Serializer\Serializable;

class ExampleObject implements Serializable
{
    private $id = 123;

    public function toSentry(): array
    {
        return [
            'internal_state' => 'Object: ExampleObject(#' . $this->id . ')' ,
        ];
    }
} 

But I would rather have a more re-usable solution, via a custom Serializer:

# sentry.yaml
sentry:
  representation_serializer: App\Sentry\RepresentationSerializer
# App\Sentry\RepresentationSerializer.php

class RepresentationSerializer extends AbstractSerializer implements RepresentationSerializerInterface
{
    public function representationSerialize($value)
    {
        if (\is_object($value)) {
            return 'Object ' . \get_class($value) . '(#' . $value->getId() . ')';
        }
    }
}

For this we need to be able to pass a custom Serializer to this bundle. Would it be possible to support using a custom Serializer with the sentry-symfony bundle? https://github.com/getsentry/sentry-symfony/blob/master/src/DependencyInjection/SentryExtension.php#L123-L125

Jean85 commented 2 years ago

IMHO this should be handled using custom class serializers, which is documented in the readme: https://github.com/getsentry/sentry-symfony#custom-serializers

Adding an interface that has getId to intended classes should make the trick.

stayallive commented 2 years ago

@Jean85, this was not mentioned here but there already has been some contact around this and for the actual use case (not this example) that won't do (many classes without any base class or interface) and currently the only way around it is implementing a custom Serializer. Using the class serializers would be ideal but not possible/feasible here.