appsignal 3.0.25-java → 3.1.0-java

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,6 +1,8 @@
1
1
  module Appsignal
2
2
  module Probes
3
3
  class SidekiqProbe
4
+ include Helpers
5
+
4
6
  # @api private
5
7
  attr_reader :config
6
8
 
@@ -42,11 +44,15 @@ module Appsignal
42
44
 
43
45
  gauge "worker_count", stats.workers_size
44
46
  gauge "process_count", stats.processes_size
45
- gauge_delta :jobs_processed, "job_count", stats.processed,
46
- :status => :processed
47
- gauge_delta :jobs_failed, "job_count", stats.failed, :status => :failed
47
+ jobs_processed = gauge_delta :jobs_processed, stats.processed
48
+ if jobs_processed
49
+ gauge "job_count", jobs_processed, :status => :processed
50
+ end
51
+ jobs_failed = gauge_delta :jobs_failed, stats.failed
52
+ gauge "job_count", jobs_failed, :status => :failed if jobs_failed
48
53
  gauge "job_count", stats.retry_size, :status => :retry_queue
49
- gauge_delta :jobs_dead, "job_count", stats.dead_size, :status => :died
54
+ jobs_dead = gauge_delta :jobs_dead, stats.dead_size
55
+ gauge "job_count", jobs_dead, :status => :died if jobs_dead
50
56
  gauge "job_count", stats.scheduled_size, :status => :scheduled
51
57
  gauge "job_count", stats.enqueued, :status => :enqueued
52
58
  end
@@ -65,25 +71,6 @@ module Appsignal
65
71
  Appsignal.set_gauge "sidekiq_#{key}", value, tags
66
72
  end
67
73
 
68
- # Track the delta of two values for a gauge metric
69
- #
70
- # First call will store the data for the metric and the second call will
71
- # set a gauge metric with the difference. This is used for absolute
72
- # counter values which we want to track as gauges.
73
- #
74
- # @example
75
- # gauge_delta :my_cache_key, "my_gauge", 10
76
- # gauge_delta :my_cache_key, "my_gauge", 15
77
- # # Creates a gauge with the value `5`
78
- # @see #gauge
79
- def gauge_delta(cache_key, key, value, tags = {})
80
- previous_value = cache[cache_key]
81
- cache[cache_key] = value
82
- return unless previous_value
83
- new_value = value - previous_value
84
- gauge key, new_value, tags
85
- end
86
-
87
74
  def hostname
88
75
  return @hostname if defined?(@hostname)
89
76
  if config.key?(:hostname)
@@ -3,5 +3,6 @@ module Appsignal
3
3
  end
4
4
  end
5
5
 
6
+ require "appsignal/probes/helpers"
6
7
  require "appsignal/probes/mri"
7
8
  require "appsignal/probes/sidekiq"
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Appsignal
4
- VERSION = "3.0.25".freeze
4
+ VERSION = "3.1.0".freeze
5
5
  end
data/script/lint_git CHANGED
@@ -2,9 +2,9 @@
2
2
 
3
3
  set -eu
4
4
 
5
- LINTJE_VERSION="0.6.1"
5
+ LINTJE_VERSION="0.7.1"
6
6
 
7
- mkdir -p $HOME/bin
7
+ mkdir -p "$HOME/bin"
8
8
  cache_key=v1-lintje-$LINTJE_VERSION
9
9
  cache restore $cache_key
10
10
 
@@ -15,8 +15,8 @@ else
15
15
  echo "Downloading Lintje $LINTJE_VERSION"
16
16
  curl -L \
17
17
  https://github.com/tombruijn/lintje/releases/download/v$LINTJE_VERSION/x86_64-unknown-linux-gnu.tar.gz | \
18
- tar -xz --directory $HOME/bin
19
- cache store $cache_key $HOME/bin/lintje
18
+ tar -xz --directory "$HOME/bin"
19
+ cache store $cache_key "$HOME/bin/lintje"
20
20
  fi
21
21
 
22
- $HOME/bin/lintje $SEMAPHORE_GIT_COMMIT_RANGE
22
+ "$HOME/bin/lintje" "$SEMAPHORE_GIT_COMMIT_RANGE"
@@ -42,7 +42,11 @@ if DependencyHelper.capistrano3_present?
42
42
  describe "appsignal:deploy task" do
