summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRenaud Chaput <renchap@gmail.com>2024-04-30 11:33:04 +0200
committerRenaud Chaput <renchap@gmail.com>2024-05-02 22:09:42 +0200
commitb09e404991f1b79dd47c143dd9119505329d20b3 (patch)
tree27a106d3995a945f9bb7346bea1d40eb49e6f898
parent9e260014c72fa83740d70d2d603e836f86e64b55 (diff)
Add instrumentation through OpenTelemetry.opentelemetry
This is based on the work from #20338 and #29016 Co-authored-by: Juliano Costa <juliano.costa@datadoghq.com> Co-authored-by: Robb Kidd <robbkidd@honeycomb.io>
-rw-r--r--Gemfile18
-rw-r--r--Gemfile.lock108
-rw-r--r--config/initializers/opentelemetry.rb63
3 files changed, 189 insertions, 0 deletions
diff --git a/Gemfile b/Gemfile
index eb507e9d185..4542fdb6fd6 100644
--- a/Gemfile
+++ b/Gemfile
@@ -103,6 +103,24 @@ gem 'rdf-normalize', '~> 0.5'
gem 'private_address_check', '~> 0.5'
+group :opentelemetry do
+ gem 'opentelemetry-exporter-otlp', '~> 0.26.3', require: false
+ gem 'opentelemetry-instrumentation-active_job', '~> 0.7.1', require: false
+ gem 'opentelemetry-instrumentation-active_model_serializers', '~> 0.20.1', require: false
+ gem 'opentelemetry-instrumentation-concurrent_ruby', '~> 0.21.2', require: false
+ gem 'opentelemetry-instrumentation-excon', '~> 0.22.0', require: false
+ gem 'opentelemetry-instrumentation-faraday', '~> 0.24.1', require: false
+ gem 'opentelemetry-instrumentation-http', '~> 0.23.2', require: false
+ gem 'opentelemetry-instrumentation-http_client', '~> 0.22.3', require: false
+ gem 'opentelemetry-instrumentation-net_http', '~> 0.22.4', require: false
+ gem 'opentelemetry-instrumentation-pg', '~> 0.27.1', require: false
+ gem 'opentelemetry-instrumentation-rack', '~> 0.24.1', require: false
+ gem 'opentelemetry-instrumentation-rails', '~> 0.30.0', require: false
+ gem 'opentelemetry-instrumentation-redis', '~> 0.25.3', require: false
+ gem 'opentelemetry-instrumentation-sidekiq', '~> 0.25.2', require: false
+ gem 'opentelemetry-sdk', '~> 1.4', require: false
+end
+
group :test do
# Adds RSpec Error/Warning annotations to GitHub PRs on the Files tab
gem 'rspec-github', '~> 2.4', require: false
diff --git a/Gemfile.lock b/Gemfile.lock
index a231785402e..d6d045b0615 100644
--- a/Gemfile.lock
+++ b/Gemfile.lock
@@ -291,6 +291,9 @@ GEM
ruby-progressbar (~> 1.4)
globalid (1.2.1)
activesupport (>= 6.1)
+ google-protobuf (3.25.3)
+ googleapis-common-protos-types (1.14.0)
+ google-protobuf (~> 3.18)
haml (6.3.0)
temple (>= 0.8.2)
thor
@@ -491,6 +494,96 @@ GEM
openssl (3.2.0)
openssl-signature_algorithm (1.3.0)
openssl (> 2.0)
+ opentelemetry-api (1.2.5)
+ opentelemetry-common (0.20.1)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-exporter-otlp (0.26.3)
+ google-protobuf (~> 3.14)
+ googleapis-common-protos-types (~> 1.3)
+ opentelemetry-api (~> 1.1)
+ opentelemetry-common (~> 0.20)
+ opentelemetry-sdk (~> 1.2)
+ opentelemetry-semantic_conventions
+ opentelemetry-helpers-sql-obfuscation (0.1.0)
+ opentelemetry-common (~> 0.20)
+ opentelemetry-instrumentation-action_pack (0.9.0)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-instrumentation-base (~> 0.22.1)
+ opentelemetry-instrumentation-rack (~> 0.21)
+ opentelemetry-instrumentation-action_view (0.7.0)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-instrumentation-active_support (~> 0.1)
+ opentelemetry-instrumentation-base (~> 0.22.1)
+ opentelemetry-instrumentation-active_job (0.7.1)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-instrumentation-base (~> 0.22.1)
+ opentelemetry-instrumentation-active_model_serializers (0.20.1)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-instrumentation-base (~> 0.22.1)
+ opentelemetry-instrumentation-active_record (0.7.1)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-instrumentation-base (~> 0.22.1)
+ opentelemetry-instrumentation-active_support (0.5.1)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-instrumentation-base (~> 0.22.1)
+ opentelemetry-instrumentation-base (0.22.3)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-registry (~> 0.1)
+ opentelemetry-instrumentation-concurrent_ruby (0.21.2)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-instrumentation-base (~> 0.22.1)
+ opentelemetry-instrumentation-excon (0.22.0)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-common (~> 0.20.0)
+ opentelemetry-instrumentation-base (~> 0.22.1)
+ opentelemetry-instrumentation-faraday (0.24.1)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-common (~> 0.20.0)
+ opentelemetry-instrumentation-base (~> 0.22.1)
+ opentelemetry-instrumentation-http (0.23.2)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-instrumentation-base (~> 0.22.1)
+ opentelemetry-instrumentation-http_client (0.22.3)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-common (~> 0.20.0)
+ opentelemetry-instrumentation-base (~> 0.22.1)
+ opentelemetry-instrumentation-net_http (0.22.4)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-common (~> 0.20.0)
+ opentelemetry-instrumentation-base (~> 0.22.1)
+ opentelemetry-instrumentation-pg (0.27.1)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-helpers-sql-obfuscation
+ opentelemetry-instrumentation-base (~> 0.22.1)
+ opentelemetry-instrumentation-rack (0.24.1)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-common (~> 0.20.0)
+ opentelemetry-instrumentation-base (~> 0.22.1)
+ opentelemetry-instrumentation-rails (0.30.0)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-instrumentation-action_pack (~> 0.9.0)
+ opentelemetry-instrumentation-action_view (~> 0.7.0)
+ opentelemetry-instrumentation-active_job (~> 0.7.0)
+ opentelemetry-instrumentation-active_record (~> 0.7.0)
+ opentelemetry-instrumentation-active_support (~> 0.5.0)
+ opentelemetry-instrumentation-base (~> 0.22.1)
+ opentelemetry-instrumentation-redis (0.25.3)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-common (~> 0.20.0)
+ opentelemetry-instrumentation-base (~> 0.22.1)
+ opentelemetry-instrumentation-sidekiq (0.25.2)
+ opentelemetry-api (~> 1.0)
+ opentelemetry-common (~> 0.20.0)
+ opentelemetry-instrumentation-base (~> 0.22.1)
+ opentelemetry-registry (0.3.1)
+ opentelemetry-api (~> 1.1)
+ opentelemetry-sdk (1.4.1)
+ opentelemetry-api (~> 1.1)
+ opentelemetry-common (~> 0.20)
+ opentelemetry-registry (~> 0.2)
+ opentelemetry-semantic_conventions
+ opentelemetry-semantic_conventions (1.10.0)
+ opentelemetry-api (~> 1.0)
orm_adapter (0.5.0)
ox (2.14.18)
parallel (1.24.0)
@@ -889,6 +982,21 @@ DEPENDENCIES
omniauth-rails_csrf_protection (~> 1.0)
omniauth-saml (~> 2.0)
omniauth_openid_connect (~> 0.6.1)
+ opentelemetry-exporter-otlp (~> 0.26.3)
+ opentelemetry-instrumentation-active_job (~> 0.7.1)
+ opentelemetry-instrumentation-active_model_serializers (~> 0.20.1)
+ opentelemetry-instrumentation-concurrent_ruby (~> 0.21.2)
+ opentelemetry-instrumentation-excon (~> 0.22.0)
+ opentelemetry-instrumentation-faraday (~> 0.24.1)
+ opentelemetry-instrumentation-http (~> 0.23.2)
+ opentelemetry-instrumentation-http_client (~> 0.22.3)
+ opentelemetry-instrumentation-net_http (~> 0.22.4)
+ opentelemetry-instrumentation-pg (~> 0.27.1)
+ opentelemetry-instrumentation-rack (~> 0.24.1)
+ opentelemetry-instrumentation-rails (~> 0.30.0)
+ opentelemetry-instrumentation-redis (~> 0.25.3)
+ opentelemetry-instrumentation-sidekiq (~> 0.25.2)
+ opentelemetry-sdk (~> 1.4)
ox (~> 2.14)
parslet
pg (~> 1.5)
diff --git a/config/initializers/opentelemetry.rb b/config/initializers/opentelemetry.rb
new file mode 100644
index 00000000000..e50132d4617
--- /dev/null
+++ b/config/initializers/opentelemetry.rb
@@ -0,0 +1,63 @@
+# frozen_string_literal: true
+
+# Set OTEL_* environment variables according to OTel docs:
+# https://opentelemetry.io/docs/concepts/sdk-configuration/
+
+if ENV.keys.any? { |name| name.match?(/OTEL_.*_ENDPOINT/) }
+ require 'opentelemetry/sdk'
+ require 'opentelemetry/exporter/otlp'
+
+ require 'opentelemetry/instrumentation/active_job'
+ require 'opentelemetry/instrumentation/active_model_serializers'
+ require 'opentelemetry/instrumentation/concurrent_ruby'
+ require 'opentelemetry/instrumentation/excon'
+ require 'opentelemetry/instrumentation/faraday'
+ require 'opentelemetry/instrumentation/http'
+ require 'opentelemetry/instrumentation/http_client'
+ require 'opentelemetry/instrumentation/net/http'
+ require 'opentelemetry/instrumentation/pg'
+ require 'opentelemetry/instrumentation/rack'
+ require 'opentelemetry/instrumentation/rails'
+ require 'opentelemetry/instrumentation/redis'
+ require 'opentelemetry/instrumentation/sidekiq'
+
+ OpenTelemetry::SDK.configure do |c|
+ # use_all() attempts to load ALL the auto-instrumentations
+ # currently loaded by Ruby requires.
+ #
+ # Load attempts will emit an INFO or WARN to the console
+ # about the success/failure to wire up an auto-instrumentation.
+ # "WARN -- : Instrumentation: <X> failed to install" is most
+ # likely caused by <X> not being a Ruby library loaded by
+ # the application or the instrumentation has been explicitly
+ # disabled.
+ #
+ # To disable an instrumentation, set an environment variable
+ # along this pattern:
+ #
+ # OTEL_RUBY_INSTRUMENTATION_<X>_ENABLED=false
+ #
+ # For example, PostgreSQL and Redis produce a lot of child spans
+ # in the course of this application doing its business. To turn
+ # them off, set the env vars below, but recognize that you will
+ # be missing details about what particular calls to the
+ # datastores are slow.
+ #
+ # OTEL_RUBY_INSTRUMENTATION_PG_ENABLED=false
+ # OTEL_RUBY_INSTRUMENTATION_REDIS_ENABLED=false
+
+ c.use_all({
+ 'OpenTelemetry::Instrumentation::Rack' => {
+ use_rack_events: false, # instead of events, use middleware; allows for untraced_endpoints to ignore child spans
+ untraced_endpoints: ['/health'],
+ },
+ })
+
+ c.service_name = case $PROGRAM_NAME
+ when /puma/ then 'mastodon/web'
+ else
+ "mastodon/#{$PROGRAM_NAME.split('/').last}"
+ end
+ c.service_version = Mastodon::Version.to_s
+ end
+end