Visualizer #3

Merged
thomas merged 12 commits from rudi_s into main 2024-05-28 11:21:00 +02:00
Collaborator

Improved JSON logging and visualization via chart.js in the browser.

Improved JSON logging and visualization via chart.js in the browser.
rudi_s added 6 commits 2024-05-11 14:48:16 +02:00
26786a8569 jsonlogger: increase pipe buffer to reduce likelihood of corrupted messages
Our JSON messages can get rather large which can cause a buffer overrun
when the reading program is not scheduled at the same time. When the
kernel returns EAGAIN we abort writing the current JSON message.
However, the unfinished (and thus invalid) JSON message is still in the
pipe and will be processed by the reading program.

Increase the pipe buffer from the default 65536 to reduce the likelihood
of this happening. It's difficult to completely prevent the issue as we
don't want to slow down the main program due to slow logging.
09cccd3ced visualizer: don't use fixed scales
We might get (unexpected) input which is outside of the usual range.
0df63a998d visualizer: treat -1e38 as NaN
I considered updating jsonlogger.c to represent NaN as "null" in the
JSON. However, this makes the hand-written JSON generator much more
complicated.
rudi_s added 5 commits 2024-05-11 18:12:15 +02:00
thomas requested changes 2024-05-25 17:46:25 +02:00
thomas left a comment
Owner

Probiere gerade die Review-Funktion aus. Nimm das nicht zu ernst ;)

Muss auch feststellen, dass es in Go so manche interessante Syntax gibt, die ich als außenstehender nicht direkt verstehe. Aber es hat ja funktioniert, daher wird das schon passen :D

Probiere gerade die Review-Funktion aus. Nimm das nicht zu ernst ;) Muss auch feststellen, dass es in Go so manche interessante Syntax gibt, die ich als außenstehender nicht direkt verstehe. Aber es hat ja funktioniert, daher wird das schon passen :D
@ -0,0 +35,4 @@
go func() {
for {
path := os.Args[1]
dupPath := os.Args[2] + "." + time.Now().Format(time.RFC3339)
Owner

Eine Idee dazu noch: wenn man wirklich ein Replay von einem früheren JSON-Dump startet, indem man diesen statt dem FIFO als Args[1] angibt, wäre es cool, wenn man Args[2] weglassen könnte oder zumindest /dev/null angeben könnte. Letzteres geht leider nicht wegen dem Anhängen der Uhrzeit (was an sich aber schon sinnvoll ist).

Eine Idee dazu noch: wenn man wirklich ein Replay von einem früheren JSON-Dump startet, indem man diesen statt dem FIFO als Args[1] angibt, wäre es cool, wenn man Args[2] weglassen könnte oder zumindest /dev/null angeben könnte. Letzteres geht leider nicht wegen dem Anhängen der Uhrzeit (was an sich aber schon sinnvoll ist).
Author
Collaborator

Ist implementiert. Habs auch gleich rebased.

Ist implementiert. Habs auch gleich rebased.
Owner

Schaut gut aus. Dann merge ich das mal :)

Schaut gut aus. Dann merge ich das mal :)
thomas marked this conversation as resolved
rudi_s force-pushed rudi_s from 51ae5d6785 to d5aeb6c0bc 2024-05-28 08:59:58 +02:00 Compare
Author
Collaborator

Muss auch feststellen, dass es in Go so manche interessante Syntax gibt, die ich als außenstehender nicht direkt verstehe. Aber es hat ja funktioniert, daher wird das schon passen :D

Ueber welchen interessanten Syntax bist du gestolpert?

> Muss auch feststellen, dass es in Go so manche interessante Syntax gibt, die ich als außenstehender nicht direkt verstehe. Aber es hat ja funktioniert, daher wird das schon passen :D Ueber welchen interessanten Syntax bist du gestolpert?
Owner

Ueber welchen interessanten Syntax bist du gestolpert?

Das eine war die Frage, warum da nochmal ein go func() {...} in der main() auftaucht, das andere war Zeile 120:

x := <-ch

Das scheint eine spezielle Kopieroperation zu sein, wegen mehreren Websocket-Clients, aber so richtig klar ist mir nicht, was das tut. Muss aber auch zugeben, dass ich auch noch nicht danach gesucht habe.

> Ueber welchen interessanten Syntax bist du gestolpert? Das eine war die Frage, warum da nochmal ein `go func() {...}` in der `main()` auftaucht, das andere war Zeile 120: ```go x := <-ch ``` Das scheint eine spezielle Kopieroperation zu sein, wegen mehreren Websocket-Clients, aber so richtig klar ist mir nicht, was das tut. Muss aber auch zugeben, dass ich auch noch nicht danach gesucht habe.
thomas merged commit d5aeb6c0bc into main 2024-05-28 11:21:00 +02:00
thomas deleted branch rudi_s 2024-05-28 11:21:00 +02:00
Author
Collaborator

Das eine war die Frage, warum da nochmal ein go func() {...} in der main() auftaucht,

go x() startet x() in einer neuen Go-Routine (= "Green"-Thread). func() { ... } ist ne anonyme Funktion (Lambda).

Damit wird der Block "im Hintergrund" (parallel zum Rest der main) ausgefuehrt.

das andere war Zeile 120:

x := <-ch

Das scheint eine spezielle Kopieroperation zu sein, wegen mehreren Websocket-Clients, aber so richtig klar ist mir nicht, was das tut. Muss aber auch zugeben, dass ich auch noch nicht danach gesucht habe.

ch ist ein Channel (ne Message-Queue zwischen Go-Routinen). x = <-ch nimmt ein Element aus dem Channel (und blockiert wenn nichts drin ist) und speichert es in x, ch <- x fuegt x dem Channel hinzu (und blockiert wenn kein Platz mehr drin ist; die Kapazitaet kann man beim make() angeben).

(Channels darf man in Go nicht kopieren wenn sie angelegt wurden. Deswegen speichere ich Pointer auf Channels, das ist erlaubt.)

> Das eine war die Frage, warum da nochmal ein `go func() {...}` in der `main()` auftaucht, `go x()` startet `x()` in einer neuen Go-Routine (= "Green"-Thread). `func() { ... }` ist ne anonyme Funktion (Lambda). Damit wird der Block "im Hintergrund" (parallel zum Rest der `main`) ausgefuehrt. > das andere war Zeile 120: > > ```go > x := <-ch > ``` > > Das scheint eine spezielle Kopieroperation zu sein, wegen mehreren Websocket-Clients, aber so richtig klar ist mir nicht, was das tut. Muss aber auch zugeben, dass ich auch noch nicht danach gesucht habe. `ch` ist ein Channel (ne Message-Queue zwischen Go-Routinen). `x = <-ch` nimmt ein Element aus dem Channel (und blockiert wenn nichts drin ist) und speichert es in `x`, `ch <- x` fuegt `x` dem Channel hinzu (und blockiert wenn kein Platz mehr drin ist; die Kapazitaet kann man beim `make()` angeben). (Channels darf man in Go nicht kopieren wenn sie angelegt wurden. Deswegen speichere ich Pointer auf Channels, das ist erlaubt.)
Sign in to join this conversation.
No reviewers
No Label
No Milestone
No project
No Assignees
2 Participants
Notifications
Due Date
The due date is invalid or out of range. Please use the format 'yyyy-mm-dd'.

No due date set.

Dependencies

No dependencies set.

Reference: Amateurfunk/hamnet70#3
No description provided.