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:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 6fbdfc1d87b0053e4b1eb596ed2f5e80ab399d4594d7fb15dcb728cafb6d37ea
|
|
4
|
+
data.tar.gz: 04d5cb5480ee7f19eaba0aad33d3b3ebf8e1b92b467d360ddf1ec46d72556766
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
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
|
-
@
|
|
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
|
-
|
|
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:
|
|
79
|
-
{ metric_name: "queue_time_p95", metric_value:
|
|
80
|
-
{ metric_name: "queue_time_p99", metric_value:
|
|
81
|
-
{ metric_name: "queue_time", metric_value:
|
|
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.
|
|
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 =
|
|
72
|
-
request["Content-Type"] = "application/
|
|
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
|
|