Skip to content
Open
Show file tree
Hide file tree
Changes from 3 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
71 changes: 28 additions & 43 deletions Gemfile.lock
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
PATH
remote: .
specs:
jcw (0.5.2)
jcw (0.6.0)
activesupport (>= 5.0)
httprb-opentracing (~> 0.4.0)
jaeger-client (~> 1.3.0)
opentelemetry-exporter-jaeger (>= 0.21.0)
opentelemetry-sdk (~> 1.2)
thrift

GEM
remote: https://rubygems.org/
Expand All @@ -27,8 +28,6 @@ GEM
i18n (>= 1.6, < 2)
minitest (>= 5.1)
tzinfo (~> 2.0)
addressable (2.8.0)
public_suffix (>= 2.0.2, < 5.0)
ast (2.4.2)
builder (3.2.4)
bundler-audit (0.9.1)
Expand All @@ -39,17 +38,11 @@ GEM
crass (1.0.6)
diff-lcs (1.5.0)
docile (1.4.0)
domain_name (0.5.20190701)
unf (>= 0.0.5, < 1.0.0)
e2mmap (0.1.0)
erubi (1.10.0)
ffi (1.15.5)
ffi-compiler (1.0.1)
ffi (>= 1.0.0)
rake
google-protobuf (3.21.4)
google-protobuf (3.21.4-x86_64-darwin)
google-protobuf (3.21.4-x86_64-linux)
google-protobuf (3.21.3)
google-protobuf (3.21.3-x86_64-darwin)
google-protobuf (3.21.3-x86_64-linux)
googleapis-common-protos-types (1.3.2)
google-protobuf (~> 3.14)
grpc (1.48.0)
Expand All @@ -72,27 +65,9 @@ GEM
slop (>= 4.6)
thwait (>= 0.1)
zeitwerk (>= 2)
http (5.1.0)
addressable (~> 2.8)
http-cookie (~> 1.0)
http-form_data (~> 2.2)
llhttp-ffi (~> 0.4.0)
http-cookie (1.0.5)
domain_name (~> 0.5)
http-form_data (2.3.0)
http-parser (1.2.3)
ffi-compiler (>= 1.0, < 2.0)
httprb-opentracing (0.4.0)
opentracing (~> 0.5.0)
i18n (1.12.0)
concurrent-ruby (~> 1.0)
jaeger-client (1.3.0)
opentracing (~> 0.3)
thrift
json (2.6.2)
llhttp-ffi (0.4.0)
ffi-compiler (~> 1.0)
rake (~> 13.0)
loofah (2.18.0)
crass (~> 1.0.2)
nokogiri (>= 1.5.9)
Expand All @@ -106,16 +81,31 @@ GEM
racc (~> 1.4)
nokogiri (1.13.8-x86_64-linux)
racc (~> 1.4)
opentracing (0.5.0)
opentracing_test_tracer (0.1.1)
opentracing
opentelemetry-api (1.1.0)
opentelemetry-common (0.19.6)
opentelemetry-api (~> 1.0)
opentelemetry-exporter-jaeger (0.22.0)
opentelemetry-api (~> 1.1)
opentelemetry-common (~> 0.19.6)
opentelemetry-sdk (~> 1.2)
opentelemetry-semantic_conventions
thrift
opentelemetry-registry (0.2.0)
opentelemetry-api (~> 1.1)
opentelemetry-sdk (1.2.0)
opentelemetry-api (~> 1.1)
opentelemetry-common (~> 0.19.3)
opentelemetry-registry (~> 0.2)
opentelemetry-semantic_conventions
opentelemetry-semantic_conventions (1.8.0)
opentelemetry-api (~> 1.0)
opentelemetry-test-helpers (0.3.0)
parallel (1.22.1)
parser (3.1.2.0)
ast (~> 2.4.1)
pry (0.14.1)
coderay (~> 1.1)
method_source (~> 1.0)
public_suffix (4.0.7)
racc (1.6.0)
rack (2.2.4)
rack-test (2.0.2)
Expand Down Expand Up @@ -190,14 +180,11 @@ GEM
simplecov_json_formatter (0.1.4)
slop (4.9.2)
thor (1.2.1)
thrift (0.16.0)
thrift (0.17.0)
thwait (0.2.0)
e2mmap
tzinfo (2.0.5)
concurrent-ruby (~> 1.0)
unf (0.1.4)
unf_ext
unf_ext (0.0.8.2)
unicode-display_width (2.2.0)
zeitwerk (2.6.0)

