opentelemetry-exporter-google_cloud_trace 0.a → 0.1.1

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.
data/Rakefile ADDED
@@ -0,0 +1,61 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2023 Google LLC
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # https://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+
18
+ require "bundler/gem_tasks"
19
+ require "rake/testtask"
20
+
21
+ Rake::TestTask.new :test do |t|
22
+ t.libs << "test"
23
+ t.libs << "lib"
24
+ t.test_files = FileList["test/**/*_test.rb"]
25
+ end
26
+
27
+ require "yard"
28
+ require "yard/rake/yardoc_task"
29
+ YARD::Rake::YardocTask.new do |y|
30
+ # y.options << "--fail-on-warning"
31
+ end
32
+
33
+ task :acceptance, :project, :keyfile do |_t, args|
34
+ project = args[:project]
35
+ project ||= ENV["TRACE_EXPORTER_TEST_PROJECT"] || ENV["GCLOUD_TEST_PROJECT"]
36
+ keyfile = args[:keyfile]
37
+ keyfile ||= ENV["TRACE_EXPORTER_TEST_KEYFILE"] || ENV["GCLOUD_TEST_KEYFILE"]
38
+ if keyfile
39
+ keyfile = File.read keyfile
40
+ end
41
+ if project.nil? || keyfile.nil?
42
+ raise "You must provide a project and keyfile. e.g. rake acceptance[test123, /path/to/keyfile.json] or " \
43
+ "TRACE_EXPORTER_TEST_PROJECT=test123 TRACE_EXPORTER_TEST_KEYFILE=/path/to/keyfile.json rake acceptance"
44
+ end
45
+
46
+ Rake::Task["acceptance:run"].invoke
47
+ end
48
+
49
+ namespace :acceptance do
50
+ Rake::TestTask.new :run do |t|
51
+ t.libs << "acceptance"
52
+ t.libs << "lib"
53
+ t.test_files = FileList["acceptance/**/*_test.rb"]
54
+ end
55
+ end
56
+
57
+ require "rubocop/rake_task"
58
+
59
+ RuboCop::RakeTask.new
60
+
61
+ task default: [:test, :rubocop]
@@ -0,0 +1,99 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2023 Google LLC
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # https://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require "test_helper"
18
+ require "webrick"
19
+ require "fileutils"
20
+ require "google/protobuf/well_known_types"
21
+
22
+ # Test the Sinatra server for the Cloud Scheduler sample.
23
+ describe "Opentelemety exporter for Google Cloud Trace" do
24
+ before :all do
25
+ @project_id = ENV["TRACE_EXPORTER_TEST_PROJECT"] || ENV["GCLOUD_TEST_PROJECT"]
26
+ Google::Cloud.configure do |config|
27
+ config.project_id = @project_id
28
+ config.credentials = ENV["TRACE_EXPORTER_TEST_KEYFILE"] || ENV["GCLOUD_TEST_KEYFILE"]
29
+ end
30
+
31
+ @pid = Process.spawn "bundle exec ruby acceptance/sinatra/sinatra_app.rb"
32
+
33
+ # wait for server to start
34
+ sleep 10
35
+ @trace_client = Google::Cloud::Trace::V1::TraceService::Client.new
36
+ end
37
+
38
+ after :all do
39
+ Process.kill "KILL", @pid
40
+ Process.wait2 @pid
41
+ end
42
+
43
+ it "test_returns_hello_world" do
44
+ uri = URI("http://127.0.0.1:4567")
45
+ start_time = Google::Protobuf::Timestamp.from_time Time.now
46
+ res = Net::HTTP.get uri
47
+ assert_match "Hello !", res
48
+ sleep 10 # wait for trace to be sent
49
+ end_time = Google::Protobuf::Timestamp.from_time Time.now
50
+
51
+ assert_trace start_time, end_time
52
+ end
53
+ end
54
+
55
+ def assert_trace start_time, end_time
56
+ result = @trace_client.list_traces project_id: @project_id, start_time: start_time, end_time: end_time
57
+ traces = result.response.traces
58
+ test_span = nil
59
+ parent_span = nil
60
+
61
+ traces.each do |trace|
62
+ full_trace = @trace_client.get_trace project_id: @project_id, trace_id: trace.trace_id
63
+ full_trace.spans.each do |span|
64
+ if span.name === "test_span"
65
+ test_span = span
66
+ break
67
+ end
68
+ end
69
+
70
+ if test_span
71
+ parent_span = full_trace.spans.find { |span| span.span_id === test_span.parent_span_id }
72
+ break
73
+ end
74
+ end
75
+
76
+ assert_child_span test_span
77
+ assert_parent_span parent_span
78
+ end
79
+
80
+ def assert_child_span span
81
+ refute_nil span
82
+ assert_equal span.labels["span_attr"], "span_value"
83
+ end
84
+
85
+ def assert_parent_span span
86
+ refute_nil span
87
+ assert_equal span.kind, :RPC_SERVER
88
+ assert_equal span.name, "GET /"
89
+ assert_equal span.labels["g.co/agent"], "opentelemetry-ruby #{OpenTelemetry::SDK::VERSION};" \
90
+ "google-cloud-trace-exporter " \
91
+ "#{OpenTelemetry::Exporter::GoogleCloudTrace::VERSION}"
92
+ assert_equal span.labels["/http/client_protocol"], "http"
93
+ assert_equal span.labels["/http/status_code"], "200"
94
+ assert_equal span.labels["http.target"], "/"
95
+ assert_equal span.labels["/http/method"], "GET"
96
+ assert_equal span.labels["/http/host"], "127.0.0.1:4567"
97
+ assert_equal span.labels["/http/route"], "/"
98
+ assert_equal span.labels["/http/user_agent"], "Ruby"
99
+ end
@@ -0,0 +1,25 @@
1
+ require "sinatra"
2
+ require "opentelemetry-sdk"
3
+ require "opentelemetry/instrumentation/sinatra"
4
+ require "opentelemetry/instrumentation/rack"
5
+ require "opentelemetry/exporter/google_cloud_trace"
6
+
7
+ OpenTelemetry::SDK.configure do |c|
8
+ c.service_name = "test_app"
9
+ c.add_span_processor(
10
+ OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
11
+ OpenTelemetry::Exporter::GoogleCloudTrace::SpanExporter.new
12
+ )
13
+ )
14
+ c.use "OpenTelemetry::Instrumentation::Sinatra"
15
+ end
16
+
17
+ get "/" do
18
+ test_tracer = OpenTelemetry.tracer_provider.tracer "test_tracer"
19
+ span_to_link_from = OpenTelemetry::Trace.current_span
20
+ link = OpenTelemetry::Trace::Link.new(span_to_link_from.context, { "some.attribute" => 12 })
21
+ test_tracer.in_span "test_span", attributes: { "span_attr" => "span_value" }, links: [link] do |span|
22
+ span.add_event "Creating test span event!!", attributes: { "event_attr" => "event_value" }
23
+ end
24
+ "Hello !"
25
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2023 Google LLC
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # https://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+
18
+ require "minitest/autorun"
19
+ require "minitest/focus"
20
+ require "minitest/hooks/default"
21
+ require "minitest/rg"
22
+ require "ostruct"
23
+ require "google/cloud"
24
+ require "google/cloud/trace/v1"
25
+ require "opentelemetry/exporter/google_cloud_trace"
@@ -0,0 +1,145 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2023 Google LLC
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # https://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+
18
+ require "google/cloud/trace/v2/trace_service"
19
+ require "opentelemetry/exporter/google_cloud_trace/translator"
20
+ require "google/cloud/env"
21
+
22
+ module OpenTelemetry
23
+ module Exporter
24
+ module GoogleCloudTrace
25
+ ##
26
+ # This provides an implementation of span exporter for Google Cloud Trace
27
+ # It will convert the Opentelemetry span data into Clould Trace spans
28
+ # and publish them to the Cloud trace service.
29
+ class SpanExporter
30
+ SUCCESS = OpenTelemetry::SDK::Trace::Export::SUCCESS
31
+ FAILURE = OpenTelemetry::SDK::Trace::Export::FAILURE
32
+ private_constant :SUCCESS, :FAILURE
33
+
34
+
35
+ ##
36
+ # Creates a new object for google cloud trace
37
+ # opentelemetry span exporter. It creates client for
38
+ # Google cloud trace service to be used for publihing span.
39
+ #
40
+ #
41
+ # @param [String] project_id Project identifier for the Trace service
42
+ # you are connecting to. If not present, the default project for the
43
+ # credentials is used.
44
+ # @param [String, Hash, Google::Auth::Credentials] credentials The path to
45
+ # the keyfile as a String, the contents of the keyfile as a Hash, or a
46
+ # Google::Auth::Credentials object.
47
+ # @param [String, Array<String>] scope The OAuth 2.0 scopes controlling
48
+ # the set of resources and operations that the connection can access.
49
+ # See [Using OAuth 2.0 to Access Google
50
+ # APIs](https://developers.google.com/identity/protocols/OAuth2).
51
+ #
52
+ # The default scope is:
53
+ #
54
+ # * `https://www.googleapis.com/auth/trace.append`
55
+ # @param [Numeric] timeout Default timeout to use in requests. Optional.
56
+ # @param [String] endpoint Override of the endpoint host name. Optional.
57
+ # If the param is nil, uses the default endpoint.
58
+ #
59
+ # @return [OpenTelemetry::Exporter::GoogleCloudTrace::SpanExporter]
60
+ #
61
+ # @example
62
+ # require 'opentelemetry/sdk'
63
+ # require 'opentelemetry/instrumentation/all'
64
+ # require 'opentelemetry/exporter/google_cloud_trace'
65
+ # OpenTelemetry::SDK.configure do |c|
66
+ # c.service_name = 'test_app'
67
+ # c.add_span_processor(
68
+ # OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
69
+ # OpenTelemetry::Exporter::GoogleCloudTrace::SpanExporter.new
70
+ # )
71
+ # )
72
+ # c.use_all() # enables all instrumentation!
73
+ # end
74
+ #
75
+ def initialize project_id: nil,
76
+ credentials: nil,
77
+ scope: nil,
78
+ timeout: nil,
79
+ endpoint: nil
80
+
81
+ @client = ::Google::Cloud::Trace::V2::TraceService::Client.new do |config|
82
+ config.project_id = project_id if project_id
83
+ config.credentials = credentials if credentials
84
+ config.scope = scope if scope
85
+ config.timeout = timeout if timeout
86
+ config.endpoint = endpoint if endpoint
87
+ end
88
+ @project_id = (project_id || default_project_id || credentials&.project_id)
89
+ @project_id = @project_id.to_s
90
+ raise ArgumentError, "project_id is missing" if @project_id.empty?
91
+ @shutdown = false
92
+ @translator = Translator.new @project_id
93
+ end
94
+
95
+ # rubocop:disable Lint/UnusedMethodArgument
96
+ # timeout is needed to match Opentelemetry exporter interface
97
+
98
+ # Called to export sampled {OpenTelemetry::SDK::Trace::SpanData} structs.
99
+ #
100
+ # @param [Enumerable<OpenTelemetry::SDK::Trace::SpanData>] span_data the
101
+ # list of recorded {OpenTelemetry::SDK::Trace::SpanData} structs to be
102
+ # exported.
103
+ # @return [Integer] the result of the export.
104
+ def export span_data, timeout: nil
105
+ return FAILURE if @shutdown
106
+
107
+ begin
108
+ batch_request = @translator.create_batch span_data
109
+ @client.batch_write_spans batch_request
110
+ SUCCESS
111
+ rescue StandardError
112
+ FAILURE
113
+ end
114
+ end
115
+
116
+ # Called when {OpenTelemetry::SDK::Trace::TracerProvider#force_flush} is called, if
117
+ # this exporter is registered to a {OpenTelemetry::SDK::Trace::TracerProvider}
118
+ # object.
119
+ def force_flush timeout: nil
120
+ SUCCESS
121
+ end
122
+
123
+ # Called when {OpenTelemetry::SDK::Trace::TracerProvider#shutdown} is called, if
124
+ # this exporter is registered to a {OpenTelemetry::SDK::Trace::TracerProvider}
125
+ # object.
126
+ def shutdown timeout: nil
127
+ @shutdown = true
128
+ SUCCESS
129
+ end
130
+
131
+ # rubocop:enable Lint/UnusedMethodArgument
132
+
133
+ private
134
+
135
+ def default_project_id
136
+ Google::Cloud.env.project_id
137
+ end
138
+
139
+ def shutdown?
140
+ @shutdown
141
+ end
142
+ end
143
+ end
144
+ end
145
+ end
@@ -0,0 +1,239 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2023 Google LLC
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # https://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+
18
+ require "google/protobuf/well_known_types"
19
+ require "google/rpc/status_pb"
20
+ require "google/rpc/code_pb"
21
+ require "opentelemetry/trace/status"
22
+ require "opentelemetry/trace/span_kind"
23
+ require "opentelemetry/exporter/google_cloud_trace/version"
24
+
25
+ module OpenTelemetry
26
+ module Exporter
27
+ module GoogleCloudTrace
28
+ ##
29
+ # @private
30
+ # This class helps translating the opentelemetry
31
+ # span data [Enumerable<OpenTelemetry::SDK::Trace::SpanData>] into
32
+ # cloud trace spans [Google::Cloud::Trace::V2::Span]
33
+ class Translator
34
+ MAX_LINKS = 128
35
+ MAX_EVENTS = 32
36
+ MAX_EVENT_ATTRIBUTES = 4
37
+ MAX_LINK_ATTRIBUTES = 32
38
+ MAX_SPAN_ATTRIBUTES = 32
39
+ MAX_ATTRIBUTES_KEY_BYTES = 128
40
+ MAX_ATTRIBUTES_VAL_BYTES = 16 * 1024 # 16 kilobytes
41
+ MAX_DISPLAY_NAME_BYTE_COUNT = 128
42
+ MAX_EVENT_NAME_BYTE_COUNT = 256
43
+ LABELS_MAPPING = {
44
+ "http.scheme": "/http/client_protocol",
45
+ "http.method": "/http/method",
46
+ # https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/trace/semantic_conventions/http.md#common-attributes
47
+ "http.request_content_length": "/http/request/size",
48
+ "http.response_content_length": "/http/response/size",
49
+ "http.route": "/http/route",
50
+ "http.status_code": "/http/status_code",
51
+ "http.url": "/http/url",
52
+ "http.user_agent": "/http/user_agent",
53
+ "http.host": "/http/host"
54
+ }.freeze
55
+
56
+ def initialize project_id
57
+ @project_id = project_id
58
+ end
59
+
60
+ # Creates batch_write_spans_request from opentelemetry spans
61
+ #
62
+ # @param [Enumerable<OpenTelemetry::SDK::Trace::SpanData>] spans the
63
+ # list of recorded {OpenTelemetry::SDK::Trace::SpanData} structs to be
64
+ # exported.
65
+ # @return [Google::Cloud::Trace::V2::BatchWriteSpansRequest]
66
+ # The request message for the BatchWriteSpans method.
67
+ def create_batch spans
68
+ cloud_trace_spans = spans.map do |span|
69
+ trace_id = span.hex_trace_id
70
+ span_id = span.hex_span_id
71
+ parent_id = span.hex_parent_span_id
72
+ span_name = "projects/#{@project_id}/traces/#{trace_id}/spans/#{span_id}"
73
+ Google::Cloud::Trace::V2::Span.new(
74
+ name: span_name,
75
+ span_id: span_id,
76
+ parent_span_id: parent_id,
77
+ display_name: create_name(span.name, MAX_DISPLAY_NAME_BYTE_COUNT),
78
+ start_time: create_time(span.start_timestamp),
79
+ end_time: create_time(span.end_timestamp),
80
+ attributes: create_attributes(span.attributes, MAX_SPAN_ATTRIBUTES, add_agent_attribute: true),
81
+ links: create_links(span.links),
82
+ status: create_status(span.status),
83
+ time_events: create_time_events(span.events),
84
+ span_kind: create_span_kind(span.kind)
85
+ )
86
+ end
87
+
88
+ {
89
+ name: "projects/#{@project_id}",
90
+ spans: cloud_trace_spans
91
+ }
92
+ end
93
+
94
+ private
95
+
96
+ def create_time epoch
97
+ return if epoch.nil?
98
+ time_nsec = Time.at 0, epoch, :nsec # create Time from nanoseconds epoch
99
+ Google::Protobuf::Timestamp.from_time time_nsec
100
+ end
101
+
102
+ def create_name name, max_bytes
103
+ truncated_str, truncated_byte_count = truncate_str name, max_bytes
104
+ Google::Cloud::Trace::V2::TruncatableString.new value: truncated_str,
105
+ truncated_byte_count: truncated_byte_count
106
+ end
107
+
108
+ def truncate_str str, max_bytes
109
+ encoded = str.encode "utf-8"
110
+ truncated_str = encoded.byteslice 0, max_bytes
111
+ [truncated_str, encoded.length - truncated_str.encode("utf-8").length]
112
+ end
113
+
114
+ def create_attributes attributes, max_attributes, add_agent_attribute: false
115
+ return if attributes.nil? || attributes.empty?
116
+ attribute_map = {}
117
+
118
+ if add_agent_attribute
119
+ attribute_map["g.co/agent"] = create_attribute_value(
120
+ "opentelemetry-ruby #{OpenTelemetry::SDK::VERSION};" \
121
+ "google-cloud-trace-exporter #{OpenTelemetry::Exporter::GoogleCloudTrace::VERSION}"
122
+ )
123
+ end
124
+
125
+ attributes.each_pair do |k, v|
126
+ key = truncate_str(k.to_s, MAX_ATTRIBUTES_KEY_BYTES).first
127
+ key = LABELS_MAPPING[key.to_sym] if LABELS_MAPPING.key? key.to_sym
128
+ value = create_attribute_value v
129
+ attribute_map[key] = value unless value.nil?
130
+
131
+ break if attribute_map.count >= max_attributes
132
+ end
133
+
134
+ dropped_attributes_count = attributes.count - attribute_map.count
135
+ dropped_attributes_count += 1 if add_agent_attribute
136
+
137
+ Google::Cloud::Trace::V2::Span::Attributes.new(
138
+ attribute_map: attribute_map,
139
+ dropped_attributes_count: dropped_attributes_count
140
+ )
141
+ end
142
+
143
+ def create_attribute_value value
144
+ case value
145
+ when true, false
146
+ Google::Cloud::Trace::V2::AttributeValue.new bool_value: value
147
+ when Integer
148
+ Google::Cloud::Trace::V2::AttributeValue.new int_value: value
149
+ else
150
+ Google::Cloud::Trace::V2::AttributeValue.new(
151
+ string_value: create_name(value.to_s, MAX_ATTRIBUTES_VAL_BYTES)
152
+ )
153
+ end
154
+ end
155
+
156
+ def create_links links
157
+ return if links.nil?
158
+ dropped_links_count = 0
159
+
160
+ if links.length > MAX_LINKS
161
+ dropped_links_count = links.length - MAX_LINKS
162
+ links = links[0...MAX_LINKS]
163
+ end
164
+
165
+ trace_links = links.map do |link|
166
+ trace_id = link.span_context&.hex_trace_id
167
+ span_id = link.span_context&.hex_span_id
168
+ Google::Cloud::Trace::V2::Span::Link.new(
169
+ trace_id: trace_id,
170
+ span_id: span_id,
171
+ type: "TYPE_UNSPECIFIED",
172
+ attributes: create_attributes(link.attributes, MAX_LINK_ATTRIBUTES)
173
+ )
174
+ end
175
+
176
+ Google::Cloud::Trace::V2::Span::Links.new(
177
+ link: trace_links,
178
+ dropped_links_count: dropped_links_count
179
+ )
180
+ end
181
+
182
+ def create_status status
183
+ case status.code
184
+ when OpenTelemetry::Trace::Status::OK
185
+ Google::Rpc::Status.new code: Google::Rpc::Code::OK, message: status.description
186
+ when OpenTelemetry::Trace::Status::UNSET
187
+ nil
188
+ else
189
+ Google::Rpc::Status.new code: Google::Rpc::Code::UNKNOWN, message: status.description
190
+ end
191
+ end
192
+
193
+ def create_time_events events
194
+ return if events.nil?
195
+ dropped_message_events_count = 0
196
+
197
+ dropped_annotations_count = 0
198
+ if events.length > MAX_EVENTS
199
+ dropped_annotations_count = events.length - MAX_EVENTS
200
+ events = events[0...MAX_EVENTS]
201
+ end
202
+
203
+ time_events = events.map do |event|
204
+ Google::Cloud::Trace::V2::Span::TimeEvent.new(
205
+ time: create_time(event.timestamp),
206
+ annotation: Google::Cloud::Trace::V2::Span::TimeEvent::Annotation.new(
207
+ description: create_name(event.name, MAX_EVENT_NAME_BYTE_COUNT),
208
+ attributes: create_attributes(event.attributes, MAX_EVENT_ATTRIBUTES)
209
+ )
210
+ )
211
+ end
212
+
213
+ Google::Cloud::Trace::V2::Span::TimeEvents.new(
214
+ time_event: time_events,
215
+ dropped_annotations_count: dropped_annotations_count,
216
+ dropped_message_events_count: dropped_message_events_count
217
+ )
218
+ end
219
+
220
+ def create_span_kind kind
221
+ case kind
222
+ when OpenTelemetry::Trace::SpanKind::INTERNAL
223
+ Google::Cloud::Trace::V2::Span::SpanKind::INTERNAL
224
+ when OpenTelemetry::Trace::SpanKind::CLIENT
225
+ Google::Cloud::Trace::V2::Span::SpanKind::CLIENT
226
+ when OpenTelemetry::Trace::SpanKind::SERVER
227
+ Google::Cloud::Trace::V2::Span::SpanKind::SERVER
228
+ when OpenTelemetry::Trace::SpanKind::PRODUCER
229
+ Google::Cloud::Trace::V2::Span::SpanKind::PRODUCER
230
+ when OpenTelemetry::Trace::SpanKind::CONSUMER
231
+ Google::Cloud::Trace::V2::Span::SpanKind::CONSUMER
232
+ else
233
+ Google::Cloud::Trace::V2::Span::SpanKind::SPAN_KIND_UNSPECIFIED
234
+ end
235
+ end
236
+ end
237
+ end
238
+ end
239
+ end
@@ -1,10 +1,12 @@
1
+ # frozen_string_literal: true
2
+
1
3
  # Copyright 2023 Google LLC
