foam-ruby 0.1.0.alpha1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/README.md +121 -0
- data/lib/foam/ruby/configuration.rb +38 -0
- data/lib/foam/ruby/log_subscriber.rb +71 -0
- data/lib/foam/ruby/otel_setup.rb +56 -0
- data/lib/foam/ruby/version.rb +7 -0
- data/lib/foam/ruby.rb +96 -0
- data/lib/foam-ruby.rb +3 -0
- metadata +232 -0
checksums.yaml
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
---
|
|
2
|
+
SHA256:
|
|
3
|
+
metadata.gz: 6fd659f190b92247bff589dafeed2d7ac4c8cb5897b6dc20e779914b65911f63
|
|
4
|
+
data.tar.gz: f1861ab90f5a331225bb0ee36eefe5bf32ede8a373bd668cfeeed493542633a2
|
|
5
|
+
SHA512:
|
|
6
|
+
metadata.gz: 596c7ec442d2cfc7e50bb9ef265c346e671910e237868ae73560751e1df867cb7363632a0b0486b108b7bfb776ea6a2c93f1d18a686f318405c293f71bc80a10
|
|
7
|
+
data.tar.gz: adc51e59deeb2f121d2f5e39892931b58e410b8c50726189b8cf4b09242e0725d085c06802ff1c609fcc3119440e31032bbafe55d72c4af9f8fe1388435a692e
|
data/README.md
ADDED
|
@@ -0,0 +1,121 @@
|
|
|
1
|
+
# foam-ruby
|
|
2
|
+
|
|
3
|
+
Foam observability for Ruby on Rails — logs, traces, and errors via OpenTelemetry.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
Add to your Gemfile:
|
|
8
|
+
|
|
9
|
+
```ruby
|
|
10
|
+
gem "foam-ruby"
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Then run:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
bundle install
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
Create an initializer at `config/initializers/foam.rb`:
|
|
22
|
+
|
|
23
|
+
```ruby
|
|
24
|
+
Foam::Ruby.init(
|
|
25
|
+
api_key: ENV["FOAM_API_KEY"],
|
|
26
|
+
service_name: "my-rails-app"
|
|
27
|
+
)
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
That's it. The gem will:
|
|
31
|
+
|
|
32
|
+
1. **Traces** — Auto-instrument Rails controllers, ActiveRecord queries, and Rack requests via OpenTelemetry
|
|
33
|
+
2. **Logs** — Bridge `Rails.logger` calls to OTel log records (your existing `Rails.logger.info "..."` calls automatically emit telemetry)
|
|
34
|
+
3. **Errors** — `Foam::Ruby.capture_exception(e)` to record exceptions on the active trace span with full trace context
|
|
35
|
+
|
|
36
|
+
## Configuration
|
|
37
|
+
|
|
38
|
+
### Block syntax
|
|
39
|
+
|
|
40
|
+
```ruby
|
|
41
|
+
Foam::Ruby.configure do |c|
|
|
42
|
+
c.api_key = ENV["FOAM_API_KEY"]
|
|
43
|
+
c.service_name = "my-rails-app"
|
|
44
|
+
c.traces_enabled = true
|
|
45
|
+
c.logs_enabled = true
|
|
46
|
+
end
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### Environment variables
|
|
50
|
+
|
|
51
|
+
| Variable | Description | Default |
|
|
52
|
+
|---|---|---|
|
|
53
|
+
| `FOAM_API_KEY` | Your Foam API key | — |
|
|
54
|
+
| `OTEL_SERVICE_NAME` | Service name for telemetry | `rails-app` |
|
|
55
|
+
| `FOAM_OTEL_ENDPOINT` | OTLP collector endpoint | `https://otel.api.foam.ai` |
|
|
56
|
+
|
|
57
|
+
### Disabling signals
|
|
58
|
+
|
|
59
|
+
```ruby
|
|
60
|
+
Foam::Ruby.init(
|
|
61
|
+
api_key: ENV["FOAM_API_KEY"],
|
|
62
|
+
service_name: "my-rails-app",
|
|
63
|
+
traces: false, # disable trace collection
|
|
64
|
+
logs: true
|
|
65
|
+
)
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## How It Works
|
|
69
|
+
|
|
70
|
+
### Rails.logger → OTel Logs
|
|
71
|
+
|
|
72
|
+
The gem attaches an OTel-emitting logger to `Rails.logger` using Rails 7.1+ `BroadcastLogger`. Your existing logging code works unchanged:
|
|
73
|
+
|
|
74
|
+
```ruby
|
|
75
|
+
Rails.logger.info "User signed up"
|
|
76
|
+
Rails.logger.warn "Rate limit approaching"
|
|
77
|
+
Rails.logger.error "Payment failed"
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Each call emits an OpenTelemetry log record with:
|
|
81
|
+
- The log message body
|
|
82
|
+
- Severity level (DEBUG/INFO/WARN/ERROR/FATAL)
|
|
83
|
+
- Trace context (span ID / trace ID) when inside an active span
|
|
84
|
+
|
|
85
|
+
### Error Capture
|
|
86
|
+
|
|
87
|
+
Use `capture_exception` to record errors on the active span with trace context:
|
|
88
|
+
|
|
89
|
+
```ruby
|
|
90
|
+
begin
|
|
91
|
+
risky_operation
|
|
92
|
+
rescue => e
|
|
93
|
+
Foam::Ruby.capture_exception(e)
|
|
94
|
+
# handle error...
|
|
95
|
+
end
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Additional Instrumentations
|
|
99
|
+
|
|
100
|
+
Pass extra OpenTelemetry instrumentations:
|
|
101
|
+
|
|
102
|
+
```ruby
|
|
103
|
+
Foam::Ruby.init(
|
|
104
|
+
api_key: ENV["FOAM_API_KEY"],
|
|
105
|
+
service_name: "my-rails-app",
|
|
106
|
+
instrumentations: [
|
|
107
|
+
"OpenTelemetry::Instrumentation::Sidekiq",
|
|
108
|
+
"OpenTelemetry::Instrumentation::Redis",
|
|
109
|
+
]
|
|
110
|
+
)
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Rails Compatibility
|
|
114
|
+
|
|
115
|
+
- **Rails 7.1+**: Full support with `BroadcastLogger` for log bridging
|
|
116
|
+
- **Rails 7.0 and below**: Falls back to `ActiveSupport::Logger.broadcast`
|
|
117
|
+
- **Ruby**: >= 3.0
|
|
118
|
+
|
|
119
|
+
## License
|
|
120
|
+
|
|
121
|
+
MIT
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Foam
|
|
4
|
+
module Ruby
|
|
5
|
+
class Configuration
|
|
6
|
+
FOAM_OTEL_ENDPOINT = "https://otel.api.foam.ai"
|
|
7
|
+
|
|
8
|
+
attr_accessor :api_key, :service_name, :endpoint,
|
|
9
|
+
:traces_enabled, :logs_enabled,
|
|
10
|
+
:additional_instrumentations
|
|
11
|
+
|
|
12
|
+
def initialize
|
|
13
|
+
@api_key = ENV["FOAM_API_KEY"]
|
|
14
|
+
@service_name = ENV.fetch("OTEL_SERVICE_NAME", "rails-app")
|
|
15
|
+
@endpoint = ENV.fetch("FOAM_OTEL_ENDPOINT", FOAM_OTEL_ENDPOINT)
|
|
16
|
+
@traces_enabled = true
|
|
17
|
+
@logs_enabled = true
|
|
18
|
+
@additional_instrumentations = []
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def otel_headers
|
|
22
|
+
{ "Authorization" => "Bearer #{api_key}" }
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def traces_endpoint
|
|
26
|
+
"#{endpoint}/v1/traces"
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def logs_endpoint
|
|
30
|
+
"#{endpoint}/v1/logs"
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def valid?
|
|
34
|
+
!api_key.nil? && !api_key.empty?
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "logger"
|
|
4
|
+
|
|
5
|
+
module Foam
|
|
6
|
+
module Ruby
|
|
7
|
+
# Emits OTel log records. Attached to Rails.logger as a broadcast
|
|
8
|
+
# destination so existing log output (stdout, file, etc.) is preserved.
|
|
9
|
+
class OtelLogDevice
|
|
10
|
+
SEVERITY_MAP = {
|
|
11
|
+
Logger::DEBUG => OpenTelemetry::Logs::SeverityNumber::SEVERITY_NUMBER_DEBUG,
|
|
12
|
+
Logger::INFO => OpenTelemetry::Logs::SeverityNumber::SEVERITY_NUMBER_INFO,
|
|
13
|
+
Logger::WARN => OpenTelemetry::Logs::SeverityNumber::SEVERITY_NUMBER_WARN,
|
|
14
|
+
Logger::ERROR => OpenTelemetry::Logs::SeverityNumber::SEVERITY_NUMBER_ERROR,
|
|
15
|
+
Logger::FATAL => OpenTelemetry::Logs::SeverityNumber::SEVERITY_NUMBER_FATAL,
|
|
16
|
+
}.freeze
|
|
17
|
+
|
|
18
|
+
SEVERITY_TEXT = {
|
|
19
|
+
Logger::DEBUG => "DEBUG",
|
|
20
|
+
Logger::INFO => "INFO",
|
|
21
|
+
Logger::WARN => "WARN",
|
|
22
|
+
Logger::ERROR => "ERROR",
|
|
23
|
+
Logger::FATAL => "FATAL",
|
|
24
|
+
}.freeze
|
|
25
|
+
|
|
26
|
+
def initialize
|
|
27
|
+
@otel_logger = OpenTelemetry.logger_provider.logger(name: "foam-ruby")
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
def emit(severity, message)
|
|
31
|
+
return if message.nil? || (message.respond_to?(:empty?) && message.empty?)
|
|
32
|
+
|
|
33
|
+
span_context = OpenTelemetry::Trace.current_span.context
|
|
34
|
+
|
|
35
|
+
@otel_logger.on_emit(
|
|
36
|
+
body: message.to_s,
|
|
37
|
+
severity_number: SEVERITY_MAP.fetch(severity, OpenTelemetry::Logs::SeverityNumber::SEVERITY_NUMBER_INFO),
|
|
38
|
+
severity_text: SEVERITY_TEXT.fetch(severity, "INFO"),
|
|
39
|
+
span_context: span_context.valid? ? span_context : nil,
|
|
40
|
+
timestamp: Time.now
|
|
41
|
+
)
|
|
42
|
+
rescue StandardError => e
|
|
43
|
+
warn "[foam-ruby] Failed to emit OTel log record: #{e.message}"
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
# No-op IO stand-in so ::Logger internals never hit nil.
|
|
48
|
+
class NullLogDevice
|
|
49
|
+
def write(_msg) = nil
|
|
50
|
+
def close = nil
|
|
51
|
+
def reopen(_log = nil) = nil
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
# Logger subclass that forwards every #add call to OtelLogDevice.
|
|
55
|
+
# Designed to be broadcast-attached to Rails.logger, not used standalone.
|
|
56
|
+
# Does no level filtering — the parent BroadcastLogger already decided
|
|
57
|
+
# this message should be delivered.
|
|
58
|
+
class OtelLogger < ::Logger
|
|
59
|
+
def initialize
|
|
60
|
+
super(NullLogDevice.new)
|
|
61
|
+
@otel_device = OtelLogDevice.new
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
def add(severity, message = nil, progname = nil, &block)
|
|
65
|
+
msg = message || (block ? block.call : progname)
|
|
66
|
+
@otel_device.emit(severity || ::Logger::INFO, msg)
|
|
67
|
+
true
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "opentelemetry/sdk"
|
|
4
|
+
require "opentelemetry-exporter-otlp"
|
|
5
|
+
require "opentelemetry-logs-api"
|
|
6
|
+
require "opentelemetry-logs-sdk"
|
|
7
|
+
|
|
8
|
+
module Foam
|
|
9
|
+
module Ruby
|
|
10
|
+
module OtelSetup
|
|
11
|
+
module_function
|
|
12
|
+
|
|
13
|
+
def configure!(config)
|
|
14
|
+
configure_traces(config) if config.traces_enabled
|
|
15
|
+
configure_logs(config) if config.logs_enabled
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def configure_traces(config)
|
|
19
|
+
OpenTelemetry::SDK.configure do |c|
|
|
20
|
+
c.service_name = config.service_name
|
|
21
|
+
|
|
22
|
+
c.add_span_processor(
|
|
23
|
+
OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new(
|
|
24
|
+
OpenTelemetry::Exporter::OTLP::Exporter.new(
|
|
25
|
+
endpoint: config.traces_endpoint,
|
|
26
|
+
headers: config.otel_headers
|
|
27
|
+
)
|
|
28
|
+
)
|
|
29
|
+
)
|
|
30
|
+
|
|
31
|
+
c.use "OpenTelemetry::Instrumentation::Rack"
|
|
32
|
+
c.use "OpenTelemetry::Instrumentation::ActionPack"
|
|
33
|
+
c.use "OpenTelemetry::Instrumentation::ActiveRecord"
|
|
34
|
+
c.use "OpenTelemetry::Instrumentation::ActiveSupport"
|
|
35
|
+
c.use "OpenTelemetry::Instrumentation::Rails"
|
|
36
|
+
|
|
37
|
+
config.additional_instrumentations.each do |instrumentation|
|
|
38
|
+
c.use instrumentation
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def configure_logs(config)
|
|
44
|
+
exporter = OpenTelemetry::Exporter::OTLP::LogRecordExporter.new(
|
|
45
|
+
endpoint: config.logs_endpoint,
|
|
46
|
+
headers: config.otel_headers
|
|
47
|
+
)
|
|
48
|
+
|
|
49
|
+
processor = OpenTelemetry::SDK::Logs::Export::BatchLogRecordProcessor.new(exporter)
|
|
50
|
+
logger_provider = OpenTelemetry::SDK::Logs::LoggerProvider.new
|
|
51
|
+
logger_provider.add_log_record_processor(processor)
|
|
52
|
+
OpenTelemetry.logger_provider = logger_provider
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end
|
|
56
|
+
end
|
data/lib/foam/ruby.rb
ADDED
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "opentelemetry/sdk"
|
|
4
|
+
require "opentelemetry-logs-api"
|
|
5
|
+
|
|
6
|
+
require_relative "ruby/version"
|
|
7
|
+
require_relative "ruby/configuration"
|
|
8
|
+
require_relative "ruby/otel_setup"
|
|
9
|
+
require_relative "ruby/log_subscriber"
|
|
10
|
+
|
|
11
|
+
module Foam
|
|
12
|
+
module Ruby
|
|
13
|
+
class << self
|
|
14
|
+
def configuration
|
|
15
|
+
@configuration ||= Configuration.new
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def configure
|
|
19
|
+
yield(configuration) if block_given?
|
|
20
|
+
configuration
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def init(api_key: nil, service_name: nil, endpoint: nil, **options)
|
|
24
|
+
configure do |c|
|
|
25
|
+
c.api_key = api_key if api_key
|
|
26
|
+
c.service_name = service_name if service_name
|
|
27
|
+
c.endpoint = endpoint if endpoint
|
|
28
|
+
c.traces_enabled = options.fetch(:traces, true)
|
|
29
|
+
c.logs_enabled = options.fetch(:logs, true)
|
|
30
|
+
c.additional_instrumentations = options[:instrumentations] || []
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
unless configuration.valid?
|
|
34
|
+
warn "[foam-ruby] Missing api_key — set FOAM_API_KEY or pass api_key: to Foam::Ruby.init"
|
|
35
|
+
return
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
OtelSetup.configure!(configuration)
|
|
39
|
+
schedule_logger_attach! if configuration.logs_enabled
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def capture_exception(error, attributes: {})
|
|
43
|
+
span = OpenTelemetry::Trace.current_span
|
|
44
|
+
return unless span && span.context.valid?
|
|
45
|
+
|
|
46
|
+
raw_parent = span.instance_variable_get(:@parent_span_id)
|
|
47
|
+
parent_id = raw_parent&.unpack1("H*")
|
|
48
|
+
parent_id = nil if parent_id.nil? || parent_id == ("0" * 16)
|
|
49
|
+
|
|
50
|
+
attrs = attributes.merge(
|
|
51
|
+
"trace_id" => span.context.hex_trace_id,
|
|
52
|
+
"span_id" => span.context.hex_span_id
|
|
53
|
+
)
|
|
54
|
+
attrs["parent_span_id"] = parent_id if parent_id
|
|
55
|
+
|
|
56
|
+
span.record_exception(error, attributes: attrs)
|
|
57
|
+
span.status = OpenTelemetry::Trace::Status.error(error.message)
|
|
58
|
+
rescue StandardError => e
|
|
59
|
+
warn "[foam-ruby] capture_exception failed: #{e.message}"
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
|
|
64
|
+
def schedule_logger_attach!
|
|
65
|
+
return unless defined?(::Rails)
|
|
66
|
+
|
|
67
|
+
if ::Rails.respond_to?(:application) && ::Rails.application
|
|
68
|
+
::Rails.application.config.after_initialize { do_attach_otel_logger! }
|
|
69
|
+
else
|
|
70
|
+
do_attach_otel_logger!
|
|
71
|
+
end
|
|
72
|
+
rescue StandardError => e
|
|
73
|
+
warn "[foam-ruby] Failed to schedule OTel logger attach: #{e.message}"
|
|
74
|
+
end
|
|
75
|
+
|
|
76
|
+
def do_attach_otel_logger!
|
|
77
|
+
return unless ::Rails.respond_to?(:logger) && ::Rails.logger
|
|
78
|
+
|
|
79
|
+
unless OpenTelemetry.logger_provider.is_a?(OpenTelemetry::SDK::Logs::LoggerProvider)
|
|
80
|
+
warn "[foam-ruby] OTel logger provider not configured — call Foam::Ruby.init before attaching logger"
|
|
81
|
+
return
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
otel_logger = OtelLogger.new
|
|
85
|
+
|
|
86
|
+
if ::Rails.logger.respond_to?(:broadcast_to)
|
|
87
|
+
::Rails.logger.broadcast_to(otel_logger)
|
|
88
|
+
elsif defined?(::ActiveSupport::Logger) && ::ActiveSupport::Logger.respond_to?(:broadcast)
|
|
89
|
+
::Rails.logger.extend(::ActiveSupport::Logger.broadcast(otel_logger))
|
|
90
|
+
end
|
|
91
|
+
rescue StandardError => e
|
|
92
|
+
warn "[foam-ruby] Failed to attach OTel logger to Rails.logger: #{e.message}"
|
|
93
|
+
end
|
|
94
|
+
end
|
|
95
|
+
end
|
|
96
|
+
end
|
data/lib/foam-ruby.rb
ADDED
metadata
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
|
2
|
+
name: foam-ruby
|
|
3
|
+
version: !ruby/object:Gem::Version
|
|
4
|
+
version: 0.1.0.alpha1
|
|
5
|
+
platform: ruby
|
|
6
|
+
authors:
|
|
7
|
+
- Foam
|
|
8
|
+
autorequire:
|
|
9
|
+
bindir: bin
|
|
10
|
+
cert_chain: []
|
|
11
|
+
date: 2026-04-14 00:00:00.000000000 Z
|
|
12
|
+
dependencies:
|
|
13
|
+
- !ruby/object:Gem::Dependency
|
|
14
|
+
name: opentelemetry-api
|
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
|
16
|
+
requirements:
|
|
17
|
+
- - "~>"
|
|
18
|
+
- !ruby/object:Gem::Version
|
|
19
|
+
version: '1.0'
|
|
20
|
+
type: :runtime
|
|
21
|
+
prerelease: false
|
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
23
|
+
requirements:
|
|
24
|
+
- - "~>"
|
|
25
|
+
- !ruby/object:Gem::Version
|
|
26
|
+
version: '1.0'
|
|
27
|
+
- !ruby/object:Gem::Dependency
|
|
28
|
+
name: opentelemetry-sdk
|
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
|
30
|
+
requirements:
|
|
31
|
+
- - "~>"
|
|
32
|
+
- !ruby/object:Gem::Version
|
|
33
|
+
version: '1.0'
|
|
34
|
+
type: :runtime
|
|
35
|
+
prerelease: false
|
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
37
|
+
requirements:
|
|
38
|
+
- - "~>"
|
|
39
|
+
- !ruby/object:Gem::Version
|
|
40
|
+
version: '1.0'
|
|
41
|
+
- !ruby/object:Gem::Dependency
|
|
42
|
+
name: opentelemetry-exporter-otlp
|
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
|
44
|
+
requirements:
|
|
45
|
+
- - "~>"
|
|
46
|
+
- !ruby/object:Gem::Version
|
|
47
|
+
version: '0.29'
|
|
48
|
+
type: :runtime
|
|
49
|
+
prerelease: false
|
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
51
|
+
requirements:
|
|
52
|
+
- - "~>"
|
|
53
|
+
- !ruby/object:Gem::Version
|
|
54
|
+
version: '0.29'
|
|
55
|
+
- !ruby/object:Gem::Dependency
|
|
56
|
+
name: opentelemetry-logs-api
|
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
|
58
|
+
requirements:
|
|
59
|
+
- - "~>"
|
|
60
|
+
- !ruby/object:Gem::Version
|
|
61
|
+
version: '0.1'
|
|
62
|
+
type: :runtime
|
|
63
|
+
prerelease: false
|
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
65
|
+
requirements:
|
|
66
|
+
- - "~>"
|
|
67
|
+
- !ruby/object:Gem::Version
|
|
68
|
+
version: '0.1'
|
|
69
|
+
- !ruby/object:Gem::Dependency
|
|
70
|
+
name: opentelemetry-logs-sdk
|
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
|
72
|
+
requirements:
|
|
73
|
+
- - "~>"
|
|
74
|
+
- !ruby/object:Gem::Version
|
|
75
|
+
version: '0.1'
|
|
76
|
+
type: :runtime
|
|
77
|
+
prerelease: false
|
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
79
|
+
requirements:
|
|
80
|
+
- - "~>"
|
|
81
|
+
- !ruby/object:Gem::Version
|
|
82
|
+
version: '0.1'
|
|
83
|
+
- !ruby/object:Gem::Dependency
|
|
84
|
+
name: opentelemetry-instrumentation-rails
|
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
|
86
|
+
requirements:
|
|
87
|
+
- - "~>"
|
|
88
|
+
- !ruby/object:Gem::Version
|
|
89
|
+
version: '0.31'
|
|
90
|
+
type: :runtime
|
|
91
|
+
prerelease: false
|
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
93
|
+
requirements:
|
|
94
|
+
- - "~>"
|
|
95
|
+
- !ruby/object:Gem::Version
|
|
96
|
+
version: '0.31'
|
|
97
|
+
- !ruby/object:Gem::Dependency
|
|
98
|
+
name: opentelemetry-instrumentation-rack
|
|
99
|
+
requirement: !ruby/object:Gem::Requirement
|
|
100
|
+
requirements:
|
|
101
|
+
- - "~>"
|
|
102
|
+
- !ruby/object:Gem::Version
|
|
103
|
+
version: '0.24'
|
|
104
|
+
type: :runtime
|
|
105
|
+
prerelease: false
|
|
106
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
107
|
+
requirements:
|
|
108
|
+
- - "~>"
|
|
109
|
+
- !ruby/object:Gem::Version
|
|
110
|
+
version: '0.24'
|
|
111
|
+
- !ruby/object:Gem::Dependency
|
|
112
|
+
name: opentelemetry-instrumentation-active_record
|
|
113
|
+
requirement: !ruby/object:Gem::Requirement
|
|
114
|
+
requirements:
|
|
115
|
+
- - "~>"
|
|
116
|
+
- !ruby/object:Gem::Version
|
|
117
|
+
version: '0.7'
|
|
118
|
+
type: :runtime
|
|
119
|
+
prerelease: false
|
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
121
|
+
requirements:
|
|
122
|
+
- - "~>"
|
|
123
|
+
- !ruby/object:Gem::Version
|
|
124
|
+
version: '0.7'
|
|
125
|
+
- !ruby/object:Gem::Dependency
|
|
126
|
+
name: opentelemetry-instrumentation-action_pack
|
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
|
128
|
+
requirements:
|
|
129
|
+
- - "~>"
|
|
130
|
+
- !ruby/object:Gem::Version
|
|
131
|
+
version: '0.9'
|
|
132
|
+
type: :runtime
|
|
133
|
+
prerelease: false
|
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
135
|
+
requirements:
|
|
136
|
+
- - "~>"
|
|
137
|
+
- !ruby/object:Gem::Version
|
|
138
|
+
version: '0.9'
|
|
139
|
+
- !ruby/object:Gem::Dependency
|
|
140
|
+
name: opentelemetry-instrumentation-active_support
|
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
|
142
|
+
requirements:
|
|
143
|
+
- - "~>"
|
|
144
|
+
- !ruby/object:Gem::Version
|
|
145
|
+
version: '0.6'
|
|
146
|
+
type: :runtime
|
|
147
|
+
prerelease: false
|
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
149
|
+
requirements:
|
|
150
|
+
- - "~>"
|
|
151
|
+
- !ruby/object:Gem::Version
|
|
152
|
+
version: '0.6'
|
|
153
|
+
- !ruby/object:Gem::Dependency
|
|
154
|
+
name: rake
|
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
|
156
|
+
requirements:
|
|
157
|
+
- - "~>"
|
|
158
|
+
- !ruby/object:Gem::Version
|
|
159
|
+
version: '13.0'
|
|
160
|
+
type: :development
|
|
161
|
+
prerelease: false
|
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
163
|
+
requirements:
|
|
164
|
+
- - "~>"
|
|
165
|
+
- !ruby/object:Gem::Version
|
|
166
|
+
version: '13.0'
|
|
167
|
+
- !ruby/object:Gem::Dependency
|
|
168
|
+
name: rspec
|
|
169
|
+
requirement: !ruby/object:Gem::Requirement
|
|
170
|
+
requirements:
|
|
171
|
+
- - "~>"
|
|
172
|
+
- !ruby/object:Gem::Version
|
|
173
|
+
version: '3.0'
|
|
174
|
+
type: :development
|
|
175
|
+
prerelease: false
|
|
176
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
177
|
+
requirements:
|
|
178
|
+
- - "~>"
|
|
179
|
+
- !ruby/object:Gem::Version
|
|
180
|
+
version: '3.0'
|
|
181
|
+
- !ruby/object:Gem::Dependency
|
|
182
|
+
name: rubocop
|
|
183
|
+
requirement: !ruby/object:Gem::Requirement
|
|
184
|
+
requirements:
|
|
185
|
+
- - "~>"
|
|
186
|
+
- !ruby/object:Gem::Version
|
|
187
|
+
version: '1.0'
|
|
188
|
+
type: :development
|
|
189
|
+
prerelease: false
|
|
190
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
191
|
+
requirements:
|
|
192
|
+
- - "~>"
|
|
193
|
+
- !ruby/object:Gem::Version
|
|
194
|
+
version: '1.0'
|
|
195
|
+
description:
|
|
196
|
+
email:
|
|
197
|
+
- support@foam.ai
|
|
198
|
+
executables: []
|
|
199
|
+
extensions: []
|
|
200
|
+
extra_rdoc_files: []
|
|
201
|
+
files:
|
|
202
|
+
- README.md
|
|
203
|
+
- lib/foam-ruby.rb
|
|
204
|
+
- lib/foam/ruby.rb
|
|
205
|
+
- lib/foam/ruby/configuration.rb
|
|
206
|
+
- lib/foam/ruby/log_subscriber.rb
|
|
207
|
+
- lib/foam/ruby/otel_setup.rb
|
|
208
|
+
- lib/foam/ruby/version.rb
|
|
209
|
+
homepage: https://github.com/nicktesh/packages
|
|
210
|
+
licenses:
|
|
211
|
+
- MIT
|
|
212
|
+
metadata: {}
|
|
213
|
+
post_install_message:
|
|
214
|
+
rdoc_options: []
|
|
215
|
+
require_paths:
|
|
216
|
+
- lib
|
|
217
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
|
218
|
+
requirements:
|
|
219
|
+
- - ">="
|
|
220
|
+
- !ruby/object:Gem::Version
|
|
221
|
+
version: 3.0.0
|
|
222
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
223
|
+
requirements:
|
|
224
|
+
- - ">"
|
|
225
|
+
- !ruby/object:Gem::Version
|
|
226
|
+
version: 1.3.1
|
|
227
|
+
requirements: []
|
|
228
|
+
rubygems_version: 3.0.3.1
|
|
229
|
+
signing_key:
|
|
230
|
+
specification_version: 4
|
|
231
|
+
summary: Foam observability for Ruby on Rails (logs, traces, errors) via OpenTelemetry
|
|
232
|
+
test_files: []
|