ddtrace 0.44.0 → 0.48.0
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 +4 -4
- data/.circleci/config.yml +183 -15
- data/.circleci/images/primary/Dockerfile-2.0.0 +11 -1
- data/.circleci/images/primary/Dockerfile-2.1.10 +11 -1
- data/.circleci/images/primary/Dockerfile-2.2.10 +11 -1
- data/.circleci/images/primary/Dockerfile-2.3.8 +10 -0
- data/.circleci/images/primary/Dockerfile-2.4.6 +10 -0
- data/.circleci/images/primary/Dockerfile-2.5.6 +10 -0
- data/.circleci/images/primary/Dockerfile-2.6.4 +10 -0
- data/.circleci/images/primary/Dockerfile-2.7.0 +10 -0
- data/.circleci/images/primary/Dockerfile-jruby-9.2-latest +88 -0
- data/.circleci/images/primary/{Dockerfile-jruby-9.2 → Dockerfile-jruby-9.2.0.0} +1 -5
- data/.circleci/images/primary/Dockerfile-truffleruby-21.0.0 +73 -0
- data/.github/workflows/create-next-milestone.yml +2 -2
- data/.gitlab-ci.yml +18 -18
- data/.rubocop.yml +269 -7
- data/.rubocop_todo.yml +438 -0
- data/.simplecov +6 -0
- data/Appraisals +87 -9
- data/CHANGELOG.md +238 -1
- data/Gemfile +63 -3
- data/LICENSE-3rdparty.csv +2 -0
- data/README.md +1 -0
- data/Rakefile +65 -25
- data/bin/ddtracerb +15 -0
- data/ddtrace.gemspec +9 -36
- data/docker-compose.yml +75 -7
- data/docs/DevelopmentGuide.md +28 -0
- data/docs/GettingStarted.md +162 -68
- data/docs/ProfilingDevelopment.md +88 -0
- data/integration/README.md +67 -0
- data/integration/apps/rack/.dockerignore +1 -0
- data/integration/apps/rack/.envrc.sample +1 -0
- data/integration/apps/rack/.gitignore +4 -0
- data/integration/apps/rack/.rspec +1 -0
- data/integration/apps/rack/Dockerfile +28 -0
- data/integration/apps/rack/Dockerfile-ci +11 -0
- data/integration/apps/rack/Gemfile +24 -0
- data/integration/apps/rack/README.md +93 -0
- data/integration/apps/rack/app/acme.rb +80 -0
- data/integration/apps/rack/app/datadog.rb +17 -0
- data/integration/apps/rack/bin/run +22 -0
- data/integration/apps/rack/bin/setup +17 -0
- data/integration/apps/rack/bin/test +24 -0
- data/integration/apps/rack/config.ru +6 -0
- data/integration/apps/rack/config/puma.rb +14 -0
- data/integration/apps/rack/config/unicorn.rb +23 -0
- data/integration/apps/rack/docker-compose.ci.yml +62 -0
- data/integration/apps/rack/docker-compose.yml +78 -0
- data/integration/apps/rack/script/build-images +38 -0
- data/integration/apps/rack/script/ci +50 -0
- data/integration/apps/rack/spec/integration/basic_spec.rb +10 -0
- data/integration/apps/rack/spec/spec_helper.rb +16 -0
- data/integration/apps/rack/spec/support/integration_helper.rb +22 -0
- data/integration/apps/rails-five/.dockerignore +1 -0
- data/integration/apps/rails-five/.env +3 -0
- data/integration/apps/rails-five/.envrc.sample +1 -0
- data/integration/apps/rails-five/.gitignore +30 -0
- data/integration/apps/rails-five/Dockerfile +25 -0
- data/integration/apps/rails-five/Dockerfile-ci +11 -0
- data/integration/apps/rails-five/Gemfile +104 -0
- data/integration/apps/rails-five/README.md +94 -0
- data/integration/apps/rails-five/Rakefile +6 -0
- data/integration/apps/rails-five/app/channels/application_cable/channel.rb +4 -0
- data/integration/apps/rails-five/app/channels/application_cable/connection.rb +4 -0
- data/integration/apps/rails-five/app/controllers/application_controller.rb +2 -0
- data/integration/apps/rails-five/app/controllers/basic_controller.rb +36 -0
- data/integration/apps/rails-five/app/controllers/concerns/.keep +0 -0
- data/integration/apps/rails-five/app/controllers/health_controller.rb +9 -0
- data/integration/apps/rails-five/app/controllers/jobs_controller.rb +12 -0
- data/integration/apps/rails-five/app/jobs/application_job.rb +2 -0
- data/integration/apps/rails-five/app/jobs/test_job.rb +12 -0
- data/integration/apps/rails-five/app/mailers/application_mailer.rb +4 -0
- data/integration/apps/rails-five/app/models/application_record.rb +3 -0
- data/integration/apps/rails-five/app/models/concerns/.keep +0 -0
- data/integration/apps/rails-five/app/models/test.rb +2 -0
- data/integration/apps/rails-five/app/views/layouts/mailer.html.erb +13 -0
- data/integration/apps/rails-five/app/views/layouts/mailer.text.erb +1 -0
- data/integration/apps/rails-five/bin/bundle +3 -0
- data/integration/apps/rails-five/bin/rails +9 -0
- data/integration/apps/rails-five/bin/rake +9 -0
- data/integration/apps/rails-five/bin/run +24 -0
- data/integration/apps/rails-five/bin/setup +27 -0
- data/integration/apps/rails-five/bin/spring +17 -0
- data/integration/apps/rails-five/bin/test +21 -0
- data/integration/apps/rails-five/bin/update +28 -0
- data/integration/apps/rails-five/config.ru +5 -0
- data/integration/apps/rails-five/config/application.rb +97 -0
- data/integration/apps/rails-five/config/boot.rb +4 -0
- data/integration/apps/rails-five/config/cable.yml +10 -0
- data/integration/apps/rails-five/config/credentials.yml.enc +1 -0
- data/integration/apps/rails-five/config/database.yml +28 -0
- data/integration/apps/rails-five/config/environment.rb +5 -0
- data/integration/apps/rails-five/config/environments/development.rb +51 -0
- data/integration/apps/rails-five/config/environments/production.rb +82 -0
- data/integration/apps/rails-five/config/environments/test.rb +43 -0
- data/integration/apps/rails-five/config/initializers/datadog.rb +18 -0
- data/integration/apps/rails-five/config/initializers/filter_parameter_logging.rb +4 -0
- data/integration/apps/rails-five/config/initializers/resque.rb +4 -0
- data/integration/apps/rails-five/config/initializers/rollbar.rb +5 -0
- data/integration/apps/rails-five/config/initializers/wrap_parameters.rb +14 -0
- data/integration/apps/rails-five/config/locales/en.yml +33 -0
- data/integration/apps/rails-five/config/puma.rb +24 -0
- data/integration/apps/rails-five/config/routes.rb +11 -0
- data/integration/apps/rails-five/config/spring.rb +6 -0
- data/integration/apps/rails-five/config/unicorn.rb +29 -0
- data/integration/apps/rails-five/db/migrate/20190927215052_create_tests.rb +11 -0
- data/integration/apps/rails-five/db/schema.rb +23 -0
- data/integration/apps/rails-five/db/seeds.rb +7 -0
- data/integration/apps/rails-five/docker-compose.ci.yml +98 -0
- data/integration/apps/rails-five/docker-compose.yml +100 -0
- data/integration/apps/rails-five/lib/tasks/.keep +0 -0
- data/integration/apps/rails-five/log/.keep +0 -0
- data/integration/apps/rails-five/public/robots.txt +1 -0
- data/integration/apps/rails-five/script/build-images +35 -0
- data/integration/apps/rails-five/script/ci +50 -0
- data/integration/apps/rails-five/spec/integration/basic_spec.rb +10 -0
- data/integration/apps/rails-five/spec/spec_helper.rb +16 -0
- data/integration/apps/rails-five/spec/support/integration_helper.rb +22 -0
- data/integration/apps/rails-five/storage/.keep +0 -0
- data/integration/apps/rails-five/tmp/.keep +0 -0
- data/integration/apps/rails-five/vendor/.keep +0 -0
- data/integration/apps/ruby/.dockerignore +1 -0
- data/integration/apps/ruby/.envrc.sample +1 -0
- data/integration/apps/ruby/.gitignore +2 -0
- data/integration/apps/ruby/Dockerfile +25 -0
- data/integration/apps/ruby/Dockerfile-ci +11 -0
- data/integration/apps/ruby/Gemfile +11 -0
- data/integration/apps/ruby/README.md +70 -0
- data/integration/apps/ruby/agent.yaml +3 -0
- data/integration/apps/ruby/app/datadog.rb +13 -0
- data/integration/apps/ruby/app/fibonacci.rb +58 -0
- data/integration/apps/ruby/bin/run +20 -0
- data/integration/apps/ruby/bin/setup +17 -0
- data/integration/apps/ruby/bin/test +21 -0
- data/integration/apps/ruby/docker-compose.ci.yml +51 -0
- data/integration/apps/ruby/docker-compose.yml +63 -0
- data/integration/apps/ruby/script/build-images +38 -0
- data/integration/apps/ruby/script/ci +50 -0
- data/integration/images/agent/Dockerfile +2 -0
- data/integration/images/agent/agent.yaml +3 -0
- data/integration/images/include/datadog/analyzer.rb +71 -0
- data/integration/images/include/datadog/demo_env.rb +101 -0
- data/integration/images/include/http-health-check +33 -0
- data/integration/images/ruby/2.0/Dockerfile +54 -0
- data/integration/images/ruby/2.1/Dockerfile +54 -0
- data/integration/images/ruby/2.2/Dockerfile +54 -0
- data/integration/images/ruby/2.3/Dockerfile +70 -0
- data/integration/images/ruby/2.4/Dockerfile +54 -0
- data/integration/images/ruby/2.5/Dockerfile +54 -0
- data/integration/images/ruby/2.6/Dockerfile +54 -0
- data/integration/images/ruby/2.7/Dockerfile +54 -0
- data/integration/images/ruby/3.0/Dockerfile +54 -0
- data/integration/images/wrk/Dockerfile +33 -0
- data/integration/images/wrk/scripts/entrypoint.sh +17 -0
- data/integration/images/wrk/scripts/scenarios/basic/default.lua +1 -0
- data/integration/images/wrk/scripts/scenarios/basic/fibonacci.lua +1 -0
- data/integration/script/build-images +43 -0
- data/lib/ddtrace.rb +8 -5
- data/lib/ddtrace/analytics.rb +2 -0
- data/lib/ddtrace/auto_instrument.rb +3 -0
- data/lib/ddtrace/auto_instrument_base.rb +6 -0
- data/lib/ddtrace/buffer.rb +4 -4
- data/lib/ddtrace/configuration.rb +121 -26
- data/lib/ddtrace/configuration/base.rb +1 -1
- data/lib/ddtrace/configuration/components.rb +87 -5
- data/lib/ddtrace/configuration/option_definition.rb +1 -3
- data/lib/ddtrace/configuration/options.rb +4 -7
- data/lib/ddtrace/configuration/settings.rb +48 -3
- data/lib/ddtrace/context.rb +5 -6
- data/lib/ddtrace/context_provider.rb +0 -1
- data/lib/ddtrace/contrib/action_cable/event.rb +1 -0
- data/lib/ddtrace/contrib/action_cable/integration.rb +7 -0
- data/lib/ddtrace/contrib/action_pack/action_controller/instrumentation.rb +1 -3
- data/lib/ddtrace/contrib/action_pack/integration.rb +7 -0
- data/lib/ddtrace/contrib/action_view/event.rb +1 -1
- data/lib/ddtrace/contrib/action_view/integration.rb +7 -0
- data/lib/ddtrace/contrib/action_view/utils.rb +1 -1
- data/lib/ddtrace/contrib/active_record/configuration/makara_resolver.rb +30 -0
- data/lib/ddtrace/contrib/active_record/configuration/resolver.rb +107 -18
- data/lib/ddtrace/contrib/active_record/integration.rb +7 -0
- data/lib/ddtrace/contrib/active_record/utils.rb +57 -20
- data/lib/ddtrace/contrib/active_support/integration.rb +7 -1
- data/lib/ddtrace/contrib/active_support/notifications/event.rb +2 -1
- data/lib/ddtrace/contrib/active_support/notifications/subscriber.rb +1 -0
- data/lib/ddtrace/contrib/active_support/notifications/subscription.rb +9 -5
- data/lib/ddtrace/contrib/auto_instrument.rb +49 -0
- data/lib/ddtrace/contrib/aws/patcher.rb +1 -0
- data/lib/ddtrace/contrib/aws/services.rb +2 -0
- data/lib/ddtrace/contrib/configurable.rb +63 -39
- data/lib/ddtrace/contrib/configuration/resolver.rb +70 -5
- data/lib/ddtrace/contrib/configuration/resolvers/pattern_resolver.rb +19 -20
- data/lib/ddtrace/contrib/configuration/settings.rb +7 -6
- data/lib/ddtrace/contrib/cucumber/configuration/settings.rb +0 -10
- data/lib/ddtrace/contrib/cucumber/ext.rb +0 -2
- data/lib/ddtrace/contrib/cucumber/formatter.rb +5 -11
- data/lib/ddtrace/contrib/cucumber/integration.rb +5 -0
- data/lib/ddtrace/contrib/dalli/patcher.rb +0 -38
- data/lib/ddtrace/contrib/delayed_job/plugin.rb +0 -1
- data/lib/ddtrace/contrib/elasticsearch/patcher.rb +1 -0
- data/lib/ddtrace/contrib/elasticsearch/quantize.rb +3 -2
- data/lib/ddtrace/contrib/ethon/easy_patch.rb +10 -9
- data/lib/ddtrace/contrib/excon/middleware.rb +2 -6
- data/lib/ddtrace/contrib/extensions.rb +53 -3
- data/lib/ddtrace/contrib/faraday/middleware.rb +1 -3
- data/lib/ddtrace/contrib/faraday/patcher.rb +0 -36
- data/lib/ddtrace/contrib/grape/endpoint.rb +8 -15
- data/lib/ddtrace/contrib/grape/patcher.rb +0 -42
- data/lib/ddtrace/contrib/grpc/datadog_interceptor.rb +8 -8
- data/lib/ddtrace/contrib/grpc/datadog_interceptor/server.rb +1 -0
- data/lib/ddtrace/contrib/grpc/patcher.rb +0 -36
- data/lib/ddtrace/contrib/http/circuit_breaker.rb +1 -3
- data/lib/ddtrace/contrib/http/instrumentation.rb +5 -5
- data/lib/ddtrace/contrib/httpclient/configuration/settings.rb +32 -0
- data/lib/ddtrace/contrib/httpclient/ext.rb +17 -0
- data/lib/ddtrace/contrib/httpclient/instrumentation.rb +147 -0
- data/lib/ddtrace/contrib/httpclient/integration.rb +43 -0
- data/lib/ddtrace/contrib/httpclient/patcher.rb +38 -0
- data/lib/ddtrace/contrib/httprb/instrumentation.rb +14 -20
- data/lib/ddtrace/contrib/httprb/patcher.rb +5 -2
- data/lib/ddtrace/contrib/mongodb/instrumentation.rb +2 -0
- data/lib/ddtrace/contrib/mongodb/subscribers.rb +2 -3
- data/lib/ddtrace/contrib/patchable.rb +18 -7
- data/lib/ddtrace/contrib/patcher.rb +9 -6
- data/lib/ddtrace/contrib/presto/patcher.rb +5 -2
- data/lib/ddtrace/contrib/qless/qless_job.rb +1 -0
- data/lib/ddtrace/contrib/qless/tracer_cleaner.rb +1 -0
- data/lib/ddtrace/contrib/que/ext.rb +19 -19
- data/lib/ddtrace/contrib/que/tracer.rb +1 -1
- data/lib/ddtrace/contrib/racecar/event.rb +1 -0
- data/lib/ddtrace/contrib/rack/configuration/settings.rb +3 -3
- data/lib/ddtrace/contrib/rack/integration.rb +7 -0
- data/lib/ddtrace/contrib/rack/middlewares.rb +6 -11
- data/lib/ddtrace/contrib/rack/patcher.rb +1 -3
- data/lib/ddtrace/contrib/rack/request_queue.rb +6 -1
- data/lib/ddtrace/contrib/rails/auto_instrument_railtie.rb +10 -0
- data/lib/ddtrace/contrib/rails/patcher.rb +6 -2
- data/lib/ddtrace/contrib/rails/utils.rb +4 -0
- data/lib/ddtrace/contrib/rake/instrumentation.rb +4 -2
- data/lib/ddtrace/contrib/rake/integration.rb +1 -1
- data/lib/ddtrace/contrib/redis/configuration/resolver.rb +11 -4
- data/lib/ddtrace/contrib/redis/quantize.rb +1 -0
- data/lib/ddtrace/contrib/redis/vendor/LICENSE +20 -0
- data/lib/ddtrace/contrib/redis/vendor/resolver.rb +6 -7
- data/lib/ddtrace/contrib/registry.rb +2 -2
- data/lib/ddtrace/contrib/resque/configuration/settings.rb +17 -1
- data/lib/ddtrace/contrib/resque/integration.rb +1 -1
- data/lib/ddtrace/contrib/resque/patcher.rb +4 -4
- data/lib/ddtrace/contrib/resque/resque_job.rb +24 -1
- data/lib/ddtrace/contrib/rest_client/request_patch.rb +1 -3
- data/lib/ddtrace/contrib/rspec/configuration/settings.rb +0 -10
- data/lib/ddtrace/contrib/rspec/example.rb +24 -10
- data/lib/ddtrace/contrib/rspec/ext.rb +0 -3
- data/lib/ddtrace/contrib/rspec/integration.rb +6 -1
- data/lib/ddtrace/contrib/rspec/patcher.rb +0 -2
- data/lib/ddtrace/contrib/sequel/utils.rb +5 -6
- data/lib/ddtrace/contrib/shoryuken/configuration/settings.rb +1 -0
- data/lib/ddtrace/contrib/shoryuken/tracer.rb +7 -4
- data/lib/ddtrace/contrib/sidekiq/server_tracer.rb +2 -7
- data/lib/ddtrace/contrib/sidekiq/tracing.rb +0 -1
- data/lib/ddtrace/contrib/sinatra/env.rb +1 -3
- data/lib/ddtrace/contrib/sinatra/headers.rb +1 -3
- data/lib/ddtrace/contrib/sinatra/tracer.rb +1 -3
- data/lib/ddtrace/contrib/sinatra/tracer_middleware.rb +3 -3
- data/lib/ddtrace/contrib/sneakers/ext.rb +11 -11
- data/lib/ddtrace/contrib/sneakers/tracer.rb +2 -4
- data/lib/ddtrace/contrib/status_code_matcher.rb +5 -3
- data/lib/ddtrace/correlation.rb +1 -0
- data/lib/ddtrace/diagnostics/environment_logger.rb +3 -2
- data/lib/ddtrace/distributed_tracing/headers/headers.rb +1 -0
- data/lib/ddtrace/distributed_tracing/headers/helpers.rb +1 -3
- data/lib/ddtrace/error.rb +2 -0
- data/lib/ddtrace/ext/ci.rb +43 -10
- data/lib/ddtrace/ext/distributed.rb +1 -1
- data/lib/ddtrace/ext/git.rb +0 -1
- data/lib/ddtrace/ext/http.rb +1 -1
- data/lib/ddtrace/ext/profiling.rb +52 -0
- data/lib/ddtrace/ext/runtime.rb +3 -1
- data/lib/ddtrace/ext/transport.rb +1 -0
- data/lib/ddtrace/forced_tracing.rb +2 -0
- data/lib/ddtrace/logger.rb +1 -1
- data/lib/ddtrace/metrics.rb +14 -6
- data/lib/ddtrace/opentracer/distributed_headers.rb +3 -0
- data/lib/ddtrace/opentracer/span.rb +2 -6
- data/lib/ddtrace/opentracer/thread_local_scope.rb +1 -0
- data/lib/ddtrace/patcher.rb +25 -4
- data/lib/ddtrace/pin.rb +8 -61
- data/lib/ddtrace/pipeline/span_filter.rb +1 -1
- data/lib/ddtrace/profiling.rb +54 -0
- data/lib/ddtrace/profiling/backtrace_location.rb +32 -0
- data/lib/ddtrace/profiling/buffer.rb +41 -0
- data/lib/ddtrace/profiling/collectors/stack.rb +253 -0
- data/lib/ddtrace/profiling/encoding/profile.rb +31 -0
- data/lib/ddtrace/profiling/event.rb +13 -0
- data/lib/ddtrace/profiling/events/stack.rb +102 -0
- data/lib/ddtrace/profiling/exporter.rb +23 -0
- data/lib/ddtrace/profiling/ext/cpu.rb +54 -0
- data/lib/ddtrace/profiling/ext/cthread.rb +134 -0
- data/lib/ddtrace/profiling/ext/forking.rb +97 -0
- data/lib/ddtrace/profiling/flush.rb +41 -0
- data/lib/ddtrace/profiling/pprof/builder.rb +121 -0
- data/lib/ddtrace/profiling/pprof/converter.rb +85 -0
- data/lib/ddtrace/profiling/pprof/message_set.rb +12 -0
- data/lib/ddtrace/profiling/pprof/payload.rb +18 -0
- data/lib/ddtrace/profiling/pprof/pprof.proto +212 -0
- data/lib/ddtrace/profiling/pprof/pprof_pb.rb +81 -0
- data/lib/ddtrace/profiling/pprof/stack_sample.rb +90 -0
- data/lib/ddtrace/profiling/pprof/string_table.rb +10 -0
- data/lib/ddtrace/profiling/pprof/template.rb +114 -0
- data/lib/ddtrace/profiling/preload.rb +3 -0
- data/lib/ddtrace/profiling/profiler.rb +28 -0
- data/lib/ddtrace/profiling/recorder.rb +87 -0
- data/lib/ddtrace/profiling/scheduler.rb +84 -0
- data/lib/ddtrace/profiling/tasks/setup.rb +77 -0
- data/lib/ddtrace/profiling/transport/client.rb +12 -0
- data/lib/ddtrace/profiling/transport/http.rb +122 -0
- data/lib/ddtrace/profiling/transport/http/api.rb +43 -0
- data/lib/ddtrace/profiling/transport/http/api/endpoint.rb +90 -0
- data/lib/ddtrace/profiling/transport/http/api/instance.rb +36 -0
- data/lib/ddtrace/profiling/transport/http/api/spec.rb +40 -0
- data/lib/ddtrace/profiling/transport/http/builder.rb +28 -0
- data/lib/ddtrace/profiling/transport/http/client.rb +33 -0
- data/lib/ddtrace/profiling/transport/http/response.rb +21 -0
- data/lib/ddtrace/profiling/transport/io.rb +30 -0
- data/lib/ddtrace/profiling/transport/io/client.rb +27 -0
- data/lib/ddtrace/profiling/transport/io/response.rb +16 -0
- data/lib/ddtrace/profiling/transport/parcel.rb +17 -0
- data/lib/ddtrace/profiling/transport/request.rb +15 -0
- data/lib/ddtrace/profiling/transport/response.rb +8 -0
- data/lib/ddtrace/propagation/grpc_propagator.rb +1 -0
- data/lib/ddtrace/propagation/http_propagator.rb +17 -2
- data/lib/ddtrace/quantization/http.rb +1 -0
- data/lib/ddtrace/runtime/cgroup.rb +2 -2
- data/lib/ddtrace/runtime/container.rb +32 -26
- data/lib/ddtrace/runtime/identity.rb +8 -0
- data/lib/ddtrace/sampler.rb +1 -1
- data/lib/ddtrace/sampling/rule_sampler.rb +4 -9
- data/lib/ddtrace/span.rb +7 -7
- data/lib/ddtrace/sync_writer.rb +12 -12
- data/lib/ddtrace/tasks/exec.rb +48 -0
- data/lib/ddtrace/tasks/help.rb +14 -0
- data/lib/ddtrace/tracer.rb +28 -5
- data/lib/ddtrace/transport/http.rb +15 -8
- data/lib/ddtrace/transport/http/adapters/net.rb +27 -8
- data/lib/ddtrace/transport/http/adapters/registry.rb +1 -0
- data/lib/ddtrace/transport/http/adapters/unix_socket.rb +2 -4
- data/lib/ddtrace/transport/http/builder.rb +7 -1
- data/lib/ddtrace/transport/http/env.rb +8 -0
- data/lib/ddtrace/transport/http/traces.rb +2 -3
- data/lib/ddtrace/transport/io.rb +1 -1
- data/lib/ddtrace/transport/io/client.rb +15 -8
- data/lib/ddtrace/transport/io/response.rb +1 -3
- data/lib/ddtrace/transport/io/traces.rb +6 -0
- data/lib/ddtrace/transport/parcel.rb +4 -0
- data/lib/ddtrace/transport/traces.rb +18 -1
- data/lib/ddtrace/utils/compression.rb +27 -0
- data/lib/ddtrace/utils/object_set.rb +41 -0
- data/lib/ddtrace/utils/only_once.rb +40 -0
- data/lib/ddtrace/utils/sequence.rb +17 -0
- data/lib/ddtrace/utils/string_table.rb +45 -0
- data/lib/ddtrace/utils/time.rb +32 -1
- data/lib/ddtrace/vendor/active_record/MIT-LICENSE +20 -0
- data/lib/ddtrace/vendor/multipart-post/LICENSE +11 -0
- data/lib/ddtrace/vendor/multipart-post/multipart.rb +12 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post.rb +8 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/composite_read_io.rb +116 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/multipartable.rb +57 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/parts.rb +135 -0
- data/lib/ddtrace/vendor/multipart-post/multipart/post/version.rb +9 -0
- data/lib/ddtrace/vendor/multipart-post/net/http/post/multipart.rb +32 -0
- data/lib/ddtrace/version.rb +3 -1
- data/lib/ddtrace/workers.rb +5 -0
- data/lib/ddtrace/workers/async.rb +11 -3
- data/lib/ddtrace/workers/loop.rb +17 -3
- data/lib/ddtrace/workers/polling.rb +1 -0
- data/lib/ddtrace/workers/queue.rb +1 -0
- data/lib/ddtrace/workers/runtime_metrics.rb +14 -1
- data/lib/ddtrace/workers/trace_writer.rb +10 -10
- data/lib/ddtrace/writer.rb +7 -4
- metadata +213 -379
- data/lib/ddtrace/augmentation.rb +0 -13
- data/lib/ddtrace/augmentation/method_wrapper.rb +0 -20
- data/lib/ddtrace/augmentation/method_wrapping.rb +0 -38
- data/lib/ddtrace/augmentation/shim.rb +0 -102
- data/lib/ddtrace/contrib/rspec/example_group.rb +0 -61
- data/lib/ddtrace/monkey.rb +0 -58
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
# Profiling Development
|
|
2
|
+
|
|
3
|
+
This file contains development notes specific to the profiling feature.
|
|
4
|
+
|
|
5
|
+
For a more practical view of getting started with development of `ddtrace`, see <DevelopmentGuide.md>.
|
|
6
|
+
|
|
7
|
+
## Profiling components high-level view
|
|
8
|
+
|
|
9
|
+
Components below live inside <../lib/ddtrace/profiling>:
|
|
10
|
+
|
|
11
|
+
* `Collectors::Stack`: Collects stack trace samples from Ruby threads for both CPU-time (if available) and wall-clock.
|
|
12
|
+
Runs on its own background thread.
|
|
13
|
+
* `Encoding::Profile`: Encodes gathered data into the pprof format.
|
|
14
|
+
* `Events::Stack`, `Events::StackSample`, `Events::StackExceptionSample`: Entity classes used to represent stacks.
|
|
15
|
+
* `Ext::CPU`: Monkey patches Ruby's `Thread` with our `Ext::CThread` to enable CPU-time profiling.
|
|
16
|
+
* `Ext::CThread`: Extension used to enable CPU-time profiling via use of Pthread's `getcpuclockid`.
|
|
17
|
+
* `Ext::Forking`: Monkey patches `Kernel#fork`, adding a `Kernel#at_fork` callback mechanism which is used to restore
|
|
18
|
+
profiling abilities after the VM forks (such as re-instrumenting the main thread, and restarting profiler threads).
|
|
19
|
+
* `Pprof::*` (in <../lib/ddtrace/profiling/pprof>): Converts samples captured in the `Recorder` into the pprof format.
|
|
20
|
+
* `Tasks::Setup`: Takes care of loading our extensions/monkey patches to handle fork() and CPU profiling.
|
|
21
|
+
* `Transport::*` (in <../lib/ddtrace/profiling/transport>): Implements transmission of profiling payloads to the Datadog agent
|
|
22
|
+
or backend.
|
|
23
|
+
* `BacktraceLocation`: Entity class used to represent an entry in a stack trace.
|
|
24
|
+
* `Buffer`: Bounded buffer used to store profiling events.
|
|
25
|
+
* `Exporter`: Writes profiling data to a given transport.
|
|
26
|
+
* `Flush`: Entity class used to represent metadata for a given profile.
|
|
27
|
+
* `Profiler`: Profiling entry point, which coordinates collectors and a scheduler.
|
|
28
|
+
* `Recorder`: Stores profiling events gathered by `Collector`s.
|
|
29
|
+
* `Scheduler`: Periodically (every 1 minute) takes data from the `Recorder` and pushes them to all configured
|
|
30
|
+
`Exporter`s. Runs on its own background thread.
|
|
31
|
+
|
|
32
|
+
## Initialization
|
|
33
|
+
|
|
34
|
+
When started via `ddtracerb exec` (together with `DD_PROFILING_ENABLED=true`), initialization goes through the following
|
|
35
|
+
flow:
|
|
36
|
+
|
|
37
|
+
1. <../lib/ddtrace/profiling/preload.rb> triggers the creation of the `Datadog.profiler` instance by calling the method
|
|
38
|
+
2. `Datadog.profiler` is handled by `Datadog::Configuration`, which triggers the configuration of `ddtrace` components
|
|
39
|
+
in `#build_components`
|
|
40
|
+
3. Inside `Datadog::Components`, the `build_profiler` method triggers the execution of the `Tasks::Setup`
|
|
41
|
+
4. The `Setup` task activates our extensions
|
|
42
|
+
* `Datadog::Profiling::Ext::Forking`
|
|
43
|
+
* `Datadog::Profiling::Ext::CPU`
|
|
44
|
+
5. Still inside `Datadog::Components`, the `build_profiler` method then creates and wires up the Profiler:
|
|
45
|
+
```ruby
|
|
46
|
+
recorder = build_profiler_recorder(settings)
|
|
47
|
+
collectors = build_profiler_collectors(settings, recorder)
|
|
48
|
+
exporters = build_profiler_exporters(settings)
|
|
49
|
+
scheduler = build_profiler_scheduler(settings, recorder, exporters)
|
|
50
|
+
|
|
51
|
+
Datadog::Profiler.new(collectors, scheduler)
|
|
52
|
+
```
|
|
53
|
+
```asciiflow
|
|
54
|
+
+------------+
|
|
55
|
+
| Profiler |
|
|
56
|
+
+-+--------+-+
|
|
57
|
+
| |
|
|
58
|
+
v v
|
|
59
|
+
+---------+--+ +--+--------+
|
|
60
|
+
| Collectors | | Scheduler |
|
|
61
|
+
+---------+--+ +-+-------+-+
|
|
62
|
+
| | |
|
|
63
|
+
v | v
|
|
64
|
+
+-----+-+ | +----+------+
|
|
65
|
+
| Stack | | | Exporters |
|
|
66
|
+
+-----+-+ | +-----------+
|
|
67
|
+
| |
|
|
68
|
+
v v
|
|
69
|
+
+-+-------+-+
|
|
70
|
+
| Recorder |
|
|
71
|
+
+-----------+
|
|
72
|
+
```
|
|
73
|
+
6. The profiler gets started when `startup!` is called by `Datadog::Configuration` after component creation.
|
|
74
|
+
|
|
75
|
+
## Run-time execution
|
|
76
|
+
|
|
77
|
+
During run-time, the `Scheduler` and the `Collectors::Stack` each execute on their own background thread.
|
|
78
|
+
|
|
79
|
+
The `Collectors::Stack` samples stack traces of threads, capturing both CPU-time (if available) and wall-clock, storing
|
|
80
|
+
them in the `Recorder`.
|
|
81
|
+
|
|
82
|
+
The `Scheduler` wakes up every 1 minute to flush the results of the `Recorder` into one or more `exporter`s.
|
|
83
|
+
Usually only one exporter is in use. By default, the `Exporter` delegates to the default `Transport::HTTP` transport, which
|
|
84
|
+
takes care of encoding the data and reporting it to the datadog agent (or to the API, when running without an agent).
|
|
85
|
+
|
|
86
|
+
## How CPU-time profiling works
|
|
87
|
+
|
|
88
|
+
**TODO**: Document our pthread-based approach to getting CPU-time for threads.
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
# Datadog APM Ruby integration test suite
|
|
2
|
+
|
|
3
|
+
Integration tests for `ddtrace` that use a variety of real applications.
|
|
4
|
+
|
|
5
|
+
## Quickstart
|
|
6
|
+
|
|
7
|
+
1. Build Docker base images:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
./script/build-images
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
2. Choose an application and follow instructions (in corresponding `README.md`.)
|
|
14
|
+
|
|
15
|
+
## Demo applications
|
|
16
|
+
|
|
17
|
+
Ruby demo applications are configured with Datadog APM, which can be used to generate sample traces/profiles. These are used to drive tests in the integration suite.
|
|
18
|
+
|
|
19
|
+
### Applications
|
|
20
|
+
|
|
21
|
+
See `README.md` in each directory for more information:
|
|
22
|
+
|
|
23
|
+
- `apps/rack`: Rack application
|
|
24
|
+
- `apps/rails-five`: Rails 5 application
|
|
25
|
+
|
|
26
|
+
### Base images
|
|
27
|
+
|
|
28
|
+
The `images/` folders hosts some images for Ruby applications.
|
|
29
|
+
|
|
30
|
+
- `datadog/dd-apm-demo:wrk` / `images/wrk/Dockerfile`: `wrk` load testing application (for generating load)
|
|
31
|
+
- `datadog/dd-apm-demo:agent` / `images/agent/Dockerfile`: Datadog agent (with default configuration)
|
|
32
|
+
- `datadog/dd-apm-demo:rb-<RUBY_VERSION>` / `images/<RUBY_VERSION>/Dockerfile`: MRI Ruby & `Datadog::DemoEnv` (where `<RUBY_VERSION>` is minor version e.g. `2.7`)
|
|
33
|
+
|
|
34
|
+
Ruby base images include `Datadog::DemoEnv` and other helpers.
|
|
35
|
+
|
|
36
|
+
### Debugging
|
|
37
|
+
|
|
38
|
+
#### Profiling memory
|
|
39
|
+
|
|
40
|
+
Create a memory heap dump via:
|
|
41
|
+
|
|
42
|
+
```sh
|
|
43
|
+
# Profile for 5 minutes, dump heap to /data/app/ruby-heap.dump
|
|
44
|
+
# Where PID = process ID
|
|
45
|
+
bundle exec rbtrace -p PID -e 'Thread.new{GC.start; require "objspace"; ObjectSpace.trace_object_allocations_start; sleep(300); io=File.open("/data/app/ruby-heap.dump", "w"); ObjectSpace.dump_all(output: io); io.close}'
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
Then analyze it using `analyzer.rb` (built into the Ruby base images) with:
|
|
49
|
+
|
|
50
|
+
```sh
|
|
51
|
+
# Group objects by generation
|
|
52
|
+
ruby /vendor/dd-demo/datadog/analyzer.rb /data/app/ruby-heap.dump
|
|
53
|
+
|
|
54
|
+
# List objects in GEN_NUM, group by source location
|
|
55
|
+
ruby /vendor/dd-demo/datadog/analyzer.rb /data/app/ruby-heap.dump GEN_NUM
|
|
56
|
+
|
|
57
|
+
# List objects in all generations, group by source location, descending.
|
|
58
|
+
ruby /vendor/dd-demo/datadog/analyzer.rb /data/app/ruby-heap.dump objects
|
|
59
|
+
|
|
60
|
+
# List objects in all generations, group by source location, descending.
|
|
61
|
+
# Up to generation END_GEN.
|
|
62
|
+
ruby /vendor/dd-demo/datadog/analyzer.rb /data/app/ruby-heap.dump objects END_GEN
|
|
63
|
+
|
|
64
|
+
# List objects in all generations, group by source location, descending.
|
|
65
|
+
# Between generations START_GEN to END_GEN inclusive.
|
|
66
|
+
ruby /vendor/dd-demo/datadog/analyzer.rb /data/app/ruby-heap.dump objects END_GEN START_GEN
|
|
67
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Gemfile.lock
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export DD_API_KEY=<Your Datadog API key here>
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
--require spec_helper
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# Select base image
|
|
2
|
+
ARG BASE_IMAGE
|
|
3
|
+
FROM ${BASE_IMAGE}
|
|
4
|
+
|
|
5
|
+
# Setup directory
|
|
6
|
+
RUN mkdir /app
|
|
7
|
+
WORKDIR /app
|
|
8
|
+
|
|
9
|
+
# Setup specific version of ddtrace, if specified.
|
|
10
|
+
ARG ddtrace_git
|
|
11
|
+
ENV DD_DEMO_ENV_GEM_GIT_DDTRACE ${ddtrace_git}
|
|
12
|
+
|
|
13
|
+
ARG ddtrace_ref
|
|
14
|
+
ENV DD_DEMO_ENV_GEM_REF_DDTRACE ${ddtrace_ref}
|
|
15
|
+
|
|
16
|
+
# Install dependencies
|
|
17
|
+
COPY Gemfile /app/Gemfile
|
|
18
|
+
# This forces gems with native extensions to be compiled, rather than using pre-compiled binaries; it's needed because
|
|
19
|
+
# some google-protobuf versions ship with missing binaries for older rubies.
|
|
20
|
+
ENV BUNDLE_FORCE_RUBY_PLATFORM true
|
|
21
|
+
RUN bundle install
|
|
22
|
+
|
|
23
|
+
# Add files
|
|
24
|
+
COPY . /app
|
|
25
|
+
|
|
26
|
+
# Set entrypoint
|
|
27
|
+
ENTRYPOINT ["/bin/bash", "-c"]
|
|
28
|
+
CMD ["bin/setup && bin/run"]
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# Select base image
|
|
2
|
+
ARG BASE_IMAGE
|
|
3
|
+
FROM ${BASE_IMAGE}
|
|
4
|
+
|
|
5
|
+
# Add gem
|
|
6
|
+
COPY . /vendor/dd-trace-rb
|
|
7
|
+
|
|
8
|
+
# Install dependencies
|
|
9
|
+
# Setup specific version of ddtrace, if specified.
|
|
10
|
+
ENV DD_DEMO_ENV_GEM_LOCAL_DDTRACE /vendor/dd-trace-rb
|
|
11
|
+
RUN bundle install
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
require 'datadog/demo_env'
|
|
2
|
+
|
|
3
|
+
source 'https://rubygems.org' do
|
|
4
|
+
gem 'puma'
|
|
5
|
+
gem 'unicorn'
|
|
6
|
+
|
|
7
|
+
gem 'dogstatsd-ruby'
|
|
8
|
+
gem 'rack'
|
|
9
|
+
|
|
10
|
+
gem 'ffi'
|
|
11
|
+
gem 'google-protobuf'
|
|
12
|
+
|
|
13
|
+
# Choose correct specs for 'ddtrace' demo environment
|
|
14
|
+
gem 'ddtrace', *Datadog::DemoEnv.gem_spec('ddtrace')
|
|
15
|
+
|
|
16
|
+
# Development
|
|
17
|
+
gem 'byebug'
|
|
18
|
+
# gem 'pry-stack_explorer', platform: :ruby
|
|
19
|
+
# gem 'rbtrace'
|
|
20
|
+
# gem 'ruby-prof'
|
|
21
|
+
|
|
22
|
+
# Testing/CI
|
|
23
|
+
gem 'rspec'
|
|
24
|
+
end
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
# Rack: Demo application for Datadog APM
|
|
2
|
+
|
|
3
|
+
A generic Rack web application with some common use scenarios.
|
|
4
|
+
|
|
5
|
+
For generating Datadog APM traces and profiles.
|
|
6
|
+
|
|
7
|
+
## Installation
|
|
8
|
+
|
|
9
|
+
Install [direnv](https://github.com/direnv/direnv) for applying local settings.
|
|
10
|
+
|
|
11
|
+
1. `cp .envrc.sample .envrc` and add your Datadog API key.
|
|
12
|
+
2. `direnv allow` to load the env var.
|
|
13
|
+
4. `docker-compose run --rm app bin/setup`
|
|
14
|
+
|
|
15
|
+
## Running the application
|
|
16
|
+
|
|
17
|
+
### To monitor performance of Docker containers with Datadog
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
docker run --rm --name dd-agent -v /var/run/docker.sock:/var/run/docker.sock:ro -v /proc/:/host/proc/:ro -v /sys/fs/cgroup/:/host/sys/fs/cgroup:ro -e API_KEY=$DD_API_KEY datadog/docker-dd-agent:latest
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
### Starting the web server
|
|
24
|
+
|
|
25
|
+
Run `docker-compose up` to auto-start the webserver. It should bind to `localhost:80`.
|
|
26
|
+
|
|
27
|
+
Alternatively, you can run it manually with:
|
|
28
|
+
|
|
29
|
+
```sh
|
|
30
|
+
docker-compose run --rm -p 80:80 app bin/run <process>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
The `<process>` argument is optional, and will default to `DD_DEMO_ENV_PROCESS` if not provided. See [Processes](#processes) for more details.
|
|
34
|
+
|
|
35
|
+
##### Processes
|
|
36
|
+
|
|
37
|
+
Within the container, run `bin/run <process>` where `<process>` is one of the following values:
|
|
38
|
+
|
|
39
|
+
- `puma`: Puma web server
|
|
40
|
+
- `unicorn`: Unicorn web server
|
|
41
|
+
- `irb`: IRB session
|
|
42
|
+
|
|
43
|
+
Alternatively, set `DD_DEMO_ENV_PROCESS` to run a particular process by default when `bin/run` is run.
|
|
44
|
+
|
|
45
|
+
##### Features
|
|
46
|
+
|
|
47
|
+
Set `DD_DEMO_ENV_PROCESS` to a comma-delimited list of any of the following values to activate the feature:
|
|
48
|
+
|
|
49
|
+
- `tracing`: Tracing instrumentation
|
|
50
|
+
- `profiling`: Profiling (NOTE: Must also set `DD_PROFILING_ENABLED` to match.)
|
|
51
|
+
- `debug`: Enable diagnostic debug mode
|
|
52
|
+
- `analytics`: Enable trace analytics
|
|
53
|
+
- `runtime_metrics`: Enable runtime metrics
|
|
54
|
+
- `pprof_to_file`: Dump profiling pprof to file instead of agent.
|
|
55
|
+
|
|
56
|
+
e.g. `DD_DEMO_ENV_PROCESS=tracing,profiling`
|
|
57
|
+
|
|
58
|
+
##### Routes
|
|
59
|
+
|
|
60
|
+
```sh
|
|
61
|
+
# Health check
|
|
62
|
+
curl -v localhost/health
|
|
63
|
+
|
|
64
|
+
# Basic demo scenarios
|
|
65
|
+
curl -v localhost/basic/fibonacci
|
|
66
|
+
curl -v -XPOST localhost/basic/default
|
|
67
|
+
|
|
68
|
+
# Job demo scenarios
|
|
69
|
+
curl -v -XPOST localhost/jobs
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Load tester
|
|
73
|
+
|
|
74
|
+
Docker configuration automatically creates and runs [Wrk](https://github.com/wg/wrk) load testing containers. By default it runs the `basic/default` scenario described in the `wrk` image to give a baseload.
|
|
75
|
+
|
|
76
|
+
You can modify the `load-tester` container in `docker-compose.yml` to change the load type or scenario run. Set the container's `command` to any set of arguments `wrk` accepts.
|
|
77
|
+
|
|
78
|
+
You can also define your own custom scenario by creating a LUA file, mounting it into the container, and passing it as an argument via `command`.
|
|
79
|
+
|
|
80
|
+
### Running integration tests
|
|
81
|
+
|
|
82
|
+
You can run integration tests using the following and substituting for the Ruby major and minor version (e.g. `2.7`)
|
|
83
|
+
|
|
84
|
+
```sh
|
|
85
|
+
./script/build-images -v <RUBY_VERSION>
|
|
86
|
+
./script/ci -v <RUBY_VERSION>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
Or inside a running container:
|
|
90
|
+
|
|
91
|
+
```sh
|
|
92
|
+
./bin/test
|
|
93
|
+
```
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
require 'rack'
|
|
2
|
+
|
|
3
|
+
module Acme
|
|
4
|
+
class Application
|
|
5
|
+
def call(env)
|
|
6
|
+
request = Rack::Request.new(env)
|
|
7
|
+
router.route!(request)
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def router
|
|
11
|
+
Router.new(
|
|
12
|
+
'/' => { controller: controllers[:health], action: :check },
|
|
13
|
+
'/health' => { controller: controllers[:health], action: :check },
|
|
14
|
+
'/basic/fibonacci' => { controller: controllers[:basic], action: :fibonacci },
|
|
15
|
+
'/basic/default' => { controller: controllers[:basic], action: :default }
|
|
16
|
+
)
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def controllers
|
|
20
|
+
{
|
|
21
|
+
basic: Controllers::Basic.new,
|
|
22
|
+
health: Controllers::Health.new
|
|
23
|
+
}
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
class Router
|
|
28
|
+
attr_reader :routes
|
|
29
|
+
|
|
30
|
+
def initialize(routes)
|
|
31
|
+
@routes = routes
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
def route!(request)
|
|
35
|
+
begin
|
|
36
|
+
if route = routes[request.path]
|
|
37
|
+
route[:controller].send(route[:action], request)
|
|
38
|
+
else
|
|
39
|
+
not_found(request)
|
|
40
|
+
end
|
|
41
|
+
rescue StandardError => e
|
|
42
|
+
application_error(request, e)
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def not_found(request)
|
|
47
|
+
[404, { 'Content-Type' => 'text/plain' }, ["404 Not Found: #{request.path}"]]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def application_error(request, error)
|
|
51
|
+
[500, { 'Content-Type' => 'text/plain' }, ["500 Application Error: #{error.message} Location: #{error.backtrace.first(3)}"]]
|
|
52
|
+
end
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
module Controllers
|
|
56
|
+
class Basic
|
|
57
|
+
def fibonacci(request)
|
|
58
|
+
n = rand(25..35)
|
|
59
|
+
result = fib(n)
|
|
60
|
+
['200', { 'Content-Type' => 'text/plain' }, ["Basic: Fibonacci(#{n}): #{result}"]]
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def default(request)
|
|
64
|
+
['200', { 'Content-Type' => 'text/plain' }, ['Basic: Default']]
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
private
|
|
68
|
+
|
|
69
|
+
def fib(n)
|
|
70
|
+
n <= 1 ? n : fib(n-1) + fib(n-2)
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
class Health
|
|
75
|
+
def check(request)
|
|
76
|
+
['204', {}, []]
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
require 'datadog/demo_env'
|
|
2
|
+
require 'ddtrace'
|
|
3
|
+
|
|
4
|
+
Datadog.configure do |c|
|
|
5
|
+
c.diagnostics.debug = true if Datadog::DemoEnv.feature?('debug')
|
|
6
|
+
c.analytics_enabled = true if Datadog::DemoEnv.feature?('analytics')
|
|
7
|
+
c.runtime_metrics.enabled = true if Datadog::DemoEnv.feature?('runtime_metrics')
|
|
8
|
+
|
|
9
|
+
if Datadog::DemoEnv.feature?('tracing')
|
|
10
|
+
c.use :rack, service_name: 'acme-rack'
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
if Datadog::DemoEnv.feature?('pprof_to_file')
|
|
14
|
+
# Reconfigure transport to write pprof to file
|
|
15
|
+
c.profiling.exporter.transport = Datadog::DemoEnv.profiler_file_transport
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
#!/usr/bin/env ruby
|
|
2
|
+
|
|
3
|
+
# Start application process
|
|
4
|
+
puts "\n== Starting application process =="
|
|
5
|
+
|
|
6
|
+
profiling = Datadog::DemoEnv.feature?('profiling') ? 'DD_PROFILING_ENABLED=true ddtracerb exec ' : ''
|
|
7
|
+
process = (ARGV[0] || Datadog::DemoEnv.process)
|
|
8
|
+
command = case process
|
|
9
|
+
when 'puma'
|
|
10
|
+
"bundle exec #{profiling}puma -C /app/config/puma.rb /app/config.ru"
|
|
11
|
+
when 'unicorn'
|
|
12
|
+
"bundle exec #{profiling}unicorn -c /app/config/unicorn.rb /app/config.ru"
|
|
13
|
+
when 'irb'
|
|
14
|
+
"bundle exec #{profiling}irb"
|
|
15
|
+
when nil, ''
|
|
16
|
+
abort("\n== ERROR: Must specify a application process! ==")
|
|
17
|
+
else
|
|
18
|
+
abort("\n== ERROR: Unknown application process '#{process}' ==")
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
puts "Run: #{command}"
|
|
22
|
+
Kernel.exec(command)
|