nats_wave 1.1.4 → 1.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,64 +1,113 @@
1
1
  # frozen_string_literal: true
2
- #
3
- NatsWave.configure do |config|
4
- # Basic configuration
5
- config.nats_url = ENV.fetch('NATS_URL', 'nats://localhost:4222')
6
- config.service_name = ENV.fetch('NATS_SERVICE_NAME',
7
- Rails.application.class.name.deconstantize.underscore)
8
- config.environment = Rails.env
9
-
10
- # Publishing configuration
11
- config.default_subject_prefix = "#{config.service_name}.events"
12
- config.publishing_enabled = true
13
- config.async_publishing = true
14
-
15
- # Subscription configuration
16
- config.subscription_enabled = true
17
- config.queue_group = "#{config.service_name}_consumers"
18
-
19
- # Model mappings (example)
20
- # config.add_model_mapping('ExternalAsset', 'Catalog', {
21
- # 'name' => 'title',
22
- # 'description' => 'body',
23
- # 'hammer_estimate' => 'cost'
24
- # })
25
-
26
- # Subscriptions (example)
27
- config.add_subscription('external.assets.*')
28
- config.add_subscription('catalog.items.*')
29
-
30
- # Custom subscription with handler
31
- # config.add_subscription('webhooks.external.*') do |message|
32
- # WebhookProcessor.process(message)
33
- # end
2
+
3
+ begin
4
+ Rails.logger.info "Initializing NATS Wave with URL: #{ENV['NATS_URL']}"
34
5
 
35
- # Middleware
36
- config.middleware_logging_enabled = true
37
- config.log_level = Rails.env.production? ? 'info' : 'debug'
6
+ NatsWave.configure do |config|
7
+ # === CORE CONNECTION SETTINGS ===
8
+ config.nats_url = ENV.fetch('NATS_URL', 'nats://localhost:4222')
9
+ config.service_name = ENV.fetch('NATS_SERVICE_NAME',
10
+ Rails.application.class.name.deconstantize.underscore)
11
+ config.connection_pool_size = 10
12
+ config.reconnect_attempts = 3
13
+
14
+ Rails.logger.info "NATS URL: #{config.nats_url}"
15
+ Rails.logger.info "Service Name: #{config.service_name}"
16
+
17
+ # === PUBLISHING CONFIGURATION ===
18
+ config.publishing_enabled = !Rails.env.test? # Disable in test environment
19
+ config.async_publishing = Rails.env.production? # Async only in production
20
+ config.default_subject_prefix = config.service_name # Use service name as prefix
21
+
22
+ # === SUBSCRIPTION CONFIGURATION ===
23
+ config.subscription_enabled = !Rails.env.test? # Disable in test environment
24
+ config.queue_group = "#{config.service_name}_consumers" # Queue group for load balancing
25
+
26
+ # === ERROR HANDLING ===
27
+ config.max_retries = 3 # Max retry attempts
28
+ config.retry_delay = 5 # Base retry delay in seconds
29
+ config.dead_letter_queue = "failed_messages" # Failed message storage
30
+
31
+ # === AUTHENTICATION (Optional) ===
32
+ if ENV['NATS_AUTH_SECRET'].present?
33
+ config.middleware_authentication_enabled = true
34
+ config.auth_secret_key = ENV['NATS_AUTH_SECRET']
35
+ end
36
+
37
+ # === VALIDATION (Optional) ===
38
+ if ENV['SCHEMA_REGISTRY_URL'].present?
39
+ config.middleware_validation_enabled = true
40
+ config.schema_registry_url = ENV['SCHEMA_REGISTRY_URL']
41
+ end
42
+
43
+ # === LOGGING ===
44
+ config.middleware_logging_enabled = true
45
+ config.log_level = Rails.env.production? ? 'info' : 'debug'
46
+ end
38
47
 
