Class: Sentry::Span

Inherits:
Object
  • Object
show all
Defined in:
lib/sentry/span.rb

Direct Known Subclasses

Transaction

Defined Under Namespace

Modules: DataConventions

Constant Summary collapse

STATUS_MAP =
{
  400 => "invalid_argument",
  401 => "unauthenticated",
  403 => "permission_denied",
  404 => "not_found",
  409 => "already_exists",
  429 => "resource_exhausted",
  499 => "cancelled",
  500 => "internal_error",
  501 => "unimplemented",
  503 => "unavailable",
  504 => "deadline_exceeded"
}
DEFAULT_SPAN_ORIGIN =
"manual"

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(transaction:, description: nil, op: nil, status: nil, trace_id: nil, span_id: nil, parent_span_id: nil, sampled: nil, start_timestamp: nil, timestamp: nil, origin: nil) ⇒ Span

Returns a new instance of Span.



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/sentry/span.rb', line 117

def initialize(
  transaction:,
  description: nil,
  op: nil,
  status: nil,
  trace_id: nil,
  span_id: nil,
  parent_span_id: nil,
  sampled: nil,
  start_timestamp: nil,
  timestamp: nil,
  origin: nil
)
  @trace_id = trace_id || SecureRandom.uuid.delete("-")
  @span_id = span_id || SecureRandom.uuid.delete("-").slice(0, 16)
  @parent_span_id = parent_span_id
  @sampled = sampled
  @start_timestamp = start_timestamp || Sentry.utc_now.to_f
  @timestamp = timestamp
  @description = description
  @transaction = transaction
  @op = op
  @status = status
  @data = {}
  @tags = {}
  @origin = origin || DEFAULT_SPAN_ORIGIN
end

Instance Attribute Details

#dataHash (readonly)

Span data

Returns:

  • (Hash)


102
103
104
# File 'lib/sentry/span.rb', line 102

def data
  @data
end

#descriptionString (readonly)

Span description

Returns:

  • (String)


90
91
92
# File 'lib/sentry/span.rb', line 90

def description
  @description
end

#opString (readonly)

Span operation

Returns:

  • (String)


93
94
95
# File 'lib/sentry/span.rb', line 93

def op
  @op
end

#originString (readonly)

Span origin that tracks what kind of instrumentation created a span

Returns:

  • (String)


105
106
107
# File 'lib/sentry/span.rb', line 105

def origin
  @origin
end

#parent_span_idString (readonly)

Span parent’s span_id.

Returns:

  • (String)


78
79
80
# File 'lib/sentry/span.rb', line 78

def parent_span_id
  @parent_span_id
end

#sampledBoolean? (readonly)

Sampling result of the span.

Returns:

  • (Boolean, nil)


81
82
83
# File 'lib/sentry/span.rb', line 81

def sampled
  @sampled
end

#span_idString (readonly)

An uuid that can be used to identify the span.

Returns:

  • (String)


75
76
77
# File 'lib/sentry/span.rb', line 75

def span_id
  @span_id
end

#span_recorderSpanRecorder

The SpanRecorder the current span belongs to. SpanRecorder holds all spans under the same Transaction object (including the Transaction itself).

Returns:

  • (SpanRecorder)


110
111
112
# File 'lib/sentry/span.rb', line 110

def span_recorder
  @span_recorder
end

#start_timestampFloat (readonly)

Starting timestamp of the span.

Returns:

  • (Float)


84
85
86
# File 'lib/sentry/span.rb', line 84

def start_timestamp
  @start_timestamp
end

#statusString (readonly)

Span status

Returns:

  • (String)


96
97
98
# File 'lib/sentry/span.rb', line 96

def status
  @status
end

#tagsHash (readonly)

Span tags

Returns:

  • (Hash)


99
100
101
# File 'lib/sentry/span.rb', line 99

def tags
  @tags
end

#timestampFloat (readonly)

Finishing timestamp of the span.

Returns:

  • (Float)


87
88
89
# File 'lib/sentry/span.rb', line 87

def timestamp
  @timestamp
end

#trace_idString (readonly)

An uuid that can be used to identify a trace.

Returns:

  • (String)


72
73
74
# File 'lib/sentry/span.rb', line 72

def trace_id
  @trace_id
end

#transactionTransaction (readonly)

The Transaction object the Span belongs to. Every span needs to be attached to a Transaction and their child spans will also inherit the same transaction.

Returns:



115
116
117
# File 'lib/sentry/span.rb', line 115

def transaction
  @transaction
end

Instance Method Details

#deep_dupObject



246
247
248
# File 'lib/sentry/span.rb', line 246

def deep_dup
  dup
end

#finish(end_timestamp: nil) ⇒ self

Finishes the span by adding a timestamp.

Returns:

  • (self)


147
148
149
150
# File 'lib/sentry/span.rb', line 147

def finish(end_timestamp: nil)
  @timestamp = end_timestamp || @timestamp || Sentry.utc_now.to_f
  self
end

#get_dynamic_sampling_contextHash?

Returns the Dynamic Sampling Context from the transaction baggage.

Returns:

  • (Hash, nil)


170
171
172
# File 'lib/sentry/span.rb', line 170

def get_dynamic_sampling_context
  transaction.get_baggage&.dynamic_sampling_context
end

#get_trace_contextHash

Returns the span’s context that can be used to embed in an Event.

Returns:

  • (Hash)


198
199
200
201
202
203
204
205
206
207
208
209
# File 'lib/sentry/span.rb', line 198

