diff --git a/changelogs/unreleased/31064-ensure-diff-patch-size-limit-is-monitorable.yml b/changelogs/unreleased/31064-ensure-diff-patch-size-limit-is-monitorable.yml
new file mode 100644
index 0000000000000000000000000000000000000000..59bdb1905bede0daf77fad7d0bbf3216a10cff79
--- /dev/null
+++ b/changelogs/unreleased/31064-ensure-diff-patch-size-limit-is-monitorable.yml
@@ -0,0 +1,5 @@
+---
+title: Add `patch_hard_limit_bytes_hit` metric for monitoring diff patch size limit hits
+merge_request: 52456
+author:
+type: added
diff --git a/doc/administration/monitoring/prometheus/gitlab_metrics.md b/doc/administration/monitoring/prometheus/gitlab_metrics.md
index 105c0a408ce96aceb9bc4620151c311507912983..bd8236134a9d33844230a771c0e88c3ccef4c01e 100644
--- a/doc/administration/monitoring/prometheus/gitlab_metrics.md
+++ b/doc/administration/monitoring/prometheus/gitlab_metrics.md
@@ -71,6 +71,7 @@ The following metrics are available:
 | `gitlab_transaction_event_etag_caching_resource_changed_total` | Counter   |                    9.4 | Counter for ETag cache miss - resource changed                                                      | `endpoint`                                          |
 | `gitlab_transaction_event_fork_repository_total`               | Counter   |                    9.4 | Counter for repository forks (RepositoryForkWorker). Only incremented when source repository exists |                                                     |
 | `gitlab_transaction_event_import_repository_total`             | Counter   |                    9.4 | Counter for repository imports (RepositoryImportWorker)                                             |                                                     |
+| `gitlab_transaction_event_patch_hard_limit_bytes_hit_total`   | Counter   |                   13.9 | Counter for diff patch size limit hits                                                              |                                                     |
 | `gitlab_transaction_event_push_branch_total`                   | Counter   |                    9.4 | Counter for all branch pushes                                                                       |                                                     |
 | `gitlab_transaction_event_push_commit_total`                   | Counter   |                    9.4 | Counter for commits                                                                                 | `branch`                                            |
 | `gitlab_transaction_event_push_tag_total`                      | Counter   |                    9.4 | Counter for tag pushes                                                                              |                                                     |
diff --git a/lib/gitlab/git/diff.rb b/lib/gitlab/git/diff.rb
index 209917073c7eff38d7d08762b3acb5f03f680661..53df0b7b3895bd744d430fae3e8b427af5850a1b 100644
--- a/lib/gitlab/git/diff.rb
+++ b/lib/gitlab/git/diff.rb
@@ -244,6 +244,8 @@ def init_from_gitaly(gitaly_diff)
 
       def prune_diff_if_eligible
         if too_large?
+          ::Gitlab::Metrics.add_event(:patch_hard_limit_bytes_hit)
+
           too_large!
         elsif collapsed?
           collapse!
diff --git a/spec/lib/gitlab/git/diff_spec.rb b/spec/lib/gitlab/git/diff_spec.rb
index 783f0a9ccf771cec0f9d3fa307e2ec87656d34ad..17bb83d0f2f72a3f89fffd180520ba79c6309035 100644
--- a/spec/lib/gitlab/git/diff_spec.rb
+++ b/spec/lib/gitlab/git/diff_spec.rb
@@ -100,6 +100,13 @@
           expect(diff.diff).to be_empty
           expect(diff).to be_too_large
         end
+
+        it 'logs the event' do
+          expect(Gitlab::Metrics).to receive(:add_event)
+            .with(:patch_hard_limit_bytes_hit)
+
+          diff
+        end
       end
 
       context 'using a collapsable diff that is too large' do