opencensus-datadog 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: cb0b07845e74c490ca55bd81add0a808dd3fc5b5a717a8844a137cebb5611e75
4
+ data.tar.gz: 1c296eb88966fff0781a7438ca6568467a58679d701100ca217a7b990fb0fc89
5
+ SHA512:
6
+ metadata.gz: ada9d34c361eb95691cd0c5b84de0ea0739c31288dbd39dc1b4e7b387dd33dd020debd9e1134f3261ae13da24a5be8ecf7539b69c3a20e02ef287824ee00413c
7
+ data.tar.gz: 6cd7dbbd48d9b1ca8b06b9b62ad1d9d6467dc4a929a7aab190e0782f12f305673b0d86d88016f9106eb14472ddd97c27cadf13f330bacd7b2cc98efdfd4a1a2f
@@ -0,0 +1,13 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
12
+
13
+ /Gemfile.lock
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,5 @@
1
+ sudo: false
2
+ language: ruby
3
+ rvm:
4
+ - 2.4.1
5
+ before_install: gem install bundler -v 1.16.2
data/Gemfile ADDED
@@ -0,0 +1,6 @@
1
+ source "https://rubygems.org"
2
+
3
+ git_source(:github) {|repo_name| "https://github.com/#{repo_name}" }
4
+
5
+ # Specify your gem's dependencies in opencensus-datadog.gemspec
6
+ gemspec
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2018 munisystem
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,49 @@
1
+ # Ruby Datadog APM Exporter for OpenCensus
2
+
3
+ This library is the implementation of [OpenCensus](https://census-instrumentation/opencensus-ruby) exporter that transfer metrics to [Datadog APM](https://www.datadoghq.com/apm/).
4
+ It is depending on Datadog Agent v6.
5
+
6
+ ## Installation
7
+
8
+ Add `opencensus-datadog` to your application's Gemfile:
9
+
10
+ ```ruby
11
+ gem 'opencensus-datadog'
12
+ ```
13
+
14
+ And install the gem using Bundler:
15
+
16
+ ```shell
17
+ $ bundle install
18
+ ```
19
+
20
+ ## Usage
21
+
22
+ Register this gem using OpenCensus configuration:
23
+
24
+
25
+ ```ruby
26
+ OpenCensus.configure do |c|
27
+ c.trace.exporter = OpenCensus::Trace::Integrations::Datadog.new
28
+ end
29
+ ```
30
+
31
+ You can also use the following code if using Ruby on Rails:
32
+
33
+ ```ruby
34
+ config.opencensus.trace.exporter = OpenCensus::Trace::Integrations::Datadog.new
35
+ ```
36
+
37
+ By default, this gem sends metrics to the Datadog Agent at `http://localhost:8126`. You can send to different host or port.
38
+
39
+ ```ruby
40
+ OpenCensus.configure do |c|
41
+ c.trace.exporter = OpenCensus::Trace::Integrations::Datadog.new \
42
+ agent_hostname: '192.168.1.1',
43
+ agent_port: '1234'
44
+ end
45
+ ```
46
+
47
+ ## License
48
+
49
+ This project is releases under the [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,6 @@
1
+ require "bundler/gem_tasks"
2
+ require "rspec/core/rake_task"
3
+
4
+ RSpec::Core::RakeTask.new(:spec)
5
+
6
+ task :default => :spec
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "opencensus/datadog"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1 @@
1
+ require 'opencensus/datadog'
@@ -0,0 +1,10 @@
1
+ module Opencensus
2
+ module Datadog
3
+ end
4
+ end
5
+
6
+ require 'opencensus/datadog/version'
7
+ require 'opencensus/trace/exporters/datadog'
8
+
9
+ require 'thread'
10
+ require 'logger'
@@ -0,0 +1,5 @@
1
+ module OpenCensus
2
+ module Datadog
3
+ VERSION = "0.1.0"
4
+ end
5
+ end
@@ -0,0 +1,70 @@
1
+ require 'logger'
2
+
3
+ require 'opencensus/trace/exporters/datadog/transport'
4
+ require 'opencensus/trace/exporters/datadog/worker'
5
+ require 'opencensus/trace/exporters/datadog/converter'
6
+ require 'opencensus/trace/exporters/datadog/buffer'
7
+
8
+ module OpenCensus
9
+ module Trace
10
+ module Exporters
11
+ class Datadog
12
+ DEFAULT_SERVICE = 'opencensus-app'.freeze
13
+
14
+ def self.log
15
+ unless defined? @logger
16
+ @logger = Logger.new(STDOUT)
17
+ @logger.level = Logger::WARN
18
+ end
19
+ @logger
20
+ end
21
+
22
+ def initialize(options = {})
23
+ # create HTTP client for sending spans do Datadog Agent
24
+ agent_hostname = options.fetch(:agent_hostname, nil)
25
+ port = options.fetch(:port, nil)
26
+ @transport = Transport.new(agent_hostname, port)
27
+
28
+ # worker parameters
29
+ @max_buffer_size = options.fetch(:buffer_size, 1000)
30
+ @flush_interval = options.fetch(:flush_interval, 1)
31
+
32
+ # traces metadata
33
+ @service_name = options.fetch(:service, DEFAULT_SERVICE)
34
+
35
+ # each processes have one worker thread
36
+ @mutex_after_fork = Mutex.new
37
+ @pid = nil
38
+ @worker = nil
39
+ end
40
+
41
+ def start
42
+ @pid = Process.pid
43
+ @worker = Worker.new(@transport, @max_buffer_size, @flush_interval, @service_name)
44
+ @worker.start()
45
+ end
46
+
47
+ def shutdown!
48
+ return if @worker.nil?
49
+ @worker.stop
50
+ end
51
+
52
+ def export(spans)
53
+ return nil if spans.nil? || spans.empty?
54
+
55
+ # create worker thread if not exist in this process
56
+ pid = Process.pid
57
+ if pid != @pid
58
+ @mutex_after_fork.synchronize do
59
+ start() if pid != @pid
60
+ end
61
+ end
62
+
63
+ spans.each do |span|
64
+ @worker.enqueue(span)
65
+ end
66
+ end
67
+ end
68
+ end
69
+ end
70
+ end
@@ -0,0 +1,48 @@
1
+ module OpenCensus
2
+ module Trace
3
+ module Exporters
4
+ class Datadog
5
+ class SpanBuffer
6
+ def initialize(max_size)
7
+ @max_size = max_size
8
+ @spans = []
9
+ @mutex = Mutex.new()
10
+ @closed = false
11
+ end
12
+
13
+ def push(span)
14
+ @mutex.synchronize do
15
+ return if @closed
16
+ len = @spans.length
17
+ if len < @max_size || @max_size <= 0
18
+ return @spans << span
19
+ else
20
+ Datadog.log.error("[datadog-exporter] failed to write span into buffer due to exceeding by max buffer size")
21
+ end
22
+ end
23
+ end
24
+
25
+ def empty?
26
+ @mutex.synchronize do
27
+ return @spans.empty?
28
+ end
29
+ end
30
+
31
+ def pop
32
+ @mutex.synchronize do
33
+ spans = @spans
34
+ @spans = []
35
+ return spans
36
+ end
37
+ end
38
+
39
+ def close
40
+ @mutex.synchronize do
41
+ @closed = true
42
+ end
43
+ end
44
+ end
45
+ end
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,120 @@
1
+ require 'opencensus'
2
+ require 'ddtrace/ext/distributed'
3
+ require 'ddtrace/ext/priority'
4
+ require 'ddtrace/ext/errors'
5
+
6
+ module OpenCensus
7
+ module Trace
8
+ module Exporters
9
+ class Datadog
10
+ class Converter
11
+
12
+ DATADOG_MAX_TRACE_ID = 0xffff_ffff_ffff_ffff
13
+
14
+ DATADOG_SPAN_TYPE_KEY = 'span.type'.freeze
15
+ DATADOG_SERVICE_NAME_KEY = 'service.name'.freeze
16
+ DATADOG_RESOURCE_NAME_KEY = 'resource.name'.freeze
17
+ DATADOG_SAMPLING_PRIORITY_KEY = ::Datadog::Ext::DistributedTracing::SAMPLING_PRIORITY_KEY
18
+
19
+ STATUS_DESCRIPTION_KEY = 'opencensus.status_description'.freeze
20
+
21
+ CANONICAL_CODES = [
22
+ 'ok',
23
+ 'cancelled',
24
+ 'unknown',
25
+ 'invalid_argument',
26
+ 'deadline_exceeded',
27
+ 'not_found',
28
+ 'already_exists',
29
+ 'permission_denied',
30
+ 'resource_exhausted',
31
+ 'failed_precondition',
32
+ 'aborted',
33
+ 'out_of_range',
34
+ 'unimplemented',
35
+ 'internal',
36
+ 'unavailable',
37
+ 'data_loss',
38
+ 'unauthenticated'
39
+ ]
40
+
41
+ def initialize(service)
42
+ @service = service
43
+ end
44
+
45
+ def convert_span(span)
46
+ dd_span = {
47
+ span_id: span.span_id.to_i(16),
48
+ parent_id: span.parent_span_id.to_i(16),
49
+ trace_id: (span.trace_id.to_i(16) & DATADOG_MAX_TRACE_ID),
50
+ name: span.name.to_s,
51
+ service: @service,
52
+ resource: span.name.to_s,
53
+ type: span_type(span.kind.to_s),
54
+ meta: {},
55
+ metrics: {},
56
+ error: 0,
57
+ start: (span.start_time.to_f * 1e9).to_i,
58
+ duration: ((span.end_time.to_f - span.start_time.to_f) * 1e9).to_i,
59
+ }
60
+
61
+ dd_span[:metrics][DATADOG_SAMPLING_PRIORITY_KEY] = ::Datadog::Ext::Priority::AUTO_KEEP
62
+
63
+ convert_status(dd_span, span.status)
64
+
65
+ span.attributes.each do |k, v|
66
+ case v
67
+ when Integer
68
+ if k == DATADOG_SAMPLING_PRIORITY_KEY
69
+ dd_span[:metrics][DATADOG_SAMPLING_PRIORITY_KEY] = v
70
+ else
71
+ dd_span[:metrics][k] = v
72
+ end
73
+ when ::OpenCensus::Trace::TruncatableString
74
+ case k
75
+ when DATADOG_SPAN_TYPE_KEY
76
+ dd_span[:type] = v.to_s
77
+ when DATADOG_SERVICE_NAME_KEY
78
+ dd_span[:service] = v.to_s
79
+ when DATADOG_RESOURCE_NAME_KEY
80
+ dd_span[:resource] = v.to_s
81
+ else
82
+ dd_span[:meta][k] = v.to_s
83
+ end
84
+ else
85
+ dd_span[:meta][k] = v.to_s
86
+ end
87
+ end
88
+
89
+ dd_span
90
+ end
91
+
92
+ def convert_status(dd_span, status)
93
+ status_key = STATUS_DESCRIPTION_KEY
94
+ return if status.nil?
95
+ if status.code != 0 then
96
+ status_key = ::Datadog::Ext::Errors::MSG
97
+ dd_span[:error] = 1
98
+ code = status.code.to_i
99
+ return if code < 0 || code >= CANONICAL_CODES.length
100
+ dd_span[:meta][status_key] = CANONICAL_CODES[code]
101
+ end
102
+ dd_span[:meta][status_key] = status.message.to_s unless status.message.empty?
103
+ return
104
+ end
105
+
106
+ def span_type(kind)
107
+ case kind
108
+ when OpenCensus::Trace::Span::SERVER
109
+ 'server'
110
+ when OpenCensus::Trace::Span::CLIENT
111
+ 'client'
112
+ else
113
+ ''
114
+ end
115
+ end
116
+ end
117
+ end
118
+ end
119
+ end
120
+ end
@@ -0,0 +1,53 @@
1
+ require 'net/http'
2
+
3
+ module OpenCensus
4
+ module Trace
5
+ module Exporters
6
+ class Datadog
7
+ class Transport
8
+ DEFAULT_HOSTNAME = '127.0.0.1'.freeze
9
+ DEFAULT_PORT = '8126'.freeze
10
+
11
+ TRACE_ENDPOINT = '/v0.4/traces'.freeze
12
+ TIMEOUT = 5
13
+
14
+ TRACE_COUNT_HEADER = 'X-Datadog-Trace-Count'.freeze
15
+ RUBY_INTERPRETER = RUBY_VERSION > '1.9' ? RUBY_ENGINE + '-' + RUBY_PLATFORM : 'ruby-' + RUBY_PLATFORM
16
+ TRACER_VERSION = 'OC/' + OpenCensus::Datadog::VERSION
17
+
18
+ def initialize(hostname, port)
19
+ @hostname = hostname.nil? ? DEFAULT_HOSTNAME : hostname
20
+ @port = port.nil? ? DEFAULT_PORT : port
21
+
22
+ @headers = {}
23
+ @headers['Datadog-Meta-Lang'] = 'ruby'
24
+ @headers['Datadog-Meta-Lang-Version'] = RUBY_VERSION
25
+ @headers['Datadog-Meta-Lang-Interpreter'] = RUBY_INTERPRETER
26
+ @headers['Datadog-Meta-Tracer-Version'] = TRACER_VERSION
27
+ @headers['Content-Type'] = 'application/msgpack'
28
+ end
29
+
30
+ def upload(data, count = nil)
31
+ begin
32
+ headers = count.nil? ? {} : { TRACE_COUNT_HEADER => count.to_s }
33
+ headers = headers.merge(@headers)
34
+ request = Net::HTTP::Post.new(TRACE_ENDPOINT, headers)
35
+ request.body = data
36
+
37
+ response = Net::HTTP.start(@hostname, @port, read_timeout: TIMEOUT) { |http| http.request(request) }
38
+
39
+ status_code = response.code.to_i
40
+ if status_code >= 400 then
41
+ Datadog.log.error("[daatadog-exporter] #{response.message} (status: #{status_code})")
42
+ end
43
+ status_code
44
+ rescue StandardError => e
45
+ Datadog.log.error("[daatadog-exporter] failed HTTP request to agent: #{e.message}")
46
+ 500
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,81 @@
1
+ require 'msgpack'
2
+
3
+ module OpenCensus
4
+ module Trace
5
+ module Exporters
6
+ class Datadog
7
+ class Worker
8
+
9
+ SHUTDOWN_TIMEOUT = 1
10
+
11
+ def initialize(transport, max_buffer_size, flush_interval, service_name)
12
+ @transport = transport
13
+ @flush_interval = flush_interval
14
+ @span_buffer = SpanBuffer.new(max_buffer_size)
15
+ @converter = Converter.new(service_name)
16
+ @shutdown = ConditionVariable.new
17
+ @mutex = Mutex.new
18
+
19
+ @worker = nil
20
+ @run = false
21
+ end
22
+
23
+ def callback_spans
24
+ return if @span_buffer.empty?
25
+
26
+ begin
27
+ spans = @span_buffer.pop()
28
+ hash = Hash.new { |h, k| h[k] = [] }
29
+ spans.each do |span|
30
+ dd_span = @converter.convert_span(span)
31
+ hash[dd_span[:trace_id]] << dd_span
32
+ end
33
+ traces = hash.map {|key,value| value}
34
+ count = traces.length
35
+ @transport.upload(MessagePack.pack(traces), count)
36
+ rescue StandardError => e
37
+ Datadog.log.error("[daatadog-exporter] failed to flush spans: #{e}")
38
+ end
39
+ end
40
+
41
+ def start
42
+ @mutex.synchronize do
43
+ return if @run
44
+ @run = true
45
+ @worker = Thread.new { perform }
46
+ end
47
+ end
48
+
49
+ def stop
50
+ @mutex.synchronize do
51
+ return unless @run
52
+ @span_buffer.close
53
+ @run = false
54
+ @shutdown.signal
55
+ end
56
+ join
57
+ true
58
+ end
59
+
60
+ def join
61
+ @worker.join(SHUTDOWN_TIMEOUT)
62
+ end
63
+
64
+ def perform
65
+ loop do
66
+ callback_spans
67
+ @mutex.synchronize do
68
+ return if !@run && @span_buffer.empty?
69
+ @shutdown.wait(@mutex, @flush_interval) if @run
70
+ end
71
+ end
72
+ end
73
+
74
+ def enqueue(span)
75
+ @span_buffer.push(span)
76
+ end
77
+ end
78
+ end
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,31 @@
1
+
2
+ lib = File.expand_path("../lib", __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require "opencensus/datadog/version"
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "opencensus-datadog"
8
+ spec.version = OpenCensus::Datadog::VERSION
9
+ spec.authors = ["Yuichi Saito"]
10
+ spec.email = ["munisystem@gmail.com"]
11
+
12
+ spec.summary = "Datadog APM exporter for OpenCensus"
13
+ spec.description = "Datadog APM exporter for OpenCensus"
14
+ spec.homepage = "https://github.com/munisystem/opencensus-datadog"
15
+ spec.license = "MIT"
16
+
17
+ spec.files = Dir.chdir(File.expand_path('..', __FILE__)) do
18
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
19
+ end
20
+ spec.bindir = "exe"
21
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
22
+ spec.require_paths = ["lib"]
23
+
24
+ spec.add_dependency 'msgpack'
25
+ spec.add_dependency 'opencensus'
26
+ spec.add_dependency 'ddtrace'
27
+
28
+ spec.add_development_dependency "bundler", "~> 1.16"
29
+ spec.add_development_dependency "rake", "~> 10.0"
30
+ spec.add_development_dependency "rspec", "~> 3.0"
31
+ end
metadata ADDED
@@ -0,0 +1,146 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: opencensus-datadog
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Yuichi Saito
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2018-09-03 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: msgpack
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: opencensus
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: ddtrace
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.16'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.16'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '10.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '10.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rspec
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '3.0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '3.0'
97
+ description: Datadog APM exporter for OpenCensus
98
+ email:
99
+ - munisystem@gmail.com
100
+ executables: []
101
+ extensions: []
102
+ extra_rdoc_files: []
103
+ files:
104
+ - ".gitignore"
105
+ - ".rspec"
106
+ - ".travis.yml"
107
+ - Gemfile
108
+ - LICENSE.txt
109
+ - README.md
110
+ - Rakefile
111
+ - bin/console
112
+ - bin/setup
113
+ - lib/opencensus-datadog.rb
114
+ - lib/opencensus/datadog.rb
115
+ - lib/opencensus/datadog/version.rb
116
+ - lib/opencensus/trace/exporters/datadog.rb
117
+ - lib/opencensus/trace/exporters/datadog/buffer.rb
118
+ - lib/opencensus/trace/exporters/datadog/converter.rb
119
+ - lib/opencensus/trace/exporters/datadog/transport.rb
120
+ - lib/opencensus/trace/exporters/datadog/worker.rb
121
+ - opencensus-datadog.gemspec
122
+ homepage: https://github.com/munisystem/opencensus-datadog
123
+ licenses:
124
+ - MIT
125
+ metadata: {}
126
+ post_install_message:
127
+ rdoc_options: []
128
+ require_paths:
129
+ - lib
130
+ required_ruby_version: !ruby/object:Gem::Requirement
131
+ requirements:
132
+ - - ">="
133
+ - !ruby/object:Gem::Version
134
+ version: '0'
135
+ required_rubygems_version: !ruby/object:Gem::Requirement
136
+ requirements:
137
+ - - ">="
138
+ - !ruby/object:Gem::Version
139
+ version: '0'
140
+ requirements: []
141
+ rubyforge_project:
142
+ rubygems_version: 2.7.3
143
+ signing_key:
144
+ specification_version: 4
145
+ summary: Datadog APM exporter for OpenCensus
146
+ test_files: []