+
+
+
+
+ {{ root }}
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{ leaf }}
+
+
+
+
diff --git a/app/mailers/emails/projects.rb b/app/mailers/emails/projects.rb
index fdf40a77ca4..17ef8b41e79 100644
--- a/app/mailers/emails/projects.rb
+++ b/app/mailers/emails/projects.rb
@@ -56,16 +56,14 @@ module Emails
subject: @message.subject)
end
- def prometheus_alert_fired_email(project_id, user_id, alert_payload)
+ def prometheus_alert_fired_email(project_id, user_id, alert_attributes)
@project = ::Project.find(project_id)
user = ::User.find(user_id)
- @alert = ::Gitlab::Alerting::Alert
- .new(project: @project, payload: alert_payload)
- .present
- return unless @alert.valid?
+ @alert = AlertManagement::Alert.new(alert_attributes.with_indifferent_access).present
+ return unless @alert.parsed_payload.has_required_attributes?
- subject_text = "Alert: #{@alert.full_title}"
+ subject_text = "Alert: #{@alert.email_title}"
mail(to: user.notification_email_for(@project.group), subject: subject(subject_text))
end
end
diff --git a/app/models/alert_management/alert.rb b/app/models/alert_management/alert.rb
index e9b89af45c6..f5e56cb50c9 100644
--- a/app/models/alert_management/alert.rb
+++ b/app/models/alert_management/alert.rb
@@ -191,7 +191,7 @@ module AlertManagement
end
def prometheus?
- monitoring_tool == Gitlab::AlertManagement::AlertParams::MONITORING_TOOLS[:prometheus]
+ monitoring_tool == Gitlab::AlertManagement::Payload::MONITORING_TOOLS[:prometheus]
end
def register_new_event!
diff --git a/app/models/clusters/platforms/kubernetes.rb b/app/models/clusters/platforms/kubernetes.rb
index 7af78960e35..1de7c90e50d 100644
--- a/app/models/clusters/platforms/kubernetes.rb
+++ b/app/models/clusters/platforms/kubernetes.rb
@@ -11,6 +11,7 @@ module Clusters
RESERVED_NAMESPACES = %w(gitlab-managed-apps).freeze
self.table_name = 'cluster_platforms_kubernetes'
+ self.reactive_cache_work_type = :external_dependency
belongs_to :cluster, inverse_of: :platform_kubernetes, class_name: 'Clusters::Cluster'
diff --git a/app/models/concerns/issuable.rb b/app/models/concerns/issuable.rb
index b285e30f619..7624a1a4e80 100644
--- a/app/models/concerns/issuable.rb
+++ b/app/models/concerns/issuable.rb
@@ -182,7 +182,7 @@ module Issuable
end
def supports_time_tracking?
- is_a?(TimeTrackable) && !incident?
+ is_a?(TimeTrackable)
end
def supports_severity?
diff --git a/app/models/concerns/reactive_caching.rb b/app/models/concerns/reactive_caching.rb
index 5f30fc0c36c..26f1544103c 100644
--- a/app/models/concerns/reactive_caching.rb
+++ b/app/models/concerns/reactive_caching.rb
@@ -9,7 +9,7 @@ module ReactiveCaching
ExceededReactiveCacheLimit = Class.new(StandardError)
WORK_TYPE = {
- default: ReactiveCachingWorker,
+ no_dependency: ReactiveCachingWorker,
external_dependency: ExternalServiceReactiveCachingWorker
}.freeze
@@ -30,7 +30,6 @@ module ReactiveCaching
self.reactive_cache_refresh_interval = 1.minute
self.reactive_cache_lifetime = 10.minutes
self.reactive_cache_hard_limit = nil # this value should be set in megabytes. E.g: 1.megabyte
- self.reactive_cache_work_type = :default
self.reactive_cache_worker_finder = ->(id, *_args) do
find_by(primary_key => id)
end
diff --git a/app/models/concerns/reactive_service.rb b/app/models/concerns/reactive_service.rb
index af69da24994..c444f238944 100644
--- a/app/models/concerns/reactive_service.rb
+++ b/app/models/concerns/reactive_service.rb
@@ -8,5 +8,6 @@ module ReactiveService
# Default cache key: class name + project_id
self.reactive_cache_key = ->(service) { [service.class.model_name.singular, service.project_id] }
+ self.reactive_cache_work_type = :external_dependency
end
end
diff --git a/app/models/merge_request.rb b/app/models/merge_request.rb
index 2e9e57bc4c4..b334da1ca91 100644
--- a/app/models/merge_request.rb
+++ b/app/models/merge_request.rb
@@ -31,6 +31,7 @@ class MergeRequest < ApplicationRecord
self.reactive_cache_key = ->(model) { [model.project.id, model.iid] }
self.reactive_cache_refresh_interval = 10.minutes
self.reactive_cache_lifetime = 10.minutes
+ self.reactive_cache_work_type = :no_dependency
SORTING_PREFERENCE_FIELD = :merge_requests_sort
diff --git a/app/presenters/alert_management/alert_presenter.rb b/app/presenters/alert_management/alert_presenter.rb
index 5debe6d5dbd..aafc18084fd 100644
--- a/app/presenters/alert_management/alert_presenter.rb
+++ b/app/presenters/alert_management/alert_presenter.rb
@@ -8,6 +8,7 @@ module AlertManagement
MARKDOWN_LINE_BREAK = " \n"
HORIZONTAL_LINE = "\n\n---\n\n"
+ INCIDENT_LABEL_NAME = ::IncidentManagement::CreateIncidentLabelService::LABEL_PROPERTIES[:title]
delegate :metrics_dashboard_url, :runbook, to: :parsed_payload
@@ -38,6 +39,30 @@ module AlertManagement
Gitlab::Utils::InlineHash.merge_keys(payload)
end
+ def show_incident_issues_link?
+ project.incident_management_setting&.create_issue?
+ end
+
+ def show_performance_dashboard_link?
+ prometheus_alert.present?
+ end
+
+ def incident_issues_link
+ project_issues_url(project, label_name: INCIDENT_LABEL_NAME)
+ end
+
+ def performance_dashboard_link
+ if environment
+ metrics_project_environment_url(project, environment)
+ else
+ metrics_project_environments_url(project)
+ end
+ end
+
+ def email_title
+ [environment&.name, query_title].compact.join(': ')
+ end
+
private
attr_reader :alert, :project
@@ -80,5 +105,11 @@ module AlertManagement
def host_links
hosts.join(' ')
end
+
+ def query_title
+ return title unless prometheus_alert
+
+ "#{prometheus_alert.title} #{prometheus_alert.computed_operator} #{prometheus_alert.threshold} for 5 minutes"
+ end
end
end
diff --git a/app/presenters/projects/prometheus/alert_presenter.rb b/app/presenters/projects/prometheus/alert_presenter.rb
deleted file mode 100644
index 783b2b2b1e0..00000000000
--- a/app/presenters/projects/prometheus/alert_presenter.rb
+++ /dev/null
@@ -1,179 +0,0 @@
-# frozen_string_literal: true
-
-module Projects
- module Prometheus
- class AlertPresenter < Gitlab::View::Presenter::Delegated
- GENERIC_ALERT_SUMMARY_ANNOTATIONS = %w(monitoring_tool service hosts).freeze
- MARKDOWN_LINE_BREAK = " \n".freeze
- INCIDENT_LABEL_NAME = ::IncidentManagement::CreateIncidentLabelService::LABEL_PROPERTIES[:title].freeze
- METRIC_TIME_WINDOW = 30.minutes
-
- def full_title
- [environment_name, alert_title].compact.join(': ')
- end
-
- def project_full_path
- project.full_path
- end
-
- def metric_query
- gitlab_alert&.full_query
- end
-
- def environment_name
- environment&.name
- end
-
- def performance_dashboard_link
- if environment
- metrics_project_environment_url(project, environment)
- else
- metrics_project_environments_url(project)
- end
- end
-
- def show_performance_dashboard_link?
- gitlab_alert.present?
- end
-
- def show_incident_issues_link?
- project.incident_management_setting&.create_issue?
- end
-
- def incident_issues_link
- project_issues_url(project, label_name: INCIDENT_LABEL_NAME)
- end
-
- def start_time
- starts_at&.strftime('%d %B %Y, %-l:%M%p (%Z)')
- end
-
- def issue_summary_markdown
- <<~MARKDOWN.chomp
- #{metadata_list}
- #{metric_embed_for_alert}
- MARKDOWN
- end
-
- def metric_embed_for_alert
- "\n[](#{metrics_dashboard_url})" if metrics_dashboard_url
- end
-
- def metrics_dashboard_url
- strong_memoize(:metrics_dashboard_url) do
- embed_url_for_gitlab_alert || embed_url_for_self_managed_alert
- end
- end
-
- def details_url
- return unless am_alert
-
- ::Gitlab::Routing.url_helpers.details_project_alert_management_url(
- project,
- am_alert.iid
- )
- end
-
- private
-
- def alert_title
- query_title || title
- end
-
- def query_title
- return unless gitlab_alert
-
- "#{gitlab_alert.title} #{gitlab_alert.computed_operator} #{gitlab_alert.threshold} for 5 minutes"
- end
-
- def metadata_list
- metadata = []
-
- metadata << list_item('Start time', start_time) if start_time
- metadata << list_item('full_query', backtick(full_query)) if full_query
- metadata << list_item(service.label.humanize, service.value) if service
- metadata << list_item(monitoring_tool.label.humanize, monitoring_tool.value) if monitoring_tool
- metadata << list_item(hosts.label.humanize, host_links) if hosts
- metadata << list_item('GitLab alert', details_url) if details_url
-
- metadata.join(MARKDOWN_LINE_BREAK)
- end
-
- def details
- Gitlab::Utils::InlineHash.merge_keys(payload)
- end
-
- def list_item(key, value)
- "**#{key}:** #{value}".strip
- end
-
- def backtick(value)
- "`#{value}`"
- end
-
- GENERIC_ALERT_SUMMARY_ANNOTATIONS.each do |annotation_name|
- define_method(annotation_name) do
- annotations.find { |a| a.label == annotation_name }
- end
- end
-
- def host_links
- Array(hosts.value).join(' ')
- end
-
- def embed_url_for_gitlab_alert
- return unless gitlab_alert
-
- metrics_dashboard_project_prometheus_alert_url(
- project,
- gitlab_alert.prometheus_metric_id,
- environment_id: environment.id,
- embedded: true,
- **alert_embed_window_params(embed_time)
- )
- end
-
- def embed_url_for_self_managed_alert
- return unless environment && full_query && title
-
- metrics_dashboard_project_environment_url(
- project,
- environment,
- embed_json: dashboard_for_self_managed_alert.to_json,
- embedded: true,
- **alert_embed_window_params(embed_time)
- )
- end
-
- def embed_time
- starts_at || Time.current
- end
-
- def alert_embed_window_params(time)
- {
- start: format_embed_timestamp(time - METRIC_TIME_WINDOW),
- end: format_embed_timestamp(time + METRIC_TIME_WINDOW)
- }
- end
-
- def format_embed_timestamp(time)
- time.utc.strftime('%FT%TZ')
- end
-
- def dashboard_for_self_managed_alert
- {
- panel_groups: [{
- panels: [{
- type: 'area-chart',
- title: title,
- y_label: y_label,
- metrics: [{
- query_range: full_query
- }]
- }]
- }]
- }
- end
- end
- end
-end
diff --git a/app/services/alert_management/process_prometheus_alert_service.rb b/app/services/alert_management/process_prometheus_alert_service.rb
index 95ae84a85a4..5c7698f724a 100644
--- a/app/services/alert_management/process_prometheus_alert_service.rb
+++ b/app/services/alert_management/process_prometheus_alert_service.rb
@@ -47,7 +47,7 @@ module AlertManagement
def create_alert_management_alert
if alert.save
alert.execute_services
- SystemNoteService.create_new_alert(alert, Gitlab::AlertManagement::AlertParams::MONITORING_TOOLS[:prometheus])
+ SystemNoteService.create_new_alert(alert, Gitlab::AlertManagement::Payload::MONITORING_TOOLS[:prometheus])
return
end
diff --git a/app/services/pod_logs/base_service.rb b/app/services/pod_logs/base_service.rb
index 8936f9b67a5..e4b6ad31e33 100644
--- a/app/services/pod_logs/base_service.rb
+++ b/app/services/pod_logs/base_service.rb
@@ -10,6 +10,8 @@ module PodLogs
CACHE_KEY_GET_POD_LOG = 'get_pod_log'
K8S_NAME_MAX_LENGTH = 253
+ self.reactive_cache_work_type = :external_dependency
+
def id
cluster.id
end
diff --git a/app/services/pod_logs/elasticsearch_service.rb b/app/services/pod_logs/elasticsearch_service.rb
index f79562c8ab3..58d1bfbf835 100644
--- a/app/services/pod_logs/elasticsearch_service.rb
+++ b/app/services/pod_logs/elasticsearch_service.rb
@@ -11,7 +11,6 @@ module PodLogs
:pod_logs,
:filter_return_keys
- self.reactive_cache_work_type = :external_dependency
self.reactive_cache_worker_finder = ->(id, _cache_key, namespace, params) { new(::Clusters::Cluster.find(id), namespace, params: params) }
private
diff --git a/app/services/pod_logs/kubernetes_service.rb b/app/services/pod_logs/kubernetes_service.rb
index b573ceae1aa..03b84f98973 100644
--- a/app/services/pod_logs/kubernetes_service.rb
+++ b/app/services/pod_logs/kubernetes_service.rb
@@ -17,7 +17,6 @@ module PodLogs
:split_logs,
:filter_return_keys
- self.reactive_cache_work_type = :external_dependency
self.reactive_cache_worker_finder = ->(id, _cache_key, namespace, params) { new(::Clusters::Cluster.find(id), namespace, params: params) }
private
diff --git a/app/services/projects/alerting/notify_service.rb b/app/services/projects/alerting/notify_service.rb
index bfce5f1ad63..8a6c735b1a2 100644
--- a/app/services/projects/alerting/notify_service.rb
+++ b/app/services/projects/alerting/notify_service.rb
@@ -7,43 +7,34 @@ module Projects
include ::IncidentManagement::Settings
def execute(token)
+ return bad_request unless valid_payload_size?
return forbidden unless alerts_service_activated?
return unauthorized unless valid_token?(token)
- alert = process_alert
+ process_alert
return bad_request unless alert.persisted?
- process_incident_issues(alert) if process_issues?
+ process_incident_issues if process_issues?
send_alert_email if send_email?
ServiceResponse.success
- rescue Gitlab::Alerting::NotificationPayloadParser::BadPayloadError
- bad_request
end
private
delegate :alerts_service, :alerts_service_activated?, to: :project
- def am_alert_params
- strong_memoize(:am_alert_params) do
- Gitlab::AlertManagement::AlertParams.from_generic_alert(project: project, payload: params.to_h)
- end
- end
-
def process_alert
- existing_alert = find_alert_by_fingerprint(am_alert_params[:fingerprint])
-
- if existing_alert
- process_existing_alert(existing_alert)
+ if alert.persisted?
+ process_existing_alert
else
create_alert
end
end
- def process_existing_alert(alert)
- if am_alert_params[:ended_at].present?
- process_resolved_alert(alert)
+ def process_existing_alert
+ if incoming_payload.ends_at.present?
+ process_resolved_alert
else
alert.register_new_event!
end
@@ -51,10 +42,10 @@ module Projects
alert
end
- def process_resolved_alert(alert)
+ def process_resolved_alert
return unless auto_close_incident?
- if alert.resolve(am_alert_params[:ended_at])
+ if alert.resolve(incoming_payload.ends_at)
close_issue(alert.issue)
end
@@ -72,20 +63,13 @@ module Projects
end
def create_alert
- alert = AlertManagement::Alert.create(am_alert_params.except(:ended_at))
- alert.execute_services if alert.persisted?
+ return unless alert.save
+
+ alert.execute_services
SystemNoteService.create_new_alert(alert, 'Generic Alert Endpoint')
-
- alert
end
- def find_alert_by_fingerprint(fingerprint)
- return unless fingerprint
-
- AlertManagement::Alert.not_resolved.for_fingerprint(project, fingerprint).first
- end
-
- def process_incident_issues(alert)
+ def process_incident_issues
return if alert.issue
::IncidentManagement::ProcessAlertWorker.perform_async(nil, nil, alert.id)
@@ -94,11 +78,33 @@ module Projects
def send_alert_email
notification_service
.async
- .prometheus_alerts_fired(project, [parsed_payload])
+ .prometheus_alerts_fired(project, [alert.attributes])
end
- def parsed_payload
- Gitlab::Alerting::NotificationPayloadParser.call(params.to_h, project)
+ def alert
+ strong_memoize(:alert) do
+ existing_alert || new_alert
+ end
+ end
+
+ def existing_alert
+ return unless incoming_payload.gitlab_fingerprint
+
+ AlertManagement::Alert.not_resolved.for_fingerprint(project, incoming_payload.gitlab_fingerprint).first
+ end
+
+ def new_alert
+ AlertManagement::Alert.new(**incoming_payload.alert_params, ended_at: nil)
+ end
+
+ def incoming_payload
+ strong_memoize(:incoming_payload) do
+ Gitlab::AlertManagement::Payload.parse(project, params.to_h)
+ end
+ end
+
+ def valid_payload_size?
+ Gitlab::Utils::DeepSize.new(params).valid?
end
def valid_token?(token)
diff --git a/app/services/projects/prometheus/alerts/notify_service.rb b/app/services/projects/prometheus/alerts/notify_service.rb
index d32ead76d00..c002aca32db 100644
--- a/app/services/projects/prometheus/alerts/notify_service.rb
+++ b/app/services/projects/prometheus/alerts/notify_service.rb
@@ -125,7 +125,7 @@ module Projects
notification_service
.async
- .prometheus_alerts_fired(project, firings)
+ .prometheus_alerts_fired(project, alerts_attributes)
end
def process_prometheus_alerts
@@ -136,6 +136,18 @@ module Projects
end
end
+ def alerts_attributes
+ firings.map do |payload|
+ alert_params = Gitlab::AlertManagement::Payload.parse(
+ project,
+ payload,
+ monitoring_tool: Gitlab::AlertManagement::Payload::MONITORING_TOOLS[:prometheus]
+ ).alert_params
+
+ AlertManagement::Alert.new(alert_params).attributes
+ end
+ end
+
def bad_request
ServiceResponse.error(message: 'Bad Request', http_status: :bad_request)
end
diff --git a/app/views/notify/prometheus_alert_fired_email.html.haml b/app/views/notify/prometheus_alert_fired_email.html.haml
index 17f9481d353..75ba66b44f9 100644
--- a/app/views/notify/prometheus_alert_fired_email.html.haml
+++ b/app/views/notify/prometheus_alert_fired_email.html.haml
@@ -1,17 +1,17 @@
%p
- = _('An alert has been triggered in %{project_path}.') % { project_path: @alert.project_full_path }
+ = _('An alert has been triggered in %{project_path}.') % { project_path: @alert.project.full_path }
- if description = @alert.description
%p
= _('Description:')
= description
-- if env_name = @alert.environment_name
+- if env_name = @alert.environment&.name
%p
= _('Environment:')
= env_name
-- if metric_query = @alert.metric_query
+- if metric_query = @alert.prometheus_alert&.full_query
%p
= _('Metric:')
@@ -25,4 +25,3 @@
- if @alert.show_performance_dashboard_link?
%p
= link_to(_('View performance dashboard.'), @alert.performance_dashboard_link)
-
diff --git a/app/views/notify/prometheus_alert_fired_email.text.erb b/app/views/notify/prometheus_alert_fired_email.text.erb
index c3f005cfb7e..8853f2a317b 100644
--- a/app/views/notify/prometheus_alert_fired_email.text.erb
+++ b/app/views/notify/prometheus_alert_fired_email.text.erb
@@ -1,14 +1,14 @@
-<%= _('An alert has been triggered in %{project_path}.') % { project_path: @alert.project_full_path } %>.
+<%= _('An alert has been triggered in %{project_path}.') % { project_path: @alert.project.full_path } %>.
<% if description = @alert.description %>
<%= _('Description:') %> <%= description %>
<% end %>
-<% if env_name = @alert.environment_name %>
+<% if env_name = @alert.environment&.name %>
<%= _('Environment:') %> <%= env_name %>
<% end %>
-<% if metric_query = @alert.metric_query %>
+<% if metric_query = @alert.prometheus_alert&.full_query %>
<%= _('Metric:') %> <%= metric_query %>
<% end %>
diff --git a/app/views/projects/diffs/_file_header.html.haml b/app/views/projects/diffs/_file_header.html.haml
index f954b09abee..e9dfda4e927 100644
--- a/app/views/projects/diffs/_file_header.html.haml
+++ b/app/views/projects/diffs/_file_header.html.haml
@@ -6,7 +6,7 @@
- if diff_file.submodule?
- blob = diff_file.blob
%span
- = icon('archive fw')
+ = sprite_icon('archive')
%strong.file-title-name
= submodule_link(blob, diff_file.content_sha, diff_file.repository)
diff --git a/changelogs/unreleased/225644-package-registry-in-the-group-registry-view-make-the-project-ui-mo.yml b/changelogs/unreleased/225644-package-registry-in-the-group-registry-view-make-the-project-ui-mo.yml
new file mode 100644
index 00000000000..cce1d360787
--- /dev/null
+++ b/changelogs/unreleased/225644-package-registry-in-the-group-registry-view-make-the-project-ui-mo.yml
@@ -0,0 +1,5 @@
+---
+title: Breadcrumb like UI for project path in packages list
+merge_request: 42684
+author:
+type: changed
diff --git a/changelogs/unreleased/254250-add-time-tracking-to-incidents.yml b/changelogs/unreleased/254250-add-time-tracking-to-incidents.yml
new file mode 100644
index 00000000000..0f183f66e82
--- /dev/null
+++ b/changelogs/unreleased/254250-add-time-tracking-to-incidents.yml
@@ -0,0 +1,5 @@
+---
+title: Allow time tracking in incidents
+merge_request: 42965
+author:
+type: changed
diff --git a/config/feature_flags/development/boards_with_swimlanes.yml b/config/feature_flags/development/boards_with_swimlanes.yml
index e2db136b45c..19e5ab24206 100644
--- a/config/feature_flags/development/boards_with_swimlanes.yml
+++ b/config/feature_flags/development/boards_with_swimlanes.yml
@@ -1,7 +1,7 @@
---
name: boards_with_swimlanes
-introduced_by_url:
-rollout_issue_url:
-group:
+introduced_by_url:
+rollout_issue_url:
+group: group::project management
type: development
default_enabled: false
diff --git a/config/feature_flags/development/bulk_update_health_status.yml b/config/feature_flags/development/bulk_update_health_status.yml
index 5553f2e077f..fa06adfd60a 100644
--- a/config/feature_flags/development/bulk_update_health_status.yml
+++ b/config/feature_flags/development/bulk_update_health_status.yml
@@ -1,7 +1,7 @@
---
name: bulk_update_health_status
-introduced_by_url:
-rollout_issue_url:
-group:
+introduced_by_url:
+rollout_issue_url:
+group: group::portfolio management
type: development
default_enabled: true
diff --git a/config/feature_flags/development/burnup_charts.yml b/config/feature_flags/development/burnup_charts.yml
index 9484af49530..5ead8362d90 100644
--- a/config/feature_flags/development/burnup_charts.yml
+++ b/config/feature_flags/development/burnup_charts.yml
@@ -1,7 +1,7 @@
---
name: burnup_charts
-introduced_by_url:
-rollout_issue_url:
-group:
+introduced_by_url:
+rollout_issue_url:
+group: group::project management
type: development
default_enabled: false
diff --git a/config/feature_flags/development/graphql_board_lists.yml b/config/feature_flags/development/graphql_board_lists.yml
index 4e6bf000a8f..7e2696a06c8 100644
--- a/config/feature_flags/development/graphql_board_lists.yml
+++ b/config/feature_flags/development/graphql_board_lists.yml
@@ -1,7 +1,7 @@
---
name: graphql_board_lists
-introduced_by_url:
-rollout_issue_url:
-group:
+introduced_by_url:
+rollout_issue_url:
+group: group::project management
type: development
default_enabled: false
diff --git a/config/feature_flags/development/multi_select_board.yml b/config/feature_flags/development/multi_select_board.yml
index 35718606d62..3849fb0e12b 100644
--- a/config/feature_flags/development/multi_select_board.yml
+++ b/config/feature_flags/development/multi_select_board.yml
@@ -1,7 +1,7 @@
---
name: multi_select_board
-introduced_by_url:
-rollout_issue_url:
-group:
+introduced_by_url:
+rollout_issue_url:
+group: group::project management
type: development
default_enabled: true
diff --git a/config/feature_flags/development/tribute_autocomplete.yml b/config/feature_flags/development/tribute_autocomplete.yml
index 31ee1b932d3..94cfc00c467 100644
--- a/config/feature_flags/development/tribute_autocomplete.yml
+++ b/config/feature_flags/development/tribute_autocomplete.yml
@@ -1,7 +1,7 @@
---
name: tribute_autocomplete
-introduced_by_url:
-rollout_issue_url:
-group:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/32671
+rollout_issue_url:
+group: group::project management
type: development
default_enabled: false
diff --git a/config/feature_flags/development/vue_issuable_sidebar.yml b/config/feature_flags/development/vue_issuable_sidebar.yml
index d57852c9491..01c8bc3460b 100644
--- a/config/feature_flags/development/vue_issuable_sidebar.yml
+++ b/config/feature_flags/development/vue_issuable_sidebar.yml
@@ -1,7 +1,7 @@
---
name: vue_issuable_sidebar
-introduced_by_url:
-rollout_issue_url:
-group:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/18199
+rollout_issue_url:
+group: group::project management
type: development
default_enabled: false
diff --git a/config/feature_flags/development/vue_issuables_list.yml b/config/feature_flags/development/vue_issuables_list.yml
index 79ade237824..5fe5c7e3e9f 100644
--- a/config/feature_flags/development/vue_issuables_list.yml
+++ b/config/feature_flags/development/vue_issuables_list.yml
@@ -1,7 +1,7 @@
---
name: vue_issuables_list
-introduced_by_url:
-rollout_issue_url:
-group:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/15091
+rollout_issue_url: https://gitlab.com/gitlab-org/gitlab/-/issues/208093
+group: group::project management
type: development
default_enabled: false
diff --git a/config/feature_flags/development/vue_sidebar_labels.yml b/config/feature_flags/development/vue_sidebar_labels.yml
index d786db39487..13b1ae20dd7 100644
--- a/config/feature_flags/development/vue_sidebar_labels.yml
+++ b/config/feature_flags/development/vue_sidebar_labels.yml
@@ -1,7 +1,7 @@
---
name: vue_sidebar_labels
-introduced_by_url:
-rollout_issue_url:
-group:
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/41561
+rollout_issue_url:
+group: group::project management
type: development
default_enabled: false
diff --git a/danger/telemetry/Dangerfile b/danger/telemetry/Dangerfile
index 6cfc1a005c3..e335f6e0f73 100644
--- a/danger/telemetry/Dangerfile
+++ b/danger/telemetry/Dangerfile
@@ -2,7 +2,7 @@
TELEMETRY_CHANGED_FILES_MESSAGE = <<~MSG
For the following files, a review from the [Data team and Telemetry team](https://gitlab.com/groups/gitlab-org/growth/telemetry/engineers/-/group_members?with_inherited_permissions=exclude) is recommended
-Please check the ~telemetry [guide](https://docs.gitlab.com/ee/development/telemetry/usage_ping.html) and reach out to @gitlab-org/growth/telemetry/engineers group for a review.
+Please check the ~telemetry [guide](https://docs.gitlab.com/ee/development/telemetry/usage_ping.html) and reach out to %