solid_apm 0.3.0 → 0.4.0
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 +4 -4
- data/README.md +3 -3
- data/app/assets/javascripts/solid_apm/controllers/transaction-chart_controller.js +12 -2
- data/app/controllers/solid_apm/transactions_controller.rb +18 -5
- data/app/views/solid_apm/transactions/index.html.erb +22 -1
- data/lib/solid_apm/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f8623eafef426a98627eef8810538b4ad1100a125eadcdb99bf2db0df21cadc1
|
4
|
+
data.tar.gz: 386f31259d69c1ae17a182c1b6faf6368b8802c2bccf2985fa9e7853f9fc3ddb
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 2cc471473ae3e41df512e12b6183c0410aaae6325f8a21db2f78e6f84caf22824b503e411eaa8f4508b40250511c9c4ea597f7de2929693ae30959977f6e4097
|
7
|
+
data.tar.gz: 03e17274e463f8e60fe50c9d22220a5f930570da6000802d227a9da2f28b4a51e84ba06af1009d6e32479f2a54a3ea95c21999ec2b06d0f18d00d94ecd17c5aa
|
data/README.md
CHANGED
@@ -3,8 +3,8 @@
|
|
3
3
|
# SolidApm
|
4
4
|
Rails engine to manage APM data without using a third party service.
|
5
5
|
|
6
|
-
<img src="./docs/img.png" width="
|
7
|
-
<img src="./docs/img_1.png" width="
|
6
|
+
<img src="./docs/img.png" width="600px">
|
7
|
+
<img src="./docs/img_1.png" width="600px">
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
@@ -70,7 +70,7 @@ Contribution directions go here.
|
|
70
70
|
|
71
71
|
```shell
|
72
72
|
gem bump -v minor
|
73
|
-
bundle install && git add . && git commit --amend --no-edit
|
73
|
+
bundle install && git add Gemfile.lock && git commit --amend --no-edit && git push
|
74
74
|
gem tag -p
|
75
75
|
```
|
76
76
|
|
@@ -28,6 +28,9 @@ window.Stimulus.register('transaction-chart',
|
|
28
28
|
xaxis: {
|
29
29
|
type: 'datetime'
|
30
30
|
},
|
31
|
+
dataLabels: {
|
32
|
+
enabled: false
|
33
|
+
},
|
31
34
|
tooltip: {
|
32
35
|
x: {
|
33
36
|
formatter: function (value) {
|
@@ -37,9 +40,16 @@ window.Stimulus.register('transaction-chart',
|
|
37
40
|
}
|
38
41
|
}
|
39
42
|
|
40
|
-
let path = 'transactions/count_by_minutes'
|
43
|
+
let path = window.location.pathname.includes('transactions') ? 'count_by_minutes' : 'transactions/count_by_minutes';
|
44
|
+
path = path + "?";
|
41
45
|
if (this.nameValue) {
|
42
|
-
path = path + "
|
46
|
+
path = path + "name=" + encodeURIComponent(this.nameValue);
|
47
|
+
}
|
48
|
+
|
49
|
+
const fromValue = document.querySelector('input[name="from_value"]').value
|
50
|
+
const fromUnit = document.querySelector('select[name="from_unit"]').value;
|
51
|
+
if (fromValue && fromUnit) {
|
52
|
+
path = path + "&from_value=" + fromValue + "&from_unit=" + fromUnit;
|
43
53
|
}
|
44
54
|
|
45
55
|
fetch(path)
|
@@ -2,18 +2,20 @@
|
|
2
2
|
|
3
3
|
module SolidApm
|
4
4
|
class TransactionsController < ApplicationController
|
5
|
-
TransactionAggregation = Struct.new(:name, :tmp, :latency, :impact)
|
5
|
+
TransactionAggregation = Struct.new(:name, :tmp, :latency, :percentile_95, :impact)
|
6
6
|
|
7
7
|
def index
|
8
|
-
@aggregated_transactions = Transaction.where(created_at:
|
8
|
+
@aggregated_transactions = Transaction.where(created_at: from_to_range).group_by(&:name)
|
9
9
|
@aggregated_transactions.transform_values! do |transactions|
|
10
10
|
latency = transactions.map(&:duration).sum / transactions.size
|
11
|
-
tmp = transactions.size.to_f / 60
|
11
|
+
tmp = transactions.size.to_f / ((from_to_range.end - from_to_range.begin) / 60).to_i
|
12
12
|
impact = latency * tmp
|
13
|
+
percentile_95 = transactions[transactions.size * 0.95].duration
|
13
14
|
TransactionAggregation.new(
|
14
15
|
transactions.first.name,
|
15
16
|
tmp,
|
16
17
|
latency,
|
18
|
+
percentile_95,
|
17
19
|
impact
|
18
20
|
)
|
19
21
|
end
|
@@ -24,7 +26,8 @@ module SolidApm
|
|
24
26
|
# Normalize impact 0-100
|
25
27
|
@aggregated_transactions.each do |_, aggregation|
|
26
28
|
normalized_impact = ((aggregation.impact - min_impact) / (max_impact - min_impact)) * 100
|
27
|
-
|
29
|
+
normalized_impact = 0 if normalized_impact.nan?
|
30
|
+
aggregation.impact = normalized_impact.to_i || 0
|
28
31
|
end
|
29
32
|
@aggregated_transactions = @aggregated_transactions.sort_by { |_, v| -v.impact }.to_h
|
30
33
|
end
|
@@ -45,7 +48,7 @@ module SolidApm
|
|
45
48
|
|
46
49
|
def count_by_minutes
|
47
50
|
scope = Transaction.all.order(timestamp: :desc)
|
48
|
-
.where(created_at:
|
51
|
+
.where(created_at: from_to_range)
|
49
52
|
|
50
53
|
if params[:name].present?
|
51
54
|
scope = scope.where(name: params[:name])
|
@@ -54,5 +57,15 @@ module SolidApm
|
|
54
57
|
render json: scope.group_by { |t| t.created_at.beginning_of_minute }
|
55
58
|
.transform_values!(&:count)
|
56
59
|
end
|
60
|
+
|
61
|
+
private
|
62
|
+
|
63
|
+
def from_to_range
|
64
|
+
params[:from_value] ||= 60
|
65
|
+
params[:from_unit] ||= 'minutes'
|
66
|
+
from = params[:from_value].to_i.public_send(params[:from_unit].to_sym).ago
|
67
|
+
to = Time.current
|
68
|
+
(from..to)
|
69
|
+
end
|
57
70
|
end
|
58
71
|
end
|
@@ -1,6 +1,25 @@
|
|
1
1
|
<h1 class="title">Transactions</h1>
|
2
2
|
|
3
|
-
|
3
|
+
<%= form_with path: transactions_path, method: :get do |f| %>
|
4
|
+
<div class="is-flex is-flex-direction-row is-justify-content-center is-align-items-center" style="gap: 1em">
|
5
|
+
<%= f.label 'From' %>
|
6
|
+
<%= f.number_field :from_value, value: params[:from_value] || 60, min: 1, class: 'input', style: 'width: 6em' %>
|
7
|
+
<div class="select">
|
8
|
+
<%= f.select :from_unit, {
|
9
|
+
"minutes" => "minutes",
|
10
|
+
"hours" => "hours",
|
11
|
+
"days" => "days",
|
12
|
+
"weeks" => "weeks",
|
13
|
+
"months" => "months",
|
14
|
+
"years" => "years"
|
15
|
+
}, {selected: params[:from_unit] || 'minutes' } %>
|
16
|
+
</div>
|
17
|
+
<span class="has-text-white-ter">ago</span>
|
18
|
+
<b>→</b>
|
19
|
+
<span class="has-text-white-ter">now</span>
|
20
|
+
<%= f.submit 'Apply', class: 'button' %>
|
21
|
+
</div>
|
22
|
+
<% end %>
|
4
23
|
<div data-controller="transaction-chart"></div>
|
5
24
|
|
6
25
|
<table class="table is-fullwidth">
|
@@ -9,6 +28,7 @@
|
|
9
28
|
<th>Name</th>
|
10
29
|
<th>Latency</th>
|
11
30
|
<th>tmp</th>
|
31
|
+
<th>95p</th>
|
12
32
|
<th>Impact</th>
|
13
33
|
</tr>
|
14
34
|
</thead>
|
@@ -18,6 +38,7 @@
|
|
18
38
|
<td><%= link_to name, transaction_by_name_path(name) %></td>
|
19
39
|
<td><%= aggregation.latency.round(2) %> ms</td>
|
20
40
|
<td><%= aggregation.tmp.round(2) %></td>
|
41
|
+
<td><%= aggregation.percentile_95.round(2) %> ms</td>
|
21
42
|
<td>
|
22
43
|
<progress class="progress is-warning" value="<%= aggregation.impact %>" max="100"></progress>
|
23
44
|
</td>
|
data/lib/solid_apm/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solid_apm
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jean-Francis Bastien
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2024-06-
|
11
|
+
date: 2024-06-15 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: actionpack
|