summaryrefslogtreecommitdiff
path: root/qa/qa/support/formatters/test_stats_formatter.rb
diff options
context:
space:
mode:
Diffstat (limited to 'qa/qa/support/formatters/test_stats_formatter.rb')
-rw-r--r--qa/qa/support/formatters/test_stats_formatter.rb111
1 files changed, 82 insertions, 29 deletions
diff --git a/qa/qa/support/formatters/test_stats_formatter.rb b/qa/qa/support/formatters/test_stats_formatter.rb
index 7678cb8406c..430294b0bb6 100644
--- a/qa/qa/support/formatters/test_stats_formatter.rb
+++ b/qa/qa/support/formatters/test_stats_formatter.rb
@@ -14,40 +14,38 @@ module QA
return log(:warn, 'Missing QA_INFLUXDB_URL, skipping metrics export!') unless influxdb_url
return log(:warn, 'Missing QA_INFLUXDB_TOKEN, skipping metrics export!') unless influxdb_token
- data = notification.examples.map { |example| test_stats(example) }.compact
- influx_client.create_write_api.write(data: data)
- log(:info, "Pushed #{data.length} entries to influxdb")
- rescue StandardError => e
- log(:error, "Failed to push data to influxdb, error: #{e}")
+ push_test_stats(notification.examples)
+ push_fabrication_stats
end
private
- # InfluxDb client
+ # Push test execution stats to influxdb
#
- # @return [InfluxDB2::Client]
- def influx_client
- @influx_client ||= InfluxDB2::Client.new(
- influxdb_url,
- influxdb_token,
- bucket: 'e2e-test-stats',
- org: 'gitlab-qa',
- precision: InfluxDB2::WritePrecision::NANOSECOND
- )
- end
+ # @param [Array<RSpec::Core::Example>] examples
+ # @return [void]
+ def push_test_stats(examples)
+ data = examples.map { |example| test_stats(example) }.compact
- # InfluxDb instance url
- #
- # @return [String]
- def influxdb_url
- @influxdb_url ||= env('QA_INFLUXDB_URL')
+ influx_client.write(data: data)
+ log(:debug, "Pushed #{data.length} test execution entries to influxdb")
+ rescue StandardError => e
+ log(:error, "Failed to push test execution stats to influxdb, error: #{e}")
end
- # Influxdb token
+ # Push resource fabrication stats to influxdb
#
- # @return [String]
- def influxdb_token
- @influxdb_token ||= env('QA_INFLUXDB_TOKEN')
+ # @return [void]
+ def push_fabrication_stats
+ data = Tools::TestResourceDataProcessor.resources.flat_map do |resource, values|
+ values.map { |v| fabrication_stats(resource: resource, **v) }
+ end
+ return if data.empty?
+
+ influx_client.write(data: data)
+ log(:debug, "Pushed #{data.length} resource fabrication entries to influxdb")
+ rescue StandardError => e
+ log(:error, "Failed to push fabrication stats to influxdb, error: #{e}")
end
# Transform example to influxdb compatible metrics data
@@ -73,7 +71,8 @@ module QA
job_name: job_name,
merge_request: merge_request,
run_type: env('QA_RUN_TYPE') || run_type,
- stage: devops_stage(file_path)
+ stage: devops_stage(file_path),
+ testcase: example.metadata[:testcase]
},
fields: {
id: example.id,
@@ -84,8 +83,7 @@ module QA
retry_attempts: example.metadata[:retry_attempts] || 0,
job_url: QA::Runtime::Env.ci_job_url,
pipeline_url: env('CI_PIPELINE_URL'),
- pipeline_id: env('CI_PIPELINE_ID'),
- testcase: example.metadata[:testcase]
+ pipeline_id: env('CI_PIPELINE_ID')
}
}
rescue StandardError => e
@@ -93,6 +91,34 @@ module QA
nil
end
+ # Resource fabrication data point
+ #
+ # @param [String] resource
+ # @param [String] info
+ # @param [Symbol] fabrication_method
+ # @param [Symbol] http_method
+ # @param [Integer] fabrication_time
+ # @return [Hash]
+ def fabrication_stats(resource:, info:, fabrication_method:, http_method:, fabrication_time:, timestamp:, **)
+ {
+ name: 'fabrication-stats',
+ time: time,
+ tags: {
+ resource: resource,
+ fabrication_method: fabrication_method,
+ http_method: http_method,
+ run_type: env('QA_RUN_TYPE') || run_type,
+ merge_request: merge_request
+ },
+ fields: {
+ fabrication_time: fabrication_time,
+ info: info,
+ job_url: QA::Runtime::Env.ci_job_url,
+ timestamp: timestamp
+ }
+ }
+ end
+
# Project name
#
# @return [String]
@@ -150,7 +176,7 @@ module QA
# @param [String] message
# @return [void]
def log(level, message)
- QA::Runtime::Logger.public_send(level, "influxdb exporter: #{message}")
+ QA::Runtime::Logger.public_send(level, "[influxdb exporter]: #{message}")
end
# Return non empty environment variable value
@@ -170,6 +196,33 @@ module QA
def devops_stage(file_path)
file_path.match(%r{\d{1,2}_(\w+)/})&.captures&.first
end
+
+ # InfluxDb client
+ #
+ # @return [InfluxDB2::WriteApi]
+ def influx_client
+ @influx_client ||= InfluxDB2::Client.new(
+ influxdb_url,
+ influxdb_token,
+ bucket: 'e2e-test-stats',
+ org: 'gitlab-qa',
+ precision: InfluxDB2::WritePrecision::NANOSECOND
+ ).create_write_api
+ end
+
+ # InfluxDb instance url
+ #
+ # @return [String]
+ def influxdb_url
+ @influxdb_url ||= env('QA_INFLUXDB_URL')
+ end
+
+ # Influxdb token
+ #
+ # @return [String]
+ def influxdb_token
+ @influxdb_token ||= env('QA_INFLUXDB_TOKEN')
+ end
end
end
end