oneapm_rpm 1.3.0 → 1.3.1.rc1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- NmM5MzBlNWY2MWNmZTA3MjlmYjYxY2U2Y2VlODk5NWU2NWJkODA4MQ==
4
+ MDFiNGM3MmU4Nzc4YWI3NGI4ZmRkZWE0ZWE1MTZlZDcwZDY4Yjg3Zg==
5
5
  data.tar.gz: !binary |-
6
- ZmQyNGNkZDA0MGRkMWE0ODYwY2YxNzFhNjBhZjg5OWY1OGE2YWY3MA==
6
+ N2Y1YjMwNWRkNjQ2MDJhMWMxM2VmZWY0ZmE3NTQ2NjBkMGM3YzgzZg==
7
7
  SHA512:
8
8
  metadata.gz: !binary |-
9
- ZDk2ZmVhNjhkYTY1ZDllODk4NmIwNzNiN2Y2YWZkMjUzNDA2NWU3YTViYTJj
10
- YTQxMzkxMGZiOTc2YjE5YjY0OWQ5MzJiZWIxOTNhY2VmY2UyYWY3NzViMTQ4
11
- OTZmZGQ1OTQ2ZmYzYjk0NjY2MTNjMzBhOGY4NmI5YTA0YWQxYzI=
9
+ NjliZjM4NTc4ODg5N2YyOGIzZThmOGQyNjM3OGI0OTExOTFhM2IwYzJlOWM2
10
+ ODY1Y2FlNzkzZWQzYWI3N2U0ZDMwMzQ2MzA4ZTAzMjNjMTEzNWM3YjJmZjA2
11
+ OGQwNzlkM2JhOTI5NGU0YjZkZmViYjk1ZTEzYjliZWEzMTBiM2Q=
12
12
  data.tar.gz: !binary |-
13
- MDM3MjBjOGI4ZWRjMzViZmVlNzZlOWVlOWFhYTg3MzY1MmZhYTliM2I5Nzdm
14
- ZGQ5YmRiOTAwOWNhMzA0OGJkOWE2NjBmNGNlNGIzNjhlOTkzZDNkOWVjYmQx
15
- YWQ3YjRjN2RiZjBmZmFjMjhjOTg4YzYwMmJhZjdiNTQxZjFhNTc=
13
+ NzYxOWQ5ODVjZjgyOTdhOWE3OWIwMDEyZTYzMjIyNDE1YWYzYzk4ZGRkNDYy
14
+ N2Y1M2ZjOTNlZWI4OGRhOGM4ZDUzZDUxYTcwMzVmMzg1MGMxODNmOTg5MWQw
15
+ YjczZjVhMzA5ZmQ4M2QxYmM1ZTY2ZGU4ODdhODUxNTNhYzJkODg=
@@ -872,6 +872,13 @@ module OneApm
872
872
  :notified => false,
873
873
  :description => 'Enable or disable insert js agent as text'
874
874
  },
