summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/assets/javascripts/main.js2
-rw-r--r--app/assets/javascripts/privacy_policy_update_callout.js8
-rw-r--r--app/views/layouts/_page.html.haml2
-rw-r--r--changelogs/unreleased/an-sidekiq-records-failure-durations.yml5
-rw-r--r--changelogs/unreleased/sort-vulnerabilities-for-pipeline-dashboard.yml5
-rw-r--r--config/sidekiq_queues.yml1
-rw-r--r--db/migrate/20190703171157_add_sourcing_epic_dates.rb10
-rw-r--r--db/migrate/20190703171555_add_sourcing_epic_dates_fks.rb25
-rw-r--r--db/schema.rb6
-rw-r--r--doc/api/epic_links.md32
-rw-r--r--doc/api/epics.md40
-rw-r--r--doc/development/api_graphql_styleguide.md17
-rw-r--r--doc/user/group/epics/index.md38
-rw-r--r--doc/user/group/roadmap/index.md2
-rw-r--r--lib/gitlab/sidekiq_middleware/metrics.rb32
-rw-r--r--lib/gitlab/sql/union.rb2
-rw-r--r--locale/gitlab.pot9
-rw-r--r--spec/controllers/application_controller_spec.rb20
-rw-r--r--spec/lib/gitlab/sidekiq_middleware/metrics_spec.rb20
-rw-r--r--spec/lib/gitlab/sql/recursive_cte_spec.rb2
-rw-r--r--spec/lib/gitlab/sql/union_spec.rb4
-rw-r--r--spec/migrations/schedule_fix_gitlab_com_pages_access_level_spec.rb2
-rw-r--r--spec/models/concerns/from_union_spec.rb6
23 files changed, 188 insertions, 102 deletions
diff --git a/app/assets/javascripts/main.js b/app/assets/javascripts/main.js
index c19a845eb69..007eecdd293 100644
--- a/app/assets/javascripts/main.js
+++ b/app/assets/javascripts/main.js
@@ -37,7 +37,6 @@ import GlFieldErrors from './gl_field_errors';
import initUserPopovers from './user_popovers';
import { initUserTracking } from './tracking';
import { __ } from './locale';
-import initPrivacyPolicyUpdateCallout from './privacy_policy_update_callout';
import 'ee_else_ce/main_ee';
@@ -97,7 +96,6 @@ function deferredInitialisation() {
initUsagePingConsent();
initUserPopovers();
initUserTracking();
- initPrivacyPolicyUpdateCallout();
if (document.querySelector('.search')) initSearchAutocomplete();
diff --git a/app/assets/javascripts/privacy_policy_update_callout.js b/app/assets/javascripts/privacy_policy_update_callout.js
deleted file mode 100644
index 97f41deb30f..00000000000
--- a/app/assets/javascripts/privacy_policy_update_callout.js
+++ /dev/null
@@ -1,8 +0,0 @@
-import PersistentUserCallout from '~/persistent_user_callout';
-
-function initPrivacyPolicyUpdateCallout() {
- const callout = document.querySelector('.js-privacy-policy-update');
- PersistentUserCallout.factory(callout);
-}
-
-export default initPrivacyPolicyUpdateCallout;
diff --git a/app/views/layouts/_page.html.haml b/app/views/layouts/_page.html.haml
index 6cdb85456c3..443a73f5cce 100644
--- a/app/views/layouts/_page.html.haml
+++ b/app/views/layouts/_page.html.haml
@@ -17,6 +17,4 @@
%div{ class: "#{(container_class unless @no_container)} #{@content_class}" }
.content{ id: "content-body" }
= render "layouts/flash", extra_flash_class: 'limit-container-width'
- - if Gitlab.com?
- = render_if_exists "layouts/privacy_policy_update_callout"
= yield
diff --git a/changelogs/unreleased/an-sidekiq-records-failure-durations.yml b/changelogs/unreleased/an-sidekiq-records-failure-durations.yml
new file mode 100644
index 00000000000..bbb0b230c6b
--- /dev/null
+++ b/changelogs/unreleased/an-sidekiq-records-failure-durations.yml
@@ -0,0 +1,5 @@
+---
+title: Record latencies for Sidekiq failures
+merge_request: 18909
+author:
+type: performance
diff --git a/changelogs/unreleased/sort-vulnerabilities-for-pipeline-dashboard.yml b/changelogs/unreleased/sort-vulnerabilities-for-pipeline-dashboard.yml
new file mode 100644
index 00000000000..ffbfc652b81
--- /dev/null
+++ b/changelogs/unreleased/sort-vulnerabilities-for-pipeline-dashboard.yml
@@ -0,0 +1,5 @@
+---
+title: Pipeline vulnerability dashboard sort vulnerabilities by severity then confidence
+merge_request: 18863
+author:
+type: fixed
diff --git a/config/sidekiq_queues.yml b/config/sidekiq_queues.yml
index b97e8ad67c9..de396ea1f32 100644
--- a/config/sidekiq_queues.yml
+++ b/config/sidekiq_queues.yml
@@ -120,3 +120,4 @@
- [update_external_pull_requests, 3]
- [refresh_license_compliance_checks, 2]
- [design_management_new_version, 1]
+ - [epics, 2]
diff --git a/db/migrate/20190703171157_add_sourcing_epic_dates.rb b/db/migrate/20190703171157_add_sourcing_epic_dates.rb
new file mode 100644
index 00000000000..202e2098d5b
--- /dev/null
+++ b/db/migrate/20190703171157_add_sourcing_epic_dates.rb
@@ -0,0 +1,10 @@
+# frozen_string_literal: true
+
+class AddSourcingEpicDates < ActiveRecord::Migration[5.1]
+ DOWNTIME = false
+
+ def change
+ add_column :epics, :start_date_sourcing_epic_id, :integer
+ add_column :epics, :due_date_sourcing_epic_id, :integer
+ end
+end
diff --git a/db/migrate/20190703171555_add_sourcing_epic_dates_fks.rb b/db/migrate/20190703171555_add_sourcing_epic_dates_fks.rb
new file mode 100644
index 00000000000..4995a3cd03f
--- /dev/null
+++ b/db/migrate/20190703171555_add_sourcing_epic_dates_fks.rb
@@ -0,0 +1,25 @@
+# frozen_string_literal: true
+
+class AddSourcingEpicDatesFks < ActiveRecord::Migration[5.1]
+ include Gitlab::Database::MigrationHelpers
+
+ DOWNTIME = false
+
+ disable_ddl_transaction!
+
+ def up
+ add_concurrent_index :epics, :start_date_sourcing_epic_id, where: 'start_date_sourcing_epic_id is not null'
+ add_concurrent_index :epics, :due_date_sourcing_epic_id, where: 'due_date_sourcing_epic_id is not null'
+
+ add_concurrent_foreign_key :epics, :epics, column: :start_date_sourcing_epic_id, on_delete: :nullify
+ add_concurrent_foreign_key :epics, :epics, column: :due_date_sourcing_epic_id, on_delete: :nullify
+ end
+
+ def down
+ remove_foreign_key_if_exists :epics, column: :start_date_sourcing_epic_id
+ remove_foreign_key_if_exists :epics, column: :due_date_sourcing_epic_id
+
+ remove_concurrent_index :epics, :start_date_sourcing_epic_id
+ remove_concurrent_index :epics, :due_date_sourcing_epic_id
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 1ea6f418759..237f5ab4732 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -1423,15 +1423,19 @@ ActiveRecord::Schema.define(version: 2019_10_17_045817) do
t.integer "parent_id"
t.integer "relative_position"
t.integer "state_id", limit: 2, default: 1, null: false
+ t.integer "start_date_sourcing_epic_id"
+ t.integer "due_date_sourcing_epic_id"
t.index ["assignee_id"], name: "index_epics_on_assignee_id"
t.index ["author_id"], name: "index_epics_on_author_id"
t.index ["closed_by_id"], name: "index_epics_on_closed_by_id"
+ t.index ["due_date_sourcing_epic_id"], name: "index_epics_on_due_date_sourcing_epic_id", where: "(due_date_sourcing_epic_id IS NOT NULL)"
t.index ["end_date"], name: "index_epics_on_end_date"
t.index ["group_id"], name: "index_epics_on_group_id"
t.index ["iid"], name: "index_epics_on_iid"
t.index ["milestone_id"], name: "index_milestone"
t.index ["parent_id"], name: "index_epics_on_parent_id"
t.index ["start_date"], name: "index_epics_on_start_date"
+ t.index ["start_date_sourcing_epic_id"], name: "index_epics_on_start_date_sourcing_epic_id", where: "(start_date_sourcing_epic_id IS NOT NULL)"
end
create_table "events", id: :serial, force: :cascade do |t|
@@ -4158,7 +4162,9 @@ ActiveRecord::Schema.define(version: 2019_10_17_045817) do
add_foreign_key "epic_issues", "epics", on_delete: :cascade
add_foreign_key "epic_issues", "issues", on_delete: :cascade
add_foreign_key "epic_metrics", "epics", on_delete: :cascade
+ add_foreign_key "epics", "epics", column: "due_date_sourcing_epic_id", name: "fk_013c9f36ca", on_delete: :nullify
add_foreign_key "epics", "epics", column: "parent_id", name: "fk_25b99c1be3", on_delete: :cascade
+ add_foreign_key "epics", "epics", column: "start_date_sourcing_epic_id", name: "fk_9d480c64b2", on_delete: :nullify
add_foreign_key "epics", "milestones", on_delete: :nullify
add_foreign_key "epics", "namespaces", column: "group_id", name: "fk_f081aa4489", on_delete: :cascade
add_foreign_key "epics", "users", column: "assignee_id", name: "fk_dccd3f98fc", on_delete: :nullify
diff --git a/doc/api/epic_links.md b/doc/api/epic_links.md
index 665c902355f..e81dc88da81 100644
--- a/doc/api/epic_links.md
+++ b/doc/api/epic_links.md
@@ -50,12 +50,14 @@ Example response:
"start_date": null,
"start_date_is_fixed": false,
"start_date_fixed": null,
- "start_date_from_milestones": null,
- "end_date": "2018-07-31",
+ "start_date_from_milestones": null, //deprecated in favor of start_date_from_inherited_source
+ "start_date_from_inherited_source": null,
+ "end_date": "2018-07-31", //deprecated in favor of due_date
"due_date": "2018-07-31",
"due_date_is_fixed": false,
"due_date_fixed": null,
- "due_date_from_milestones": "2018-07-31",
+ "due_date_from_milestones": "2018-07-31", //deprecated in favor of start_date_from_inherited_source
+ "due_date_from_inherited_source": "2018-07-31",
"created_at": "2018-07-17T13:36:22.770Z",
"updated_at": "2018-07-18T12:22:05.239Z",
"labels": []
@@ -102,12 +104,14 @@ Example response:
"start_date": null,
"start_date_is_fixed": false,
"start_date_fixed": null,
- "start_date_from_milestones": null,
- "end_date": "2018-07-31",
+ "start_date_from_milestones": null, //deprecated in favor of start_date_from_inherited_source
+ "start_date_from_inherited_source": null,
+ "end_date": "2018-07-31", //deprecated in favor of due_date
"due_date": "2018-07-31",
"due_date_is_fixed": false,
"due_date_fixed": null,
- "due_date_from_milestones": "2018-07-31",
+ "due_date_from_milestones": "2018-07-31", //deprecated in favor of start_date_from_inherited_source
+ "due_date_from_inherited_source": "2018-07-31",
"created_at": "2018-07-17T13:36:22.770Z",
"updated_at": "2018-07-18T12:22:05.239Z",
"labels": []
@@ -189,12 +193,14 @@ Example response:
"start_date": null,
"start_date_is_fixed": false,
"start_date_fixed": null,
- "start_date_from_milestones": null,
- "end_date": "2018-07-31",
+ "start_date_from_milestones": null, //deprecated in favor of start_date_from_inherited_source
+ "start_date_from_inherited_source": null,
+ "end_date": "2018-07-31", //deprecated in favor of due_date
"due_date": "2018-07-31",
"due_date_is_fixed": false,
"due_date_fixed": null,
- "due_date_from_milestones": "2018-07-31",
+ "due_date_from_milestones": "2018-07-31", //deprecated in favor of start_date_from_inherited_source
+ "due_date_from_inherited_source": "2018-07-31",
"created_at": "2018-07-17T13:36:22.770Z",
"updated_at": "2018-07-18T12:22:05.239Z",
"labels": []
@@ -241,12 +247,14 @@ Example response:
"start_date": null,
"start_date_is_fixed": false,
"start_date_fixed": null,
- "start_date_from_milestones": null,
- "end_date": "2018-07-31",
+ "start_date_from_milestones": null, //deprecated in favor of start_date_from_inherited_source
+ "start_date_from_inherited_source": null,
+ "end_date": "2018-07-31", //deprecated in favor of due_date
"due_date": "2018-07-31",
"due_date_is_fixed": false,
"due_date_fixed": null,
- "due_date_from_milestones": "2018-07-31",
+ "due_date_from_milestones": "2018-07-31", //deprecated in favor of start_date_from_inherited_source
+ "due_date_from_inherited_source": "2018-07-31",
"created_at": "2018-07-17T13:36:22.770Z",
"updated_at": "2018-07-18T12:22:05.239Z",
"labels": []
diff --git a/doc/api/epics.md b/doc/api/epics.md
index c7a050f1465..531c75fd8c5 100644
--- a/doc/api/epics.md
+++ b/doc/api/epics.md
@@ -14,9 +14,13 @@ The [epic issues API](epic_issues.md) allows you to interact with issues associa
> [Introduced][ee-6448] in GitLab 11.3.
-Since start date and due date can be dynamically sourced from related issue milestones, when user has edit permission, additional fields will be shown. These include two boolean fields `start_date_is_fixed` and `due_date_is_fixed`, and four date fields `start_date_fixed`, `start_date_from_milestones`, `due_date_fixed` and `due_date_from_milestones`.
+Since start date and due date can be dynamically sourced from related issue milestones, when user has edit permission,
+additional fields will be shown. These include two boolean fields `start_date_is_fixed` and `due_date_is_fixed`,
+and four date fields `start_date_fixed`, `start_date_from_inherited_source`, `due_date_fixed` and `due_date_from_inherited_source`.
-`end_date` has been deprecated in favor of `due_date`.
+- `end_date` has been deprecated in favor of `due_date`.
+- `start_date_from_milestones` has been deprecated in favor of `start_date_from_inherited_source`
+- `due_date_from_milestones` has been deprecated in favor of `due_date_from_inherited_source`
## Epics pagination
@@ -80,12 +84,14 @@ Example response:
"start_date": null,
"start_date_is_fixed": false,
"start_date_fixed": null,
- "start_date_from_milestones": null,
- "end_date": "2018-07-31",
+ "start_date_from_milestones": null, //deprecated in favor of start_date_from_inherited_source
+ "start_date_from_inherited_source": null,
+ "end_date": "2018-07-31", //deprecated in favor of due_date
"due_date": "2018-07-31",
"due_date_is_fixed": false,
"due_date_fixed": null,
- "due_date_from_milestones": "2018-07-31",
+ "due_date_from_milestones": "2018-07-31", //deprecated in favor of start_date_from_inherited_source
+ "due_date_from_inherited_source": "2018-07-31",
"created_at": "2018-07-17T13:36:22.770Z",
"updated_at": "2018-07-18T12:22:05.239Z",
"closed_at": "2018-08-18T12:22:05.239Z",
@@ -136,12 +142,14 @@ Example response:
"start_date": null,
"start_date_is_fixed": false,
"start_date_fixed": null,
- "start_date_from_milestones": null,
- "end_date": "2018-07-31",
+ "start_date_from_milestones": null, //deprecated in favor of start_date_from_inherited_source
+ "start_date_from_inherited_source": null,
+ "end_date": "2018-07-31", //deprecated in favor of due_date
"due_date": "2018-07-31",
"due_date_is_fixed": false,
"due_date_fixed": null,
- "due_date_from_milestones": "2018-07-31",
+ "due_date_from_milestones": "2018-07-31", //deprecated in favor of start_date_from_inherited_source
+ "due_date_from_inherited_source": "2018-07-31",
"created_at": "2018-07-17T13:36:22.770Z",
"updated_at": "2018-07-18T12:22:05.239Z",
"closed_at": "2018-08-18T12:22:05.239Z",
@@ -204,12 +212,14 @@ Example response:
"start_date": null,
"start_date_is_fixed": false,
"start_date_fixed": null,
- "start_date_from_milestones": null,
- "end_date": "2018-07-31",
+ "start_date_from_milestones": null, //deprecated in favor of start_date_from_inherited_source
+ "start_date_from_inherited_source": null,
+ "end_date": "2018-07-31", //deprecated in favor of due_date
"due_date": "2018-07-31",
"due_date_is_fixed": false,
"due_date_fixed": null,
- "due_date_from_milestones": "2018-07-31",
+ "due_date_from_milestones": "2018-07-31", //deprecated in favor of start_date_from_inherited_source
+ "due_date_from_inherited_source": "2018-07-31",
"created_at": "2018-07-17T13:36:22.770Z",
"updated_at": "2018-07-18T12:22:05.239Z",
"closed_at": "2018-08-18T12:22:05.239Z",
@@ -272,12 +282,14 @@ Example response:
"start_date": null,
"start_date_is_fixed": false,
"start_date_fixed": null,
- "start_date_from_milestones": null,
- "end_date": "2018-07-31",
+ "start_date_from_milestones": null, //deprecated in favor of start_date_from_inherited_source
+ "start_date_from_inherited_source": null,
+ "end_date": "2018-07-31", //deprecated in favor of due_date
"due_date": "2018-07-31",
"due_date_is_fixed": false,
"due_date_fixed": null,
- "due_date_from_milestones": "2018-07-31",
+ "due_date_from_milestones": "2018-07-31", //deprecated in favor of start_date_from_inherited_source
+ "due_date_from_inherited_source": "2018-07-31",
"created_at": "2018-07-17T13:36:22.770Z",
"updated_at": "2018-07-18T12:22:05.239Z",
"closed_at": "2018-08-18T12:22:05.239Z",
diff --git a/doc/development/api_graphql_styleguide.md b/doc/development/api_graphql_styleguide.md
index cdd0e9b2a7b..05786319d96 100644
--- a/doc/development/api_graphql_styleguide.md
+++ b/doc/development/api_graphql_styleguide.md
@@ -43,14 +43,14 @@ a new presenter specifically for GraphQL.
The presenter is initialized using the object resolved by a field, and
the context.
-### Exposing Global ids
+### Exposing Global IDs
-When exposing an `id` field on a type, we will by default try to
-expose a global id by calling `to_global_id` on the resource being
+When exposing an `ID` field on a type, we will by default try to
+expose a global ID by calling `to_global_id` on the resource being
rendered.
To override this behaviour, you can implement an `id` method on the
-type for which you are exposing an id. Please make sure that when
+type for which you are exposing an ID. Please make sure that when
exposing a `GraphQL::ID_TYPE` using a custom method that it is
globally unique.
@@ -350,7 +350,10 @@ To find objects to display in a field, we can add resolvers to
`app/graphql/resolvers`.
Arguments can be defined within the resolver, those arguments will be
-made available to the fields using the resolver.
+made available to the fields using the resolver. When exposing a model
+that had an internal ID (`iid`), prefer using that in combination with
+the namespace path as arguments in a resolver over a database
+ID. Othewise use a [globally unique ID](#exposing-global-ids).
We already have a `FullPathLoader` that can be included in other
resolvers to quickly find Projects and Namespaces which will have a
@@ -365,6 +368,10 @@ actions. In the same way a GET-request should not modify data, we
cannot modify data in a regular GraphQL-query. We can however in a
mutation.
+To find objects for a mutation, arguments need to be specified. As with
+[resolvers](#resolvers), prefer using internal ID or, if needed, a
+global ID rather than the database ID.
+
### Fields
In the most common situations, a mutation would return 2 fields:
diff --git a/doc/user/group/epics/index.md b/doc/user/group/epics/index.md
index f9690d4edfe..55f337f982d 100644
--- a/doc/user/group/epics/index.md
+++ b/doc/user/group/epics/index.md
@@ -92,24 +92,44 @@ To remove a child epic from a parent epic:
## Start date and due date
-To set a **Start date** and **Due date** for an epic, you can choose either of the following:
+To set a **Start date** and **Due date** for an epic, select one of the following:
- **Fixed**: Enter a fixed value.
-- **From milestones:** Inherit a dynamic value from the issues added to the epic.
+- **From milestones**: Inherit a dynamic value from the issues added to the epic.
+- **Inherited**: Inherit a dynamic value from the issues added to the epic. ([Introduced](https://gitlab.com/gitlab-org/gitlab/issues/7332) in GitLab 12.5 to replace **From milestones**).
-If you select **From milestones** for the start date, GitLab will automatically set the
-date to be earliest start date across all milestones that are currently assigned
-to the issues that are added to the epic. Similarly, if you select "From milestones"
-for the due date, GitLab will set it to be the latest due date across all
-milestones that are currently assigned to those issues.
+### Milestones
-These are dynamic dates which are recalculated immediately if any of the following occur:
+If you select **From milestones** for the start date, GitLab will automatically set the date to be earliest
+start date across all milestones that are currently assigned to the issues that are added to the epic.
+Similarly, if you select **From milestones** for the due date, GitLab will set it to be the latest due date across
+all milestones that are currently assigned to those issues.
+
+These are dynamic dates which are recalculated if any of the following occur:
- Milestones are re-assigned to the issues.
- Milestone dates change.
- Issues are added or removed from the epic.
-## Roadmap
+### Inherited
+
+If you select **Inherited** for the start date, GitLab will scan all child epics and issues assigned to the epic,
+and will set the start date to match the earliest found start date or milestone. Similarly, if you select
+**Inherited** for the due date, GitLab will set the due date to match the latest due date or milestone
+found among its child epics and issues.
+
+These are dynamic dates and recalculated if any of the following occur:
+
+- A child epic's dates change.
+- Milestones are reassigned to an issue.
+- A milestone's dates change.
+- Issues are added to, or removed from, the epic.
+
+Because the epic's dates can inherit dates from its children, the start date and due date propagate from the bottom to the top.
+If the start date of a child epic on the lowest level changes, that becomes the earliest possible start date for its parent epic,
+then the parent epic's start date will reflect the change and this will propagate upwards to the top epic.
+
+## Roadmap in epics
> [Introduced](https://gitlab.com/gitlab-org/gitlab/issues/7327) in [GitLab Ultimate](https://about.gitlab.com/pricing/) 11.10.
diff --git a/doc/user/group/roadmap/index.md b/doc/user/group/roadmap/index.md
index bcd79bd04bf..a72cd990706 100644
--- a/doc/user/group/roadmap/index.md
+++ b/doc/user/group/roadmap/index.md
@@ -26,7 +26,7 @@ Epics in the view can be sorted by:
Each option contains a button that toggles the sort order between **ascending** and **descending**. The sort option and order will be persisted when browsing Epics,
including the [epics list view](../epics/index.md).
-Roadmaps can also be [visualized inside an epic](../epics/index.md#roadmap).
+Roadmaps can also be [visualized inside an epic](../epics/index.md#roadmap-in-epics).
## Timeline duration
diff --git a/lib/gitlab/sidekiq_middleware/metrics.rb b/lib/gitlab/sidekiq_middleware/metrics.rb
index 86762a2d02b..d45045ca414 100644
--- a/lib/gitlab/sidekiq_middleware/metrics.rb
+++ b/lib/gitlab/sidekiq_middleware/metrics.rb
@@ -21,29 +21,35 @@ module Gitlab
@metrics[:sidekiq_jobs_retried_total].increment(labels, 1)
end
+ job_succeeded = false
+ monotonic_time_start = Gitlab::Metrics::System.monotonic_time
job_thread_cputime_start = get_thread_cputime
-
- realtime = Benchmark.realtime do
+ begin
yield
- end
+ job_succeeded = true
+ ensure
+ monotonic_time_end = Gitlab::Metrics::System.monotonic_time
+ job_thread_cputime_end = get_thread_cputime
- job_thread_cputime_end = get_thread_cputime
- job_thread_cputime = job_thread_cputime_end - job_thread_cputime_start
- @metrics[:sidekiq_jobs_cpu_seconds].observe(labels, job_thread_cputime)
+ monotonic_time = monotonic_time_end - monotonic_time_start
+ job_thread_cputime = job_thread_cputime_end - job_thread_cputime_start
- @metrics[:sidekiq_jobs_completion_seconds].observe(labels, realtime)
- rescue Exception # rubocop: disable Lint/RescueException
- @metrics[:sidekiq_jobs_failed_total].increment(labels, 1)
- raise
- ensure
- @metrics[:sidekiq_running_jobs].increment(labels, -1)
+ # sidekiq_running_jobs, sidekiq_jobs_failed_total should not include the job_status label
+ @metrics[:sidekiq_running_jobs].increment(labels, -1)
+ @metrics[:sidekiq_jobs_failed_total].increment(labels, 1) unless job_succeeded
+
+ # job_status: done, fail match the job_status attribute in structured logging
+ labels[:job_status] = job_succeeded ? :done : :fail
+ @metrics[:sidekiq_jobs_cpu_seconds].observe(labels, job_thread_cputime)
+ @metrics[:sidekiq_jobs_completion_seconds].observe(labels, monotonic_time)
+ end
end
private
def init_metrics
{
- sidekiq_jobs_cpu_seconds: ::Gitlab::Metrics.histogram(:sidekiq_jobs_cpu_seconds, 'Seconds of cpu time to run sidekiq job', {}, SIDEKIQ_LATENCY_BUCKETS),
+ sidekiq_jobs_cpu_seconds: ::Gitlab::Metrics.histogram(:sidekiq_jobs_cpu_seconds, 'Seconds of cpu time to run sidekiq job', {}, SIDEKIQ_LATENCY_BUCKETS),
sidekiq_jobs_completion_seconds: ::Gitlab::Metrics.histogram(:sidekiq_jobs_completion_seconds, 'Seconds to complete sidekiq job', {}, SIDEKIQ_LATENCY_BUCKETS),
sidekiq_jobs_failed_total: ::Gitlab::Metrics.counter(:sidekiq_jobs_failed_total, 'Sidekiq jobs failed'),
sidekiq_jobs_retried_total: ::Gitlab::Metrics.counter(:sidekiq_jobs_retried_total, 'Sidekiq jobs retried'),
diff --git a/lib/gitlab/sql/union.rb b/lib/gitlab/sql/union.rb
index f05592fc3a3..b15f2ca385a 100644
--- a/lib/gitlab/sql/union.rb
+++ b/lib/gitlab/sql/union.rb
@@ -29,7 +29,7 @@ module Gitlab
end
if fragments.any?
- fragments.join("\n#{union_keyword}\n")
+ "(" + fragments.join(")\n#{union_keyword}\n(") + ")"
else
'NULL'
end
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 1e5aba37310..e6146b9e520 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -7427,9 +7427,6 @@ msgstr ""
msgid "From merge request merge until deploy to production"
msgstr ""
-msgid "From milestones:"
-msgstr ""
-
msgid "From the Kubernetes cluster details view, install Runner from the applications list"
msgstr ""
@@ -9019,6 +9016,9 @@ msgstr ""
msgid "Information about additional Pages templates and how to install them can be found in our %{pages_getting_started_guide}."
msgstr ""
+msgid "Inherited:"
+msgstr ""
+
msgid "Inline"
msgstr ""
@@ -11522,9 +11522,6 @@ msgstr ""
msgid "Other visibility settings have been disabled by the administrator."
msgstr ""
-msgid "Our Privacy Policy has changed, please visit %{privacy_policy_link} to review these changes."
-msgstr ""
-
msgid "Outbound requests"
msgstr ""
diff --git a/spec/controllers/application_controller_spec.rb b/spec/controllers/application_controller_spec.rb
index ed91b5973b8..f4ac539136c 100644
--- a/spec/controllers/application_controller_spec.rb
+++ b/spec/controllers/application_controller_spec.rb
@@ -96,30 +96,14 @@ describe ApplicationController do
request.path = '/-/peek'
end
- # TODO:
- # remove line below once `privacy_policy_update_callout`
- # feature flag is removed and `gon` reverts back to
- # to not setting any variables.
- if Gitlab.ee?
- it_behaves_like 'setting gon variables'
- else
- it_behaves_like 'not setting gon variables'
- end
+ it_behaves_like 'not setting gon variables'
end
end
context 'with json format' do
let(:format) { :json }
- # TODO:
- # remove line below once `privacy_policy_update_callout`
- # feature flag is removed and `gon` reverts back to
- # to not setting any variables.
- if Gitlab.ee?
- it_behaves_like 'setting gon variables'
- else
- it_behaves_like 'not setting gon variables'
- end
+ it_behaves_like 'not setting gon variables'
end
end
diff --git a/spec/lib/gitlab/sidekiq_middleware/metrics_spec.rb b/spec/lib/gitlab/sidekiq_middleware/metrics_spec.rb
index ec4c8560f22..df16b9d073c 100644
--- a/spec/lib/gitlab/sidekiq_middleware/metrics_spec.rb
+++ b/spec/lib/gitlab/sidekiq_middleware/metrics_spec.rb
@@ -44,12 +44,14 @@ describe Gitlab::SidekiqMiddleware::Metrics do
it 'sets queue specific metrics' do
labels = { queue: :test }
+ labels_with_job_status = { queue: :test, job_status: :done }
allow(middleware).to receive(:get_thread_cputime).and_return(1, 3)
+ allow(Gitlab::Metrics::System).to receive(:monotonic_time).and_return(2, 3)
- expect(user_execution_seconds_metric).to receive(:observe).with(labels, 2)
expect(running_jobs_metric).to receive(:increment).with(labels, 1)
expect(running_jobs_metric).to receive(:increment).with(labels, -1)
- expect(completion_seconds_metric).to receive(:observe).with(labels, kind_of(Numeric))
+ expect(user_execution_seconds_metric).to receive(:observe).with(labels_with_job_status, 2)
+ expect(completion_seconds_metric).to receive(:observe).with(labels_with_job_status, 1)
middleware.call(worker, {}, :test) { nil }
end
@@ -74,8 +76,18 @@ describe Gitlab::SidekiqMiddleware::Metrics do
context 'when error is raised' do
it 'sets sidekiq_jobs_failed_total and reraises' do
- expect(failed_total_metric).to receive(:increment)
- expect { middleware.call(worker, {}, :test) { raise } }.to raise_error
+ labels = { queue: :test }
+ labels_with_job_status = { queue: :test, job_status: :fail }
+ allow(middleware).to receive(:get_thread_cputime).and_return(1, 4)
+ allow(Gitlab::Metrics::System).to receive(:monotonic_time).and_return(2, 6)
+
+ expect(running_jobs_metric).to receive(:increment).with(labels, 1)
+ expect(running_jobs_metric).to receive(:increment).with(labels, -1)
+ expect(failed_total_metric).to receive(:increment).with(labels, 1)
+ expect(user_execution_seconds_metric).to receive(:observe).with(labels_with_job_status, 3)
+ expect(completion_seconds_metric).to receive(:observe).with(labels_with_job_status, 4)
+
+ expect { middleware.call(worker, {}, :test) { raise StandardError, "Failed" } }.to raise_error(StandardError, "Failed")
end
end
end
diff --git a/spec/lib/gitlab/sql/recursive_cte_spec.rb b/spec/lib/gitlab/sql/recursive_cte_spec.rb
index 20e36c224b0..b15be56dd6d 100644
--- a/spec/lib/gitlab/sql/recursive_cte_spec.rb
+++ b/spec/lib/gitlab/sql/recursive_cte_spec.rb
@@ -20,7 +20,7 @@ describe Gitlab::SQL::RecursiveCTE do
[rel1.except(:order).to_sql, rel2.except(:order).to_sql]
end
- expect(sql).to eq("#{name} AS (#{sql1}\nUNION\n#{sql2})")
+ expect(sql).to eq("#{name} AS ((#{sql1})\nUNION\n(#{sql2}))")
end
end
diff --git a/spec/lib/gitlab/sql/union_spec.rb b/spec/lib/gitlab/sql/union_spec.rb
index f8f6da19fa5..f736614ae53 100644
--- a/spec/lib/gitlab/sql/union_spec.rb
+++ b/spec/lib/gitlab/sql/union_spec.rb
@@ -14,7 +14,7 @@ describe Gitlab::SQL::Union do
it 'returns a String joining relations together using a UNION' do
union = described_class.new([relation_1, relation_2])
- expect(union.to_sql).to eq("#{to_sql(relation_1)}\nUNION\n#{to_sql(relation_2)}")
+ expect(union.to_sql).to eq("(#{to_sql(relation_1)})\nUNION\n(#{to_sql(relation_2)})")
end
it 'skips Model.none segements' do
@@ -22,7 +22,7 @@ describe Gitlab::SQL::Union do
union = described_class.new([empty_relation, relation_1, relation_2])
expect {User.where("users.id IN (#{union.to_sql})").to_a}.not_to raise_error
- expect(union.to_sql).to eq("#{to_sql(relation_1)}\nUNION\n#{to_sql(relation_2)}")
+ expect(union.to_sql).to eq("(#{to_sql(relation_1)})\nUNION\n(#{to_sql(relation_2)})")
end
it 'uses UNION ALL when removing duplicates is disabled' do
diff --git a/spec/migrations/schedule_fix_gitlab_com_pages_access_level_spec.rb b/spec/migrations/schedule_fix_gitlab_com_pages_access_level_spec.rb
index db312242bea..88e5c101d32 100644
--- a/spec/migrations/schedule_fix_gitlab_com_pages_access_level_spec.rb
+++ b/spec/migrations/schedule_fix_gitlab_com_pages_access_level_spec.rb
@@ -1,7 +1,7 @@
require 'spec_helper'
require Rails.root.join('db', 'post_migrate', '20191017045817_schedule_fix_gitlab_com_pages_access_level.rb')
-describe ScheduleFixGitlabComPagesAccessLevel, :migration, :sidekiq, schema: 2019_10_16_072826 do
+describe ScheduleFixGitlabComPagesAccessLevel, :migration, :sidekiq_might_not_need_inline, schema: 2019_10_16_072826 do
using RSpec::Parameterized::TableSyntax
let(:migration_name) { 'FixGitlabComPagesAccessLevel' }
diff --git a/spec/models/concerns/from_union_spec.rb b/spec/models/concerns/from_union_spec.rb
index ee427a667c6..735e14b47ec 100644
--- a/spec/models/concerns/from_union_spec.rb
+++ b/spec/models/concerns/from_union_spec.rb
@@ -15,7 +15,7 @@ describe FromUnion do
it 'selects from the results of the UNION' do
query = model.from_union([model.where(id: 1), model.where(id: 2)])
- expect(query.to_sql).to match(/FROM \(SELECT.+UNION.+SELECT.+\) users/m)
+ expect(query.to_sql).to match(/FROM \(\(SELECT.+\)\nUNION\n\(SELECT.+\)\) users/m)
end
it 'supports the use of a custom alias for the sub query' do
@@ -24,7 +24,7 @@ describe FromUnion do
alias_as: 'kittens'
)
- expect(query.to_sql).to match(/FROM \(SELECT.+UNION.+SELECT.+\) kittens/m)
+ expect(query.to_sql).to match(/FROM \(\(SELECT.+\)\nUNION\n\(SELECT.+\)\) kittens/m)
end
it 'supports keeping duplicate rows' do
@@ -34,7 +34,7 @@ describe FromUnion do
)
expect(query.to_sql)
- .to match(/FROM \(SELECT.+UNION ALL.+SELECT.+\) users/m)
+ .to match(/FROM \(\(SELECT.+\)\nUNION ALL\n\(SELECT.+\)\) users/m)
end
end
end