diff --git a/Dockerfile b/Dockerfile index 16d641ac7ce..a774e7e8943 100644 --- a/Dockerfile +++ b/Dockerfile @@ -66,10 +66,6 @@ RUN apt install -y ${CASEFLOW} && \ # install jemalloc RUN apt install -y --no-install-recommends libjemalloc-dev - -# install datadog agent -RUN DD_INSTALL_ONLY=true DD_AGENT_MAJOR_VERSION=7 DD_API_KEY=$(cat config/datadog.key) bash -c "$(curl -L https://raw.githubusercontent.com/DataDog/datadog-agent/master/cmd/agent/install_script.sh)" - RUN rm -rf /var/lib/apt/lists/* # Installing the version of bundler that corresponds to the Gemfile.lock diff --git a/Gemfile b/Gemfile index 17eec027d43..351f2d03457 100644 --- a/Gemfile +++ b/Gemfile @@ -22,8 +22,6 @@ gem "connect_mpi", git: "https://github.com/department-of-veterans-affairs/conne gem "connect_vbms", git: "https://github.com/department-of-veterans-affairs/connect_vbms.git", ref: "9807d9c9f0f3e3494a60b6693dc4f455c1e3e922" gem "console_tree_renderer", git: "https://github.com/department-of-veterans-affairs/console-tree-renderer.git", tag: "v0.1.1" gem "countries" -gem "ddtrace" -gem "dogstatsd-ruby" gem "dry-schema", "~> 1.4" gem "fast_jsonapi" gem "fuzzy_match" @@ -36,8 +34,28 @@ gem "moment_timezone-rails" # Rails 6 has native support for multiple dbs, so prefer that over multiverse after upgrade. # https://github.com/ankane/multiverse#upgrading-to-rails-6 gem "multiverse" -gem "newrelic_rpm" gem "nokogiri", ">= 1.11.0.rc4" + +gem "opentelemetry-exporter-otlp", require: false +gem "opentelemetry-sdk", require: false + +gem "opentelemetry-instrumentation-action_pack", require: false +gem "opentelemetry-instrumentation-action_view", require: false +gem "opentelemetry-instrumentation-active_job", require: false +gem "opentelemetry-instrumentation-active_model_serializers", require: false +gem "opentelemetry-instrumentation-active_record", require: false +gem "opentelemetry-instrumentation-aws_sdk", require: false +gem "opentelemetry-instrumentation-concurrent_ruby", require: false +gem "opentelemetry-instrumentation-faraday", require: false +gem "opentelemetry-instrumentation-http", require: false +gem "opentelemetry-instrumentation-http_client", require: false +gem "opentelemetry-instrumentation-net_http", require: false +gem "opentelemetry-instrumentation-pg", require: false +gem "opentelemetry-instrumentation-rack", require: false +gem "opentelemetry-instrumentation-rails", require: false +gem "opentelemetry-instrumentation-rake", require: false +gem "opentelemetry-instrumentation-redis", require: false + gem "paper_trail", "~> 12.0" # Used to speed up reporting gem "parallel" @@ -62,7 +80,7 @@ gem "rainbow" # React gem "react_on_rails", "11.3.0" gem "redis-mutex" -gem "redis-namespace" +gem "redis-namespace", "~> 1.11.0" gem "redis-rails", "~> 5.0.2" gem "request_store" gem "roo", "~> 2.7" @@ -122,7 +140,8 @@ group :test, :development, :demo do gem "rubocop-performance" gem "rubocop-rails" gem "scss_lint", require: false - gem "simplecov", git: "https://github.com/colszowka/simplecov.git", require: false + gem "simplecov", require: false + gem "simplecov-lcov", require: false gem "single_cov" gem "sniffybara", git: "https://github.com/department-of-veterans-affairs/sniffybara.git" gem "sql_tracker" diff --git a/Gemfile.lock b/Gemfile.lock index 2239aa22953..9930164e7b1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,12 +1,3 @@ -GIT - remote: https://github.com/colszowka/simplecov.git - revision: 783c9d7e9995f3ea9baf9fbb517c1d0ceb12acdb - specs: - simplecov (0.15.1) - docile (~> 1.1.0) - json (>= 1.8, < 3) - simplecov-html (~> 0.10.0) - GIT remote: https://github.com/department-of-veterans-affairs/caseflow-commons revision: 716b58caf2116da5fca21c3b3aeea6c9712f3b9d @@ -1529,8 +1520,6 @@ GEM database_cleaner-core (~> 2.0.0) database_cleaner-core (2.0.1) date (3.3.3) - ddtrace (0.34.1) - msgpack debase (0.2.4.1) debase-ruby_core_source (>= 0.10.2) debase-ruby_core_source (0.10.14) @@ -1543,8 +1532,7 @@ GEM rake (> 10, < 13) thor (~> 0.19) diff-lcs (1.3) - docile (1.1.5) - dogstatsd-ruby (4.4.0) + docile (1.4.0) dotenv (2.7.5) dotenv-rails (2.7.5) dotenv (= 2.7.5) @@ -1615,6 +1603,9 @@ GEM rchardet (~> 1.8) globalid (1.1.0) activesupport (>= 5.0) + google-protobuf (3.25.4) + googleapis-common-protos-types (1.15.0) + google-protobuf (>= 3.18, < 5.a) govdelivery-tms (2.8.4) activesupport faraday @@ -1658,7 +1649,6 @@ GEM rails-dom-testing (>= 1, < 3) railties (>= 4.2.0) thor (>= 0.14, < 2.0) - json (2.3.0) json-schema (4.3.0) addressable (>= 2.8) json_schemer (0.2.16) @@ -1737,7 +1727,6 @@ GEM timeout net-smtp (0.3.3) net-protocol - newrelic_rpm (6.5.0.357) nio4r (2.5.9) no_proxy_fix (0.1.2) nokogiri (1.15.5) @@ -1751,6 +1740,92 @@ GEM faraday (>= 0.9) sawyer (~> 0.8.0, >= 0.5.3) open4 (1.3.4) + opentelemetry-api (1.1.0) + opentelemetry-common (0.19.7) + opentelemetry-api (~> 1.0) + opentelemetry-exporter-otlp (0.24.2) + google-protobuf (~> 3.19) + googleapis-common-protos-types (~> 1.3) + opentelemetry-api (~> 1.1) + opentelemetry-common (~> 0.19.6) + opentelemetry-sdk (~> 1.2) + opentelemetry-semantic_conventions + opentelemetry-instrumentation-action_pack (0.5.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-rack (~> 0.21) + opentelemetry-instrumentation-action_view (0.4.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-active_support (~> 0.1) + opentelemetry-instrumentation-base (~> 0.20) + opentelemetry-instrumentation-active_job (0.4.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-active_model_serializers (0.19.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-active_record (0.5.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + ruby2_keywords + opentelemetry-instrumentation-active_support (0.3.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-aws_sdk (0.3.2) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-base (0.21.1) + opentelemetry-api (~> 1.0) + opentelemetry-registry (~> 0.1) + opentelemetry-instrumentation-concurrent_ruby (0.20.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-faraday (0.22.0) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.19.3) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-http (0.21.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-http_client (0.21.0) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.19.3) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-net_http (0.21.1) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.19.3) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-pg (0.23.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-rack (0.22.1) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.19.3) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-rails (0.25.0) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-action_pack (~> 0.5.0) + opentelemetry-instrumentation-action_view (~> 0.4.0) + opentelemetry-instrumentation-active_job (~> 0.4.0) + opentelemetry-instrumentation-active_record (~> 0.5.0) + opentelemetry-instrumentation-active_support (~> 0.3.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-rake (0.1.1) + opentelemetry-api (~> 1.0) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-instrumentation-redis (0.24.1) + opentelemetry-api (~> 1.0) + opentelemetry-common (~> 0.19.3) + opentelemetry-instrumentation-base (~> 0.21.0) + opentelemetry-registry (0.2.0) + opentelemetry-api (~> 1.1) + opentelemetry-sdk (1.2.1) + opentelemetry-api (~> 1.1) + opentelemetry-common (~> 0.19.3) + opentelemetry-registry (~> 0.2) + opentelemetry-semantic_conventions + opentelemetry-semantic_conventions (1.10.0) + opentelemetry-api (~> 1.0) paper_trail (12.3.0) activerecord (>= 5.2) request_store (~> 1.1) @@ -1840,8 +1915,8 @@ GEM redis-namespace (~> 1.0) redis-mutex (4.0.2) redis-classy (~> 2.0) - redis-namespace (1.6.0) - redis (>= 3.0.4) + redis-namespace (1.11.0) + redis (>= 4) redis-rack (2.0.4) rack (>= 1.5, < 3) redis-store (>= 1.2, < 2) @@ -1918,6 +1993,7 @@ GEM ruby-plsql (0.8.0) ruby-prof (1.4.1) ruby-progressbar (1.13.0) + ruby2_keywords (0.0.5) ruby_dep (1.5.0) ruby_parser (3.20.3) sexp_processor (~> 4.16) @@ -1962,7 +2038,13 @@ GEM thor shoulda-matchers (5.3.0) activesupport (>= 5.2.0) - simplecov-html (0.10.2) + simplecov (0.22.0) + docile (~> 1.1) + simplecov-html (~> 0.11) + simplecov_json_formatter (~> 0.1) + simplecov-html (0.12.3) + simplecov-lcov (0.8.0) + simplecov_json_formatter (0.1.4) single_cov (1.3.2) sixarm_ruby_unaccent (1.2.0) socksify (1.7.1) @@ -2070,10 +2152,8 @@ DEPENDENCIES countries danger (~> 6.2.2) database_cleaner-active_record (= 2.0.0) - ddtrace debase derailed_benchmarks - dogstatsd-ruby dotenv-rails dry-schema (~> 1.4) factory_bot_rails (~> 5.2) @@ -2094,8 +2174,25 @@ DEPENDENCIES meta_request moment_timezone-rails multiverse - newrelic_rpm nokogiri (>= 1.11.0.rc4) + opentelemetry-exporter-otlp + opentelemetry-instrumentation-action_pack + opentelemetry-instrumentation-action_view + opentelemetry-instrumentation-active_job + opentelemetry-instrumentation-active_model_serializers + opentelemetry-instrumentation-active_record + opentelemetry-instrumentation-aws_sdk + opentelemetry-instrumentation-concurrent_ruby + opentelemetry-instrumentation-faraday + opentelemetry-instrumentation-http + opentelemetry-instrumentation-http_client + opentelemetry-instrumentation-net_http + opentelemetry-instrumentation-pg + opentelemetry-instrumentation-rack + opentelemetry-instrumentation-rails + opentelemetry-instrumentation-rake + opentelemetry-instrumentation-redis + opentelemetry-sdk paper_trail (~> 12.0) parallel paranoia (~> 2.2) @@ -2114,7 +2211,7 @@ DEPENDENCIES rb-readline react_on_rails (= 11.3.0) redis-mutex - redis-namespace + redis-namespace (~> 1.11.0) redis-rails (~> 5.0.2) request_store roo (~> 2.7) @@ -2138,7 +2235,8 @@ DEPENDENCIES sentry-raven shoryuken (= 3.1.11) shoulda-matchers - simplecov! + simplecov + simplecov-lcov single_cov sniffybara! solargraph diff --git a/README.md b/README.md index a9f82e9f92d..281703aa1e2 100644 --- a/README.md +++ b/README.md @@ -137,13 +137,6 @@ See debugging steps as well as more information about FACOLS in our [wiki](https Review the [FACOLS documentation](docs/FACOLS.md) for details. ## Monitoring ####################################################### -We use NewRelic to monitor the app. By default, it's disabled locally. To enable it, do: - -``` -NEW_RELIC_LICENSE_KEY='' NEW_RELIC_AGENT_ENABLED=true bundle exec foreman start -``` - -You may wish to do this if you are debugging our NewRelic integration, for instance. --- diff --git a/app/controllers/api/application_controller.rb b/app/controllers/api/application_controller.rb index ea12981e0fc..9d189fa5a82 100644 --- a/app/controllers/api/application_controller.rb +++ b/app/controllers/api/application_controller.rb @@ -3,8 +3,6 @@ class Api::ApplicationController < ActionController::Base protect_from_forgery with: :null_session - include TrackRequestId - force_ssl if: :ssl_enabled? before_action :strict_transport_security diff --git a/app/controllers/application_base_controller.rb b/app/controllers/application_base_controller.rb index 41f55a7fe3b..bfdba59f926 100644 --- a/app/controllers/application_base_controller.rb +++ b/app/controllers/application_base_controller.rb @@ -6,8 +6,6 @@ class ApplicationBaseController < ActionController::Base # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception - include TrackRequestId - force_ssl if: :ssl_enabled? before_action :check_out_of_service before_action :strict_transport_security diff --git a/app/controllers/concerns/track_request_id.rb b/app/controllers/concerns/track_request_id.rb deleted file mode 100644 index 188256c88f0..00000000000 --- a/app/controllers/concerns/track_request_id.rb +++ /dev/null @@ -1,13 +0,0 @@ -# frozen_string_literal: true - -module TrackRequestId - extend ActiveSupport::Concern - - included do - before_action :track_request_id - end - - def track_request_id - ::NewRelic::Agent.add_custom_attributes(request_id: request.uuid) - end -end diff --git a/app/controllers/dependencies_checks_controller.rb b/app/controllers/dependencies_checks_controller.rb index ee42e93b5c8..a39f57a4be0 100644 --- a/app/controllers/dependencies_checks_controller.rb +++ b/app/controllers/dependencies_checks_controller.rb @@ -1,8 +1,6 @@ # frozen_string_literal: true class DependenciesChecksController < ApplicationBaseController - newrelic_ignore_apdex - skip_before_action :check_out_of_service def show diff --git a/app/controllers/health_checks_controller.rb b/app/controllers/health_checks_controller.rb index 4ee3acc4440..4451296b081 100644 --- a/app/controllers/health_checks_controller.rb +++ b/app/controllers/health_checks_controller.rb @@ -2,11 +2,9 @@ # rubocop:disable Rails/ApplicationController class HealthChecksController < ActionController::Base - include TrackRequestId include CollectCustomMetrics protect_from_forgery with: :exception - newrelic_ignore_apdex def show body = { diff --git a/app/jobs/caseflow_job.rb b/app/jobs/caseflow_job.rb index b9717f403b0..c03e375a05c 100644 --- a/app/jobs/caseflow_job.rb +++ b/app/jobs/caseflow_job.rb @@ -7,7 +7,6 @@ class CaseflowJob < ApplicationJob job.start_time = Time.zone.now end - # Automatically report runtime to DataDog if job does not explicitly report to DataDog. # Note: This block is not called if an error occurs when `perform` is executed -- # see https://stackoverflow.com/questions/50263787/does-active-job-call-after-perform-when-perform-raises-an-error after_perform do |job| diff --git a/app/jobs/update_cached_appeals_attributes_job.rb b/app/jobs/update_cached_appeals_attributes_job.rb index 3bf31ad2eff..ad78ee9e564 100644 --- a/app/jobs/update_cached_appeals_attributes_job.rb +++ b/app/jobs/update_cached_appeals_attributes_job.rb @@ -124,9 +124,6 @@ def log_error(start_time, err) # We do not log every job failure since we expect the job to occasionally fail when we lose # database connections. Since this job runs regularly, we will continue to cache appeals and we # have set up alerts to notify us if we have cached too few appeals over the past day: - # * (Too little Postgres data cached) https://app.datadoghq.com/monitors/41421962 - # * (Too little VACOLS data cached) https://app.datadoghq.com/monitors/41234223 - # * (Job has not succeeded in the past day) https://app.datadoghq.com/monitors/41423568 record_error_in_metrics_service metrics_service_report_runtime(metric_group_name: METRIC_GROUP_NAME) diff --git a/app/jobs/virtual_hearings/create_conference_job.rb b/app/jobs/virtual_hearings/create_conference_job.rb index e88973d77c0..0c390164315 100644 --- a/app/jobs/virtual_hearings/create_conference_job.rb +++ b/app/jobs/virtual_hearings/create_conference_job.rb @@ -123,7 +123,7 @@ def log_virtual_hearing_state(virtual_hearing) Rails.logger.info("Establishment Updated At: (#{virtual_hearing.establishment.updated_at})") end - def create_conference_datadog_tags + def create_conference_tags custom_metric_info.merge(attrs: { hearing_id: virtual_hearing.hearing_id }) end @@ -149,12 +149,12 @@ def create_conference virtual_hearing.establishment.update_error!(error_display) - MetricsService.increment_counter(metric_name: "created_conference.failed", **create_conference_datadog_tags) + MetricsService.increment_counter(metric_name: "created_conference.failed", **create_conference_tags) fail pexip_response.error end - MetricsService.increment_counter(metric_name: "created_conference.successful", **create_conference_datadog_tags) + MetricsService.increment_counter(metric_name: "created_conference.successful", **create_conference_tags) virtual_hearing.update(conference_id: pexip_response.data[:conference_id]) end diff --git a/app/jobs/virtual_hearings/delete_conferences_job.rb b/app/jobs/virtual_hearings/delete_conferences_job.rb index fcc77df526f..9f713c64cf5 100644 --- a/app/jobs/virtual_hearings/delete_conferences_job.rb +++ b/app/jobs/virtual_hearings/delete_conferences_job.rb @@ -117,13 +117,13 @@ def count_deleted_and_log(enumerable) if removed > 0 MetricsService.increment_counter( - metric_name: "deleted_conferences.successful", by: removed, ** custom_metric_info + metric_name: "deleted_conferences.successful", ** custom_metric_info ) end if failed > 0 MetricsService.increment_counter( - metric_name: "deleted_conferences.failed", by: failed, ** custom_metric_info + metric_name: "deleted_conferences.failed", ** custom_metric_info ) end end diff --git a/app/models/metric.rb b/app/models/metric.rb index 3e3f515bfa2..ecdf62164b4 100644 --- a/app/models/metric.rb +++ b/app/models/metric.rb @@ -7,7 +7,6 @@ class Metric < CaseflowRecord METRIC_TYPES = { error: "error", log: "log", performance: "performance", info: "info" }.freeze LOG_SYSTEMS = { dynatrace: "dynatrace", - datadog: "datadog", rails_console: "rails_console", javascript_console: "javascript_console" }.freeze diff --git a/app/services/collectors/stats_collector.rb b/app/services/collectors/stats_collector.rb index 5eebb3a2ad5..f3148196c5c 100644 --- a/app/services/collectors/stats_collector.rb +++ b/app/services/collectors/stats_collector.rb @@ -11,7 +11,7 @@ def flatten_stats(metric_name_prefix, stats_hash) stats_hash.each do |metric_name, counts_hash| unless valid_metric_name?(metric_name) fail "Invalid metric name #{metric_name}; "\ - "see https://docs.datadoghq.com/developers/metrics/#naming-custom-metrics" + "see https://docs.dynatrace.com/docs/extend-dynatrace/extend-metrics/reference/custom-metric-metadata" end stats.concat add_tags_to_group_counts(metric_name_prefix, metric_name, counts_hash) @@ -29,7 +29,7 @@ def add_tags_to_group_counts(prefix, metric_name, group_counts) end end - # See valid tag name rules at https://docs.datadoghq.com/tagging/#defining-tags + # See valid tag name rules at https://docs.dynatrace.com/docs/manage/tags-and-metadata/setup/how-to-define-tags def to_valid_tag(name) name.gsub(/[^a-zA-Z_\-\:\.\d\/]/, "__") end @@ -41,7 +41,7 @@ def to_valid_tag_key(name) end def valid_metric_name?(metric_name) - # Actual limit is 200 but since the actual metric name in DataDog has + # Actual limit is 200 but since the actual metric name has # "dsva_appeals.stats_collector_job." prepended, let's just stick with a 150 character limit. return false if metric_name.length > 150 diff --git a/app/services/geomatch_service.rb b/app/services/geomatch_service.rb index 0d3e53a13e4..6d8645a5e1a 100644 --- a/app/services/geomatch_service.rb +++ b/app/services/geomatch_service.rb @@ -73,7 +73,6 @@ def record_geomatched_appeal(status) metric_name: "geomatched_appeals", attrs: { status: status, - appeal_external_id: appeal.external_id, hearing_request_type: appeal.current_hearing_request_type } ) diff --git a/app/services/hearings/reminder_service.rb b/app/services/hearings/reminder_service.rb index 936f60aff4c..4076b053f65 100644 --- a/app/services/hearings/reminder_service.rb +++ b/app/services/hearings/reminder_service.rb @@ -51,7 +51,6 @@ def send_to_metrics_service(type) metric_name: "emails.would_be_sent", attrs: { reminder_type: type, - hearing_id: hearing.id, request_type: hearing.hearing_request_type, hearing_type: hearing.class.name } diff --git a/app/services/metrics_service.rb b/app/services/metrics_service.rb index 08c2dbb68c4..82fff42f6d9 100644 --- a/app/services/metrics_service.rb +++ b/app/services/metrics_service.rb @@ -1,18 +1,14 @@ # frozen_string_literal: true require "benchmark" -require "datadog/statsd" require "statsd-instrument" # see https://dropwizard.github.io/metrics/3.1.0/getting-started/ for abstractions on metric types class MetricsService - @statsd = Datadog::Statsd.new - # :reek:LongParameterList - def self.increment_counter(metric_group:, metric_name:, app_name:, attrs: {}, by: 1) + def self.increment_counter(metric_group:, metric_name:, app_name:, attrs: {}) tags = get_tags(app_name, attrs) stat_name = get_stat_name(metric_group, metric_name) - @statsd.increment(stat_name, tags: tags, by: by) # Dynatrace statD implementation StatsD.increment(stat_name, tags: tags) @@ -34,7 +30,6 @@ def self.record_runtime(metric_group:, app_name:, start_time: Time.zone.now) def self.emit_gauge(metric_group:, metric_name:, metric_value:, app_name:, attrs: {}) tags = get_tags(app_name, attrs) stat_name = get_stat_name(metric_group, metric_name) - @statsd.gauge(stat_name, metric_value, tags: tags) # Dynatrace statD implementation StatsD.gauge(stat_name, metric_value, tags: tags) @@ -45,7 +40,6 @@ def self.emit_gauge(metric_group:, metric_name:, metric_value:, app_name:, attrs def self.histogram(metric_group:, metric_name:, metric_value:, app_name:, attrs: {}) tags = get_tags(app_name, attrs) stat_name = get_stat_name(metric_group, metric_name) - @statsd.histogram(stat_name, metric_value, tags: tags) # Dynatrace statD implementation StatsD.histogram(stat_name, metric_value, tags: tags) @@ -98,7 +92,6 @@ def self.record(description, service: nil, name: "unknown", caller: nil) } MetricsService.emit_gauge(sent_to_info) - sent_to << Metric::LOG_SYSTEMS[:datadog] sent_to << Metric::LOG_SYSTEMS[:dynatrace] end diff --git a/app/views/layouts/_head.html.erb b/app/views/layouts/_head.html.erb index d502c1fb968..279790378b6 100644 --- a/app/views/layouts/_head.html.erb +++ b/app/views/layouts/_head.html.erb @@ -12,7 +12,6 @@ <%= render "layouts/head_sentry" %> diff --git a/app/views/layouts/_head_new_relic.html.erb b/app/views/layouts/_head_new_relic.html.erb deleted file mode 100644 index 067774b1547..00000000000 --- a/app/views/layouts/_head_new_relic.html.erb +++ /dev/null @@ -1,13 +0,0 @@ - - // To avoid sending PII to New Relic, we will disable its error logging functionality. - // In anecdotal testing, the error logging functionality didn't even seem to work - // particularly well. - // - // We wrap this in a conditional because newrelic will not be defined when browser - // monitoring is not enabled. This will occur in local development when the - // NEW_RELIC_AGENT_ENABLED env var is not set, for instance. - if (window.newrelic) { - window.newrelic.setErrorHandler(function() { - return true; - }); - } diff --git a/config/initializers/datadog.rb b/config/initializers/datadog.rb deleted file mode 100644 index 033ae4f776f..00000000000 --- a/config/initializers/datadog.rb +++ /dev/null @@ -1,14 +0,0 @@ -unless Rails.env.test? - Datadog.configure do |c| - options = { analytics_enabled: true } - - c.analytics_enabled = true - c.use :rails, options - c.use :active_record, options - c.use :rack, options - c.use :redis, options - c.use :shoryuken, options - - c.env = ENV['DEPLOY_ENV'] - end -end diff --git a/config/initializers/open_telemetry.rb b/config/initializers/open_telemetry.rb new file mode 100644 index 00000000000..1eaf079c9e9 --- /dev/null +++ b/config/initializers/open_telemetry.rb @@ -0,0 +1,73 @@ +# frozen_string_literal: true +require 'rubygems' +require 'bundler/setup' + +require 'opentelemetry/sdk' +require 'opentelemetry/exporter/otlp' + +require "opentelemetry-instrumentation-action_pack" +require "opentelemetry-instrumentation-action_view" +require "opentelemetry-instrumentation-active_job" +require "opentelemetry-instrumentation-active_record" +require "opentelemetry-instrumentation-active_support" +require "opentelemetry-instrumentation-aws_sdk" +require "opentelemetry-instrumentation-concurrent_ruby" +require "opentelemetry-instrumentation-faraday" +require "opentelemetry-instrumentation-http_client" +require "opentelemetry-instrumentation-net_http" +require "opentelemetry-instrumentation-pg" +require "opentelemetry-instrumentation-rack" +require "opentelemetry-instrumentation-rails" +require "opentelemetry-instrumentation-rake" +require "opentelemetry-instrumentation-redis" + +# rubocop:disable Layout/LineLength + +DT_API_URL = ENV["DT_API_URL"] +DT_API_TOKEN = ENV["DT_API_TOKEN"] + +Rails.logger.info("DT_API_TOKEN is set to #{DT_API_TOKEN}") + +if !Rails.env.development? && !Rails.env.test? && !Rails.env.demo? + OpenTelemetry::SDK.configure do |c| + c.service_name = 'caseflow' + c.service_version = '1.0.1' + + c.use 'OpenTelemetry::Instrumentation::ActiveRecord' + c.use 'OpenTelemetry::Instrumentation::Rack', { untraced_endpoints: ['/health-check', '/sample', '/logs'] } + c.use 'OpenTelemetry::Instrumentation::Rails' + + # c.use 'OpenTelemetry::Instrumentation::PG' + # c.use 'OpenTelemetry::Instrumentation::ActionView' + # c.use 'OpenTelemetry::Instrumentation::Redis' + + c.use 'OpenTelemetry::Instrumentation::ActionPack' + c.use 'OpenTelemetry::Instrumentation::ActiveSupport' + c.use 'OpenTelemetry::Instrumentation::ActiveJob' + c.use 'OpenTelemetry::Instrumentation::AwsSdk', { suppress_internal_instrumentation: true } + c.use 'OpenTelemetry::Instrumentation::ConcurrentRuby' + c.use 'OpenTelemetry::Instrumentation::Faraday' + c.use 'OpenTelemetry::Instrumentation::HttpClient' + c.use 'OpenTelemetry::Instrumentation::Net::HTTP' + + Rails.logger.info("Loaded instruments") + + %w[dt_metadata_e617c525669e072eebe3d0f08212e8f2.properties /var/lib/dynatrace/enrichment/dt_host_metadata.properties].each { |name| + begin + c.resource = OpenTelemetry::SDK::Resources::Resource.create(Hash[*File.read(name.start_with?("/var") ? name : File.read(name)).split(/[=\n]+/)]) + rescue + end + } + c.add_span_processor( + OpenTelemetry::SDK::Trace::Export::BatchSpanProcessor.new( + OpenTelemetry::Exporter::OTLP::Exporter.new( + endpoint: DT_API_URL + "/v1/traces", + headers: { + "Authorization": "Api-Token " + DT_API_TOKEN + } + ) + ) + ) + end +end + # rubocop:enable Layout/LineLength diff --git a/config/initializers/rack_context.rb b/config/initializers/rack_context.rb new file mode 100644 index 00000000000..974951fd6ed --- /dev/null +++ b/config/initializers/rack_context.rb @@ -0,0 +1,24 @@ +class RackContextGetter < OpenTelemetry::Context::Propagation::RackEnvGetter + + # :reek:FeatureEnvy + def get(carrier, key) + carrier[to_rack_key(key)] || carrier[key] + end + + protected + + def to_rack_key(key) + ret = +"HTTP_#{key}" + ret.tr!('-', '_') + ret.upcase! + ret + end +end + +RACK_ENV_GETTER = RackContextGetter.new + +OpenTelemetry::Common::Propagation.instance_eval do + def rack_env_getter + RACK_ENV_GETTER + end +end diff --git a/config/initializers/vacols_request_spy.rb b/config/initializers/vacols_request_spy.rb index 939f77dac4b..d79b92df7d6 100644 --- a/config/initializers/vacols_request_spy.rb +++ b/config/initializers/vacols_request_spy.rb @@ -32,8 +32,6 @@ def simulate_vacols_latency # $> REACT_ON_RAILS_ENV=HOT SIMULATE_VACOLS_LATENCY=true bundle exec rails s -p 3000 return unless ENV["SIMULATE_VACOLS_LATENCY"] - # Default determined from metrics sent to Datadog: - # https://app.datadoghq.com/dashboard/54w-efy-r5d/va-systems?fullscreen_widget=399796003 latency = ENV["VACOLS_DELAY_MS"] || 80 sleep(latency / 1000.0) end diff --git a/docker-bin/build.sh b/docker-bin/build.sh index 797ebaff5ab..435d00482d5 100755 --- a/docker-bin/build.sh +++ b/docker-bin/build.sh @@ -41,8 +41,6 @@ fi cd ../../ printf "commit: `git rev-parse HEAD`\ndate: `git log -1 --format=%cd`" > config/build_version.yml -credstash -t appeals-credstash get datadog.api.key > config/datadog.key - cp /etc/ssl/certs/ca-certificates.crt docker-bin/ca-certs/cacert.pem # Build Docker @@ -50,7 +48,6 @@ echo -e "\tCreating Caseflow App Docker Image" docker build -t caseflow . result=$? echo -e "\tCleaning Up..." -rm -rf config/datadog.key rm -rf docker-bin/oracle_libs if [ $result == 0 ]; then echo -e "\tBuilding Caseflow Docker App: Completed" diff --git a/docker-bin/startup.sh b/docker-bin/startup.sh index 97a73eeae4e..5a62bfce5c5 100644 --- a/docker-bin/startup.sh +++ b/docker-bin/startup.sh @@ -8,12 +8,6 @@ source $THIS_SCRIPT_DIR/env.sh echo "Start DBus" dbus-daemon --system -echo "Start Datadog" -nohup /opt/datadog-agent/bin/agent/agent run -p /opt/datadog-agent/run/agent.pid > dd-agent.out & -nohup /opt/datadog-agent/embedded/bin/trace-agent --config /etc/datadog-agent/datadog.yaml --pid /opt/datadog-agent/run/trace-agent.pid > dd-trace.out & -nohup /opt/datadog-agent/embedded/bin/system-probe --config=/etc/datadog-agent/system-probe.yaml --pid=/opt/datadog-agent/run/system-probe.pid > dd-probe.out & -nohup /opt/datadog-agent/embedded/bin/process-agent --config=/etc/datadog-agent/datadog.yaml --sysprobe-config=/etc/datadog-agent/system-probe.yaml --pid=/opt/datadog-agent/run/process-agent.pid > dd-system-probe.out & - echo "Waiting for dependencies to properly start up - 240 seconds" date sleep 240 diff --git a/newrelic.yml b/newrelic.yml deleted file mode 100644 index c074e6089ed..00000000000 --- a/newrelic.yml +++ /dev/null @@ -1,49 +0,0 @@ -# -# Generated November 03, 2017 -# -# For full documentation of agent configuration options, please refer to -# https://docs.newrelic.com/docs/agents/ruby-agent/installation-configuration/ruby-agent-configuration -common: &default_settings - app_name: Caseflow - - # Logging level for log/newrelic_agent.log - log_level: info - - # Exception messages may have PII, so we won't send them. - # If we are sure that certain exceptions will not have PII, then we can whitelist them in this config file. - strip_exception_messages.enabled: true - - # To avoid sending PII, we explicitly deny all headers and parameters. We then whitelist known safe attributes. - attributes.exclude: [response.headers.*, request.headers.*, request.parameters.*] - attributes.include: [ - response.headers.contentType, - response.headers.contentLength, - request.headers.userAgent, - request.headers.accept, - request.headers.host, - request.headers.contentType, - ] - -# Environment-specific settings are in this section. -# RAILS_ENV or RACK_ENV (as appropriate) is used to determine the environment. -# If your application has other named environments, configure them here. -development: - <<: *default_settings - app_name: Caseflow (Local Dev) - agent_enabled: false - -demo: - <<: *default_settings - app_name: Caseflow (Demo) - -test: - <<: *default_settings - # It doesn't make sense to report to New Relic from automated test runs. - monitor_mode: false - -staging: - <<: *default_settings - app_name: Caseflow (Staging) - -production: - <<: *default_settings diff --git a/spec/jobs/virtual_hearings/delete_conferences_job_spec.rb b/spec/jobs/virtual_hearings/delete_conferences_job_spec.rb index 527fda1e772..55bf82f74b1 100644 --- a/spec/jobs/virtual_hearings/delete_conferences_job_spec.rb +++ b/spec/jobs/virtual_hearings/delete_conferences_job_spec.rb @@ -188,8 +188,7 @@ expect(MetricsService).to receive(:increment_counter).with( hash_including( metric_name: "deleted_conferences.successful", - metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME, - by: 2 + metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME ) ) subject @@ -213,8 +212,7 @@ expect(MetricsService).to receive(:increment_counter).with( hash_including( metric_name: "deleted_conferences.failed", - metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME, - by: 2 + metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME ) ) subject @@ -241,8 +239,7 @@ expect(MetricsService).to receive(:increment_counter).with( hash_including( metric_name: "deleted_conferences.successful", - metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME, - by: 2 + metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME ) ) subject @@ -270,8 +267,7 @@ expect(MetricsService).to receive(:increment_counter).with( hash_including( metric_name: "deleted_conferences.failed", - metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME, - by: 2 + metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME ) ) subject @@ -295,16 +291,14 @@ expect(MetricsService).to receive(:increment_counter).with( hash_including( metric_name: "deleted_conferences.successful", - metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME, - by: 2 + metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME ) ) expect(MetricsService).to receive(:increment_counter).with( hash_including( metric_name: "deleted_conferences.failed", - metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME, - by: 2 + metric_group: Constants.DATADOG_METRICS.HEARINGS.VIRTUAL_HEARINGS_GROUP_NAME ) ) diff --git a/spec/services/metrics_service_spec.rb b/spec/services/metrics_service_spec.rb index 9b349e84ebe..da2df30db23 100644 --- a/spec/services/metrics_service_spec.rb +++ b/spec/services/metrics_service_spec.rb @@ -63,7 +63,7 @@ service: service, endpoint: name }, - sent_to: [["rails_console"], "datadog", "dynatrace"], + sent_to: [["rails_console"], "dynatrace"], sent_to_info: { metric_group: "service", metric_name: "request_latency",