Skip to content

Commit cfab415

Browse files
committed
add MCP telemetry events
1 parent b376399 commit cfab415

File tree

2 files changed

+123
-7
lines changed

2 files changed

+123
-7
lines changed

apps/language_server/lib/language_server/mcp/request_handler.ex

Lines changed: 120 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ defmodule ElixirLS.LanguageServer.MCP.RequestHandler do
66

77
require Logger
88
alias JasonV
9+
alias ElixirLS.LanguageServer.JsonRpc
910

1011
alias ElixirLS.LanguageServer.Providers.ExecuteCommand.{
1112
LlmDocsAggregator,
@@ -23,16 +24,131 @@ defmodule ElixirLS.LanguageServer.MCP.RequestHandler do
2324
def handle_request(request) do
2425
case request do
2526
%{"method" => "initialize", "id" => id} ->
26-
handle_initialize(id)
27+
try do
28+
start_time = System.monotonic_time(:millisecond)
29+
response = handle_initialize(id)
30+
elapsed = System.monotonic_time(:millisecond) - start_time
31+
32+
JsonRpc.telemetry("mcp_request", %{"elixir_ls.mcp_command" => "initialize"}, %{
33+
"elixir_ls.mcp_request_time" => elapsed
34+
})
35+
36+
response
37+
rescue
38+
e ->
39+
message = Exception.format(:error, e, __STACKTRACE__)
40+
Logger.error("Error handling initialize: #{message}")
41+
42+
JsonRpc.telemetry(
43+
"mcp_request_error",
44+
%{
45+
"elixir_ls.mcp_command" => "initialize",
46+
"elixir_ls.mcp_error" => "internal_error",
47+
"elixir_ls.mcp_error_message" => message
48+
},
49+
%{}
50+
)
51+
52+
%{
53+
"jsonrpc" => "2.0",
54+
"error" => %{
55+
"code" => -32603,
56+
"message" => "Internal error"
57+
},
58+
"id" => id
59+
}
60+
end
2761

2862
%{"method" => "tools/list", "id" => id} ->
29-
handle_tools_list(id)
63+
try do
64+
start_time = System.monotonic_time(:millisecond)
65+
response = handle_tools_list(id)
66+
67+
elapsed = System.monotonic_time(:millisecond) - start_time
68+
69+
JsonRpc.telemetry("mcp_request", %{"elixir_ls.mcp_command" => "tools_list"}, %{
70+
"elixir_ls.mcp_request_time" => elapsed
71+
})
72+
73+
response
74+
rescue
75+
e ->
76+
message = Exception.format(:error, e, __STACKTRACE__)
77+
Logger.error("Error handling tools list call: #{message}")
78+
79+
JsonRpc.telemetry(
80+
"mcp_request_error",
81+
%{
82+
"elixir_ls.mcp_command" => "tools_list",
83+
"elixir_ls.mcp_error" => "internal_error",
84+
"elixir_ls.mcp_error_message" => message
85+
},
86+
%{}
87+
)
88+
89+
%{
90+
"jsonrpc" => "2.0",
91+
"error" => %{
92+
"code" => -32603,
93+
"message" => "Internal error"
94+
},
95+
"id" => id
96+
}
97+
end
3098

3199
%{"method" => "tools/call", "params" => params, "id" => id} ->
32-
handle_tool_call(params, id)
100+
tool_call = Map.get(params, "name", "")
101+
102+
try do
103+
start_time = System.monotonic_time(:millisecond)
104+
105+
response = handle_tool_call(params, id)
106+
107+
elapsed = System.monotonic_time(:millisecond) - start_time
108+
109+
JsonRpc.telemetry(
110+
"mcp_request",
111+
%{"elixir_ls.mcp_command" => "tools_call_#{tool_call}"},
112+
%{
113+
"elixir_ls.mcp_request_time" => elapsed
114+
}
115+
)
116+
117+
response
118+
rescue
119+
e ->
120+
message = Exception.format(:error, e, __STACKTRACE__)
121+
Logger.error("Error handling tool call: #{message}")
122+
123+
JsonRpc.telemetry(
124+
"mcp_request_error",
125+
%{
126+
"elixir_ls.mcp_command" => "tools_call_#{tool_call}",
127+
"elixir_ls.mcp_error" => "internal_error",
128+
"elixir_ls.mcp_error_message" => message
129+
},
130+
%{}
131+
)
132+
133+
%{
134+
"jsonrpc" => "2.0",
135+
"error" => %{
136+
"code" => -32603,
137+
"message" => "Internal error"
138+
},
139+
"id" => id
140+
}
141+
end
33142

34143
%{"method" => "notifications/cancelled", "params" => params} ->
35-
handle_notification_cancelled(params)
144+
try do
145+
handle_notification_cancelled(params)
146+
rescue
147+
e ->
148+
message = Exception.format(:error, e, __STACKTRACE__)
149+
Logger.error("Error handling tool call: #{message}")
150+
nil
151+
end
36152

37153
%{"method" => method, "id" => id} ->
38154
%{

apps/language_server/lib/language_server/server.ex

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -260,7 +260,7 @@ defmodule ElixirLS.LanguageServer.Server do
260260
%{
261261
"elixir_ls.lsp_command" => String.replace(command, "/", "_"),
262262
"elixir_ls.lsp_error" => "serialization_error",
263-
"elixir_ls.lsp_error" => error_msg
263+
"elixir_ls.lsp_error_message" => error_msg
264264
},
265265
%{}
266266
)
@@ -925,7 +925,7 @@ defmodule ElixirLS.LanguageServer.Server do
925925
%{
926926
"elixir_ls.lsp_command" => "initialize",
927927
"elixir_ls.lsp_error" => "serialization_error",
928-
"elixir_ls.lsp_error" => error_msg
928+
"elixir_ls.lsp_error_message" => error_msg
929929
},
930930
%{}
931931
)
@@ -1055,7 +1055,7 @@ defmodule ElixirLS.LanguageServer.Server do
10551055
%{
10561056
"elixir_ls.lsp_command" => String.replace(command, "/", "_"),
10571057
"elixir_ls.lsp_error" => "serialization_error",
1058-
"elixir_ls.lsp_error" => error_msg
1058+
"elixir_ls.lsp_error_message" => error_msg
10591059
},
10601060
%{}
10611061
)

0 commit comments

Comments
 (0)