@@ -130,12 +130,32 @@ defmodule ElixirLS.LanguageServer.Server do
130
130
131
131
@ impl GenServer
132
132
def handle_call ( { :request_finished , id , result } , _from , state = % __MODULE__ { } ) do
133
+ { { _pid , command , start_time } , requests } = Map . pop! ( state . requests , id )
134
+
133
135
case result do
134
- { :error , type , msg } -> JsonRpc . respond_with_error ( id , type , msg )
135
- { :ok , result } -> JsonRpc . respond ( id , result )
136
+ { :error , type , msg } ->
137
+ JsonRpc . respond_with_error ( id , type , msg )
138
+
139
+ JsonRpc . telemetry (
140
+ "elixir_ls.lsp_request_error" ,
141
+ % {
142
+ "elixir_ls.lsp_command" => command ,
143
+ "elixir_ls.lsp_error" => type ,
144
+ "elixir_ls.lsp_error_message" => msg
145
+ } ,
146
+ % { }
147
+ )
148
+
149
+ { :ok , result } ->
150
+ elapsed = System . monotonic_time ( :millisecond ) - start_time
151
+ JsonRpc . respond ( id , result )
152
+
153
+ JsonRpc . telemetry ( "elixir_ls.lsp_request" , % { "elixir_ls.lsp_command" => command } , % {
154
+ "elixir_ls.lsp_request_time" => elapsed
155
+ } )
136
156
end
137
157
138
- state = % { state | requests: Map . delete ( state . requests , id ) }
158
+ state = % { state | requests: requests }
139
159
{ :reply , :ok , state }
140
160
end
141
161
@@ -259,10 +279,21 @@ defmodule ElixirLS.LanguageServer.Server do
259
279
@ impl GenServer
260
280
def handle_info ( { :DOWN , _ref , :process , pid , reason } , % __MODULE__ { requests: requests } = state ) do
261
281
state =
262
- case Enum . find ( requests , & match? ( { _ , ^ pid } , & 1 ) ) do
263
- { id , _ } ->
282
+ case Enum . find ( requests , & match? ( { _ , { ^ pid , _ , _ } } , & 1 ) ) do
283
+ { id , { ^ pid , command , _start_time } } ->
264
284
error_msg = Exception . format_exit ( reason )
265
285
JsonRpc . respond_with_error ( id , :server_error , error_msg )
286
+
287
+ JsonRpc . telemetry (
288
+ "elixir_ls.lsp_request_error" ,
289
+ % {
290
+ "elixir_ls.lsp_command" => command ,
291
+ "elixir_ls.lsp_error" => :server_error ,
292
+ "elixir_ls.lsp_error_message" => error_msg
293
+ } ,
294
+ % { }
295
+ )
296
+
266
297
% { state | requests: Map . delete ( requests , id ) }
267
298
268
299
nil ->
@@ -360,9 +391,10 @@ defmodule ElixirLS.LanguageServer.Server do
360
391
361
392
defp handle_notification ( cancel_request ( id ) , % __MODULE__ { requests: requests } = state ) do
362
393
case requests do
363
- % { ^ id => pid } ->
394
+ % { ^ id => { pid , _command , _start_time } } ->
364
395
Process . exit ( pid , :cancelled )
365
396
JsonRpc . respond_with_error ( id , :request_cancelled , "Request cancelled" )
397
+
366
398
% { state | requests: Map . delete ( requests , id ) }
367
399
368
400
_ ->
@@ -579,40 +611,132 @@ defmodule ElixirLS.LanguageServer.Server do
579
611
state = % __MODULE__ { server_instance_id: server_instance_id }
580
612
)
581
613
when not is_initialized ( server_instance_id ) do
614
+ start_time = System . monotonic_time ( :millisecond )
615
+
582
616
case packet do
583
617
initialize_req ( _id , _root_uri , _client_capabilities ) ->
584
618
{ :ok , result , state } = handle_request ( packet , state )
619
+ elapsed = System . monotonic_time ( :millisecond ) - start_time
585
620
JsonRpc . respond ( id , result )
621
+
622
+ JsonRpc . telemetry ( "elixir_ls.lsp_request" , % { "elixir_ls.lsp_command" => "initialize" } , % {
623
+ "elixir_ls.lsp_request_time" => elapsed
624
+ } )
625
+
586
626
state
587
627
588
628
_ ->
589
629
JsonRpc . respond_with_error ( id , :server_not_initialized )
630
+
631
+ JsonRpc . telemetry (
632
+ "elixir_ls.lsp_request_error" ,
633
+ % {
634
+ "elixir_ls.lsp_command" => "initialize" ,
635
+ "elixir_ls.lsp_error" => :server_not_initialized ,
636
+ "elixir_ls.lsp_error_message" => "Server not initialized"
637
+ } ,
638
+ % { }
639
+ )
640
+
590
641
state
591
642
end
592
643
end
593
644
594
- defp handle_request_packet ( id , packet , state = % __MODULE__ { received_shutdown?: false } ) do
595
- case handle_request ( packet , state ) do
596
- { :ok , result , state } ->
597
- JsonRpc . respond ( id , result )
598
- state
645
+ defp handle_request_packet (
646
+ id ,
647
+ packet = % { "method" => command } ,
648
+ state = % __MODULE__ { received_shutdown?: false }
649
+ ) do
650
+ command =
651
+ case packet do
652
+ execute_command_req ( _id , custom_command_with_server_id , _args ) ->
653
+ command <> ":" <> ( ExecuteCommand . get_command ( custom_command_with_server_id ) || "" )
654
+
655
+ _ ->
656
+ command
657
+ end
658
+
659
+ start_time = System . monotonic_time ( :millisecond )
660
+
661
+ try do
662
+ case handle_request ( packet , state ) do
663
+ { :ok , result , state } ->
664
+ elapsed = System . monotonic_time ( :millisecond ) - start_time
665
+ JsonRpc . respond ( id , result )
666
+
667
+ JsonRpc . telemetry ( "elixir_ls.lsp_request" , % { "elixir_ls.lsp_command" => command } , % {
668
+ "elixir_ls.lsp_request_time" => elapsed
669
+ } )
670
+
671
+ state
672
+
673
+ { :error , type , msg , state } ->
674
+ JsonRpc . respond_with_error ( id , type , msg )
675
+
676
+ JsonRpc . telemetry (
677
+ "elixir_ls.lsp_request_error" ,
678
+ % {
679
+ "elixir_ls.lsp_command" => command ,
680
+ "elixir_ls.lsp_error" => type ,
681
+ "elixir_ls.lsp_error_message" => msg
682
+ } ,
683
+ % { }
684
+ )
685
+
686
+ state
687
+
688
+ { :async , fun , state } ->
689
+ { pid , _ref } = handle_request_async ( id , fun )
690
+ % { state | requests: Map . put ( state . requests , id , { pid , command , start_time } ) }
691
+ end
692
+ rescue
693
+ e in InvalidParamError ->
694
+ JsonRpc . respond_with_error ( id , :invalid_params , e . message )
695
+
696
+ JsonRpc . telemetry (
697
+ "elixir_ls.lsp_request_error" ,
698
+ % {
699
+ "elixir_ls.lsp_command" => command ,
700
+ "elixir_ls.lsp_error" => :invalid_params ,
701
+ "elixir_ls.lsp_error_message" => e . message
702
+ } ,
703
+ % { }
704
+ )
599
705
600
- { :error , type , msg , state } ->
601
- JsonRpc . respond_with_error ( id , type , msg )
602
706
state
707
+ catch
708
+ kind , payload ->
709
+ { payload , stacktrace } = Exception . blame ( kind , payload , __STACKTRACE__ )
710
+ error_msg = Exception . format ( kind , payload , stacktrace )
711
+ JsonRpc . respond_with_error ( id , :server_error , error_msg )
712
+
713
+ JsonRpc . telemetry (
714
+ "elixir_ls.lsp_request_error" ,
715
+ % {
716
+ "elixir_ls.lsp_command" => command ,
717
+ "elixir_ls.lsp_error" => :server_error ,
718
+ "elixir_ls.lsp_error_message" => error_msg
719
+ } ,
720
+ % { }
721
+ )
603
722
604
- { :async , fun , state } ->
605
- { pid , _ref } = handle_request_async ( id , fun )
606
- % { state | requests: Map . put ( state . requests , id , pid ) }
723
+ state
607
724
end
608
- rescue
609
- e in InvalidParamError ->
610
- JsonRpc . respond_with_error ( id , :invalid_params , e . message )
611
- state
612
725
end
613
726
614
- defp handle_request_packet ( id , _packet , state = % __MODULE__ { } ) do
727
+ defp handle_request_packet ( id , _packet = % { "method" => command } , state = % __MODULE__ { } ) do
615
728
JsonRpc . respond_with_error ( id , :invalid_request )
729
+
730
+ JsonRpc . telemetry (
731
+ "elixir_ls.lsp_request_error" ,
732
+ % {
733
+ "elixir_ls.lsp_command" => command ,
734
+ "elixir_ls.lsp_error" => :invalid_request ,
735
+ "elixir_ls.lsp_error_message" => "Invalid Request"
736
+ } ,
737
+ % { }
738
+ )
739
+
616
740
state
617
741
end
618
742
0 commit comments