def get_trace_context
  {
    trace_id: @trace_id,
    span_id: @span_id,
    parent_span_id: @parent_span_id,
    description: @description,
    op: @op,
    status: @status,
    origin: @origin,
    data: @data
  }
end

#metrics_local_aggregatorObject

Collects gauge metrics on the span for metric summaries.



311
312
313
# File 'lib/sentry/span.rb', line 311

def metrics_local_aggregator
  @metrics_local_aggregator ||= Sentry::Metrics::LocalAggregator.new
end

#metrics_summaryObject



315
316
317
# File 'lib/sentry/span.rb', line 315

def metrics_summary
  @metrics_local_aggregator&.to_hash
end

#set_data(key, value) ⇒ Object

Inserts a key-value pair to the span’s data payload.

Parameters:

  • key (String, Symbol)
  • value (Object)


293
294
295
# File 'lib/sentry/span.rb', line 293

def set_data(key, value)
  @data[key] = value
end

#set_description(description) ⇒ Object

Sets the span’s description.

Parameters:

  • description (String)

    description of the span.



258
259
260
# File 'lib/sentry/span.rb', line 258

def set_description(description)
  @description = description
end

#set_http_status(status_code) ⇒ Object

Sets the span’s status with given http status code.

Parameters:

  • status_code (String)

    example: “500”.



277
278
279
280
281
282
283
284
285
286
287
288
# File 'lib/sentry/span.rb', line 277

def set_http_status(status_code)
  status_code = status_code.to_i
  set_data(DataConventions::HTTP_STATUS_CODE, status_code)

  status =
    if status_code >= 200 && status_code < 299
      "ok"
    else
      STATUS_MAP[status_code]
    end
  set_status(status)
end

#set_op(op) ⇒ Object

Sets the span’s operation.

Parameters:

  • op (String)

    operation of the span.



252
253
254
# File 'lib/sentry/span.rb', line 252

def set_op(op)
  @op = op
end

#set_origin(origin) ⇒ Object

Sets the origin of the span.

Parameters:

  • origin (String)


306
307
308
# File 'lib/sentry/span.rb', line 306

def set_origin(origin)
  @origin = origin
end

#set_status(status) ⇒ Object

Sets the span’s status.

Parameters:

  • satus (String)

    status of the span.



265
266
267
# File 'lib/sentry/span.rb', line 265

def set_status(status)
  @status = status
end

#set_tag(key, value) ⇒ Object

Sets a tag to the span.

Parameters:

  • key (String, Symbol)
  • value (String)


300
301
302
# File 'lib/sentry/span.rb', line 300

def set_tag(key, value)
  @tags[key] = value
end

#set_timestamp(timestamp) ⇒ Object

Sets the span’s finish timestamp.

Parameters:

  • timestamp (Float)

    finished time in float format (most precise).



271
272
273
# File 'lib/sentry/span.rb', line 271

def set_timestamp(timestamp)
  @timestamp = timestamp
end

#start_child(**attributes) ⇒ Object

Starts a child span with given attributes.

Parameters:

  • attributes (Hash)

    the attributes for the child span.



213
214
215
216
217
218
219
220
221
222
223
# File 'lib/sentry/span.rb', line 213

def start_child(**attributes)
  attributes = attributes.dup.merge(transaction: @transaction, trace_id: @trace_id, parent_span_id: @span_id, sampled: @sampled)
  new_span = Span.new(**attributes)
  new_span.span_recorder = span_recorder

  if span_recorder
    span_recorder.add(new_span)
  end

  new_span
end

#to_baggageString?

Generates a W3C Baggage header string for distributed tracing from the incoming baggage stored on the transaction.

Returns:

  • (String, nil)


164
165
166
# File 'lib/sentry/span.rb', line 164

def to_baggage
  transaction.get_baggage&.serialize
end

#to_hashHash

Returns:

  • (Hash)


175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
# File 'lib/sentry/span.rb', line 175

def to_hash
  hash = {
    trace_id: @trace_id,
    span_id: @span_id,
    parent_span_id: @parent_span_id,
    start_timestamp: @start_timestamp,
    timestamp: @timestamp,
    description: @description,
    op: @op,
    status: @status,
    tags: @tags,
    data: @data,
    origin: @origin
  }

  summary = metrics_summary
  hash[:_metrics_summary] = summary if summary

  hash
end

#to_sentry_traceString

Generates a trace string that can be used to connect other transactions.

Returns:

  • (String)


154
155
156
157
158
159
# File 'lib/sentry/span.rb', line 154

def to_sentry_trace
  sampled_flag = ""
  sampled_flag = @sampled ? 1 : 0 unless @sampled.nil?

  "#{@trace_id}-#{@span_id}-#{sampled_flag}"
end

#with_child_span(**attributes, &block) {|child_span| ... } ⇒ Object

Starts a child span, yield it to the given block, and then finish the span after the block is executed.

Examples:

span.with_child_span do |child_span|
  # things happen here will be recorded in a child span
end

Parameters:

  • attributes (Hash)

    the attributes for the child span.

  • block (Proc)

    the action to be recorded in the child span.

Yield Parameters:



234
235
236
237
238
239
240
241
242
243
244
# File 'lib/sentry/span.rb', line 234

def with_child_span(**attributes, &block)
  child_span = start_child(**attributes)

  yield(child_span)

  child_span.finish
rescue
  child_span.set_http_status(500)
  child_span.finish
  raise
end