Module: Gitlab::Observability

Extended by:
Observability
Included in:
Observability
Defined in:
lib/gitlab/observability.rb

Constant Summary collapse

ACTION_TO_PERMISSION =
{
  explore: :read_observability,
  datasources: :admin_observability,
  manage: :admin_observability,
  dashboards: :read_observability
}.freeze
EMBEDDABLE_PATHS =
%w[explore goto].freeze

Instance Method Summary collapse

Instance Method Details

#allowed?(user, group, permission = :admin_observability) ⇒ Boolean

Returns true if the user has the specified permission within the group

Returns:

  • (Boolean)


80
81
82
83
84
# File 'lib/gitlab/observability.rb', line 80

def allowed?(user, group, permission = :admin_observability)
  return false unless group && user

  observability_url.present? && Ability.allowed?(user, permission, group)
end

#allowed_for_action?(user, group, action) ⇒ Boolean

Returns true if the user is allowed to perform an action within a group

Returns:

  • (Boolean)


72
73
74
75
76
77
# File 'lib/gitlab/observability.rb', line 72

def allowed_for_action?(user, group, action)
  return false if action.nil?

  permission = ACTION_TO_PERMISSION.fetch(action.to_sym, :admin_observability)
  allowed?(user, group, permission)
end

#build_full_url(group, unsanitized_observability_path, fallback_path) ⇒ Object

Builds the full Observability URL given a certan group and path

If unsanitized_observability_path is not valid or missing, fallbacks to fallback_path



90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/gitlab/observability.rb', line 90

def build_full_url(group, unsanitized_observability_path, fallback_path)
  return unless group

  # When running Observability UI in standalone mode (i.e. not backed by Observability Backend)
  # the group-id is not required. !!This is only used for local dev!!
  base_url = ENV['STANDALONE_OBSERVABILITY_UI'] == 'true' ? observability_url : "#{observability_url}/-/#{group.id}"

  sanitized_path = if unsanitized_observability_path && sanitize(unsanitized_observability_path) != ''
                     CGI.unescapeHTML(sanitize(unsanitized_observability_path))
                   else
                     fallback_path || '/'
                   end

  sanitized_path.prepend('/') if sanitized_path[0] != '/'

  "#{base_url}#{sanitized_path}"
end

#embeddable_url(url) ⇒ Object

Returns the embeddable Observability URL of a given URL

- Validates the URL
- Checks that the path is embeddable
- Converts the gitlab.com URL to observe.gitlab.com URL

e.g.

from: gitlab.com/groups/GROUP_PATH/-/observability/explore?observability_path=/explore
to observe.gitlab.com/-/GROUP_ID/explore

Returns nil if the URL is not a valid Observability URL or the path is not embeddable



57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/gitlab/observability.rb', line 57

def embeddable_url(url)
  uri = validate_url(url, Gitlab.config.gitlab.url)
  return unless uri

  group = group_from_observability_url(url)
  return unless group

  parsed_query = CGI.parse(uri.query.to_s).transform_values(&:first).symbolize_keys
  observability_path = parsed_query[:observability_path]

  return build_full_url(group, observability_path, '/') if observability_path_embeddable?(observability_path)
end

#enabled?(group = nil) ⇒ Boolean

Deprecated.

Returns true if the GitLab Observability UI (GOUI) feature flag is enabled

Returns:

  • (Boolean)


38
39
40
41
42
# File 'lib/gitlab/observability.rb', line 38

def enabled?(group = nil)
  return Feature.enabled?(:observability_group_tab, group) if group

  Feature.enabled?(:observability_group_tab)
end

#oauth_urlObject



26
27
28
# File 'lib/gitlab/observability.rb', line 26

def oauth_url
  "#{Gitlab::Observability.observability_url}/v1/auth/start"
end

#observability_urlObject

Returns the GitLab Observability URL



18
19
20
21
22
23
24
# File 'lib/gitlab/observability.rb', line 18

def observability_url
  return ENV['OVERRIDE_OBSERVABILITY_URL'] if ENV['OVERRIDE_OBSERVABILITY_URL']
  # TODO Make observability URL configurable https://gitlab.com/gitlab-org/opstrace/opstrace-ui/-/issues/80
  return 'https://observe.staging.gitlab.com' if Gitlab.staging?

  'https://observe.gitlab.com'
end

#provisioning_url(project) ⇒ Object



30
31
32
# File 'lib/gitlab/observability.rb', line 30

def provisioning_url(project)
  "#{Gitlab::Observability.observability_url}/v3/tenant/#{project.id}"
end