application_insights 0.2.0 → 0.3.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 +9 -9
- data/LICENSE.txt +7 -18
- data/README.md +42 -7
- data/Rakefile +6 -1
- data/application_insights.gemspec +2 -0
- data/lib/application_insights.rb +1 -0
- data/lib/application_insights/channel/asynchronous_queue.rb +51 -0
- data/lib/application_insights/channel/asynchronous_sender.rb +121 -0
- data/lib/application_insights/channel/contracts/application.rb +3 -2
- data/lib/application_insights/channel/contracts/data.rb +3 -2
- data/lib/application_insights/channel/contracts/data_point.rb +15 -10
- data/lib/application_insights/channel/contracts/device.rb +42 -28
- data/lib/application_insights/channel/contracts/envelope.rb +39 -27
- data/lib/application_insights/channel/contracts/event_data.rb +6 -6
- data/lib/application_insights/channel/contracts/exception_data.rb +9 -8
- data/lib/application_insights/channel/contracts/exception_details.rb +15 -11
- data/lib/application_insights/channel/contracts/internal.rb +6 -4
- data/lib/application_insights/channel/contracts/location.rb +3 -2
- data/lib/application_insights/channel/contracts/message_data.rb +6 -5
- data/lib/application_insights/channel/contracts/metric_data.rb +3 -3
- data/lib/application_insights/channel/contracts/operation.rb +12 -8
- data/lib/application_insights/channel/contracts/page_view_data.rb +12 -10
- data/lib/application_insights/channel/contracts/remote_dependency_data.rb +27 -19
- data/lib/application_insights/channel/contracts/request_data.rb +15 -12
- data/lib/application_insights/channel/contracts/session.rb +9 -6
- data/lib/application_insights/channel/contracts/stack_frame.rb +9 -6
- data/lib/application_insights/channel/contracts/user.rb +12 -8
- data/lib/application_insights/channel/event.rb +64 -0
- data/lib/application_insights/channel/queue_base.rb +24 -10
- data/lib/application_insights/channel/sender_base.rb +38 -9
- data/lib/application_insights/channel/synchronous_queue.rb +16 -5
- data/lib/application_insights/channel/synchronous_sender.rb +4 -2
- data/lib/application_insights/channel/telemetry_channel.rb +26 -7
- data/lib/application_insights/channel/telemetry_context.rb +29 -10
- data/lib/application_insights/telemetry_client.rb +84 -15
- data/lib/application_insights/unhandled_exception.rb +48 -0
- data/lib/application_insights/version.rb +1 -1
- data/test/application_insights/channel/test_asynchronous_queue.rb +68 -0
- data/test/application_insights/channel/test_asynchronous_sender.rb +81 -0
- data/test/application_insights/channel/test_event.rb +53 -0
- data/test/application_insights/channel/test_queue_base.rb +10 -9
- data/test/application_insights/channel/test_sender_base.rb +0 -9
- data/test/application_insights/test_telemetry_client.rb +5 -0
- data/test/application_insights/test_unhandled_exception.rb +42 -0
- metadata +44 -3
@@ -2,24 +2,30 @@ require 'thread'
|
|
2
2
|
|
3
3
|
module ApplicationInsights
|
4
4
|
module Channel
|
5
|
-
# The base class for all queues.
|
5
|
+
# The base class for all types of queues for use in conjunction with an implementation of {SenderBase}. The queue
|
6
|
+
# will notify the sender that it needs to pick up items when it reaches {#max_queue_length}, or when the consumer
|
7
|
+
# calls {#flush}.
|
6
8
|
class QueueBase
|
7
|
-
# Initializes a new instance of the
|
9
|
+
# Initializes a new instance of the class.
|
10
|
+
# @param [SenderBase] sender the sender object that will be used in conjunction with this queue.
|
8
11
|
def initialize(sender)
|
9
|
-
raise ArgumentError, 'Sender was required but not provided' unless sender
|
10
12
|
@queue = Queue.new
|
11
13
|
@max_queue_length = 500
|
12
14
|
@sender = sender
|
13
|
-
@sender.queue = self
|
15
|
+
@sender.queue = self if sender
|
14
16
|
end
|
15
17
|
|
16
|
-
#
|
18
|
+
# The maximum number of items that will be held by the queue before the queue will call the {#flush} method.
|
19
|
+
# @return [Fixnum] the maximum queue size. (defaults to: 500)
|
17
20
|
attr_accessor :max_queue_length
|
18
21
|
|
19
|
-
#
|
22
|
+
# The sender that is associated with this queue that this queue will use to send data to the service.
|
23
|
+
# @return [SenderBase] the sender object.
|
20
24
|
attr_reader :sender
|
21
25
|
|
22
|
-
# Adds
|
26
|
+
# Adds the passed in item object to the queue and calls {#flush} if the size of the queue is larger
|
27
|
+
# than {#max_queue_length}. This method does nothing if the passed in item is nil.
|
28
|
+
# @param [Contracts::Envelope] item the telemetry envelope object to send to the service.
|
23
29
|
def push(item)
|
24
30
|
unless item
|
25
31
|
return
|
@@ -27,11 +33,12 @@ module ApplicationInsights
|
|
27
33
|
|
28
34
|
@queue.push(item)
|
29
35
|
if @queue.length >= @max_queue_length
|
30
|
-
flush
|
36
|
+
flush
|
31
37
|
end
|
32
38
|
end
|
33
39
|
|
34
|
-
#
|
40
|
+
# Pops a single item from the queue and returns it. If the queue is empty, this method will return nil.
|
41
|
+
# @return [Contracts::Envelope] a telemetry envelope object or nil if the queue is empty.
|
35
42
|
def pop
|
36
43
|
begin
|
37
44
|
return @queue.pop(TRUE)
|
@@ -40,9 +47,16 @@ module ApplicationInsights
|
|
40
47
|
end
|
41
48
|
end
|
42
49
|
|
43
|
-
# Flushes the current queue
|
50
|
+
# Flushes the current queue by notifying the {#sender}. This method needs to be overridden by a concrete
|
51
|
+
# implementations of the queue class.
|
44
52
|
def flush
|
45
53
|
end
|
54
|
+
|
55
|
+
# Indicates whether the queue is empty.
|
56
|
+
# @return [true, false] true if the queue is empty
|
57
|
+
def empty?
|
58
|
+
@queue.empty?
|
59
|
+
end
|
46
60
|
end
|
47
61
|
end
|
48
62
|
end
|
@@ -1,32 +1,50 @@
|
|
1
1
|
require 'json'
|
2
2
|
require 'net/http'
|
3
|
+
require 'stringio'
|
4
|
+
require 'zlib'
|
3
5
|
|
4
6
|
module ApplicationInsights
|
5
7
|
module Channel
|
6
|
-
# The base class for all of
|
8
|
+
# The base class for all types of senders for use in conjunction with an implementation of {QueueBase}. The queue
|
9
|
+
# will notify the sender that it needs to pick up items. The concrete sender implementation will listen to these
|
10
|
+
# notifications and will pull items from the queue using {QueueBase#pop} getting at most {#send_buffer_size} items.
|
11
|
+
# It will then call {#send} using the list of items pulled from the queue.
|
7
12
|
class SenderBase
|
8
|
-
# Initializes a new instance of the
|
13
|
+
# Initializes a new instance of the class.
|
14
|
+
# @param [String] service_endpoint_uri the address of the service to send telemetry data to.
|
9
15
|
def initialize(service_endpoint_uri)
|
10
|
-
raise ArgumentError, 'Service endpoint URI was required but not provided' unless service_endpoint_uri
|
11
16
|
@service_endpoint_uri = service_endpoint_uri
|
12
17
|
@queue = nil
|
13
18
|
@send_buffer_size = 100
|
14
19
|
end
|
15
20
|
|
16
|
-
#
|
21
|
+
# The service endpoint URI where this sender will send data to.
|
22
|
+
# @return [String] the service endpoint URI.
|
17
23
|
attr_accessor :service_endpoint_uri
|
18
24
|
|
19
|
-
# The queue that
|
25
|
+
# The queue that this sender is draining. While {SenderBase} doesn't implement any means of doing so, derivations
|
26
|
+
# of this class do.
|
27
|
+
# @return [QueueBase] the queue instance that this sender is draining.
|
20
28
|
attr_accessor :queue
|
21
29
|
|
22
|
-
#
|
30
|
+
# The buffer size for a single batch of telemetry. This is the maximum number of items in a single service
|
31
|
+
# request that this sender is going to send.
|
32
|
+
# @return [Fixnum] the maximum number of items in a telemetry batch.
|
23
33
|
attr_accessor :send_buffer_size
|
24
34
|
|
25
|
-
#
|
35
|
+
# Immediately sends the data passed in to {#service_endpoint_uri}. If the service request fails, the passed in items
|
36
|
+
# are pushed back to the {#queue}.
|
37
|
+
# @param [Array<Contracts::Envelope>] data_to_send an array of {Contracts::Envelope} objects to send to the service.
|
26
38
|
def send(data_to_send)
|
27
39
|
uri = URI(@service_endpoint_uri)
|
28
|
-
|
29
|
-
|
40
|
+
headers = {
|
41
|
+
'Accept' => 'application/json',
|
42
|
+
'Content-Type' => 'application/json; charset=utf-8',
|
43
|
+
'Content-Encoding' => 'gzip'
|
44
|
+
}
|
45
|
+
request = Net::HTTP::Post.new(uri.path, headers)
|
46
|
+
compressed_data = compress(data_to_send.to_json)
|
47
|
+
request.body = compressed_data
|
30
48
|
|
31
49
|
http = Net::HTTP.new uri.hostname, uri.port
|
32
50
|
if uri.scheme.downcase == 'https'
|
@@ -44,6 +62,17 @@ module ApplicationInsights
|
|
44
62
|
end
|
45
63
|
end
|
46
64
|
end
|
65
|
+
|
66
|
+
private
|
67
|
+
|
68
|
+
def compress(string)
|
69
|
+
wio = StringIO.new("w")
|
70
|
+
w_gz = Zlib::GzipWriter.new wio, nil, nil
|
71
|
+
w_gz.write(string)
|
72
|
+
w_gz.close
|
73
|
+
wio.string
|
74
|
+
end
|
75
|
+
|
47
76
|
end
|
48
77
|
end
|
49
78
|
end
|
@@ -2,25 +2,36 @@ require_relative 'queue_base'
|
|
2
2
|
|
3
3
|
module ApplicationInsights
|
4
4
|
module Channel
|
5
|
-
# A synchronous queue for use in conjunction with the SynchronousSender. The queue
|
5
|
+
# A synchronous queue for use in conjunction with the {SynchronousSender}. The queue
|
6
|
+
# will call {SenderBase#send} when it reaches {#max_queue_length}, or when the consumer
|
7
|
+
# calls {#flush}.
|
8
|
+
# @example
|
9
|
+
# require 'application_insights'
|
10
|
+
# require 'thread'
|
11
|
+
# queue = ApplicationInsights::Channel::SynchronousQueue.new nil
|
12
|
+
# queue.max_queue_length = 1
|
13
|
+
# queue.push 1
|
6
14
|
class SynchronousQueue < QueueBase
|
7
|
-
# Initializes a new instance of the
|
15
|
+
# Initializes a new instance of the class.
|
16
|
+
# @param [SenderBase] sender the sender object that will be used in conjunction with this queue.
|
8
17
|
def initialize(sender)
|
9
18
|
super sender
|
10
19
|
end
|
11
20
|
|
12
|
-
# Flushes the current queue
|
21
|
+
# Flushes the current queue by by calling {#sender}'s {SenderBase#send} method.
|
13
22
|
def flush
|
23
|
+
local_sender = @sender
|
24
|
+
return unless local_sender
|
14
25
|
while TRUE
|
15
26
|
# get at most send_buffer_size items and send them
|
16
27
|
data = []
|
17
|
-
while data.length <
|
28
|
+
while data.length < local_sender.send_buffer_size
|
18
29
|
item = pop()
|
19
30
|
break if not item
|
20
31
|
data.push item
|
21
32
|
end
|
22
33
|
break if data.length == 0
|
23
|
-
|
34
|
+
local_sender.send(data)
|
24
35
|
end
|
25
36
|
end
|
26
37
|
end
|
@@ -2,9 +2,11 @@ require_relative 'sender_base'
|
|
2
2
|
|
3
3
|
module ApplicationInsights
|
4
4
|
module Channel
|
5
|
-
# A synchronous sender that works in conjunction with SynchronousQueue.
|
5
|
+
# A synchronous sender that works in conjunction with the {SynchronousQueue}. The queue will call {#send} on the
|
6
|
+
# current instance with the data to send.
|
6
7
|
class SynchronousSender < SenderBase
|
7
|
-
# Initializes a new instance of the
|
8
|
+
# Initializes a new instance of the class.
|
9
|
+
# @param [String] service_endpoint_uri the address of the service to send telemetry data to.
|
8
10
|
def initialize(service_endpoint_uri='https://dc.services.visualstudio.com/v2/track')
|
9
11
|
super service_endpoint_uri
|
10
12
|
end
|
@@ -1,3 +1,5 @@
|
|
1
|
+
require_relative 'asynchronous_queue'
|
2
|
+
require_relative 'asynchronous_sender'
|
1
3
|
require_relative 'telemetry_context'
|
2
4
|
require_relative 'synchronous_queue'
|
3
5
|
require_relative 'synchronous_sender'
|
@@ -7,31 +9,48 @@ require_relative 'contracts/internal'
|
|
7
9
|
|
8
10
|
module ApplicationInsights
|
9
11
|
module Channel
|
10
|
-
# The telemetry channel is responsible for constructing
|
12
|
+
# The telemetry channel is responsible for constructing a {Contracts::Envelope} object from the passed in
|
13
|
+
# data and specified telemetry context.
|
14
|
+
# @example
|
15
|
+
# require 'application_insights'
|
16
|
+
# channel = ApplicationInsights::Channel::TelemetryChannel.new
|
17
|
+
# event = ApplicationInsights::Channel::Contracts::EventData.new :name => 'My event'
|
18
|
+
# channel.write event
|
11
19
|
class TelemetryChannel
|
12
|
-
# Initializes a new instance of the
|
20
|
+
# Initializes a new instance of the class.
|
21
|
+
# @param [TelemetryContext] context the telemetry context to use when sending telemetry data.
|
22
|
+
# @param [QueueBase] queue the queue to enqueue the resulting {Contracts::Envelope} to.
|
13
23
|
def initialize(context=nil, queue=nil)
|
14
24
|
@context = context || TelemetryContext.new
|
15
25
|
@queue = queue || SynchronousQueue.new(SynchronousSender.new)
|
16
26
|
end
|
17
27
|
|
18
|
-
#
|
28
|
+
# The context associated with this channel. All {Contracts::Envelope} objects created by this channel will use
|
29
|
+
# this value if it's present or if none is specified as part of the {#write} call.
|
30
|
+
# @return [TelemetryContext] the context instance (defaults to: TelemetryContext.new)
|
19
31
|
attr_reader :context
|
20
32
|
|
21
|
-
#
|
33
|
+
# The queue associated with this channel. All {Contracts::Envelope} objects created by this channel will be
|
34
|
+
# pushed to this queue.
|
35
|
+
# @return [QueueBase] the queue instance (defaults to: SynchronousQueue.new)
|
22
36
|
attr_reader :queue
|
23
37
|
|
24
|
-
#
|
38
|
+
# The sender associated with this channel. This instance will be used to transmit telemetry to the service.
|
39
|
+
# @return [SenderBase] the sender instance (defaults to: SynchronousSender.new)
|
25
40
|
def sender
|
26
41
|
@queue.sender
|
27
42
|
end
|
28
43
|
|
29
|
-
# Flushes the
|
44
|
+
# Flushes the enqueued data by calling {QueueBase#flush}.
|
30
45
|
def flush
|
31
46
|
@queue.flush
|
32
47
|
end
|
33
48
|
|
34
|
-
#
|
49
|
+
# Enqueues the passed in data to the {#queue}. If the caller specifies a context as well, it will take precedence
|
50
|
+
# over the instance in {#context}.
|
51
|
+
# @param [Object] data the telemetry data to send. This will be wrapped in an {Contracts::Envelope} before being
|
52
|
+
# enqueued to the {#queue}.
|
53
|
+
# @param [TelemetryContext] context the override context to use when constructing the {Contracts::Envelope}.
|
35
54
|
def write(data, context=nil)
|
36
55
|
local_context = context || @context
|
37
56
|
raise ArgumentError, 'Context was required but not provided' unless local_context
|
@@ -7,9 +7,20 @@ require_relative 'contracts/location'
|
|
7
7
|
|
8
8
|
module ApplicationInsights
|
9
9
|
module Channel
|
10
|
-
# Represents
|
10
|
+
# Represents the context for sending telemetry to the Application Insights service.
|
11
|
+
# @example
|
12
|
+
# require 'application_insights'
|
13
|
+
# context = ApplicationInsights::Channel::TelemetryContext.new
|
14
|
+
# context.instrumentation_key = '<YOUR INSTRUMENTATION KEY GOES HERE>'
|
15
|
+
# context.application.id = 'My application'
|
16
|
+
# context.application.ver = '1.2.3'
|
17
|
+
# context.device.id = 'My current device'
|
18
|
+
# context.device.oem_name = 'Asus'
|
19
|
+
# context.device.model = 'X31A'
|
20
|
+
# context.device.type = "Other"
|
21
|
+
# context.user.id = 'santa@northpole.net'
|
11
22
|
class TelemetryContext
|
12
|
-
# Initializes a new instance of the
|
23
|
+
# Initializes a new instance of the class.
|
13
24
|
def initialize
|
14
25
|
@instrumentation_key = nil
|
15
26
|
@application = Contracts::Application.new
|
@@ -21,28 +32,36 @@ module ApplicationInsights
|
|
21
32
|
@properties = {}
|
22
33
|
end
|
23
34
|
|
24
|
-
#
|
35
|
+
# The instrumentation key that is used to identify which Application Insights application this data is for.
|
36
|
+
# @return [String] the instrumentation key.
|
25
37
|
attr_accessor :instrumentation_key
|
26
38
|
|
27
|
-
#
|
39
|
+
# The application context. This contains properties of the application you are running.
|
40
|
+
# @return [Contracts::Application] the context object.
|
28
41
|
attr_accessor :application
|
29
42
|
|
30
|
-
#
|
43
|
+
# The device context. This contains properties of the device you are running on.
|
44
|
+
# @return [Contracts::Device] the context object.
|
31
45
|
attr_accessor :device
|
32
46
|
|
33
|
-
#
|
47
|
+
# The user context. This contains properties of the user you are generating telemetry for.
|
48
|
+
# @return [Contracts::User] the context object.
|
34
49
|
attr_accessor :user
|
35
50
|
|
36
|
-
#
|
51
|
+
# The session context. This contains properties of the session you are generating telemetry for.
|
52
|
+
# @return [Contracts::Session] the context object.
|
37
53
|
attr_accessor :session
|
38
54
|
|
39
|
-
#
|
55
|
+
# The operation context. This contains properties of the operation you are generating telemetry for.
|
56
|
+
# @return [Contracts::Operation] the context object.
|
40
57
|
attr_accessor :operation
|
41
58
|
|
42
|
-
#
|
59
|
+
# The location context. This contains properties of the location you are generating telemetry from.
|
60
|
+
# @return [Contracts::Location] the context object.
|
43
61
|
attr_accessor :location
|
44
62
|
|
45
|
-
#
|
63
|
+
# The property context. This contains free-form properties that you can add to your telemetry.
|
64
|
+
# @return [Hash<String, String>] the context object.
|
46
65
|
attr_reader :properties
|
47
66
|
end
|
48
67
|
end
|
@@ -8,23 +8,39 @@ require_relative 'channel/contracts/data_point'
|
|
8
8
|
require_relative 'channel/contracts/data_point_type'
|
9
9
|
require_relative 'channel/contracts/metric_data'
|
10
10
|
require_relative 'channel/contracts/message_data'
|
11
|
+
require_relative 'channel/contracts/stack_frame'
|
11
12
|
|
12
13
|
module ApplicationInsights
|
13
|
-
# The telemetry client used for sending all types of telemetry.
|
14
|
+
# The telemetry client used for sending all types of telemetry. It serves as the main entry point for
|
15
|
+
# interacting with the Application Insights service.
|
14
16
|
class TelemetryClient
|
15
|
-
# Initializes a new instance of the
|
17
|
+
# Initializes a new instance of the class.
|
18
|
+
# @param [Channel::TelemetryChannel] telemetry_channel the optional telemetry channel to be used instead of
|
19
|
+
# constructing a default one.
|
16
20
|
def initialize(telemetry_channel = nil)
|
17
21
|
@context = Channel::TelemetryContext.new
|
18
22
|
@channel = telemetry_channel || Channel::TelemetryChannel.new
|
19
23
|
end
|
20
24
|
|
21
|
-
#
|
25
|
+
# The context associated with this client. All data objects created by this client will be accompanied by
|
26
|
+
# this value.
|
27
|
+
# @return [Channel::TelemetryContext] the context instance.
|
22
28
|
attr_reader :context
|
23
29
|
|
24
|
-
#
|
30
|
+
# The channel associated with this telemetry client. All data created by this client will be passed along with
|
31
|
+
# the {#context} object to {Channel::TelemetryChannel#write}
|
32
|
+
# @return [Channel::TelemetryChannel] the channel instance.
|
25
33
|
attr_reader :channel
|
26
34
|
|
27
|
-
# Send information about the page viewed in the application.
|
35
|
+
# Send information about the page viewed in the application (a web page for instance).
|
36
|
+
# @param [String] name the name of the page that was viewed.
|
37
|
+
# @param [String] url the URL of the page that was viewed.
|
38
|
+
# @param [Hash] options the options to create the {Channel::Contracts::PageViewData} object.
|
39
|
+
# @option options [Fixnum] :duration the duration of the page view in milliseconds. (defaults to: 0)
|
40
|
+
# @option options [Hash] :properties the set of custom properties the client wants attached to this
|
41
|
+
# data item. (defaults to: {})
|
42
|
+
# @option options [Hash] :measurements the set of custom measurements the client wants to attach to
|
43
|
+
# this data item (defaults to: {})
|
28
44
|
def track_page_view(name, url, options={})
|
29
45
|
data_attributes = {
|
30
46
|
:name => name || 'Null',
|
@@ -37,21 +53,46 @@ module ApplicationInsights
|
|
37
53
|
self.channel.write(data, self.context)
|
38
54
|
end
|
39
55
|
|
40
|
-
# Send
|
56
|
+
# Send information about a single exception that occurred in the application.
|
57
|
+
# @param [Exception] exception the exception that the client wants to send.
|
58
|
+
# @param [Hash] options the options to create the {Channel::Contracts::ExceptionData} object.
|
59
|
+
# @option options [String] :handled_at the type of exception (defaults to: 'UserCode')
|
60
|
+
# @option options [Hash] :properties the set of custom properties the client wants attached to this
|
61
|
+
# data item. (defaults to: {})
|
62
|
+
# @option options [Hash] :measurements the set of custom measurements the client wants to attach to
|
63
|
+
# this data item (defaults to: {})
|
41
64
|
def track_exception(exception, options={})
|
42
65
|
if exception.is_a? Exception
|
66
|
+
parsed_stack = []
|
67
|
+
if exception.backtrace
|
68
|
+
frame_pattern = /^(?<file>.*):(?<line>\d+)(\.|:in `((?<method>.*)'$))/
|
69
|
+
counter = 0;
|
70
|
+
exception.backtrace.each do |frame|
|
71
|
+
match = frame_pattern.match frame
|
72
|
+
stack_frame = Channel::Contracts::StackFrame.new
|
73
|
+
stack_frame.assembly = 'Unknown'
|
74
|
+
stack_frame.file_name = match['file']
|
75
|
+
stack_frame.level = counter
|
76
|
+
stack_frame.line = match['line']
|
77
|
+
stack_frame.method = match['method']
|
78
|
+
parsed_stack << stack_frame
|
79
|
+
counter += 1
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
43
83
|
details_attributes = {
|
44
84
|
:id => 1,
|
45
85
|
:outer_id => 0,
|
46
86
|
:type_name => exception.class,
|
47
87
|
:message => exception.message,
|
48
|
-
:has_full_stack =>
|
49
|
-
:stack => exception.backtrace.join("\n")
|
88
|
+
:has_full_stack => exception.backtrace != nil,
|
89
|
+
:stack => (exception.backtrace.join("\n") if exception.backtrace),
|
90
|
+
:parsed_stack => parsed_stack
|
50
91
|
}
|
51
92
|
details = Channel::Contracts::ExceptionDetails.new details_attributes
|
52
93
|
|
53
94
|
data_attributes = {
|
54
|
-
:handled_at => 'UserCode',
|
95
|
+
:handled_at => options.fetch(:handled_at,'UserCode'),
|
55
96
|
:exceptions => [ details ],
|
56
97
|
:properties => options.fetch(:properties) { {} },
|
57
98
|
:measurements => options.fetch(:measurements) { {} }
|
@@ -61,7 +102,13 @@ module ApplicationInsights
|
|
61
102
|
end
|
62
103
|
end
|
63
104
|
|
64
|
-
# Send
|
105
|
+
# Send information about a single event that has occurred in the context of the application.
|
106
|
+
# @param [String] name the data to associate to this event.
|
107
|
+
# @param [Hash] options the options to create the {Channel::Contracts::EventData} object.
|
108
|
+
# @option options [Hash] :properties the set of custom properties the client wants attached to this
|
109
|
+
# data item. (defaults to: {})
|
110
|
+
# @option options [Hash] :measurements the set of custom measurements the client wants to attach to
|
111
|
+
# this data item (defaults to: {})
|
65
112
|
def track_event(name, options={})
|
66
113
|
data_attributes = {
|
67
114
|
:name => name || 'Null',
|
@@ -72,7 +119,24 @@ module ApplicationInsights
|
|
72
119
|
self.channel.write(data, self.context)
|
73
120
|
end
|
74
121
|
|
75
|
-
# Send a
|
122
|
+
# Send information about a single metric data point that was captured for the application.
|
123
|
+
# @param [String] name the name of the metric that was captured.
|
124
|
+
# @param [Fixnum] value the value of the metric that was captured.
|
125
|
+
# @param [Hash] options the options to create the {Channel::Contracts::MetricData} object.
|
126
|
+
# @option options [Channel::Contracts::DataPointType] :type the type of the metric (defaults to:
|
127
|
+
# {Channel::Contracts::DataPointType::AGGREGATION})
|
128
|
+
# @option options [Fixnum] :count the number of metrics that were aggregated into this data point
|
129
|
+
# (defaults to: 0)
|
130
|
+
# @option options [Fixnum] :min the minimum of all metrics collected that were aggregated into this
|
131
|
+
# data point (defaults to: 0)
|
132
|
+
# @option options [Fixnum] :max the maximum of all metrics collected that were aggregated into this
|
133
|
+
# data point (defaults to: 0)
|
134
|
+
# @option options [Fixnum] :std_dev the standard deviation of all metrics collected that were aggregated
|
135
|
+
# into this data point (defaults to: 0)
|
136
|
+
# @option options [Hash] :properties the set of custom properties the client wants attached to this
|
137
|
+
# data item. (defaults to: {})
|
138
|
+
# @option options [Hash] :measurements the set of custom measurements the client wants to attach to
|
139
|
+
# this data item (defaults to: {})
|
76
140
|
def track_metric(name, value, options={})
|
77
141
|
data_point_attributes = {
|
78
142
|
:name => name || 'Null',
|
@@ -87,23 +151,28 @@ module ApplicationInsights
|
|
87
151
|
|
88
152
|
data_attributes = {
|
89
153
|
:metrics => [ data_point ],
|
90
|
-
:properties => options.fetch(:
|
154
|
+
:properties => options.fetch(:properties) { {} }
|
91
155
|
}
|
92
156
|
data = Channel::Contracts::MetricData.new data_attributes
|
93
157
|
self.channel.write(data, self.context)
|
94
158
|
end
|
95
159
|
|
96
|
-
#
|
160
|
+
# Sends a single trace statement.
|
161
|
+
# @param [String] name the trace statement.
|
162
|
+
# @param [Hash] options the options to create the {Channel::Contracts::EventData} object.
|
163
|
+
# @option options [Hash] :properties the set of custom properties the client wants attached to this
|
164
|
+
# data item. (defaults to: {})
|
97
165
|
def track_trace(name, options={})
|
98
166
|
data_attributes = {
|
99
167
|
:message => name || 'Null',
|
100
|
-
:properties => options.fetch(:
|
168
|
+
:properties => options.fetch(:properties) { {} }
|
101
169
|
}
|
102
170
|
data = Channel::Contracts::MessageData.new data_attributes
|
103
171
|
self.channel.write(data, self.context)
|
104
172
|
end
|
105
173
|
|
106
|
-
# Flushes the
|
174
|
+
# Flushes data in the queue. Data in the queue will be sent either immediately irrespective of what sender is
|
175
|
+
# being used.
|
107
176
|
def flush
|
108
177
|
self.channel.flush
|
109
178
|
end
|