43
43
  before do
44
44
  ENV["USER"] = "batman"
45
- ENV["PWD"] = project_fixture_path
45
+ end
46
+ around do |example|
47
+ Dir.chdir project_fixture_path do
48
+ example.run
49
+ end
46
50
  end
47
51
 
48
52
  context "config" do
@@ -2,7 +2,7 @@ describe Appsignal::EventFormatter::ElasticSearch::SearchFormatter do
2
2
  let(:klass) { Appsignal::EventFormatter::ElasticSearch::SearchFormatter }
3
3
  let(:formatter) { klass.new }
4
4
 
5
- it "should register query.moped" do
5
+ it "should register search.elasticsearch" do
6
6
  expect(
7
7
  Appsignal::EventFormatter.registered?("search.elasticsearch", klass)
8
8
  ).to be_truthy
@@ -1,5 +1,23 @@
1
+ class AppsignalMock
2
+ attr_reader :distribution_values, :gauges
3
+
4
+ def initialize
5
+ @distribution_values = []
6
+ @gauges = []
7
+ end
8
+
9
+ def add_distribution_value(*args)
10
+ @distribution_values << args
11
+ end
12
+
13
+ def set_gauge(*args) # rubocop:disable Naming/AccessorMethodName
14
+ @gauges << args
15
+ end
16
+ end
17
+
1
18
  describe Appsignal::Probes::MriProbe do
2
- let(:probe) { described_class.new }
19
+ let(:appsignal_mock) { AppsignalMock.new }
20
+ let(:probe) { described_class.new(appsignal_mock) }
3
21
 
4
22
  describe ".dependencies_present?" do
5
23
  if DependencyHelper.running_jruby? || DependencyHelper.running_ruby_2_0?
@@ -16,18 +34,71 @@ describe Appsignal::Probes::MriProbe do
16
34
  unless DependencyHelper.running_jruby? || DependencyHelper.running_ruby_2_0?
17
35
  describe "#call" do
18
36
  it "should track vm metrics" do
19
- expect_distribution_value(:class_serial)
20
- expect_distribution_value(:global_constant_state)
37
+ probe.call
38
+ expect_distribution_value("ruby_vm", :class_serial)
39
+ expect_distribution_value("ruby_vm", :global_constant_state)
40
+ end
41
+
42
+ it "tracks thread counts" do
43
+ probe.call
44
+ expect_gauge_value("thread_count")
45
+ end
21
46
 
47
+ it "tracks GC total time" do
22
48
  probe.call
49
+ expect_gauge_value("gc_total_time")
50
+ end
51
+
52
+ it "tracks GC run count" do
53
+ expect(GC).to receive(:count).and_return(10, 15)
54
+ expect(GC).to receive(:stat).and_return(
55
+ { :minor_gc_count => 10, :major_gc_count => 10 },
56
+ :minor_gc_count => 16, :major_gc_count => 17
57
+ )
58
+ probe.call
59
+ probe.call
60
+ expect_distribution_value("gc_count", :gc_count, 5)
61
+ expect_distribution_value("gc_count", :minor_gc_count, 6)
62
+ expect_distribution_value("gc_count", :major_gc_count, 7)
63
+ end
64
+
65
+ it "tracks object allocation" do
66
+ expect(GC).to receive(:stat).and_return(
67
+ { :total_allocated_objects => 10 },
68
+ :total_allocated_objects => 15
69
+ )
70
+ # Only tracks delta value so the needs to be called twice
71
+ probe.call
72
+ probe.call
73
+ expect_gauge_value("allocated_objects", 5)
74
+ end
75
+
76
+ it "tracks heap slots" do
77
+ probe.call
78
+ expect_distribution_value("heap_slots", :heap_live)
79
+ expect_distribution_value("heap_slots", :heap_free)
23
80
  end
24
81
  end
82
+ end
83
+
84
+ def expect_distribution_value(expected_key, metric, expected_value = nil)
85
+ expect(appsignal_mock.distribution_values).to satisfy do |distribution_values|
86
+ distribution_values.any? do |distribution_value|
87
+ key, value, metadata = distribution_value
88
+ next unless key == expected_key
89
+ next unless expected_value ? expected_value == value : !value.nil?
90
+ next unless metadata == { :metric => metric }
25
91
 
