import os import boto3 import aiohttp import asyncio import pandas as pd import functools from datetime import datetime, timedelta, timezone 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