uqbar-project / wollok-lsp-ide

IDE for Wollok - LSP node-based
GNU General Public License v3.0
7 stars 3 forks source link

Log del uso de la herramienta #120

Closed fdodino closed 6 months ago

fdodino commented 9 months ago

Como parte de mejorar la experiencia de usuario queremos registrar un log de la actividad de las personas que trabajan en Wollok. Dentro del mismo proyecto, queremos grabar un registro de

Como herramienta de logging existe Pino y Winston (ambos desconocidos por mí) según este artículo. Idealmente deberíamos buscar que sea estructurado el logging, quizás que se acote el tamaño y hay que agregarlo al gitignore (abrir un issue en wollok-ts-cli). Me encantaría agregar un comando en wollok-lsp-ide que mande el log a una casilla de correo nuestra, creo que hay que ser claros respecto a que no se envía ninguna info sensible.

Tareas derivadas

PalumboN commented 8 months ago

A mí pedagógicamente me interesa saber cuántas veces corrieron los tests y sus resultados. Y si lo hicieron con algún Warning / Error en el código también me interesa saber cuáles. 🤓

fdodino commented 8 months ago

Bueno, @PalumboN , hoy retomé un poquito (todavía estoy en Mar Azul, el domingo vuelvo y el miércoles me vuelvo a ir a Mendoza una semanita), pero ya curioseé y

fdodino commented 8 months ago

Hoy probé configurar un logger para el cliente y el server, los puse en un directorio utils hermano de client/src y server/src. El archivo tsconfig.json necesitaba tener dos root dirs:

    "rootDirs": [
      "src",
      "../utils",
    ],

El import se hace

import { logger } from './logger'

Pero ahora que lo pensé un toque más la implementación del logger no deja de ser un pasamanos y no le veo mucha utilidad (más allá de wrappear el framework que se use por atrás). Por ahora lo voy a volver para atrás y pienso usar directamente winston, veremos si después se justifica la necesidad.

fdodino commented 8 months ago

Update: ya configuré en LSP el server para que empiece a generar logs tanto en consola como en un file, que va a tener el nombre wollok.log. Una duda que me generaba era si la extensión no tenía que ser json, pero en realidad no es un json posta, porque cada log no está encerrado en un raíz con formato lista: [ ]. Pero hay una extensión que te permite prettificarlo:

image

https://marketplace.visualstudio.com/items?itemName=dmytro-pustovit.json-logs

Ahora estoy puliendo un poco los logs (ahí se ve que estoy tratando de decir qué file está buildeando y validando, ya capturo los errores de validación para que los muestre también en la consola y tengo dos formatters diferentes para la consola y para el file).

fdodino commented 8 months ago

A modo de recordatorio para cuando retome dejo acá qué hice hasta ahora:

Wollok LSP IDE

Qué hay

Qué falta

Wollok TS CLI

Otros tickets a crear

Cómo se ve

Consola Output

image

File

