From 387cea0f19fdc2c453063a678e995deea38d16e9 Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Mon, 15 Sep 2025 20:14:20 +0100 Subject: [PATCH] Add support for OpenTelemetry reporting --- Gemfile | 5 + Gemfile.lock | 225 +++++++++++++++++++++++++++ config/initializers/opentelemetry.rb | 15 ++ 3 files changed, 245 insertions(+) create mode 100644 config/initializers/opentelemetry.rb diff --git a/Gemfile b/Gemfile index cda7173a7..a61654fa9 100644 --- a/Gemfile +++ b/Gemfile @@ -115,6 +115,11 @@ gem "dalli" # Load canonical-rails to generate canonical URLs gem "canonical-rails" +# Use to generate telemetry +gem "opentelemetry-exporter-otlp", :require => false +gem "opentelemetry-instrumentation-all", :require => false +gem "opentelemetry-sdk", :require => false + # Used to generate images for traces gem "bzip2-ffi" gem "ffi-libarchive" diff --git a/Gemfile.lock b/Gemfile.lock index f2d256a56..89b383ea6 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -307,6 +307,8 @@ GEM globalid (1.2.1) activesupport (>= 6.1) google-protobuf (3.25.8) + googleapis-common-protos-types (1.20.0) + google-protobuf (>= 3.18, < 5.a) hashdiff (1.2.1) hashie (5.0.0) highline (3.1.2) @@ -476,6 +478,226 @@ GEM omniauth (~> 2.0) open4 (1.3.4) openstreetmap-deadlock_retry (1.3.1) + opentelemetry-api (1.6.0) + opentelemetry-common (0.22.0) + opentelemetry-api (~> 1.0) + opentelemetry-exporter-otlp (0.30.0) + google-protobuf (>= 3.18) + googleapis-common-protos-types (~> 1.3) + opentelemetry-api (~> 1.1) + opentelemetry-common (~> 0.20) + opentelemetry-sdk (~> 1.2) + opentelemetry-semantic_conventions + opentelemetry-helpers-mysql (0.2.0) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.21) + opentelemetry-helpers-sql (0.1.1) + opentelemetry-api (~> 1.0) + opentelemetry-helpers-sql-obfuscation (0.3.0) + opentelemetry-common (~> 0.21) + opentelemetry-instrumentation-action_mailer (0.4.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-active_support (~> 0.7) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-action_pack (0.13.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-rack (~> 0.21) + opentelemetry-instrumentation-action_view (0.9.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-active_support (~> 0.7) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-active_job (0.8.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-active_model_serializers (0.22.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-active_support (>= 0.7.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-active_record (0.9.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-active_storage (0.1.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-active_support (~> 0.7) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-active_support (0.8.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-all (0.80.0) + opentelemetry-instrumentation-active_model_serializers (~> 0.22.0) + opentelemetry-instrumentation-aws_lambda (~> 0.3.0) + opentelemetry-instrumentation-aws_sdk (~> 0.8.0) + opentelemetry-instrumentation-bunny (~> 0.22.0) + opentelemetry-instrumentation-concurrent_ruby (~> 0.22.0) + opentelemetry-instrumentation-dalli (~> 0.27.0) + opentelemetry-instrumentation-delayed_job (~> 0.23.0) + opentelemetry-instrumentation-ethon (~> 0.23.0) + opentelemetry-instrumentation-excon (~> 0.24.0) + opentelemetry-instrumentation-faraday (~> 0.28.0) + opentelemetry-instrumentation-grape (~> 0.3.0) + opentelemetry-instrumentation-graphql (~> 0.29.0) + opentelemetry-instrumentation-grpc (~> 0.2.0) + opentelemetry-instrumentation-gruf (~> 0.3.0) + opentelemetry-instrumentation-http (~> 0.25.0) + opentelemetry-instrumentation-http_client (~> 0.24.0) + opentelemetry-instrumentation-httpx (~> 0.3.0) + opentelemetry-instrumentation-koala (~> 0.21.0) + opentelemetry-instrumentation-lmdb (~> 0.23.0) + opentelemetry-instrumentation-mongo (~> 0.23.0) + opentelemetry-instrumentation-mysql2 (~> 0.29.0) + opentelemetry-instrumentation-net_http (~> 0.23.0) + opentelemetry-instrumentation-pg (~> 0.30.0) + opentelemetry-instrumentation-que (~> 0.9.0) + opentelemetry-instrumentation-racecar (~> 0.4.0) + opentelemetry-instrumentation-rack (~> 0.27.0) + opentelemetry-instrumentation-rails (~> 0.37.0) + opentelemetry-instrumentation-rake (~> 0.3.1) + opentelemetry-instrumentation-rdkafka (~> 0.7.0) + opentelemetry-instrumentation-redis (~> 0.26.1) + opentelemetry-instrumentation-resque (~> 0.6.0) + opentelemetry-instrumentation-restclient (~> 0.24.0) + opentelemetry-instrumentation-ruby_kafka (~> 0.22.0) + opentelemetry-instrumentation-sidekiq (~> 0.26.0) + opentelemetry-instrumentation-sinatra (~> 0.26.0) + opentelemetry-instrumentation-trilogy (~> 0.61.0) + opentelemetry-instrumentation-aws_lambda (0.3.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-aws_sdk (0.8.2) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-base (0.23.0) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.21) + opentelemetry-registry (~> 0.1) + opentelemetry-instrumentation-bunny (0.22.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-concurrent_ruby (0.22.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-dalli (0.27.3) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-delayed_job (0.23.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-ethon (0.23.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-excon (0.24.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-faraday (0.28.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-grape (0.3.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-rack (~> 0.21) + opentelemetry-instrumentation-graphql (0.29.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-grpc (0.2.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-gruf (0.3.0) + opentelemetry-api (>= 1.0.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-http (0.25.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-http_client (0.24.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-httpx (0.3.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-koala (0.21.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-lmdb (0.23.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-mongo (0.23.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-mysql2 (0.29.1) + opentelemetry-api (~> 1.0) + opentelemetry-helpers-mysql + opentelemetry-helpers-sql + opentelemetry-helpers-sql-obfuscation + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-net_http (0.23.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-pg (0.30.1) + opentelemetry-api (~> 1.0) + opentelemetry-helpers-sql + opentelemetry-helpers-sql-obfuscation + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-que (0.9.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-racecar (0.4.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-rack (0.27.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-rails (0.37.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-action_mailer (~> 0.4.0) + opentelemetry-instrumentation-action_pack (~> 0.13.0) + opentelemetry-instrumentation-action_view (~> 0.9.0) + opentelemetry-instrumentation-active_job (~> 0.8.0) + opentelemetry-instrumentation-active_record (~> 0.9.0) + opentelemetry-instrumentation-active_storage (~> 0.1.0) + opentelemetry-instrumentation-active_support (~> 0.8.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-concurrent_ruby (~> 0.22.0) + opentelemetry-instrumentation-rake (0.3.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-rdkafka (0.7.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-redis (0.26.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-resque (0.6.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-restclient (0.24.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-ruby_kafka (0.22.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-sidekiq (0.26.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-sinatra (0.26.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-instrumentation-rack (~> 0.21) + opentelemetry-instrumentation-trilogy (0.61.1) + opentelemetry-api (~> 1.0) + opentelemetry-helpers-mysql + opentelemetry-helpers-sql + opentelemetry-helpers-sql-obfuscation + opentelemetry-instrumentation-base (~> 0.23.0) + opentelemetry-semantic_conventions (>= 1.8.0) + opentelemetry-registry (0.4.0) + opentelemetry-api (~> 1.1) + opentelemetry-sdk (1.8.1) + opentelemetry-api (~> 1.1) + opentelemetry-common (~> 0.20) + opentelemetry-registry (~> 0.2) + opentelemetry-semantic_conventions + opentelemetry-semantic_conventions (1.11.0) + opentelemetry-api (~> 1.0) ostruct (0.6.3) overcommit (0.68.0) childprocess (>= 0.6.3, < 6) @@ -768,6 +990,9 @@ DEPENDENCIES omniauth-microsoft_graph omniauth-rails_csrf_protection (~> 1.0) openstreetmap-deadlock_retry (>= 1.3.1) + opentelemetry-exporter-otlp + opentelemetry-instrumentation-all + opentelemetry-sdk overcommit pg puma (~> 6.6) diff --git a/config/initializers/opentelemetry.rb b/config/initializers/opentelemetry.rb new file mode 100644 index 000000000..35c6e0305 --- /dev/null +++ b/config/initializers/opentelemetry.rb @@ -0,0 +1,15 @@ +# frozen_string_literal: true + +if ENV.key?("OTEL_TRACES_EXPORTER") + require "opentelemetry/sdk" + require "opentelemetry/instrumentation/all" + require "opentelemetry/exporter/otlp" + + OpenTelemetry::SDK.configure do |c| + c.use_all( + "OpenTelemetry::Instrumentation::Rack" => { + :allowed_request_headers => %w[X-Request-Id] + } + ) + end +end -- 2.39.5