1
0
mirror of https://github.com/golang/go synced 2024-11-05 23:26:18 -07:00
go/gopls/integration/replay/README.md
Rob Findley 9497f49d57 gopls/integration: cosmetic/ergonomic updates
Some ergonomic and cosmetic updates are made to the integration/replay
and integration/parse packages, following a pass through the code:
 + In the README, a some typos are corrected.
 + A few symbols are renamed:
   - Direction->MsgType, since this type is more than a client-server
     direction
   - logRec->scanLogs, to be more consistent with the naming convention
     SplitFuncs in the bufio package
   - CamelCase is applied in a few places.
 + Context is plumbed through, rather than use a package local ctx.
 + In a few cases, returning an error is preferred over log.Fatal.
 + Some duplicated code is deleted, and types from the parse package are
   reused. (this was probably cruft from the repo migration)
 + The logfile is made an argument rather than a flag to the replay
   tool.

Change-Id: Ie72e6e8a4d7020d8cf708f6791353897791bcc86
Reviewed-on: https://go-review.googlesource.com/c/tools/+/211057
Reviewed-by: Peter Weinberger <pjw@google.com>
2020-01-02 14:09:08 +00:00

80 lines
3.6 KiB
Markdown

# Replaying Logs
The LSP log replayer takes a log from a gopls session, starts up an instance of gopls,
and tries to replay the session. It produces a log from the replayed session and reports
some comparative statistics of the two logs.
```replay -log <logfile>```
The `logfile` should be the log produced by gopls. It will have a name like
`/tmp/gopls-89775` or, on a Mac, `$TMPDIR/gopls-29388`.
If `replay` cannot find a copy of gopls to execute, use `-cmd <path to gopls>`.
It looks in the same places where `go install` would put its output,
namely `$GOBIN/gopls`, `$GOPATH/bin/gopls`, `$HOME/go/bin/gopls`.
The log for the replayed session is saved in `/tmp/seen`.
There is aloso a boolean argument `-cmp` which compares the log file
with `/tmp/seen` without invoking gopls and rerunning the session.
The output is fairly cryptic, and generated by logging. Ideas for better output would be welcome.
Here's an example, with intermingled comments:
```
main.go:50: old 1856, hist:[10:177 30:1 100:0 300:3 1000:4 ]
```
This says that the original log had 1856 records in it. The histogram is
counting how long RPCs took, in milliseconds. In this case 177 took no more
than 10ms, and 4 took between 300ms and 1000ms.
```
main.go:53: calling mimic
main.go:293: mimic 1856
```
This is a reminder that it's replaying in a new session, with a log file
containing 1856 records
```
main.go:61: new 1846, hist:[10:181 30:1 100:1 300:1 1000:1 ]
```
The new session produced 1846 log records (that's 10 fewer),
and a vaguely similar histogram.
```
main.go:96: old: clrequest:578 clresponse:185 svrequest:2 svresponse:2 toserver:244 toclient:460 reporterr:385
main.go:96: new: clrequest:571 clresponse:185 svrequest:2 svresponse:2 toserver:241 toclient:460 reporterr:385
```
The first line is for the original log, the second for the new log. The new log has 7 fewer RPC requests
from the client *clrequest* (578 vs 571), the same number of client responses *clresponse*, 3 fewer
notifications *toserver* from the client, the same number from the server *toclient* to the client, and
the same number of errors *reporterr*. (That's mysterious, but a look at the ends of the log files shows
that the original session ended with several RPCs that don't show up, for whatever reason, in the new session.)
Finally, there are counts of the various notifications seen, in the new log and the old log, and
which direction they went. (The 3 fewer notifications in the summary above can be seen here to be from cancels
and a didChange.)
```
main.go:107: counts of notifications
main.go:110: '$/cancelRequest'. new toserver 1
main.go:110: '$/cancelRequest'. old toserver 3
main.go:110: 'initialized'. new toserver 1
main.go:110: 'initialized'. old toserver 1
main.go:110: 'textDocument/didChange'. new toserver 231
main.go:110: 'textDocument/didChange'. old toserver 232
main.go:110: 'textDocument/didOpen'. new toserver 1
main.go:110: 'textDocument/didOpen'. old toserver 1
main.go:110: 'textDocument/didSave'. new toserver 7
main.go:110: 'textDocument/didSave'. old toserver 7
main.go:110: 'textDocument/publishDiagnostics'. new toclient 182
main.go:110: 'textDocument/publishDiagnostics'. old toclient 182
main.go:110: 'window/logMessage'. new toclient 278
main.go:110: 'window/logMessage'. old toclient 278
```
### Caveats
Replay cannot restore the exact environment gopls saw for the original session.
For instance, the first didOpen message in the new session will see the file
as it was left by the original session.
Gopls invokes various tools, and the environment they see could have changed too.
Replay will use the gopls it finds (or is given). It has no way of using
the same version that created the original session.