neetodeploy-autoscale 2.0.9 → 2.1.1

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5064a81417af764a12450cf56db7a8dd1e6b15c784536808ffcb84be9603b255
4
- data.tar.gz: d2bcff1b1bc78f3dc00996c3149d3cba1bd25b78bfbfc6ef8f08e66357464068
3
+ metadata.gz: 6fbdfc1d87b0053e4b1eb596ed2f5e80ab399d4594d7fb15dcb728cafb6d37ea
4
+ data.tar.gz: 04d5cb5480ee7f19eaba0aad33d3b3ebf8e1b92b467d360ddf1ec46d72556766
5
5
  SHA512:
6
- metadata.gz: 738f8a948ac3a6767b200c41fe4175a17e5a57c253931cc50c0cc875115a9bc9decfe0851a28933254928107c7f7993b2825c735649f565d83358891bbe12acb
7
- data.tar.gz: d631a416a5c2e441545081db9545eca86ebe52756e273bb6124083b05d77c9a4a5d8225f2bf80a5d951752fcb148b102fd182fd87a6f733fb4c0c5299c6a1613
6
+ metadata.gz: c70e22b853a98d042e1d3d5648b39c17c6a3fa090f6d61cfdb29978f4983c42cce612766c1728e19f0c4fecd1060262bfa5ded2dfcb2626470c5814f7fe9f8e5
7
+ data.tar.gz: f39de77eb99413829323bd4d9f1f0f7874f21804bda4e23c3dfa763ca0e41e3992b2ed7d359cf7a4ee8128106f8e1d27686f69e5de14449829bafe43ea0aeaec
@@ -1,13 +1,15 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require "neetodeploy/autoscale/config"
4
+ require "neetodeploy/autoscale/logger"
4
5
 
5
6
  module Neetodeploy
6
7
  module Rails
7
8
  class Metrics
8
9
  def initialize(env, config = Config.instance)
9
10
  @config = config
10
- @request_start_header = env["HTTP_X_REQUEST_START"].to_i
11
+ @request_start_header_raw = env["HTTP_X_REQUEST_START"]
12
+ @request_start_header = @request_start_header_raw.to_i
11
13
  @network_time = env["puma.request_body_wait"].to_i
12
14
  end
13
15
 
@@ -16,13 +18,26 @@ module Neetodeploy
16
18
  end
17
19
 
18
20
  def queue_time
19
- return if @request_start_header.zero?
21
+ # Debug: Log if header is missing or invalid
22
+ if @request_start_header_raw.nil? || @request_start_header_raw.empty?
23
+ NeetoDeploy::Logger.logger.debug("X-Request-Start header missing or empty")
24
+ return nil
25
+ end
26
+
27
+ return nil if @request_start_header.zero?
20
28
 
21
29
  time_now = Time.now.to_f * 1000
22
30
 
23
31
  queue_time = (time_now - @request_start_header).round
24
32
  queue_time -= @network_time
25
33
 
34
+ # Log both values for debugging
35
+ NeetoDeploy::Logger.logger.debug(
36
+ "Queue time calculation: X-Request-Start=#{@request_start_header_raw} (#{@request_start_header}ms), " \
37
+ "puma.request_body_wait=#{@network_time}ms, time_now=#{time_now.round}ms, " \
38
+ "calculated_queue_time=#{queue_time}ms"
39
+ )
40
+
26
41
  queue_time.positive? ? queue_time : nil
27
42
  end
28
43
  end
@@ -74,11 +74,20 @@ module Neetodeploy
74
74
  sorted_data = data.sort
75
75
  size = sorted_data.size
76
76
 
77
+ # Calculate percentiles
78
+ p90 = percentile_value(sorted_data, size, 0.90)
79
+ p95 = percentile_value(sorted_data, size, 0.95)
80
+ p99 = percentile_value(sorted_data, size, 0.99)
81
+ avg = data.sum / data.size
82
+
83
+ # Log sample size and values for debugging
84
+ logger.debug("Calculated metrics from #{size} samples: avg=#{avg}, p90=#{p90}, p95=#{p95}, p99=#{p99}")
85
+
77
86
  metrics = [
78
- { metric_name: "queue_time_p90", metric_value: percentile_value(sorted_data, size, 0.90) },
79
- { metric_name: "queue_time_p95", metric_value: percentile_value(sorted_data, size, 0.95) },
80
- { metric_name: "queue_time_p99", metric_value: percentile_value(sorted_data, size, 0.99) },
81
- { metric_name: "queue_time", metric_value: data.sum / data.size }
87
+ { metric_name: "queue_time_p90", metric_value: p90 },
88
+ { metric_name: "queue_time_p95", metric_value: p95 },
89
+ { metric_name: "queue_time_p99", metric_value: p99 },
90
+ { metric_name: "queue_time", metric_value: avg }
82
91
  ]
83
92
 
84
93
  Reporter.report_batch(metrics, "web", nil, config)
@@ -90,7 +99,11 @@ module Neetodeploy
90
99
  end
91
100
 
92
101
  def percentile_value(sorted_data, size, percentile)
102
+ # Use nearest rank method: index = ceil(size * percentile) - 1
103
+ # For small samples, this ensures we get a valid index
93
104
  index = [(size * percentile).ceil - 1, 0].max
105
+ # Clamp index to valid range
106
+ index = [index, size - 1].min
94
107
  sorted_data[index]
95
108
  end
96
109
 
@@ -28,9 +28,9 @@ module Neetodeploy
28
28
  return if metrics.empty?
29
29
 
30
30
  payload = build_batch_payload(metrics, process_type, queue_name, config)
31
- url = config.batch_processing_enabled? ? config.metrics_server_batch_url : config.metrics_server_url
31
+ url = config.metrics_server_batch_url
32
32
 
33
- logger.info("Batch reporting #{metrics.size} metrics for #{process_type}")
33
+ NeetoDeploy::Logger.logger.info("Batch reporting #{metrics.size} metrics for #{process_type}")
34
34
  post_batch_request(url, payload, config)
35
35
  end
36
36
 
@@ -68,12 +68,12 @@ module Neetodeploy
68
68
  def self.post_batch_request(url, payload, config)
69
69
  uri = URI.parse(url)
70
70
  request = build_post_request(uri, config.metrics_server_auth_token)
71
- request.body = encode_form_data(payload)
72
- request["Content-Type"] = "application/x-www-form-urlencoded"
71
+ request.body = JSON.generate(payload)
72
+ request["Content-Type"] = "application/json"
73
73
 
74
74
  http_request(uri, request)
75
75
  rescue StandardError => e
76
- logger.error("Error batch reporting metrics: #{e.message}")
76
+ NeetoDeploy::Logger.logger.error("Error batch reporting metrics: #{e.message}")
77
77
  raise
78
78
  end
79
79
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Neetodeploy
4
4
  module Autoscale
5
- VERSION = "2.0.9"
5
+ VERSION = "2.1.1"
6
6
  end
7
7
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: neetodeploy-autoscale
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.0.9
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sreeram Venkitesh