mock-anr 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. #!/usr/bin/env python
  2. from sentry.runner import configure
  3. configure()
  4. import time
  5. from uuid import uuid4
  6. import click
  7. import requests
  8. from sentry.models import Organization, Project, ProjectKey
  9. from sentry.testutils.performance_issues.event_generators import get_event
  10. from sentry.utils import json
  11. def send_event(event, project, project_key, event_type, event_id):
  12. if event_type == "event":
  13. envelope = ["{}", '{"content_type":"application/json","type":"event"}', json.dumps(event)]
  14. else:
  15. envelope = [
  16. json.dumps({"event_id": f"{event_id}"}),
  17. '{"type":"transaction"}',
  18. json.dumps(event),
  19. ]
  20. payload = "\n".join(envelope)
  21. host = "http://127.0.0.1:8000"
  22. url = f"{host}/api/{project.id}/envelope/?sentry_key={project_key.public_key}&sentry_version=7&sentry_client=sentry.curl/1.1.1"
  23. headers = {
  24. "content-type": "application/json",
  25. }
  26. response = requests.post(url, payload, headers=headers)
  27. return response
  28. @click.command()
  29. @click.option(
  30. "--project", type=str, help="Project slug to insert data into", default="sentry-android"
  31. )
  32. @click.option("--org", type=str, help="Organization slug to insert data into", default="sentry")
  33. @click.option(
  34. "--release", type=str, help="Release name. Defaults to the most recent release in the project."
  35. )
  36. @click.option("--env", type=str, help="Environment to generate sessions for", default="dev")
  37. @click.option("--days", type=int, help="Number of days to generate data for", default=5)
  38. def main(project, org, env, days, release=None):
  39. click.echo(f"Mocking anrs for {project} in {org}")
  40. try:
  41. organization = Organization.objects.get(slug=org)
  42. except Organization.DoesNotExist:
  43. raise RuntimeError("! Organization does not exist")
  44. try:
  45. project = Project.objects.get(slug=project, organization=organization)
  46. except Project.DoesNotExist:
  47. raise RuntimeError("! Project does not exist")
  48. project_key = ProjectKey.objects.filter(project=project)[0]
  49. transaction = get_event("transaction")
  50. timestamp_now = time.time()
  51. start_timestamp = timestamp_now - 1
  52. event_id = str(uuid4().hex)
  53. transaction["event_id"] = event_id
  54. transaction["timestamp"] = timestamp_now
  55. transaction["start_timestamp"] = start_timestamp
  56. trace_id = str(uuid4().hex)
  57. transaction["contexts"]["trace"]["trace_id"] = trace_id
  58. span = transaction["spans"][0]
  59. span["start_timestamp"] = start_timestamp
  60. span["timestamp"] = timestamp_now
  61. span["trace_id"] = trace_id
  62. transaction["spans"][0] = span
  63. response = send_event(transaction, project, project_key, "transaction", event_id)
  64. click.echo(f"response: {response}")
  65. click.echo(f"> Complete! generated file io txn with id {event_id}")
  66. anr_event = get_event("anr-android")
  67. timestamp_now = time.time()
  68. anr_event_id = str(uuid4().hex)
  69. anr_event["timestamp"] = timestamp_now
  70. anr_event["event_id"] = anr_event_id
  71. anr_event["contexts"]["trace"]["trace_id"] = trace_id
  72. anr_response = send_event(anr_event, project, project_key, "event", anr_event_id)
  73. click.echo(f"response: {anr_response}")
  74. click.echo(f"> Complete! generated anr event with id {anr_event_id}")
  75. if __name__ == "__main__":
  76. main()