Skip to content

Commit 20404d6

Browse files
committed
Enhance logging in client connection methods and state transitions
- Added detailed debug logging in Connect and ConnectAll methods to track connection attempts and client states. - Improved error messages for connection state checks in the Client struct. - Implemented validation logging for state transitions in StateManager to capture invalid transitions.
1 parent 419f769 commit 20404d6

3 files changed

Lines changed: 79 additions & 10 deletions

File tree

internal/upstream/client.go

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,11 +144,32 @@ func (c *Client) onStateChange(oldState, newState ConnectionState, info Connecti
144144

145145
// Connect establishes a connection to the upstream MCP server
146146
func (c *Client) Connect(ctx context.Context) error {
147+
c.logger.Debug("Connect method called",
148+
zap.String("server", c.config.Name),
149+
zap.String("url", c.config.URL),
150+
zap.String("command", c.config.Command),
151+
zap.String("protocol", c.config.Protocol),
152+
zap.Bool("enabled", c.config.Enabled),
153+
zap.Bool("quarantined", c.config.Quarantined),
154+
zap.String("current_state", c.stateManager.GetState().String()),
155+
zap.Bool("is_connecting", c.stateManager.IsConnecting()),
156+
zap.Bool("is_ready", c.stateManager.IsReady()))
157+
147158
// Check if already connecting or connected
148159
if c.stateManager.IsConnecting() || c.stateManager.IsReady() {
149-
return fmt.Errorf("connection already in progress or established")
160+
errMsg := fmt.Sprintf("connection already in progress or established (state: %s)", c.stateManager.GetState().String())
161+
c.logger.Debug("Connect aborted - already in progress or connected",
162+
zap.String("server", c.config.Name),
163+
zap.String("current_state", c.stateManager.GetState().String()))
164+
return fmt.Errorf(errMsg)
150165
}
151166

167+
c.logger.Info("Starting connection to upstream MCP server",
168+
zap.String("server", c.config.Name),
169+
zap.String("url", c.config.URL),
170+
zap.String("command", c.config.Command),
171+
zap.String("protocol", c.config.Protocol))
172+
152173
// Transition to connecting state
153174
c.stateManager.TransitionTo(StateConnecting)
154175

internal/upstream/manager.go

Lines changed: 49 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -365,28 +365,68 @@ func (m *Manager) ConnectAll(ctx context.Context) error {
365365
}
366366
m.mu.RUnlock()
367367

368+
m.logger.Debug("ConnectAll starting",
369+
zap.Int("total_clients", len(clients)))
370+
368371
var wg sync.WaitGroup
369372
for id, client := range clients {
373+
m.logger.Debug("Evaluating client for connection",
374+
zap.String("id", id),
375+
zap.String("name", client.config.Name),
376+
zap.Bool("enabled", client.config.Enabled),
377+
zap.Bool("is_connected", client.IsConnected()),
378+
zap.Bool("is_connecting", client.IsConnecting()),
379+
zap.String("current_state", client.GetState().String()),
380+
zap.Bool("quarantined", client.config.Quarantined))
381+
370382
if !client.config.Enabled {
383+
m.logger.Debug("Skipping disabled client",
384+
zap.String("id", id),
385+
zap.String("name", client.config.Name))
386+
371387
if client.IsConnected() {
372388
m.logger.Info("Disconnecting disabled client", zap.String("id", id), zap.String("name", client.config.Name))
373389
_ = client.Disconnect()
374390
}
375391
continue
376392
}
377393

394+
// Check connection eligibility with detailed logging
395+
if client.IsConnected() {
396+
m.logger.Debug("Client already connected, skipping",
397+
zap.String("id", id),
398+
zap.String("name", client.config.Name))
399+
continue
400+
}
401+
402+
if client.IsConnecting() {
403+
m.logger.Debug("Client already connecting, skipping",
404+
zap.String("id", id),
405+
zap.String("name", client.config.Name))
406+
continue
407+
}
408+
409+
m.logger.Info("Attempting to connect client",
410+
zap.String("id", id),
411+
zap.String("name", client.config.Name),
412+
zap.String("url", client.config.URL),
413+
zap.String("command", client.config.Command),
414+
zap.String("protocol", client.config.Protocol))
415+
378416
wg.Add(1)
379417
go func(id string, c *Client) {
380418
defer wg.Done()
381-
// Only connect if not already connected or trying to connect
382-
if !c.IsConnected() && !c.IsConnecting() {
383-
if err := c.Connect(ctx); err != nil {
384-
m.logger.Error("Failed to connect to upstream server",
385-
zap.String("id", id),
386-
zap.String("name", c.config.Name),
387-
zap.String("state", c.GetState().String()),
388-
zap.Error(err))
389-
}
419+
420+
if err := c.Connect(ctx); err != nil {
421+
m.logger.Error("Failed to connect to upstream server",
422+
zap.String("id", id),
423+
zap.String("name", c.config.Name),
424+
zap.String("state", c.GetState().String()),
425+
zap.Error(err))
426+
} else {
427+
m.logger.Info("Successfully initiated connection to upstream server",
428+
zap.String("id", id),
429+
zap.String("name", c.config.Name))
390430
}
391431
}(id, client)
392432
}

internal/upstream/state.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,14 @@ func (sm *StateManager) GetConnectionInfo() ConnectionInfo {
108108
func (sm *StateManager) TransitionTo(newState ConnectionState) {
109109
sm.mu.Lock()
110110
oldState := sm.currentState
111+
112+
// Validate transition
113+
if err := sm.ValidateTransition(oldState, newState); err != nil {
114+
// For now, log the validation error but allow the transition
115+
// In the future, we might want to be stricter
116+
fmt.Printf("Invalid state transition: %v (from %s to %s)\n", err, oldState.String(), newState.String())
117+
}
118+
111119
sm.currentState = newState
112120

113121
// Clear error on successful transitions

0 commit comments

Comments
 (0)