# HG changeset patch # User drewp # Date 1569457655 25200 # Node ID 71684fc9c692d8d431a8f861804dd2ae7cd2ce31 # Parent ca96da46c73ea0867eeee99cf59233ac9eae5204 new index page table Ignore-this: 7668675a04bd5cc03cf4e1799c54d4d1 darcs-hash:5b546637d01f1fa70134c09470007ed1251d708c diff -r ca96da46c73e -r 71684fc9c692 service/collector/sse_collector.py --- a/service/collector/sse_collector.py Wed Sep 25 17:25:36 2019 -0700 +++ b/service/collector/sse_collector.py Wed Sep 25 17:27:35 2019 -0700 @@ -120,7 +120,8 @@ 'created': round(self.created, 2), 'ageHours': round((time.time() - self.created) / 3600, 2), 'streamId': self.streamId, - 'remoteIp': self.request.remote_ip, + 'remoteIp': self.request.remote_ip, # wrong, need some forwarded-for thing + 'foafAgent': self.request.headers.get('X-Foaf-Agent'), 'userAgent': self.request.headers.get('user-agent'), } @@ -282,8 +283,10 @@ def state(self) -> Dict: return { - 'clients': [ps.state() for ps in self.clients.values()], - 'sseHandlers': [h.state() for h in self.handlers], + 'clients': sorted([ps.state() for ps in self.clients.values()], + key=lambda r: r['reconnectedPatchSource']['url']), + 'sseHandlers': sorted([h.state() for h in self.handlers], + key=lambda r: (r['streamId'], r['created'])), 'statements': self.statements.state(), } @@ -420,13 +423,7 @@ except Exception: import traceback; traceback.print_exc() raise - - -class Root(cyclone.web.RequestHandler): - def get(self) -> None: - self.write('sse_collector') - - + if __name__ == '__main__': arg = docopt(""" Usage: sse_collector.py [options] @@ -447,7 +444,9 @@ 9072, cyclone.web.Application( handlers=[ - (r'/', Root), + (r"/()", cyclone.web.StaticFileHandler, { + "path": "static", "default_filename": "index.html"}), + (r'/static/(.*)',cyclone.web.StaticFileHandler, {"path": "static"}), (r'/state', State), (r'/graph/(.*)', PatchSink), (r'/stats/(.*)', StatsHandler, {'serverName': 'collector'}), diff -r ca96da46c73e -r 71684fc9c692 service/collector/static/index.html --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/collector/static/index.html Wed Sep 25 17:27:35 2019 -0700 @@ -0,0 +1,21 @@ + + + + collector + + + + + + + + + + +

collector

+ +

output for graph/home

+ + + + diff -r ca96da46c73e -r 71684fc9c692 service/collector/static/state.js --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/service/collector/static/state.js Wed Sep 25 17:27:35 2019 -0700 @@ -0,0 +1,130 @@ +import { LitElement, TemplateResult, html, css } from '/lib/lit-element/2.2.0/lit-element-custom.js'; + +class CollectorState extends LitElement { + static get properties() { + return { + latestState: { type: Object } + }; + } + firstUpdated() { + this.latestState = {graphClients: {}}; + this.refreshLoop(); + } + + refreshLoop() { + setTimeout(() => { + requestAnimationFrame(() => { + this.refresh(); + }); + }, 5000); + } + + refresh() { + fetch('state') + .then((response) => { + return response.json(); + }) + .then((newState) => { + this.latestState = newState; + this.refreshLoop(); + }); + } + + static get styles() { + return css` + :host { + display: inline-block; + border: 2px solid gray; + padding: 5px; + }`; + } + + render() { + const sourcesTable = (clients) => { + const clientRow = (client) => { + const d = client.reconnectedPatchSource; + return html` + + [browse] ${d.url} + ${d.fullGraphReceived} + ${d.patchesReceived} + ${d.time.open} + ${d.time.fullGraph} + ${d.time.latestPatch} + + `; + }; + + return html` + + + + + + + + + + + + + ${clients.map(clientRow)} + +
patch sourcefull graph recvpatches recvtime opentime fullGraphtime latest patch
+ `; + }; + + const handlersTable = (handlers) => { + const handlerRow = (d) => { + return html` + + ${d.created} + ${d.ageHours} + ${d.streamId} + ${d.foafAgent} + ${d.userAgent} + + `; + }; + + return html` + + + + + + + + + + + + ${handlers.map(handlerRow)} + +
createdage hoursstreamfoaf agentuser agent
+ `; + }; + + if (!this.latestState) { + return 'loading...'; + } + const d = this.latestState.graphClients; + return html` +
+

+ Graph: ${d.statements.len} statements +

+ +

+ Sources: + ${sourcesTable(d.clients)} +

+ +

+ Listening clients: + ${handlersTable(d.sseHandlers)} +

+
`; + } +} +customElements.define('collector-state', CollectorState);