diff --git a/compatibility b/compatibility index 02d198d..6eebee9 100644 --- a/compatibility +++ b/compatibility @@ -7,6 +7,12 @@ rack: ruby: '>= 2.4.0' gem: rackup: '>= 0' + # thin is not (yet) compatible with rack 3 + # TODO: don't bring in an unneeded server (e.g wiht this puma brings in thin) + thin: + github: 'lloeki/thin' + branch: 'rack-3' + # TODO: add blanket incompatibility declaration via e.g # thin: false sinatra: - version: '~> 1.0' @@ -62,6 +68,16 @@ rails: - version: '~> 7.1.0' # 3.3 has a bug: https://bugs.ruby-lang.org/issues/20085 ruby: ['>= 2.7', '< 3.3'] + gem: + sinatra: '>= 0.a' + grape: '>= 0.a' + pry: '> 0' + # thin is not (yet) compatible with rack 3 + thin: + github: 'lloeki/thin' + branch: 'rack-3' + # TODO: add blanket incompatibility declaration via e.g + # thin: false grape: - version: ['~> 1.0', '< 1.3'] ruby: ['>= 2.0', '< 3.0'] @@ -85,3 +101,9 @@ grape: ruby: ['>= 2.6'] gem: rackup: '>= 0' + # thin is not (yet) compatible with rack 3 + thin: + github: 'lloeki/thin' + branch: 'rack-3' + # TODO: add blanket incompatibility declaration via e.g + # thin: false diff --git a/grape.rb b/grape.rb old mode 100644 new mode 100755 index c3afa8d..42728e9 --- a/grape.rb +++ b/grape.rb @@ -1,3 +1,5 @@ +#!/usr/bin/env ruby + begin require "bundler/inline" rescue LoadError => e @@ -21,15 +23,17 @@ end.tap do |m| end.first server = ARGV[1] || 'thin' +gems = match.fetch('gem', {}) gemfile(true) do source "https://rubygems.org" ruby match['ruby'] gem 'grape', "~> #{version}.0" - gem server + gem server unless gems.key?(server) + gem 'ddtrace' - match.fetch('gem', []).each do |name, requirement| + gems.each do |name, requirement| gem name, requirement end end @@ -59,6 +63,9 @@ class API < Grape::API end App = Rack::Builder.new do + use Datadog::Tracing::Contrib::Rack::TraceMiddleware + use Datadog::AppSec::Contrib::Rack::RequestMiddleware + # precompile routes API.compile! @@ -69,5 +76,22 @@ App = Rack::Builder.new do # run Rack::Cascade.new [Web, API] end +require 'ddtrace' + +Datadog.configure do |c| + c.diagnostics.debug = true + + c.telemetry.enabled = true + + c.remote.enabled = true + + c.tracing.enabled = true + c.tracing.instrument :rack + c.tracing.instrument :grape + + c.appsec.enabled = true + c.appsec.instrument :rack +end + Rack::Server.new(app: App, Host: '0.0.0.0', Port: 3000).start diff --git a/rack.rb b/rack.rb old mode 100644 new mode 100755 index 02b6be4..1d3dd3f --- a/rack.rb +++ b/rack.rb @@ -1,3 +1,5 @@ +#!/usr/bin/env ruby + begin require "bundler/inline" rescue LoadError => e @@ -21,15 +23,17 @@ end.tap do |m| end.first server = ARGV[1] || 'thin' +gems = match.fetch('gem', {}) gemfile(true) do source "https://rubygems.org" - ruby match['ruby'] + ruby match['ruby'] if match['ruby'] gem 'rack', "~> #{version}.0" - gem server + gem server unless gems.key?(server) + gem 'ddtrace' - match.fetch('gem', []).each do |name, requirement| + gems.each do |name, requirement| gem name, requirement end end @@ -37,7 +41,25 @@ end require 'rack' require 'json' +require 'ddtrace' +Datadog.configure do |c| + c.diagnostics.debug = true + + c.telemetry.enabled = true + + c.remote.enabled = true + + c.tracing.enabled = true + c.tracing.instrument :rack + + c.appsec.enabled = true + c.appsec.instrument :rack +end + App = Rack::Builder.new do + use Datadog::Tracing::Contrib::Rack::TraceMiddleware + use Datadog::AppSec::Contrib::Rack::RequestMiddleware + map "/hello/world" do run -> (env) { [200, { 'content-type' => 'application/json' }, [JSON.dump({ hello: :world })]] } end diff --git a/rails.rb b/rails.rb old mode 100644 new mode 100755 index 431e1bd..eefc5a4 --- a/rails.rb +++ b/rails.rb @@ -1,3 +1,5 @@ +#!/usr/bin/env ruby + begin require "bundler/inline" rescue LoadError => e @@ -21,16 +23,17 @@ end.tap do |m| end.first server = ARGV[1] || 'thin' +gems = match.fetch('gem', {}) gemfile(true) do source "https://rubygems.org" ruby match['ruby'] gem 'rails', "~> #{version}.0" - gem server - gem 'ddtrace', path: '../../Datadog/dd-trace-rb', require: 'ddtrace/auto_instrument' + gem server unless gems.key?(server) + gem 'ddtrace' - match.fetch('gem', []).each do |name, requirement| + gems.each do |name, requirement| gem name, requirement end end @@ -163,6 +166,7 @@ class App < Rails::Application get "/hello/world" => "hello#world" get "/hello/:id" => "hello#world" + #mount SimpleEngine::Engine => "/" mount SimpleEngine::Engine => "/engine/simple" mount EndpointEngine::Engine => "/engine/endpoint" mount RackApp => "/rack" @@ -193,13 +197,24 @@ class HelloController < action_controller_api_class end end +require 'ddtrace' + Datadog.configure do |c| - c.diagnostics.debug = ['true', '1'].include?(ENV['DD_DIAGNOSTICS']) + c.diagnostics.debug = true + + c.telemetry.enabled = true + + c.remote.enabled = true + c.tracing.enabled = true c.tracing.instrument :rack c.tracing.instrument :rails c.tracing.instrument :sinatra c.tracing.instrument :grape + + c.appsec.enabled = true + c.appsec.instrument :rack + c.appsec.instrument :rails end SimpleApp::App.initialize! diff --git a/shell.nix b/shell.nix index c2451a9..8bb6e2b 100644 --- a/shell.nix +++ b/shell.nix @@ -13,6 +13,14 @@ in llvm.stdenv.mkDerivation { # for psych >= 5.1 pulled by rails 7.1 pkgs.libyaml.dev + + # some packages want gcc/g++ + gcc + + # tools + pkgs.vegeta + pkgs.graphviz + pkgs.gnuplot ]; diff --git a/sinatra.rb b/sinatra.rb old mode 100644 new mode 100755 index 2d76517..faffcd4 --- a/sinatra.rb +++ b/sinatra.rb @@ -1,3 +1,5 @@ +#!/usr/bin/env ruby + begin require "bundler/inline" rescue LoadError => e @@ -21,15 +23,17 @@ end.tap do |m| end.first server = ARGV[1] || 'thin' +gems = match.fetch('gem', {}) gemfile(true) do source "https://rubygems.org" ruby match['ruby'] if match['ruby'] gem 'sinatra', "~> #{version}.0" - gem server + gem server unless gems.key?(server) + gem 'ddtrace' - match.fetch('gem', []).each do |name, requirement| + gems.each do |name, requirement| gem name, requirement end end @@ -37,11 +41,30 @@ end require 'sinatra/base' require 'json' +require 'ddtrace' +Datadog.configure do |c| + c.diagnostics.debug = true + + c.telemetry.enabled = true + + c.remote.enabled = true + + c.tracing.enabled = true + c.tracing.instrument :rack, service_name: 'minimal-rack' + c.tracing.instrument :sinatra, service_name: 'minimal-sinatra' + + c.appsec.enabled = true + c.appsec.instrument :rack + c.appsec.instrument :sinatra +end + class App < Sinatra::Base - get '/hello/world' do + use Datadog::Tracing::Contrib::Rack::TraceMiddleware + + get '/hello/:id' do status 200 content_type :json - body JSON.dump({ hello: :world }) + body JSON.dump({ hello: params[:id] || 'world' }) end end