def _payload(self): # Fetch the notifier version from the package notifier_version = package_version("bugsnag") or "unknown" # Construct the payload dictionary filters = self.config.params_filters encoder = SanitizingJSONEncoder(separators=(',', ':'), keyword_filters=filters) return encoder.encode({ "apiKey": self.api_key, "notifier": { "name": self.NOTIFIER_NAME, "url": self.NOTIFIER_URL, "version": notifier_version, }, "events": [{ "payloadVersion": self.PAYLOAD_VERSION, "severity": self.severity, "releaseStage": self.release_stage, "appVersion": self.app_version, "context": self.context, "groupingHash": self.grouping_hash, "exceptions": [{ "errorClass": class_name(self.exception), "message": self.exception, "stacktrace": self.stacktrace, }], "metaData": self.meta_data, "user": self.user, "device": { "hostname": self.hostname }, "projectRoot": self.config.get("project_root"), "libRoot": self.config.get("lib_root") }] })
def test_session_tracker_sets_details_from_config(self): client = Client( auto_capture_sessions=True, session_endpoint=self.server.url, asynchronous=False ) client.session_tracker.start_session() client.session_tracker.send_sessions() json_body = self.server.received[0]['json_body'] # Notifier properties notifier = json_body['notifier'] self.assertTrue('name' in notifier) self.assertEqual(notifier['name'], Notification.NOTIFIER_NAME) self.assertTrue('url' in notifier) self.assertEqual(notifier['url'], Notification.NOTIFIER_URL) self.assertTrue('version' in notifier) notifier_version = package_version('bugsnag') or 'unknown' self.assertEqual(notifier['version'], notifier_version) # App properties app = json_body['app'] self.assertTrue('releaseStage' in app) self.assertEqual(app['releaseStage'], client.configuration.get('release_stage')) self.assertTrue('version' in app) self.assertEqual(app['version'], client.configuration.get('app_version')) # Device properties device = json_body['device'] self.assertTrue('hostname' in device) self.assertEqual(device['hostname'], client.configuration.get('hostname'))
def test_session_tracker_sets_details_from_config(self): client = Client( auto_capture_sessions=True, session_endpoint=self.server.url, asynchronous=False ) client.session_tracker.start_session() client.session_tracker.send_sessions() json_body = self.server.received[0]['json_body'] # Notifier properties notifier = json_body['notifier'] self.assertTrue('name' in notifier) self.assertEqual(notifier['name'], Notification.NOTIFIER_NAME) self.assertTrue('url' in notifier) self.assertEqual(notifier['url'], Notification.NOTIFIER_URL) self.assertTrue('version' in notifier) notifier_version = package_version('bugsnag') or 'unknown' self.assertEqual(notifier['version'], notifier_version) # App properties app = json_body['app'] self.assertTrue('releaseStage' in app) self.assertEqual(app['releaseStage'], client.configuration.get('release_stage')) self.assertTrue('version' in app) self.assertEqual(app['version'], client.configuration.get('app_version')) # Device properties device = json_body['device'] self.assertTrue('hostname' in device) self.assertEqual(device['hostname'], client.configuration.get('hostname')) self.assertTrue('runtimeVersions' in device) self.assertEqual(device['runtimeVersions']['python'], platform.python_version())
def _payload(self): # Fetch the notifier version from the package notifier_version = package_version("bugsnag") or "unknown" filters = self.config.params_filters encoder = SanitizingJSONEncoder(separators=(',', ':'), keyword_filters=filters) # Construct the payload dictionary return encoder.encode({ "apiKey": self.api_key, "notifier": { "name": self.NOTIFIER_NAME, "url": self.NOTIFIER_URL, "version": notifier_version, }, "events": [{ "severity": self.severity, "severityReason": self.severity_reason, "unhandled": self.unhandled, "releaseStage": self.release_stage, "app": { "version": self.app_version, "type": self.app_type, }, "context": self.context, "groupingHash": self.grouping_hash, "exceptions": [{ "errorClass": class_name(self.exception), "message": self.exception, "stacktrace": self.stacktrace, }], "metaData": FilterDict(self.metadata), "user": FilterDict(self.user), "device": FilterDict({ "hostname": self.hostname, "runtimeVersions": self.runtime_versions }), "projectRoot": self.config.project_root, "libRoot": self.config.lib_root, "session": self.session }] })
def __deliver(self, sessions: List[Dict]): if not sessions: bugsnag.logger.debug("No sessions to deliver") return if not self.config.api_key: bugsnag.logger.debug("Not delivering due to an invalid api_key") return if not self.config.should_notify(): bugsnag.logger.debug("Not delivering due to release_stages") return notifier_version = package_version('bugsnag') or 'unknown' payload = { 'notifier': { 'name': Event.NOTIFIER_NAME, 'url': Event.NOTIFIER_URL, 'version': notifier_version }, 'device': FilterDict({ 'hostname': self.config.hostname, 'runtimeVersions': self.config.runtime_versions }), 'app': { 'releaseStage': self.config.release_stage, 'version': self.config.app_version }, 'sessionCounts': sessions } try: filters = self.config.params_filters encoder = SanitizingJSONEncoder(separators=(',', ':'), keyword_filters=filters) encoded_payload = encoder.encode(payload) self.config.delivery.deliver_sessions(self.config, encoded_payload) except Exception as e: bugsnag.logger.exception('Sending sessions failed %s', e)
def __deliver(self, sessions): if not sessions: bugsnag.logger.debug("No sessions to deliver") return if not self.config.api_key: bugsnag.logger.debug("Not delivering due to an invalid api_key") return if not self.config.should_notify: bugsnag.logger.debug("Not delivering due to release_stages") return notifier_version = package_version('bugsnag') or 'unknown' payload = { 'notifier': { 'name': Notification.NOTIFIER_NAME, 'url': Notification.NOTIFIER_URL, 'version': notifier_version }, 'device': FilterDict({ 'hostname': self.config.get('hostname'), }), 'app': { 'releaseStage': self.config.get('release_stage'), 'version': self.config.get('app_version') }, 'sessionCounts': sessions } try: filters = self.config.params_filters encoder = SanitizingJSONEncoder(separators=(',', ':'), keyword_filters=filters) encoded_payload = encoder.encode(payload) self.config.delivery.deliver_sessions(self.config, encoded_payload) except Exception as e: bugsnag.logger.exception('Sending sessions failed %s', e)
def __generate_payload(self): try: # Set up the lib root lib_root = self.config.get("lib_root", self.options) if lib_root and lib_root[-1] != os.sep: lib_root += os.sep # Set up the project root project_root = self.config.get("project_root", self.options) if project_root and project_root[-1] != os.sep: project_root += os.sep # Build the stacktrace tb = self.options.get("traceback", sys.exc_info()[2]) if tb: trace = traceback.extract_tb(tb) else: trace = traceback.extract_stack() bugsnag_module_path = os.path.dirname(bugsnag.__file__) stacktrace = [] for line in trace: file_name = os.path.abspath(str(line[0])) in_project = False if file_name.startswith(bugsnag_module_path): continue if lib_root and file_name.startswith(lib_root): file_name = file_name[len(lib_root):] elif project_root and file_name.startswith(project_root): file_name = file_name[len(project_root):] in_project = True stacktrace.append({ "file": file_name, "lineNumber": int(str(line[1])), "method": str(line[2]), "inProject": in_project, }) stacktrace.reverse() # Fetch the notifier version from the package notifier_version = package_version("bugsnag_python") or "unknown" # Construct the payload dictionary payload = { "apiKey": self.config.api_key, "notifier": { "name": self.NOTIFIER_NAME, "url": self.NOTIFIER_URL, "version": notifier_version, }, "events": [{ "releaseStage": self.config.get("release_stage", self.options), "appVersion": self.config.get("app_version", self.options), "context": self.request_config.get("context", self.options), "userId": self.request_config.get("user_id", self.options), "groupingHash": self.request_config.get("grouping_hash", self.options), "exceptions": [{ "errorClass": class_name(self.exception), "message": str(self.exception), "stacktrace": stacktrace, }], "metaData": self.__generate_metadata(), }], "device": { "hostname": self.config.get("hostname", self.options) } } # JSON-encode and return the payload return json.dumps(payload) finally: del tb