Sha256: c64060ffec32ac614ad15c123209aeec95d02174f9b53c02d1deba4af7a29e18

Contents?: true

Size: 1.72 KB

Versions: 18

Compression:

Stored size: 1.72 KB

Contents

# 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

module NewRelic
  module Agent
    class SyntheticsMonitor < InboundRequestMonitor
      SYNTHETICS_HEADER_KEY = 'HTTP_X_NEWRELIC_SYNTHETICS'.freeze

      SUPPORTED_VERSION = 1
      EXPECTED_PAYLOAD_LENGTH = 5

      def on_finished_configuring(events)
        events.subscribe(:before_call, &method(:on_before_call))
      end

      def on_before_call(request) # THREAD_LOCAL_ACCESS
        encoded_header = request[SYNTHETICS_HEADER_KEY]
        return unless encoded_header

        incoming_payload = deserialize_header(encoded_header, SYNTHETICS_HEADER_KEY)

        return unless incoming_payload &&
          SyntheticsMonitor.is_valid_payload?(incoming_payload) &&
          SyntheticsMonitor.is_supported_version?(incoming_payload) &&
          SyntheticsMonitor.is_trusted?(incoming_payload)

        txn = Tracer.current_transaction
        txn.raw_synthetics_header = encoded_header
        txn.synthetics_payload = incoming_payload
      end

      class << self
        def is_supported_version?(incoming_payload)
          incoming_payload.first == SUPPORTED_VERSION
        end

        def is_trusted?(incoming_payload)
          account_id = incoming_payload[1]
          Agent.config[:trusted_account_ids].include?(account_id)
        end

        def is_valid_payload?(incoming_payload)
          incoming_payload.length == EXPECTED_PAYLOAD_LENGTH
        end

        def reject_messaging_synthetics_header(headers)
          headers.reject { |k, _| k == CrossAppTracing::NR_MESSAGE_BROKER_SYNTHETICS_HEADER }
        end
      end
    end
  end
end

Version data entries

18 entries across 18 versions & 1 rubygems

Version Path
newrelic_rpm-9.5.0 lib/new_relic/agent/monitors/synthetics_monitor.rb
newrelic_rpm-9.4.2 lib/new_relic/agent/monitors/synthetics_monitor.rb
newrelic_rpm-9.4.1 lib/new_relic/agent/monitors/synthetics_monitor.rb
newrelic_rpm-9.4.0 lib/new_relic/agent/monitors/synthetics_monitor.rb
newrelic_rpm-9.3.1 lib/new_relic/agent/monitors/synthetics_monitor.rb
newrelic_rpm-9.3.0 lib/new_relic/agent/monitors/synthetics_monitor.rb
newrelic_rpm-9.2.2 lib/new_relic/agent/monitors/synthetics_monitor.rb
newrelic_rpm-9.2.1 lib/new_relic/agent/monitors/synthetics_monitor.rb
newrelic_rpm-9.2.0 lib/new_relic/agent/monitors/synthetics_monitor.rb
newrelic_rpm-9.1.0 lib/new_relic/agent/monitors/synthetics_monitor.rb
newrelic_rpm-9.0.0 lib/new_relic/agent/monitors/synthetics_monitor.rb
newrelic_rpm-8.16.0 lib/new_relic/agent/monitors/synthetics_monitor.rb
newrelic_rpm-8.15.0 lib/new_relic/agent/monitors/synthetics_monitor.rb
newrelic_rpm-8.14.0 lib/new_relic/agent/monitors/synthetics_monitor.rb
newrelic_rpm-8.13.1 lib/new_relic/agent/monitors/synthetics_monitor.rb
newrelic_rpm-8.13.0 lib/new_relic/agent/monitors/synthetics_monitor.rb
newrelic_rpm-8.12.0 lib/new_relic/agent/monitors/synthetics_monitor.rb
newrelic_rpm-8.11.0 lib/new_relic/agent/monitors/synthetics_monitor.rb