Exemplo n.º 1
0
    def test_with_event_user(self):
        event = self.store_event(
            data={
                "event_id": "d" * 32,
                "message": "oh no",
                "environment": self.env_1.name,
                "user": {"id": 1234, "email": "*****@*****.**"},
            },
            project_id=self.project_1.id,
        )

        # Simulate how ingest saves reports to get event_user connections
        report_data = {
            "event_id": event.event_id,
            "name": "",
            "email": "",
            "comments": "It broke",
        }
        save_userreport(self.project_1, report_data)

        response = self.get_response(self.project_1.organization.slug, project=[self.project_1.id])
        assert response.status_code == 200
        assert response.data[0]["comments"] == "It broke"
        assert response.data[0]["user"]["name"] == "*****@*****.**"
        assert response.data[0]["user"]["email"] == "*****@*****.**"
Exemplo n.º 2
0
def process_userreport(message, projects):
    project_id = int(message["project_id"])
    start_time = to_datetime(message["start_time"])
    feedback = json.loads(message["payload"])

    try:
        project = projects[project_id]
    except KeyError:
        logger.error("Project for ingested event does not exist: %s", project_id)
        return False

    try:
        save_userreport(project, feedback, start_time=start_time)
        return True
    except Conflict as e:
        logger.info("Invalid userreport: %s", e)
        return False
Exemplo n.º 3
0
def process_userreport(message):
    project_id = message["project_id"]
    start_time = to_datetime(message["start_time"])
    feedback = json.loads(message["payload"])

    try:
        project = Project.objects.get_from_cache(id=project_id)
    except Project.DoesNotExist:
        logger.error("Project for ingested event does not exist: %s",
                     project_id)
        return False

    try:
        save_userreport(project, feedback, start_time=start_time)
        return True
    except Conflict as e:
        logger.info("Invalid userreport: %s", e)
        return False
def process_userreport(message, projects):
    project_id = int(message["project_id"])
    start_time = to_datetime(message["start_time"])
    feedback = json.loads(message["payload"])

    try:
        project = projects[project_id]
    except KeyError:
        logger.error("Project for ingested event does not exist: %s", project_id)
        return False

    try:
        save_userreport(project, feedback, start_time=start_time)
        return True
    except Conflict as e:
        logger.info("Invalid userreport: %s", e)
        return False
    except Exception:
        # XXX(markus): Hotfix because we have broken data in kafka
        # If you want to remove this make sure to have triaged all errors in Sentry
        logger.exception("userreport.save.crash")
        return False
Exemplo n.º 5
0
def process_userreport(message, projects):
    project_id = int(message["project_id"])
    start_time = to_datetime(message["start_time"])
    feedback = json.loads(message["payload"])

    try:
        project = projects[project_id]
    except KeyError:
        logger.error("Project for ingested event does not exist: %s",
                     project_id)
        return False

    try:
        save_userreport(project, feedback, start_time=start_time)
        return True
    except KeyError as e:
        # XXX(markus): Hotfix because we have broken data in kafka
        logger.error("Missing user report key: %s", e)
        return False
    except Conflict as e:
        logger.info("Invalid userreport: %s", e)
        return False
Exemplo n.º 6
0
    def post(self, request, project):
        """
        Submit User Feedback
        ````````````````````

        Submit and associate user feedback with an issue.

        Feedback must be received by the server no more than 30 minutes after the event was saved.

        Additionally, within 5 minutes of submitting feedback it may also be overwritten. This is useful
        in situations where you may need to retry sending a request due to network failures.

        If feedback is rejected due to a mutability threshold, a 409 status code will be returned.

        Note: Feedback may be submitted with DSN authentication (see auth documentation).

        :pparam string organization_slug: the slug of the organization.
        :pparam string project_slug: the slug of the project.
        :auth: required
        :param string event_id: the event ID
        :param string name: user's name
        :param string email: user's email address
        :param string comments: comments supplied by user
        """
        if hasattr(request.auth,
                   "project_id") and project.id != request.auth.project_id:
            return self.respond(status=400)

        serializer = UserReportSerializer(data=request.data)
        if not serializer.is_valid():
            return self.respond(serializer.errors, status=400)

        report = serializer.validated_data
        try:
            report_instance = save_userreport(project, report)
        except Conflict as e:
            return self.respond({"detail": six.text_type(e)}, status=409)

        if isinstance(request.auth, ProjectKey):
            return self.respond(status=200)

        return self.respond(
            serialize(
                report_instance,
                request.user,
                UserReportWithGroupSerializer(
                    environment_func=self._get_environment_func(
                        request, project.organization_id)),
            ))