Class: LogBrew::TelemetryResource

Inherits:
Object
  • Object
show all
Defined in:
lib/logbrew/telemetry_resource.rb

Overview

Immutable service, deployment, runtime, framework, OS, device, and app identity.

Constant Summary collapse

SECTION_FIELDS =
{
  "service" => %w[name version].freeze,
  "deployment" => %w[environment release].freeze,
  "runtime" => %w[name version].freeze,
  "framework" => %w[name version].freeze,
  "operatingSystem" => %w[name version build].freeze,
  "device" => %w[family model architecture].freeze,
  "application" => %w[name version build].freeze
}.freeze
NAME_REQUIRED_SECTIONS =
%w[service runtime framework operatingSystem].freeze

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.createObject



17
18
19
# File 'lib/logbrew/telemetry_resource.rb', line 17

def self.create
  TelemetryResourceBuilder.new
end

.from_hash(value = nil, **keywords) ⇒ Object



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# File 'lib/logbrew/telemetry_resource.rb', line 21

def self.from_hash(value = nil, **keywords)
  if value.nil?
    value = keywords
  elsif !keywords.empty?
    raise TelemetryContextValue.invalid("telemetry resource must be one object")
  end
  object = TelemetryContextValue.object(value, "telemetry resource")
  TelemetryContextValue.reject_unknown_fields(object, SECTION_FIELDS.keys, "telemetry resource")
  raise TelemetryContextValue.invalid("telemetry resource must not be empty") if object.empty?

  normalized = {}
  SECTION_FIELDS.each do |section_name, fields|
    next unless object.key?(section_name)

    section = TelemetryContextValue.object(
      object.fetch(section_name),
      "telemetry resource #{section_name}"
    )
    TelemetryContextValue.reject_unknown_fields(
      section,
      fields,
      "telemetry resource #{section_name}"
    )
    normalized_section = {}
    fields.each do |field|
      next unless section.key?(field)

      normalized_section[field] = TelemetryContextValue.required_string(
        section.fetch(field),
        "telemetry resource #{section_name} #{field}"
      )
    end
    if NAME_REQUIRED_SECTIONS.include?(section_name) && !normalized_section.key?("name")
      raise TelemetryContextValue.invalid("telemetry resource #{section_name} name is required")
    end
    if normalized_section.empty?
      raise TelemetryContextValue.invalid("telemetry resource #{section_name} must not be empty")
    end
    normalized[section_name] = normalized_section
  end

  new(normalized)
end

.merge(base, override) ⇒ Object



65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# File 'lib/logbrew/telemetry_resource.rb', line 65

def self.merge(base, override)
  require_resource_or_nil(base, "base telemetry resource")
  require_resource_or_nil(override, "override telemetry resource")
  return nil if base.nil? && override.nil?
  return from_hash(override.to_h) if base.nil?
  return from_hash(base.to_h) if override.nil?

  base_value = base.to_h
  override_value = override.to_h
  merged = {}
  SECTION_FIELDS.each_key do |section|
    base_section = base_value[section]
    override_section = override_value[section]
    next if base_section.nil? && override_section.nil?

    merged[section] = (base_section || {}).merge(override_section || {})
  end
  from_hash(merged)
end

Instance Method Details

#to_hObject



85
86
87
# File 'lib/logbrew/telemetry_resource.rb', line 85

def to_h
  TelemetryContextValue.deep_copy(@value)
end