26
- def expect_distribution_value(metric)
27
- expect(Appsignal).to receive(:add_distribution_value)
28
- .with("ruby_vm", kind_of(Numeric), :metric => metric)
29
- .and_call_original
30
- .once
92
+ true
93
+ end
94
+ end
95
+ end
96
+
97
+ def expect_gauge_value(expected_key, expected_value = nil)
98
+ expect(appsignal_mock.gauges).to satisfy do |gauges|
99
+ gauges.any? do |(key, value)|
100
+ expected_key == key && expected_value ? expected_value == value : !value.nil?
101
+ end
31
102
  end
32
103
  end
33
104
  end
@@ -15,7 +15,8 @@ describe Appsignal::Span do
15
15
  expect(root.to_h["span_id"].length).to eq 8
16
16
  expect(root.to_h["parent_span_id"]).to be_empty
17
17
  expect(root.to_h["name"]).to be_empty
18
- expect(root.to_h["start_time"]).to be > 1_600_000_000
18
+ expect(root.to_h["start_time_seconds"]).to be > 1_600_000_000
19
+ expect(root.to_h["start_time_nanoseconds"]).to be_kind_of(Numeric)
19
20
  expect(root.to_h["closed"]).to be false
20
21
  end
21
22
  end
@@ -29,7 +30,8 @@ describe Appsignal::Span do
29
30
  expect(child.to_h["span_id"].length).to eq 8
30
31
  expect(child.to_h["parent_span_id"]).to eq root.to_h["span_id"]
31
32
  expect(child.to_h["name"]).to be_empty
32
- expect(child.to_h["start_time"]).to be > 1_600_000_000
33
+ expect(root.to_h["start_time_seconds"]).to be > 1_600_000_000
34
+ expect(root.to_h["start_time_nanoseconds"]).to be_kind_of(Numeric)
33
35
  expect(child.to_h["closed"]).to be false
34
36
  end
35
37
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: appsignal
3
3
  version: !ruby/object:Gem::Version
4
- version: 3.0.25
4
+ version: 3.1.0
5
5
  platform: java
6
6
  authors:
7
7
  - Robert Beekman
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: bin
12
12
  cert_chain: []
13
- date: 2022-03-15 00:00:00.000000000 Z
13
+ date: 2022-07-28 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: rack
@@ -177,6 +177,8 @@ files:
177
177
  - gemfiles/grape.gemfile
178
178
  - gemfiles/no_dependencies.gemfile
179
179
  - gemfiles/padrino.gemfile
180
+ - gemfiles/psych-3.gemfile
181
+ - gemfiles/psych-4.gemfile
180
182
  - gemfiles/que.gemfile
181
183
  - gemfiles/que_beta.gemfile
182
184
  - gemfiles/rails-3.2.gemfile
@@ -213,7 +215,6 @@ files:
213
215
  - lib/appsignal/event_formatter/elastic_search/search_formatter.rb
214
216
  - lib/appsignal/event_formatter/faraday/request_formatter.rb
215
217
  - lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter.rb
216
- - lib/appsignal/event_formatter/moped/query_formatter.rb
217
218
  - lib/appsignal/event_formatter/sequel/sql_formatter.rb
218
219
  - lib/appsignal/extension.rb
219
220
  - lib/appsignal/extension/jruby.rb
@@ -268,6 +269,7 @@ files:
268
269
  - lib/appsignal/marker.rb
269
270
  - lib/appsignal/minutely.rb
270
271
  - lib/appsignal/probes.rb
272
+ - lib/appsignal/probes/helpers.rb
271
273
  - lib/appsignal/probes/mri.rb
272
274
  - lib/appsignal/probes/sidekiq.rb
273
275
  - lib/appsignal/rack/generic_instrumentation.rb
@@ -312,7 +314,6 @@ files:
312
314
  - spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb
313
315
  - spec/lib/appsignal/event_formatter/faraday/request_formatter_spec.rb
314
316
  - spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb
