Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
G
gitlab-ce
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
1
Merge Requests
1
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
gitlab-ce
Commits
ccf89acc
Commit
ccf89acc
authored
Jun 06, 2017
by
Pawel Chojnacki
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
expand Namespaces:: and refactoring yaml parsing out of MetricGroup class
parent
c7a1da80
Changes
16
Hide whitespace changes
Inline
Side-by-side
Showing
16 changed files
with
282 additions
and
239 deletions
+282
-239
app/models/environment.rb
app/models/environment.rb
+1
-1
lib/gitlab/prometheus/additional_metrics_parser.rb
lib/gitlab/prometheus/additional_metrics_parser.rb
+36
-0
lib/gitlab/prometheus/metric.rb
lib/gitlab/prometheus/metric.rb
+12
-21
lib/gitlab/prometheus/metric_group.rb
lib/gitlab/prometheus/metric_group.rb
+13
-28
lib/gitlab/prometheus/parsing_error.rb
lib/gitlab/prometheus/parsing_error.rb
+4
-2
lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb
...prometheus/queries/additional_metrics_deployment_query.rb
+17
-11
lib/gitlab/prometheus/queries/additional_metrics_environment_query.rb
...rometheus/queries/additional_metrics_environment_query.rb
+21
-0
lib/gitlab/prometheus/queries/additional_metrics_query.rb
lib/gitlab/prometheus/queries/additional_metrics_query.rb
+0
-82
lib/gitlab/prometheus/queries/deployment_query.rb
lib/gitlab/prometheus/queries/deployment_query.rb
+23
-19
lib/gitlab/prometheus/queries/environment_query.rb
lib/gitlab/prometheus/queries/environment_query.rb
+19
-15
lib/gitlab/prometheus/queries/matched_metrics_query.rb
lib/gitlab/prometheus/queries/matched_metrics_query.rb
+60
-56
lib/gitlab/prometheus/queries/query_additional_metrics.rb
lib/gitlab/prometheus/queries/query_additional_metrics.rb
+72
-0
spec/controllers/projects/prometheus_controller_spec.rb
spec/controllers/projects/prometheus_controller_spec.rb
+1
-1
spec/lib/gitlab/prometheus/queries/additional_metrics_environment_query_spec.rb
...heus/queries/additional_metrics_environment_query_spec.rb
+1
-1
spec/models/environment_spec.rb
spec/models/environment_spec.rb
+1
-1
spec/support/prometheus/metric_builders.rb
spec/support/prometheus/metric_builders.rb
+1
-1
No files found.
app/models/environment.rb
View file @
ccf89acc
...
@@ -159,7 +159,7 @@ class Environment < ActiveRecord::Base
...
@@ -159,7 +159,7 @@ class Environment < ActiveRecord::Base
def
additional_metrics
def
additional_metrics
if
has_additional_metrics?
if
has_additional_metrics?
project
.
monitoring_service
.
reactive_query
(
Gitlab
::
Prometheus
::
Queries
::
AdditionalMetricsQuery
.
name
,
self
.
id
,
&
:itself
)
project
.
monitoring_service
.
reactive_query
(
Gitlab
::
Prometheus
::
Queries
::
AdditionalMetrics
Environment
Query
.
name
,
self
.
id
,
&
:itself
)
end
end
end
end
...
...
lib/gitlab/prometheus/additional_metrics_parser.rb
0 → 100644
View file @
ccf89acc
module
Gitlab
module
Prometheus
module
AdditionalMetricsParser
extend
self
def
load_groups_from_yaml
additional_metrics_raw
.
map
(
&
method
(
:new
))
end
private
def
metrics_from_list
(
list
)
list
.
map
{
|
entry
|
metric_from_entry
(
entry
)
}
end
def
metric_from_entry
(
entry
)
missing_fields
=
[
:title
,
:required_metrics
,
:weight
,
:queries
].
select
{
|
key
|
!
entry
.
has_key?
(
key
)
}
raise
ParsingError
.
new
(
"entry missing required fields
#{
missing_fields
}
"
)
unless
missing_fields
.
empty?
Metric
.
new
(
entry
[
:title
],
entry
[
:required_metrics
],
entry
[
:weight
],
entry
[
:y_label
],
entry
[
:queries
])
end
def
group_from_entry
(
entry
)
missing_fields
=
[
:group
,
:priority
,
:metrics
].
select
{
|
key
|
!
entry
.
has_key?
(
key
)
}
raise
ParsingError
.
new
(
"entry missing required fields
#{
missing_fields
}
"
)
unless
missing_fields
.
empty?
group
=
MetricGroup
.
new
(
entry
[
:group
],
entry
[
:priority
])
group
.
tap
{
|
g
|
g
.
metrics
=
Metric
.
metrics_from_list
(
entry
[
:metrics
])
}
end
def
additional_metrics_raw
@additional_metrics_raw
||=
YAML
.
load_file
(
Rails
.
root
.
join
(
'config/additional_metrics.yml'
))
&
.
map
(
&
:deep_symbolize_keys
).
freeze
end
end
end
end
lib/gitlab/prometheus/metric.rb
View file @
ccf89acc
module
Gitlab::Prometheus
module
Gitlab
class
Metric
module
Prometheus
attr_reader
:group
,
:title
,
:required_metrics
,
:weight
,
:y_label
,
:queries
class
Metric
attr_reader
:group
,
:title
,
:required_metrics
,
:weight
,
:y_label
,
:queries
def
initialize
(
title
,
required_metrics
,
weight
,
y_label
,
queries
=
[])
@title
=
title
def
initialize
(
title
,
required_metrics
,
weight
,
y_label
,
queries
=
[])
@required_metrics
=
required_metrics
@title
=
title
@weight
=
weight
@required_metrics
=
required_metrics
@y_label
=
y_label
||
'Values'
@weight
=
weight
@queries
=
queries
@y_label
=
y_label
||
'Values'
end
@queries
=
queries
end
def
self
.
metric_from_entry
(
entry
)
missing_fields
=
[
:title
,
:required_metrics
,
:weight
,
:queries
].
select
{
|
key
|
!
entry
.
has_key?
(
key
)
}
raise
ParsingError
.
new
(
"entry missing required fields
#{
missing_fields
}
"
)
unless
missing_fields
.
empty?
Metric
.
new
(
entry
[
:title
],
entry
[
:required_metrics
],
entry
[
:weight
],
entry
[
:y_label
],
entry
[
:queries
])
end
def
self
.
metrics_from_list
(
list
)
list
.
map
{
|
entry
|
metric_from_entry
(
entry
)
}
end
end
end
end
end
end
lib/gitlab/prometheus/metric_group.rb
View file @
ccf89acc
module
Gitlab::Prometheus
module
Gitlab
class
MetricGroup
module
Prometheus
attr_reader
:priority
,
:name
class
MetricGroup
attr_accessor
:metrics
attr_reader
:priority
,
:name
attr_accessor
:metrics
def
initialize
(
name
,
priority
,
metrics
=
[])
def
initialize
(
name
:,
priority
:,
metrics:
[])
@name
=
name
@name
=
name
@priority
=
priority
@priority
=
priority
@metrics
=
metrics
@metrics
=
metrics
end
end
def
self
.
all
load_groups_from_yaml
end
def
self
.
load_groups_from_yaml
additional_metrics_raw
.
map
(
&
method
(
:group_from_entry
))
end
def
self
.
group_from_entry
(
entry
)
missing_fields
=
[
:group
,
:priority
,
:metrics
].
select
{
|
key
|
!
entry
.
has_key?
(
key
)
}
raise
ParsingError
.
new
(
"entry missing required fields
#{
missing_fields
}
"
)
unless
missing_fields
.
empty?
group
=
MetricGroup
.
new
(
entry
[
:group
],
entry
[
:priority
])
group
.
metrics
=
Metric
.
metrics_from_list
(
entry
[
:metrics
])
group
end
def
self
.
additional_metrics_raw
def
self
.
all
@additional_metrics_raw
||=
YAML
.
load_file
(
Rails
.
root
.
join
(
'config/additional_metrics.yml'
))
&
.
map
(
&
:deep_symbolize_keys
).
freeze
AdditionalMetricsParser
.
load_groups_from_yaml
end
end
end
end
end
end
end
lib/gitlab/prometheus/parsing_error.rb
View file @
ccf89acc
module
Gitlab::Prometheus
module
Gitlab
ParsingError
=
Class
.
new
(
StandardError
)
module
Prometheus
ParsingError
=
Class
.
new
(
StandardError
)
end
end
end
lib/gitlab/prometheus/queries/additional_metrics_deployment_query.rb
View file @
ccf89acc
module
Gitlab::Prometheus::Queries
module
Gitlab
class
AdditionalMetricsDeploymentQuery
<
AdditionalMetricsQuery
module
Prometheus
def
query
(
deployment_id
)
module
Queries
deployment
=
Deployment
.
find_by
(
id:
deployment_id
)
class
AdditionalMetricsDeploymentQuery
<
BaseQuery
query_context
=
{
include
QueryAdditionalMetrics
environment_slug:
deployment
.
environment
.
slug
,
environment_filter:
%{container_name!="POD",environment="#{deployment.environment.slug}"}
,
timeframe_start:
(
deployment
.
created_at
-
30
.
minutes
).
to_f
,
timeframe_end:
(
deployment
.
created_at
+
30
.
minutes
).
to_f
}
query_metrics
(
query_context
)
def
query
(
deployment_id
)
deployment
=
Deployment
.
find_by
(
id:
deployment_id
)
query_context
=
{
environment_slug:
deployment
.
environment
.
slug
,
environment_filter:
%{container_name!="POD",environment="#{deployment.environment.slug}"}
,
timeframe_start:
(
deployment
.
created_at
-
30
.
minutes
).
to_f
,
timeframe_end:
(
deployment
.
created_at
+
30
.
minutes
).
to_f
}
query_metrics
(
query_context
)
end
end
end
end
end
end
end
end
lib/gitlab/prometheus/queries/additional_metrics_environment_query.rb
0 → 100644
View file @
ccf89acc
module
Gitlab
module
Prometheus
module
Queries
class
AdditionalMetricsEnvironmentQuery
<
BaseQuery
include
QueryAdditionalMetrics
def
query
(
environment_id
)
environment
=
Environment
.
find_by
(
id:
environment_id
)
query_context
=
{
environment_slug:
environment
.
slug
,
environment_filter:
%{container_name!="POD",environment="#{environment.slug}"}
,
timeframe_start:
8
.
hours
.
ago
.
to_f
,
timeframe_end:
Time
.
now
.
to_f
}
query_metrics
(
query_context
)
end
end
end
end
end
lib/gitlab/prometheus/queries/additional_metrics_query.rb
deleted
100644 → 0
View file @
c7a1da80
module
Gitlab::Prometheus::Queries
class
AdditionalMetricsQuery
<
BaseQuery
def
query
(
environment_id
)
environment
=
Environment
.
find_by
(
id:
environment_id
)
query_context
=
{
environment_slug:
environment
.
slug
,
environment_filter:
%{container_name!="POD",environment="#{environment.slug}"}
,
timeframe_start:
8
.
hours
.
ago
.
to_f
,
timeframe_end:
Time
.
now
.
to_f
}
query_metrics
(
query_context
)
end
protected
def
query_metrics
(
query_context
)
query_processor
=
method
(
:process_query
).
curry
[
query_context
]
groups
=
matched_metrics
.
map
do
|
group
|
metrics
=
group
.
metrics
.
map
do
|
metric
|
{
title:
metric
.
title
,
weight:
metric
.
weight
,
y_label:
metric
.
y_label
,
queries:
metric
.
queries
.
map
(
&
query_processor
).
select
(
&
method
(
:query_with_result
))
}
end
{
group:
group
.
name
,
priority:
group
.
priority
,
metrics:
metrics
.
select
(
&
method
(
:metric_with_any_queries
))
}
end
groups
.
select
(
&
method
(
:group_with_any_metrics
))
end
private
def
metric_with_any_queries
(
metric
)
metric
[
:queries
]
&
.
count
&
.
>
0
end
def
group_with_any_metrics
(
group
)
group
[
:metrics
]
&
.
count
&
.
>
0
end
def
query_with_result
(
query
)
query
[
:result
]
&
.
any?
do
|
item
|
item
&
.
[
](
:values
)
&
.
any?
||
item
&
.
[
](
:value
)
&
.
any?
end
end
def
process_query
(
context
,
query
)
query_with_result
=
query
.
dup
query_with_result
[
:result
]
=
if
query
.
has_key?
(
:query_range
)
client_query_range
(
query
[
:query_range
]
%
context
,
start:
context
[
:timeframe_start
],
stop:
context
[
:timeframe_end
])
else
client_query
(
query
[
:query
]
%
context
,
time:
context
[
:timeframe_end
])
end
query_with_result
end
def
available_metrics
@available_metrics
||=
client_label_values
||
[]
end
def
matched_metrics
result
=
Gitlab
::
Prometheus
::
MetricGroup
.
all
.
map
do
|
group
|
group
.
metrics
.
select!
do
|
metric
|
metric
.
required_metrics
.
all?
(
&
available_metrics
.
method
(
:include?
))
end
group
end
result
.
select
{
|
group
|
group
.
metrics
.
any?
}
end
end
end
lib/gitlab/prometheus/queries/deployment_query.rb
View file @
ccf89acc
module
Gitlab::Prometheus::Queries
module
Gitlab
class
DeploymentQuery
<
BaseQuery
module
Prometheus
def
query
(
deployment_id
)
module
Queries
deployment
=
Deployment
.
find_by
(
id:
deployment_id
)
class
DeploymentQuery
<
BaseQuery
environment_slug
=
deployment
.
environment
.
slug
def
query
(
deployment_id
)
deployment
=
Deployment
.
find_by
(
id:
deployment_id
)
environment_slug
=
deployment
.
environment
.
slug
memory_query
=
raw_memory_usage_query
(
environment_slug
)
memory_query
=
raw_memory_usage_query
(
environment_slug
)
memory_avg_query
=
%{avg(avg_over_time(container_memory_usage_bytes{container_name!="POD",environment="#{environment_slug}"}[30m]))}
memory_avg_query
=
%{avg(avg_over_time(container_memory_usage_bytes{container_name!="POD",environment="#{environment_slug}"}[30m]))}
cpu_query
=
raw_cpu_usage_query
(
environment_slug
)
cpu_query
=
raw_cpu_usage_query
(
environment_slug
)
cpu_avg_query
=
%{avg(rate(container_cpu_usage_seconds_total{container_name!="POD",environment="#{environment_slug}"}[30m])) * 100}
cpu_avg_query
=
%{avg(rate(container_cpu_usage_seconds_total{container_name!="POD",environment="#{environment_slug}"}[30m])) * 100}
timeframe_start
=
(
deployment
.
created_at
-
30
.
minutes
).
to_f
timeframe_start
=
(
deployment
.
created_at
-
30
.
minutes
).
to_f
timeframe_end
=
(
deployment
.
created_at
+
30
.
minutes
).
to_f
timeframe_end
=
(
deployment
.
created_at
+
30
.
minutes
).
to_f
{
{
memory_values:
client_query_range
(
memory_query
,
start:
timeframe_start
,
stop:
timeframe_end
),
memory_values:
client_query_range
(
memory_query
,
start:
timeframe_start
,
stop:
timeframe_end
),
memory_before:
client_query
(
memory_avg_query
,
time:
deployment
.
created_at
.
to_f
),
memory_before:
client_query
(
memory_avg_query
,
time:
deployment
.
created_at
.
to_f
),
memory_after:
client_query
(
memory_avg_query
,
time:
timeframe_end
),
memory_after:
client_query
(
memory_avg_query
,
time:
timeframe_end
),
cpu_values:
client_query_range
(
cpu_query
,
start:
timeframe_start
,
stop:
timeframe_end
),
cpu_values:
client_query_range
(
cpu_query
,
start:
timeframe_start
,
stop:
timeframe_end
),
cpu_before:
client_query
(
cpu_avg_query
,
time:
deployment
.
created_at
.
to_f
),
cpu_before:
client_query
(
cpu_avg_query
,
time:
deployment
.
created_at
.
to_f
),
cpu_after:
client_query
(
cpu_avg_query
,
time:
timeframe_end
)
cpu_after:
client_query
(
cpu_avg_query
,
time:
timeframe_end
)
}
}
end
end
end
end
end
end
end
end
lib/gitlab/prometheus/queries/environment_query.rb
View file @
ccf89acc
module
Gitlab::Prometheus::Queries
module
Gitlab
class
EnvironmentQuery
<
BaseQuery
module
Prometheus
def
query
(
environment_id
)
module
Queries
environment
=
Environment
.
find_by
(
id:
environment_id
)
class
EnvironmentQuery
<
BaseQuery
environment_slug
=
environment
.
slug
def
query
(
environment_id
)
timeframe_start
=
8
.
hours
.
ago
.
to_f
environment
=
Environment
.
find_by
(
id:
environment_id
)
timeframe_end
=
Time
.
now
.
to_f
environment_slug
=
environment
.
slug
timeframe_start
=
8
.
hours
.
ago
.
to_f
timeframe_end
=
Time
.
now
.
to_f
memory_query
=
raw_memory_usage_query
(
environment_slug
)
memory_query
=
raw_memory_usage_query
(
environment_slug
)
cpu_query
=
raw_cpu_usage_query
(
environment_slug
)
cpu_query
=
raw_cpu_usage_query
(
environment_slug
)
{
{
memory_values:
client_query_range
(
memory_query
,
start:
timeframe_start
,
stop:
timeframe_end
),
memory_values:
client_query_range
(
memory_query
,
start:
timeframe_start
,
stop:
timeframe_end
),
memory_current:
client_query
(
memory_query
,
time:
timeframe_end
),
memory_current:
client_query
(
memory_query
,
time:
timeframe_end
),
cpu_values:
client_query_range
(
cpu_query
,
start:
timeframe_start
,
stop:
timeframe_end
),
cpu_values:
client_query_range
(
cpu_query
,
start:
timeframe_start
,
stop:
timeframe_end
),
cpu_current:
client_query
(
cpu_query
,
time:
timeframe_end
)
cpu_current:
client_query
(
cpu_query
,
time:
timeframe_end
)
}
}
end
end
end
end
end
end
end
end
lib/gitlab/prometheus/queries/matched_metrics_query.rb
View file @
ccf89acc
module
Gitlab::Prometheus::Queries
module
Gitlab
class
MatchedMetricsQuery
<
BaseQuery
module
Prometheus
MAX_QUERY_ITEMS
=
40
.
freeze
module
Queries
class
MatchedMetricsQuery
<
BaseQuery
MAX_QUERY_ITEMS
=
40
.
freeze
def
query
def
query
groups_data
.
map
do
|
group
,
data
|
groups_data
.
map
do
|
group
,
data
|
{
{
group:
group
.
name
,
group:
group
.
name
,
priority:
group
.
priority
,
priority:
group
.
priority
,
active_metrics:
data
[
:active_metrics
],
active_metrics:
data
[
:active_metrics
],
metrics_missing_requirements:
data
[
:metrics_missing_requirements
]
metrics_missing_requirements:
data
[
:metrics_missing_requirements
]
}
}
end
end
end
end
private
private
def
groups_data
def
groups_data
metrics_groups
=
groups_with_active_metrics
(
Gitlab
::
Prometheus
::
MetricGroup
.
all
)
metrics_groups
=
groups_with_active_metrics
(
Gitlab
::
Prometheus
::
MetricGroup
.
all
)
lookup
=
active_series_lookup
(
metrics_groups
)
lookup
=
active_series_lookup
(
metrics_groups
)
groups
=
{}
groups
=
{}
metrics_groups
.
each
do
|
group
|
metrics_groups
.
each
do
|
group
|
groups
[
group
]
||=
{
active_metrics:
0
,
metrics_missing_requirements:
0
}
groups
[
group
]
||=
{
active_metrics:
0
,
metrics_missing_requirements:
0
}
active_metrics
=
group
.
metrics
.
count
{
|
metric
|
metric
.
required_metrics
.
all?
(
&
lookup
.
method
(
:has_key?
))
}
active_metrics
=
group
.
metrics
.
count
{
|
metric
|
metric
.
required_metrics
.
all?
(
&
lookup
.
method
(
:has_key?
))
}
groups
[
group
][
:active_metrics
]
+=
active_metrics
groups
[
group
][
:active_metrics
]
+=
active_metrics
groups
[
group
][
:metrics_missing_requirements
]
+=
group
.
metrics
.
count
-
active_metrics
groups
[
group
][
:metrics_missing_requirements
]
+=
group
.
metrics
.
count
-
active_metrics
end
end
groups
groups
end
end
def
active_series_lookup
(
metric_groups
)
def
active_series_lookup
(
metric_groups
)
timeframe_start
=
8
.
hours
.
ago
timeframe_start
=
8
.
hours
.
ago
timeframe_end
=
Time
.
now
timeframe_end
=
Time
.
now
series
=
metric_groups
.
flat_map
(
&
:metrics
).
flat_map
(
&
:required_metrics
).
uniq
series
=
metric_groups
.
flat_map
(
&
:metrics
).
flat_map
(
&
:required_metrics
).
uniq
lookup
=
series
.
each_slice
(
MAX_QUERY_ITEMS
).
flat_map
do
|
batched_series
|
lookup
=
series
.
each_slice
(
MAX_QUERY_ITEMS
).
flat_map
do
|
batched_series
|
client_series
(
*
batched_series
,
start:
timeframe_start
,
stop:
timeframe_end
)
client_series
(
*
batched_series
,
start:
timeframe_start
,
stop:
timeframe_end
)
.
select
(
&
method
(
:has_matching_label
))
.
select
(
&
method
(
:has_matching_label
))
.
map
{
|
series_info
|
[
series_info
[
'__name__'
],
true
]
}
.
map
{
|
series_info
|
[
series_info
[
'__name__'
],
true
]
}
end
end
lookup
.
to_h
lookup
.
to_h
end
end
def
has_matching_label
(
series_info
)
def
has_matching_label
(
series_info
)
series_info
.
key?
(
'environment'
)
series_info
.
key?
(
'environment'
)
end
end
def
available_metrics
def
available_metrics
@available_metrics
||=
client_label_values
||
[]
@available_metrics
||=
client_label_values
||
[]
end
end
def
filter_active_metrics
(
metric_group
)
def
filter_active_metrics
(
metric_group
)
metric_group
.
metrics
.
select!
do
|
metric
|
metric_group
.
metrics
.
select!
do
|
metric
|
metric
.
required_metrics
.
all?
(
&
available_metrics
.
method
(
:include?
))
metric
.
required_metrics
.
all?
(
&
available_metrics
.
method
(
:include?
))
end
end
metric_group
metric_group
end
end
def
groups_with_active_metrics
(
metric_groups
)
def
groups_with_active_metrics
(
metric_groups
)
metric_groups
.
map
(
&
method
(
:filter_active_metrics
)).
select
{
|
group
|
group
.
metrics
.
any?
}
metric_groups
.
map
(
&
method
(
:filter_active_metrics
)).
select
{
|
group
|
group
.
metrics
.
any?
}
end
end
def
metrics_with_required_series
(
metric_groups
)
def
metrics_with_required_series
(
metric_groups
)
metric_groups
.
flat_map
do
|
group
|
metric_groups
.
flat_map
do
|
group
|
group
.
metrics
.
select
do
|
metric
|
group
.
metrics
.
select
do
|
metric
|
metric
.
required_metrics
.
all?
(
&
available_metrics
.
method
(
:include?
))
metric
.
required_metrics
.
all?
(
&
available_metrics
.
method
(
:include?
))
end
end
end
end
end
end
end
end
...
...
lib/gitlab/prometheus/queries/query_additional_metrics.rb
0 → 100644
View file @
ccf89acc
module
Gitlab
module
Prometheus
module
Queries
module
QueryAdditionalMetrics
def
query_metrics
(
query_context
)
query_processor
=
method
(
:process_query
).
curry
[
query_context
]
groups
=
matched_metrics
.
map
do
|
group
|
metrics
=
group
.
metrics
.
map
do
|
metric
|
{
title:
metric
.
title
,
weight:
metric
.
weight
,
y_label:
metric
.
y_label
,
queries:
metric
.
queries
.
map
(
&
query_processor
).
select
(
&
method
(
:query_with_result
))
}
end
{
group:
group
.
name
,
priority:
group
.
priority
,
metrics:
metrics
.
select
(
&
method
(
:metric_with_any_queries
))
}
end
groups
.
select
(
&
method
(
:group_with_any_metrics
))
end
private
def
metric_with_any_queries
(
metric
)
metric
[
:queries
]
&
.
count
&
.
>
0
end
def
group_with_any_metrics
(
group
)
group
[
:metrics
]
&
.
count
&
.
>
0
end
def
query_with_result
(
query
)
query
[
:result
]
&
.
any?
do
|
item
|
item
&
.
[
](
:values
)
&
.
any?
||
item
&
.
[
](
:value
)
&
.
any?
end
end
def
process_query
(
context
,
query
)
query_with_result
=
query
.
dup
query_with_result
[
:result
]
=
if
query
.
has_key?
(
:query_range
)
client_query_range
(
query
[
:query_range
]
%
context
,
start:
context
[
:timeframe_start
],
stop:
context
[
:timeframe_end
])
else
client_query
(
query
[
:query
]
%
context
,
time:
context
[
:timeframe_end
])
end
query_with_result
end
def
available_metrics
@available_metrics
||=
client_label_values
||
[]
end
def
matched_metrics
result
=
Gitlab
::
Prometheus
::
MetricGroup
.
all
.
map
do
|
group
|
group
.
metrics
.
select!
do
|
metric
|
metric
.
required_metrics
.
all?
(
&
available_metrics
.
method
(
:include?
))
end
group
end
result
.
select
{
|
group
|
group
.
metrics
.
any?
}
end
end
end
end
end
spec/controllers/projects/prometheus_controller_spec.rb
View file @
ccf89acc
...
@@ -57,4 +57,4 @@ describe Projects::PrometheusController do
...
@@ -57,4 +57,4 @@ describe Projects::PrometheusController do
def
project_params
(
opts
=
{})
def
project_params
(
opts
=
{})
opts
.
reverse_merge
(
namespace_id:
project
.
namespace
,
project_id:
project
)
opts
.
reverse_merge
(
namespace_id:
project
.
namespace
,
project_id:
project
)
end
end
end
end
\ No newline at end of file
spec/lib/gitlab/prometheus/queries/additional_metrics_query_spec.rb
→
spec/lib/gitlab/prometheus/queries/additional_metrics_
environment_
query_spec.rb
View file @
ccf89acc
require
'spec_helper'
require
'spec_helper'
describe
Gitlab
::
Prometheus
::
Queries
::
AdditionalMetricsQuery
,
lib:
true
do
describe
Gitlab
::
Prometheus
::
Queries
::
AdditionalMetrics
Environment
Query
,
lib:
true
do
include
Prometheus
::
MetricBuilders
include
Prometheus
::
MetricBuilders
let
(
:client
)
{
double
(
'prometheus_client'
)
}
let
(
:client
)
{
double
(
'prometheus_client'
)
}
...
...
spec/models/environment_spec.rb
View file @
ccf89acc
...
@@ -453,7 +453,7 @@ describe Environment, models: true do
...
@@ -453,7 +453,7 @@ describe Environment, models: true do
it
'returns the additional metrics from the deployment service'
do
it
'returns the additional metrics from the deployment service'
do
expect
(
project
.
monitoring_service
).
to
receive
(
:reactive_query
)
expect
(
project
.
monitoring_service
).
to
receive
(
:reactive_query
)
.
with
(
Gitlab
::
Prometheus
::
Queries
::
AdditionalMetricsQuery
.
name
,
environment
.
id
)
.
with
(
Gitlab
::
Prometheus
::
Queries
::
AdditionalMetrics
Environment
Query
.
name
,
environment
.
id
)
.
and_return
(
:fake_metrics
)
.
and_return
(
:fake_metrics
)
is_expected
.
to
eq
(
:fake_metrics
)
is_expected
.
to
eq
(
:fake_metrics
)
...
...
spec/support/prometheus/metric_builders.rb
View file @
ccf89acc
...
@@ -21,7 +21,7 @@ module Prometheus
...
@@ -21,7 +21,7 @@ module Prometheus
end
end
def
simple_metric_group
(
name:
'name'
,
metrics:
simple_metrics
)
def
simple_metric_group
(
name:
'name'
,
metrics:
simple_metrics
)
Gitlab
::
Prometheus
::
MetricGroup
.
new
(
name
,
1
,
metrics
)
Gitlab
::
Prometheus
::
MetricGroup
.
new
(
name
:
name
,
priority:
1
,
metrics:
metrics
)
end
end
end
end
end
end
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment