issue_occurrence.py 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. import uuid
  2. from datetime import datetime
  3. from confluent_kafka import Producer
  4. from django.conf import settings
  5. from rest_framework import status
  6. from rest_framework.request import Request
  7. from rest_framework.response import Response
  8. from sentry.api.base import Endpoint, region_silo_endpoint
  9. from sentry.api.permissions import SuperuserPermission
  10. from sentry.models import Project
  11. from sentry.services.hybrid_cloud.user.service import user_service
  12. from sentry.utils import json
  13. from sentry.utils.kafka_config import get_kafka_producer_cluster_options
  14. from sentry.utils.samples import load_data
  15. @region_silo_endpoint
  16. class IssueOccurrenceEndpoint(Endpoint):
  17. permission_classes = (SuperuserPermission,)
  18. def post(self, request: Request) -> Response:
  19. """
  20. Write issue occurrence and event data to a Kafka topic
  21. ``````````````````````````````````````````````````````
  22. :auth: superuser required
  23. :pparam: string dummyEvent: pass 'True' to load a dummy event instead of providing one in the request
  24. :pparam: string dummyOccurrence: pass 'True' to load a dummy occurrence instead of providing one in the request
  25. """
  26. if request.query_params.get("dummyOccurrence") == "True":
  27. dummy_occurrence = dict(load_data("generic-event-profiling"))
  28. dummy_occurrence["event"]["received"] = datetime.utcnow().isoformat()
  29. dummy_occurrence["event"]["timestamp"] = datetime.utcnow().isoformat()
  30. dummy_occurrence["detection_time"] = datetime.utcnow().timestamp()
  31. project_id = request.query_params.get("project_id")
  32. if project_id:
  33. project = Project.objects.get(id=project_id)
  34. else:
  35. user = user_service.get_user(request.user.id)
  36. projects = Project.objects.get_for_user_ids({user.id})
  37. if not projects:
  38. return Response(
  39. "Requesting user must belong to at least one project.",
  40. status=status.HTTP_400_BAD_REQUEST,
  41. )
  42. project = projects[0]
  43. dummy_occurrence["id"] = uuid.uuid4().hex
  44. dummy_occurrence["event"]["event_id"] = uuid.uuid4().hex
  45. dummy_occurrence["project_id"] = project.id
  46. dummy_occurrence["event"]["project_id"] = project.id
  47. if "fingerprint" in request.query_params:
  48. dummy_occurrence["fingerprint"] = [request.query_params["fingerprint"]]
  49. else:
  50. dummy_occurrence = request.data
  51. if not dummy_occurrence:
  52. return Response(
  53. "Must pass an occurrence or query param of dummyOccurrence=True",
  54. status=status.HTTP_400_BAD_REQUEST,
  55. )
  56. topic = settings.KAFKA_INGEST_OCCURRENCES
  57. cluster_name = settings.KAFKA_TOPICS[topic]["cluster"]
  58. cluster_options = get_kafka_producer_cluster_options(cluster_name)
  59. producer = Producer(cluster_options)
  60. producer.produce(
  61. topic=topic,
  62. key=None,
  63. value=json.dumps(dummy_occurrence),
  64. )
  65. producer.flush()
  66. return Response(status=status.HTTP_201_CREATED)