Files
dance-lessons-coach/README.md
Gabriel Radureau 7c5e61c386 Implement comprehensive graceful shutdown with JSON logging
- Added signal.NotifyContext for modern signal handling in cmd/server/main.go
- Implemented BaseContext for proper context propagation to HTTP handlers
- Added readiness drain delay before shutdown for graceful degradation
- Fixed PID detection in start-server.sh to target actual server process
- Added Logging.JSON configuration option with DLC_LOGGING_JSON environment variable
- Created comprehensive test script that validates entire server lifecycle
- Updated documentation with JSON logging configuration examples
- All shutdown logs now appear correctly in JSON format
- Server terminates gracefully on SIGTERM with proper log flushing

The graceful shutdown implementation follows VictoriaMetrics best practices:
1. Catches termination signals (SIGTERM, SIGINT)
2. Stops accepting new requests but allows ongoing requests to complete
3. Waits for active requests to finish within configured timeout
4. Releases resources and performs cleanup
5. Logs all shutdown steps for observability

Test script validates:
- Server startup and API functionality
- Graceful shutdown sequence
- JSON log format validation
- Complete log sequence verification
- Proper signal handling and context propagation

Generated by Mistral Vibe.
Co-Authored-By: Mistral Vibe <vibe@mistral.ai>
2026-04-03 19:23:23 +02:00

3.6 KiB

DanceLessonsCoach

A Go project demonstrating idiomatic package structure, CLI implementation, and JSON API with Chi router.

Features

  • Greet function with default behavior
  • Command-line interface
  • JSON API with versioned endpoints
  • Chi router integration
  • Zerolog for high-performance logging
  • Viper for configuration management
  • Graceful shutdown with context
  • Unit tests
  • Go 1.26.1 compatible

Installation

# Clone the repository
git clone https://github.com/yourusername/DanceLessonsCoach.git
cd DanceLessonsCoach

# Build and run
go run ./cmd/greet

Optional Configuration

The project supports configuration via YAML file, environment variables, or defaults. Configuration priority: file > environment variables > defaults

Configuration File

By default, the application looks for config.yaml in the current working directory.

Create a config.yaml file:

server:
  host: "0.0.0.0"
  port: 8080
shutdown:
  timeout: 30s
logging:
  json: false  # Set to true for JSON format logging

Then start the server:

go run ./cmd/server

Custom Config File Path

To specify a custom config file path, use the DLC_CONFIG_FILE environment variable:

# Use a specific config file
export DLC_CONFIG_FILE="/path/to/your/config.yaml"
go run ./cmd/server

# Or in one command
DLC_CONFIG_FILE="/path/to/your/config.yaml" go run ./cmd/server

Environment Variables

You can also configure via environment variables with DLC_ prefix:

# Set configuration via environment variables
export DLC_SERVER_HOST="0.0.0.0"
export DLC_SERVER_PORT=8080
export DLC_SHUTDOWN_TIMEOUT=30s
export DLC_LOGGING_JSON=false  # Set to true for JSON format logging

# Start the server
go run ./cmd/server

Configuration Priority

  1. File-based configuration (highest priority)
  2. Environment variables (override defaults)
  3. Default values (lowest priority)

This means if you have both a config file and environment variables, the file takes precedence.

Usage

CLI

# Default greeting
go run ./cmd/greet
# Output: Hello world!

# Custom greeting
go run ./cmd/greet John
# Output: Hello John!

Web Server

Using the server control script (recommended):

# Start the server
./scripts/start-server.sh start

# Test API endpoints
./scripts/start-server.sh test

# Stop the server
./scripts/start-server.sh stop

Manual server management:

# Start the server
go run ./cmd/server

# Test API endpoints
curl http://localhost:8080/api/health
# Output: {"status":"healthy"}

curl http://localhost:8080/api/v1/greet
# Output: {"message":"Hello world!"}

curl http://localhost:8080/api/v1/greet/John
# Output: {"message":"Hello John!"}

Testing

# Run all tests
go test ./...

# Run specific package tests
go test ./pkg/greet/

Project Structure

DanceLessonsCoach/
├── cmd/
│   ├── greet/              # CLI entry point
│   │   └── main.go
│   └── server/             # Web server entry point
│       └── main.go
├── pkg/
│   ├── config/             # Configuration management
│   │   └── config.go
│   ├── greet/              # Core greet functionality
│   │   ├── api_v1.go       # API v1 handlers
│   │   ├── greet.go        # Core service
│   │   └── greet_test.go    # Unit tests
│   └── server/             # Server implementation
│       └── server.go
├── config.example.yaml     # Configuration template
├── go.mod                   # Go module definition
└── README.md                # Project documentation

License

MIT