Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
gitlab-foss
提交
79d299f9
G
gitlab-foss
项目概览
李少辉-开发者
/
gitlab-foss
通知
15
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
G
gitlab-foss
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
79d299f9
编写于
4月 06, 2017
作者:
J
Jose Ivan Vargas Lopez
提交者:
Jacob Schatz
4月 06, 2017
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Introduced empty/error UX states to environments monitoring.
上级
d0e1354f
变更
10
隐藏空白更改
内联
并排
Showing
10 changed file
with
213 addition
and
36 deletion
+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
未找到文件。
app/assets/javascripts/monitoring/prometheus_graph.js
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
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
浏览文件 @
79d299f9
---
title
:
Introduced error/empty states for the environments performance metrics
merge_request
:
10271
author
:
spec/javascripts/fixtures/environments/metrics.html.haml
浏览文件 @
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
浏览文件 @
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
();
});
});
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录