Expand All @@ -210,10 +197,8 @@ DEPENDENCIES
bundler
bundler-audit
gruf
http
http-parser
jcw!
opentracing_test_tracer
opentelemetry-test-helpers
pry
railties
rake
Expand Down
124 changes: 66 additions & 58 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# JCW &middot; <a target="_blank" href="https://github.com/Cado-Labs"><img src="https://github.com/Cado-Labs/cado-labs-logos/raw/main/cado_labs_badge.svg" alt="Supported by Cado Labs" style="max-width: 100%; height: 20px"></a> &middot; [![Coverage Status](https://coveralls.io/repos/github/Cado-Labs/jcw/badge.svg?branch=gem-without-zeitwerk)](https://coveralls.io/github/Cado-Labs/jcw?branch=gem-without-zeitwerk) &middot; [![Gem Version](https://badge.fury.io/rb/jcw.svg)](https://badge.fury.io/rb/jcw)

Simple wrapper for the gem "jaeger-client" with simpler customization.
Helper for the gem "opentelemetry-ruby".

---

Expand Down Expand Up @@ -32,63 +32,10 @@ require 'jcw'

Create new initializer for your rails app:

UDP Sender(default):
```ruby
::JCW::Wrapper.configure do |config|
config.service_name = "Service name"
config.connection = { protocol: :udp, host: "127.0.0.1", port: 6831 }
config.enabled = true
config.tags = {
hostname: "custom-hostname",
custom_tag: "custom-tag-value",
}
config.rack_ignore_path_patterns = ["/api/test", %r{/sidekiq}]
config.logger = Logger.new($stdout)
end

# Set middleware for wrapping all requests
Rails.application.middleware.use(JCW::Rack::Tracer)
```

TCP Sender:
```ruby
::JCW::Wrapper.configure do |config|
config.service_name = "Service name"
config.enabled = true
config.subscribe_to = %w[process_action.action_controller start_processing.action_controller] # set ActiveSupport::Notifications namespaces
config.connection = { protocol: :tcp, url: "http://localhost:14268/api/traces", headers: { key: "value" } }
config.tags = {
hostname: "custom-hostname",
custom_tag: "custom-tag-value",
}
config.rack_ignore_path_patterns = ["/api/test", %r{/sidekiq}]
config.logger = Logger.new($stdout)
end

# Set middleware for wrapping all requests
Rails.application.middleware.use(JCW::Rack::Tracer)

# If you need send all logs with spans set on_finish_span and extend JaegerLoggerExtension
# Not recommended for UDP sender, because default max packet size is 65,000 bytes.
Rails.application.config.tap do |config|
config.middleware.use(
JCW::Rack::Tracer,
on_finish_span: lambda do |span|
JCW::Logger.current.logs.each { |log| span.log_kv(**log) }
JCW::Logger.current.clear # Do not forget to avoid memory leaks
end,
)

config.logger.extend(JCW::LoggerExtension)
end
```
- `config.subscribe_to` - not recommended for UDP sender, because default max packet size is 65,000 bytes.

#### GRPC Integration

Client side

```ruby
```
# Add JCW::Interceptors::Gruf::Client Interceptor to Gruf Client Initializer
options = {}
client_options = { timeout: 10, interceptors: [JCW::Interceptors::Gruf::Client.new] }
Expand All @@ -113,14 +60,75 @@ end

# Configure
::JCW::Wrapper.configure do |config|
config.service_name = "Service Name"
config.connection = { protocol: :udp, host: "127.0.0.1", port: 6831 }
config.enabled = true
config.subscribe_to = [/.*/]
config.grpc_ignore_methods = %w[grpc.ignore.method]
end
```

Example setting Opentelemetry

```ruby
# Add base gems to gemfile
gem "opentelemetry-exporter-jaeger"
gem "opentelemetry-sdk"

# Add specific gems for instrumentations
gem "opentelemetry-instrumentation-pg"
gem "opentelemetry-instrumentation-http"
gem "opentelemetry-instrumentation-rack"
gem "opentelemetry-instrumentation-redis"
gem "opentelemetry-instrumentation-sidekiq"

# Configure OpenTelemetry::SDK
# Add to initializers
require "opentelemetry/sdk"
require "opentelemetry/exporter/jaeger"
require "opentelemetry/instrumentation/rack"
require "opentelemetry/instrumentation/sidekiq"
require "opentelemetry/instrumentation/redis"
require "opentelemetry/instrumentation/pg"

