From fda9df7b4e328ed2bfc3dad05899ef6269495688 Mon Sep 17 00:00:00 2001
From: Jeremy Green <jeremy@octolabs.com>
Date: Sat, 16 Sep 2017 10:56:04 -0600
Subject: Update payload names for `sql.active_record` to be more descriptive.

Fixes #30586.
---
 activerecord/CHANGELOG.md                       |  7 +++
 activerecord/lib/active_record/relation.rb      |  8 +--
 activerecord/test/cases/instrumentation_test.rb | 72 +++++++++++++++++++++++++
 3 files changed, 83 insertions(+), 4 deletions(-)
 create mode 100644 activerecord/test/cases/instrumentation_test.rb

diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md
index b421fedc96..55c4214eee 100644
--- a/activerecord/CHANGELOG.md
+++ b/activerecord/CHANGELOG.md
@@ -1,3 +1,10 @@
+*   Update payload names for `sql.active_record` instrumentation to be
+    more descriptive.
+
+    Fixes #30586.
+
+    *Jeremy Green*
+
 *   Add new error class `TransactionTimeout` for MySQL adapter which will be raised
     when lock wait time expires.
 
diff --git a/activerecord/lib/active_record/relation.rb b/activerecord/lib/active_record/relation.rb
index 42a9d8492b..cf0d14f4e1 100644
--- a/activerecord/lib/active_record/relation.rb
+++ b/activerecord/lib/active_record/relation.rb
@@ -63,7 +63,7 @@ module ActiveRecord
 
       @klass.connection.insert(
         im,
-        "SQL",
+        "#{@klass} Create",
         primary_key || false,
         primary_key_value,
         nil,
@@ -86,7 +86,7 @@ module ActiveRecord
 
       @klass.connection.update(
         um,
-        "SQL",
+        "#{@klass} Update",
       )
     end
 
@@ -373,7 +373,7 @@ module ActiveRecord
         stmt.wheres = arel.constraints
       end
 
-      @klass.connection.update stmt, "SQL"
+      @klass.connection.update stmt, "#{@klass} Update All"
     end
 
     # Updates an object (or multiple objects) and saves it to the database, if validations pass.
@@ -503,7 +503,7 @@ module ActiveRecord
         stmt.wheres = arel.constraints
       end
 
-      affected = @klass.connection.delete(stmt, "SQL")
+      affected = @klass.connection.delete(stmt, "#{@klass} Destroy")
 
       reset
       affected
diff --git a/activerecord/test/cases/instrumentation_test.rb b/activerecord/test/cases/instrumentation_test.rb
new file mode 100644
index 0000000000..86ffe8b0d7
--- /dev/null
+++ b/activerecord/test/cases/instrumentation_test.rb
@@ -0,0 +1,72 @@
+# frozen_string_literal: true
+
+require "cases/helper"
+require "models/book"
+
+module ActiveRecord
+  class InstrumentationTest < ActiveRecord::TestCase
+    def test_payload_name_on_load
+      Book.create(name: "test book")
+      subscriber = ActiveSupport::Notifications.subscribe("sql.active_record") do |*args|
+        event = ActiveSupport::Notifications::Event.new *args
+        if event.payload[:sql].match "SELECT"
+          assert_equal "Book Load", event.payload[:name]
+        end
+      end
+      Book.first
+    ensure
+      ActiveSupport::Notifications.unsubscribe(subscriber) if subscriber
+    end
+
+    def test_payload_name_on_create
+      subscriber = ActiveSupport::Notifications.subscribe("sql.active_record") do |*args|
+        event = ActiveSupport::Notifications::Event.new *args
+        if event.payload[:sql].match "INSERT"
+          assert_equal "Book Create", event.payload[:name]
+        end
+      end
+      Book.create(name: "test book")
+    ensure
+      ActiveSupport::Notifications.unsubscribe(subscriber) if subscriber
+    end
+
+    def test_payload_name_on_update
+      subscriber = ActiveSupport::Notifications.subscribe("sql.active_record") do |*args|
+        event = ActiveSupport::Notifications::Event.new *args
+        if event.payload[:sql].match "UPDATE"
+          assert_equal "Book Update", event.payload[:name]
+        end
+      end
+      book = Book.create(name: "test book")
+      book.update_attribute(:name, "new name")
+    ensure
+      ActiveSupport::Notifications.unsubscribe(subscriber) if subscriber
+    end
+
+    def test_payload_name_on_update_all
+      subscriber = ActiveSupport::Notifications.subscribe("sql.active_record") do |*args|
+        event = ActiveSupport::Notifications::Event.new *args
+        if event.payload[:sql].match "UPDATE"
+          assert_equal "Book Update All", event.payload[:name]
+        end
+      end
+      Book.create(name: "test book")
+      Book.update_all(name: "new name")
+    ensure
+      ActiveSupport::Notifications.unsubscribe(subscriber) if subscriber
+    end
+
+    def test_payload_name_on_destroy
+      subscriber = ActiveSupport::Notifications.subscribe("sql.active_record") do |*args|
+        event = ActiveSupport::Notifications::Event.new *args
+        if event.payload[:sql].match "DELETE"
+          assert_equal "Book Destroy", event.payload[:name]
+        end
+      end
+      book = Book.create(name: "test book")
+      book.destroy
+    ensure
+      ActiveSupport::Notifications.unsubscribe(subscriber) if subscriber
+    end
+  end
+end
-- 
cgit v1.2.3