{"level":"info","message":"⌛ Building environment for main.wpgm | 109 ms","timestamp":"2024-01-16T03:49:58.704Z"}
{"level":"info","message":"⌛ Building environment for utils/object.wlk | 122 ms","timestamp":"2024-01-16T22:20:18.780Z"}
{"file":"file:///home/dodain/workspace/wollok-dev/wollok-workspace/demo/pruebita/main.wpgm","level":"error","message":"✘ Failed to rebuild document: Error: Failed to parse home/dodain/workspace/wollok-dev/wollok-workspace/demo/pruebita/main.wpgm: \n-- PARSING FAILED --------------------------------------------------\n\n  1 | import example.*\n  2 | \n> 3 | program  {\n    |          ^\n  4 |   const pepita = new Bird()\n  5 |   const semilla = new Seed()\n\nExpected one of the following: \n\nidentifier, whitespace\n","timestamp":"2024-01-16T22:23:20.053Z"}
{"file":"file:///home/dodain/workspace/wollok-dev/wollok-workspace/demo/pruebita/main.wpgm","level":"error","message":"✘ Failed to rebuild document: Error: Failed to parse home/dodain/workspace/wollok-dev/wollok-workspace/demo/pruebita/main.wpgm: \n-- PARSING FAILED --------------------------------------------------\n\n  1 | import example.*\n  2 | \n> 3 | program {\n    |         ^\n  4 |   const pepita = new Bird()\n  5 |   const semilla = new Seed()\n\nExpected one of the following: \n\nidentifier, whitespace\n","timestamp":"2024-01-16T22:23:20.748Z"}
{"file":"file:///home/dodain/workspace/wollok-dev/wollok-workspace/demo/pruebita/main.wpgm","level":"error","message":"✘ Failed to rebuild document: Error: Failed to parse home/dodain/workspace/wollok-dev/wollok-workspace/demo/pruebita/main.wpgm: \n-- PARSING FAILED --------------------------------------------------\n\n  1 | import example.*\n  2 | \n> 3 | program {\n    |         ^\n  4 |   const pepita = new Bird()\n  5 |   const semilla = new Seed()\n\nExpected one of the following: \n\nidentifier, whitespace\n","timestamp":"2024-01-16T22:36:30.759Z"}
{"file":"file:///home/dodain/workspace/wollok-dev/wollok-workspace/demo/pruebita/main.wpgm","level":"error","message":"✘ Failed to rebuild document: Error: Failed to parse home/dodain/workspace/wollok-dev/wollok-workspace/demo/pruebita/main.wpgm: \n-- PARSING FAILED --------------------------------------------------\n\n  1 | import example.*\n  2 | \n> 3 | program {\n    |         ^\n  4 |   const pepita = new Bird()\n  5 |   const semilla = new Seed()\n\nExpected one of the following: \n\nidentifier, whitespace\n","timestamp":"2024-01-16T22:36:30.760Z"}
{"level":"info","message":"⌛ Building environment for utils/object.wlk | 106 ms","timestamp":"2024-01-16T22:36:31.106Z"}
{"level":"info","message":"⌛ Building environment for example.wlk | 104 ms","timestamp":"2024-01-16T22:36:31.385Z"}
{"file":"file:///home/dodain/workspace/wollok-dev/wollok-workspace/demo/pruebita/main.wpgm","level":"error","message":"✘ Failed to rebuild document: Error: Failed to parse home/dodain/workspace/wollok-dev/wollok-workspace/demo/pruebita/main.wpgm: \n-- PARSING FAILED --------------------------------------------------\n\n  1 | import example.*\n  2 | \n> 3 | program  {\n    |          ^\n  4 |   const pepita = new Bird()\n  5 |   const semilla = new Seed()\n\nExpected one of the following: \n\nidentifier, whitespace\n","timestamp":"2024-01-16T22:37:48.563Z"}
{"level":"info","message":"⌛ Building environment for main.wpgm | 131 ms","timestamp":"2024-01-16T22:37:49.136Z"}
{"level":"info","message":"⌛ Building environment for main.wpgm | 103 ms","timestamp":"2024-01-16T22:37:49.368Z"}
{"level":"info","message":"⌛ Building environment for testExample.wtest | 135 ms","timestamp":"2024-01-16T23:55:51.811Z"}
{"level":"info","message":"⌛ Building environment for example.wlk | 105 ms","timestamp":"2024-01-16T23:55:52.116Z"}
{"level":"info","message":"⌛ Building environment for testExample.wtest | 117 ms","timestamp":"2024-01-16T23:56:58.720Z"}
{"level":"info","message":"⌛ Building environment for testExample.wtest | 106 ms","timestamp":"2024-01-16T23:56:58.828Z"}
{"level":"info","message":"⌛ Building environment for example.wlk | 105 ms","timestamp":"2024-01-16T23:56:58.939Z"}
{"level":"info","message":"⌛ Building environment for example.wlk | 123 ms","timestamp":"2024-01-16T23:56:59.063Z"}
{"level":"info","message":"⌛ Building environment for main.wpgm | 104 ms","timestamp":"2024-01-17T00:01:10.342Z"}
{"level":"info","message":"⌛ Building environment for testExample.wtest | 104 ms","timestamp":"2024-01-17T00:02:55.147Z"}
{"level":"info","message":"Puede ser puede ser","timestamp":"2024-01-17T00:02:55.243Z"}
{"level":"info","message":"⌛ Building environment for example.wlk | 110 ms","timestamp":"2024-01-17T00:02:55.360Z"}
{"level":"info","message":"⌛ Building environment for example.wlk | 126 ms","timestamp":"2024-01-17T00:02:55.488Z"}
{"level":"info","message":"⌛ Building environment for main.wpgm | 105 ms","timestamp":"2024-01-17T00:02:55.594Z"}
{"level":"info","message":"⌛ Building environment for testExample.wtest | 101 ms","timestamp":"2024-01-17T02:41:14.934Z"}
{"level":"info","message":"Running all tests matching \u001b[3m\u001b[34mtestExample.\"test para pepita\".\"energia inicial de pepita\"\u001b[39m\u001b[23m on \u001b[3m\u001b[34m/home/dodain/workspace/wollok-dev/wollok-workspace/demo/pruebita\u001b[39m\u001b[23m","timestamp":"2024-01-17T02:41:20.643Z"}
{"level":"info","message":"Running 1 tests...","timestamp":"2024-01-17T02:41:20.825Z"}
{"level":"info","message":"","timestamp":"2024-01-17T02:41:20.856Z"}
{"level":"info","message":"  ","timestamp":"2024-01-17T02:41:20.856Z"}
{"level":"info","message":"    ","timestamp":"2024-01-17T02:41:20.857Z"}
{"level":"info","message":"\n","timestamp":"2024-01-17T02:41:20.858Z"}
{"level":"info","message":"⌛ Building environment for example.wlk | 124 ms","timestamp":"2024-01-17T10:40:35.750Z"}
fdodino commented 8 months ago

