neetodeploy-autoscale 2.1.0 → 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: 0145f086b228a70465a545010cf4850439f693bc9741a4b5697b1602955da4bc
4
- data.tar.gz: 44d5532c77509ec4acff886250e8f95df55a5e67020087753395364f090ab36f
3
+ metadata.gz: 6fbdfc1d87b0053e4b1eb596ed2f5e80ab399d4594d7fb15dcb728cafb6d37ea
4
+ data.tar.gz: 04d5cb5480ee7f19eaba0aad33d3b3ebf8e1b92b467d360ddf1ec46d72556766
5
5
  SHA512:
6
- metadata.gz: 3e04d65d913871f87e63b827184749a1d7dd0f5831714fb3d0b4a6c37b8658654a49d17c5c76982f16e938528389e917a44236e6f3dd0e79792968f333ede717
7
- data.tar.gz: bf18a663157385c4c93356710d3f0e76f58665070a2b35e6a2dacdf4bb574ee2d6c986722482e9862d26ae619817be3532113cf291fbd4e794efe0bb2f527883
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
 
@@ -2,6 +2,6 @@
2
2
 
3
3
  module Neetodeploy
4
4
  module Autoscale
5
- VERSION = "2.1.0"
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.1.0
4
+ version: 2.1.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sreeram Venkitesh