Files
2026-09-22 19:23:17 +02:00

47 lines
2.7 KiB
Python

"""Synthetic local metadata retention benchmark; no Core calls or managed hosts."""
from pathlib import Path
import argparse,json,resource,sys,tempfile,time
sys.path.insert(0,str(Path(__file__).resolve().parents[1]/'src'))
from aim_webgui.auth.service import Auth
from aim_webgui.config import Settings
from aim_webgui.journal import Journal,project
from evidence_fixtures import job,ev
def main():
parser=argparse.ArgumentParser()
parser.add_argument('--events',type=int,default=25000)
parser.add_argument('--out',type=Path,required=True)
args=parser.parse_args()
if not 1<=args.events<=200000:parser.error('events must be 1..200000')
with tempfile.TemporaryDirectory(prefix='aim-journal-benchmark-') as directory:
settings=Settings(state_dir=Path(directory)/'state',public_url='https://example.test')
auth=Auth(settings);auth.bootstrap()
with auth.store.transaction() as db:
db.execute('UPDATE users SET must_change_password=0')
owner=db.execute('SELECT id FROM users').fetchone()[0]
ident=job(auth,owner);journal=Journal(settings);journal.begin(ident)
begin=time.perf_counter()
for start in range(1,args.events+1,128):
batch=[(*project(ev(i),{'test01.example'}),time.time()) for i in range(start,min(start+128,args.events+1))]
journal.append(ident,batch)
journal.append(ident,[],closed=True)
elapsed=time.perf_counter()-begin
t=time.perf_counter();snapshot=journal.snapshot(owner,ident);read=time.perf_counter()-t
assert snapshot['cursor']==args.events
assert snapshot['retained_events']<=settings.journal_max_events
assert snapshot['retained_bytes']<=settings.journal_max_bytes
assert snapshot['checkpoint']['observed_task_starts']==args.events
assert len(snapshot['events'])<=200
result={'synthetic_only':True,'events':args.events,'batch_events':128,
'write_seconds':round(elapsed,4),'latest_snapshot_seconds':round(read,4),
'retained_events':snapshot['retained_events'],'omitted_events':snapshot['omitted_events'],
'retained_metadata_bytes':snapshot['retained_bytes'],'response_events':len(snapshot['events']),
'checkpoint_tasks':len(snapshot['checkpoint']['tasks']),
'process_peak_rss_kib':resource.getrusage(resource.RUSAGE_SELF).ru_maxrss,
'database_bytes':settings.database.stat().st_size,'core_calls':0,
'limits':'20,000 event / 8 MiB tail, using synchronous 128-event batches; not executor/load qualification'}
args.out.write_text(json.dumps(result,indent=2)+'\n');print(json.dumps(result,indent=2))
if __name__=='__main__':main()