|
3 | 3 | require 'opentelemetry-metrics-api'
|
4 | 4 | require 'opentelemetry-metrics-sdk'
|
5 | 5 | require 'opentelemetry-exporter-otlp'
|
6 |
| -require 'opentelemetry/instrumentation/aws_lambda/handler' |
7 | 6 |
|
8 |
| -otel_lambda_handler = OpenTelemetry::Instrumentation::AwsLambda::Handler.new |
| 7 | +def preload_libraries |
| 8 | + default_task_location = '/var/task' |
| 9 | + |
| 10 | + handler_file = ENV.values_at('ORIG_HANDLER', '_HANDLER').compact.first&.split('.')&.first |
| 11 | + |
| 12 | + unless handler_file && File.exist?("#{default_task_location}/#{handler_file}.rb") |
| 13 | + OpenTelemetry.logger.warn { 'Could not find the original handler file to preload libraries.' } |
| 14 | + return |
| 15 | + end |
| 16 | + |
| 17 | + libraries = File.read("#{default_task_location}/#{handler_file}.rb") |
| 18 | + .scan(/^\s*require\s+['"]([^'"]+)['"]/) |
| 19 | + .flatten |
| 20 | + |
| 21 | + libraries.each do |lib| |
| 22 | + require lib |
| 23 | + rescue StandardError => e |
| 24 | + OpenTelemetry.logger.warn { "Could not load library #{lib}: #{e.message}" } |
| 25 | + end |
| 26 | +end |
| 27 | + |
| 28 | +preload_libraries |
| 29 | + |
| 30 | +require 'opentelemetry/instrumentation/aws_sdk/handler' |
| 31 | +require 'opentelemetry/instrumentation/aws_sdk/services' |
| 32 | + |
| 33 | +def loaded_constants |
| 34 | + services = Aws.constants & OpenTelemetry::Instrumentation::AwsSdk::SERVICES.map(&:to_sym) |
| 35 | + |
| 36 | + services.each_with_object([]) do |service, constants| |
| 37 | + next if Aws.autoload?(service) |
| 38 | + |
| 39 | + begin |
| 40 | + constants << Aws.const_get(service, false).const_get(:Client, false) |
| 41 | + rescue StandardError => e |
| 42 | + OpenTelemetry.logger.warn { "Constant could not be loaded: #{e.message}" } |
| 43 | + end |
| 44 | + end |
| 45 | +end |
| 46 | + |
| 47 | +Seahorse::Client::Base.add_plugin(OpenTelemetry::Instrumentation::AwsSdk::Plugin) if defined?(Seahorse::Client::Base) |
| 48 | +loaded_constants.each { |klass| klass.add_plugin(OpenTelemetry::Instrumentation::AwsSdk::Plugin) } |
| 49 | + |
9 | 50 | require 'solarwinds_apm'
|
10 | 51 |
|
11 |
| -define_method(:otel_wrapper) do |event:, context:| |
12 |
| - otel_lambda_handler.call_wrapped(event: event, context: context) |
| 52 | +def otel_wrapper(event:, context:) |
| 53 | + otel_wrapper = OpenTelemetry::Instrumentation::AwsLambda::Handler.new |
| 54 | + otel_wrapper.call_wrapped(event: event, context: context) |
13 | 55 | end
|
0 commit comments