chore: add debug logs (#409)

Add debug logs to API and MCP server.

Example of debug logs added:
```
2025-04-07T11:12:04.62309-07:00 DEBUG "tool name: list_flights_by_arrival_airport"
2025-04-07T11:12:04.623264-07:00 DEBUG "tool invocation authorized"
2025-04-07T11:12:04.623717-07:00 DEBUG "invocation params: [{departure_airport SFO} {date 2025-04-07}]"
```
This commit is contained in:
Yuan
2025-04-07 12:27:31 -07:00
committed by GitHub
parent b81feb61e6
commit 75d2296d7a
2 changed files with 17 additions and 10 deletions

View File

@@ -15,7 +15,6 @@
package server
import (
"context"
"encoding/json"
"fmt"
"io"
@@ -55,6 +54,7 @@ func toolsetHandler(s *Server, w http.ResponseWriter, r *http.Request) {
r = r.WithContext(ctx)
toolsetName := chi.URLParam(r, "toolsetName")
s.logger.DebugContext(ctx, fmt.Sprintf("toolset name: %s", toolsetName))
span.SetAttributes(attribute.String("toolset_name", toolsetName))
var err error
defer func() {
@@ -78,7 +78,7 @@ func toolsetHandler(s *Server, w http.ResponseWriter, r *http.Request) {
toolset, ok := s.toolsets[toolsetName]
if !ok {
err = fmt.Errorf("Toolset %q does not exist", toolsetName)
s.logger.DebugContext(context.Background(), err.Error())
s.logger.DebugContext(ctx, err.Error())
_ = render.Render(w, r, newErrResponse(err, http.StatusNotFound))
return
}
@@ -91,6 +91,7 @@ func toolGetHandler(s *Server, w http.ResponseWriter, r *http.Request) {
r = r.WithContext(ctx)
toolName := chi.URLParam(r, "toolName")
s.logger.DebugContext(ctx, fmt.Sprintf("tool name: %s", toolName))
span.SetAttributes(attribute.String("tool_name", toolName))
var err error
defer func() {
@@ -113,7 +114,7 @@ func toolGetHandler(s *Server, w http.ResponseWriter, r *http.Request) {
tool, ok := s.tools[toolName]
if !ok {
err = fmt.Errorf("invalid tool name: tool with name %q does not exist", toolName)
s.logger.DebugContext(context.Background(), err.Error())
s.logger.DebugContext(ctx, err.Error())
_ = render.Render(w, r, newErrResponse(err, http.StatusNotFound))
return
}
@@ -134,6 +135,7 @@ func toolInvokeHandler(s *Server, w http.ResponseWriter, r *http.Request) {
r = r.WithContext(ctx)
toolName := chi.URLParam(r, "toolName")
s.logger.DebugContext(ctx, fmt.Sprintf("tool name: %s", toolName))
span.SetAttributes(attribute.String("tool_name", toolName))
var err error
defer func() {
@@ -157,7 +159,7 @@ func toolInvokeHandler(s *Server, w http.ResponseWriter, r *http.Request) {
tool, ok := s.tools[toolName]
if !ok {
err = fmt.Errorf("invalid tool name: tool with name %q does not exist", toolName)
s.logger.DebugContext(context.Background(), err.Error())
s.logger.DebugContext(ctx, err.Error())
_ = render.Render(w, r, newErrResponse(err, http.StatusNotFound))
return
}
@@ -168,7 +170,7 @@ func toolInvokeHandler(s *Server, w http.ResponseWriter, r *http.Request) {
for _, aS := range s.authServices {
claims, err := aS.GetClaimsFromHeader(r.Header)
if err != nil {
s.logger.DebugContext(context.Background(), err.Error())
s.logger.DebugContext(ctx, err.Error())
continue
}
if claims == nil {
@@ -190,16 +192,17 @@ func toolInvokeHandler(s *Server, w http.ResponseWriter, r *http.Request) {
isAuthorized := tool.Authorized(verifiedAuthServices)
if !isAuthorized {
err = fmt.Errorf("tool invocation not authorized. Please make sure your specify correct auth headers")
s.logger.DebugContext(context.Background(), err.Error())
s.logger.DebugContext(ctx, err.Error())
_ = render.Render(w, r, newErrResponse(err, http.StatusUnauthorized))
return
}
s.logger.DebugContext(ctx, "tool invocation authorized")
var data map[string]any
if err = decodeJSON(r.Body, &data); err != nil {
render.Status(r, http.StatusBadRequest)
err = fmt.Errorf("request body was invalid JSON: %w", err)
s.logger.DebugContext(context.Background(), err.Error())
s.logger.DebugContext(ctx, err.Error())
_ = render.Render(w, r, newErrResponse(err, http.StatusBadRequest))
return
}
@@ -207,15 +210,16 @@ func toolInvokeHandler(s *Server, w http.ResponseWriter, r *http.Request) {
params, err := tool.ParseParams(data, claimsFromAuth)
if err != nil {
err = fmt.Errorf("provided parameters were invalid: %w", err)
s.logger.DebugContext(context.Background(), err.Error())
s.logger.DebugContext(ctx, err.Error())
_ = render.Render(w, r, newErrResponse(err, http.StatusBadRequest))
return
}
s.logger.DebugContext(ctx, fmt.Sprintf("invocation params: %s", params))
res, err := tool.Invoke(params)
if err != nil {
err = fmt.Errorf("error while invoking tool: %w", err)
s.logger.DebugContext(context.Background(), err.Error())
s.logger.DebugContext(ctx, err.Error())
_ = render.Render(w, r, newErrResponse(err, http.StatusInternalServerError))
return
}
@@ -223,7 +227,7 @@ func toolInvokeHandler(s *Server, w http.ResponseWriter, r *http.Request) {
resMarshal, err := json.Marshal(res)
if err != nil {
err = fmt.Errorf("unable to marshal result: %w", err)
s.logger.DebugContext(context.Background(), err.Error())
s.logger.DebugContext(ctx, err.Error())
_ = render.Render(w, r, newErrResponse(err, http.StatusInternalServerError))
return
}

View File

@@ -231,6 +231,7 @@ func mcpHandler(s *Server, w http.ResponseWriter, r *http.Request) {
}
id = fmt.Sprintf("%s", baseMessage.Id)
method = baseMessage.Method
s.logger.DebugContext(ctx, fmt.Sprintf("method is: %s", method))
var res mcp.JSONRPCMessage
switch baseMessage.Method {
@@ -279,6 +280,7 @@ func mcpHandler(s *Server, w http.ResponseWriter, r *http.Request) {
}
toolName = req.Params.Name
toolArgument := req.Params.Arguments
s.logger.DebugContext(ctx, fmt.Sprintf("tool name: %s", toolName))
tool, ok := s.tools[toolName]
if !ok {
err = fmt.Errorf("invalid tool name: tool with name %q does not exist", toolName)
@@ -314,6 +316,7 @@ func mcpHandler(s *Server, w http.ResponseWriter, r *http.Request) {
res = newJSONRPCError(baseMessage.Id, mcp.INVALID_PARAMS, err.Error(), nil)
break
}
s.logger.DebugContext(ctx, fmt.Sprintf("invocation params: %s", params))
result := mcp.ToolCall(tool, params)
res = mcp.JSONRPCResponse{