El viernes 27/01 retomo ésto.

PalumboN commented 7 months ago

Cuando renombrás un archivo se rompen todas las referencias, estaría bueno ver si podemos hacer un full rebuild del environment (o resetearlo previamente) para que no queden las versiones viejas

https://github.com/uqbar-project/wollok-lsp-ide/pull/134 ;)

fdodino commented 7 months ago

@PalumboN , el log que te genera cada vez que corrés los tests (le puse que emita la performance, que loguee el stack trace de las fallas):

{
    "failures": [],
    "level": "info",
    "message": "🧪 Test runner executed matching testExample.\"test para pepita\" on /home/dodain/workspace/wollok-dev/wollok-workspace/demo/pruebita",
    "result": {
        "failed": 0,
        "ok": 2
    },
    "timeElapsed": 186,
    "timestamp": "2024-01-26T23:02:54.681Z"
}
{
    "failures": [
        {
            "error": [
                "wollok.lib.AssertionException: Expected <101> but found <100>",
                "  at testExample.\"test para pepita\".\"energia inicial de pepita\" [testExample.wtest:5]"
            ],
            "test": "testExample.\"test para pepita\".\"energia inicial de pepita\""
        }
    ],
    "level": "info",
    "message": "🧪 Test runner executed matching testExample.\"test para pepita\" on /home/dodain/workspace/wollok-dev/wollok-workspace/demo/pruebita",
    "result": {
        "failed": 1,
        "ok": 1
    },
    "timeElapsed": 221,
    "timestamp": "2024-01-26T23:03:09.295Z"
}
fdodino commented 7 months ago

@PalumboN @ivojawer Y ésto es lo que loguearíamos con un programa, los games no los incluiría porque eso entra en loop y es más heavy loguear algo que tenga sentido:

{
    "error": [
        "wollok.lang.MessageNotUnderstoodException: a Seed does not understand chachini()",
        "  at example.Bird.eat(food) [example.wlk:6]",
"  at main.pepe [main.wpgm:3]"
    ],
    "level": "info",
    "message": "🚀 Program executed main.pepe on /home/dodain/workspace/wollok-dev/wollok-workspace/demo/pruebita",
    "ok": false,
    "timeElapsed": 184,
    "timestamp": "2024-01-26T23:04:30.885Z"
}
{
    "level": "info",
    "message": "🚀 Program executed main.pepe on /home/dodain/workspace/wollok-dev/wollok-workspace/demo/pruebita",
    "ok": true,
    "timeElapsed": 171,
    "timestamp": "2024-01-26T23:05:07.013Z"
}
fdodino commented 7 months ago

No estoy logueando en el programa tampoco lo que se emita por consola, para tratar de no ser muy verboso (tampoco estoy muy seguro si tiene sentido, tenemos github para ver en qué estado estaba la cosa en un momento determinado)

PalumboN commented 7 months ago

Buenísimo Fer, muy groso!! :D

Yo de los juegos loggearia al menos que se ejecutó un game (sin info de lo que pasa dentro). Pero eso al menos me deja ver cuántas veces se probó el juego durante el desarrollo (y si se puede tener el tiempo que estuvo corriendo el juego mejor). Con eso podemos hacer estudios sobre testing manual vs automatizado :)

Por otro lado, me parece bien que estés yendo a por todo con la info de logging. Si en producción detectamos que el archivo se va a la mierda en tamaño podemos tunearlo iterativamente luego.

Abrazo grande!

PalumboN commented 6 months ago

@fdodino este issue ya está? Si quedaron cosas podemos moverlas a otro issue y cerrar este.

fdodino commented 6 months ago

@PalumboN , sí, no se por qué no lo cerré cuando lo implementamos. Bien revisando issues!