working on proxy service. getting closer
This commit is contained in:
parent
6380165a94
commit
afc1843fdb
5 changed files with 91 additions and 892 deletions
|
|
@ -1,817 +0,0 @@
|
|||
/**
|
||||
* Example usage of the Stock Bot configuration library
|
||||
*
|
||||
* This file demonstrates how to use the Zod-based configuration
|
||||
* system for various services in the Stock Bot platform.
|
||||
*/
|
||||
|
||||
// Import all the configuration modules
|
||||
import {
|
||||
// Core utilities
|
||||
loadEnvVariables,
|
||||
getEnvironment,
|
||||
Environment,
|
||||
ConfigurationError,
|
||||
} from './core';
|
||||
|
||||
import {
|
||||
// PostgreSQL configuration
|
||||
postgresConfig,
|
||||
PostgresConfig,
|
||||
POSTGRES_HOST,
|
||||
POSTGRES_PORT,
|
||||
POSTGRES_DATABASE,
|
||||
POSTGRES_USERNAME,
|
||||
POSTGRES_PASSWORD,
|
||||
} from './postgres';
|
||||
|
||||
import {
|
||||
// QuestDB configuration
|
||||
questdbConfig,
|
||||
QuestDbConfig,
|
||||
QUESTDB_HOST,
|
||||
QUESTDB_HTTP_PORT,
|
||||
QUESTDB_PG_PORT,
|
||||
} from './questdb';
|
||||
|
||||
import {
|
||||
// MongoDB configuration
|
||||
mongodbConfig,
|
||||
MongoDbConfig,
|
||||
MONGODB_HOST,
|
||||
MONGODB_PORT,
|
||||
MONGODB_DATABASE,
|
||||
MONGODB_USERNAME,
|
||||
} from './mongodb';
|
||||
|
||||
import {
|
||||
// Dragonfly configuration
|
||||
dragonflyConfig,
|
||||
DragonflyConfig,
|
||||
DRAGONFLY_HOST,
|
||||
DRAGONFLY_PORT,
|
||||
DRAGONFLY_DATABASE,
|
||||
} from './dragonfly';
|
||||
|
||||
import {
|
||||
// Monitoring configuration
|
||||
prometheusConfig,
|
||||
grafanaConfig,
|
||||
PrometheusConfig,
|
||||
GrafanaConfig,
|
||||
PROMETHEUS_HOST,
|
||||
PROMETHEUS_PORT,
|
||||
GRAFANA_HOST,
|
||||
GRAFANA_PORT,
|
||||
} from './monitoring';
|
||||
|
||||
import {
|
||||
// Loki configuration
|
||||
lokiConfig,
|
||||
LokiConfig,
|
||||
LOKI_HOST,
|
||||
LOKI_PORT,
|
||||
LOKI_SERVICE_LABEL,
|
||||
LOKI_BATCH_SIZE,
|
||||
} from './loki';
|
||||
|
||||
import {
|
||||
// Logging configuration
|
||||
loggingConfig,
|
||||
LoggingConfig,
|
||||
LOG_LEVEL,
|
||||
LOG_FORMAT,
|
||||
LOG_CONSOLE,
|
||||
LOG_FILE,
|
||||
LOG_SERVICE_NAME,
|
||||
} from './logging';
|
||||
|
||||
|
||||
import {
|
||||
// Risk management configuration
|
||||
riskConfig,
|
||||
RiskConfig,
|
||||
RISK_MAX_POSITION_SIZE,
|
||||
RISK_DEFAULT_STOP_LOSS,
|
||||
RISK_CIRCUIT_BREAKER_ENABLED,
|
||||
} from './risk';
|
||||
|
||||
import {
|
||||
// Data provider configuration
|
||||
dataProvidersConfig,
|
||||
DataProvidersConfig,
|
||||
getProviderConfig,
|
||||
getEnabledProviders,
|
||||
getDefaultProvider,
|
||||
DEFAULT_DATA_PROVIDER,
|
||||
ALPACA_API_KEY,
|
||||
} from './data-providers';
|
||||
|
||||
/**
|
||||
* Example 1: Basic usage - Load environment variables and get configuration
|
||||
*/
|
||||
function basicUsageExample() {
|
||||
console.log('=== Basic Usage Example ===');
|
||||
|
||||
// Load environment variables (optional - they're loaded automatically)
|
||||
loadEnvVariables();
|
||||
|
||||
// Get the current environment
|
||||
const env = getEnvironment();
|
||||
console.log(`Current environment: ${env}`);
|
||||
// Access individual configuration values
|
||||
console.log(`Database host: ${POSTGRES_HOST}`);
|
||||
console.log(`Database port: ${POSTGRES_PORT}`);
|
||||
console.log(`Log level: ${LOG_LEVEL}`);
|
||||
|
||||
// Access full database config objects
|
||||
console.log(`Full database config:`, {
|
||||
host: postgresConfig.POSTGRES_HOST,
|
||||
port: postgresConfig.POSTGRES_PORT,
|
||||
name: postgresConfig.POSTGRES_DATABASE,
|
||||
ssl: postgresConfig.POSTGRES_SSL,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Example 2: Using configuration in a database connection
|
||||
*/
|
||||
async function databaseConnectionExample() {
|
||||
console.log('=== Database Connection Example ===');
|
||||
|
||||
try {
|
||||
// Use the database configuration to create a connection string
|
||||
const connectionString = `postgresql://${POSTGRES_USERNAME}:${POSTGRES_PASSWORD}@${POSTGRES_HOST}:${POSTGRES_PORT}/${POSTGRES_DATABASE}`;
|
||||
|
||||
console.log('Database connection settings:');
|
||||
console.log(`- Host: ${postgresConfig.POSTGRES_HOST}`);
|
||||
console.log(`- Port: ${postgresConfig.POSTGRES_PORT}`);
|
||||
console.log(`- Database: ${postgresConfig.POSTGRES_DATABASE}`);
|
||||
console.log(`- SSL enabled: ${postgresConfig.POSTGRES_SSL}`);
|
||||
console.log(`- Pool max connections: ${postgresConfig.POSTGRES_POOL_MAX}`);
|
||||
console.log(`- Query timeout: ${postgresConfig.POSTGRES_QUERY_TIMEOUT}ms`);
|
||||
|
||||
// Example pool configuration
|
||||
const poolConfig = {
|
||||
host: postgresConfig.POSTGRES_HOST,
|
||||
port: postgresConfig.POSTGRES_PORT,
|
||||
database: postgresConfig.POSTGRES_DATABASE,
|
||||
user: postgresConfig.POSTGRES_USERNAME,
|
||||
password: postgresConfig.POSTGRES_PASSWORD,
|
||||
ssl: postgresConfig.POSTGRES_SSL,
|
||||
min: postgresConfig.POSTGRES_POOL_MIN,
|
||||
max: postgresConfig.POSTGRES_POOL_MAX,
|
||||
idleTimeoutMillis: postgresConfig.POSTGRES_POOL_IDLE_TIMEOUT,
|
||||
};
|
||||
|
||||
console.log('Pool configuration:', poolConfig);
|
||||
|
||||
} catch (error) {
|
||||
console.error('Database configuration error:', error);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Example 3: Logging setup example
|
||||
*/
|
||||
function loggingSetupExample() {
|
||||
console.log('=== Logging Setup Example ===');
|
||||
|
||||
// Access logging configuration
|
||||
console.log('Logging settings:');
|
||||
console.log(`- Level: ${loggingConfig.LOG_LEVEL}`);
|
||||
console.log(`- Format: ${loggingConfig.LOG_FORMAT}`);
|
||||
console.log(`- Console enabled: ${loggingConfig.LOG_CONSOLE}`);
|
||||
console.log(`- File logging: ${loggingConfig.LOG_FILE}`);
|
||||
console.log(`- Service name: ${loggingConfig.LOG_SERVICE_NAME}`);
|
||||
// Example logger configuration
|
||||
const loggerConfig = {
|
||||
level: loggingConfig.LOG_LEVEL,
|
||||
format: loggingConfig.LOG_FORMAT,
|
||||
transports: [] as any[],
|
||||
defaultMeta: {
|
||||
service: loggingConfig.LOG_SERVICE_NAME,
|
||||
version: loggingConfig.LOG_SERVICE_VERSION,
|
||||
environment: loggingConfig.LOG_ENVIRONMENT,
|
||||
},
|
||||
};
|
||||
|
||||
if (loggingConfig.LOG_CONSOLE) {
|
||||
loggerConfig.transports.push({
|
||||
type: 'console',
|
||||
format: loggingConfig.LOG_FORMAT,
|
||||
timestamp: loggingConfig.LOG_TIMESTAMP,
|
||||
});
|
||||
}
|
||||
|
||||
if (loggingConfig.LOG_FILE) {
|
||||
loggerConfig.transports.push({
|
||||
type: 'file',
|
||||
filename: `${loggingConfig.LOG_FILE_PATH}/application.log`,
|
||||
maxSize: loggingConfig.LOG_FILE_MAX_SIZE,
|
||||
maxFiles: loggingConfig.LOG_FILE_MAX_FILES,
|
||||
datePattern: loggingConfig.LOG_FILE_DATE_PATTERN,
|
||||
});
|
||||
}
|
||||
|
||||
// Example Loki transport configuration
|
||||
if (lokiConfig.LOKI_HOST) {
|
||||
loggerConfig.transports.push({
|
||||
type: 'loki',
|
||||
host: lokiConfig.LOKI_HOST,
|
||||
port: lokiConfig.LOKI_PORT,
|
||||
batchSize: lokiConfig.LOKI_BATCH_SIZE,
|
||||
labels: {
|
||||
service: lokiConfig.LOKI_SERVICE_LABEL,
|
||||
environment: lokiConfig.LOKI_ENVIRONMENT_LABEL,
|
||||
},
|
||||
});
|
||||
}
|
||||
console.log('Logger configuration:', loggerConfig);
|
||||
}
|
||||
|
||||
/**
|
||||
* Example 4: Risk management configuration
|
||||
*/
|
||||
function riskManagementExample() {
|
||||
console.log('=== Risk Management Example ===');
|
||||
|
||||
// Access risk configuration
|
||||
console.log('Risk management settings:');
|
||||
console.log(`- Max position size: ${RISK_MAX_POSITION_SIZE * 100}%`);
|
||||
console.log(`- Default stop loss: ${RISK_DEFAULT_STOP_LOSS * 100}%`);
|
||||
console.log(`- Circuit breaker enabled: ${RISK_CIRCUIT_BREAKER_ENABLED}`);
|
||||
console.log(`- Max leverage: ${riskConfig.RISK_MAX_LEVERAGE}x`);
|
||||
|
||||
// Example risk calculator
|
||||
function calculatePositionSize(portfolioValue: number, riskPerTrade: number = RISK_DEFAULT_STOP_LOSS) {
|
||||
const maxPositionValue = portfolioValue * RISK_MAX_POSITION_SIZE;
|
||||
const riskAmount = portfolioValue * riskPerTrade;
|
||||
|
||||
return {
|
||||
maxPositionValue,
|
||||
riskAmount,
|
||||
maxShares: Math.floor(maxPositionValue / 100), // Assuming $100 per share
|
||||
};
|
||||
}
|
||||
|
||||
const portfolioValue = 100000; // $100k portfolio
|
||||
const position = calculatePositionSize(portfolioValue);
|
||||
console.log(`Position sizing for $${portfolioValue} portfolio:`, position);
|
||||
}
|
||||
|
||||
/**
|
||||
* Example 5: Data provider configuration
|
||||
*/
|
||||
function dataProviderExample() {
|
||||
console.log('=== Data Provider Example ===');
|
||||
|
||||
// Get the default provider
|
||||
const defaultProvider = getDefaultProvider();
|
||||
console.log('Default provider:', defaultProvider);
|
||||
|
||||
// Get all enabled providers
|
||||
const enabledProviders = getEnabledProviders();
|
||||
console.log('Enabled providers:', enabledProviders.map(p => p.name));
|
||||
|
||||
// Get specific provider configuration
|
||||
try {
|
||||
const alpacaConfig = getProviderConfig('alpaca');
|
||||
console.log('Alpaca configuration:', {
|
||||
enabled: alpacaConfig.enabled,
|
||||
baseUrl: alpacaConfig.baseUrl,
|
||||
hasApiKey: !!alpacaConfig.apiKey,
|
||||
rateLimit: alpacaConfig.rateLimits,
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Error getting Alpaca config:', error);
|
||||
}
|
||||
|
||||
// Example API client setup
|
||||
const apiClients = enabledProviders.map(provider => ({
|
||||
name: provider.name,
|
||||
client: {
|
||||
baseURL: provider.baseUrl,
|
||||
timeout: dataProvidersConfig.DATA_PROVIDER_TIMEOUT,
|
||||
retries: dataProvidersConfig.DATA_PROVIDER_RETRIES,
|
||||
retryDelay: dataProvidersConfig.DATA_PROVIDER_RETRY_DELAY,
|
||||
headers: provider.apiKey ? {
|
||||
'Authorization': `Bearer ${provider.apiKey}`
|
||||
} : {},
|
||||
}
|
||||
}));
|
||||
|
||||
console.log('API clients configuration:', apiClients);
|
||||
}
|
||||
|
||||
/**
|
||||
* Example 6: Environment-specific configuration
|
||||
*/
|
||||
function environmentSpecificExample() {
|
||||
console.log('=== Environment-Specific Example ===');
|
||||
|
||||
const env = getEnvironment();
|
||||
|
||||
switch (env) {
|
||||
case Environment.Development:
|
||||
console.log('Development environment detected');
|
||||
console.log('- Using local database');
|
||||
console.log('- Verbose logging enabled');
|
||||
console.log('- Paper trading mode');
|
||||
break;
|
||||
|
||||
case Environment.Testing:
|
||||
console.log('Testing environment detected');
|
||||
console.log('- Using test database');
|
||||
console.log('- Structured logging');
|
||||
console.log('- Mock data providers');
|
||||
break;
|
||||
|
||||
case Environment.Staging:
|
||||
console.log('Staging environment detected');
|
||||
console.log('- Using staging database');
|
||||
console.log('- Production-like settings');
|
||||
console.log('- Real data providers (limited)');
|
||||
break;
|
||||
|
||||
case Environment.Production:
|
||||
console.log('Production environment detected');
|
||||
console.log('- Using production database');
|
||||
console.log('- Optimized logging');
|
||||
console.log('- Live trading enabled');
|
||||
break;
|
||||
}
|
||||
|
||||
// Example of environment-specific behavior
|
||||
const isProduction = env === Environment.Production;
|
||||
const tradingMode = isProduction ? 'live' : 'paper';
|
||||
const logLevel = isProduction ? 'info' : 'debug';
|
||||
|
||||
console.log(`Trading mode: ${tradingMode}`);
|
||||
console.log(`Recommended log level: ${logLevel}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Example 7: Configuration validation and error handling
|
||||
*/
|
||||
function configurationValidationExample() {
|
||||
console.log('=== Configuration Validation Example ===');
|
||||
|
||||
try {
|
||||
// Check required configurations
|
||||
if (!ALPACA_API_KEY && DEFAULT_DATA_PROVIDER === 'alpaca') {
|
||||
throw new ConfigurationError('Alpaca API key is required when using Alpaca as default provider');
|
||||
}
|
||||
|
||||
// Validate risk settings
|
||||
if (RISK_MAX_POSITION_SIZE > 1.0) {
|
||||
throw new ConfigurationError('Maximum position size cannot exceed 100%');
|
||||
}
|
||||
|
||||
if (riskConfig.RISK_DEFAULT_STOP_LOSS > riskConfig.RISK_DEFAULT_TAKE_PROFIT) {
|
||||
console.warn('Warning: Stop loss is greater than take profit - check your risk settings');
|
||||
}
|
||||
|
||||
// Validate database connection settings
|
||||
if (postgresConfig.POSTGRES_POOL_MAX < postgresConfig.POSTGRES_POOL_MIN) {
|
||||
throw new ConfigurationError('Database max pool size must be greater than min pool size');
|
||||
}
|
||||
|
||||
console.log('✅ All configuration validations passed');
|
||||
|
||||
} catch (error) {
|
||||
if (error instanceof ConfigurationError) {
|
||||
console.error('❌ Configuration error:', error.message);
|
||||
} else {
|
||||
console.error('❌ Unexpected error:', error);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Example 8: QuestDB time-series database configuration
|
||||
*/
|
||||
function questdbConfigurationExample() {
|
||||
console.log('=== QuestDB Configuration Example ===');
|
||||
|
||||
// Access QuestDB configuration
|
||||
console.log('QuestDB settings:');
|
||||
console.log(`- Host: ${questdbConfig.QUESTDB_HOST}`);
|
||||
console.log(`- HTTP port (web console): ${questdbConfig.QUESTDB_HTTP_PORT}`);
|
||||
console.log(`- PostgreSQL port: ${questdbConfig.QUESTDB_PG_PORT}`);
|
||||
console.log(`- InfluxDB port: ${questdbConfig.QUESTDB_INFLUX_PORT}`);
|
||||
console.log(`- TLS enabled: ${questdbConfig.QUESTDB_TLS_ENABLED}`);
|
||||
|
||||
// Example QuestDB client configuration
|
||||
const questdbClientConfig = {
|
||||
http: {
|
||||
host: questdbConfig.QUESTDB_HOST,
|
||||
port: questdbConfig.QUESTDB_HTTP_PORT,
|
||||
tls: questdbConfig.QUESTDB_TLS_ENABLED,
|
||||
timeout: questdbConfig.QUESTDB_REQUEST_TIMEOUT,
|
||||
},
|
||||
postgresql: {
|
||||
host: questdbConfig.QUESTDB_HOST,
|
||||
port: questdbConfig.QUESTDB_PG_PORT,
|
||||
database: questdbConfig.QUESTDB_DEFAULT_DATABASE,
|
||||
user: questdbConfig.QUESTDB_USER,
|
||||
password: questdbConfig.QUESTDB_PASSWORD,
|
||||
},
|
||||
influxdb: {
|
||||
host: questdbConfig.QUESTDB_HOST,
|
||||
port: questdbConfig.QUESTDB_INFLUX_PORT,
|
||||
}
|
||||
};
|
||||
|
||||
console.log('QuestDB client configuration:', questdbClientConfig);
|
||||
|
||||
// Example time-series table creation
|
||||
const createTableQuery = `
|
||||
CREATE TABLE IF NOT EXISTS ohlcv_data (
|
||||
timestamp TIMESTAMP,
|
||||
symbol SYMBOL,
|
||||
open DOUBLE,
|
||||
high DOUBLE,
|
||||
low DOUBLE,
|
||||
close DOUBLE,
|
||||
volume LONG
|
||||
) timestamp(timestamp) PARTITION BY DAY;
|
||||
`;
|
||||
|
||||
console.log('Example table creation query:', createTableQuery);
|
||||
}
|
||||
|
||||
/**
|
||||
* Example 9: MongoDB document database configuration
|
||||
*/
|
||||
function mongodbConfigurationExample() {
|
||||
console.log('=== MongoDB Configuration Example ===');
|
||||
|
||||
// Access MongoDB configuration
|
||||
console.log('MongoDB settings:');
|
||||
console.log(`- Host: ${mongodbConfig.MONGODB_HOST}`);
|
||||
console.log(`- Port: ${mongodbConfig.MONGODB_PORT}`);
|
||||
console.log(`- Database: ${mongodbConfig.MONGODB_DATABASE}`);
|
||||
console.log(`- Username: ${mongodbConfig.MONGODB_USERNAME}`);
|
||||
console.log(`- TLS enabled: ${mongodbConfig.MONGODB_TLS}`);
|
||||
console.log(`- Max pool size: ${mongodbConfig.MONGODB_MAX_POOL_SIZE}`);
|
||||
|
||||
// Build connection URI
|
||||
const buildMongoUri = () => {
|
||||
if (mongodbConfig.MONGODB_URI) {
|
||||
return mongodbConfig.MONGODB_URI;
|
||||
}
|
||||
|
||||
const auth = mongodbConfig.MONGODB_USERNAME && mongodbConfig.MONGODB_PASSWORD
|
||||
? `${mongodbConfig.MONGODB_USERNAME}:${mongodbConfig.MONGODB_PASSWORD}@`
|
||||
: '';
|
||||
|
||||
const tls = mongodbConfig.MONGODB_TLS ? '?tls=true' : '';
|
||||
|
||||
return `mongodb://${auth}${mongodbConfig.MONGODB_HOST}:${mongodbConfig.MONGODB_PORT}/${mongodbConfig.MONGODB_DATABASE}${tls}`;
|
||||
};
|
||||
|
||||
const mongoUri = buildMongoUri();
|
||||
console.log('MongoDB connection URI:', mongoUri.replace(/:[^:@]*@/, ':***@')); // Hide password
|
||||
|
||||
// Example MongoDB client configuration
|
||||
const mongoClientConfig = {
|
||||
maxPoolSize: mongodbConfig.MONGODB_MAX_POOL_SIZE,
|
||||
minPoolSize: mongodbConfig.MONGODB_MIN_POOL_SIZE,
|
||||
maxIdleTimeMS: mongodbConfig.MONGODB_MAX_IDLE_TIME,
|
||||
connectTimeoutMS: mongodbConfig.MONGODB_CONNECT_TIMEOUT,
|
||||
socketTimeoutMS: mongodbConfig.MONGODB_SOCKET_TIMEOUT,
|
||||
serverSelectionTimeoutMS: mongodbConfig.MONGODB_SERVER_SELECTION_TIMEOUT,
|
||||
retryWrites: mongodbConfig.MONGODB_RETRY_WRITES,
|
||||
w: mongodbConfig.MONGODB_WRITE_CONCERN,
|
||||
readPreference: mongodbConfig.MONGODB_READ_PREFERENCE,
|
||||
};
|
||||
|
||||
console.log('MongoDB client configuration:', mongoClientConfig);
|
||||
|
||||
// Example collections structure
|
||||
const collections = [
|
||||
'sentiment_data', // News sentiment analysis
|
||||
'market_news', // Raw news articles
|
||||
'social_signals', // Social media signals
|
||||
'earnings_reports', // Earnings data
|
||||
'analyst_ratings', // Analyst recommendations
|
||||
];
|
||||
|
||||
console.log('Example collections:', collections);
|
||||
}
|
||||
|
||||
/**
|
||||
* Example 10: Dragonfly (Redis replacement) configuration
|
||||
*/
|
||||
function dragonflyConfigurationExample() {
|
||||
console.log('=== Dragonfly Configuration Example ===');
|
||||
|
||||
// Access Dragonfly configuration
|
||||
console.log('Dragonfly settings:');
|
||||
console.log(`- Host: ${dragonflyConfig.DRAGONFLY_HOST}`);
|
||||
console.log(`- Port: ${dragonflyConfig.DRAGONFLY_PORT}`);
|
||||
console.log(`- Database: ${dragonflyConfig.DRAGONFLY_DATABASE}`);
|
||||
console.log(`- Cache mode: ${dragonflyConfig.DRAGONFLY_CACHE_MODE}`);
|
||||
console.log(`- Max memory: ${dragonflyConfig.DRAGONFLY_MAX_MEMORY}`);
|
||||
console.log(`- Pool size: ${dragonflyConfig.DRAGONFLY_POOL_SIZE}`);
|
||||
// Example Dragonfly client configuration
|
||||
const dragonflyClientConfig = {
|
||||
host: dragonflyConfig.DRAGONFLY_HOST,
|
||||
port: dragonflyConfig.DRAGONFLY_PORT,
|
||||
db: dragonflyConfig.DRAGONFLY_DATABASE,
|
||||
password: dragonflyConfig.DRAGONFLY_PASSWORD || undefined,
|
||||
username: dragonflyConfig.DRAGONFLY_USERNAME || undefined,
|
||||
retryDelayOnFailover: dragonflyConfig.DRAGONFLY_RETRY_DELAY,
|
||||
maxRetriesPerRequest: dragonflyConfig.DRAGONFLY_MAX_RETRIES,
|
||||
connectTimeout: dragonflyConfig.DRAGONFLY_CONNECT_TIMEOUT,
|
||||
commandTimeout: dragonflyConfig.DRAGONFLY_COMMAND_TIMEOUT,
|
||||
enableAutoPipelining: true,
|
||||
};
|
||||
|
||||
console.log('Dragonfly client configuration:', dragonflyClientConfig);
|
||||
|
||||
// Example cache key patterns
|
||||
const cachePatterns = {
|
||||
marketData: 'market:{symbol}:{timeframe}',
|
||||
indicators: 'indicators:{symbol}:{indicator}:{period}',
|
||||
positions: 'positions:{account_id}',
|
||||
orders: 'orders:{order_id}',
|
||||
rateLimit: 'rate_limit:{provider}:{endpoint}',
|
||||
sessions: 'session:{user_id}',
|
||||
};
|
||||
|
||||
console.log('Example cache key patterns:', cachePatterns);
|
||||
|
||||
// Example TTL configurations
|
||||
const ttlConfigs = {
|
||||
marketData: 60, // 1 minute for real-time data
|
||||
indicators: 300, // 5 minutes for calculated indicators
|
||||
positions: 30, // 30 seconds for positions
|
||||
orders: 86400, // 1 day for order history
|
||||
rateLimit: 3600, // 1 hour for rate limiting
|
||||
sessions: 1800, // 30 minutes for user sessions
|
||||
};
|
||||
|
||||
console.log('Example TTL configurations (seconds):', ttlConfigs);
|
||||
}
|
||||
|
||||
/**
|
||||
* Example 11: Monitoring stack configuration (Prometheus, Grafana, Loki)
|
||||
*/
|
||||
function monitoringConfigurationExample() {
|
||||
console.log('=== Monitoring Configuration Example ===');
|
||||
|
||||
// Prometheus configuration
|
||||
console.log('Prometheus settings:');
|
||||
console.log(`- Host: ${prometheusConfig.PROMETHEUS_HOST}`);
|
||||
console.log(`- Port: ${prometheusConfig.PROMETHEUS_PORT}`);
|
||||
console.log(`- Scrape interval: ${prometheusConfig.PROMETHEUS_SCRAPE_INTERVAL}`);
|
||||
console.log(`- Retention time: ${prometheusConfig.PROMETHEUS_RETENTION_TIME}`);
|
||||
|
||||
// Grafana configuration
|
||||
console.log('\nGrafana settings:');
|
||||
console.log(`- Host: ${grafanaConfig.GRAFANA_HOST}`);
|
||||
console.log(`- Port: ${grafanaConfig.GRAFANA_PORT}`);
|
||||
console.log(`- Admin user: ${grafanaConfig.GRAFANA_ADMIN_USER}`);
|
||||
console.log(`- Allow sign up: ${grafanaConfig.GRAFANA_ALLOW_SIGN_UP}`);
|
||||
console.log(`- Database type: ${grafanaConfig.GRAFANA_DATABASE_TYPE}`);
|
||||
|
||||
// Loki configuration
|
||||
console.log('\nLoki settings:');
|
||||
console.log(`- Host: ${lokiConfig.LOKI_HOST}`);
|
||||
console.log(`- Port: ${lokiConfig.LOKI_PORT}`);
|
||||
console.log(`- Batch size: ${lokiConfig.LOKI_BATCH_SIZE}`);
|
||||
console.log(`- Retention period: ${lokiConfig.LOKI_RETENTION_PERIOD}`);
|
||||
|
||||
// Example monitoring endpoints
|
||||
const monitoringEndpoints = {
|
||||
prometheus: `http://${prometheusConfig.PROMETHEUS_HOST}:${prometheusConfig.PROMETHEUS_PORT}`,
|
||||
grafana: `http://${grafanaConfig.GRAFANA_HOST}:${grafanaConfig.GRAFANA_PORT}`,
|
||||
loki: `http://${lokiConfig.LOKI_HOST}:${lokiConfig.LOKI_PORT}`,
|
||||
};
|
||||
|
||||
console.log('\nMonitoring endpoints:', monitoringEndpoints);
|
||||
|
||||
// Example metrics configuration
|
||||
const metricsConfig = {
|
||||
defaultLabels: {
|
||||
service: 'stock-bot',
|
||||
environment: getEnvironment(),
|
||||
version: process.env.npm_package_version || '1.0.0',
|
||||
},
|
||||
collectDefaultMetrics: true,
|
||||
prefix: 'stockbot_',
|
||||
buckets: [0.1, 0.5, 1, 2, 5, 10, 30, 60], // Response time buckets in seconds
|
||||
};
|
||||
|
||||
console.log('Example metrics configuration:', metricsConfig);
|
||||
}
|
||||
|
||||
/**
|
||||
* Example 12: Multi-database service configuration
|
||||
*/
|
||||
function multiDatabaseServiceExample() {
|
||||
console.log('=== Multi-Database Service Example ===');
|
||||
|
||||
// Complete database configuration for a microservice
|
||||
const serviceConfig = {
|
||||
service: {
|
||||
name: 'market-data-processor',
|
||||
version: '1.0.0',
|
||||
environment: getEnvironment(),
|
||||
},
|
||||
|
||||
// PostgreSQL for operational data
|
||||
postgresql: {
|
||||
host: postgresConfig.POSTGRES_HOST,
|
||||
port: postgresConfig.POSTGRES_PORT,
|
||||
database: postgresConfig.POSTGRES_DATABASE,
|
||||
username: postgresConfig.POSTGRES_USERNAME,
|
||||
password: postgresConfig.POSTGRES_PASSWORD,
|
||||
ssl: postgresConfig.POSTGRES_SSL,
|
||||
pool: {
|
||||
min: postgresConfig.POSTGRES_POOL_MIN,
|
||||
max: postgresConfig.POSTGRES_POOL_MAX,
|
||||
idleTimeout: postgresConfig.POSTGRES_POOL_IDLE_TIMEOUT,
|
||||
},
|
||||
},
|
||||
|
||||
// QuestDB for time-series data
|
||||
questdb: {
|
||||
host: questdbConfig.QUESTDB_HOST,
|
||||
httpPort: questdbConfig.QUESTDB_HTTP_PORT,
|
||||
pgPort: questdbConfig.QUESTDB_PG_PORT,
|
||||
database: questdbConfig.QUESTDB_DEFAULT_DATABASE,
|
||||
timeout: questdbConfig.QUESTDB_REQUEST_TIMEOUT,
|
||||
},
|
||||
|
||||
// MongoDB for document storage
|
||||
mongodb: {
|
||||
host: mongodbConfig.MONGODB_HOST,
|
||||
port: mongodbConfig.MONGODB_PORT,
|
||||
database: mongodbConfig.MONGODB_DATABASE,
|
||||
username: mongodbConfig.MONGODB_USERNAME,
|
||||
maxPoolSize: mongodbConfig.MONGODB_MAX_POOL_SIZE,
|
||||
readPreference: mongodbConfig.MONGODB_READ_PREFERENCE,
|
||||
},
|
||||
|
||||
// Dragonfly for caching
|
||||
dragonfly: {
|
||||
host: dragonflyConfig.DRAGONFLY_HOST,
|
||||
port: dragonflyConfig.DRAGONFLY_PORT,
|
||||
database: dragonflyConfig.DRAGONFLY_DATABASE,
|
||||
poolSize: dragonflyConfig.DRAGONFLY_POOL_SIZE,
|
||||
commandTimeout: dragonflyConfig.DRAGONFLY_COMMAND_TIMEOUT,
|
||||
},
|
||||
|
||||
// Monitoring
|
||||
monitoring: {
|
||||
prometheus: {
|
||||
pushGateway: `http://${prometheusConfig.PROMETHEUS_HOST}:${prometheusConfig.PROMETHEUS_PORT}`,
|
||||
scrapeInterval: prometheusConfig.PROMETHEUS_SCRAPE_INTERVAL,
|
||||
}, loki: {
|
||||
host: lokiConfig.LOKI_HOST,
|
||||
port: lokiConfig.LOKI_PORT,
|
||||
batchSize: lokiConfig.LOKI_BATCH_SIZE,
|
||||
labels: {
|
||||
service: 'market-data-processor',
|
||||
environment: getEnvironment(),
|
||||
},
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
console.log('Complete service configuration:', JSON.stringify(serviceConfig, null, 2));
|
||||
|
||||
// Example data flow
|
||||
const dataFlow = {
|
||||
ingestion: 'Market data → Dragonfly (cache) → QuestDB (storage)',
|
||||
processing: 'QuestDB → Analysis → PostgreSQL (results) → MongoDB (metadata)',
|
||||
serving: 'Dragonfly (cache) ← PostgreSQL/QuestDB ← API requests',
|
||||
monitoring: 'All services → Prometheus → Grafana dashboards',
|
||||
logging: 'All services → Loki → Grafana log viewer',
|
||||
};
|
||||
|
||||
console.log('\nData flow patterns:', dataFlow);
|
||||
}
|
||||
|
||||
/**
|
||||
* Example 8: Creating a service configuration object
|
||||
*/
|
||||
function serviceConfigurationExample() {
|
||||
console.log('=== Service Configuration Example ===');
|
||||
|
||||
// Example: Market Data Gateway service configuration
|
||||
const marketDataGatewayConfig = {
|
||||
service: {
|
||||
name: 'market-data-gateway',
|
||||
port: 3001,
|
||||
environment: getEnvironment(),
|
||||
},
|
||||
database: {
|
||||
host: postgresConfig.POSTGRES_HOST,
|
||||
port: postgresConfig.POSTGRES_PORT,
|
||||
name: postgresConfig.POSTGRES_DATABASE,
|
||||
ssl: postgresConfig.POSTGRES_SSL,
|
||||
}, logging: {
|
||||
level: loggingConfig.LOG_LEVEL,
|
||||
console: loggingConfig.LOG_CONSOLE,
|
||||
loki: {
|
||||
host: lokiConfig.LOKI_HOST,
|
||||
port: lokiConfig.LOKI_PORT,
|
||||
labels: {
|
||||
service: 'market-data-gateway',
|
||||
environment: getEnvironment(),
|
||||
}
|
||||
}
|
||||
},
|
||||
dataProviders: {
|
||||
default: DEFAULT_DATA_PROVIDER,
|
||||
enabled: getEnabledProviders(),
|
||||
timeout: dataProvidersConfig.DATA_PROVIDER_TIMEOUT,
|
||||
retries: dataProvidersConfig.DATA_PROVIDER_RETRIES,
|
||||
},
|
||||
cache: {
|
||||
enabled: dataProvidersConfig.DATA_CACHE_ENABLED,
|
||||
ttl: dataProvidersConfig.DATA_CACHE_TTL,
|
||||
maxSize: dataProvidersConfig.DATA_CACHE_MAX_SIZE,
|
||||
}
|
||||
};
|
||||
|
||||
console.log('Market Data Gateway configuration:', JSON.stringify(marketDataGatewayConfig, null, 2));
|
||||
}
|
||||
|
||||
/**
|
||||
* Main example runner
|
||||
*/
|
||||
function runAllExamples() {
|
||||
console.log('🚀 Stock Bot Configuration Examples\n');
|
||||
|
||||
try {
|
||||
basicUsageExample();
|
||||
console.log('\n');
|
||||
|
||||
databaseConnectionExample();
|
||||
console.log('\n');
|
||||
|
||||
loggingSetupExample();
|
||||
console.log('\n');
|
||||
|
||||
riskManagementExample();
|
||||
console.log('\n');
|
||||
|
||||
dataProviderExample();
|
||||
console.log('\n');
|
||||
|
||||
environmentSpecificExample();
|
||||
console.log('\n');
|
||||
|
||||
configurationValidationExample();
|
||||
console.log('\n');
|
||||
|
||||
questdbConfigurationExample();
|
||||
console.log('\n');
|
||||
|
||||
mongodbConfigurationExample();
|
||||
console.log('\n');
|
||||
|
||||
dragonflyConfigurationExample();
|
||||
console.log('\n');
|
||||
|
||||
monitoringConfigurationExample();
|
||||
console.log('\n');
|
||||
|
||||
multiDatabaseServiceExample();
|
||||
console.log('\n');
|
||||
|
||||
serviceConfigurationExample();
|
||||
|
||||
} catch (error) {
|
||||
console.error('Example execution error:', error);
|
||||
}
|
||||
}
|
||||
|
||||
// Export the examples for use in other files
|
||||
export {
|
||||
basicUsageExample,
|
||||
databaseConnectionExample,
|
||||
loggingSetupExample,
|
||||
riskManagementExample,
|
||||
dataProviderExample,
|
||||
environmentSpecificExample,
|
||||
configurationValidationExample,
|
||||
questdbConfigurationExample,
|
||||
mongodbConfigurationExample,
|
||||
dragonflyConfigurationExample,
|
||||
monitoringConfigurationExample,
|
||||
multiDatabaseServiceExample,
|
||||
serviceConfigurationExample,
|
||||
runAllExamples,
|
||||
};
|
||||
|
||||
// Run examples if this file is executed directly
|
||||
if (require.main === module) {
|
||||
runAllExamples();
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue