1
+ defmodule NextLS.OpentelemetrySchematic do
2
+ @ moduledoc false
3
+ require Logger
4
+
5
+ @ tracer_id __MODULE__
6
+
7
+ def setup do
8
+ :ok =
9
+ :telemetry . attach_many (
10
+ "schematic-handler" ,
11
+ [
12
+ [ :schematic , :unify , :start ] ,
13
+ [ :schematic , :unify , :stop ]
14
+ ] ,
15
+ & __MODULE__ . process / 4 ,
16
+ nil
17
+ )
18
+ end
19
+
20
+ def process ( [ :schematic , :unify , :start ] , _measurements , metadata , _config ) do
21
+ OpentelemetryTelemetry . start_telemetry_span (
22
+ @ tracer_id ,
23
+ :"schematic.unify.#{ metadata . kind } #{ metadata . dir } " ,
24
+ metadata ,
25
+ % { kind: :server , attributes: metadata }
26
+ )
27
+ end
28
+
29
+ def process ( [ :schematic , :unify , :stop ] , _measurements , metadata , _config ) do
30
+ OpentelemetryTelemetry . set_current_telemetry_span ( @ tracer_id , metadata )
31
+ OpentelemetryTelemetry . end_telemetry_span ( @ tracer_id , metadata )
32
+ end
33
+ end
34
+
35
+ defmodule NextLS.OpentelemetryGenLSP do
36
+ @ moduledoc false
37
+ require Logger
38
+ require OpenTelemetry.Tracer , as: Tracer
39
+
40
+ @ tracer_id __MODULE__
41
+
42
+ def setup do
43
+ :ok =
44
+ :telemetry . attach_many (
45
+ "gen-lsp-handler" ,
46
+ [
47
+ [ :gen_lsp , :loop , :start ] ,
48
+ [ :gen_lsp , :loop , :stop ] ,
49
+ [ :gen_lsp , :notification , :emit ] ,
50
+ [ :gen_lsp , :info , :start ] ,
51
+ [ :gen_lsp , :info , :stop ] ,
52
+ [ :gen_lsp , :buffer , :read ] ,
53
+ [ :gen_lsp , :buffer , :write ]
54
+ ] ,
55
+ & __MODULE__ . process / 4 ,
56
+ nil
57
+ )
58
+ end
59
+
60
+ def process ( [ :gen_lsp , :buffer , :read ] , _measurements , metadata , _config ) do
61
+ OpenTelemetry.Ctx . clear ( )
62
+
63
+ OpentelemetryTelemetry . start_telemetry_span ( @ tracer_id , :"gen_lsp.read" , metadata , % {
64
+ kind: :server ,
65
+ attributes: metadata
66
+ } )
67
+ end
68
+
69
+ def process ( [ :gen_lsp , :loop , :start ] , _measurements , metadata , _config ) do
70
+ parent_context = OpentelemetryProcessPropagator . fetch_parent_ctx ( 1 , :"$callers" )
71
+
72
+ if parent_context != :undefined do
73
+ OpenTelemetry.Ctx . attach ( parent_context )
74
+ end
75
+
76
+ Tracer . update_name ( :"gen_lsp.receive.#{ metadata . type } #{ metadata . method } " )
77
+ end
78
+
79
+ def process ( [ :gen_lsp , :loop , :stop ] , _measurements , % { type: :request , reply: true } = _metadata , _config ) do
80
+ OpenTelemetry.Ctx . clear ( )
81
+ end
82
+
83
+ def process ( [ :gen_lsp , :loop , :stop ] , _measurements , metadata , _config ) do
84
+ OpentelemetryTelemetry . set_current_telemetry_span ( @ tracer_id , metadata )
85
+ OpentelemetryTelemetry . end_telemetry_span ( @ tracer_id , metadata )
86
+ OpenTelemetry.Ctx . clear ( )
87
+ end
88
+
89
+ def process ( [ :gen_lsp , :notification , :emit ] , _measurements , metadata , _config ) do
90
+ OpentelemetryTelemetry . start_telemetry_span (
91
+ @ tracer_id ,
92
+ :"gen_lsp.send.notification #{ metadata . method } " ,
93
+ metadata ,
94
+ % {
95
+ kind: :server ,
96
+ attributes: metadata
97
+ }
98
+ )
99
+ end
100
+
101
+ def process ( [ :gen_lsp , :buffer , :write ] , _measurements , metadata , _config ) do
102
+ parent_context = OpentelemetryProcessPropagator . fetch_parent_ctx ( 1 , :"$callers" )
103
+
104
+ if parent_context != :undefined do
105
+ OpenTelemetry.Ctx . attach ( parent_context )
106
+ end
107
+
108
+ OpentelemetryTelemetry . set_current_telemetry_span ( @ tracer_id , metadata )
109
+ OpentelemetryTelemetry . end_telemetry_span ( @ tracer_id , metadata )
110
+ OpenTelemetry.Ctx . clear ( )
111
+ end
112
+ end
113
+
1
114
defmodule NextLS.Application do
2
115
# See https://hexdocs.pm/elixir/Application.html
3
116
# for more information on OTP Applications
@@ -7,6 +120,8 @@ defmodule NextLS.Application do
7
120
8
121
@ impl true
9
122
def start ( _type , _args ) do
123
+ Logger . add_handlers ( :next_ls )
124
+
10
125
case System . cmd ( "epmd" , [ "-daemon" ] , stderr_to_stdout: true ) do
11
126
{ _ , 0 } ->
12
127
:ok
@@ -19,11 +134,21 @@ defmodule NextLS.Application do
19
134
20
135
Node . start ( :"next-ls-#{ System . system_time ( ) } " , :shortnames )
21
136
22
- children = [ NextLS.LSPSupervisor ]
137
+ children = [
138
+ NextLS.UI.CodeReloader ,
139
+ { Registry , name: NextLS.UI.Registry , keys: :duplicate } ,
140
+ NextLS.LSPSupervisor
141
+ ]
23
142
24
143
# See https://hexdocs.pm/elixir/Supervisor.html
25
144
# for other strategies and supported options
26
145
opts = [ strategy: :one_for_one , name: NextLS.Supervisor ]
27
- Supervisor . start_link ( children , opts )
146
+ Supervisor . start_link ( children ++ asset_children ( ) , opts )
147
+ end
148
+
149
+ def asset_children do
150
+ for conf <- Application . get_env ( :next_ls , :assets , [ ] ) do
151
+ { NextLS.UI.Assets , conf }
152
+ end
28
153
end
29
154
end
0 commit comments