47 lines
2.7 KiB
Python
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()
|