Skip to content

Commit d01e116

Browse files
committed
NH-85973: preload libraries from given lambda function
1 parent ba98038 commit d01e116

File tree

2 files changed

+48
-6
lines changed

2 files changed

+48
-6
lines changed

lambda/otel/layer/Gemfile

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ source 'https://rubygems.org'
44

55
source 'https://rubygems.pkg.github.com/solarwinds' do
66
gem 'opentelemetry-exporter-otlp', '0.26.1'
7-
gem 'opentelemetry-metrics-api', '0.0.1'
8-
gem 'opentelemetry-metrics-sdk', '0.0.1'
97
end
108

9+
gem 'opentelemetry-metrics-api', '0.1.0'
10+
gem 'opentelemetry-metrics-sdk', '0.1.0'
1111
gem 'solarwinds_apm', '6.0.2'

lambda/otel/layer/otel_wrapper.rb

Lines changed: 46 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,53 @@
33
require 'opentelemetry-metrics-api'
44
require 'opentelemetry-metrics-sdk'
55
require 'opentelemetry-exporter-otlp'
6-
require 'opentelemetry/instrumentation/aws_lambda/handler'
76

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+
950
require 'solarwinds_apm'
1051

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)
1355
end

0 commit comments

Comments
 (0)