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
0
Merge Requests
0
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
Boxiang Sun
gitlab-ce
Commits
79d299f9
Commit
79d299f9
authored
Apr 06, 2017
by
Jose Ivan Vargas Lopez
Committed by
Jacob Schatz
Apr 06, 2017
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Introduced empty/error UX states to environments monitoring.
parent
d0e1354f
Changes
10
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
213 additions
and
36 deletions
+213
-36
app/assets/javascripts/monitoring/prometheus_graph.js
app/assets/javascripts/monitoring/prometheus_graph.js
+51
-16
app/assets/stylesheets/pages/environments.scss
app/assets/stylesheets/pages/environments.scss
+9
-0
app/views/projects/environments/_metrics_button.html.haml
app/views/projects/environments/_metrics_button.html.haml
+1
-1
app/views/projects/environments/metrics.html.haml
app/views/projects/environments/metrics.html.haml
+66
-11
app/views/shared/empty_states/monitoring/_getting_started.svg
...views/shared/empty_states/monitoring/_getting_started.svg
+1
-0
app/views/shared/empty_states/monitoring/_loading.svg
app/views/shared/empty_states/monitoring/_loading.svg
+1
-0
app/views/shared/empty_states/monitoring/_unable_to_connect.svg
...ews/shared/empty_states/monitoring/_unable_to_connect.svg
+1
-0
changelogs/unreleased/add-error-empty-states.yml
changelogs/unreleased/add-error-empty-states.yml
+4
-0
spec/javascripts/fixtures/environments/metrics.html.haml
spec/javascripts/fixtures/environments/metrics.html.haml
+57
-7
spec/javascripts/monitoring/prometheus_graph_spec.js
spec/javascripts/monitoring/prometheus_graph_spec.js
+22
-1
No files found.
app/assets/javascripts/monitoring/prometheus_graph.js
View file @
79d299f9
...
...
@@ -6,7 +6,10 @@ import statusCodes from '~/lib/utils/http_status';
import
{
formatRelevantDigits
}
from
'
~/lib/utils/number_utils
'
;
import
'
../flash
'
;
const
prometheusContainer
=
'
.prometheus-container
'
;
const
prometheusParentGraphContainer
=
'
.prometheus-graphs
'
;
const
prometheusGraphsContainer
=
'
.prometheus-graph
'
;
const
prometheusStatesContainer
=
'
.prometheus-state
'
;
const
metricsEndpoint
=
'
metrics.json
'
;
const
timeFormat
=
d3
.
time
.
format
(
'
%H:%M
'
);
const
dayFormat
=
d3
.
time
.
format
(
'
%b %e, %a
'
);
...
...
@@ -14,19 +17,30 @@ const bisectDate = d3.bisector(d => d.time).left;
const
extraAddedWidthParent
=
100
;
class
PrometheusGraph
{
constructor
()
{
this
.
margin
=
{
top
:
80
,
right
:
180
,
bottom
:
80
,
left
:
100
};
this
.
marginLabelContainer
=
{
top
:
40
,
right
:
0
,
bottom
:
40
,
left
:
0
};
const
parentContainerWidth
=
$
(
prometheusGraphsContainer
).
parent
().
width
()
+
extraAddedWidthParent
;
this
.
originalWidth
=
parentContainerWidth
;
this
.
originalHeight
=
330
;
this
.
width
=
parentContainerWidth
-
this
.
margin
.
left
-
this
.
margin
.
right
;
this
.
height
=
this
.
originalHeight
-
this
.
margin
.
top
-
this
.
margin
.
bottom
;
this
.
backOffRequestCounter
=
0
;
this
.
configureGraph
();
this
.
init
();
const
$prometheusContainer
=
$
(
prometheusContainer
);
const
hasMetrics
=
$prometheusContainer
.
data
(
'
has-metrics
'
);
this
.
docLink
=
$prometheusContainer
.
data
(
'
doc-link
'
);
this
.
integrationLink
=
$prometheusContainer
.
data
(
'
prometheus-integration
'
);
$
(
document
).
ajaxError
(()
=>
{});
if
(
hasMetrics
)
{
this
.
margin
=
{
top
:
80
,
right
:
180
,
bottom
:
80
,
left
:
100
};
this
.
marginLabelContainer
=
{
top
:
40
,
right
:
0
,
bottom
:
40
,
left
:
0
};
const
parentContainerWidth
=
$
(
prometheusGraphsContainer
).
parent
().
width
()
+
extraAddedWidthParent
;
this
.
originalWidth
=
parentContainerWidth
;
this
.
originalHeight
=
330
;
this
.
width
=
parentContainerWidth
-
this
.
margin
.
left
-
this
.
margin
.
right
;
this
.
height
=
this
.
originalHeight
-
this
.
margin
.
top
-
this
.
margin
.
bottom
;
this
.
backOffRequestCounter
=
0
;
this
.
configureGraph
();
this
.
init
();
}
else
{
this
.
state
=
'
.js-getting-started
'
;
this
.
updateState
();
}
}
createGraph
()
{
...
...
@@ -40,8 +54,19 @@ class PrometheusGraph {
init
()
{
this
.
getData
().
then
((
metricsResponse
)
=>
{
if
(
Object
.
keys
(
metricsResponse
).
length
===
0
)
{
new
Flash
(
'
Empty metrics
'
,
'
alert
'
);
let
enoughData
=
true
;
Object
.
keys
(
metricsResponse
.
metrics
).
forEach
((
key
)
=>
{
let
currentKey
;
if
(
key
===
'
cpu_values
'
||
key
===
'
memory_values
'
)
{
currentKey
=
metricsResponse
.
metrics
[
key
];
if
(
Object
.
keys
(
currentKey
).
length
===
0
)
{
enoughData
=
false
;
}
}
});
if
(
!
enoughData
)
{
this
.
state
=
'
.js-loading
'
;
this
.
updateState
();
}
else
{
this
.
transformData
(
metricsResponse
);
this
.
createGraph
();
...
...
@@ -345,14 +370,17 @@ class PrometheusGraph {
}
return
resp
.
metrics
;
})
.
catch
(()
=>
new
Flash
(
'
An error occurred while fetching metrics.
'
,
'
alert
'
));
.
catch
(()
=>
{
this
.
state
=
'
.js-unable-to-connect
'
;
this
.
updateState
();
});
}
transformData
(
metricsResponse
)
{
Object
.
keys
(
metricsResponse
.
metrics
).
forEach
((
key
)
=>
{
if
(
key
===
'
cpu_values
'
||
key
===
'
memory_values
'
)
{
const
metricValues
=
(
metricsResponse
.
metrics
[
key
])[
0
];
if
(
typeof
metricValues
!==
'
undefined
'
)
{
if
(
metricValues
!==
undefined
)
{
this
.
graphSpecificProperties
[
key
].
data
=
metricValues
.
values
.
map
(
metric
=>
({
time
:
new
Date
(
metric
[
0
]
*
1000
),
value
:
metric
[
1
],
...
...
@@ -361,6 +389,13 @@ class PrometheusGraph {
}
});
}
updateState
()
{
const
$statesContainer
=
$
(
prometheusStatesContainer
);
$
(
prometheusParentGraphContainer
).
hide
();
$
(
`
${
this
.
state
}
`
,
$statesContainer
).
removeClass
(
'
hidden
'
);
$
(
prometheusStatesContainer
).
show
();
}
}
export
default
PrometheusGraph
;
app/assets/stylesheets/pages/environments.scss
View file @
79d299f9
...
...
@@ -233,6 +233,15 @@
stroke-width
:
1
;
}
.prometheus-state
{
margin-top
:
10px
;
display
:
none
;
.state-button-section
{
margin-top
:
10px
;
}
}
.environments-actions
{
.external-url
,
.monitoring-url
,
...
...
app/views/projects/environments/_metrics_button.html.haml
View file @
79d299f9
-
environment
=
local_assigns
.
fetch
(
:environment
)
-
return
unless
environment
.
has_metrics?
&&
can?
(
current_user
,
:read_environment
,
environment
)
-
return
unless
can?
(
current_user
,
:read_environment
,
environment
)
=
link_to
environment_metrics_path
(
environment
),
title:
'See metrics'
,
class:
'btn metrics-button'
do
=
icon
(
'area-chart'
)
...
...
app/views/projects/environments/metrics.html.haml
View file @
79d299f9
...
...
@@ -5,7 +5,7 @@
=
page_specific_javascript_bundle_tag
(
'monitoring'
)
=
render
"projects/pipelines/head"
%div
{
class:
container_class
}
.prometheus-container
{
class:
container_class
,
'data-has-metrics'
:
"#{@environment.has_metrics?}"
}
.top-area
.row
.col-sm-6
...
...
@@ -16,13 +16,68 @@
.col-sm-6
.nav-controls
=
render
'projects/deployments/actions'
,
deployment:
@environment
.
last_deployment
.row
.col-sm-12
%h4
CPU utilization
%svg
.prometheus-graph
{
'graph-type'
=>
'cpu_values'
}
.row
.col-sm-12
%h4
Memory usage
%svg
.prometheus-graph
{
'graph-type'
=>
'memory_values'
}
.prometheus-state
.js-getting-started.hidden
.row
.col-md-4.col-md-offset-4.state-svg
=
render
"shared/empty_states/monitoring/getting_started.svg"
.row
.col-md-6.col-md-offset-3
%h4
.text-center.state-title
Get started with performance monitoring
.row
.col-md-6.col-md-offset-3
.description-text.text-center.state-description
Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments.
=
link_to
help_page_path
(
'administration/monitoring/prometheus/index.md'
)
do
Learn more about performance monitoring
.row.state-button-section
.col-md-4.col-md-offset-4.text-center.state-button
=
link_to
edit_namespace_project_service_path
(
@project
.
namespace
,
@project
,
'prometheus'
),
class:
'btn btn-success'
do
Configure Prometheus
.js-loading.hidden
.row
.col-md-4.col-md-offset-4.state-svg
=
render
"shared/empty_states/monitoring/loading.svg"
.row
.col-md-6.col-md-offset-3
%h4
.text-center.state-title
Waiting for performance data
.row
.col-md-6.col-md-offset-3
.description-text.text-center.state-description
Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available.
.row.state-button-section
.col-md-4.col-md-offset-4.text-center.state-button
=
link_to
help_page_path
(
'administration/monitoring/prometheus/index.md'
),
class:
'btn btn-success'
do
View documentation
.js-unable-to-connect.hidden
.row
.col-md-4.col-md-offset-4.state-svg
=
render
"shared/empty_states/monitoring/unable_to_connect.svg"
.row
.col-md-6.col-md-offset-3
%h4
.text-center.state-title
Unable to connect to Prometheus server
.row
.col-md-6.col-md-offset-3
.description-text.text-center.state-description
Ensure connectivity is available from the GitLab server to the
=
link_to
edit_namespace_project_service_path
(
@project
.
namespace
,
@project
,
'prometheus'
)
do
Prometheus server
.row.state-button-section
.col-md-4.col-md-offset-4.text-center.state-button
=
link_to
help_page_path
(
'administration/monitoring/prometheus/index.md'
),
class
:'btn btn-success'
do
View documentation
.prometheus-graphs
.row
.col-sm-12
%h4
CPU utilization
%svg
.prometheus-graph
{
'graph-type'
=>
'cpu_values'
}
.row
.col-sm-12
%h4
Memory usage
%svg
.prometheus-graph
{
'graph-type'
=>
'memory_values'
}
app/views/shared/empty_states/monitoring/_getting_started.svg
0 → 100644
View file @
79d299f9
<svg
xmlns=
"http://www.w3.org/2000/svg"
viewBox=
"0 0 406 305"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
><defs><rect
id=
"0"
width=
"159.8"
height=
"127.81"
x=
".196"
y=
"5"
rx=
"10"
/><rect
id=
"2"
width=
"160"
height=
"128"
x=
".666"
y=
".41"
rx=
"10"
/><rect
id=
"4"
width=
"160.19"
height=
"128.19"
x=
".339"
y=
".59"
rx=
"10"
/><mask
id=
"1"
width=
"159.8"
height=
"127.81"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#0"
/></mask><mask
id=
"3"
width=
"160"
height=
"128"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#2"
/></mask><mask
id=
"5"
width=
"160.19"
height=
"128.19"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#4"
/></mask></defs><g
fill=
"none"
fill-rule=
"evenodd"
transform=
"translate(12 3)"
><rect
width=
"160"
height=
"128"
x=
"122.08"
y=
"146.08"
fill=
"#f9f9f9"
transform=
"matrix(.99619.08716-.08716.99619 19.08-16.813)"
rx=
"10"
/><g
transform=
"matrix(.96593.25882-.25882.96593 227.1 57.47)"
><rect
width=
"159.8"
height=
"127.81"
x=
"1.64"
y=
"10.06"
fill=
"#f9f9f9"
rx=
"8"
/><use
fill=
"#fff"
stroke=
"#eee"
stroke-width=
"8"
mask=
"url(#1)"
xlink:href=
"#0"
/><g
transform=
"translate(24.368 36.951)"
><path
fill=
"#d2caea"
fill-rule=
"nonzero"
d=
"m71.785 44.2c.761.296 1.625.099 2.184-.496l35.956-38.34c.756-.806.715-2.071-.091-2.827-.806-.756-2.071-.715-2.827.091l-35.03 37.36-41.888-16.285c-.749-.291-1.6-.106-2.16.471l-26.368 27.16c-.769.793-.751 2.059.042 2.828.793.769 2.059.751 2.828-.042l25.444-26.21 41.911 16.294"
/><g
fill=
"#fff"
><circle
cx=
"5.716"
cy=
"5.104"
r=
"5"
stroke=
"#6b4fbb"
stroke-width=
"4"
transform=
"translate(65.917 34.945)"
/><g
stroke=
"#fb722e"
><ellipse
cx=
"4.632"
cy=
"50.05"
stroke-width=
"3.2"
rx=
"4"
ry=
"3.999"
/><g
stroke-width=
"4"
><ellipse
cx=
"29.632"
cy=
"27.05"
rx=
"4"
ry=
"3.999"
/><ellipse
cx=
"107.63"
cy=
"4.048"
rx=
"4"
ry=
"3.999"
/></g></g></g></g></g><rect
width=
"160.19"
height=
"128.19"
x=
"36.28"
y=
"86.74"
fill=
"#f9f9f9"
transform=
"matrix(.99619-.08716.08716.99619-12.703 10.717)"
rx=
"10"
/><g
transform=
"matrix(.99619.08716-.08716.99619 126.61 137.8)"
><use
fill=
"#fff"
stroke=
"#eee"
stroke-width=
"8"
mask=
"url(#3)"
xlink:href=
"#2"
/><path
fill=
"#6b4fbb"
stroke=
"#6b4fbb"
stroke-width=
"3.2"
d=
"m84.67 28.41c18.225 0 33 15.07 33 33.651h-33v-33.651"
stroke-linecap=
"round"
stroke-linejoin=
"round"
/><path
fill=
"#d2caea"
fill-rule=
"nonzero"
d=
"m78.67 66.41h30c1.105 0 2 .895 2 2 0 18.778-15.222 34-34 34-18.778 0-34-15.222-34-34 0-18.778 15.222-34 34-34 1.105 0 2 .895 2 2v30m-32 2c0 16.569 13.431 30 30 30 15.896 0 28.905-12.364 29.934-28h-29.934c-1.105 0-2-.895-2-2v-29.934c-15.636 1.029-28 14.04-28 29.934"
/></g><g
transform=
"matrix(.99619-.08716.08716.99619 30 88.03)"
><use
fill=
"#fff"
stroke=
"#eee"
stroke-width=
"8"
mask=
"url(#5)"
xlink:href=
"#4"
/><g
transform=
"translate(42 34)"
><path
fill=
"#fef0ea"
d=
"m0 13.391c0-.768.628-1.391 1.4-1.391h9.2c.773 0 1.4.626 1.4 1.391v49.609h-12v-49.609"
/><path
fill=
"#fb722e"
d=
"m66 21.406c0-.777.628-1.406 1.4-1.406h9.2c.773 0 1.4.624 1.4 1.406v41.594h-12v-41.594"
/><path
fill=
"#6b4fbb"
d=
"m22 1.404c0-.776.628-1.404 1.4-1.404h9.2c.773 0 1.4.624 1.4 1.404v61.6h-12v-61.6"
/><path
fill=
"#d2caea"
d=
"m44 39.4c0-.772.628-1.398 1.4-1.398h9.2c.773 0 1.4.618 1.4 1.398v23.602h-12v-23.602"
/></g></g><g
fill=
"#fee8dc"
><path
d=
"m6.226 94.95l-2.84.631c-1.075.239-1.752-.445-1.515-1.515l.631-2.84-.631-2.84c-.239-1.075.445-1.752 1.515-1.515l2.84.631 2.84-.631c1.075-.239 1.752.445 1.515 1.515l-.631 2.84.631 2.84c.239 1.075-.445 1.752-1.515 1.515l-2.84-.631"
transform=
"matrix(.70711.70711-.70711.70711 66.33 22.317)"
/><path
d=
"m312.78 53.43l-3.634.807c-1.296.288-2.115-.52-1.825-1.825l.807-3.634-.807-3.634c-.288-1.296.52-2.115 1.825-1.825l3.634.807 3.634-.807c1.296-.288 2.115.52 1.825 1.825l-.807 3.634.807 3.634c.288 1.296-.52 2.115-1.825 1.825l-3.634-.807"
transform=
"matrix(.70711.70711-.70711.70711 126.1-206.88)"
/></g><path
fill=
"#e1dcf1"
d=
"m124.78 12.43l-3.617.804c-1.306.29-2.129-.53-1.839-1.839l.804-3.617-.804-3.617c-.29-1.306.53-2.129 1.839-1.839l3.617.804 3.617-.804c1.306-.29 2.129.53 1.839 1.839l-.804 3.617.804 3.617c.29 1.306-.53 2.129-1.839 1.839l-3.617-.804"
transform=
"matrix(.70711-.70711.70711.70711 31.05 90.51)"
/><path
fill=
"#d2caea"
d=
"m374.78 244.43l-3.617.804c-1.306.29-2.129-.53-1.839-1.839l.804-3.617-.804-3.617c-.29-1.306.53-2.129 1.839-1.839l3.617.804 3.617-.804c1.306-.29 2.129.53 1.839 1.839l-.804 3.617.804 3.617c.29 1.306-.53 2.129-1.839 1.839l-3.617-.804"
transform=
"matrix(.70711-.70711.70711.70711-59.779 335.24)"
/></g></svg>
\ No newline at end of file
app/views/shared/empty_states/monitoring/_loading.svg
0 → 100644
View file @
79d299f9
<svg
xmlns=
"http://www.w3.org/2000/svg"
viewBox=
"0 0 406 305"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
><defs><rect
id=
"C"
width=
"161"
height=
"100"
x=
"92"
y=
"181"
rx=
"10"
/><rect
id=
"E"
width=
"151"
height=
"32"
x=
"20"
rx=
"10"
/><rect
id=
"G"
width=
"191"
height=
"62"
y=
"10"
rx=
"10"
/><circle
id=
"I"
cx=
"23"
cy=
"41"
r=
"9"
/><circle
id=
"4"
cx=
"36.5"
cy=
"36.5"
r=
"36.5"
/><circle
id=
"8"
cx=
"262.5"
cy=
"169.5"
r=
"15.5"
/><circle
id=
"A"
cx=
"79.5"
cy=
"169.5"
r=
"15.5"
/><circle
id=
"K"
cx=
"45"
cy=
"41"
r=
"9"
/><circle
id=
"0"
cx=
"30.5"
cy=
"30.5"
r=
"30.5"
/><circle
id=
"2"
cx=
"18"
cy=
"34"
r=
"3"
/><ellipse
id=
"6"
cx=
"43.5"
cy=
"43.5"
rx=
"43.5"
ry=
"43.5"
/><mask
id=
"H"
width=
"191"
height=
"62"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#G"
/></mask><mask
id=
"J"
width=
"18"
height=
"18"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#I"
/></mask><mask
id=
"D"
width=
"161"
height=
"100"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#C"
/></mask><mask
id=
"F"
width=
"151"
height=
"32"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#E"
/></mask><mask
id=
"9"
width=
"31"
height=
"31"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#8"
/></mask><mask
id=
"1"
width=
"61"
height=
"61"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#0"
/></mask><mask
id=
"B"
width=
"31"
height=
"31"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#A"
/></mask><mask
id=
"3"
width=
"6"
height=
"6"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#2"
/></mask><mask
id=
"7"
width=
"87"
height=
"87"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#6"
/></mask><mask
id=
"L"
width=
"18"
height=
"18"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#K"
/></mask><mask
id=
"5"
width=
"73"
height=
"73"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#4"
/></mask></defs><g
fill=
"none"
fill-rule=
"evenodd"
transform=
"translate(28 2)"
><g
transform=
"translate(133 87)"
><use
fill=
"#fff"
stroke=
"#eee"
stroke-width=
"8"
mask=
"url(#1)"
xlink:href=
"#0"
/><path
stroke=
"#d2caea"
stroke-width=
"3"
stroke-linecap=
"round"
stroke-linejoin=
"round"
d=
"m19 32l2-9 5 17 4-12 4 5 6-10 3 5"
/><g
fill=
"#fff"
stroke=
"#fb722e"
><use
stroke-width=
"4"
mask=
"url(#3)"
xlink:href=
"#2"
/><circle
cx=
"44"
cy=
"30"
r=
"2"
stroke-width=
"2"
/></g></g><g
transform=
"translate(188 29)"
><circle
cx=
"36.5"
cy=
"41.5"
r=
"36.5"
fill=
"#f9f9f9"
/><use
fill=
"#fff"
stroke=
"#eee"
stroke-width=
"8"
mask=
"url(#5)"
xlink:href=
"#4"
/><rect
width=
"27"
height=
"4"
x=
"23"
y=
"27"
fill=
"#d2caea"
rx=
"2"
/><rect
width=
"10.5"
height=
"4"
x=
"23"
y=
"27"
fill=
"#6b4fbb"
rx=
"2"
/><rect
width=
"27"
height=
"4"
x=
"23"
y=
"36"
fill=
"#d2caea"
rx=
"2"
/><rect
width=
"19"
height=
"4"
x=
"23"
y=
"36"
fill=
"#6b4fbb"
rx=
"2"
/><rect
width=
"27"
height=
"4"
x=
"23"
y=
"45"
fill=
"#d2caea"
rx=
"2"
/><rect
width=
"7"
height=
"4"
x=
"23"
y=
"45"
fill=
"#6b4fbb"
rx=
"2"
/></g><path
fill=
"#eee"
fill-rule=
"nonzero"
d=
"m247 292v1c0 5.519-4.469 9.993-10.01 9.993h-125.99c-5.177 0-9.436-3.927-9.954-8.96 1.348.998 2.957 1.666 4.705 1.883 1.027 1.835 2.992 3.077 5.248 3.077h125.99c2.485 0 4.611-1.497 5.526-3.637 1.796-.675 3.347-1.852 4.48-3.359m1.947-8.962c-.518 5.03-4.774 8.958-9.95 8.958h-131.99c-4.929 0-9.03-3.563-9.851-8.25 1.382.767 2.964 1.216 4.649 1.248 1.037 1.794 2.978 3 5.202 3h131.99c2.255 0 4.219-1.241 5.245-3.076 1.748-.216 3.356-.883 4.705-1.882"
/><g
transform=
"translate(79)"
><ellipse
cx=
"43.5"
cy=
"47.5"
fill=
"#f9f9f9"
rx=
"43.5"
ry=
"43.5"
/><g
fill=
"#fff"
><g
stroke=
"#eee"
><use
stroke-width=
"8"
mask=
"url(#7)"
xlink:href=
"#6"
/><path
stroke-width=
"4"
d=
"m18.595 49c2.515 11.44 12.71 20 24.905 20 14.08 0 25.5-11.417 25.5-25.5 0-12.195-8.56-22.391-20-24.905v15.959c3 1.848 5 5.164 5 8.946 0 5.799-4.701 10.5-10.5 10.5-3.782 0-7.098-2-8.946-5h-15.959"
stroke-linejoin=
"round"
/></g><path
stroke=
"#d2caea"
stroke-width=
"4"
d=
"m18 44c-.003-.166-.005-.333-.005-.5 0-14.08 11.417-25.5 25.5-25.5.167 0 .334.002.5.005v15.01c-.166-.008-.332-.012-.5-.012-5.799 0-10.5 4.701-10.5 10.5 0 .168.004.334.012.5h-15.01"
stroke-linejoin=
"round"
/></g></g><g
fill=
"#fff"
stroke=
"#eee"
stroke-width=
"8"
><use
mask=
"url(#9)"
xlink:href=
"#8"
/><use
mask=
"url(#B)"
xlink:href=
"#A"
/><use
mask=
"url(#D)"
xlink:href=
"#C"
/></g><g
fill=
"#eee"
><rect
width=
"15"
height=
"2"
x=
"226"
y=
"247"
rx=
"1"
/><rect
width=
"15"
height=
"2"
x=
"226"
y=
"242"
rx=
"1"
/><rect
width=
"15"
height=
"2"
x=
"226"
y=
"252"
rx=
"1"
/></g><rect
width=
"10"
height=
"52"
x=
"118"
y=
"196"
fill=
"#d2caea"
rx=
"2"
/><rect
width=
"10"
height=
"47"
x=
"154"
y=
"196"
fill=
"#6b4fbb"
rx=
"2"
/><rect
width=
"10"
height=
"37"
x=
"190"
y=
"196"
fill=
"#d2caea"
rx=
"2"
/><g
fill=
"#fee8dc"
><rect
width=
"10"
height=
"52"
x=
"132"
y=
"185"
rx=
"2"
/><rect
width=
"10"
height=
"38"
x=
"168"
y=
"185"
rx=
"2"
/></g><rect
width=
"10"
height=
"58"
x=
"204"
y=
"185"
fill=
"#fb722e"
rx=
"2"
/><g
transform=
"translate(76 128)"
><g
fill=
"#fff"
stroke=
"#eee"
stroke-width=
"8"
><use
mask=
"url(#F)"
xlink:href=
"#E"
/><use
mask=
"url(#H)"
xlink:href=
"#G"
/></g><g
fill=
"#d2caea"
><rect
width=
"16"
height=
"4"
x=
"156"
y=
"35"
rx=
"2"
/><rect
width=
"16"
height=
"4"
x=
"156"
y=
"43"
rx=
"2"
/></g><g
fill=
"#fff"
stroke-width=
"8"
><use
stroke=
"#fee8dc"
mask=
"url(#J)"
xlink:href=
"#I"
/><use
stroke=
"#fb722e"
mask=
"url(#L)"
xlink:href=
"#K"
/></g></g><g
fill=
"#fb722e"
><path
d=
"m6.226 220.95l-2.84.631c-1.075.239-1.752-.445-1.515-1.515l.631-2.84-.631-2.84c-.239-1.075.445-1.752 1.515-1.515l2.84.631 2.84-.631c1.075-.239 1.752.445 1.515 1.515l-.631 2.84.631 2.84c.239 1.075-.445 1.752-1.515 1.515l-2.84-.631"
opacity=
".2"
transform=
"matrix(.70711.70711-.70711.70711 155.43 59.22)"
/><path
d=
"m256.23 9.95l-2.84.631c-1.075.239-1.752-.445-1.515-1.515l.631-2.84-.631-2.84c-.239-1.075.445-1.752 1.515-1.515l2.84.631 2.84-.631c1.075-.239 1.752.445 1.515 1.515l-.631 2.84.631 2.84c.239 1.075-.445 1.752-1.515 1.515l-2.84-.631"
opacity=
".2"
transform=
"matrix(.70711.70711-.70711.70711 79.45-179.36)"
/></g><path
fill=
"#fee8dc"
d=
"m312.78 150.43l-3.634.807c-1.296.288-2.115-.52-1.825-1.825l.807-3.634-.807-3.634c-.288-1.296.52-2.115 1.825-1.825l3.634.807 3.634-.807c1.296-.288 2.115.52 1.825 1.825l-.807 3.634.807 3.634c.288 1.296-.52 2.115-1.825 1.825l-3.634-.807"
transform=
"matrix(.70711.70711-.70711.70711 194.69-178.47)"
/><path
fill=
"#6b4fbb"
d=
"m43.778 80.43l-3.617.804c-1.306.29-2.129-.53-1.839-1.839l.804-3.617-.804-3.617c-.29-1.306.53-2.129 1.839-1.839l3.617.804 3.617-.804c1.306-.29 2.129.53 1.839 1.839l-.804 3.617.804 3.617c.29 1.306-.53 2.129-1.839 1.839l-3.617-.804"
opacity=
".2"
transform=
"matrix(.70711-.70711.70711.70711-40.761 53.15)"
/></g></svg>
\ No newline at end of file
app/views/shared/empty_states/monitoring/_unable_to_connect.svg
0 → 100644
View file @
79d299f9
<svg
xmlns=
"http://www.w3.org/2000/svg"
viewBox=
"0 0 406 305"
xmlns:xlink=
"http://www.w3.org/1999/xlink"
><defs><use
id=
"0"
xlink:href=
"#E"
/><use
id=
"2"
xlink:href=
"#E"
/><use
id=
"4"
xlink:href=
"#E"
/><path
id=
"6"
d=
"m74 93h26v47h-26z"
/><path
id=
"8"
d=
"m74 93h26v47h-26z"
/><rect
id=
"A"
width=
"65"
height=
"14"
x=
"55"
y=
"135"
rx=
"4"
/><rect
id=
"C"
width=
"175"
height=
"118"
rx=
"10"
/><rect
id=
"E"
width=
"159"
rx=
"10"
height=
"56"
/><rect
id=
"F"
width=
"160"
y=
"2"
rx=
"10"
height=
"56"
fill=
"#f9f9f9"
/><mask
id=
"B"
width=
"65"
height=
"14"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#A"
/></mask><mask
id=
"9"
width=
"26"
height=
"47"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#8"
/></mask><mask
id=
"D"
width=
"175"
height=
"118"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#C"
/></mask><mask
id=
"7"
width=
"26"
height=
"47"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#6"
/></mask><mask
id=
"3"
width=
"159"
height=
"56"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#2"
/></mask><mask
id=
"1"
width=
"159"
height=
"56"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#0"
/></mask><mask
id=
"5"
width=
"159"
height=
"56"
x=
"0"
y=
"0"
fill=
"#fff"
><use
xlink:href=
"#4"
/></mask></defs><g
fill=
"none"
fill-rule=
"evenodd"
transform=
"translate(1 65)"
><g
transform=
"translate(244)"
><use
xlink:href=
"#F"
/><use
fill=
"#fff"
stroke=
"#eee"
stroke-width=
"8"
mask=
"url(#1)"
xlink:href=
"#0"
/><g
fill-rule=
"nonzero"
><path
fill=
"#fb722e"
d=
"m134 31c1.105 0 2-.895 2-2 0-1.105-.895-2-2-2-1.105 0-2 .895-2 2 0 1.105.895 2 2 2m0 4c-3.314 0-6-2.686-6-6 0-3.314 2.686-6 6-6 3.314 0 6 2.686 6 6 0 3.314-2.686 6-6 6"
/><path
fill=
"#fee8dc"
d=
"m117 31c1.105 0 2-.895 2-2 0-1.105-.895-2-2-2-1.105 0-2 .895-2 2 0 1.105.895 2 2 2m0 4c-3.314 0-6-2.686-6-6 0-3.314 2.686-6 6-6 3.314 0 6 2.686 6 6 0 3.314-2.686 6-6 6m-17-4c1.105 0 2-.895 2-2 0-1.105-.895-2-2-2-1.105 0-2 .895-2 2 0 1.105.895 2 2 2m0 4c-3.314 0-6-2.686-6-6 0-3.314 2.686-6 6-6 3.314 0 6 2.686 6 6 0 3.314-2.686 6-6 6"
/></g><g
fill=
"#d2caea"
><rect
width=
"50"
height=
"4"
x=
"19"
y=
"20"
rx=
"2"
/><rect
width=
"50"
height=
"4"
x=
"19"
y=
"34"
rx=
"2"
/></g><g
transform=
"translate(0 59)"
><use
xlink:href=
"#F"
/><use
fill=
"#fff"
stroke=
"#eee"
stroke-width=
"8"
mask=
"url(#3)"
xlink:href=
"#2"
/><g
fill-rule=
"nonzero"
><path
fill=
"#fee8dc"
d=
"m134 30c1.105 0 2-.895 2-2 0-1.105-.895-2-2-2-1.105 0-2 .895-2 2 0 1.105.895 2 2 2m0 4c-3.314 0-6-2.686-6-6 0-3.314 2.686-6 6-6 3.314 0 6 2.686 6 6 0 3.314-2.686 6-6 6"
/><path
fill=
"#fb722e"
d=
"m117 30c1.105 0 2-.895 2-2 0-1.105-.895-2-2-2-1.105 0-2 .895-2 2 0 1.105.895 2 2 2m0 4c-3.314 0-6-2.686-6-6 0-3.314 2.686-6 6-6 3.314 0 6 2.686 6 6 0 3.314-2.686 6-6 6"
/><path
fill=
"#fee8dc"
d=
"m100 30c1.105 0 2-.895 2-2 0-1.105-.895-2-2-2-1.105 0-2 .895-2 2 0 1.105.895 2 2 2m0 4c-3.314 0-6-2.686-6-6 0-3.314 2.686-6 6-6 3.314 0 6 2.686 6 6 0 3.314-2.686 6-6 6"
/></g><rect
width=
"50"
height=
"4"
x=
"19"
y=
"19"
fill=
"#d2caea"
rx=
"2"
id=
"G"
/><rect
width=
"50"
height=
"4"
x=
"19"
y=
"33"
fill=
"#d2caea"
rx=
"2"
id=
"H"
/></g><g
transform=
"translate(0 118)"
><use
xlink:href=
"#F"
/><use
fill=
"#fff"
stroke=
"#eee"
stroke-width=
"8"
mask=
"url(#5)"
xlink:href=
"#4"
/><g
fill-rule=
"nonzero"
><path
fill=
"#fb722e"
d=
"m134 30c1.105 0 2-.895 2-2 0-1.105-.895-2-2-2-1.105 0-2 .895-2 2 0 1.105.895 2 2 2m0 4c-3.314 0-6-2.686-6-6 0-3.314 2.686-6 6-6 3.314 0 6 2.686 6 6 0 3.314-2.686 6-6 6"
/><path
fill=
"#fee8dc"
d=
"m117 30c1.105 0 2-.895 2-2 0-1.105-.895-2-2-2-1.105 0-2 .895-2 2 0 1.105.895 2 2 2m0 4c-3.314 0-6-2.686-6-6 0-3.314 2.686-6 6-6 3.314 0 6 2.686 6 6 0 3.314-2.686 6-6 6m-17-4c1.105 0 2-.895 2-2 0-1.105-.895-2-2-2-1.105 0-2 .895-2 2 0 1.105.895 2 2 2m0 4c-3.314 0-6-2.686-6-6 0-3.314 2.686-6 6-6 3.314 0 6 2.686 6 6 0 3.314-2.686 6-6 6"
/></g><use
xlink:href=
"#G"
/><use
xlink:href=
"#H"
/></g></g><g
transform=
"translate(163 55)"
><g
fill=
"#eee"
><rect
width=
"29"
height=
"4"
y=
"29"
rx=
"2"
/><rect
width=
"28"
height=
"4"
x=
"55"
y=
"29"
rx=
"2"
/></g><g
transform=
"translate(16)"
><circle
cx=
"30"
cy=
"30"
r=
"24"
fill=
"#fef0ea"
/><g
fill=
"#fb722e"
><circle
cx=
"30.5"
cy=
"30.5"
r=
"30.5"
opacity=
".1"
/><circle
cx=
"30.5"
cy=
"30.5"
r=
"19.5"
opacity=
".1"
/></g><circle
cx=
"30.5"
cy=
"30.5"
r=
"13.5"
fill=
"#fff"
/><path
fill=
"#fb722e"
d=
"m32.621 30.5l2.481-2.481c.586-.586.58-1.529-.006-2.115-.59-.59-1.533-.589-2.115-.006l-2.481 2.481-2.481-2.481c-.586-.586-1.529-.58-2.115.006-.59.59-.589 1.533-.006 2.115l2.481 2.481-2.481 2.481c-.586.586-.58 1.529.006 2.115.59.59 1.533.589 2.115.006l2.481-2.481 2.481 2.481c.586.586 1.529.58 2.115-.006.59-.59.589-1.533.006-2.115l-2.481-2.481"
/></g></g><g
transform=
"translate(0 13)"
><rect
width=
"65"
height=
"14"
x=
"55"
y=
"137"
fill=
"#f9f9f9"
rx=
"4"
/><use
fill=
"#fff"
stroke=
"#eee"
stroke-width=
"8"
mask=
"url(#7)"
xlink:href=
"#6"
/><rect
width=
"175"
height=
"118"
y=
"3"
fill=
"#f9f9f9"
rx=
"10"
/><g
fill=
"#fff"
stroke=
"#eee"
stroke-width=
"8"
><use
mask=
"url(#9)"
xlink:href=
"#8"
/><use
mask=
"url(#B)"
xlink:href=
"#A"
/><use
mask=
"url(#D)"
xlink:href=
"#C"
/></g><g
fill-rule=
"nonzero"
><path
fill=
"#eee"
d=
"m163 105v-93h-152v93h152m-156-93.01c0-2.204 1.797-3.99 3.995-3.99h152.01c2.206 0 3.995 1.796 3.995 3.99v93.02c0 2.204-1.797 3.99-3.995 3.99h-152.01c-2.206 0-3.995-1.796-3.995-3.99v-93.02"
/><path
fill=
"#d2caea"
d=
"m86 92c-11.598 0-21-9.402-21-21 0-11.598 9.402-21 21-21 11.598 0 21 9.402 21 21 0 11.598-9.402 21-21 21m0-4c9.389 0 17-7.611 17-17 0-9.389-7.611-17-17-17-9.389 0-17 7.611-17 17 0 9.389 7.611 17 17 17"
/></g><path
fill=
"#6b4fbb"
d=
"m83 63c0-1.659 1.347-3 3-3 1.657 0 3 1.342 3 3v7.993c0 1.659-1.347 3-3 3-1.657 0-3-1.342-3-3v-7.993m3 18.997c-1.657 0-3-1.343-3-3 0-1.657 1.343-3 3-3 1.657 0 3 1.343 3 3 0 1.657-1.343 3-3 3"
/><g
fill=
"#eee"
><rect
width=
"134"
height=
"4"
x=
"20"
y=
"30"
rx=
"2"
/><rect
width=
"14"
height=
"4"
x=
"20"
y=
"20"
rx=
"2"
/><circle
cx=
"87"
cy=
"21"
r=
"5"
/></g></g></g></svg>
\ No newline at end of file
changelogs/unreleased/add-error-empty-states.yml
0 → 100644
View file @
79d299f9
---
title
:
Introduced error/empty states for the environments performance metrics
merge_request
:
10271
author
:
spec/javascripts/fixtures/environments/metrics.html.haml
View file @
79d299f9
%div
.prometheus-container
{
'data-has-metrics'
:
"false"
,
'data-doc-link'
:
'/help/administration/monitoring/prometheus/index.md'
,
'data-prometheus-integration'
:
'/root/hello-prometheus/services/prometheus/edit'
}
.top-area
.row
.col-sm-6
%h3
.page-title
Metrics for environment
.row
.col-sm-12
%svg
.prometheus-graph
{
'graph-type'
=>
'cpu_values'
}
.row
.col-sm-12
%svg
.prometheus-graph
{
'graph-type'
=>
'memory_values'
}
\ No newline at end of file
.prometheus-state
.js-getting-started.hidden
.row
.col-md-4.col-md-offset-4.state-svg
%svg
.row
.col-md-6.col-md-offset-3
%h4
.text-center.state-title
Get started with performance monitoring
.row
.col-md-6.col-md-offset-3
.description-text.text-center.state-description
Stay updated about the performance and health of your environment by configuring Prometheus to monitor your deployments. Learn more about performance monitoring
.row.state-button-section
.col-md-4.col-md-offset-4.text-center.state-button
%a
.btn.btn-success
Configure Prometheus
.js-loading.hidden
.row
.col-md-4.col-md-offset-4.state-svg
%svg
.row
.col-md-6.col-md-offset-3
%h4
.text-center.state-title
Waiting for performance data
.row
.col-md-6.col-md-offset-3
.description-text.text-center.state-description
Creating graphs uses the data from the Prometheus server. If this takes a long time, ensure that data is available.
.row.state-button-section
.col-md-4.col-md-offset-4.text-center.state-button
%a
.btn.btn-success
View documentation
.js-unable-to-connect.hidden
.row
.col-md-4.col-md-offset-4.state-svg
%svg
.row
.col-md-6.col-md-offset-3
%h4
.text-center.state-title
Unable to connect to Prometheus server
.row
.col-md-6.col-md-offset-3
.description-text.text-center.state-description
Ensure connectivity is available from the GitLab server to the Prometheus server
.row.state-button-section
.col-md-4.col-md-offset-4.text-center.state-button
%a
.btn.btn-success
View documentation
.prometheus-graphs
.row
.col-sm-12
%svg
.prometheus-graph
{
'graph-type'
=>
'cpu_values'
}
.row
.col-sm-12
%svg
.prometheus-graph
{
'graph-type'
=>
'memory_values'
}
spec/javascripts/monitoring/prometheus_graph_spec.js
View file @
79d299f9
import
'
jquery
'
;
import
'
~/lib/utils/common_utils
'
;
import
PrometheusGraph
from
'
~/monitoring/prometheus_graph
'
;
import
{
prometheusMockData
}
from
'
./prometheus_mock_data
'
;
...
...
@@ -12,6 +11,7 @@ describe('PrometheusGraph', () => {
beforeEach
(()
=>
{
loadFixtures
(
fixtureName
);
$
(
'
.prometheus-container
'
).
data
(
'
has-metrics
'
,
'
true
'
);
this
.
prometheusGraph
=
new
PrometheusGraph
();
const
self
=
this
;
const
fakeInit
=
(
metricsResponse
)
=>
{
...
...
@@ -75,3 +75,24 @@ describe('PrometheusGraph', () => {
});
});
});
describe
(
'
PrometheusGraphs UX states
'
,
()
=>
{
const
fixtureName
=
'
static/environments/metrics.html.raw
'
;
preloadFixtures
(
fixtureName
);
beforeEach
(()
=>
{
loadFixtures
(
fixtureName
);
this
.
prometheusGraph
=
new
PrometheusGraph
();
});
it
(
'
shows a specified state
'
,
()
=>
{
this
.
prometheusGraph
.
state
=
'
.js-getting-started
'
;
this
.
prometheusGraph
.
updateState
();
const
$state
=
$
(
'
.js-getting-started
'
);
expect
(
$state
).
toBeDefined
();
expect
(
$
(
'
.state-title
'
,
$state
)).
toBeDefined
();
expect
(
$
(
'
.state-svg
'
,
$state
)).
toBeDefined
();
expect
(
$
(
'
.state-description
'
,
$state
)).
toBeDefined
();
expect
(
$
(
'
.state-button
'
,
$state
)).
toBeDefined
();
});
});
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