Commit 62670137 authored by Stan Hu's avatar Stan Hu Committed by Bob Van Landuyt
Browse files

Add SQL fingerprint to tags

parent bbd4db89
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -28,6 +28,12 @@ module Labkit
        ""
      end

      def self.sql_fingerprint(normalized_sql)
        PgQuery.parse(normalized_sql)&.fingerprint
      rescue PgQuery::ParseError
        ""
      end

      # Ensures that URLS are sanitized to hide credentials
      def self.mask_url(url)
        url = url.to_s.strip
+6 −1
Original line number Diff line number Diff line
@@ -14,7 +14,11 @@ module Labkit
          end

          def tags(payload)
            sql = Labkit::Logging::Sanitizer.sanitize_sql(payload[:sql]) if Labkit::Tracing.sampled? && payload[:sql]
            if Labkit::Tracing.sampled? && payload[:sql]
              sql = Labkit::Logging::Sanitizer.sanitize_sql(payload[:sql])
              fingerprint = Labkit::Logging::Sanitizer.sql_fingerprint(sql)
            end

            {
              "component" => COMPONENT_TAG,
              "span.kind" => "client",
@@ -22,6 +26,7 @@ module Labkit
              "db.connection_id" => payload[:connection_id],
              "db.cached" => payload[:cached] || false,
              "db.statement" => sql,
              "db.statement_fingerprint" => fingerprint,
            }
          end
        end
+14 −11
Original line number Diff line number Diff line
require_relative "../../../../support/tracing/shared_examples"

require "active_support"

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

  where(:name, :operation_name, :exception, :connection_id, :cached, :cached_response, :sql, :expected_sql, :tracing_sampled) do
    nil | "active_record:sqlquery" | nil | nil | nil | false | nil | nil | true
    "" | "active_record:sqlquery" | nil | nil | nil | false | nil | nil | true
    "User Load" | "active_record:User Load" | nil | nil | nil | false | nil | nil | true
    "Repo Load" | "active_record:Repo Load" | StandardError.new | nil | nil | false | nil | nil | true
    nil | "active_record:sqlquery" | nil | 123 | nil | false | nil | nil | true
    nil | "active_record:sqlquery" | nil | nil | false | false | nil | nil | true
    nil | "active_record:sqlquery" | nil | nil | true | true | nil | nil | true
    nil | "active_record:sqlquery" | nil | nil | true | true | "SELECT * FROM users" | "SELECT * FROM users" | true
    nil | "active_record:sqlquery" | nil | nil | true | true | "SELECT 42" | "SELECT $1" | true
    nil | "active_record:sqlquery" | nil | nil | true | true | "SELECT 42" | nil | false
  where(:name, :operation_name, :exception, :connection_id, :cached, :cached_response, :sql, :expected_sql, :expected_fingerprint, :tracing_sampled) do
    nil | "active_record:sqlquery" | nil | nil | nil | false | nil | nil | nil | true
    "" | "active_record:sqlquery" | nil | nil | nil | false | nil | nil | nil | true
    "User Load" | "active_record:User Load" | nil | nil | nil | false | nil | nil | nil | true
    "Repo Load" | "active_record:Repo Load" | StandardError.new | nil | nil | false | nil | nil | nil | true
    nil | "active_record:sqlquery" | nil | 123 | nil | false | nil | nil | nil | true
    nil | "active_record:sqlquery" | nil | nil | false | false | nil | nil | nil | true
    nil | "active_record:sqlquery" | nil | nil | true | true | nil | nil | nil | true
    nil | "active_record:sqlquery" | nil | nil | true | true | "SELECT * FROM users" | "SELECT * FROM users" | "267bb22fb46c39bf" | true
    nil | "active_record:sqlquery" | nil | nil | true | true | "SELECT 42" | "SELECT $1" | "50fde20626009aba" | true
    nil | "active_record:sqlquery" | nil | nil | true | true | "SELECT 42" | nil | nil | false
  end

  with_them do
@@ -28,6 +30,7 @@ describe Labkit::Tracing::Rails::ActiveRecord::SqlInstrumenter do
          "db.connection_id" => connection_id,
          "db.cached" => cached_response,
          "db.statement" => expected_sql,
          "db.statement_fingerprint" => expected_fingerprint,
        }
      end

+12 −0
Original line number Diff line number Diff line
@@ -90,4 +90,16 @@ describe Labkit::Logging::Sanitizer do
      it { expect(described_class.sanitize_sql(input)).to eq(output) }
    end
  end

  describe ".sql_fingerprint" do
    where(:input, :output) do
      "invalid sql" | ""
      "select 42" | "50fde20626009aba"
      %q[SELECT "routes".* FROM "routes" WHERE "routes"."source_type" = 'Namespace' AND "routes"."source_id" IN (1, 22, 23)] | "139b5a9eb28b075a"
    end

    with_them do
      it { expect(described_class.sql_fingerprint(input)).to eq(output) }
    end
  end
end