315
- - spec/lib/appsignal/event_formatter/moped/query_formatter_spec.rb
316
317
  - spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb
317
318
  - spec/lib/appsignal/event_formatter_spec.rb
318
319
  - spec/lib/appsignal/extension/jruby_spec.rb
@@ -440,7 +441,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
440
441
  - !ruby/object:Gem::Version
441
442
  version: '0'
442
443
  requirements: []
443
- rubygems_version: 3.3.6
444
+ rubygems_version: 3.3.12
444
445
  signing_key:
445
446
  specification_version: 4
446
447
  summary: Logs performance and exception data from your app to appsignal.com
@@ -465,7 +466,6 @@ test_files:
465
466
  - spec/lib/appsignal/event_formatter/elastic_search/search_formatter_spec.rb
466
467
  - spec/lib/appsignal/event_formatter/faraday/request_formatter_spec.rb
467
468
  - spec/lib/appsignal/event_formatter/mongo_ruby_driver/query_formatter_spec.rb
468
- - spec/lib/appsignal/event_formatter/moped/query_formatter_spec.rb
469
469
  - spec/lib/appsignal/event_formatter/sequel/sql_formatter_spec.rb
470
470
  - spec/lib/appsignal/event_formatter_spec.rb
471
471
  - spec/lib/appsignal/extension/jruby_spec.rb
@@ -1,86 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- module Appsignal
4
- class EventFormatter
5
- # @api private
6
- module Moped
7
- class QueryFormatter
8
- def format(payload)
9
- return unless payload[:ops]
10
- return if payload[:ops].empty?
11
-
12
- op = payload[:ops].first
13
- case op.class.to_s
14
- when "Moped::Protocol::Command"
15
- [
16
- "Command", {
17
- :database => op.full_collection_name,
18
- :selector => sanitize(op.selector, true, :mongodb)
19
- }.inspect
20
- ]
21
- when "Moped::Protocol::Query"
22
- [
23
- "Query", {
24
- :database => op.full_collection_name,
25
- :selector => sanitize(op.selector, false, :mongodb),
26
- :flags => op.flags,
27
- :limit => op.limit,
28
- :skip => op.skip,
29
- :fields => op.fields
30
- }.inspect
31
- ]
32
- when "Moped::Protocol::Delete"
33
- [
34
- "Delete", {
35
- :database => op.full_collection_name,
36
- :selector => sanitize(op.selector, false, :mongodb),
37
- :flags => op.flags
38
- }.inspect
39
- ]
40
- when "Moped::Protocol::Insert"
41
- [
42
- "Insert", {
43
- :database => op.full_collection_name,
44
- :documents => sanitize(op.documents, true, :mongodb),
45
- :count => op.documents.count,
46
- :flags => op.flags
47
- }.inspect
48
- ]
49
- when "Moped::Protocol::Update"
50
- [
51
- "Update",
52
- {
53
- :database => op.full_collection_name,
54
- :selector => sanitize(op.selector, false, :mongodb),
55
- :update => sanitize(op.update, true, :mongodb),
56
- :flags => op.flags
57
- }.inspect
58
- ]
59
- when "Moped::Protocol::KillCursors"
60
- [
61
- "KillCursors",
62
- { :number_of_cursor_ids => op.number_of_cursor_ids }.inspect
63
- ]
64
- else
65
- [
66
- op.class.to_s.sub("Moped::Protocol::", ""),
67
- { :database => op.full_collection_name }.inspect
68
- ]
69
- end
70
- end
71
-
72
- private
73
-
74
- def sanitize(params, only_top_level, key_sanitizer)
75
- Appsignal::Utils::QueryParamsSanitizer.sanitize \
76
- params, only_top_level, key_sanitizer
77
- end
78
- end
79
- end
80
- end
81
- end
82
-
83
- Appsignal::EventFormatter.register(
84
- "query.moped",
85
- Appsignal::EventFormatter::Moped::QueryFormatter
86
- )
@@ -1,118 +0,0 @@
1
- describe Appsignal::EventFormatter::Moped::QueryFormatter do
2
- let(:klass) { Appsignal::EventFormatter::Moped::QueryFormatter }
3
- let(:formatter) { klass.new }
4
-
5
- it "should register query.moped" do
6
- expect(Appsignal::EventFormatter.registered?("query.moped", klass)).to be_truthy
7
- end
8
-
9
- describe "#format" do
10
- let(:payload) { { :ops => [op] } }
11
- subject { formatter.format(payload) }
12
-
13
- context "without ops in the payload" do
14
- let(:payload) { {} }
15
-
16
- it { is_expected.to be_nil }
17
- end
18
-
19
- context "when ops is nil in the payload" do
20
- let(:payload) { { :ops => nil } }
21
-
22
- it { is_expected.to be_nil }
23
- end
24
-
25
- context "Moped::Protocol::Command" do
26
- let(:op) do
27
- double(
28
- :full_collection_name => "database.collection",
29
- :selector => { "query" => { "_id" => "abc" } },
30
- :class => double(:to_s => "Moped::Protocol::Command")
31
- )
32
- end
33
-
34
- it { is_expected.to eq ["Command", '{:database=>"database.collection", :selector=>{"query"=>"?"}}'] }
35
- end
36
-
37
- context "Moped::Protocol::Query" do
38
- let(:op) do
39
- double(
40
- :full_collection_name => "database.collection",
41
- :selector => { "_id" => "abc" },
42
- :flags => [],
43
- :limit => 0,
44
- :skip => 0,
45
- :fields => nil,
46
- :class => double(:to_s => "Moped::Protocol::Query")
47
- )
48
- end
49
-
50
- it { is_expected.to eq ["Query", '{:database=>"database.collection", :selector=>{"_id"=>"?"}, :flags=>[], :limit=>0, :skip=>0, :fields=>nil}'] }
51
- end
52
-
53
- context "Moped::Protocol::Delete" do
54
- let(:op) do
55
- double(
56
- :full_collection_name => "database.collection",
57
- :selector => { "_id" => "abc" },
58
- :flags => [],
59
- :class => double(:to_s => "Moped::Protocol::Delete")
60
- )
61
- end
62
-
63
- it { is_expected.to eq ["Delete", '{:database=>"database.collection", :selector=>{"_id"=>"?"}, :flags=>[]}'] }
64
- end
65
-
66
- context "Moped::Protocol::Insert" do
67
- let(:op) do
68
- double(
69
- :full_collection_name => "database.collection",
70
- :flags => [],
71
- :documents => [
72
- { "_id" => "abc", "events" => { "foo" => [{ "bar" => "baz" }] } },
73
- { "_id" => "def", "events" => { "foo" => [{ "baz" => "bar" }] } }
74
- ],
75
- :class => double(:to_s => "Moped::Protocol::Insert")
76
- )
77
- end
78
-
79
- it { is_expected.to eq ["Insert", '{:database=>"database.collection", :documents=>[{"_id"=>"?", "events"=>"?"}], :count=>2, :flags=>[]}'] }
80
- end
81
-
82
- context "Moped::Protocol::Update" do
83
- let(:op) do
84
- double(
85
- :full_collection_name => "database.collection",
86
- :selector => { "_id" => "abc" },
87
- :update => { "user.name" => "James Bond" },
88
- :flags => [],
89
- :class => double(:to_s => "Moped::Protocol::Update")
90
- )
91
- end
92
-
93
- it { is_expected.to eq ["Update", '{:database=>"database.collection", :selector=>{"_id"=>"?"}, :update=>{"user.?"=>"?"}, :flags=>[]}'] }
94
- end
95
-
96
- context "Moped::Protocol::KillCursors" do
97
- let(:op) do
98
- double(
99
- :number_of_cursor_ids => 2,
100
- :class => double(:to_s => "Moped::Protocol::KillCursors")
101
- )
102
- end
103
-
104
- it { is_expected.to eq ["KillCursors", "{:number_of_cursor_ids=>2}"] }
105
- end
106
-
107
- context "Moped::Protocol::Other" do
108
- let(:op) do
109
- double(
110
- :full_collection_name => "database.collection",
111
- :class => double(:to_s => "Moped::Protocol::Other")
112
- )
113
- end
114
-
115
- it { is_expected.to eq ["Other", '{:database=>"database.collection"}'] }
116
- end
117
- end
118
- end