appsignal 3.0.25-java → 3.1.0-java

Sign up to get free protection for your applications and to get access to all the features.
@@ -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