Как иметь несколько глобальных DSN в Sentry SDK в Python? - PullRequest
0 голосов
/ 05 ноября 2019

Я хотел бы иметь несколько DSN в инструменте, который я пишу. Инструмент - это то, что пользователи будут предоставлять своим собственным DSN для отслеживания ошибок. Я также хочу отслеживать ошибки в моем собственном DSN.

Этот вопрос также задавался здесь , но был дан один глобальный DSN, а затем вручную отправлять события через другой. Клиент.

Связанные и без ответа: Как использовать несколько DSN в Sentry (javascript / browser)

1 Ответ

0 голосов
/ 05 ноября 2019

Просматривая код, кажется, что наиболее целесообразный и приемлемый способ сделать это - создать подкласс Transport и создать очень легкую оболочку,

class MultiTransport(sentry_sdk.transport.Transport):                           

    def __init__(self, options=None):                                           
        self.transports = []                                              
        options.pop('transport', None)                                          
        dsn = options.pop('dsn', [])                                            
        for d in dsn:                                                           
            options['dsn'] = d                                                  
            self.transports.append(                                       
                sentry_sdk.transport.HttpTransport(options)                     
            )                                                                   
        super().__init__(options)                                               

    def capture_event(self, event):                                             
        for t in self.transports:                                         
            t.capture_event(event)                                              

    def flush(self, timeout, callback=None):                                    
        for t in self.transports:                                         
            t.flush(timeout, callback)                                          

    def kill(self):                                                             
        for t in self.transports:                                         
            t.kill()         

Вы инициализируете часовой с помощью

sentry = sentry_sdk.init(                                                   
        transport=MultiTransport,                                               
        dsn=[dsn1, dsn2, dsn3])

Мне неясно, как следует обрабатывать исключения в циклах for. Возможно, их следует обрабатывать и игнорировать, чтобы следующий DSN также был предупрежден.

Кроме того, неясно, должен ли flush() callback вызываться только один раз или один раз для каждого DSN.

Как уже упоминалось в ответе github , обязательно предоставьте своим пользователям возможность отказаться от вашего DSN, а также будьте внимательны, какую информацию можно передавать.

...