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
5ef38663
Commit
5ef38663
authored
Dec 15, 2017
by
Pawel Chojnacki
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Create, index and delete metrics. Verify queries simple implementaiton
parent
16b03b5f
Changes
19
Hide whitespace changes
Inline
Side-by-side
Showing
19 changed files
with
209 additions
and
42 deletions
+209
-42
app/controllers/projects/prometheus/metrics_controller.rb
app/controllers/projects/prometheus/metrics_controller.rb
+63
-0
app/controllers/projects/prometheus_controller.rb
app/controllers/projects/prometheus_controller.rb
+0
-24
app/models/project.rb
app/models/project.rb
+2
-0
app/models/prometheus_metric.rb
app/models/prometheus_metric.rb
+6
-0
app/models/prometheus_query.rb
app/models/prometheus_query.rb
+0
-3
app/serializers/prometheus_metric_entity.rb
app/serializers/prometheus_metric_entity.rb
+10
-0
app/serializers/prometheus_metric_serializer.rb
app/serializers/prometheus_metric_serializer.rb
+3
-0
app/views/projects/prometheus/metrics/_form.html.haml
app/views/projects/prometheus/metrics/_form.html.haml
+30
-0
app/views/projects/prometheus/metrics/edit.html.haml
app/views/projects/prometheus/metrics/edit.html.haml
+5
-0
app/views/projects/prometheus/metrics/new.html.haml
app/views/projects/prometheus/metrics/new.html.haml
+9
-0
app/views/projects/prometheus/metrics/show.html.haml
app/views/projects/prometheus/metrics/show.html.haml
+0
-0
config/routes/project.rb
config/routes/project.rb
+1
-3
db/migrate/20171214160629_create_prometheus_metrics.rb
db/migrate/20171214160629_create_prometheus_metrics.rb
+2
-2
db/schema.rb
db/schema.rb
+15
-1
lib/gitlab/prometheus/query.rb
lib/gitlab/prometheus/query.rb
+2
-3
spec/controllers/projects/prometheus/metrics_controller_spec.rb
...ontrollers/projects/prometheus/metrics_controller_spec.rb
+42
-1
spec/factories/prometheus_metrics.rb
spec/factories/prometheus_metrics.rb
+10
-0
spec/models/prometheus_metric_spec.rb
spec/models/prometheus_metric_spec.rb
+9
-0
spec/models/prometheus_query_spec.rb
spec/models/prometheus_query_spec.rb
+0
-5
No files found.
app/controllers/projects/prometheus/metrics_controller.rb
View file @
5ef38663
...
...
@@ -18,8 +18,71 @@ module Projects
end
end
def
validate_query
respond_to
do
|
format
|
format
.
json
do
if
query_validation_params
[
:query
]
=~
/^avg/
render
json:
{
query_valid:
true
}
else
render
json:
{
query_valid:
false
}
end
end
end
end
def
new
@metric
=
project
.
prometheus_metrics
.
new
end
def
index
respond_to
do
|
format
|
format
.
json
do
metrics
=
project
.
prometheus_metrics
if
metrics
.
any?
render
json:
{
metrics:
PrometheusMetricSerializer
.
new
(
project:
project
).
represent
(
metrics
)
}
else
head
:no_content
end
end
end
end
def
create
@metric
=
project
.
prometheus_metrics
.
create
(
metrics_params
)
if
@metric
.
persisted?
redirect_to
edit_project_service_path
(
project
,
project
.
prometheus_service
),
notice:
'Metric was successfully added.'
else
head
:unprocessable_entity
end
end
def
update
@metric
=
project
.
prometheus_metrics
.
find
(
params
[
:id
])
@metric
.
update
(
metrics_params
)
if
@metric
.
persisted?
redirect_to
edit_project_service_path
(
project
,
project
.
prometheus_service
),
notice:
'Metric was successfully updated.'
else
render
"edit"
end
end
def
edit
@metric
=
project
.
prometheus_metrics
.
find
(
params
[
:id
])
end
private
def
query_validation_params
params
.
permit
(
:query
)
end
def
metrics_params
params
.
require
(
:prometheus_metric
).
permit
(
:title
,
:query
,
:y_label
,
:unit
,
:legend
)
end
def
require_prometheus_metrics!
render_404
unless
project
.
prometheus_service
.
present?
end
...
...
app/controllers/projects/prometheus_controller.rb
deleted
100644 → 0
View file @
16b03b5f
class
Projects::PrometheusController
<
Projects
::
ApplicationController
before_action
:authorize_read_project!
before_action
:require_prometheus_metrics!
def
active_metrics
respond_to
do
|
format
|
format
.
json
do
matched_metrics
=
project
.
prometheus_service
.
matched_metrics
||
{}
if
matched_metrics
.
any?
render
json:
matched_metrics
else
head
:no_content
end
end
end
end
private
def
require_prometheus_metrics!
render_404
unless
project
.
prometheus_service
.
present?
end
end
app/models/project.rb
View file @
5ef38663
...
...
@@ -196,6 +196,8 @@ class Project < ActiveRecord::Base
has_one
:cluster_project
,
class_name:
'Clusters::Project'
has_many
:clusters
,
through: :cluster_project
,
class_name:
'Clusters::Cluster'
has_many
:prometheus_metrics
# Container repositories need to remove data from the container registry,
# which is not managed by the DB. Hence we're still using dependent: :destroy
# here.
...
...
app/models/prometheus_metric.rb
0 → 100644
View file @
5ef38663
class
PrometheusMetric
<
ActiveRecord
::
Base
belongs_to
:project
,
required:
true
,
validate:
true
validates
:title
,
presence:
true
validates
:query
,
presence:
true
end
app/models/prometheus_query.rb
deleted
100644 → 0
View file @
16b03b5f
class
PrometheusQuery
<
ActiveRecord
::
Base
belongs_to
:project
end
app/serializers/prometheus_metric_entity.rb
0 → 100644
View file @
5ef38663
class
PrometheusMetricEntity
<
Grape
::
Entity
include
RequestAwareEntity
expose
:id
expose
:title
expose
:edit_path
do
|
prometheus_metric
|
edit_project_prometheus_metric_path
(
prometheus_metric
.
project
,
prometheus_metric
)
end
end
app/serializers/prometheus_metric_serializer.rb
0 → 100644
View file @
5ef38663
class
PrometheusMetricSerializer
<
BaseSerializer
entity
PrometheusMetricEntity
end
app/views/projects/prometheus/metrics/_form.html.haml
0 → 100644
View file @
5ef38663
.row.prepend-top-default.append-bottom-default
.col-lg-3
%h4
.prepend-top-0
Metric
%p
Metric allows you measuring stuff
=
succeed
"."
do
=
link_to
"Read more about queries"
,
help_page_path
(
"prometheus/custom_metrics"
)
=
form_for
[
@project
.
namespace
.
becomes
(
Namespace
),
@project
,
@metric
],
html:
{
class:
'col-lg-9'
}
do
|
f
|
=
form_errors
(
@metric
)
.form-group
=
f
.
label
:title
,
'Title'
,
class:
'label-light'
=
f
.
text_field
:title
,
required:
true
,
class:
'form-control'
.form-group
=
f
.
label
:query
,
'Query'
,
class:
'label-light'
=
f
.
text_field
:query
,
required:
true
,
class:
'form-control'
.form-group
=
f
.
label
:y_label
,
'Y label'
,
class:
'label-light'
=
f
.
text_field
:y_label
,
class:
'form-control'
.form-group
=
f
.
label
:unit
,
'Unit'
,
class:
'label-light'
=
f
.
text_field
:unit
,
class:
'form-control'
.form-group
=
f
.
label
:legend
,
'Legend'
,
class:
'label-light'
=
f
.
text_field
:legend
,
class:
'form-control'
.form-actions
=
f
.
submit
'Save'
,
class:
'btn btn-save'
=
link_to
'Cancel'
,
edit_project_service_path
(
@project
,
@project
.
prometheus_service
),
class:
'btn btn-cancel'
app/views/projects/prometheus/metrics/edit.html.haml
0 → 100644
View file @
5ef38663
-
breadcrumb_title
@metric
.
title
-
add_to_breadcrumbs
(
"Settings"
,
edit_project_path
(
@project
))
-
add_to_breadcrumbs
(
"Prometheus"
,
edit_project_service_path
(
@project
,
@project
.
prometheus_service
))
-
page_title
@metric
.
title
,
"Prometheus Metrics"
=
render
'form'
app/views/projects/prometheus/metrics/new.html.haml
0 → 100644
View file @
5ef38663
-
@no_container
=
true
-
breadcrumb_title
"Metrics"
-
page_title
'Metrics'
%div
{
class:
container_class
}
%h3
.page-title
New metric
%hr
=
render
'form'
app/views/projects/prometheus/metrics/show.html.haml
0 → 100644
View file @
5ef38663
config/routes/project.rb
View file @
5ef38663
...
...
@@ -73,12 +73,10 @@ constraints(ProjectUrlConstrainer.new) do
resource
:mattermost
,
only:
[
:new
,
:create
]
namespace
:prometheus
do
resources
:metrics
,
constraints:
{
id:
/[^\/]+/
},
only:
[
:index
,
:
show
,
:edit
,
:update
,
:destroy
]
do
resources
:metrics
,
constraints:
{
id:
/[^\/]+/
},
only:
[
:index
,
:
new
,
:create
,
:edit
,
:update
,
:destroy
]
do
post
:validate_query
,
on: :collection
get
:active
,
on: :collection
end
get
:active_metrics
end
resources
:deploy_keys
,
constraints:
{
id:
/\d+/
},
only:
[
:index
,
:new
,
:create
,
:edit
,
:update
]
do
...
...
db/migrate/2017121
3160629_create_prometheus_querie
s.rb
→
db/migrate/2017121
4160629_create_prometheus_metric
s.rb
View file @
5ef38663
class
CreatePrometheus
Querie
s
<
ActiveRecord
::
Migration
class
CreatePrometheus
Metric
s
<
ActiveRecord
::
Migration
def
change
create_table
:prometheus_
querie
s
do
|
t
|
create_table
:prometheus_
metric
s
do
|
t
|
t
.
references
:project
,
index:
true
,
foreign_key:
true
t
.
string
:title
t
.
string
:query
...
...
db/schema.rb
View file @
5ef38663
...
...
@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
ActiveRecord
::
Schema
.
define
(
version:
2017121
3160445
)
do
ActiveRecord
::
Schema
.
define
(
version:
2017121
4160629
)
do
# These are extensions that must be enabled in order to support this database
enable_extension
"plpgsql"
...
...
@@ -1874,6 +1874,19 @@ ActiveRecord::Schema.define(version: 20171213160445) do
add_index
"projects"
,
[
"star_count"
],
name:
"index_projects_on_star_count"
,
using: :btree
add_index
"projects"
,
[
"visibility_level"
],
name:
"index_projects_on_visibility_level"
,
using: :btree
create_table
"prometheus_metrics"
,
force: :cascade
do
|
t
|
t
.
integer
"project_id"
t
.
string
"title"
t
.
string
"query"
t
.
string
"y_label"
t
.
string
"unit"
t
.
string
"legend"
t
.
datetime
"created_at"
,
null:
false
t
.
datetime
"updated_at"
,
null:
false
end
add_index
"prometheus_metrics"
,
[
"project_id"
],
name:
"index_prometheus_metrics_on_project_id"
,
using: :btree
create_table
"protected_branch_merge_access_levels"
,
force: :cascade
do
|
t
|
t
.
integer
"protected_branch_id"
,
null:
false
t
.
integer
"access_level"
,
default:
40
...
...
@@ -2542,6 +2555,7 @@ ActiveRecord::Schema.define(version: 20171213160445) do
add_foreign_key
"project_import_data"
,
"projects"
,
name:
"fk_ffb9ee3a10"
,
on_delete: :cascade
add_foreign_key
"project_mirror_data"
,
"projects"
,
name:
"fk_d1aad367d7"
,
on_delete: :cascade
add_foreign_key
"project_statistics"
,
"projects"
,
on_delete: :cascade
add_foreign_key
"prometheus_metrics"
,
"projects"
add_foreign_key
"protected_branch_merge_access_levels"
,
"namespaces"
,
column:
"group_id"
,
name:
"fk_98f3d044fe"
,
on_delete: :cascade
add_foreign_key
"protected_branch_merge_access_levels"
,
"protected_branches"
,
name:
"fk_8a3072ccb3"
,
on_delete: :cascade
add_foreign_key
"protected_branch_merge_access_levels"
,
"users"
...
...
lib/gitlab/prometheus/query.rb
View file @
5ef38663
...
...
@@ -2,10 +2,9 @@ module Gitlab
module
Prometheus
class
Query
include
ActiveModel
::
Model
include
ActiveRecord
::
Base
attr_accessor
:unit
,
:series_dsl
,
:label
,
:type
,
track:
canary
# include ActiveRecord::Base
attr_accessor
:unit
,
:series_dsl
,
:label
,
:type
,
:track
validates
:title
,
:required_metrics
,
:weight
,
:y_label
,
:queries
,
presence:
true
...
...
spec/controllers/projects/prometheus/metrics_controller_spec.rb
View file @
5ef38663
require
(
'spec_helper'
)
require
'spec_helper'
describe
Projects
::
Prometheus
::
MetricsController
do
let
(
:user
)
{
create
(
:user
)
}
...
...
@@ -14,6 +14,24 @@ describe Projects::Prometheus::MetricsController do
sign_in
(
user
)
end
describe
'POST #validate_query'
do
context
'query is valid'
do
it
'confirms query is valid'
do
post
:validate_query
,
project_params
(
format: :json
,
query:
'avg(metric)'
)
expect
(
json_response
).
to
eq
(
"query_valid"
=>
true
)
end
end
context
'query is invalid'
do
it
'confirms query is valid'
do
post
:validate_query
,
project_params
(
format: :json
,
query:
'test(metric)'
)
expect
(
json_response
).
to
eq
(
"query_valid"
=>
false
)
end
end
end
describe
'GET #active'
do
context
'when prometheus metrics are enabled'
do
context
'when data is not present'
do
...
...
@@ -53,6 +71,29 @@ describe Projects::Prometheus::MetricsController do
end
end
describe
'POST #create'
do
context
'metric is valid'
do
let
(
:valid_metric
)
{
{
prometheus_metric:
{
title:
'title'
,
query:
'query'
}
}
}
it
'shows a success flash message'
do
post
:create
,
project_params
(
valid_metric
)
expect
(
flash
[
:notice
]).
to
include
(
'Metric was successfully added.'
)
expect
(
response
).
to
redirect_to
(
edit_namespace_project_service_path
(
project
.
namespace
,
project
,
project
.
prometheus_service
))
end
end
context
'metric is invalid'
do
let
(
:invalid_metric
)
{
{
prometheus_metric:
{
title:
'title'
}
}
}
it
'returns an error'
do
post
:create
,
project_params
(
invalid_metric
)
expect
(
response
).
to
have_gitlab_http_status
(
422
)
end
end
end
def
project_params
(
opts
=
{})
opts
.
reverse_merge
(
namespace_id:
project
.
namespace
,
project_id:
project
)
end
...
...
spec/factories/prometheus_metrics.rb
0 → 100644
View file @
5ef38663
FactoryGirl
.
define
do
factory
:prometheus_metric
,
class:
PrometheusMetric
do
title
'title'
query
'avg(metric)'
y_label
'y_label'
unit
'm/s'
legend
'legend'
project
nil
end
end
spec/models/prometheus_metric_spec.rb
0 → 100644
View file @
5ef38663
require
'spec_helper'
describe
PrometheusMetric
,
type: :model
do
subject
{
build
(
:prometheus_metric
)
}
it
{
is_expected
.
to
belong_to
(
:project
)
}
it
{
is_expected
.
to
validate_presence_of
(
:title
)
}
it
{
is_expected
.
to
validate_presence_of
(
:query
)
}
end
spec/models/prometheus_query_spec.rb
deleted
100644 → 0
View file @
16b03b5f
require
'rails_helper'
RSpec
.
describe
PrometheusQuery
,
type: :model
do
pending
"add some examples to (or delete)
#{
__FILE__
}
"
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