# encoding: utf-8 # This file is distributed under New Relic's license terms. # See https://github.com/newrelic/newrelic-ruby-agent/blob/main/LICENSE for complete details. # frozen_string_literal: true require_relative 'instrumentation' module NewRelic::Agent::Instrumentation module Curb module Chain def self.instrument! Curl::Easy.class_eval do include NewRelic::Agent::Instrumentation::Curb::Easy def http_head_with_newrelic(*args, &blk) http_head_with_tracing { http_head_without_newrelic(*args, &blk) } end alias_method :http_head_without_newrelic, :http_head alias_method :http_head, :http_head_with_newrelic def http_post_with_newrelic(*args, &blk) http_post_with_tracing { http_post_without_newrelic(*args, &blk) } end alias_method :http_post_without_newrelic, :http_post alias_method :http_post, :http_post_with_newrelic def http_put_with_newrelic(*args, &blk) http_put_with_tracing { http_put_without_newrelic(*args, &blk) } end alias_method :http_put_without_newrelic, :http_put alias_method :http_put, :http_put_with_newrelic # Hook the #http method to set the verb. def http_with_newrelic verb http_with_tracing(verb) { http_without_newrelic(verb) } end alias_method :http_without_newrelic, :http alias_method :http, :http_with_newrelic # Hook the #perform method to mark the request as non-parallel. def perform_with_newrelic perform_with_tracing { perform_without_newrelic } end alias_method :perform_without_newrelic, :perform alias_method :perform, :perform_with_newrelic # Record the HTTP verb for future #perform calls def method_with_newrelic verb method_with_tracing(verb) { method_without_newrelic(verb) } end alias_method :method_without_newrelic, :method alias_method :method, :method_with_newrelic # We override this method in order to ensure access to header_str even # though we use an on_header callback def header_str_with_newrelic header_str_with_tracing { header_str_without_newrelic } end alias_method :header_str_without_newrelic, :header_str alias_method :header_str, :header_str_with_newrelic end Curl::Multi.class_eval do include NewRelic::Agent::Instrumentation::Curb::Multi # Add CAT with callbacks if the request is serial def add_with_newrelic(curl) add_with_tracing(curl) { add_without_newrelic curl } end alias_method :add_without_newrelic, :add alias_method :add, :add_with_newrelic # Trace as an External/Multiple call if the first request isn't serial. def perform_with_newrelic(&blk) perform_with_tracing { perform_without_newrelic(&blk) } end alias_method :perform_without_newrelic, :perform alias_method :perform, :perform_with_newrelic end end end end end