diff --git a/config/metrics/counts_28d/20230810124157_count_cicd_component_usage_monthly.yml b/config/metrics/counts_28d/20230810124157_count_cicd_component_usage_monthly.yml
new file mode 100644
index 0000000000000000000000000000000000000000..d860dddef12a6cb766bffc12bf60eb31f029ba85
--- /dev/null
+++ b/config/metrics/counts_28d/20230810124157_count_cicd_component_usage_monthly.yml
@@ -0,0 +1,23 @@
+---
+key_path: redis_hll_counters.pipeline_authoring.count_cicd_component_usage_monthly
+description: Monthly count of CI/CD component usage
+product_section: ops
+product_stage: verify
+product_group: pipeline_authoring
+value_type: number
+status: active
+milestone: "16.4"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/129016
+time_frame: 28d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+performance_indicator_type: []
+distribution:
+- ce
+tier:
+- premium
+- ultimate
+options:
+  events:
+    - cicd_component_usage
diff --git a/config/metrics/counts_7d/20230810124157_count_cicd_component_usage_weekly.yml b/config/metrics/counts_7d/20230810124157_count_cicd_component_usage_weekly.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e8c528dde6708150b4854ed0f9630c5f00d294dd
--- /dev/null
+++ b/config/metrics/counts_7d/20230810124157_count_cicd_component_usage_weekly.yml
@@ -0,0 +1,23 @@
+---
+key_path: redis_hll_counters.pipeline_authoring.count_cicd_component_usage_weekly
+description: Weekly count of CI/CD component usage
+product_section: ops
+product_stage: verify
+product_group: pipeline_authoring
+value_type: number
+status: active
+milestone: "16.4"
+introduced_by_url: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/129016
+time_frame: 7d
+data_source: redis_hll
+data_category: optional
+instrumentation_class: RedisHLLMetric
+performance_indicator_type: []
+distribution:
+- ce
+tier:
+- premium
+- ultimate
+options:
+  events:
+    - cicd_component_usage
diff --git a/lib/gitlab/ci/config/external/file/component.rb b/lib/gitlab/ci/config/external/file/component.rb
index 15cc0783b86fe635c941d754c0bd632c65fc6561..de6de1bb7a8e52ae2b117231ce8b663f5e80b83d 100644
--- a/lib/gitlab/ci/config/external/file/component.rb
+++ b/lib/gitlab/ci/config/external/file/component.rb
@@ -18,6 +18,8 @@ def initialize(params, context)
             def content
               return unless component_result.success?
 
+              ::Gitlab::UsageDataCounters::HLLRedisCounter.track_event('cicd_component_usage', values: context.user.id)
+
               component_result.payload.fetch(:content)
             end
             strong_memoize_attr :content
diff --git a/spec/lib/gitlab/ci/config/external/file/component_spec.rb b/spec/lib/gitlab/ci/config/external/file/component_spec.rb
index 487690296b51c533d4021e01e39b88b024096755..0f7b811b5dff90e6fd12bdc17e27fdb11c914a24 100644
--- a/spec/lib/gitlab/ci/config/external/file/component_spec.rb
+++ b/spec/lib/gitlab/ci/config/external/file/component_spec.rb
@@ -120,6 +120,41 @@
     end
   end
 
+  describe '#content' do
+    context 'when component is valid' do
+      let(:content) do
+        <<~COMPONENT
+        job:
+        script: echo
+        COMPONENT
+      end
+
+      let(:response) do
+        ServiceResponse.success(payload: {
+          content: content,
+          path: instance_double(::Gitlab::Ci::Components::InstancePath, project: project, sha: '12345')
+        })
+      end
+
+      it 'tracks the event' do
+        expect(::Gitlab::UsageDataCounters::HLLRedisCounter).to receive(:track_event).with('cicd_component_usage',
+          values: external_resource.context.user.id)
+
+        external_resource.content
+      end
+    end
+
+    context 'when component is invalid' do
+      let(:content) { 'the-content' }
+
+      it 'does not track the event' do
+        expect(::Gitlab::UsageDataCounters::HLLRedisCounter).not_to receive(:track_event)
+
+        external_resource.content
+      end
+    end
+  end
+
   describe '#metadata' do
     subject(:metadata) { external_resource.metadata }