blinq-common
Common utilities for Blinq Rust microservices: error handling, advanced logging with request ID tracking, and HTTP middleware with extensive customization and override capabilities.
Features
- Modular Design: Use only what you need with feature flags
- Error Handling: Extensible
AppErrortype with HTTP status mapping - Advanced Logging: Multiple formats (Pretty, Compact, JSON, Full) with request ID injection
- Request ID Tracking: Automatic request ID generation and injection for distributed tracing
- Middleware: HTTP middleware (CORS, tracing) with custom configuration
- Override Support: Easy customization and extension points for microservices
Feature Flags
default: Enableslogginganderror-handlingaxum: Axum web framework integrationlogging: Advanced logging utilities with tracing-subscriber and request ID supporterror-handling: Common error types and handlingmiddleware: HTTP middleware utilitiescors: CORS middleware (requiresmiddleware)tracing: HTTP tracing middleware (requiresmiddleware)
Installation
Add to your microservice's Cargo.toml:
[]
= { = "0.1.0", = ["axum", "middleware", "cors", "tracing"] }
Or for minimal usage:
[]
= { = "0.1.0", = ["error-handling"] }
Quick Start
Basic Usage
use *;
async
Advanced Usage with Request ID Tracking
use *;
use CommonConfig;
use ;
use ;
use ;
use Instrument;
async
async
Request ID Tracking
Automatic request ID injection for distributed tracing across your microservices:
Request ID Strategies
use RequestIdStrategy;
// UUID-like format: "a1b2c3d4-5678-9abc"
Uuid
// Short alphanumeric: "a1b2c3d4"
Short
// Timestamp-based: "req_1640995200000"
Timestamp
// Custom prefix: "pay_a1b2c3d4-5678-9abc"
PrefixedUuid
Using Request Spans
use ;
use Instrument;
// Simple request span
let span = request_span!;
// Named request span with custom strategy
let span = named_request_span!;
// Use the span
async
.instrument
.await;
Logging Formats
Choose from multiple logging formats based on your environment:
Pretty Format (Development)
2025-01-15T10:30:45.123456Z INFO payment_service: Payment processed successfully, payment_id: "pay_abc123", amount: 100
at src/payment.rs:45 on ThreadId(2)
in payment_processing with request_id: "pay_def456"
Compact Format (Production)
2025-01-15T10:30:45Z INFO payment_processing: Payment processed successfully payment_id="pay_abc123" amount=100 request_id="pay_def456"
JSON Format (Log Aggregation)
Full Format (Maximum Detail)
2025-01-15T10:30:45.123456Z INFO ThreadId(2) payment_processing{request_id="pay_def456"}: payment_service: src/payment.rs:45: Payment processed successfully payment_id="pay_abc123" amount=100
Configuring Logging Formats
use ;
// Development configuration
let dev_config = new
.with_level
.with_format
.with_auto_request_id
.show_target
.show_thread_ids
.show_file_line;
// Production configuration
let prod_config = new
.with_level
.with_format
.with_auto_request_id
.with_request_id_strategy
.show_target
.show_thread_ids
.show_file_line;
init_advanced;
Extending Error Types
Create your own error types that integrate seamlessly:
use AppError;
// Convert to common error type
Configuration Override Examples
Custom CORS Configuration
let config = new
.with_cors_origins
.with_cors_headers;
Advanced Logging Configuration
let config = new
.with_log_level
.with_custom
.with_custom
.with_custom
.with_custom
.with_custom;
// Convert to LoggingConfig
let logging_config = from_common_config;
init_advanced;
Service-Specific Configuration
let config = new
.with_custom
.with_custom
.with_custom
.with_custom;
Available Modules
Error Handling (error module)
AppError: Common error enum with HTTP status mapping- Conversion traits for easy integration
- Axum
IntoResponseimplementation - Helper methods:
service_error(),is_client_error(),is_server_error()
Logging (logging module)
init(): Basic logging initializationinit_with_config(): Logging with CommonConfiginit_advanced(): Advanced logging with LoggingConfiginit_json_production(): Production JSON logginginit_development(): Development pretty logginginit_test(): Minimal test loggingLoggingConfig: Advanced configuration builderRequestIdStrategy: Request ID generation strategiesgenerate_request_id(): Manual request ID generationcreate_request_span(): Request span creation utilities
Middleware (middleware module)
cors(): Permissive CORS middlewarecors_with_config(): Configurable CORS middlewaretrace(): HTTP request/response tracing
Configuration (config module)
CommonConfig: Centralized configuration with builder pattern- Override points for all common functionality
- Custom key-value storage for service-specific config
Examples
Run the basic example:
Run the advanced example with request ID tracking:
Test the request ID functionality:
# In one terminal, start the server
# In another terminal, make requests and see unique request IDs in logs
Each curl request will generate a unique request ID that appears in all related log entries, making it easy to trace requests through your system.
Real-World Usage Example
Here's how to integrate blinq-common into your referral service:
use *;
use ;
use ;
async
Publishing Your Microservice
When using this crate in your microservice:
- Choose appropriate features based on your needs
- Configure request ID tracking for distributed tracing
- Select logging format based on environment (Pretty for dev, JSON for prod)
- Create service-specific configuration using
CommonConfig - Extend error types for your business logic
- Override middleware settings as needed
- Add custom configuration for service-specific settings
Testing
# Run all tests
# Run tests for specific features
# Test logging formats
Contributing
See CONTRIBUTING.md for guidelines.
License
Licensed under the MIT license. See LICENSE for details.