39
- # Authentication (optional)
40
- # config.middleware_authentication_enabled = true
41
- # config.auth_secret_key = ENV['NATS_AUTH_SECRET']
48
+ Rails.logger.info "NATS Wave configuration completed successfully"
49
+ rescue => e
50
+ Rails.logger.error "Failed to configure NATS Wave: #{e.message}"
51
+ Rails.logger.error e.backtrace.join("\n")
42
52
 
43
- # Validation (optional)
44
- # config.middleware_validation_enabled = true
45
- # config.schema_registry_url = ENV['SCHEMA_REGISTRY_URL']
53
+ # Optional: Re-raise in development to catch configuration issues early
54
+ raise e if Rails.env.development?
46
55
  end
47
56
 
48
- # Configure metrics backend if available
49
- NatsWave::Metrics.metrics_backend = StatsD if defined?(StatsD)
50
-
51
- # Auto-start subscriber in development
52
- if Rails.env.development?
53
- Rails.application.config.after_initialize do
54
- Thread.new do
55
- sleep 2 # Give Rails time to boot
56
- begin
57
- NatsWave.start_subscriber
58
- Rails.logger.info 'NatsWave subscriber started automatically'
59
- rescue StandardError => e
60
- Rails.logger.error "Failed to start NatsWave subscriber: #{e.message}"
57
+ # === AUTOMATIC SUBSCRIBER STARTUP ===
58
+ Rails.application.config.after_initialize do
59
+ Thread.new do
60
+ sleep 2 # Give Rails time to boot and load all models
61
+ begin
62
+ # Start subscriber - this will automatically process all registered model subscriptions
63
+ NatsWave.start_subscriber
64
+ Rails.logger.info "✅ NatsWave subscriber started successfully"
65
+
66
+ # Optional: Log subscription statistics
67
+ stats = NatsWave::ModelRegistry.subscription_stats
68
+ Rails.logger.info "📊 Active subscriptions: #{stats[:total_subscriptions]} across #{stats[:models_with_subscriptions]} models"
69
+
70
+ rescue StandardError => e
71
+ Rails.logger.error "Failed to start NatsWave subscriber: #{e.message}"
72
+ Rails.logger.error e.backtrace.join("\n")
73
+
74
+ # Optional: Alert monitoring systems
75
+ if defined?(Sentry)
76
+ Sentry.capture_exception(e, tags: { component: 'nats_wave_startup' })
61
77
  end
62
78
  end
63
79
  end
64
80
  end
81
+
82
+ # === DATADOG METRICS INTEGRATION (Optional) ===
83
+ if defined?(Datadog::Statsd) && !Rails.env.test?
84
+ # Get application version safely
85
+ app_version = begin
86
+ Rails.application.config.version
87
+ rescue
88
+ 'unknown'
89
+ end
90
+
91
+ NatsWave::Metrics.configure_datadog(
92
+ namespace: "#{Rails.application.class.name.deconstantize.underscore}.nats_wave",
93
+ tags: {
94
+ service: NatsWave.configuration.service_name,
95
+ environment: Rails.env,
96
+ version: app_version
97
+ }
98
+ )
99
+ Rails.logger.info "📈 Datadog metrics integration enabled"
100
+ end
101
+
102
+ # === GRACEFUL SHUTDOWN (Optional) ===
103
+ at_exit do
104
+ begin
105
+ if defined?(NatsWave) && NatsWave.client
106
+ Rails.logger.info "🛑 Shutting down NatsWave connections..."
107
+ NatsWave.client.disconnect!
108
+ Rails.logger.info "✅ NatsWave shutdown complete"
109
+ end
110
+ rescue => e
111
+ Rails.logger.error "Error during NatsWave shutdown: #{e.message}"
112
+ end
113
+ end
@@ -77,7 +77,7 @@ module NatsWave
77
77
  {
78
78
  service: @service_name,
79
79
  environment: ENV['RAILS_ENV'] || ENV['RACK_ENV'] || 'unknown',
80
- version: ENV['APP_VERSION'] || '1.1.4'
80
+ version: ENV['APP_VERSION'] || '1.1.7'
81
81
  }
82
82
  end
83
83