Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
李少辉-开发者
gitlab-foss
提交
a7b3f11e
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,体验更适合开发者的 AI 搜索 >>
提交
a7b3f11e
编写于
1月 30, 2018
作者:
T
Tiago Botelho
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Adds get all medians to Cycle Analytics model
上级
4371f845
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
102 addition
and
15 deletion
+102
-15
app/models/cycle_analytics.rb
app/models/cycle_analytics.rb
+6
-0
lib/gitlab/cycle_analytics/base_query.rb
lib/gitlab/cycle_analytics/base_query.rb
+6
-1
lib/gitlab/cycle_analytics/base_stage.rb
lib/gitlab/cycle_analytics/base_stage.rb
+4
-4
lib/gitlab/cycle_analytics/usage_data.rb
lib/gitlab/cycle_analytics/usage_data.rb
+64
-0
lib/gitlab/database/median.rb
lib/gitlab/database/median.rb
+15
-10
lib/gitlab/usage_data.rb
lib/gitlab/usage_data.rb
+7
-0
未找到文件。
app/models/cycle_analytics.rb
浏览文件 @
a7b3f11e
...
...
@@ -6,6 +6,12 @@ class CycleAnalytics
@options
=
options
end
def
self
.
all_medians_per_stage
(
projects
,
options
)
STAGES
.
each_with_object
({})
do
|
stage_name
,
hsh
|
hsh
[
stage_name
]
=
Gitlab
::
CycleAnalytics
::
Stage
[
stage_name
].
new
(
projects:
projects
,
options:
options
).
medians
&
.
values
||
[]
end
end
def
summary
@summary
||=
::
Gitlab
::
CycleAnalytics
::
StageSummary
.
new
(
@project
,
from:
@options
[
:from
],
...
...
lib/gitlab/cycle_analytics/base_query.rb
浏览文件 @
a7b3f11e
...
...
@@ -14,7 +14,7 @@ module Gitlab
def
stage_query
query
=
mr_closing_issues_table
.
join
(
issue_table
).
on
(
issue_table
[
:id
].
eq
(
mr_closing_issues_table
[
:issue_id
]))
.
join
(
issue_metrics_table
).
on
(
issue_table
[
:id
].
eq
(
issue_metrics_table
[
:issue_id
]))
.
where
(
issue_table
[
:project_id
].
eq
(
@project
.
id
))
# rubocop:disable Gitlab/ModuleWithInstanceVariables
.
where
(
issue_table
[
:project_id
].
in
(
project_ids
))
# rubocop:disable Gitlab/ModuleWithInstanceVariables
.
where
(
issue_table
[
:created_at
].
gteq
(
@options
[
:from
]))
# rubocop:disable Gitlab/ModuleWithInstanceVariables
# Load merge_requests
...
...
@@ -22,9 +22,14 @@ module Gitlab
.
on
(
mr_table
[
:id
].
eq
(
mr_closing_issues_table
[
:merge_request_id
]))
.
join
(
mr_metrics_table
)
.
on
(
mr_table
[
:id
].
eq
(
mr_metrics_table
[
:merge_request_id
]))
.
project
(
issue_table
[
:project_id
].
as
(
"project_id"
))
query
end
def
project_ids
@projects
.
map
(
&
:id
)
end
end
end
end
lib/gitlab/cycle_analytics/base_stage.rb
浏览文件 @
a7b3f11e
...
...
@@ -3,8 +3,8 @@ module Gitlab
class
BaseStage
include
BaseQuery
def
initialize
(
project
:,
options
:)
@project
=
project
def
initialize
(
project
s
:,
options
:)
@project
s
=
projects
@options
=
options
end
...
...
@@ -20,7 +20,7 @@ module Gitlab
raise
NotImplementedError
.
new
(
"Expected
#{
self
.
name
}
to implement title"
)
end
def
median
def
median
s
cte_table
=
Arel
::
Table
.
new
(
"cte_table_for_
#{
name
}
"
)
# Build a `SELECT` query. We find the first of the `end_time_attrs` that isn't `NULL` (call this end_time).
...
...
@@ -31,7 +31,7 @@ module Gitlab
cte_table
,
subtract_datetimes
(
base_query
.
dup
,
start_time_attrs
,
end_time_attrs
,
name
.
to_s
))
median_datetime
(
cte_table
,
interval_query
,
name
)
median_datetime
s
(
cte_table
,
interval_query
,
name
)
end
def
name
...
...
lib/gitlab/cycle_analytics/usage_data.rb
0 → 100644
浏览文件 @
a7b3f11e
module
Gitlab
module
CycleAnalytics
class
UsageData
PROJECTS_LIMIT
=
10
attr_reader
:projects
,
:options
def
initialize
(
projects
,
options
)
@projects
=
projects
@options
=
options
end
def
to_json
total
=
0
values
=
{}
medians_per_stage
.
each
do
|
stage_name
,
medians
|
medians
=
medians
.
compact
stage_values
=
{
average:
calc_average
(
medians
),
sd:
standard_deviation
(
medians
),
missing:
projects
.
length
-
medians
.
length
}
total
+=
stage_values
.
values
.
compact
.
sum
values
[
stage_name
]
=
stage_values
end
values
[
:total
]
=
total
{
avg_cycle_analytics:
values
}
end
private
def
medians_per_stage
@medians_per_stage
||=
::
CycleAnalytics
.
all_medians_per_stage
(
projects
,
options
)
end
def
calc_average
(
values
)
return
if
values
.
empty?
(
values
.
sum
/
values
.
length
).
to_i
end
def
sample_variance
(
values
)
return
0
if
values
.
length
<=
1
avg
=
calc_average
(
values
)
sum
=
values
.
inject
(
0
)
do
|
acc
,
val
|
acc
+
(
val
-
avg
)
**
2
end
sum
/
(
values
.
length
-
1
)
end
def
standard_deviation
(
values
)
Math
.
sqrt
(
sample_variance
(
values
)).
to_i
end
end
end
end
lib/gitlab/database/median.rb
浏览文件 @
a7b3f11e
...
...
@@ -2,7 +2,7 @@
module
Gitlab
module
Database
module
Median
def
median_datetime
(
arel_table
,
query_so_far
,
column_sym
)
def
median_datetime
s
(
arel_table
,
query_so_far
,
column_sym
)
median_queries
=
if
Gitlab
::
Database
.
postgresql?
pg_median_datetime_sql
(
arel_table
,
query_so_far
,
column_sym
)
...
...
@@ -13,16 +13,16 @@ module Gitlab
results
=
Array
.
wrap
(
median_queries
).
map
do
|
query
|
ActiveRecord
::
Base
.
connection
.
execute
(
query
)
end
extract_median
(
results
).
presence
extract_median
s
(
results
).
presence
end
def
extract_median
(
results
)
def
extract_median
s
(
results
)
result
=
results
.
compact
.
first
if
Gitlab
::
Database
.
postgresql?
result
=
result
.
first
.
presence
median
=
result
[
'median'
]
if
result
median
.
to_f
if
median
result
.
values
.
map
do
|
id
,
median
|
[
id
,
median
&
.
to_f
]
end
.
to_h
elsif
Gitlab
::
Database
.
mysql?
result
.
to_a
.
flatten
.
first
end
...
...
@@ -69,17 +69,20 @@ module Gitlab
cte_table
,
arel_table
.
project
(
arel_table
[
:project_id
],
arel_table
[
column_sym
].
as
(
column_sym
.
to_s
),
Arel
::
Nodes
::
Over
.
new
(
Arel
::
Nodes
::
NamedFunction
.
new
(
"row_number"
,
[]),
Arel
::
Nodes
::
Window
.
new
.
order
(
arel_table
[
column_sym
])).
as
(
'row_id'
),
arel_table
.
project
(
"COUNT(1)"
).
as
(
'ct'
))
.
Arel
::
Nodes
::
Over
.
new
(
Arel
::
Nodes
::
NamedFunction
.
new
(
"rank"
,
[]),
Arel
::
Nodes
::
Window
.
new
.
partition
(
arel_table
[
:project_id
])
.
order
(
arel_table
[
column_sym
])).
as
(
'row_id'
),
arel_table
.
from
(
arel_table
.
alias
).
project
(
"COUNT(*)"
).
where
(
arel_table
[
:project_id
].
eq
(
arel_table
.
alias
[
:project_id
])).
as
(
'ct'
))
.
# Disallow negative values
where
(
arel_table
[
column_sym
].
gteq
(
zero_interval
)))
# From the CTE, select either the middle row or the middle two rows (this is accomplished
# by 'where cte.row_id between cte.ct / 2.0 AND cte.ct / 2.0 + 1'). Find the average of the
# selected rows, and this is the median value.
cte_table
.
project
(
average
([
extract_epoch
(
cte_table
[
column_sym
])],
"median"
))
cte_table
.
project
(
cte_table
[
:project_id
])
.
project
(
average
([
extract_epoch
(
cte_table
[
column_sym
])],
"median"
))
.
where
(
Arel
::
Nodes
::
Between
.
new
(
cte_table
[
:row_id
],
...
...
@@ -90,6 +93,8 @@ module Gitlab
)
)
.
with
(
query_so_far
,
cte
)
.
group
(
cte_table
[
:project_id
])
.
order
(
cte_table
[
:project_id
])
.
to_sql
end
...
...
lib/gitlab/usage_data.rb
浏览文件 @
a7b3f11e
...
...
@@ -9,6 +9,7 @@ module Gitlab
license_usage_data
.
merge
(
system_usage_data
)
.
merge
(
features_usage_data
)
.
merge
(
components_usage_data
)
.
merge
(
cycle_analytics_usage_data
)
end
def
to_json
(
force_refresh:
false
)
...
...
@@ -71,6 +72,12 @@ module Gitlab
}
end
def
cycle_analytics_usage_data
projects
=
Project
.
sorted_by_activity
.
limit
(
Gitlab
::
CycleAnalytics
::
UsageData
::
PROJECTS_LIMIT
)
Gitlab
::
CycleAnalytics
::
UsageData
.
new
(
projects
,
{
from:
7
.
days
.
ago
}).
to_json
end
def
features_usage_data
features_usage_data_ce
end
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录