OpenTelemetry::SDK.configure do |c|
c.service_name = PROJECT.project_id
c.use "OpenTelemetry::Instrumentation::HTTP"
c.use "OpenTelemetry::Instrumentation::Rack", {
url_quantization: -> (path, _env) { path.to_s },
untraced_endpoints: %w[/cable],
}
c.use "OpenTelemetry::Instrumentation::Sidekiq", {
span_naming: :job_class,
peer_service: "Sidekiq",
}
c.use "OpenTelemetry::Instrumentation::Redis", {
peer_service: "REDIS",
# The obfuscation of arguments in the db.statement attribute is enabled by default.
# To include the full query, set db_statement to :include.
# To obfuscate, set db_statement to :obfuscate.
# To omit the attribute, set db_statement to :omit.
db_statement: :include,
trace_root_spans: false,
}
c.use "OpenTelemetry::Instrumentation::PG", {
# You may optionally set a value for 'peer.service', which
# will be included on all spans from this instrumentation:
peer_service: "Postgres",

# By default, this instrumentation includes the executed SQL as the `db.statement`
# semantic attribute. Optionally, you may disable the inclusion of this attribute entirely by
# setting this option to :omit or sanitize the attribute by setting to :obfuscate
db_statement: :include,
}
c.add_span_processor(
OpenTelemetry::SDK::Trace::Export::SimpleSpanProcessor.new(
OpenTelemetry::Exporter::Jaeger::AgentExporter.new(
host: "localhost",
port: "6831",
),
),
)
end
```

### Contributing

- Fork it ( https://github.com/Cado-Labs/jcw )
Expand Down
13 changes: 6 additions & 7 deletions jcw.gemspec
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,8 @@ Gem::Specification.new do |spec|
spec.authors = ["Alexander Starovojtov"]
spec.email = ["starovojtov.alexander@gmail.com"]

spec.summary = "Wrapper for jaeger-client"
spec.description = "Wrapper for the gem 'jaeger-client' with simpler customization."
spec.summary = "Wrapper for opentelemetry client"
spec.description = "Helper for the 'opentelemetry-ruby'."
spec.homepage = "https://github.com/Cado-Labs/jcw"
spec.license = "MIT"
spec.required_ruby_version = Gem::Requirement.new(">= 2.7.0")
Expand All @@ -23,15 +23,14 @@ Gem::Specification.new do |spec|
spec.require_paths = ["lib"]

spec.add_dependency "activesupport", ">= 5.0"
spec.add_dependency "httprb-opentracing", "~> 0.4.0"
spec.add_dependency "jaeger-client", "~> 1.3.0"
spec.add_dependency "opentelemetry-exporter-jaeger", ">= 0.21.0"
spec.add_dependency "opentelemetry-sdk", "~> 1.2"
spec.add_dependency "thrift"

spec.add_development_dependency "bundler"
spec.add_development_dependency "bundler-audit"
spec.add_development_dependency "gruf"
spec.add_development_dependency "http"
spec.add_development_dependency "http-parser"
spec.add_development_dependency "opentracing_test_tracer"
spec.add_development_dependency "opentelemetry-test-helpers"
spec.add_development_dependency "pry"
spec.add_development_dependency "railties"
spec.add_development_dependency "rake"
Expand Down
3 changes: 0 additions & 3 deletions lib/jcw.rb
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
# frozen_string_literal: true

require "opentracing"
require "jaeger/client"
require "active_support"
require "httprb-opentracing"
require_relative "jcw/wrapper"
41 changes: 2 additions & 39 deletions lib/jcw/config.rb
Original file line number Diff line number Diff line change
Expand Up @@ -2,52 +2,15 @@

module JCW
class Config
attr_writer :enabled,
:service_name,
:subscribe_to,
:connection,
:flush_interval,
:tags,
:grpc_ignore_methods,
:rack_ignore_path_patterns,
:logger

def enabled
@enabled ||= false
end

alias enabled? enabled

def service_name
@service_name ||= "JCW service"
end
attr_writer :subscribe_to,
:grpc_ignore_methods

def subscribe_to
@subscribe_to ||= []
end

def connection
@connection ||= { protocol: :udp, host: "127.0.0.1", port: 6831 }
end

def flush_interval
@flush_interval ||= 10
end

def tags
@tags ||= {}
end

def grpc_ignore_methods
@grpc_ignore_methods ||= []
end

def rack_ignore_path_patterns
@rack_ignore_path_patterns ||= []
end

def logger
@logger ||= ::Logger.new($stdout)
end
end
end
Loading