Module: Buildkite::TestCollector

Defined in:
lib/buildkite/test_collector.rb,
lib/buildkite/test_collector.rb,
lib/buildkite/test_collector/error.rb,
lib/buildkite/test_collector/object.rb,
lib/buildkite/test_collector/tracer.rb,
lib/buildkite/test_collector/network.rb,
lib/buildkite/test_collector/session.rb,
lib/buildkite/test_collector/version.rb,
lib/buildkite/test_collector/uploader.rb,
lib/buildkite/test_collector/http_client.rb

Defined Under Namespace

Modules: CucumberPlugin, MinitestPlugin, RSpecPlugin Classes: CI, Error, HTTPClient, MinDurationSpanFilter, Network, Object, Session, TimeoutError, Tracer, UUID, UnsupportedFrameworkError, Uploader

Constant Summary collapse

DEFAULT_URL =
"https://analytics-api.buildkite.com/v1/uploads"
DEFAULT_UPLOAD_BATCH_SIZE =
500
VERSION =
"2.10.0"
NAME =
"buildkite-test_collector"

Class Attribute Summary collapse

Class Method Summary collapse

Class Attribute Details

.api_tokenObject

Returns the value of attribute api_token.



32
33
34
# File 'lib/buildkite/test_collector.rb', line 32

def api_token
  @api_token
end

.artifact_pathObject

Returns the value of attribute artifact_path.



37
38
39
# File 'lib/buildkite/test_collector.rb', line 37

def artifact_path
  @artifact_path
end

.batch_sizeObject

Returns the value of attribute batch_size.



40
41
42
# File 'lib/buildkite/test_collector.rb', line 40

def batch_size
  @batch_size
end

.envObject

Returns the value of attribute env.



38
39
40
# File 'lib/buildkite/test_collector.rb', line 38

def env
  @env
end

.sessionObject

Returns the value of attribute session.



35
36
37
# File 'lib/buildkite/test_collector.rb', line 35

def session
  @session
end

.span_filtersObject

Returns the value of attribute span_filters.



42
43
44
# File 'lib/buildkite/test_collector.rb', line 42

def span_filters
  @span_filters
end

.tagsObject

Returns the value of attribute tags.



39
40
41
# File 'lib/buildkite/test_collector.rb', line 39

def tags
  @tags
end

.trace_min_durationObject

Returns the value of attribute trace_min_duration.



41
42
43
# File 'lib/buildkite/test_collector.rb', line 41

def trace_min_duration
  @trace_min_duration
end

.tracing_enabledObject

Returns the value of attribute tracing_enabled.



36
37
38
# File 'lib/buildkite/test_collector.rb', line 36

def tracing_enabled
  @tracing_enabled
end

.uploaderObject

Returns the value of attribute uploader.



34
35
36
# File 'lib/buildkite/test_collector.rb', line 34

def uploader
  @uploader
end

.urlObject

Returns the value of attribute url.



33
34
35
# File 'lib/buildkite/test_collector.rb', line 33

def url
  @url
end

Class Method Details

.annotate(content) ⇒ Object



78
79
80
81
82
# File 'lib/buildkite/test_collector.rb', line 78

def self.annotate(content)
  tracer = Buildkite::TestCollector::Uploader.tracer
  tracer&.enter("annotation", **{ content: content })
  tracer&.leave
end

.configure(hook:, token: nil, url: nil, tracing_enabled: true, artifact_path: nil, env: {}, tags: {}) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# File 'lib/buildkite/test_collector.rb', line 45

def self.configure(hook:, token: nil, url: nil, tracing_enabled: true, artifact_path: nil, env: {}, tags: {})
  if hook.to_sym == :cucumber && Gem::Version.new(RUBY_VERSION) < Gem::Version.new('2.7')
    raise UnsupportedFrameworkError.new("Cucumber is only supported in versions of Ruby >= 2.7")
  end

  self.api_token = (token || ENV["BUILDKITE_ANALYTICS_TOKEN"])&.strip
  self.url = url || DEFAULT_URL
  self.tracing_enabled = tracing_enabled
  self.artifact_path = artifact_path
  self.env = env
  self.tags = tags
  self.batch_size = ENV.fetch("BUILDKITE_ANALYTICS_UPLOAD_BATCH_SIZE") { DEFAULT_UPLOAD_BATCH_SIZE }.to_i

  trace_min_ms_string = ENV["BUILDKITE_ANALYTICS_TRACE_MIN_MS"]
  self.trace_min_duration = if trace_min_ms_string && !trace_min_ms_string.empty?
    Float(trace_min_ms_string) / 1000
  end

  self.span_filters = []
  unless self.trace_min_duration.nil?
    self.span_filters << MinDurationSpanFilter.new(self.trace_min_duration)
  end

  self.hook_into(hook)
end

.enable_tracing!Object



96
97
98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/buildkite/test_collector.rb', line 96

def self.enable_tracing!
  return unless self.tracing_enabled

  Buildkite::TestCollector::Network.configure
  Buildkite::TestCollector::Object.configure

  return unless defined?(ActiveSupport)

  require "active_support/notifications"

  ActiveSupport::Notifications.subscribe("sql.active_record") do |name, start, finish, id, payload|
    Buildkite::TestCollector::Uploader.tracer&.backfill(:sql, finish - start, **{ query: payload[:sql] })
  end
end

.hook_into(hook) ⇒ Object



71
72
73
74
75
76
# File 'lib/buildkite/test_collector.rb', line 71

def self.hook_into(hook)
  file = "test_collector/library_hooks/#{hook}"
  require_relative file
rescue LoadError
  raise ArgumentError.new("#{hook.inspect} is not a supported Buildkite Analytics Test library hook.")
end

.tag_execution(key, value) ⇒ Object

Set a key=value tag on the current test execution.



85
86
87
88
89
90
91
92
93
94
# File 'lib/buildkite/test_collector.rb', line 85

def self.tag_execution(key, value)
  tags = Thread.current[:_buildkite_tags]
  raise "_buildkite_tags not available" unless tags

  unless key.is_a?(String) && value.is_a?(String)
    raise ArgumentError, "tag key and value expected string"
  end

  tags[key] = value
end