diff options
Diffstat (limited to 'qa/qa/support/formatters/test_stats_formatter.rb')
-rw-r--r-- | qa/qa/support/formatters/test_stats_formatter.rb | 111 |
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 |