import asyncio import functools import os from datetime import datetime, timedelta, timezone import aiohttp import boto3 import pandas as pd TOKEN = os.getenv("SENTRY_TOKEN") S3_BUCKET = os.getenv("S3_BUCKET") projects = [("pingcap2", "dbaas-ui", "pingcap_dbaas-ui")] async def list_events(org, project, after): url = f"https://sentry.io/api/0/projects/{org}/{project}/events/" df = pd.DataFrame() async with aiohttp.ClientSession(trust_env=True) as session: while True: response = await session.get( url, headers={ "Authorization": f"Bearer {TOKEN}", }, ) data = await response.json() if len(data) == 0: break f = pd.DataFrame.from_records(data) df = pd.concat([df, f]) if len(f[pd.to_datetime(f.dateCreated) < after]) > 0: break link = response.headers.get("Link") if not (link and '"next"' in link): break url = link.split()[4][1:-2] df.dateCreated = pd.to_datetime(df.dateCreated) df = df[df.dateCreated >= after] return df async def sync_sentry_events(date, checkpoint=None): s3 = boto3.client("s3") for org, project, filename in projects: df = await list_events( org, project, datetime.combine(date, datetime.min.time(), tzinfo=timezone.utc) ) df = df[ (df.dateCreated >= datetime.combine(date, datetime.min.time(), tzinfo=timezone.utc)) & ( df.dateCreated < datetime.combine( date + timedelta(days=1), datetime.min.time(), tzinfo=timezone.utc ) ) ] buf = df.to_csv(index=False) await asyncio.get_running_loop().run_in_executor( None, functools.partial( s3.put_object, Body=buf, Bucket=S3_BUCKET, Key=f"data/sentry/{date}_{filename}.csv", ContentType="text/csv", ), ) print(f"sync data/sentry/{date}_{org}_{project}.csv success") # make sure this is an async generator yield None