Commit 40c6f109 authored by Stan Hu's avatar Stan Hu

Merge branch '227305-add-query-apdex-prometheus-metric-to-usage-ping' into 'master'

Add the Query Apdex Prometheus metric to usage ping

See merge request gitlab-org/gitlab!39256
parents 376dafb0 9417c0b1
---
title: Add the Query Apdex Prometheus metric to usage ping
merge_request: 39256
author:
type: other
...@@ -762,6 +762,7 @@ The following is example content of the Usage Ping payload. ...@@ -762,6 +762,7 @@ The following is example content of the Usage Ping payload.
"topology": { "topology": {
"duration_s": 0.013836685999194742, "duration_s": 0.013836685999194742,
"application_requests_per_hour": 4224, "application_requests_per_hour": 4224,
"query_apdex_weekly_average": 0.996,
"failures": [], "failures": [],
"nodes": [ "nodes": [
{ {
......
...@@ -43,6 +43,7 @@ module Gitlab ...@@ -43,6 +43,7 @@ module Gitlab
with_prometheus_client(fallback: {}) do |client| with_prometheus_client(fallback: {}) do |client|
{ {
application_requests_per_hour: topology_app_requests_per_hour(client), application_requests_per_hour: topology_app_requests_per_hour(client),
query_apdex_weekly_average: topology_query_apdex_weekly_average(client),
nodes: topology_node_data(client) nodes: topology_node_data(client)
}.compact }.compact
end end
...@@ -63,6 +64,16 @@ module Gitlab ...@@ -63,6 +64,16 @@ module Gitlab
(result['value'].last.to_f * 1.hour).to_i (result['value'].last.to_f * 1.hour).to_i
end end
def topology_query_apdex_weekly_average(client)
result = query_safely('gitlab_usage_ping:sql_duration_apdex:ratio_rate5m', 'query_apdex', fallback: nil) do |query|
client.query(aggregate_one_week(query)).first
end
return unless result
result['value'].last.to_f
end
def topology_node_data(client) def topology_node_data(client)
# node-level data # node-level data
by_instance_mem = topology_node_memory(client) by_instance_mem = topology_node_memory(client)
......
...@@ -18,6 +18,7 @@ RSpec.describe Gitlab::UsageData::Topology do ...@@ -18,6 +18,7 @@ RSpec.describe Gitlab::UsageData::Topology do
it 'contains node level metrics for each instance' do it 'contains node level metrics for each instance' do
expect_prometheus_api_to( expect_prometheus_api_to(
receive_app_request_volume_query, receive_app_request_volume_query,
receive_query_apdex_ratio_query,
receive_node_memory_query, receive_node_memory_query,
receive_node_memory_utilization_query, receive_node_memory_utilization_query,
receive_node_cpu_count_query, receive_node_cpu_count_query,
...@@ -33,6 +34,7 @@ RSpec.describe Gitlab::UsageData::Topology do ...@@ -33,6 +34,7 @@ RSpec.describe Gitlab::UsageData::Topology do
expect(subject[:topology]).to eq({ expect(subject[:topology]).to eq({
duration_s: 0, duration_s: 0,
application_requests_per_hour: 36, application_requests_per_hour: 36,
query_apdex_weekly_average: 0.996,
failures: [], failures: [],
nodes: [ nodes: [
{ {
...@@ -102,6 +104,7 @@ RSpec.describe Gitlab::UsageData::Topology do ...@@ -102,6 +104,7 @@ RSpec.describe Gitlab::UsageData::Topology do
it 'removes the respective entries and includes the failures' do it 'removes the respective entries and includes the failures' do
expect_prometheus_api_to( expect_prometheus_api_to(
receive_app_request_volume_query(result: []), receive_app_request_volume_query(result: []),
receive_query_apdex_ratio_query(result: []),
receive_node_memory_query(result: []), receive_node_memory_query(result: []),
receive_node_memory_utilization_query(result: []), receive_node_memory_utilization_query(result: []),
receive_node_cpu_count_query, receive_node_cpu_count_query,
...@@ -118,6 +121,7 @@ RSpec.describe Gitlab::UsageData::Topology do ...@@ -118,6 +121,7 @@ RSpec.describe Gitlab::UsageData::Topology do
duration_s: 0, duration_s: 0,
failures: [ failures: [
{ 'app_requests' => 'empty_result' }, { 'app_requests' => 'empty_result' },
{ 'query_apdex' => 'empty_result' },
{ 'node_memory' => 'empty_result' }, { 'node_memory' => 'empty_result' },
{ 'node_memory_utilization' => 'empty_result' }, { 'node_memory_utilization' => 'empty_result' },
{ 'service_rss' => 'empty_result' }, { 'service_rss' => 'empty_result' },
...@@ -240,6 +244,7 @@ RSpec.describe Gitlab::UsageData::Topology do ...@@ -240,6 +244,7 @@ RSpec.describe Gitlab::UsageData::Topology do
it 'normalizes equivalent instance values and maps them to the same node' do it 'normalizes equivalent instance values and maps them to the same node' do
expect_prometheus_api_to( expect_prometheus_api_to(
receive_app_request_volume_query(result: []), receive_app_request_volume_query(result: []),
receive_query_apdex_ratio_query(result: []),
receive_node_memory_query(result: node_memory_response), receive_node_memory_query(result: node_memory_response),
receive_node_memory_utilization_query(result: node_memory_utilization_response), receive_node_memory_utilization_query(result: node_memory_utilization_response),
receive_node_cpu_count_query(result: []), receive_node_cpu_count_query(result: []),
...@@ -256,6 +261,7 @@ RSpec.describe Gitlab::UsageData::Topology do ...@@ -256,6 +261,7 @@ RSpec.describe Gitlab::UsageData::Topology do
duration_s: 0, duration_s: 0,
failures: [ failures: [
{ 'app_requests' => 'empty_result' }, { 'app_requests' => 'empty_result' },
{ 'query_apdex' => 'empty_result' },
{ 'node_cpus' => 'empty_result' }, { 'node_cpus' => 'empty_result' },
{ 'node_cpu_utilization' => 'empty_result' }, { 'node_cpu_utilization' => 'empty_result' },
{ 'service_uss' => 'empty_result' }, { 'service_uss' => 'empty_result' },
...@@ -304,6 +310,7 @@ RSpec.describe Gitlab::UsageData::Topology do ...@@ -304,6 +310,7 @@ RSpec.describe Gitlab::UsageData::Topology do
it 'still reports service metrics' do it 'still reports service metrics' do
expect_prometheus_api_to( expect_prometheus_api_to(
receive_app_request_volume_query(result: []), receive_app_request_volume_query(result: []),
receive_query_apdex_ratio_query(result: []),
receive_node_memory_query(result: []), receive_node_memory_query(result: []),
receive_node_memory_utilization_query(result: []), receive_node_memory_utilization_query(result: []),
receive_node_cpu_count_query(result: []), receive_node_cpu_count_query(result: []),
...@@ -320,6 +327,7 @@ RSpec.describe Gitlab::UsageData::Topology do ...@@ -320,6 +327,7 @@ RSpec.describe Gitlab::UsageData::Topology do
duration_s: 0, duration_s: 0,
failures: [ failures: [
{ 'app_requests' => 'empty_result' }, { 'app_requests' => 'empty_result' },
{ 'query_apdex' => 'empty_result' },
{ 'node_memory' => 'empty_result' }, { 'node_memory' => 'empty_result' },
{ 'node_memory_utilization' => 'empty_result' }, { 'node_memory_utilization' => 'empty_result' },
{ 'node_cpus' => 'empty_result' }, { 'node_cpus' => 'empty_result' },
...@@ -377,6 +385,7 @@ RSpec.describe Gitlab::UsageData::Topology do ...@@ -377,6 +385,7 @@ RSpec.describe Gitlab::UsageData::Topology do
it 'filters out unknown service data and reports the unknown services as a failure' do it 'filters out unknown service data and reports the unknown services as a failure' do
expect_prometheus_api_to( expect_prometheus_api_to(
receive_app_request_volume_query(result: []), receive_app_request_volume_query(result: []),
receive_query_apdex_ratio_query(result: []),
receive_node_memory_query(result: []), receive_node_memory_query(result: []),
receive_node_memory_utilization_query(result: []), receive_node_memory_utilization_query(result: []),
receive_node_cpu_count_query(result: []), receive_node_cpu_count_query(result: []),
...@@ -407,6 +416,7 @@ RSpec.describe Gitlab::UsageData::Topology do ...@@ -407,6 +416,7 @@ RSpec.describe Gitlab::UsageData::Topology do
duration_s: 0, duration_s: 0,
failures: [ failures: [
{ 'app_requests' => 'Gitlab::PrometheusClient::ConnectionError' }, { 'app_requests' => 'Gitlab::PrometheusClient::ConnectionError' },
{ 'query_apdex' => 'Gitlab::PrometheusClient::ConnectionError' },
{ 'node_memory' => 'Gitlab::PrometheusClient::ConnectionError' }, { 'node_memory' => 'Gitlab::PrometheusClient::ConnectionError' },
{ 'node_memory_utilization' => 'Gitlab::PrometheusClient::ConnectionError' }, { 'node_memory_utilization' => 'Gitlab::PrometheusClient::ConnectionError' },
{ 'node_cpus' => 'Gitlab::PrometheusClient::ConnectionError' }, { 'node_cpus' => 'Gitlab::PrometheusClient::ConnectionError' },
...@@ -437,6 +447,7 @@ RSpec.describe Gitlab::UsageData::Topology do ...@@ -437,6 +447,7 @@ RSpec.describe Gitlab::UsageData::Topology do
duration_s: 0, duration_s: 0,
failures: [ failures: [
{ 'app_requests' => exception.to_s }, { 'app_requests' => exception.to_s },
{ 'query_apdex' => 'timeout_cancellation' },
{ 'node_memory' => 'timeout_cancellation' }, { 'node_memory' => 'timeout_cancellation' },
{ 'node_memory_utilization' => 'timeout_cancellation' }, { 'node_memory_utilization' => 'timeout_cancellation' },
{ 'node_cpus' => 'timeout_cancellation' }, { 'node_cpus' => 'timeout_cancellation' },
...@@ -512,6 +523,17 @@ RSpec.describe Gitlab::UsageData::Topology do ...@@ -512,6 +523,17 @@ RSpec.describe Gitlab::UsageData::Topology do
]) ])
end end
def receive_query_apdex_ratio_query(result: nil)
receive(:query)
.with(/gitlab_usage_ping:sql_duration_apdex:ratio_rate5m/)
.and_return(result || [
{
'metric' => {},
'value' => [1000, '0.996']
}
])
end
def receive_node_memory_query(result: nil) def receive_node_memory_query(result: nil)
receive(:query) receive(:query)
.with(/node_memory_total_bytes/, an_instance_of(Hash)) .with(/node_memory_total_bytes/, an_instance_of(Hash))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment