opentelemetry-exporter-google_cloud_trace 0.a → 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dbb7704b47e872f8746e81fac2410bada324a56fcfa4c8c0f95ceff38c7dc7ac
4
- data.tar.gz: fce4c9855d89a1275a43df6dc92fd4cbb84d32d426827dfcbecc27f06d2c7292
3
+ metadata.gz: 896a1567355cdf1e2f6daa30f1ca4acfa2e9053862a61f14c1a94c07a02c7993
4
+ data.tar.gz: e4c54cb48a88a8a2a525dd2bbeef8c716bc20beb91d67b49c367c82b7ba58bd4
5
5
  SHA512:
6
- metadata.gz: c1b1036636c362f089086d0f8b7859c187caf2879ed932a4592375ca416ba86d128b84ceb5e1b982f9b7ac68b8fb51e1cbf27504e690510af6d708b6040cd541
7
- data.tar.gz: 52d390117ee58d9c3518ad47e434fe2fb74a6e3bce28d52e4d914e5e5fde35085876bf83bd05014dd2e39ffef82f2f948374adcbb5bfedebb301a947fd1afcaa
6
+ metadata.gz: 7336a9662a78da966767d1683019dbe1f804a1bcdf6f5da92e5189d4a4b034c3e30f34d76e52df2fd0e81137c2bbeeb52bf58a22d3b6cd34282ba8dcdb25c7cc
7
+ data.tar.gz: 586be672dd22def225b4dcf0137ec8e2530fd198fba56e9450471e6f219dcbd40f7c149d672ef0c9bb1f0841edb4a4e145deaf978510facdad7f72fb02f9d02d
data/.rubocop.yml ADDED
@@ -0,0 +1,21 @@
1
+ inherit_gem:
2
+ google-style: google-style.yml
3
+
4
+ Metrics/BlockLength:
5
+ Enabled: true
6
+ Exclude:
7
+ - test/**/*
8
+ - opentelemetry-exporter-google_cloud_trace.gemspec
9
+
10
+ Style/PreferredHashMethods:
11
+ Enabled: true
12
+ Exclude:
13
+ - test/**/*
14
+
15
+ Metrics/ClassLength:
16
+ Exclude:
17
+ - "**/translator.rb"
18
+
19
+ Naming/FileName:
20
+ Exclude:
21
+ - "lib/opentelemetry-exporter-google_cloud_trace.rb"
data/.yardopts ADDED
@@ -0,0 +1,17 @@
1
+ --no-private
2
+ --title=OpenTelemetry Exporter Google Cloud Trace
3
+ --exclude _pb\.rb$
4
+ --markup markdown
5
+ --markup-provider redcarpet
6
+ --main OVERVIEW.md
7
+
8
+ ./lib/**/*.rb
9
+ -
10
+ OVERVIEW.md
11
+ AUTHENTICATION.md
12
+ LOGGING.md
13
+ CONTRIBUTING.md
14
+ TROUBLESHOOTING.md
15
+ CHANGELOG.md
16
+ CODE_OF_CONDUCT.md
17
+ LICENSE
data/CHANGELOG.md ADDED
@@ -0,0 +1,7 @@
1
+ # Changelog
2
+
3
+ ## 0.1.0 (2023-07-04)
4
+
5
+ #### Features
6
+
7
+ * first release of exporter with minimal support
data/Gemfile ADDED
@@ -0,0 +1,27 @@
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
+ source "https://rubygems.org"
19
+
20
+ # Specify your gem's dependencies in opentelemetry-exporter-google_cloud_trace.gemspec
21
+ gemspec
22
+
23
+ gem "rake", "~> 13.0"
24
+
25
+ gem "minitest", "~> 5.0"
26
+
27
+ gem "rubocop", "~> 1.21"
data/README.md CHANGED
@@ -1,8 +1,38 @@
1
- # Placeholder for Ruby gem opentelemetry-exporter-google_cloud_trace
2
-
3
- This is a placeholder for the future Google-authored gem opentelemetry-exporter-google_cloud_trace.
4
- This placeholder is being released on 2023-06-13 in order to reserve the name.
5
- The final gem should be available shortly after that date. If it has not been
6
- released in a timely manner, or if this placeholder interferes with your work,
7
- you can contact the Google Ruby team by opening an issue in the GitHub
8
- repository https://github.com/googleapis/google-cloud-ruby.
1
+ # Opentelemetry Google Cloud Trace exporter
2
+
3
+ This library is an exporter for OpenTelemetry instrumentation which will help translate the spans into Google Cloud Trace understandable format and publish it to Trace service.
4
+
5
+ ## Installation
6
+
7
+ ```sh
8
+ $ gem install opentelemetry-exporter-google_cloud_trace
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ TODO: Write usage instructions here
14
+
15
+ ## Contributing
16
+
17
+ Contributions to this library are always welcome and highly encouraged.
18
+
19
+ See the {file:../docs/CONTRIBUTING.md Contributing Guide}
20
+ for more information on how to get started.
21
+
22
+ Please note that this project is released with a Contributor Code of Conduct. By
23
+ participating in this project you agree to abide by its terms.
24
+ See {file:../docs/CODE_OF_CONDUCT.md Code of Conduct}
25
+ for more information.
26
+
27
+ ## License
28
+
29
+ This library is licensed under Apache 2.0. Full license text is available in
30
+ [LICENSE](../LICENSE).
31
+
32
+ ## Support
33
+
34
+ Please [report bugs at the project on
35
+ Github](https://github.com/GoogleCloudPlatform/opentelemetry-operations-ruby/issues). Don't
36
+ hesitate to [ask
37
+ questions](http://stackoverflow.com/questions/tagged/google-cloud-platform+ruby)
38
+ about the client or APIs on [StackOverflow](http://stackoverflow.com).
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