Module: Splunk::Otel::Common

Defined in:
lib/splunk/otel/common.rb

Overview

functions for shared functionality that will be used by multiple instrumentation libraries. Like creating RUM headers used by any HTTP library.

Constant Summary collapse

CORS_EXPOSE_HEADER =
"Access-Control-Expose-Headers"
SERVER_TIMING_HEADER =
"Server-Timing"

Class Method Summary collapse

Class Method Details

.rum_headers(headers) ⇒ Object

rubocop:disable Lint/MissingCopEnableDirective rubocop:disable Metrics/PerceivedComplexity rubocop:disable Metrics/MethodLength rubocop:disable Metrics/AbcSize



16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/splunk/otel/common.rb', line 16

def rum_headers(headers)
  span = OpenTelemetry::Trace.current_span

  return headers if span == OpenTelemetry::Trace::Span::INVALID

  version = "00"
  trace_id = span.context.hex_trace_id
  span_id = span.context.hex_span_id
  flags = span.context.trace_flags.sampled? ? "01" : "00"

  trace_parent = [version, trace_id, span_id, flags]
  headers[SERVER_TIMING_HEADER] = if (headers[SERVER_TIMING_HEADER] || "").empty?
                                    "traceparent;desc=\"#{trace_parent.join("-")}\""
                                  else
                                    # rubocop:disable Layout/LineLength
                                    "#{headers[SERVER_TIMING_HEADER]}, traceparent;desc=\"#{trace_parent.join("-")}\""
                                  end

  # TODO: check if this needs to be conditioned on CORS
  headers[CORS_EXPOSE_HEADER] = if (headers[CORS_EXPOSE_HEADER] || "").empty?
                                  SERVER_TIMING_HEADER
                                else
                                  "#{headers[CORS_EXPOSE_HEADER]}, #{SERVER_TIMING_HEADER}"
                                end

  headers
end