diff --git a/config/optional/monitoring.sensor_config.monitoring_404.yml b/config/optional/monitoring.sensor_config.monitoring_404.yml
new file mode 100644
index 0000000..204c1ac
--- /dev/null
+++ b/config/optional/monitoring.sensor_config.monitoring_404.yml
@@ -0,0 +1,26 @@
+langcode: en
+status: true
+dependencies:
+  module:
+    - redirect_404
+id: monitoring_404
+label: 'Monitoring 404'
+description: 'Monitoring 404 error requests'
+category: System
+plugin_id: monitoring_404
+result_class: null
+value_label: '404 requests'
+value_type: number
+caching_time: 3600
+settings:
+  table: redirect_404
+  verbose_fields:
+  - 'path'
+  - 'timestamp'
+  - 'count'
+  time_interval_field: 'timestamp'
+  time_interval_value: 86400
+thresholds:
+  type: exceeds
+  warning: 10
+  critical: 50
diff --git a/config/schema/monitoring.schema.yml b/config/schema/monitoring.schema.yml
index 0fe58fb..4a15c04 100644
--- a/config/schema/monitoring.schema.yml
+++ b/config/schema/monitoring.schema.yml
@@ -237,6 +237,10 @@ monitoring.settings.temporary_files_usages:
   type: monitoring.settings.database_aggregator
   label: 'Temporary files usages sensor settings'
 
+monitoring.settings.monitoring_404:
+  type: monitoring.settings.database_aggregator
+  label: 'Monitoring 404 sensor settings'
+
 monitoring.settings.user_integrity:
   type: monitoring.settings_base
   label: 'Privileged user integrity'
diff --git a/src/Plugin/monitoring/SensorPlugin/Monitoring404SensorPlugin.php b/src/Plugin/monitoring/SensorPlugin/Monitoring404SensorPlugin.php
new file mode 100644
index 0000000..47b65a1
--- /dev/null
+++ b/src/Plugin/monitoring/SensorPlugin/Monitoring404SensorPlugin.php
@@ -0,0 +1,113 @@
+<?php
+
+namespace Drupal\monitoring\Plugin\monitoring\SensorPlugin;
+use Drupal\monitoring\Result\SensorResultInterface;
+use Drupal\monitoring\SensorPlugin\ExtendedInfoSensorPluginInterface;
+
+/**
+ * Monitors 404 error requests.
+ *
+ * @SensorPlugin(
+ *   id = "monitoring_404",
+ *   provider = "redirect_404",
+ *   label = @Translation("Monitoring 404"),
+ *   description = @Translation("Monitors the 404 error requests."),
+ *   addable = FALSE
+ * )
+ */
+class Monitoring404SensorPlugin extends DatabaseAggregatorSensorPlugin implements ExtendedInfoSensorPluginInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $configurableConditions = FALSE;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $configurableVerboseOutput = FALSE;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected $configurableTable = FALSE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getAggregateQuery() {
+    /* @var \Drupal\Core\Database\Connection $database */
+    $database = $this->getService('database');
+    // Get aggregate query for the table.
+    $query = $database->select($this->sensorConfig->getSetting('table'));
+    $query->addExpression('COUNT(*)', 'count');
+
+    // Add conditions.
+    foreach ($this->getConditions() as $condition) {
+      $query->condition($condition['field'], $condition['value'], isset($condition['operator']) ? $condition['operator'] : NULL);
+    }
+    // Apply time interval on field.
+    if ($this->getTimeIntervalField() && $this->getTimeIntervalValue()) {
+      $query->condition($this->getTimeIntervalField(), REQUEST_TIME - $this->getTimeIntervalValue(), '>');
+    }
+    // The message is the requested 404 URL.
+    $query->orderBy('count', 'DESC');
+    $query->range(0, 1);
+    return $query;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getQuery() {
+    $query = parent::getQuery();
+    // Unset timestamp order from parent class.
+    $order = &$query->getOrderBy();
+    $order = [];
+
+    $query->orderBy('count', 'DESC');
+    $query->condition('resolved', 0);
+    $query->range(0, 10);
+    return $query;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function buildTableHeader($rows = []) {
+    $header = parent::buildTableHeader($rows);
+    if (isset($header['path'])) {
+      $header['path'] = $this->t('Path');
+      $header['count'] = $this->t('Count');
+      $header['timestamp'] = $this->t('Last access');
+    }
+    return $header;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function runSensor(SensorResultInterface $result) {
+    parent::runSensor($result);
+    $query = $this->getQuery();
+    $this->executedQuery = $query->execute();
+    $this->fetchedObject = $this->executedQuery->fetchObject();
+    $count = 0;
+    if (!empty($this->fetchedObject->count)) {
+      $count = $this->fetchedObject->count;
+    }
+    $result->setValue($count);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefaultConfiguration() {
+    $default_config = [
+      'settings' => [
+        'table' => 'redirect_404',
+      ],
+    ];
+    return $default_config;
+  }
+}
diff --git a/src/Tests/Monitoring404SensorPluginTest.php b/src/Tests/Monitoring404SensorPluginTest.php
new file mode 100644
index 0000000..aa69840
--- /dev/null
+++ b/src/Tests/Monitoring404SensorPluginTest.php
@@ -0,0 +1,39 @@
+<?php
+
+namespace Drupal\monitoring\Tests;
+
+/**
+ * Tests monitoring 404 sensor plugin.
+ *
+ * @group monitoring
+ */
+class Monitoring404SensorPluginTest extends MonitoringTestBase {
+
+  /**
+   * Modules to be enabled.
+   */
+  public static $modules = [
+    'redirect_404',
+    'node',
+  ];
+
+  /**
+   * Tests the monitoring 404 sensor plugin.
+   */
+  public function testMonitoring404() {
+    // Create a user with permissions to manage sensors.
+    $test_user = $this->drupalCreateUser([
+      'monitoring reports',
+      'administer monitoring',
+      'access administration pages',
+    ]);
+    $this->drupalLogin($test_user);
+    $this->drupalGet('/admin/config/system/monitoring/sensors');
+    $this->assertText('Monitoring 404');
+    $this->drupalGet('/admin/config/system/monitoring/sensors/non-existing-sensor');
+    $this->drupalGet('/admin/config/system/monitoring/sensors/non-existing-sensor');
+    $this->drupalGet('/admin/reports/monitoring/sensors/monitoring_404');
+    $this->assertText('/admin/config/system/monitoring/sensors/non-existing-sensor');
+    $this->assertText('2 404 requests');
+  }
+}
