Commit 3f5a2969 authored by Bob Van Landuyt's avatar Bob Van Landuyt 💬
Browse files

Merge branch 'redact-sql' into 'master'

tracing: redact values in sql statements

See merge request gitlab-org/labkit-ruby!46
parents fa9fd8d4 6f3fc171
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -25,6 +25,7 @@ Gem::Specification.new do |spec|
  spec.add_runtime_dependency "jaeger-client", "~> 1.1"
  spec.add_runtime_dependency "opentracing", "~> 0.4"
  spec.add_runtime_dependency "redis", ">3.0.0", "<5.0.0"
  spec.add_runtime_dependency "gitlab-pg_query", "~> 1.3"

  # Please maintain alphabetical order for dev dependencies
  spec.add_development_dependency "grpc-tools", "~> 1.19"
+8 −0
Original line number Diff line number Diff line
# frozen_string_literal: true

require "pg_query"

module Labkit
  module Logging
    # Sanitizer provides log message sanitization, removing
@@ -22,6 +24,12 @@ module Labkit
        content
      end

      def self.sanitize_sql(sql)
        PgQuery.normalize(sql)
      rescue PgQuery::ParseError
        ""
      end

      # Ensures that URLS are sanitized to hide credentials
      def self.mask_url(url)
        url = url.to_s.strip
+6 −0
Original line number Diff line number Diff line
@@ -28,6 +28,12 @@ module Labkit
      ENV["GITLAB_TRACING_URL"]
    end

    # Check if the current request is being traced.
    def self.sampled?
      context = OpenTracing.active_span&.context
      context && context.respond_to?(:sampled?) && context.sampled?
    end

    def self.stacktrace_operations
      @stacktrace_operations ||= Set.new(ENV["GITLAB_TRACING_INCLUDE_STACKTRACE"].to_s.split(",").map(&:strip))
    end
+2 −1
Original line number Diff line number Diff line
@@ -14,13 +14,14 @@ module Labkit
          end

          def tags(payload)
            sql = Labkit::Logging::Sanitizer.sanitize_sql(payload[:sql]) if Labkit::Tracing.sampled? && payload[:sql]
            {
              "component" => COMPONENT_TAG,
              "span.kind" => "client",
              "db.type" => "sql",
              "db.connection_id" => payload[:connection_id],
              "db.cached" => payload[:cached] || false,
              "db.statement" => payload[:sql],
              "db.statement" => sql,
            }
          end
        end
+13 −20
Original line number Diff line number Diff line
require_relative "../../../../support/tracing/rails/shared_examples"

describe Labkit::Tracing::Rails::ActiveRecord::SqlInstrumenter do
describe Labkit::Tracing::Rails::ActionView::RenderCollectionInstrumenter do
  using RSpec::Parameterized::TableSyntax

  where(:name, :operation_name, :exception, :connection_id, :cached, :cached_response, :sql) do
    nil | "active_record:sqlquery" | nil | nil | nil | false | nil
    "" | "active_record:sqlquery" | nil | nil | nil | false | nil
    "User Load" | "active_record:User Load" | nil | nil | nil | false | nil
    "Repo Load" | "active_record:Repo Load" | StandardError.new | nil | nil | false | nil
    nil | "active_record:sqlquery" | nil | 123 | nil | false | nil
    nil | "active_record:sqlquery" | nil | nil | false | false | nil
    nil | "active_record:sqlquery" | nil | nil | true | true | nil
    nil | "active_record:sqlquery" | nil | nil | true | true | "SELECT * FROM users"
  where(:identifier, :count, :expected_count, :cache_hits, :expected_cache_hits, :exception) do
    nil | nil | 0 | nil | 0 | nil
    "" | nil | 0 | nil | 0 | nil
    "show.haml" | nil | 0 | nil | 0 | nil
    nil | 0 | 0 | nil | 0 | nil
    nil | 1 | 1 | nil | 0 | nil
    nil | nil | 0 | 0 | 0 | nil
    nil | nil | 0 | 1 | 1 | nil
    nil | nil | 0 | nil | 0 | StandardError.new
  end

  with_them do
    it_behaves_like "a tracing instrumenter" do
      let(:expected_span_name) { operation_name }
      let(:payload) { { name: name, exception: exception, connection_id: connection_id, cached: cached, sql: sql } }
      let(:expected_span_name) { "render_collection" }
      let(:payload) { { exception: exception, identifier: identifier, count: count, cache_hits: cache_hits } }
      let(:expected_tags) do
        {
          "component" => "ActiveRecord",
          "span.kind" => "client",
          "db.type" => "sql",
          "db.connection_id" => connection_id,
          "db.cached" => cached_response,
          "db.statement" => sql,
        }
        { "component" => "ActionView", "template.id" => identifier, "template.count" => expected_count, "template.cache.hits" => expected_cache_hits }
      end
    end
  end
Loading