Class: Observability::GroupO11ySetting

Inherits:
ApplicationRecord show all
Defined in:
app/models/observability/group_o11y_setting.rb

Constant Summary collapse

HUMANIZED_ATTRIBUTES =
{
  o11y_service_url: 'O11y service name'
}.freeze
SETUP_WINDOW =
5.minutes

Constants inherited from ApplicationRecord

ApplicationRecord::MAX_PLUCK

Constants included from HasCheckConstraints

HasCheckConstraints::NOT_NULL_CHECK_PATTERN

Constants included from ResetOnColumnErrors

ResetOnColumnErrors::MAX_RESET_PERIOD

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from ApplicationRecord

===, cached_column_list, #create_or_load_association, current_transaction, declarative_enum, default_select_columns, delete_all_returning, #deleted_from_database?, id_in, id_not_in, iid_in, nullable_column?, primary_key_in, #readable_by?, safe_ensure_unique, safe_find_or_create_by, safe_find_or_create_by!, #to_ability_name, underscore, where_exists, where_not_exists, with_fast_read_statement_timeout, without_order

Methods included from Organizations::Sharding

#sharding_organization

Methods included from ResetOnColumnErrors

#reset_on_union_error, #reset_on_unknown_attribute_error

Methods included from Gitlab::SensitiveSerializableHash

#serializable_hash

Instance Attribute Details

#o11y_service_nameObject



60
61
62
# File 'app/models/observability/group_o11y_setting.rb', line 60

def o11y_service_name
  @o11y_service_name || name_from_url || name_from_group
end

Class Method Details

.find_by_group_id(group_id) ⇒ Object



33
34
35
# File 'app/models/observability/group_o11y_setting.rb', line 33

def self.find_by_group_id(group_id)
  find_by(group_id: group_id)
end

.human_attribute_name(attribute, *options) ⇒ Object



37
38
39
# File 'app/models/observability/group_o11y_setting.rb', line 37

def self.human_attribute_name(attribute, *options)
  HUMANIZED_ATTRIBUTES[attribute.to_sym] || super
end

.observability_setting_for(resource) ⇒ Object



41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'app/models/observability/group_o11y_setting.rb', line 41

def self.observability_setting_for(resource)
  return unless resource

  group = resource.is_a?(Project) ? resource.group : resource
  return unless group.is_a?(Group)

  ancestor_ids = group.traversal_ids.reverse
  return if ancestor_ids.empty?

  # Find the first setting matching any ancestor, maintaining hierarchy order
  # by using array_position to preserve the order from ancestor_ids
  group_id_attribute = arel_table[:group_id]
  array_sql = "array_position(ARRAY[#{ancestor_ids.join(',')}]::bigint[], " \
    "#{group_id_attribute.relation.name}.#{group_id_attribute.name})"
  where(group_id: ancestor_ids)
    .order(Arel.sql(array_sql))
    .first
end

Instance Method Details

#name_from_groupObject



70
71
72
# File 'app/models/observability/group_o11y_setting.rb', line 70

def name_from_group
  group&.full_path&.to_s&.tr('/', '-')
end

#name_from_urlObject



64
65
66
67
68
# File 'app/models/observability/group_o11y_setting.rb', line 64

def name_from_url
  return unless o11y_service_url

  o11y_service_url.to_s.gsub(%r{https://|\.gitlab-o11y\.com}, '')
end

#otel_addressObject



97
98
99
# File 'app/models/observability/group_o11y_setting.rb', line 97

def otel_address
  "#{o11y_service_name}.otel.gitlab-o11y.com"
end

#otel_grpc_endpointObject



93
94
95
# File 'app/models/observability/group_o11y_setting.rb', line 93

def otel_grpc_endpoint
  "http://#{otel_address}:4317"
end

#otel_http_endpointObject



89
90
91
# File 'app/models/observability/group_o11y_setting.rb', line 89

def otel_http_endpoint
  "http://#{otel_address}:4318"
end

#provisioning?Boolean

Returns:

  • (Boolean)


85
86
87
# File 'app/models/observability/group_o11y_setting.rb', line 85

def provisioning?
  within_provisioning_window? || new_record?
end

#validate_email_formatObject



74
75
76
77
78
79
80
81
82
83
# File 'app/models/observability/group_o11y_setting.rb', line 74

def validate_email_format
  if o11y_service_user_email.blank?
    errors.add(:o11y_service_user_email, I18n.t(:invalid, scope: 'activerecord.errors.messages'))
    return
  end

  return if ValidateEmail.valid?(o11y_service_user_email)

  errors.add(:o11y_service_user_email, I18n.t(:invalid, scope: 'valid_email.validations.email'))
end