2
4
  #
3
5
  # Licensed under the Apache License, Version 2.0 (the "License");
4
6
  # you may not use this file except in compliance with the License.
5
7
  # You may obtain a copy of the License at
6
8
  #
7
- # http://www.apache.org/licenses/LICENSE-2.0
9
+ # https://www.apache.org/licenses/LICENSE-2.0
8
10
  #
9
11
  # Unless required by applicable law or agreed to in writing, software
10
12
  # distributed under the License is distributed on an "AS IS" BASIS,
@@ -12,10 +14,11 @@
12
14
  # See the License for the specific language governing permissions and
13
15
  # limitations under the License.
14
16
 
15
- module Opentelemetry
17
+
18
+ module OpenTelemetry
16
19
  module Exporter
17
20
  module GoogleCloudTrace
18
- VERSION = "0.a"
21
+ VERSION = "0.1.1"
19
22
  end
20
23
  end
21
24
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2023 Google LLC
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # https://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ module OpenTelemetry
18
+ module Exporter
19
+ ##
20
+ # # Google Cloud Trace
21
+ #
22
+ # Cloud Trace is a distributed tracing system that collects latency data
23
+ # from your applications and displays it in the Google Cloud Console.
24
+ # You can track how requests propagate through your application and
25
+ # receive detailed near real-time performance insights.
26
+ # Cloud Trace automatically analyzes all of your application's traces
27
+ # to generate in-depth latency reports to surface performance degradations,
28
+ # and can capture traces from all of your VMs, containers, or App Engine projects.
29
+ module GoogleCloudTrace
30
+ end
31
+ end
32
+ end
33
+
34
+
35
+ require "opentelemetry/sdk"
36
+ require "opentelemetry/exporter/google_cloud_trace/span_exporter"
37
+ require "opentelemetry/exporter/google_cloud_trace/version"
@@ -0,0 +1,17 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2023 Google LLC
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # https://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require "opentelemetry/exporter/google_cloud_trace"