Module: Daytona

Defined in:
lib/daytona/git.rb,
lib/daytona/sdk.rb,
lib/daytona/otel.rb,
lib/daytona/util.rb,
lib/daytona/config.rb,
lib/daytona/volume.rb,
lib/daytona/daytona.rb,
lib/daytona/process.rb,
lib/daytona/sandbox.rb,
lib/daytona/common/git.rb,
lib/daytona/common/pty.rb,
lib/daytona/lsp_server.rb,
lib/daytona/file_system.rb,
lib/daytona/sdk/version.rb,
lib/daytona/common/image.rb,
lib/daytona/computer_use.rb,
lib/daytona/common/charts.rb,
lib/daytona/common/daytona.rb,
lib/daytona/common/process.rb,
lib/daytona/object_storage.rb,
lib/daytona/volume_service.rb,
lib/daytona/common/response.rb,
lib/daytona/common/snapshot.rb,
lib/daytona/code_interpreter.rb,
lib/daytona/common/resources.rb,
lib/daytona/snapshot_service.rb,
lib/daytona/common/file_system.rb,
lib/daytona/common/code_language.rb,
lib/daytona/common/code_interpreter.rb,
lib/daytona/code_toolbox/sandbox_js_code_toolbox.rb,
lib/daytona/code_toolbox/sandbox_ts_code_toolbox.rb,
lib/daytona/code_toolbox/sandbox_python_code_toolbox.rb

Defined Under Namespace

Modules: Charts, CodeLanguage, Instrumentation, Sdk, Util Classes: CodeInterpreter, CodeRunParams, ComputerUse, Config, Context, CreateSandboxBaseParams, CreateSandboxFromImageParams, CreateSandboxFromSnapshotParams, CreateSnapshotParams, Daytona, ExecuteResponse, ExecutionArtifacts, ExecutionError, ExecutionResult, FileSystem, FileUpload, Git, GitCommitResponse, Image, LspServer, ObjectStorage, OtelState, OutputMessage, PaginatedResource, Process, PtyHandle, PtyResult, PtySize, Resources, Sandbox, SandboxJsCodeToolbox, SandboxPythonCodeToolbox, SandboxTsCodeToolbox, SessionCommandLogsResponse, SessionExecuteRequest, SessionExecuteResponse, Snapshot, SnapshotService, Volume, VolumeService

Class Method Summary collapse

Class Method Details

.init_otel(sdk_version) ⇒ OtelState

Initializes OTel providers, sets globals, installs Typhoeus propagation. OTel gems are required lazily so they are never loaded when disabled.

Parameters:

  • sdk_version (String)

Returns:



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
64
65
66
67
68
69
70
71
72
# File 'lib/daytona/otel.rb', line 38

def self.init_otel(sdk_version) # rubocop:disable Metrics/MethodLength
  require 'opentelemetry-sdk'
  require 'opentelemetry-metrics-sdk'
  require 'opentelemetry-exporter-otlp'
  require 'opentelemetry-exporter-otlp-metrics'

  resource = OpenTelemetry::SDK::Resources::Resource.create(
    'service.name' => 'daytona-ruby-sdk',
    'service.version' => sdk_version
  )

  tracer_provider = OpenTelemetry::SDK::Trace::TracerProvider.new(resource:)
  tracer_provider.add_span_processor(
    OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
      OpenTelemetry::Exporter::OTLP::Exporter.new
    )
  )
  OpenTelemetry.tracer_provider = tracer_provider

  meter_provider = OpenTelemetry::SDK::Metrics::MeterProvider.new(resource:)
  meter_provider.add_metric_reader(
    OpenTelemetry::SDK::Metrics::Export::PeriodicMetricReader.new(
      exporter: OpenTelemetry::Exporter::OTLP::Metrics::MetricsExporter.new
    )
  )
  OpenTelemetry.meter_provider = meter_provider

  tracer = tracer_provider.tracer('daytona-ruby-sdk', sdk_version)
  meter = meter_provider.meter('daytona-ruby-sdk')

  # Install Typhoeus trace-context propagation
  install_typhoeus_propagation

  OtelState.new(tracer_provider:, meter_provider:, tracer:, meter:)
end

.install_typhoeus_propagationObject

Installs Typhoeus.before callback for W3C trace-context propagation.



129
130
131
132
133
134
135
136
137
# File 'lib/daytona/otel.rb', line 129

def self.install_typhoeus_propagation
  return unless defined?(Typhoeus)

  Typhoeus.before do |request|
    headers = request.options[:headers] ||= {}
    OpenTelemetry.propagation.inject(headers)
    true
  end
end

.shutdown_otel(state) ⇒ Object

Flushes and shuts down OTel providers.



75
76
77
# File 'lib/daytona/otel.rb', line 75

def self.shutdown_otel(state)
  state&.shutdown
end

.to_snake_case(str) ⇒ Object

Converts “ClassName.method_name” to “class_name_method_name”.



114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/daytona/otel.rb', line 114

def self.to_snake_case(str)
  result = +''
  str.each_char.with_index do |char, i|
    if char == '.'
      result << '_'
    elsif char =~ /[A-Z]/ && i > 0 && str[i - 1] != '.'
      result << '_' << char.downcase
    else
      result << char.downcase
    end
  end
  result
end

.with_instrumentation(otel_state, component, method_name, &block) ⇒ Object

Wraps a block with OTel span creation and duration histogram recording. When otel_state is nil (OTel disabled), calls the block directly.

Parameters:

  • otel_state (OtelState, nil)
  • component (String)
  • method_name (String)

Returns:

  • (Object)

    The block’s return value



86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
# File 'lib/daytona/otel.rb', line 86

def self.with_instrumentation(otel_state, component, method_name, &block) # rubocop:disable Metrics/MethodLength
  return block.call unless otel_state

  span_name = "#{component}.#{method_name}"
  metric_name = "#{to_snake_case(span_name)}_duration"
  status = 'success'

  otel_state.tracer.in_span(
    span_name,
    attributes: { 'component' => component, 'method' => method_name }
  ) do |_span|
    start_time = ::Process.clock_gettime(::Process::CLOCK_MONOTONIC)
    begin
      block.call
    rescue StandardError => e
      status = 'error'
      raise e
    ensure
      duration_ms = (::Process.clock_gettime(::Process::CLOCK_MONOTONIC) - start_time) * 1000.0
      otel_state.histogram(metric_name).record(
        duration_ms,
        attributes: { 'component' => component, 'method' => method_name, 'status' => status }
      )
    end
  end
end