875
+ :'browser_monitoring.position' => {
876
+ :default => '',
877
+ :public => true,
878
+ :type => String,
879
+ :notified => true,
880
+ :description => 'position of page which is inerted JavaScript agent.'
881
+ },
875
882
  :js_agent_loader => {
876
883
  :default => '',
877
884
  :public => false,
@@ -0,0 +1,98 @@
1
+ # encoding: utf-8
2
+
3
+ module OneApm
4
+ module Agent
5
+ module Instrumentation
6
+ module ThriftHelper
7
+
8
+ def operator result_klass
9
+ namespaces = result_klass.to_s.split('::')
10
+ operator_name = 'unknown'
11
+ if namespaces.last =~ /_result/
12
+ operator_name = namespaces.last.sub('_result', '').downcase
13
+ end
14
+ operator_name
15
+ end
16
+
17
+ def thost
18
+ @thost ||= @iprot.instance_variable_get("@trans") \
19
+ .instance_variable_get("@transport") \
20
+ .instance_variable_get("@host") rescue nil
21
+ end
22
+
23
+ def metrics operator_name
24
+ metrics = if thost.nil?
25
+ ["External/Thrift/#{operator_name}"]
26
+ else
27
+ ["External/#{thost}/Thrift/#{operator_name}", "External/#{thost}/all"]
28
+ end
29
+ metrics << "External/all"
30
+ if OneApm::Transaction.recording_web_transaction?
31
+ metrics << "External/allWeb"
32
+ else
33
+ metrics << "External/allOther"
34
+ end
35
+ metrics
36
+ end
37
+
38
+ def started_time op
39
+ _op_ = operations.delete(op)
40
+ (_op_ && _op_[:started_time]) or Time.now.to_f
41
+ end
42
+
43
+ def operations
44
+ @operations ||= {}
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+
51
+ LibraryDetection.defer do
52
+ named :thrift
53
+
54
+ depends_on do
55
+ defined?(::Thrift) && defined?(::Thrift::Client)
56
+ end
57
+
58
+ executes do
59
+ OneApm::Manager.logger.info 'Installing Thrift instrumentation'
60
+ end
61
+
62
+ executes do
63
+ ::Thrift::Client.module_eval do
64
+ include OneApm::Agent::Instrumentation::ThriftHelper
65
+
66
+ def send_message_with_oneapm(name, args_class, args = {})
67
+ operations[name] = {:started_time => Time.now.to_f}
68
+ send_message_without_oneapm(name, args_class, args)
69
+ end
70
+ alias :send_message_without_oneapm :send_message
71
+ alias :send_message :send_message_with_oneapm
72
+
73
+ def send_oneway_message_with_oneapm(name, args_class, args = {})
74
+ op_started = Time.now.to_f
75
+ base, *other_metrics = metrics(name)
76
+ result = send_oneway_message_without_oneapm(name, args_class, args)
77
+ duration = Time.now.to_f - op_started
78
+ OneApm::Manager.agent.stats_engine.tl_record_scoped_and_unscoped_metrics(base, other_metrics, duration)
79
+ result
80
+ end
81
+ alias :send_oneway_message_without_oneapm :send_oneway_message
82
+ alias :send_oneway_message :send_oneway_message_with_oneapm
83
+
84
+ def receive_message_with_oneapm(result_klass)
85
+ op = operator(result_klass)
86
+ op_started = started_time(op)
87
+ base, *other_metrics = metrics(op)
88
+ result = receive_message_without_oneapm(result_klass)
89
+ duration = Time.now.to_f - op_started
90
+ OneApm::Manager.agent.stats_engine.tl_record_scoped_and_unscoped_metrics(base, other_metrics, duration)
91
+ result
92
+ end
93
+
94
+ alias :receive_message_without_oneapm :receive_message
95
+ alias :receive_message :receive_message_with_oneapm
96
+ end
97
+ end
98
+ end
@@ -64,13 +64,13 @@ module OneApm
64
64
  base, *other_metrics = mertircs(event)
65
65
 
66
66
  started_time = Time.now.to_f
67
- frame = stack.push_frame(state, :mongo_tracer, started_time)
67
+ frame = stack.push_frame(state, :mongo_tracer, started_time - duration)
68
68
 
69
69
  builder = state.transaction_sample_builder
70
70
  format_sql = OneApm::Agent::Datastore::Mongo::CommandFormatter.format_sql(event, status)
71
71
  OneApm::Manager.agent.transaction_sampler.send(:notice_extra_data, builder, format_sql, duration, :sql)
72
72
 
73
- stack.pop_frame(state, frame, base, started_time + duration)
73
+ stack.pop_frame(state, frame, base, started_time)
74
74
  end
75
75
 
76
76
  def one_apm_notice_statement(event, status, duration)
@@ -80,13 +80,35 @@ module OneApm::Rack
80
80
  end
81
81
 
82
82
  def autoinstrument_source(response, headers, js_to_inject)
83
- source = gather_source(response)
84
- close_old_response(response)
85
- return nil unless source
83
+ begin
84
+ source = gather_source(response)
85
+ close_old_response(response)
86
+ return nil unless source
87
+ inject_js(source, headers, js_to_inject)
88
+ rescue => e
89
+ OneApm::Manager.logger.debug "Skipping RUM instrumentation on exception.", e
90
+ nil
91
+ end
92
+ end
86
93
 
87
- # Only scan the first 50k (roughly) then give up.
88
- beginning_of_source = source[0..SCAN_LIMIT]
94
+ def inject_js source, headers, js_to_inject
95
+ position = OneApm::Manager.config[:'browser_monitoring.position']
96
+ insertion_index = (position.empty? || position.to_sym != :footer) ? header_index(source) : footer_index(source)
97
+ if insertion_index
98
+ source = source[0...insertion_index] \
99
+ << js_to_inject \
100
+ << source[insertion_index..-1]
101
+ if headers['Content-Length']
102
+ headers['Content-Length'] = calculate_content_length(source).to_s
103
+ end
104
+ else
105
+ OneApm::Manager.logger.debug "Skipping RUM instrumentation. Could not properly determine location to inject script."
106
+ end
107
+ source
108
+ end
89
109
 
110
+ def header_index source
111
+ beginning_of_source = source[0..SCAN_LIMIT]
90
112
  if body_start = find_body_start(beginning_of_source)
91
113
  meta_tag_positions = [
92
114
  find_x_ua_compatible_position(beginning_of_source),
@@ -98,28 +120,24 @@ module OneApm::Rack
98
120
  else
99
121
  insertion_index = find_end_of_head_open(beginning_of_source) || body_start
100
122
  end
101
-
102
- if insertion_index
103
- source = source[0...insertion_index] <<
104
- js_to_inject <<
105
- source[insertion_index..-1]
106
- else
107
- OneApm::Manager.logger.debug "Skipping RUM instrumentation. Could not properly determine location to inject script."
108
- end
123
+ insertion_index
109
124
  else
110
125
  msg = "Skipping RUM instrumentation. Unable to find <body> tag in first #{SCAN_LIMIT} bytes of document."
111
126
  OneApm::Manager.logger.log_once(:warn, :rum_insertion_failure, msg)
112
127
  OneApm::Manager.logger.debug(msg)
128
+ nil
113
129
  end
130
+ end
114
131
 
115
- if headers['Content-Length']
116
- headers['Content-Length'] = calculate_content_length(source).to_s
132
+ def footer_index source
133
+ if body_end = find_body_end(source)
134
+ body_end
135
+ else
136
+ msg = "Skipping RUM instrumentation. Unable to find </body> tag from document."
137
+ OneApm::Manager.logger.log_once(:warn, :rum_insertion_failure, msg)
138
+ OneApm::Manager.logger.debug(msg)
139
+ nil
117
140
  end
118
-
119
- source
120
- rescue => e
121
- OneApm::Manager.logger.debug "Skipping RUM instrumentation on exception.", e
122
- nil
123
141
  end
124
142
 
125
143
  def gather_source(response)
@@ -140,6 +158,10 @@ module OneApm::Rack
140
158
  beginning_of_source.index("<body")
141
159
  end
142
160
 
161
+ def find_body_end source
162
+ source.rindex("</body>")
163
+ end
164
+
143
165
  def find_x_ua_compatible_position(beginning_of_source)
144
166
  match = X_UA_COMPATIBLE_RE.match(beginning_of_source)
145
167
  match.end(0) if match
@@ -5,11 +5,11 @@ module OneApm
5
5
 
6
6
  MAJOR = 1
7
7
  MINOR = 3
8
- TINY = 0
8
+ TINY = 1
9
+ TAG = 'rc1'
9
10
 
10
-
11
11
 
12
- STRING = [MAJOR, MINOR, TINY].compact.join('.')
12
+ STRING = [MAJOR, MINOR, TINY, TAG].compact.join('.')
13
13
 
14
14
  end
15
15
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: oneapm_rpm
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.0
4
+ version: 1.3.1.rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - oneapm
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-11-30 00:00:00.000000000 Z
11
+ date: 2015-12-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -337,6 +337,7 @@ files:
337
337
  - lib/one_apm/inst/http_clients/excon/middleware.rb
338
338
  - lib/one_apm/inst/http_clients/httpclient.rb
339
339
  - lib/one_apm/inst/http_clients/net.rb
340
+ - lib/one_apm/inst/http_clients/thrift.rb
340
341
  - lib/one_apm/inst/http_clients/typhoeus.rb
341
342
  - lib/one_apm/inst/nosql/memcache.rb
342
343
  - lib/one_apm/inst/nosql/mongo.rb