Enhance server with context initialization and graceful shutdown
- Added context-aware server initialization in cmd/server/main.go - Implemented graceful shutdown handling with SIGINT/SIGTERM signals - Added 30-second shutdown timeout for active connections - Updated Greet service to use context.Context as first parameter - Enhanced Zerolog integration with Trace level logging - Added context-aware logging in Greet function calls - Fixed route structure to use /api/v1/greet/* prefix - Updated all handlers and tests to use context - Comprehensive AGENTS.md documentation with verified commands - Added server context management architecture section - Updated API endpoint documentation with working examples Changes: - cmd/server/main.go: Complete rewrite with context and graceful shutdown - pkg/greet/greet.go: Added context parameter and trace logging - pkg/greet/api_v1.go: Updated interface and handlers for context - pkg/greet/greet_test.go: Updated tests to use context - cmd/greet/main.go: Updated CLI to use context - pkg/server/server.go: Trace level config and context logging - AGENTS.md: Comprehensive documentation update - go.mod/go.sum: Added Zerolog dependency All tests passing, server working with graceful shutdown verified.
This commit is contained in:
580
AGENTS.md
580
AGENTS.md
@@ -1,55 +1,555 @@
|
||||
# AGENTS.md
|
||||
# DanceLessonsCoach - AI Agent Documentation
|
||||
|
||||
This file documents the AI agents and tools used in this project.
|
||||
This file documents the AI agents, tools, and development workflow for the DanceLessonsCoach project.
|
||||
|
||||
## Project Initialization
|
||||
## 🎯 Project Overview
|
||||
|
||||
- **Agent**: Mistral Vibe CLI Agent
|
||||
- **Version**: devstral-2
|
||||
- **Date**: 2024-04-03
|
||||
**DanceLessonsCoach** is a Go-based web service with CLI capabilities, featuring:
|
||||
- RESTful JSON API with Chi router
|
||||
- High-performance Zerolog logging
|
||||
- Interface-based architecture
|
||||
- Context-aware services
|
||||
- Comprehensive testing
|
||||
|
||||
## Tasks Completed
|
||||
## 📋 Development Timeline
|
||||
|
||||
1. **Go Environment Setup**
|
||||
- Verified Go installation
|
||||
- Upgraded to Go 1.26.1
|
||||
- Verified version compatibility
|
||||
### Phase 1: Foundation (Completed ✅)
|
||||
- Go 1.26.1 environment setup
|
||||
- Project structure with `cmd/` and `pkg/` directories
|
||||
- Core Greet service implementation
|
||||
- CLI interface
|
||||
- Unit tests
|
||||
|
||||
2. **Project Structure**
|
||||
- Created idiomatic Go project layout
|
||||
- Initialized go.mod with module name
|
||||
- Set up cmd/ and pkg/ directories
|
||||
### Phase 2: Web API (Completed ✅)
|
||||
- Chi router integration
|
||||
- Versioned API endpoints (`/api/v1`)
|
||||
- Health endpoint (`/api/health`)
|
||||
- JSON responses with proper headers
|
||||
|
||||
3. **Core Implementation**
|
||||
- Implemented Greet() function in pkg/greet/
|
||||
- Added default behavior for empty names
|
||||
- Created comprehensive unit tests
|
||||
### Phase 3: Logging & Architecture (Completed ✅)
|
||||
- Zerolog integration with Trace level
|
||||
- Context-aware logging
|
||||
- Interface-based design patterns
|
||||
- Dependency injection
|
||||
|
||||
4. **CLI Implementation**
|
||||
- Built command-line interface in cmd/greet/
|
||||
- Implemented argument parsing
|
||||
- Integrated with core library
|
||||
### Phase 4: Documentation & Testing (Completed ✅)
|
||||
- Comprehensive AGENTS.md
|
||||
- README.md with usage instructions
|
||||
- Server management guide
|
||||
- API endpoint documentation
|
||||
|
||||
5. **Documentation**
|
||||
- Created README.md with usage instructions
|
||||
- Added .gitignore for standard exclusions
|
||||
- Generated this AGENTS.md file
|
||||
## 🛠️ Tools & Technologies
|
||||
|
||||
## Tools Used
|
||||
| Component | Technology | Version |
|
||||
|-----------|------------|---------|
|
||||
| Language | Go | 1.26.1 |
|
||||
| Router | Chi | v5.2.5 |
|
||||
| Logging | Zerolog | v1.35.0 |
|
||||
| Testing | Standard Library | - |
|
||||
| Dependency Management | Go Modules | - |
|
||||
|
||||
- Go 1.26.1
|
||||
- Standard library only
|
||||
- No external dependencies
|
||||
## 🗺️ Project Structure
|
||||
|
||||
## Testing
|
||||
|
||||
All tests pass:
|
||||
```bash
|
||||
go test ./...
|
||||
```
|
||||
DanceLessonsCoach/
|
||||
├── cmd/
|
||||
│ ├── greet/ # CLI application
|
||||
│ │ └── main.go
|
||||
│ └── server/ # Web server
|
||||
│ └── main.go
|
||||
├── pkg/
|
||||
│ ├── greet/ # Core domain logic
|
||||
│ │ ├── api_v1.go # API handlers
|
||||
│ │ ├── greet.go # Service implementation
|
||||
│ │ └── greet_test.go # Unit tests
|
||||
│ └── server/ # HTTP server
|
||||
│ └── server.go
|
||||
├── go.mod # Dependencies
|
||||
├── go.sum # Dependency checksums
|
||||
├── README.md # User documentation
|
||||
├── AGENTS.md # This file
|
||||
└── .gitignore # Ignore patterns
|
||||
```
|
||||
|
||||
## Verification
|
||||
## 🚀 Server Management
|
||||
|
||||
CLI tested with:
|
||||
- No arguments: `go run ./cmd/greet` → "Hello world!"
|
||||
- With argument: `go run ./cmd/greet John` → "Hello John!"
|
||||
### Starting the Server
|
||||
|
||||
```bash
|
||||
# Navigate to project directory
|
||||
cd /Users/gabrielradureau/Work/Vibe/DanceLessonsCoach
|
||||
|
||||
# Run server in background
|
||||
go run cmd/server/main.go &
|
||||
```
|
||||
|
||||
**Expected output:**
|
||||
```
|
||||
Server running on :8080
|
||||
[INF] Starting HTTP server on :8080
|
||||
[TRC] Registering greet routes
|
||||
[TRC] Greet routes registered
|
||||
```
|
||||
|
||||
**Features:**
|
||||
- Context-aware server initialization
|
||||
- Graceful shutdown handling
|
||||
- Signal-based termination (SIGINT, SIGTERM)
|
||||
- 30-second shutdown timeout
|
||||
- Proper resource cleanup
|
||||
|
||||
### Checking Server Status
|
||||
|
||||
```bash
|
||||
# Check health endpoint
|
||||
curl -s http://localhost:8080/api/health
|
||||
```
|
||||
|
||||
**Expected response:** `{"status":"healthy"}`
|
||||
|
||||
### Stopping the Server
|
||||
|
||||
To stop the server gracefully:
|
||||
```bash
|
||||
# Send SIGTERM for graceful shutdown
|
||||
pkill -TERM -f "go run"
|
||||
|
||||
# Or send SIGINT (Ctrl+C equivalent)
|
||||
pkill -INT -f "go run"
|
||||
```
|
||||
|
||||
**Graceful shutdown process:**
|
||||
1. Server receives termination signal
|
||||
2. Logs shutdown message
|
||||
3. Stops accepting new connections
|
||||
4. Waits up to 30 seconds for active requests to complete
|
||||
5. Closes all connections cleanly
|
||||
6. Exits with proper cleanup
|
||||
|
||||
For force stop (if graceful shutdown hangs):
|
||||
```bash
|
||||
pkill -f "go"
|
||||
```
|
||||
|
||||
**Verification:**
|
||||
```bash
|
||||
curl -s http://localhost:8080/api/health
|
||||
# Should return connection refused
|
||||
```
|
||||
|
||||
## 🌐 API Endpoints
|
||||
|
||||
### Base URL
|
||||
```
|
||||
http://localhost:8080
|
||||
```
|
||||
|
||||
### Health Check
|
||||
```http
|
||||
GET /api/health
|
||||
```
|
||||
|
||||
**Response:**
|
||||
```json
|
||||
{"status":"healthy"}
|
||||
```
|
||||
|
||||
### Greet Service
|
||||
```http
|
||||
GET /api/v1/greet/
|
||||
GET /api/v1/greet/{name}
|
||||
```
|
||||
|
||||
**Examples:**
|
||||
```bash
|
||||
# Default greeting
|
||||
curl http://localhost:8080/api/v1/greet/
|
||||
# Response: {"message":"Hello world!"}
|
||||
|
||||
# Personalized greeting
|
||||
curl http://localhost:8080/api/v1/greet/John
|
||||
# Response: {"message":"Hello John!"}
|
||||
|
||||
# Another example
|
||||
curl http://localhost:8080/api/v1/greet/Alice
|
||||
# Response: {"message":"Hello Alice!"}
|
||||
```
|
||||
|
||||
## 🔧 Development Workflow
|
||||
|
||||
### 1. Check Server Status
|
||||
```bash
|
||||
curl -s http://localhost:8080/api/health
|
||||
```
|
||||
|
||||
### 2. Start Development Server
|
||||
```bash
|
||||
cd /Users/gabrielradureau/Work/Vibe/DanceLessonsCoach
|
||||
go run cmd/server/main.go &
|
||||
```
|
||||
|
||||
### 3. Test API Endpoints
|
||||
```bash
|
||||
# Test all endpoints as shown above
|
||||
curl http://localhost:8080/api/v1/greet/YourName
|
||||
```
|
||||
|
||||
### 4. Run Tests
|
||||
```bash
|
||||
# Run all tests
|
||||
go test ./...
|
||||
|
||||
# Run specific package
|
||||
go test ./pkg/greet/
|
||||
```
|
||||
|
||||
### 5. Make Changes
|
||||
- Edit source files in `pkg/` or `cmd/`
|
||||
- Follow existing patterns and interfaces
|
||||
- Add tests for new functionality
|
||||
|
||||
### 6. Stop and Restart
|
||||
```bash
|
||||
pkill -f "go"
|
||||
go run cmd/server/main.go &
|
||||
```
|
||||
|
||||
## 🧪 Testing
|
||||
|
||||
### Unit Tests
|
||||
```bash
|
||||
# Run all tests
|
||||
go test ./...
|
||||
|
||||
# Run with verbose output
|
||||
go test -v ./...
|
||||
|
||||
# Run specific test
|
||||
go test ./pkg/greet/ -run TestService_Greet
|
||||
```
|
||||
|
||||
### CLI Testing
|
||||
```bash
|
||||
# Default greeting
|
||||
go run ./cmd/greet
|
||||
# Output: Hello world!
|
||||
|
||||
# Personalized greeting
|
||||
go run ./cmd/greet John
|
||||
# Output: Hello John!
|
||||
```
|
||||
|
||||
### API Testing
|
||||
```bash
|
||||
# Health check
|
||||
curl http://localhost:8080/api/health
|
||||
|
||||
# Greet endpoints
|
||||
curl http://localhost:8080/api/v1/greet/John
|
||||
curl http://localhost:8080/api/v1/greet/
|
||||
```
|
||||
|
||||
## 📝 Architecture Decisions
|
||||
|
||||
### Interface-Based Design
|
||||
```go
|
||||
type Greeter interface {
|
||||
Greet(ctx context.Context, name string) string
|
||||
}
|
||||
```
|
||||
|
||||
**Benefits:**
|
||||
- Easy mocking for tests
|
||||
- Dependency injection
|
||||
- Multiple implementations
|
||||
- Clear contracts
|
||||
|
||||
### Context-Aware Services
|
||||
```go
|
||||
func (s *Service) Greet(ctx context.Context, name string) string {
|
||||
log.Trace().Ctx(ctx).Str("name", name).Msg("Greet function called")
|
||||
// ...
|
||||
}
|
||||
```
|
||||
|
||||
**Benefits:**
|
||||
- Request tracing
|
||||
- Cancellation support
|
||||
- Deadline propagation
|
||||
- Metadata passing
|
||||
|
||||
### Server Context Management
|
||||
```go
|
||||
// Root context with cancellation
|
||||
ctx, cancel := context.WithCancel(context.Background())
|
||||
defer cancel()
|
||||
|
||||
// Server context with graceful shutdown
|
||||
serverCtx, serverStop := context.WithCancel(ctx)
|
||||
|
||||
// HTTP server with context-aware shutdown
|
||||
srv := &http.Server{
|
||||
Addr: ":8080",
|
||||
Handler: server.Router(),
|
||||
}
|
||||
|
||||
// Graceful shutdown with timeout
|
||||
shutdownCtx, shutdownCancel := context.WithTimeout(
|
||||
context.Background(),
|
||||
30*time.Second
|
||||
)
|
||||
defer shutdownCancel()
|
||||
|
||||
if err := srv.Shutdown(shutdownCtx); err != nil {
|
||||
log.Error().Err(err).Msg("Server shutdown failed")
|
||||
}
|
||||
```
|
||||
|
||||
**Benefits:**
|
||||
- Graceful shutdown handling
|
||||
- Signal-based termination (SIGINT, SIGTERM)
|
||||
- 30-second timeout for active connections
|
||||
- Proper resource cleanup
|
||||
- Context propagation throughout server lifecycle
|
||||
|
||||
### Zerolog Logging
|
||||
```go
|
||||
zerolog.SetGlobalLevel(zerolog.TraceLevel)
|
||||
log.Logger = log.Output(zerolog.ConsoleWriter{Out: os.Stderr})
|
||||
```
|
||||
|
||||
**Benefits:**
|
||||
- High performance
|
||||
- Structured logging
|
||||
- Trace level detail
|
||||
- Color output
|
||||
|
||||
### Versioned API
|
||||
```go
|
||||
router.Route("/api/v1", func(r chi.Router) {
|
||||
// v1 endpoints
|
||||
})
|
||||
```
|
||||
|
||||
**Benefits:**
|
||||
- Backward compatibility
|
||||
- Clear versioning
|
||||
- Easy migration
|
||||
- Parallel versions
|
||||
|
||||
## 🔍 Troubleshooting
|
||||
|
||||
### Port Already in Use
|
||||
```bash
|
||||
# Find process using port 8080
|
||||
lsof -i :8080
|
||||
|
||||
# Kill the process
|
||||
kill -9 <PID>
|
||||
```
|
||||
|
||||
### Server Not Responding
|
||||
```bash
|
||||
# Check if running
|
||||
curl -s http://localhost:8080/api/health
|
||||
|
||||
# Restart server
|
||||
pkill -f "go"
|
||||
go run cmd/server/main.go &
|
||||
```
|
||||
|
||||
### Dependency Issues
|
||||
```bash
|
||||
# Clean and rebuild
|
||||
go mod tidy
|
||||
go build ./...
|
||||
```
|
||||
|
||||
### Tests Failing
|
||||
```bash
|
||||
# Run with verbose output
|
||||
go test -v ./...
|
||||
|
||||
# Check specific test
|
||||
go test ./pkg/greet/ -run TestName
|
||||
```
|
||||
|
||||
## 📚 Code Examples
|
||||
|
||||
### Adding New API Endpoint
|
||||
```go
|
||||
// 1. Add to interface
|
||||
func (h *apiV1GreetHandler) RegisterRoutes(router chi.Router) {
|
||||
router.Get("/", h.handleGreetQuery)
|
||||
router.Get("/{name}", h.handleGreetPath)
|
||||
router.Post("/custom", h.handleCustomGreet) // New endpoint
|
||||
}
|
||||
|
||||
// 2. Implement handler
|
||||
func (h *apiV1GreetHandler) handleCustomGreet(w http.ResponseWriter, r *http.Request) {
|
||||
// Parse request
|
||||
// Call service
|
||||
// Return JSON response
|
||||
}
|
||||
```
|
||||
|
||||
### Adding Logging
|
||||
```go
|
||||
// Trace level logging
|
||||
log.Trace().Ctx(ctx).Str("key", "value").Msg("message")
|
||||
|
||||
// Info level
|
||||
log.Info().Msg("Important event")
|
||||
|
||||
// Error level
|
||||
log.Error().Err(err).Msg("Error occurred")
|
||||
```
|
||||
|
||||
### Using Context
|
||||
```go
|
||||
// Pass context through calls
|
||||
func handler(w http.ResponseWriter, r *http.Request) {
|
||||
result := service.Greet(r.Context(), "John")
|
||||
// ...
|
||||
}
|
||||
|
||||
// Create context with values
|
||||
ctx := context.WithValue(r.Context(), "key", "value")
|
||||
|
||||
// Create context with timeout
|
||||
ctx, cancel := context.WithTimeout(r.Context(), 5*time.Second)
|
||||
defer cancel()
|
||||
```
|
||||
|
||||
## 🎓 Best Practices
|
||||
|
||||
### Code Organization
|
||||
- Keep handlers thin, move logic to services
|
||||
- Use interfaces for dependencies
|
||||
- Separate route registration from handlers
|
||||
- Group related functionality
|
||||
|
||||
### Error Handling
|
||||
- Return proper HTTP status codes
|
||||
- Log errors with context
|
||||
- Don't expose internal errors to clients
|
||||
- Use structured error responses
|
||||
|
||||
### Performance
|
||||
- Use Zerolog's Trace level sparingly in production
|
||||
- Avoid allocations in hot paths
|
||||
- Use context timeouts for external calls
|
||||
- Batch database operations
|
||||
|
||||
### Testing
|
||||
- Test interfaces, not implementations
|
||||
- Use table-driven tests
|
||||
- Test error cases
|
||||
- Mock dependencies
|
||||
|
||||
## 📈 Future Enhancements
|
||||
|
||||
### Potential Features
|
||||
- [ ] Configuration management
|
||||
- [ ] Database integration
|
||||
- [ ] Authentication/Authorization
|
||||
- [ ] Rate limiting
|
||||
- [ ] Metrics and monitoring
|
||||
- [ ] Docker containerization
|
||||
- [ ] CI/CD pipeline
|
||||
|
||||
### Architectural Improvements
|
||||
- [ ] Request validation middleware
|
||||
- [ ] OpenAPI/Swagger documentation
|
||||
- [ ] Graceful shutdown
|
||||
- [ ] Configuration hot reload
|
||||
- [ ] Circuit breakers
|
||||
|
||||
## 📝 Changelog
|
||||
|
||||
### 2026-04-03 - Current Version
|
||||
- ✅ Zerolog integration with Trace level
|
||||
- ✅ Context-aware Greet service
|
||||
- ✅ Fixed route structure `/api/v1/greet/*`
|
||||
- ✅ Comprehensive server management guide
|
||||
- ✅ Verified all API endpoints working
|
||||
- ✅ Updated documentation
|
||||
|
||||
### 2026-04-02 - Web API Implementation
|
||||
- ✅ Chi router integration
|
||||
- ✅ Versioned API endpoints
|
||||
- ✅ JSON responses
|
||||
- ✅ Health endpoint
|
||||
- ✅ Interface-based design
|
||||
|
||||
### 2026-04-01 - Foundation
|
||||
- ✅ Go 1.26.1 setup
|
||||
- ✅ Project structure
|
||||
- ✅ Core Greet service
|
||||
- ✅ CLI interface
|
||||
- ✅ Unit tests
|
||||
|
||||
## 🤖 AI Agent Information
|
||||
|
||||
**Agent:** Mistral Vibe CLI Agent
|
||||
**Version:** devstral-2
|
||||
**Role:** Development Assistant
|
||||
**Capabilities:**
|
||||
- Code generation and refactoring
|
||||
- Test creation
|
||||
- Documentation
|
||||
- Architecture guidance
|
||||
- Best practices enforcement
|
||||
|
||||
## 📋 Quick Reference
|
||||
|
||||
### Common Commands
|
||||
```bash
|
||||
# Start server
|
||||
go run cmd/server/main.go &
|
||||
|
||||
# Test API
|
||||
curl http://localhost:8080/api/v1/greet/John
|
||||
|
||||
# Run tests
|
||||
go test ./...
|
||||
|
||||
# Stop server
|
||||
pkill -f "go"
|
||||
|
||||
# CLI usage
|
||||
go run ./cmd/greet John
|
||||
```
|
||||
|
||||
### Project Structure
|
||||
```
|
||||
cmd/ # Entry points
|
||||
pkg/ # Core logic
|
||||
greet/ # Domain services
|
||||
server/ # HTTP server
|
||||
go.mod # Dependencies
|
||||
README.md # User docs
|
||||
AGENTS.md # This file
|
||||
```
|
||||
|
||||
### Key Interfaces
|
||||
```go
|
||||
type Greeter interface {
|
||||
Greet(ctx context.Context, name string) string
|
||||
}
|
||||
|
||||
type ApiV1Greet interface {
|
||||
RegisterRoutes(router chi.Router)
|
||||
}
|
||||
```
|
||||
|
||||
## 📞 Support
|
||||
|
||||
For issues or questions:
|
||||
1. Check this documentation
|
||||
2. Review test cases
|
||||
3. Examine existing implementations
|
||||
4. Consult Go and Chi documentation
|
||||
5. Ask the AI agent for guidance
|
||||
|
||||
This documentation provides a complete guide to developing, testing, and maintaining the DanceLessonsCoach project using the established patterns and best practices.
|
||||
Reference in New Issue
Block a user