You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by zw...@apache.org on 2023/09/14 18:19:07 UTC

[trafficserver] branch master updated: Use the new Metrics module for core metrics (#10175)

This is an automated email from the ASF dual-hosted git repository.

zwoop pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficserver.git


The following commit(s) were added to refs/heads/master by this push:
     new f23826d865 Use the new Metrics module for core metrics (#10175)
f23826d865 is described below

commit f23826d8654594a124f27c35d15c5691474dc412
Author: Leif Hedstrom <zw...@apache.org>
AuthorDate: Thu Sep 14 12:19:00 2023 -0600

    Use the new Metrics module for core metrics (#10175)
    
    * Replaces the iocore/hostdb metrics
    
    * Replaces the proxy/http metrics
    
    * Replaces the iocore/dns metrics
    
    * Replaces the proxy/logging metrics
    
    * Replaces the iocore/net metrics
    
    * Replaces the iocore/net/ssl metrics
    
    * Relax the memory ordering for the atomic increments.
    
    Co-Author: Chris McFarlen
    
    * Replaces the iocore/aio metrics
    
    * Replaces the proxy/http2 metrics
    
    * Removes some unecessary metrics, renames a few
    
    * Replaces the iocore/cache metrics
---
 .vscode/c_cpp_properties.json                      |   14 +-
 .../monitoring/statistics/core/bandwidth.en.rst    |   36 -
 .../monitoring/statistics/core/cache.en.rst        |    4 -
 .../monitoring/statistics/core/dns.en.rst          |   10 +-
 .../statistics/core/http-document-size.en.rst      |   51 -
 .../statistics/core/http-transaction.en.rst        |    6 -
 .../monitoring/statistics/core/origin.en.rst       |   29 -
 doc/appendices/command-line/traffic_top.en.rst     |   18 -
 .../cache-architecture/data-structures.en.rst      |    4 -
 include/api/Metrics.h                              |   55 +-
 include/records/P_RecProcess.h                     |    5 +
 iocore/aio/AIO.cc                                  |  101 +-
 iocore/aio/Makefile.am                             |    2 +-
 iocore/aio/P_AIO.h                                 |   23 +-
 iocore/aio/test_AIO.cc                             |    4 +-
 iocore/cache/Cache.cc                              |  324 +++---
 iocore/cache/CacheDir.cc                           |   59 +-
 iocore/cache/CacheDisk.cc                          |    8 +-
 iocore/cache/CacheHttp.cc                          |    7 +-
 iocore/cache/CacheRead.cc                          |   55 +-
 iocore/cache/CacheVol.cc                           |    2 +-
 iocore/cache/CacheWrite.cc                         |   98 +-
 iocore/cache/P_Cache.h                             |    2 +-
 iocore/cache/P_CacheInternal.h                     |  146 +--
 iocore/cache/P_CacheStats.h                        |   70 ++
 iocore/cache/P_CacheVol.h                          |    4 +-
 iocore/cache/RamCacheCLFUS.cc                      |   37 +-
 iocore/cache/RamCacheLRU.cc                        |   15 +-
 iocore/dns/DNS.cc                                  |  101 +-
 iocore/dns/P_DNSProcessor.h                        |   38 +-
 iocore/hostdb/HostDB.cc                            |   56 +-
 iocore/hostdb/P_HostDBProcessor.h                  |   47 +-
 iocore/hostdb/P_RefCountCache.h                    |  117 +--
 iocore/io_uring/I_IO_URING.h                       |    3 -
 iocore/io_uring/io_uring.cc                        |   11 +-
 iocore/io_uring/unit_tests/test_diskIO.cc          |    5 +-
 iocore/net/BIO_fastopen.cc                         |    6 +-
 iocore/net/Net.cc                                  |   94 +-
 iocore/net/NetHandler.cc                           |    8 +-
 iocore/net/OCSPStapling.cc                         |    8 +-
 iocore/net/P_Net.h                                 |   88 +-
 iocore/net/P_SSLConfig.h                           |    1 -
 iocore/net/P_UnixNet.h                             |    6 +-
 iocore/net/QUICNetProcessor.cc                     |    2 +-
 iocore/net/QUICNetProcessor_quiche.cc              |    3 +-
 iocore/net/SSLDiags.cc                             |   40 +-
 iocore/net/SSLNetProcessor.cc                      |    3 -
 iocore/net/SSLNetVConnection.cc                    |   62 +-
 iocore/net/SSLSessionCache.cc                      |   24 +-
 iocore/net/SSLStats.cc                             |  266 ++---
 iocore/net/SSLStats.h                              |  157 ++-
 iocore/net/SSLUtils.cc                             |   16 +-
 iocore/net/Socks.cc                                |    4 +-
 iocore/net/TLSBasicSupport.cc                      |    2 +-
 iocore/net/TLSSessionResumptionSupport.cc          |   20 +-
 iocore/net/UnixNet.cc                              |   10 +-
 iocore/net/UnixNetAccept.cc                        |   24 +-
 iocore/net/UnixNetProcessor.cc                     |   10 +-
 iocore/net/UnixNetVConnection.cc                   |   40 +-
 proxy/http/Http1ClientSession.cc                   |   19 +-
 proxy/http/Http1ClientTransaction.cc               |    4 +-
 proxy/http/Http1ServerSession.cc                   |   13 +-
 proxy/http/Http1ServerTransaction.cc               |    4 +-
 proxy/http/HttpCacheSM.cc                          |    4 +-
 proxy/http/HttpCacheSM.h                           |    8 +-
 proxy/http/HttpConfig.cc                           | 1048 +++++---------------
 proxy/http/HttpConfig.h                            |  572 +++++------
 proxy/http/HttpSM.cc                               |   84 +-
 proxy/http/HttpSessionAccept.cc                    |    3 +-
 proxy/http/HttpSessionManager.cc                   |    6 +-
 proxy/http/HttpTransact.cc                         |  517 ++++------
 proxy/http/HttpTransact.h                          |    4 -
 proxy/http/HttpTunnel.cc                           |   10 +-
 proxy/http/HttpVCTable.cc                          |    2 +-
 proxy/http2/HTTP2.cc                               |  130 +--
 proxy/http2/HTTP2.h                                |   69 +-
 proxy/http2/Http2ClientSession.cc                  |   10 +-
 proxy/http2/Http2CommonSession.cc                  |   16 +-
 proxy/http2/Http2ConnectionState.cc                |   29 +-
 proxy/http2/Http2ServerSession.cc                  |   19 +-
 proxy/http2/Http2ServerSession.h                   |   14 +-
 proxy/http2/Http2SessionAccept.cc                  |    3 +-
 proxy/http2/Http2Stream.cc                         |   14 +-
 proxy/logging/Log.cc                               |   39 +-
 proxy/logging/LogAccess.cc                         |   16 +-
 proxy/logging/LogConfig.cc                         |   85 +-
 proxy/logging/LogConfig.h                          |   72 +-
 proxy/logging/LogFile.cc                           |   24 +-
 proxy/logging/LogObject.cc                         |   16 +-
 src/api/InkAPI.cc                                  |   33 +-
 src/api/Metrics.cc                                 |    2 +-
 src/records/RecCore.cc                             |    8 +-
 src/records/RecRawStats.cc                         |   24 +
 src/traffic_server/traffic_server.cc               |   26 +-
 src/traffic_top/stats.h                            |    8 -
 src/traffic_top/traffic_top.cc                     |    7 -
 96 files changed, 2056 insertions(+), 3367 deletions(-)

diff --git a/.vscode/c_cpp_properties.json b/.vscode/c_cpp_properties.json
index f21c58ec6c..2e27e41b97 100644
--- a/.vscode/c_cpp_properties.json
+++ b/.vscode/c_cpp_properties.json
@@ -4,9 +4,14 @@
             "name": "Mac",
             "includePath": [
                 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include/c++/v1",
-                "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/10.0.1/include",
+                "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/clang/14.0.3/include",
                 "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/include",
+                "/opt/homebrew/include",
+                "/opt/homebrew/opt/openssl@3/include",
+                "/opt/homebrew/opt/openssl@1.1/include",
+                "/opt/homebrew/opt/openssl/include",
                 "/usr/local/include",
+                "/usr/local/opt/openssl@3/include",
                 "/usr/local/opt/openssl@1.1/include",
                 "/usr/local/opt/openssl/include",
                 "${workspaceFolder}",
@@ -20,12 +25,11 @@
                 "${workspaceFolder}/iocore/net",
                 "${workspaceFolder}/iocore/utils",
                 "${workspaceFolder}/lib",
-                "${workspaceFolder}/lib/records",
+                "${workspaceFolder}/src/records",
                 "${workspaceFolder}/lib/yamlcpp/include",
+                "${workspaceFolder}/lib/swoc/include",
                 "${workspaceFolder}/mgmt",
-                "${workspaceFolder}/mgmt/api",
-                "${workspaceFolder}/mgmt/api/include",
-                "${workspaceFolder}/mgmt/utils",
+                "${workspaceFolder}/mgmt/rpc",
                 "${workspaceFolder}/proxy",
                 "${workspaceFolder}/proxy/hdrs",
                 "${workspaceFolder}/proxy/http",
diff --git a/doc/admin-guide/monitoring/statistics/core/bandwidth.en.rst b/doc/admin-guide/monitoring/statistics/core/bandwidth.en.rst
index 73f99665b7..89e8a747ae 100644
--- a/doc/admin-guide/monitoring/statistics/core/bandwidth.en.rst
+++ b/doc/admin-guide/monitoring/statistics/core/bandwidth.en.rst
@@ -38,39 +38,3 @@ Bandwidth and Transfer
 .. ts:stat:: global proxy.process.http.user_agent_response_header_total_size integer
    :type: counter
    :units: bytes
-
-.. ts:stat:: global proxy.process.http.user_agent_speed_bytes_per_sec_100 integer
-   :type: derivative
-   :units: bytes
-   :ungathered:
-
-.. ts:stat:: global proxy.process.http.user_agent_speed_bytes_per_sec_100K integer
-   :type: derivative
-   :units: bytes
-   :ungathered:
-
-.. ts:stat:: global proxy.process.http.user_agent_speed_bytes_per_sec_100M integer
-   :type: derivative
-   :units: bytes
-   :ungathered:
-
-.. ts:stat:: global proxy.process.http.user_agent_speed_bytes_per_sec_10K integer
-   :type: derivative
-   :units: bytes
-   :ungathered:
-
-.. ts:stat:: global proxy.process.http.user_agent_speed_bytes_per_sec_10M integer
-   :type: derivative
-   :units: bytes
-   :ungathered:
-
-.. ts:stat:: global proxy.process.http.user_agent_speed_bytes_per_sec_1K integer
-   :type: derivative
-   :units: bytes
-   :ungathered:
-
-.. ts:stat:: global proxy.process.http.user_agent_speed_bytes_per_sec_1M integer
-   :type: derivative
-   :units: bytes
-   :ungathered:
-
diff --git a/doc/admin-guide/monitoring/statistics/core/cache.en.rst b/doc/admin-guide/monitoring/statistics/core/cache.en.rst
index 62ba1ee447..bf84623395 100644
--- a/doc/admin-guide/monitoring/statistics/core/cache.en.rst
+++ b/doc/admin-guide/monitoring/statistics/core/cache.en.rst
@@ -76,8 +76,6 @@ Cache
 .. ts:stat:: global proxy.process.cache.hdr_marshals integer
    :ungathered:
 
-.. ts:stat:: global proxy.process.cache.KB_read_per_sec float
-.. ts:stat:: global proxy.process.cache.KB_write_per_sec float
 .. ts:stat:: global proxy.process.cache.lookup.active integer
    :ungathered:
 
@@ -103,7 +101,6 @@ Cache
    :ungathered:
 
 .. ts:stat:: global proxy.process.cache.read.failure integer
-.. ts:stat:: global proxy.process.cache.read_per_sec float
 .. ts:stat:: global proxy.process.cache.read.success integer
 .. ts:stat:: global proxy.process.cache.remove.active integer
    :ungathered:
@@ -131,7 +128,6 @@ Cache
 .. ts:stat:: global proxy.process.cache.write.backlog.failure integer
 .. ts:stat:: global proxy.process.cache.write_bytes_stat integer
 .. ts:stat:: global proxy.process.cache.write.failure integer
-.. ts:stat:: global proxy.process.cache.write_per_sec float
 .. ts:stat:: global proxy.process.cache.write.success integer
 
 .. ts:stat:: global proxy.process.cache.span.errors.read integer
diff --git a/doc/admin-guide/monitoring/statistics/core/dns.en.rst b/doc/admin-guide/monitoring/statistics/core/dns.en.rst
index fed97d0551..d2667b827b 100644
--- a/doc/admin-guide/monitoring/statistics/core/dns.en.rst
+++ b/doc/admin-guide/monitoring/statistics/core/dns.en.rst
@@ -22,8 +22,7 @@
 DNS
 ***
 
-.. ts:stat:: global proxy.process.dns.fail_avg_time integer
-   :type: derivative
+.. ts:stat:: global proxy.process.dns.fail_time integer
    :units: milliseconds
    :ungathered:
 
@@ -47,8 +46,7 @@ DNS
 
    The number of resetting TCP connection in TCP_RETRY connection mode.
 
-.. ts:stat:: global proxy.process.dns.lookup_avg_time integer
-   :type: derivative
+.. ts:stat:: global proxy.process.dns.lookup_time integer
    :units: milliseconds
    :ungathered:
 
@@ -79,8 +77,7 @@ DNS
    :type: counter
    :ungathered:
 
-.. ts:stat:: global proxy.process.dns.success_avg_time integer
-   :type: derivative
+.. ts:stat:: global proxy.process.dns.success_time integer
    :units: milliseconds
    :ungathered:
 
@@ -92,4 +89,3 @@ DNS
 
    The total number of DNS lookups which have been performed since statistics
    collection began.
-
diff --git a/doc/admin-guide/monitoring/statistics/core/http-document-size.en.rst b/doc/admin-guide/monitoring/statistics/core/http-document-size.en.rst
index 46d5c145d5..a872dd1942 100644
--- a/doc/admin-guide/monitoring/statistics/core/http-document-size.en.rst
+++ b/doc/admin-guide/monitoring/statistics/core/http-document-size.en.rst
@@ -26,54 +26,3 @@ HTTP Document Size
    :type: counter
    :units: bytes
    :ungathered:
-
-.. ts:stat:: global proxy.process.http.request_document_size_100 integer
-   :type: counter
-   :ungathered:
-
-.. ts:stat:: global proxy.process.http.request_document_size_10K integer
-   :type: counter
-   :ungathered:
-
-.. ts:stat:: global proxy.process.http.request_document_size_1K integer
-   :type: counter
-   :ungathered:
-
-.. ts:stat:: global proxy.process.http.request_document_size_1M integer
-   :type: counter
-   :ungathered:
-
-.. ts:stat:: global proxy.process.http.request_document_size_3K integer
-   :type: counter
-   :ungathered:
-
-.. ts:stat:: global proxy.process.http.request_document_size_5K integer
-   :type: counter
-   :ungathered:
-
-.. ts:stat:: global proxy.process.http.request_document_size_inf integer
-   :type: counter
-   :ungathered:
-
-.. ts:stat:: global proxy.process.http.response_document_size_100 integer
-   :type: counter
-
-.. ts:stat:: global proxy.process.http.response_document_size_10K integer
-   :type: counter
-
-.. ts:stat:: global proxy.process.http.response_document_size_1K integer
-   :type: counter
-
-.. ts:stat:: global proxy.process.http.response_document_size_1M integer
-   :type: counter
-
-.. ts:stat:: global proxy.process.http.response_document_size_3K integer
-   :type: counter
-
-.. ts:stat:: global proxy.process.http.response_document_size_5K integer
-   :type: counter
-
-.. ts:stat:: global proxy.process.http.response_document_size_inf integer
-   :type: counter
-   :ungathered:
-
diff --git a/doc/admin-guide/monitoring/statistics/core/http-transaction.en.rst b/doc/admin-guide/monitoring/statistics/core/http-transaction.en.rst
index 9dd730c2be..09b3dbd911 100644
--- a/doc/admin-guide/monitoring/statistics/core/http-transaction.en.rst
+++ b/doc/admin-guide/monitoring/statistics/core/http-transaction.en.rst
@@ -23,12 +23,6 @@ HTTP Transaction
 ****************
 
 
-.. ts:stat:: global proxy.process.http.avg_transactions_per_client_connection float
-   :type: derivative
-
-.. ts:stat:: global proxy.process.http.avg_transactions_per_server_connection float
-   :type: derivative
-
 .. ts:stat:: global proxy.process.http.total_transactions_time integer
    :type: counter
    :units: seconds
diff --git a/doc/admin-guide/monitoring/statistics/core/origin.en.rst b/doc/admin-guide/monitoring/statistics/core/origin.en.rst
index b58ff3d5a2..99aa5bfb3a 100644
--- a/doc/admin-guide/monitoring/statistics/core/origin.en.rst
+++ b/doc/admin-guide/monitoring/statistics/core/origin.en.rst
@@ -50,34 +50,6 @@ Origin Server
    :type: counter
    :units: bytes
 
-.. ts:stat:: global proxy.process.http.origin_server_speed_bytes_per_sec_100 integer
-   :type: derivative
-   :units: bytes
-
-.. ts:stat:: global proxy.process.http.origin_server_speed_bytes_per_sec_100K integer
-   :type: derivative
-   :units: bytes
-
-.. ts:stat:: global proxy.process.http.origin_server_speed_bytes_per_sec_100M integer
-   :type: derivative
-   :units: bytes
-
-.. ts:stat:: global proxy.process.http.origin_server_speed_bytes_per_sec_10K integer
-   :type: derivative
-   :units: bytes
-
-.. ts:stat:: global proxy.process.http.origin_server_speed_bytes_per_sec_10M integer
-   :type: derivative
-   :units: bytes
-
-.. ts:stat:: global proxy.process.http.origin_server_speed_bytes_per_sec_1K integer
-   :type: derivative
-   :units: bytes
-
-.. ts:stat:: global proxy.process.http.origin_server_speed_bytes_per_sec_1M integer
-   :type: derivative
-   :units: bytes
-
 .. ts:stat:: global proxy.process.http.origin_shutdown.pool_lock_contention integer
    :type counter
    :units bytes
@@ -137,4 +109,3 @@ Origin Server
 .. ts:stat:: global proxy.process.http.origin_shutdown.tunnel_abort integer
    :type counter
    :units bytes
-
diff --git a/doc/appendices/command-line/traffic_top.en.rst b/doc/appendices/command-line/traffic_top.en.rst
index 02ede4bcd7..c7d5d27c9c 100644
--- a/doc/appendices/command-line/traffic_top.en.rst
+++ b/doc/appendices/command-line/traffic_top.en.rst
@@ -487,24 +487,6 @@ Statistics:
    |TS| also provides statistics for every other response code. The keen observer
    will have hopefully already recognized the pattern in statistic names.
 
-100 B, 1 KB, 3 KB, 5 KB, 10 KB, 1 MB, > 1 MB
-~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Each of these fields indicates the percentage of responses from |TS| which fell
-within a particular size (document body size, excluding response headers). The
-individual fields are the upper bounds of exclusive *buckets*, meaning that a
-response with a document body of 4,500 bytes will be counted in the ``5 KB``
-field, but not in any of the smaller sizes.
-
-Statistics:
-:ts:stat:`proxy.process.http.response_document_size_100`,
-:ts:stat:`proxy.process.http.response_document_size_1K`,
-:ts:stat:`proxy.process.http.response_document_size_3K`,
-:ts:stat:`proxy.process.http.response_document_size_5K`,
-:ts:stat:`proxy.process.http.response_document_size_10K`,
-:ts:stat:`proxy.process.http.response_document_size_1M`,
-:ts:stat:`proxy.process.http.response_document_size_inf`.
-
 Client
 ------
 
diff --git a/doc/developer-guide/cache-architecture/data-structures.en.rst b/doc/developer-guide/cache-architecture/data-structures.en.rst
index 6c54b32945..3e2d55f59d 100644
--- a/doc/developer-guide/cache-architecture/data-structures.en.rst
+++ b/doc/developer-guide/cache-architecture/data-structures.en.rst
@@ -419,10 +419,6 @@ Data Structures
 
    .. member:: LINK<CacheVol> link
 
-   .. member:: RecRawStatBlock vol_rsb
-
-      per volume stat
-
 .. class:: ConfigVol
 
    This class represents an individual volume.
diff --git a/include/api/Metrics.h b/include/api/Metrics.h
index c191e3acc9..97ee8dca59 100644
--- a/include/api/Metrics.h
+++ b/include/api/Metrics.h
@@ -40,19 +40,21 @@ namespace ts
 class Metrics
 {
 private:
-  using self_type  = Metrics;
-  using IdType     = int32_t; // Could be a tuple, but one way or another, they have to be combined to an int32_t.
-  using AtomicType = std::atomic<int64_t>;
+  using self_type = Metrics;
 
 public:
+  using IntType = std::atomic<int64_t>;
+  using IdType  = int32_t; // Could be a tuple, but one way or another, they have to be combined to an int32_t.
+
   static constexpr uint16_t METRICS_MAX_BLOBS = 8192;
   static constexpr uint16_t METRICS_MAX_SIZE  = 2048;                               // For a total of 16M metrics
   static constexpr IdType NOT_FOUND           = std::numeric_limits<IdType>::min(); // <16-bit,16-bit> = <blob-index,offset>
+  static const auto MEMORY_ORDER              = std::memory_order_relaxed;
 
 private:
   using NameAndId       = std::tuple<std::string, IdType>;
   using NameContainer   = std::array<NameAndId, METRICS_MAX_SIZE>;
-  using AtomicContainer = std::array<AtomicType, METRICS_MAX_SIZE>;
+  using AtomicContainer = std::array<IntType, METRICS_MAX_SIZE>;
   using MetricStorage   = std::tuple<NameContainer, AtomicContainer>;
   using MetricBlobs     = std::array<MetricStorage *, METRICS_MAX_BLOBS>;
   using LookupTable     = std::unordered_map<std::string_view, IdType>;
@@ -84,9 +86,16 @@ public:
   // the std::atomic<int64_t> as the underlying class for a single metric, and be happy.
   IdType newMetric(const std::string_view name);
   IdType lookup(const std::string_view name) const;
-  AtomicType *lookup(IdType id, std::string_view *name = nullptr) const;
+  IntType *lookup(IdType id, std::string_view *name = nullptr) const;
 
-  AtomicType &
+  // A bit of a convenience, since we use the ptr to the atomic frequently in the core
+  IntType *
+  newMetricPtr(const std::string_view name)
+  {
+    return lookup(newMetric(name));
+  }
+
+  IntType &
   operator[](IdType id)
   {
     return *lookup(id);
@@ -103,7 +112,7 @@ public:
   {
     auto metric = lookup(id);
 
-    return (metric ? metric->fetch_add(val) : NOT_FOUND);
+    return (metric ? metric->fetch_add(val, MEMORY_ORDER) : NOT_FOUND);
   }
 
   // ToDo: Do we even need these inc/dec functions?
@@ -112,7 +121,7 @@ public:
   {
     auto metric = lookup(id);
 
-    return (metric ? metric->fetch_sub(val) : NOT_FOUND);
+    return (metric ? metric->fetch_sub(val, MEMORY_ORDER) : NOT_FOUND);
   }
 
   std::string_view name(IdType id) const;
@@ -125,6 +134,35 @@ public:
     return (id >= 0 && ((blob < _cur_blob && entry < METRICS_MAX_SIZE) || (blob == _cur_blob && entry <= _cur_off)));
   }
 
+  // Static methods to encapsulate access to the atomic's
+  static void
+  increment(IntType *metric, uint64_t val = 1)
+  {
+    ink_assert(metric);
+    metric->fetch_add(val, MEMORY_ORDER);
+  }
+
+  static void
+  decrement(IntType *metric, uint64_t val = 1)
+  {
+    ink_assert(metric);
+    metric->fetch_sub(val, MEMORY_ORDER);
+  }
+
+  static int64_t
+  read(IntType *metric)
+  {
+    ink_assert(metric);
+    return metric->load();
+  }
+
+  static void
+  write(IntType *metric, int64_t val)
+  {
+    ink_assert(metric);
+    return metric->store(val);
+  }
+
   class iterator
   {
   public:
@@ -237,6 +275,7 @@ private:
   MetricBlobs _blobs;
   uint16_t _cur_blob = 0;
   uint16_t _cur_off  = 0;
+
 }; // class Metrics
 
 } // namespace ts
diff --git a/include/records/P_RecProcess.h b/include/records/P_RecProcess.h
index 5d58c47e4e..48efd184cf 100644
--- a/include/records/P_RecProcess.h
+++ b/include/records/P_RecProcess.h
@@ -32,8 +32,13 @@
 #include "I_RecProcess.h"
 #include "P_RecDefs.h"
 
+#include <functional>
+
 //-------------------------------------------------------------------------
 // Protected Interface
 //-------------------------------------------------------------------------
 
 int RecExecRawStatSyncCbs();
+
+using RecCallbackFunction = std::function<void()>;
+void RecRegNewSyncStatSync(RecCallbackFunction callback);
diff --git a/iocore/aio/AIO.cc b/iocore/aio/AIO.cc
index 9cd6446d94..889002715d 100644
--- a/iocore/aio/AIO.cc
+++ b/iocore/aio/AIO.cc
@@ -62,69 +62,8 @@ int thread_is_created = 0;
 RecInt cache_config_threads_per_disk = 12;
 RecInt api_config_threads_per_disk   = 12;
 
-RecRawStatBlock *aio_rsb       = nullptr;
+AIOStatsBlock aio_rsb;
 Continuation *aio_err_callback = nullptr;
-// AIO Stats
-std::atomic<uint64_t> aio_num_read      = 0;
-std::atomic<uint64_t> aio_bytes_read    = 0;
-std::atomic<uint64_t> aio_num_write     = 0;
-std::atomic<uint64_t> aio_bytes_written = 0;
-
-/*
- * Stats
- */
-
-static int
-aio_stats_cb(const char * /* name ATS_UNUSED */, RecDataT data_type, RecData *data, RecRawStatBlock *rsb, int id)
-{
-  (void)data_type;
-  (void)rsb;
-  int64_t new_val = 0;
-  int64_t diff    = 0;
-  int64_t count, sum;
-  ink_hrtime now = ink_get_hrtime();
-  // The RecGetGlobalXXX stat functions are cheaper than the
-  // RecGetXXX functions. The Global ones are expensive
-  // for increments and decrements. But for AIO stats we
-  // only do Sets and Gets, so they are cheaper in our case.
-  RecGetGlobalRawStatSum(aio_rsb, id, &sum);
-  RecGetGlobalRawStatCount(aio_rsb, id, &count);
-
-  int64_t time_diff = ink_hrtime_to_msec(now - count);
-  if (time_diff == 0) {
-    data->rec_float = 0.0;
-    return 0;
-  }
-  switch (id) {
-  case AIO_STAT_READ_PER_SEC:
-    new_val = aio_num_read.load();
-    break;
-  case AIO_STAT_WRITE_PER_SEC:
-    new_val = aio_num_write.load();
-    break;
-  case AIO_STAT_KB_READ_PER_SEC:
-    new_val = aio_bytes_read.load() >> 10;
-    break;
-  case AIO_STAT_KB_WRITE_PER_SEC:
-    new_val = aio_bytes_written.load() >> 10;
-    break;
-#if TS_USE_LINUX_IO_URING
-  case AIO_STAT_IO_URING_SUBMITTED:
-    new_val = io_uring_submissions.load();
-    break;
-  case AIO_STAT_IO_URING_COMPLETED:
-    new_val = io_uring_completions.load();
-    break;
-#endif
-  default:
-    ink_assert(0);
-  }
-  diff = new_val - sum;
-  RecSetGlobalRawStatSum(aio_rsb, id, new_val);
-  RecSetGlobalRawStatCount(aio_rsb, id, now);
-  data->rec_float = static_cast<float>(diff) * 1000.00 / static_cast<float>(time_diff);
-  return 0;
-}
 
 #ifdef AIO_STATS
 /* total number of requests received - for debugging */
@@ -167,20 +106,16 @@ ink_aio_init(ts::ModuleVersion v, AIOBackend backend)
 {
   ink_release_assert(v.check(AIO_MODULE_INTERNAL_VERSION));
 
-  aio_rsb = RecAllocateRawStatBlock(static_cast<int>(AIO_STAT_COUNT));
-  RecRegisterRawStat(aio_rsb, RECT_PROCESS, "proxy.process.cache.read_per_sec", RECD_FLOAT, RECP_PERSISTENT,
-                     (int)AIO_STAT_READ_PER_SEC, aio_stats_cb);
-  RecRegisterRawStat(aio_rsb, RECT_PROCESS, "proxy.process.cache.write_per_sec", RECD_FLOAT, RECP_PERSISTENT,
-                     (int)AIO_STAT_WRITE_PER_SEC, aio_stats_cb);
-  RecRegisterRawStat(aio_rsb, RECT_PROCESS, "proxy.process.cache.KB_read_per_sec", RECD_FLOAT, RECP_PERSISTENT,
-                     (int)AIO_STAT_KB_READ_PER_SEC, aio_stats_cb);
-  RecRegisterRawStat(aio_rsb, RECT_PROCESS, "proxy.process.cache.KB_write_per_sec", RECD_FLOAT, RECP_PERSISTENT,
-                     (int)AIO_STAT_KB_WRITE_PER_SEC, aio_stats_cb);
+  ts::Metrics &intm = ts::Metrics::getInstance();
+
+  aio_rsb.read_count  = intm.newMetricPtr("proxy.process.cache.aio.read_count");
+  aio_rsb.write_count = intm.newMetricPtr("proxy.process.cache.aio.write_count");
+  aio_rsb.kb_read     = intm.newMetricPtr("proxy.process.cache.aio.KB_read");
+  aio_rsb.kb_write    = intm.newMetricPtr("proxy.process.cache.aio.KB_write");
+
 #if TS_USE_LINUX_IO_URING
-  RecRegisterRawStat(aio_rsb, RECT_PROCESS, "proxy.process.io_uring.submitted", RECD_FLOAT, RECP_PERSISTENT,
-                     (int)AIO_STAT_IO_URING_SUBMITTED, aio_stats_cb);
-  RecRegisterRawStat(aio_rsb, RECT_PROCESS, "proxy.process.io_uring.completed", RECD_FLOAT, RECP_PERSISTENT,
-                     (int)AIO_STAT_IO_URING_COMPLETED, aio_stats_cb);
+  aio_rsb.io_uring_submitted = intm.newMetricPtr("proxy.process.io_uring.submitted");
+  aio_rsb.io_uring_completed = intm.newMetricPtr("proxy.process.io_uring.completed");
 #endif
 
   memset(&aio_reqs, 0, MAX_DISKS_POSSIBLE * sizeof(AIO_Reqs *));
@@ -511,11 +446,11 @@ AIOThreadInfo::aio_thread_main(AIOThreadInfo *thr_info)
 #endif
       // update the stats;
       if (op->aiocb.aio_lio_opcode == LIO_WRITE) {
-        aio_num_write.fetch_add(1);
-        aio_bytes_written.fetch_add(op->aiocb.aio_nbytes);
+        Metrics::increment(aio_rsb.write_count);
+        Metrics::increment(aio_rsb.kb_write, op->aiocb.aio_nbytes >> 10);
       } else {
-        aio_num_read.fetch_add(1);
-        aio_bytes_read.fetch_add(op->aiocb.aio_nbytes);
+        Metrics::increment(aio_rsb.read_count);
+        Metrics::increment(aio_rsb.kb_read, op->aiocb.aio_nbytes >> 10);
       }
       ink_mutex_release(&current_req->aio_mutex);
       cache_op((AIOCallbackInternal *)op);
@@ -648,11 +583,11 @@ AIOCallbackInternal::handle_complete(io_uring_cqe *cqe)
 
   if (op->aio_result > 0) {
     if (op->aiocb.aio_lio_opcode == LIO_WRITE) {
-      aio_num_write.fetch_add(1);
-      aio_bytes_written.fetch_add(op->aiocb.aio_nbytes);
+      Metrics::increment(aio_rsb.write_count);
+      Metrics::increment(aio_rsb.kb_write, op->aiocb.aio_nbytes >> 10);
     } else {
-      aio_num_read.fetch_add(1);
-      aio_bytes_read.fetch_add(op->aiocb.aio_nbytes);
+      Metrics::increment(aio_rsb.read_count);
+      Metrics::increment(aio_rsb.kb_read, op->aiocb.aio_nbytes >> 10);
     }
   }
 
diff --git a/iocore/aio/Makefile.am b/iocore/aio/Makefile.am
index bbc2513003..8ea90b92ba 100644
--- a/iocore/aio/Makefile.am
+++ b/iocore/aio/Makefile.am
@@ -56,8 +56,8 @@ test_AIO_CPPFLAGS = \
 
 test_AIO_LDADD = \
 	libinkaio.a \
-	$(top_builddir)/src/records/librecords_p.a \
 	$(top_builddir)/iocore/eventsystem/libinkevent.a \
+	$(top_builddir)/src/records/librecords_p.a \
 	$(top_builddir)/src/tscore/libtscore.a \
 	$(top_builddir)/src/api/libtsapicore.a \
 	$(top_builddir)/src/tscpp/util/libtscpputil.la \
diff --git a/iocore/aio/P_AIO.h b/iocore/aio/P_AIO.h
index c8c6eef633..2f794e7054 100644
--- a/iocore/aio/P_AIO.h
+++ b/iocore/aio/P_AIO.h
@@ -37,6 +37,10 @@
 #include "I_IO_URING.h"
 #endif
 
+#include "api/Metrics.h"
+
+using ts::Metrics;
+
 // for debugging
 // #define AIO_STATS 1
 
@@ -128,15 +132,16 @@ public:
 };
 #endif
 
-enum aio_stat_enum {
-  AIO_STAT_READ_PER_SEC,
-  AIO_STAT_KB_READ_PER_SEC,
-  AIO_STAT_WRITE_PER_SEC,
-  AIO_STAT_KB_WRITE_PER_SEC,
+struct AIOStatsBlock {
+  Metrics::IntType *read_count;
+  Metrics::IntType *kb_read;
+  Metrics::IntType *write_count;
+  Metrics::IntType *kb_write;
+
 #if TS_USE_LINUX_IO_URING
-  AIO_STAT_IO_URING_SUBMITTED,
-  AIO_STAT_IO_URING_COMPLETED,
+  Metrics::IntType *io_uring_submitted;
+  Metrics::IntType *io_uring_completed;
 #endif
-  AIO_STAT_COUNT
 };
-extern RecRawStatBlock *aio_rsb;
+
+extern AIOStatsBlock aio_rsb;
diff --git a/iocore/aio/test_AIO.cc b/iocore/aio/test_AIO.cc
index 498162b241..7f11f13378 100644
--- a/iocore/aio/test_AIO.cc
+++ b/iocore/aio/test_AIO.cc
@@ -220,8 +220,8 @@ dump_summary()
   printf("-----------------\n");
   printf("IO_URING results\n");
   printf("-----------------\n");
-  printf("submissions: %lu\n", io_uring_submissions.load());
-  printf("completions: %lu\n", io_uring_completions.load());
+  printf("submissions: %lu\n", Metrics::read(aio_rsb.io_uring_submitted);
+  printf("completions: %lu\n", Metrics::read(aio_rsb.io_uring_completed);
 #endif
 
   if (delete_disks) {
diff --git a/iocore/cache/Cache.cc b/iocore/cache/Cache.cc
index 9233da2b0f..b20c428210 100644
--- a/iocore/cache/Cache.cc
+++ b/iocore/cache/Cache.cc
@@ -36,6 +36,7 @@
 #include "api/InkAPIInternal.h"
 
 #include "tscore/hugepages.h"
+#include "records/P_RecProcess.h"
 
 #ifdef AIO_FAULT_INJECTION
 #include "AIO_fault_injection.h"
@@ -54,12 +55,6 @@ static size_t DEFAULT_RAM_CACHE_MULTIPLIER = 10; // I.e. 10x 1MB per 1GB of disk
 // This is the oldest version number that is still usable.
 static short int const CACHE_DB_MAJOR_VERSION_COMPATIBLE = 21;
 
-#define DOCACHE_CLEAR_DYN_STAT(x)  \
-  do {                             \
-    RecSetRawStatSum(rsb, x, 0);   \
-    RecSetRawStatCount(rsb, x, 0); \
-  } while (0);
-
 // Configuration
 
 int64_t cache_config_ram_cache_size            = AUTO_SIZE_RAM_CACHE;
@@ -90,7 +85,7 @@ int cache_config_read_while_writer_max_retries = 10;
 
 // Globals
 
-RecRawStatBlock *cache_rsb              = nullptr;
+CacheStatsBlock cache_rsb;
 Cache *theCache                         = nullptr;
 CacheDisk **gdisks                      = nullptr;
 int gndisks                             = 0;
@@ -162,7 +157,6 @@ static void cplist_update();
 int cplist_reconfigure();
 static int create_volume(int volume_number, off_t size_in_blocks, int scheme, CacheVol *cp);
 static void rebuild_host_table(Cache *cache);
-void register_cache_stats(RecRawStatBlock *rsb, const char *prefix);
 
 // Global list of the volumes created
 Queue<CacheVol> cp_list;
@@ -177,51 +171,117 @@ force_link_CacheTestCaller()
 }
 #endif
 
-int64_t
-cache_bytes_used(int volume)
-{
-  uint64_t used = 0;
-
-  for (int i = 0; i < gnvol; i++) {
-    if (!DISK_BAD(gvol[i]->disk) && (volume == -1 || gvol[i]->cache_vol->vol_number == volume)) {
-      if (!gvol[i]->header->cycle) {
-        used += gvol[i]->header->write_pos - gvol[i]->start;
-      } else {
-        used += gvol[i]->len - gvol[i]->dirlen() - EVACUATION_SIZE;
-      }
+// Register Stats, this handles both the global cache metrics, as well as the per volume metrics.
+static void
+register_cache_stats(CacheStatsBlock *rsb, const std::string prefix)
+{
+  ts::Metrics &intm = ts::Metrics::getInstance();
+
+  // These are special, in that we have 7 x 3 metrics here in a structure based on cache operation done
+  rsb->status[static_cast<int>(CacheOpType::Lookup)].active    = intm.newMetricPtr(prefix + ".lookup.active");
+  rsb->status[static_cast<int>(CacheOpType::Lookup)].success   = intm.newMetricPtr(prefix + ".lookup.success");
+  rsb->status[static_cast<int>(CacheOpType::Lookup)].failure   = intm.newMetricPtr(prefix + ".lookup.failure");
+  rsb->status[static_cast<int>(CacheOpType::Read)].active      = intm.newMetricPtr(prefix + ".read.active");
+  rsb->status[static_cast<int>(CacheOpType::Read)].success     = intm.newMetricPtr(prefix + ".read.success");
+  rsb->status[static_cast<int>(CacheOpType::Read)].failure     = intm.newMetricPtr(prefix + ".read.failure");
+  rsb->status[static_cast<int>(CacheOpType::Write)].active     = intm.newMetricPtr(prefix + ".write.active");
+  rsb->status[static_cast<int>(CacheOpType::Write)].success    = intm.newMetricPtr(prefix + ".write.success");
+  rsb->status[static_cast<int>(CacheOpType::Write)].failure    = intm.newMetricPtr(prefix + ".write.failure");
+  rsb->status[static_cast<int>(CacheOpType::Update)].active    = intm.newMetricPtr(prefix + ".update.active");
+  rsb->status[static_cast<int>(CacheOpType::Update)].success   = intm.newMetricPtr(prefix + ".update.success");
+  rsb->status[static_cast<int>(CacheOpType::Update)].failure   = intm.newMetricPtr(prefix + ".update.failure");
+  rsb->status[static_cast<int>(CacheOpType::Remove)].active    = intm.newMetricPtr(prefix + ".remove.active");
+  rsb->status[static_cast<int>(CacheOpType::Remove)].success   = intm.newMetricPtr(prefix + ".remove.success");
+  rsb->status[static_cast<int>(CacheOpType::Remove)].failure   = intm.newMetricPtr(prefix + ".remove.failure");
+  rsb->status[static_cast<int>(CacheOpType::Evacuate)].active  = intm.newMetricPtr(prefix + ".evacuate.active");
+  rsb->status[static_cast<int>(CacheOpType::Evacuate)].success = intm.newMetricPtr(prefix + ".evacuate.success");
+  rsb->status[static_cast<int>(CacheOpType::Evacuate)].failure = intm.newMetricPtr(prefix + ".evacuate.failure");
+  rsb->status[static_cast<int>(CacheOpType::Scan)].active      = intm.newMetricPtr(prefix + ".scan.active");
+  rsb->status[static_cast<int>(CacheOpType::Scan)].success     = intm.newMetricPtr(prefix + ".scan.success");
+  rsb->status[static_cast<int>(CacheOpType::Scan)].failure     = intm.newMetricPtr(prefix + ".scan.failure");
+
+  // These are in an array of 1, 2 and 3+ fragment documents
+  rsb->fragment_document_count[0] = intm.newMetricPtr(prefix + ".frags_per_doc.1");
+  rsb->fragment_document_count[1] = intm.newMetricPtr(prefix + ".frags_per_doc.2");
+  rsb->fragment_document_count[2] = intm.newMetricPtr(prefix + ".frags_per_doc.3+");
+
+  // And then everything else
+  rsb->bytes_used                = intm.newMetricPtr(prefix + ".bytes_used");
+  rsb->bytes_total               = intm.newMetricPtr(prefix + ".bytes_total");
+  rsb->stripes                   = intm.newMetricPtr(prefix + ".stripes");
+  rsb->ram_cache_bytes_total     = intm.newMetricPtr(prefix + ".ram_cache.total_bytes");
+  rsb->ram_cache_bytes           = intm.newMetricPtr(prefix + ".ram_cache.bytes_used");
+  rsb->ram_cache_hits            = intm.newMetricPtr(prefix + ".ram_cache.hits");
+  rsb->ram_cache_misses          = intm.newMetricPtr(prefix + ".ram_cache.misses");
+  rsb->pread_count               = intm.newMetricPtr(prefix + ".pread_count");
+  rsb->percent_full              = intm.newMetricPtr(prefix + ".percent_full");
+  rsb->read_seek_fail            = intm.newMetricPtr(prefix + ".read.seek.failure");
+  rsb->read_invalid              = intm.newMetricPtr(prefix + ".read.invalid");
+  rsb->write_backlog_failure     = intm.newMetricPtr(prefix + ".write.backlog.failure");
+  rsb->direntries_total          = intm.newMetricPtr(prefix + ".direntries.total");
+  rsb->direntries_used           = intm.newMetricPtr(prefix + ".direntries.used");
+  rsb->directory_collision_count = intm.newMetricPtr(prefix + ".directory_collision");
+  rsb->read_busy_success         = intm.newMetricPtr(prefix + ".read_busy.success");
+  rsb->read_busy_failure         = intm.newMetricPtr(prefix + ".read_busy.failure");
+  rsb->write_bytes               = intm.newMetricPtr(prefix + ".write_bytes");
+  rsb->hdr_vector_marshal        = intm.newMetricPtr(prefix + ".vector_marshals");
+  rsb->hdr_marshal               = intm.newMetricPtr(prefix + ".hdr_marshals");
+  rsb->hdr_marshal_bytes         = intm.newMetricPtr(prefix + ".hdr_marshal_bytes");
+  rsb->gc_bytes_evacuated        = intm.newMetricPtr(prefix + ".gc.bytes_evacuated");
+  rsb->gc_frags_evacuated        = intm.newMetricPtr(prefix + ".gc.frags_evacuated");
+  rsb->directory_wrap            = intm.newMetricPtr(prefix + ".directory.wrap.around");
+  rsb->directory_sync_count      = intm.newMetricPtr(prefix + ".directory.sync.count");
+  rsb->directory_sync_bytes      = intm.newMetricPtr(prefix + ".directory.sync.bytes");
+  rsb->directory_sync_time       = intm.newMetricPtr(prefix + ".directory.sync.time");
+  rsb->span_errors_read          = intm.newMetricPtr(prefix + ".span.errors.read");
+  rsb->span_errors_write         = intm.newMetricPtr(prefix + ".span.errors.write");
+  rsb->span_failing              = intm.newMetricPtr(prefix + ".span.failing");
+  rsb->span_offline              = intm.newMetricPtr(prefix + ".span.offline");
+  rsb->span_online               = intm.newMetricPtr(prefix + ".span.online");
+}
+
+// ToDo: This gets called as part of librecords collection continuation, probably change this later.
+inline int64_t
+cache_bytes_used(int vol_ix)
+{
+  if (!DISK_BAD(gvol[vol_ix]->disk)) {
+    if (!gvol[vol_ix]->header->cycle) {
+      return gvol[vol_ix]->header->write_pos - gvol[vol_ix]->start;
+    } else {
+      return gvol[vol_ix]->len - gvol[vol_ix]->dirlen() - EVACUATION_SIZE;
     }
   }
 
-  return used;
+  return 0;
 }
 
-int
-cache_stats_bytes_used_cb(const char *name, RecDataT data_type, RecData *data, RecRawStatBlock *rsb, int id)
+void
+CachePeriodicMetricsUpdate()
 {
-  int volume = -1;
-  char *p;
+  int64_t total_sum = 0;
 
-  // Well, there's no way to pass along the volume ID, so extracting it from the stat name.
-  p = strstr(const_cast<char *>(name), "volume_");
-  if (p != nullptr) {
-    // I'm counting on the compiler to optimize out strlen("volume_").
-    volume = strtol(p + strlen("volume_"), nullptr, 10);
+  // Make sure the bytes_used per volume is always reset to zero, this can update the
+  // volume metric more than once (once per disk). This happens once every sync
+  // period (5s), and nothing else modifies these metrics.
+  for (int vol_ix = 0; vol_ix < gnvol; ++vol_ix) {
+    Metrics::write(gvol[vol_ix]->cache_vol->vol_rsb.bytes_used, 0);
   }
 
   if (cacheProcessor.initialized == CACHE_INITIALIZED) {
-    int64_t used, total = 0;
-    float percent_full;
+    for (int vol_ix = 0; vol_ix < gnvol; ++vol_ix) {
+      Vol *v       = gvol[vol_ix];
+      int64_t used = cache_bytes_used(vol_ix);
 
-    used = cache_bytes_used(volume);
-    RecSetGlobalRawStatSum(rsb, id, used);
-    RecRawStatSyncSum(name, data_type, data, rsb, id);
-    RecGetGlobalRawStatSum(rsb, static_cast<int>(cache_bytes_total_stat), &total);
-    percent_full = static_cast<float>(used) / static_cast<float>(total) * 100;
-    // The percent_full float below gets rounded down
-    RecSetGlobalRawStatSum(rsb, static_cast<int>(cache_percent_full_stat), static_cast<int64_t>(percent_full));
-  }
+      Metrics::increment(v->cache_vol->vol_rsb.bytes_used, used); // This assumes they start at zero
+      total_sum += used;
+    }
 
-  return 1;
+    // Also update the global (not per volume) metrics
+    int64_t total = Metrics::read(cache_rsb.bytes_total);
+
+    Metrics::write(cache_rsb.bytes_used, total_sum);
+    Metrics::write(cache_rsb.percent_full, total ? (total_sum * 100) / total : 0);
+  }
 }
 
 static int
@@ -531,6 +591,8 @@ Vol::close_read(CacheVC *cont) const
 int
 CacheProcessor::start(int, size_t)
 {
+  RecRegNewSyncStatSync(CachePeriodicMetricsUpdate);
+
   return start_internal(0);
 }
 
@@ -656,8 +718,8 @@ CacheProcessor::start_internal(int flags)
         }
 
         // It's actually common that the hardware I/O size is larger than the store block size as
-        // storage systems increasingly want larger I/Os. For example, on macOS, the filesystem block
-        // size is always reported as 1MB.
+        // storage systems increasingly want larger I/Os. For example, on macOS, the filesystem
+        // block size is always reported as 1MB.
         if (sd->hw_sector_size <= 0 || sector_size > STORE_BLOCK_SIZE) {
           Note("resetting hardware sector size from %d to %d", sector_size, STORE_BLOCK_SIZE);
           sector_size = STORE_BLOCK_SIZE;
@@ -751,8 +813,8 @@ CacheProcessor::diskInitialized()
     gndisks -= bad_disks;
     // Check if this is a fatal error
     if (this->waitForCache() == 3 || (0 == gndisks && this->waitForCache() == 2)) {
-      // This could be passed off to @c cacheInitialized (as with volume config problems) but I think
-      // the more specific error message here is worth the extra code.
+      // This could be passed off to @c cacheInitialized (as with volume config problems) but I
+      // think the more specific error message here is worth the extra code.
       CacheProcessor::initialized = CACHE_INIT_FAILED;
       if (cb_after_init) {
         cb_after_init();
@@ -764,9 +826,10 @@ CacheProcessor::diskInitialized()
   }
 
   /* Practically just took all bad_disks offline so update the stats. */
-  RecSetGlobalRawStatSum(cache_rsb, cache_span_offline_stat, bad_disks);
-  RecIncrGlobalRawStat(cache_rsb, cache_span_failing_stat, -bad_disks);
-  RecSetGlobalRawStatSum(cache_rsb, cache_span_online_stat, gndisks);
+  // ToDo: These don't get update on the per-volume metrics :-/
+  Metrics::write(cache_rsb.span_offline, bad_disks);
+  Metrics::decrement(cache_rsb.span_failing, bad_disks);
+  Metrics::write(cache_rsb.span_online, gndisks);
 
   /* create the cachevol list only if num volumes are greater than 0. */
   if (config_volumes.num_volumes == 0) {
@@ -788,10 +851,10 @@ CacheProcessor::diskInitialized()
   } else {
     CacheVol *cp = cp_list.head;
     for (; cp; cp = cp->link.next) {
-      cp->vol_rsb = RecAllocateRawStatBlock(static_cast<int>(cache_stat_count));
       char vol_stat_str_prefix[256];
+
       snprintf(vol_stat_str_prefix, sizeof(vol_stat_str_prefix), "proxy.process.cache.volume_%d", cp->vol_number);
-      register_cache_stats(cp->vol_rsb, vol_stat_str_prefix);
+      register_cache_stats(&cp->vol_rsb, vol_stat_str_prefix);
     }
   }
 
@@ -851,14 +914,13 @@ CacheProcessor::cacheInitialized()
   uint64_t vol_used_direntries   = 0;
   Vol *vol;
 
-  ProxyMutex *mutex = this_ethread()->mutex.get();
-
   if (theCache) {
     total_size += theCache->cache_size;
     Dbg(dbg_ctl_cache_init, "CacheProcessor::cacheInitialized - theCache, total_size = %" PRId64 " = %" PRId64 " MB", total_size,
         total_size / ((1024 * 1024) / STORE_BLOCK_SIZE));
     if (theCache->ready == CACHE_INIT_FAILED) {
-      Dbg(dbg_ctl_cache_init, "CacheProcessor::cacheInitialized - failed to initialize the cache for http: cache disabled");
+      Dbg(dbg_ctl_cache_init, "CacheProcessor::cacheInitialized - failed to initialize the cache "
+                              "for http: cache disabled");
       Warning("failed to initialize the cache for http: cache disabled\n");
     } else {
       caches_ready                 = caches_ready | (1 << CACHE_FRAG_TYPE_HTTP);
@@ -913,21 +975,21 @@ CacheProcessor::cacheInitialized()
             ram_cache_bytes += gvol[i]->dirlen();
             Dbg(dbg_ctl_cache_init, "CacheProcessor::cacheInitialized - ram_cache_bytes = %" PRId64 " = %" PRId64 "Mb",
                 ram_cache_bytes, ram_cache_bytes / (1024 * 1024));
-            CACHE_VOL_SUM_DYN_STAT(cache_ram_cache_bytes_total_stat, (int64_t)gvol[i]->dirlen());
+            Metrics::increment(vol->cache_vol->vol_rsb.ram_cache_bytes_total, gvol[i]->dirlen());
           }
           vol_total_cache_bytes  = gvol[i]->len - gvol[i]->dirlen();
           total_cache_bytes     += vol_total_cache_bytes;
           Dbg(dbg_ctl_cache_init, "CacheProcessor::cacheInitialized - total_cache_bytes = %" PRId64 " = %" PRId64 "Mb",
               total_cache_bytes, total_cache_bytes / (1024 * 1024));
 
-          CACHE_VOL_SUM_DYN_STAT(cache_bytes_total_stat, vol_total_cache_bytes);
+          Metrics::increment(vol->cache_vol->vol_rsb.bytes_total, vol_total_cache_bytes);
 
           vol_total_direntries  = gvol[i]->buckets * gvol[i]->segments * DIR_DEPTH;
           total_direntries     += vol_total_direntries;
-          CACHE_VOL_SUM_DYN_STAT(cache_direntries_total_stat, vol_total_direntries);
+          Metrics::increment(vol->cache_vol->vol_rsb.direntries_total, vol_total_direntries);
 
           vol_used_direntries = dir_entries_used(gvol[i]);
-          CACHE_VOL_SUM_DYN_STAT(cache_direntries_used_stat, vol_used_direntries);
+          Metrics::increment(vol->cache_vol->vol_rsb.direntries_used, vol_used_direntries);
           used_direntries += vol_used_direntries;
         }
 
@@ -960,7 +1022,7 @@ CacheProcessor::cacheInitialized()
             Dbg(dbg_ctl_cache_init, "CacheProcessor::cacheInitialized - factor = %f", factor);
             gvol[i]->ram_cache->init(static_cast<int64_t>(http_ram_cache_size * factor), vol);
             ram_cache_bytes += static_cast<int64_t>(http_ram_cache_size * factor);
-            CACHE_VOL_SUM_DYN_STAT(cache_ram_cache_bytes_total_stat, (int64_t)(http_ram_cache_size * factor));
+            Metrics::increment(vol->cache_vol->vol_rsb.ram_cache_bytes_total, static_cast<int64_t>(http_ram_cache_size * factor));
           } else if (gvol[i]->cache_vol->ramcache_enabled) {
             ink_release_assert(!"Unexpected non-HTTP cache volume");
           }
@@ -968,17 +1030,17 @@ CacheProcessor::cacheInitialized()
               ram_cache_bytes, ram_cache_bytes / (1024 * 1024));
           vol_total_cache_bytes  = gvol[i]->len - gvol[i]->dirlen();
           total_cache_bytes     += vol_total_cache_bytes;
-          CACHE_VOL_SUM_DYN_STAT(cache_bytes_total_stat, vol_total_cache_bytes);
-          CACHE_VOL_SUM_DYN_STAT(cache_stripes_stat, 1); // Count the cache stripes
+          Metrics::increment(vol->cache_vol->vol_rsb.bytes_total, vol_total_cache_bytes);
+          Metrics::increment(vol->cache_vol->vol_rsb.stripes);
           Dbg(dbg_ctl_cache_init, "CacheProcessor::cacheInitialized - total_cache_bytes = %" PRId64 " = %" PRId64 "Mb",
               total_cache_bytes, total_cache_bytes / (1024 * 1024));
 
           vol_total_direntries  = gvol[i]->buckets * gvol[i]->segments * DIR_DEPTH;
           total_direntries     += vol_total_direntries;
-          CACHE_VOL_SUM_DYN_STAT(cache_direntries_total_stat, vol_total_direntries);
+          Metrics::increment(vol->cache_vol->vol_rsb.direntries_total, vol_total_direntries);
 
           vol_used_direntries = dir_entries_used(gvol[i]);
-          CACHE_VOL_SUM_DYN_STAT(cache_direntries_used_stat, vol_used_direntries);
+          Metrics::increment(vol->cache_vol->vol_rsb.direntries_used, vol_used_direntries);
           used_direntries += vol_used_direntries;
         }
       }
@@ -997,10 +1059,11 @@ CacheProcessor::cacheInitialized()
         break;
       }
 
-      GLOBAL_CACHE_SET_DYN_STAT(cache_ram_cache_bytes_total_stat, ram_cache_bytes);
-      GLOBAL_CACHE_SET_DYN_STAT(cache_bytes_total_stat, total_cache_bytes);
-      GLOBAL_CACHE_SET_DYN_STAT(cache_direntries_total_stat, total_direntries);
-      GLOBAL_CACHE_SET_DYN_STAT(cache_direntries_used_stat, used_direntries);
+      Metrics::write(cache_rsb.ram_cache_bytes_total, ram_cache_bytes);
+      Metrics::write(cache_rsb.bytes_total, total_cache_bytes);
+      Metrics::write(cache_rsb.direntries_total, total_direntries);
+      Metrics::write(cache_rsb.direntries_used, used_direntries);
+
       if (!check) {
         dir_sync_init();
       }
@@ -1894,14 +1957,14 @@ CacheProcessor::mark_storage_offline(CacheDisk *d, ///< Target disk
     }
   }
 
-  RecIncrGlobalRawStat(cache_rsb, cache_bytes_total_stat, -total_bytes_delete);
-  RecIncrGlobalRawStat(cache_rsb, cache_direntries_total_stat, -total_dir_delete);
-  RecIncrGlobalRawStat(cache_rsb, cache_direntries_used_stat, -used_dir_delete);
+  Metrics::decrement(cache_rsb.bytes_total, total_bytes_delete);
+  Metrics::decrement(cache_rsb.direntries_total, total_dir_delete);
+  Metrics::decrement(cache_rsb.direntries_used, used_dir_delete);
 
   /* Update the span metrics, if failing then move the span from "failing" to "offline" bucket
    * if operator took it offline, move it from "online" to "offline" bucket */
-  RecIncrGlobalRawStat(cache_rsb, admin ? cache_span_online_stat : cache_span_failing_stat, -1);
-  RecIncrGlobalRawStat(cache_rsb, cache_span_offline_stat, 1);
+  Metrics::decrement(admin ? cache_rsb.span_online : cache_rsb.span_failing);
+  Metrics::increment(cache_rsb.span_offline);
 
   if (theCache) {
     rebuild_host_table(theCache);
@@ -2277,7 +2340,13 @@ CacheVC::handleRead(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */)
   io.thread        = mutex->thread_holding->tt == DEDICATED ? AIO_CALLBACK_THREAD_ANY : mutex->thread_holding;
   SET_HANDLER(&CacheVC::handleReadDone);
   ink_assert(ink_aio_read(&io) >= 0);
-  CACHE_DEBUG_INCREMENT_DYN_STAT(cache_pread_count_stat);
+
+// ToDo: Why are these for debug only ??
+#if DEBUG
+  Metrics::increment(cache_rsb.pread_count);
+  Metrics::increment(vol->cache_vol->vol_rsb.pread_count);
+#endif
+
   return EVENT_CONT;
 
 LramHit : {
@@ -2304,13 +2373,13 @@ Cache::lookup(Continuation *cont, const CacheKey *key, CacheFragType type, const
     return ACTION_RESULT_DONE;
   }
 
-  Vol *vol          = key_to_vol(key, hostname, host_len);
-  ProxyMutex *mutex = cont->mutex.get();
-  CacheVC *c        = new_CacheVC(cont);
+  Vol *vol   = key_to_vol(key, hostname, host_len);
+  CacheVC *c = new_CacheVC(cont);
   SET_CONTINUATION_HANDLER(c, &CacheVC::openReadStartHead);
-  c->vio.op    = VIO::READ;
-  c->base_stat = cache_lookup_active_stat;
-  CACHE_INCREMENT_DYN_STAT(c->base_stat + CACHE_STAT_ACTIVE);
+  c->vio.op  = VIO::READ;
+  c->op_type = static_cast<int>(CacheOpType::Lookup);
+  Metrics::increment(cache_rsb.status[c->op_type].active);
+  Metrics::increment(vol->cache_vol->vol_rsb.status[c->op_type].active);
   c->first_key = c->key = *key;
   c->frag_type          = type;
   c->f.lookup           = 1;
@@ -2392,7 +2461,8 @@ CacheVC::removeEvent(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */)
       return ret;
     }
   Ldone:
-    CACHE_INCREMENT_DYN_STAT(cache_remove_failure_stat);
+    Metrics::increment(cache_rsb.status[static_cast<int>(CacheOpType::Remove)].failure);
+    Metrics::increment(vol->cache_vol->vol_rsb.status[static_cast<int>(CacheOpType::Remove)].failure);
     if (od) {
       vol->close_write(this);
     }
@@ -2432,8 +2502,9 @@ Cache::remove(Continuation *cont, const CacheKey *key, CacheFragType type, const
   CacheVC *c   = new_CacheVC(cont);
   c->vio.op    = VIO::NONE;
   c->frag_type = type;
-  c->base_stat = cache_remove_active_stat;
-  CACHE_INCREMENT_DYN_STAT(c->base_stat + CACHE_STAT_ACTIVE);
+  c->op_type   = static_cast<int>(CacheOpType::Remove);
+  Metrics::increment(cache_rsb.status[c->op_type].active);
+  Metrics::increment(vol->cache_vol->vol_rsb.status[c->op_type].active);
   c->first_key = c->key = *key;
   c->vol                = vol;
   c->dir                = result;
@@ -2553,8 +2624,9 @@ cplist_update()
   // before any other new volumes to assure proper span free space calculation and proper volume block distribution.
   for (config_vol = config_volumes.cp_queue.head; config_vol; config_vol = config_vol->link.next) {
     if (nullptr == config_vol->cachep) {
-      // Find out if this is a forced volume assigned exclusively to a span which was cleared (hence not referenced in cp_list).
-      // Note: non-exclusive cleared spans are not handled here, only the "exclusive"
+      // Find out if this is a forced volume assigned exclusively to a span which was cleared (hence
+      // not referenced in cp_list). Note: non-exclusive cleared spans are not handled here, only
+      // the "exclusive"
       bool forced_volume = false;
       for (int d_no = 0; d_no < gndisks; d_no++) {
         if (gdisks[d_no]->forced_volume_num == config_vol->number) {
@@ -2610,7 +2682,8 @@ fillExclusiveDisks(CacheVol *cp)
     }
 
     if (found_nonforced_volumes) {
-      /* The user had created several volumes before - clear the disk and create one volume for http */
+      /* The user had created several volumes before - clear the disk and create one volume for http
+       */
       Note("Clearing Disk: %s", gdisks[i]->path);
       gdisks[i]->delete_all_volumes();
     } else if (1 == gdisks[i]->header->num_volumes) {
@@ -2722,7 +2795,8 @@ cplist_reconfigure()
         }
 
         // Find if the volume is forced and if it is then calculate the total forced volume size.
-        // Forced volumes take the whole span (disk) also sum all disk space this volume is forced to.
+        // Forced volumes take the whole span (disk) also sum all disk space this volume is forced
+        // to.
         int64_t tot_forced_space_in_blks = 0;
         for (int i = 0; i < gndisks; i++) {
           if (config_vol->number == gdisks[i]->forced_volume_num) {
@@ -2877,7 +2951,7 @@ cplist_reconfigure()
     }
   }
 
-  GLOBAL_CACHE_SET_DYN_STAT(cache_stripes_stat, gnvol + assignedVol);
+  Metrics::write(cache_rsb.stripes, gnvol + assignedVol);
 
   return 0;
 }
@@ -3001,80 +3075,6 @@ Cache::key_to_vol(const CacheKey *key, const char *hostname, int host_len)
   }
 }
 
-static void
-reg_int(const char *str, int stat, RecRawStatBlock *rsb, const char *prefix, RecRawStatSyncCb sync_cb = RecRawStatSyncSum)
-{
-  char stat_str[256];
-  snprintf(stat_str, sizeof(stat_str), "%s.%s", prefix, str);
-  RecRegisterRawStat(rsb, RECT_PROCESS, stat_str, RECD_INT, RECP_NON_PERSISTENT, stat, sync_cb);
-  DOCACHE_CLEAR_DYN_STAT(stat)
-}
-#define REG_INT(_str, _stat) reg_int(_str, (int)_stat, rsb, prefix)
-
-// Register Stats
-void
-register_cache_stats(RecRawStatBlock *rsb, const char *prefix)
-{
-  // Special case for this sucker, since it uses its own aggregator.
-  reg_int("bytes_used", cache_bytes_used_stat, rsb, prefix, cache_stats_bytes_used_cb);
-
-  REG_INT("bytes_total", cache_bytes_total_stat);
-  REG_INT("stripes", cache_stripes_stat);
-  REG_INT("ram_cache.total_bytes", cache_ram_cache_bytes_total_stat);
-  REG_INT("ram_cache.bytes_used", cache_ram_cache_bytes_stat);
-  REG_INT("ram_cache.hits", cache_ram_cache_hits_stat);
-  REG_INT("ram_cache.misses", cache_ram_cache_misses_stat);
-  REG_INT("pread_count", cache_pread_count_stat);
-  REG_INT("percent_full", cache_percent_full_stat);
-  REG_INT("lookup.active", cache_lookup_active_stat);
-  REG_INT("lookup.success", cache_lookup_success_stat);
-  REG_INT("lookup.failure", cache_lookup_failure_stat);
-  REG_INT("read.active", cache_read_active_stat);
-  REG_INT("read.success", cache_read_success_stat);
-  REG_INT("read.failure", cache_read_failure_stat);
-  REG_INT("read.seek.failure", cache_read_seek_fail_stat);
-  REG_INT("read.invalid", cache_read_invalid_stat);
-  REG_INT("write.active", cache_write_active_stat);
-  REG_INT("write.success", cache_write_success_stat);
-  REG_INT("write.failure", cache_write_failure_stat);
-  REG_INT("write.backlog.failure", cache_write_backlog_failure_stat);
-  REG_INT("update.active", cache_update_active_stat);
-  REG_INT("update.success", cache_update_success_stat);
-  REG_INT("update.failure", cache_update_failure_stat);
-  REG_INT("remove.active", cache_remove_active_stat);
-  REG_INT("remove.success", cache_remove_success_stat);
-  REG_INT("remove.failure", cache_remove_failure_stat);
-  REG_INT("evacuate.active", cache_evacuate_active_stat);
-  REG_INT("evacuate.success", cache_evacuate_success_stat);
-  REG_INT("evacuate.failure", cache_evacuate_failure_stat);
-  REG_INT("scan.active", cache_scan_active_stat);
-  REG_INT("scan.success", cache_scan_success_stat);
-  REG_INT("scan.failure", cache_scan_failure_stat);
-  REG_INT("direntries.total", cache_direntries_total_stat);
-  REG_INT("direntries.used", cache_direntries_used_stat);
-  REG_INT("directory_collision", cache_directory_collision_count_stat);
-  REG_INT("frags_per_doc.1", cache_single_fragment_document_count_stat);
-  REG_INT("frags_per_doc.2", cache_two_fragment_document_count_stat);
-  REG_INT("frags_per_doc.3+", cache_three_plus_plus_fragment_document_count_stat);
-  REG_INT("read_busy.success", cache_read_busy_success_stat);
-  REG_INT("read_busy.failure", cache_read_busy_failure_stat);
-  REG_INT("write_bytes_stat", cache_write_bytes_stat);
-  REG_INT("vector_marshals", cache_hdr_vector_marshal_stat);
-  REG_INT("hdr_marshals", cache_hdr_marshal_stat);
-  REG_INT("hdr_marshal_bytes", cache_hdr_marshal_bytes_stat);
-  REG_INT("gc_bytes_evacuated", cache_gc_bytes_evacuated_stat);
-  REG_INT("gc_frags_evacuated", cache_gc_frags_evacuated_stat);
-  REG_INT("wrap_count", cache_directory_wrap_stat);
-  REG_INT("sync.count", cache_directory_sync_count_stat);
-  REG_INT("sync.bytes", cache_directory_sync_bytes_stat);
-  REG_INT("sync.time", cache_directory_sync_time_stat);
-  REG_INT("span.errors.read", cache_span_errors_read_stat);
-  REG_INT("span.errors.write", cache_span_errors_write_stat);
-  REG_INT("span.failing", cache_span_failing_stat);
-  REG_INT("span.offline", cache_span_offline_stat);
-  REG_INT("span.online", cache_span_online_stat);
-}
-
 int
 FragmentSizeUpdateCb(const char * /* name ATS_UNUSED */, RecDataT /* data_type ATS_UNUSED */, RecData data, void *cookie)
 {
@@ -3092,8 +3092,6 @@ ink_cache_init(ts::ModuleVersion v)
 {
   ink_release_assert(v.check(CACHE_MODULE_VERSION));
 
-  cache_rsb = RecAllocateRawStatBlock(static_cast<int>(cache_stat_count));
-
   REC_EstablishStaticConfigInteger(cache_config_ram_cache_size, "proxy.config.cache.ram_cache.size");
   Dbg(dbg_ctl_cache_init, "proxy.config.cache.ram_cache.size = %" PRId64 " = %" PRId64 "Mb", cache_config_ram_cache_size,
       cache_config_ram_cache_size / (1024 * 1024));
@@ -3168,7 +3166,7 @@ ink_cache_init(ts::ModuleVersion v)
   REC_RegisterConfigUpdateFunc("proxy.config.cache.enable_read_while_writer", update_cache_config, nullptr);
   Dbg(dbg_ctl_cache_init, "proxy.config.cache.enable_read_while_writer = %d", cache_config_read_while_writer);
 
-  register_cache_stats(cache_rsb, "proxy.process.cache");
+  register_cache_stats(&cache_rsb, "proxy.process.cache");
 
   REC_ReadConfigInteger(cacheProcessor.wait_for_cache, "proxy.config.http.wait_for_cache");
 
diff --git a/iocore/cache/CacheDir.cc b/iocore/cache/CacheDir.cc
index 4e6f04a37b..234adc904d 100644
--- a/iocore/cache/CacheDir.cc
+++ b/iocore/cache/CacheDir.cc
@@ -33,24 +33,6 @@
 #endif
 #include "tscore/ink_stack_trace.h"
 
-#define CACHE_INC_DIR_USED(_m)                            \
-  do {                                                    \
-    ProxyMutex *mutex = _m.get();                         \
-    CACHE_INCREMENT_DYN_STAT(cache_direntries_used_stat); \
-  } while (0)
-
-#define CACHE_DEC_DIR_USED(_m)                            \
-  do {                                                    \
-    ProxyMutex *mutex = _m.get();                         \
-    CACHE_DECREMENT_DYN_STAT(cache_direntries_used_stat); \
-  } while (0)
-
-#define CACHE_INC_DIR_COLLISIONS(_m)                                \
-  do {                                                              \
-    ProxyMutex *mutex = _m.get();                                   \
-    CACHE_INCREMENT_DYN_STAT(cache_directory_collision_count_stat); \
-  } while (0);
-
 namespace
 {
 
@@ -387,7 +369,8 @@ dir_clean_bucket(Dir *b, int s, Vol *vol)
             dir_tag(e), dir_offset(e), b, p, dir_bucket_length(b, s, vol));
       }
       if (dir_offset(e)) {
-        CACHE_DEC_DIR_USED(vol->mutex);
+        Metrics::decrement(cache_rsb.direntries_used);
+        Metrics::decrement(vol->cache_vol->vol_rsb.direntries_used);
       }
       e = dir_delete_entry(e, p, s, vol);
       continue;
@@ -422,7 +405,8 @@ dir_clear_range(off_t start, off_t end, Vol *vol)
   for (off_t i = 0; i < vol->buckets * DIR_DEPTH * vol->segments; i++) {
     Dir *e = dir_index(vol, i);
     if (dir_offset(e) >= static_cast<int64_t>(start) && dir_offset(e) < static_cast<int64_t>(end)) {
-      CACHE_DEC_DIR_USED(vol->mutex);
+      Metrics::decrement(cache_rsb.direntries_used);
+      Metrics::decrement(vol->cache_vol->vol_rsb.direntries_used);
       dir_set_offset(e, 0); // delete
     }
   }
@@ -457,7 +441,8 @@ freelist_clean(int s, Vol *vol)
     for (int l = 0; l < DIR_DEPTH; l++) {
       Dir *e = dir_bucket_row(b, l);
       if (dir_head(e) && !(n++ % 10)) {
-        CACHE_DEC_DIR_USED(vol->mutex);
+        Metrics::decrement(cache_rsb.direntries_used);
+        Metrics::decrement(vol->cache_vol->vol_rsb.direntries_used);
         dir_set_offset(e, 0); // delete
       }
     }
@@ -584,7 +569,8 @@ Lagain:
             // may not accurately reflect the number of documents
             // having the same first_key
             DDbg(dbg_ctl_cache_stats, "Incrementing dir collisions");
-            CACHE_INC_DIR_COLLISIONS(vol->mutex);
+            Metrics::increment(cache_rsb.directory_collision_count);
+            Metrics::increment(vol->cache_vol->vol_rsb.directory_collision_count);
           }
           goto Lcont;
         }
@@ -596,7 +582,8 @@ Lagain:
           ink_assert(dir_offset(e) * CACHE_BLOCK_SIZE < vol->len);
           return 1;
         } else { // delete the invalid entry
-          CACHE_DEC_DIR_USED(vol->mutex);
+          Metrics::decrement(cache_rsb.direntries_used);
+          Metrics::decrement(vol->cache_vol->vol_rsb.direntries_used);
           e = dir_delete_entry(e, p, s, vol);
           continue;
         }
@@ -610,7 +597,8 @@ Lagain:
   }
   if (collision) { // last collision no longer in the list, retry
     DDbg(dbg_ctl_cache_stats, "Incrementing dir collisions");
-    CACHE_INC_DIR_COLLISIONS(vol->mutex);
+    Metrics::increment(cache_rsb.directory_collision_count);
+    Metrics::increment(vol->cache_vol->vol_rsb.directory_collision_count);
     collision = nullptr;
     goto Lagain;
   }
@@ -681,7 +669,9 @@ Lfill:
        bi, e, key->slice32(1), dir_tag(e), dir_offset(e));
   CHECK_DIR(d);
   vol->header->dirty = 1;
-  CACHE_INC_DIR_USED(vol->mutex);
+  Metrics::increment(cache_rsb.direntries_used);
+  Metrics::increment(vol->cache_vol->vol_rsb.direntries_used);
+
   return 1;
 }
 
@@ -730,7 +720,8 @@ Lagain:
   // get from this row first
   e = b;
   if (dir_is_empty(e)) {
-    CACHE_INC_DIR_USED(vol->mutex);
+    Metrics::increment(cache_rsb.direntries_used);
+    Metrics::increment(vol->cache_vol->vol_rsb.direntries_used);
     goto Lfill;
   }
   for (l = 1; l < DIR_DEPTH; l++) {
@@ -746,7 +737,8 @@ Lagain:
     goto Lagain;
   }
 Llink:
-  CACHE_INC_DIR_USED(vol->mutex);
+  Metrics::increment(cache_rsb.direntries_used);
+  Metrics::increment(vol->cache_vol->vol_rsb.direntries_used);
   // as with dir_insert above, need to insert new entries at the tail of the linked list
   Dir *prev, *last;
 
@@ -794,7 +786,8 @@ dir_delete(const CacheKey *key, Vol *vol, Dir *del)
       }
 #endif
       if (dir_compare_tag(e, key) && dir_offset(e) == dir_offset(del)) {
-        CACHE_DEC_DIR_USED(vol->mutex);
+        Metrics::decrement(cache_rsb.direntries_used);
+        Metrics::decrement(vol->cache_vol->vol_rsb.direntries_used);
         dir_delete_entry(e, p, s, vol);
         CHECK_DIR(d);
         return 1;
@@ -1108,8 +1101,8 @@ Lrestart:
       event = EVENT_NONE;
       goto Ldone;
     }
-    CACHE_SUM_DYN_STAT(cache_directory_sync_bytes_stat, io.aio_result);
-
+    Metrics::increment(cache_rsb.directory_sync_bytes, io.aio_result);
+    Metrics::increment(vol->cache_vol->vol_rsb.directory_sync_bytes, io.aio_result);
     trigger = eventProcessor.schedule_in(this, SYNC_DELAY);
     return EVENT_CONT;
   }
@@ -1202,8 +1195,10 @@ Lrestart:
       writepos += headerlen;
     } else {
       vol->dir_sync_in_progress = false;
-      CACHE_INCREMENT_DYN_STAT(cache_directory_sync_count_stat);
-      CACHE_SUM_DYN_STAT(cache_directory_sync_time_stat, ink_get_hrtime() - start_time);
+      Metrics::increment(cache_rsb.directory_sync_count);
+      Metrics::increment(vol->cache_vol->vol_rsb.directory_sync_count);
+      Metrics::increment(cache_rsb.directory_sync_time, ink_get_hrtime() - start_time);
+      Metrics::increment(vol->cache_vol->vol_rsb.directory_sync_time, ink_get_hrtime() - start_time);
       start_time = 0;
       goto Ldone;
     }
diff --git a/iocore/cache/CacheDisk.cc b/iocore/cache/CacheDisk.cc
index 4b7b66d1e9..9e156f7269 100644
--- a/iocore/cache/CacheDisk.cc
+++ b/iocore/cache/CacheDisk.cc
@@ -29,8 +29,8 @@ CacheDisk::incrErrors(const AIOCallback *io)
   if (0 == this->num_errors) {
     /* This it the first read/write error on this span since ATS started.
      * Move the newly failing span from "online" to "failing" bucket. */
-    RecIncrGlobalRawStat(cache_rsb, static_cast<int>(cache_span_online_stat), -1);
-    RecIncrGlobalRawStat(cache_rsb, static_cast<int>(cache_span_failing_stat), 1);
+    Metrics::decrement(cache_rsb.span_online);
+    Metrics::increment(cache_rsb.span_failing);
   }
   this->num_errors++;
 
@@ -40,11 +40,11 @@ CacheDisk::incrErrors(const AIOCallback *io)
   switch (io->aiocb.aio_lio_opcode) {
   case LIO_READ:
     opname = "READ";
-    RecIncrGlobalRawStat(cache_rsb, static_cast<int>(cache_span_errors_read_stat), 1);
+    Metrics::increment(cache_rsb.span_errors_read);
     break;
   case LIO_WRITE:
     opname = "WRITE";
-    RecIncrGlobalRawStat(cache_rsb, static_cast<int>(cache_span_errors_write_stat), 1);
+    Metrics::increment(cache_rsb.span_errors_write);
     break;
   default:
     break;
diff --git a/iocore/cache/CacheHttp.cc b/iocore/cache/CacheHttp.cc
index 7843f8d806..264905b47e 100644
--- a/iocore/cache/CacheHttp.cc
+++ b/iocore/cache/CacheHttp.cc
@@ -191,9 +191,10 @@ CacheHTTPInfoVector::marshal(char *buf, int length)
     count++;
   }
 
-  GLOBAL_CACHE_SUM_GLOBAL_DYN_STAT(cache_hdr_vector_marshal_stat, 1);
-  GLOBAL_CACHE_SUM_GLOBAL_DYN_STAT(cache_hdr_marshal_stat, count);
-  GLOBAL_CACHE_SUM_GLOBAL_DYN_STAT(cache_hdr_marshal_bytes_stat, buf - start);
+  Metrics::increment(cache_rsb.hdr_vector_marshal);
+  Metrics::increment(cache_rsb.hdr_marshal, count);
+  Metrics::increment(cache_rsb.hdr_marshal_bytes, buf - start);
+
   return buf - start;
 }
 
diff --git a/iocore/cache/CacheRead.cc b/iocore/cache/CacheRead.cc
index 1e27fc5f2f..e10b2c0c9c 100644
--- a/iocore/cache/CacheRead.cc
+++ b/iocore/cache/CacheRead.cc
@@ -59,9 +59,10 @@ Cache::open_read(Continuation *cont, const CacheKey *key, CacheFragType type, co
     if (!lock.is_locked() || (od = vol->open_read(key)) || dir_probe(key, vol, &result, &last_collision)) {
       c = new_CacheVC(cont);
       SET_CONTINUATION_HANDLER(c, &CacheVC::openReadStartHead);
-      c->vio.op    = VIO::READ;
-      c->base_stat = cache_read_active_stat;
-      CACHE_INCREMENT_DYN_STAT(c->base_stat + CACHE_STAT_ACTIVE);
+      c->vio.op  = VIO::READ;
+      c->op_type = static_cast<int>(CacheOpType::Read);
+      Metrics::increment(cache_rsb.status[c->op_type].active);
+      Metrics::increment(vol->cache_vol->vol_rsb.status[c->op_type].active);
       c->first_key = c->key = c->earliest_key = *key;
       c->vol                                  = vol;
       c->frag_type                            = type;
@@ -89,7 +90,8 @@ Cache::open_read(Continuation *cont, const CacheKey *key, CacheFragType type, co
     }
   }
 Lmiss:
-  CACHE_INCREMENT_DYN_STAT(cache_read_failure_stat);
+  Metrics::increment(cache_rsb.status[static_cast<int>(CacheOpType::Read)].failure);
+  Metrics::increment(vol->cache_vol->vol_rsb.status[static_cast<int>(CacheOpType::Read)].failure);
   cont->handleEvent(CACHE_EVENT_OPEN_READ_FAILED, (void *)-ECACHE_NO_DOC);
   return ACTION_RESULT_DONE;
 Lwriter:
@@ -128,8 +130,9 @@ Cache::open_read(Continuation *cont, const CacheKey *key, CacheHTTPHdr *request,
       c->first_key = c->key = c->earliest_key = *key;
       c->vol                                  = vol;
       c->vio.op                               = VIO::READ;
-      c->base_stat                            = cache_read_active_stat;
-      CACHE_INCREMENT_DYN_STAT(c->base_stat + CACHE_STAT_ACTIVE);
+      c->op_type                              = static_cast<int>(CacheOpType::Read);
+      Metrics::increment(cache_rsb.status[c->op_type].active);
+      Metrics::increment(vol->cache_vol->vol_rsb.status[c->op_type].active);
       c->request.copy_shallow(request);
       c->frag_type = CACHE_FRAG_TYPE_HTTP;
       c->params    = params;
@@ -160,7 +163,8 @@ Cache::open_read(Continuation *cont, const CacheKey *key, CacheHTTPHdr *request,
     }
   }
 Lmiss:
-  CACHE_INCREMENT_DYN_STAT(cache_read_failure_stat);
+  Metrics::increment(cache_rsb.status[static_cast<int>(CacheOpType::Read)].failure);
+  Metrics::increment(vol->cache_vol->vol_rsb.status[static_cast<int>(CacheOpType::Read)].failure);
   cont->handleEvent(CACHE_EVENT_OPEN_READ_FAILED, (void *)-ECACHE_NO_DOC);
   return ACTION_RESULT_DONE;
 Lwriter:
@@ -199,8 +203,10 @@ CacheVC::openReadFromWriterFailure(int event, Event *e)
 {
   od = nullptr;
   vector.clear(false);
-  CACHE_INCREMENT_DYN_STAT(cache_read_failure_stat);
-  CACHE_INCREMENT_DYN_STAT(cache_read_busy_failure_stat);
+  Metrics::increment(cache_rsb.status[static_cast<int>(CacheOpType::Read)].failure);
+  Metrics::increment(vol->cache_vol->vol_rsb.status[static_cast<int>(CacheOpType::Read)].failure);
+  Metrics::increment(cache_rsb.read_busy_failure);
+  Metrics::increment(vol->cache_vol->vol_rsb.read_busy_failure);
   _action.continuation->handleEvent(event, e);
   free_CacheVC(this);
   return EVENT_DONE;
@@ -448,7 +454,9 @@ CacheVC::openReadFromWriter(int event, Event *e)
         dir_clean(&first_dir);
         dir_clean(&earliest_dir);
         SET_HANDLER(&CacheVC::openReadFromWriterMain);
-        CACHE_INCREMENT_DYN_STAT(cache_read_busy_success_stat);
+        Metrics::increment(cache_rsb.read_busy_success);
+        Metrics::increment(vol->cache_vol->vol_rsb.read_busy_success);
+
         return callcont(CACHE_EVENT_OPEN_READ);
       }
       // want to snarf the new headers from the writer
@@ -486,7 +494,8 @@ CacheVC::openReadFromWriter(int event, Event *e)
   DDbg(dbg_ctl_cache_read_agg, "%p: key: %X %X: single fragment read", this, first_key.slice32(1), key.slice32(0));
   MUTEX_RELEASE(writer_lock);
   SET_HANDLER(&CacheVC::openReadFromWriterMain);
-  CACHE_INCREMENT_DYN_STAT(cache_read_busy_success_stat);
+  Metrics::increment(cache_rsb.read_busy_success);
+  Metrics::increment(vol->cache_vol->vol_rsb.read_busy_success);
   return callcont(CACHE_EVENT_OPEN_READ);
 }
 
@@ -767,7 +776,8 @@ CacheVC::openReadMain(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */)
 
       doc->magic = DOC_CORRUPT;
 
-      CACHE_INCREMENT_DYN_STAT(cache_read_seek_fail_stat);
+      Metrics::increment(cache_rsb.read_seek_fail);
+      Metrics::increment(vol->cache_vol->vol_rsb.read_seek_fail);
 
       CACHE_TRY_LOCK(lock, vol->mutex, mutex->thread_holding);
       if (!lock.is_locked()) {
@@ -1004,14 +1014,16 @@ CacheVC::openReadStartEarliest(int /* event ATS_UNUSED */, Event * /* e ATS_UNUS
       vol->close_write(this);
     }
   }
-  CACHE_INCREMENT_DYN_STAT(cache_read_failure_stat);
+  Metrics::increment(cache_rsb.status[static_cast<int>(CacheOpType::Read)].failure);
+  Metrics::increment(vol->cache_vol->vol_rsb.status[static_cast<int>(CacheOpType::Read)].failure);
   _action.continuation->handleEvent(CACHE_EVENT_OPEN_READ_FAILED, (void *)-ECACHE_NO_DOC);
   return free_CacheVC(this);
 Lcallreturn:
   return handleEvent(AIO_EVENT_DONE, nullptr); // hopefully a tail call
 Lsuccess:
   if (write_vc) {
-    CACHE_INCREMENT_DYN_STAT(cache_read_busy_success_stat);
+    Metrics::increment(cache_rsb.read_busy_success);
+    Metrics::increment(vol->cache_vol->vol_rsb.read_busy_success);
   }
   SET_HANDLER(&CacheVC::openReadMain);
   return callcont(CACHE_EVENT_OPEN_READ);
@@ -1062,7 +1074,8 @@ CacheVC::openReadVecWrite(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */
     }
   }
 
-  CACHE_INCREMENT_DYN_STAT(cache_read_failure_stat);
+  Metrics::increment(cache_rsb.status[static_cast<int>(CacheOpType::Read)].failure);
+  Metrics::increment(vol->cache_vol->vol_rsb.status[static_cast<int>(CacheOpType::Read)].failure);
   _action.continuation->handleEvent(CACHE_EVENT_OPEN_READ_FAILED, (void *)-ECACHE_ALT_MISS);
   return free_CacheVC(this);
 Lrestart:
@@ -1203,7 +1216,8 @@ CacheVC::openReadStartHead(int event, Event *e)
         if (cl != doc_len) {
           Warning("OpenReadHead failed for cachekey %X : alternate content length doesn't match doc_len %" PRId64 " != %" PRId64,
                   key.slice32(0), cl, doc_len);
-          CACHE_INCREMENT_DYN_STAT(cache_read_invalid_stat);
+          Metrics::increment(cache_rsb.read_invalid);
+          Metrics::increment(vol->cache_vol->vol_rsb.read_invalid);
           err = ECACHE_BAD_META_DATA;
           goto Ldone;
         }
@@ -1268,10 +1282,12 @@ CacheVC::openReadStartHead(int event, Event *e)
   }
 Ldone:
   if (!f.lookup) {
-    CACHE_INCREMENT_DYN_STAT(cache_read_failure_stat);
+    Metrics::increment(cache_rsb.status[static_cast<int>(CacheOpType::Read)].failure);
+    Metrics::increment(vol->cache_vol->vol_rsb.status[static_cast<int>(CacheOpType::Read)].failure);
     _action.continuation->handleEvent(CACHE_EVENT_OPEN_READ_FAILED, (void *)-err);
   } else {
-    CACHE_INCREMENT_DYN_STAT(cache_lookup_failure_stat);
+    Metrics::increment(cache_rsb.status[static_cast<int>(CacheOpType::Lookup)].failure);
+    Metrics::increment(vol->cache_vol->vol_rsb.status[static_cast<int>(CacheOpType::Lookup)].failure);
     _action.continuation->handleEvent(CACHE_EVENT_LOOKUP_FAILED, (void *)-err);
   }
   return free_CacheVC(this);
@@ -1281,7 +1297,8 @@ Lsuccess:
   SET_HANDLER(&CacheVC::openReadMain);
   return callcont(CACHE_EVENT_OPEN_READ);
 Lookup:
-  CACHE_INCREMENT_DYN_STAT(cache_lookup_success_stat);
+  Metrics::increment(cache_rsb.status[static_cast<int>(CacheOpType::Lookup)].failure);
+  Metrics::increment(vol->cache_vol->vol_rsb.status[static_cast<int>(CacheOpType::Lookup)].failure);
   _action.continuation->handleEvent(CACHE_EVENT_LOOKUP, nullptr);
   return free_CacheVC(this);
 Learliest:
diff --git a/iocore/cache/CacheVol.cc b/iocore/cache/CacheVol.cc
index 1613632868..bb34aa3263 100644
--- a/iocore/cache/CacheVol.cc
+++ b/iocore/cache/CacheVol.cc
@@ -48,7 +48,7 @@ Cache::scan(Continuation *cont, const char *hostname, int host_len, int KB_per_s
   /* do we need to make a copy */
   c->hostname        = const_cast<char *>(hostname);
   c->host_len        = host_len;
-  c->base_stat       = cache_scan_active_stat;
+  c->op_type         = static_cast<int>(CacheOpType::Scan);
   c->buf             = new_IOBufferData(BUFFER_SIZE_FOR_XMALLOC(SCAN_BUF_SIZE), MEMALIGNED);
   c->scan_msec_delay = (SCAN_BUF_SIZE / KB_per_second);
   c->offset          = 0;
diff --git a/iocore/cache/CacheWrite.cc b/iocore/cache/CacheWrite.cc
index 5df8cda668..eeb96cfcc8 100644
--- a/iocore/cache/CacheWrite.cc
+++ b/iocore/cache/CacheWrite.cc
@@ -256,8 +256,10 @@ CacheVC::handleWrite(int event, Event * /* e ATS_UNUSED */)
                                                       (vio.nbytes != INT64_MAX && (cache_config_max_doc_size < vio.nbytes))));
 
   if (agg_error || max_doc_error) {
-    CACHE_INCREMENT_DYN_STAT(cache_write_backlog_failure_stat);
-    CACHE_INCREMENT_DYN_STAT(base_stat + CACHE_STAT_FAILURE);
+    Metrics::increment(cache_rsb.write_backlog_failure);
+    Metrics::increment(vol->cache_vol->vol_rsb.write_backlog_failure);
+    Metrics::increment(cache_rsb.status[op_type].failure);
+    Metrics::increment(vol->cache_vol->vol_rsb.status[op_type].failure);
     vol->agg_todo_size -= agg_len;
     io.aio_result       = AIO_SOFT_FAILURE;
     if (event == EVENT_CALL) {
@@ -436,10 +438,10 @@ Vol::aggWriteDone(int event, Event *e)
 CacheVC *
 new_DocEvacuator(int nbytes, Vol *vol)
 {
-  CacheVC *c        = new_CacheVC(vol);
-  ProxyMutex *mutex = vol->mutex.get();
-  c->base_stat      = cache_evacuate_active_stat;
-  CACHE_INCREMENT_DYN_STAT(c->base_stat + CACHE_STAT_ACTIVE);
+  CacheVC *c = new_CacheVC(vol);
+  c->op_type = static_cast<int>(CacheOpType::Evacuate);
+  Metrics::increment(cache_rsb.status[c->op_type].active);
+  Metrics::increment(vol->cache_vol->vol_rsb.status[c->op_type].active);
   c->buf         = new_IOBufferData(iobuffer_size_to_index(nbytes, MAX_BUFFER_SIZE_INDEX), MEMALIGNED);
   c->vol         = vol;
   c->f.evacuator = 1;
@@ -894,7 +896,12 @@ agg_copy(char *p, CacheVC *vc)
       {
         ProxyMutex *mutex ATS_UNUSED = vc->vol->mutex.get();
         ink_assert(mutex->thread_holding == this_ethread());
-        CACHE_DEBUG_SUM_DYN_STAT(cache_write_bytes_stat, vc->write_len);
+
+// ToDo: Why are these for debug only ?
+#ifdef DEBUG
+        Metrics::increment(cache_rsb.write_backlog_failure);
+        Metrics::increment(vol->cache_vol->vol_rsb.write_backlog_failure);
+#endif
       }
       if (vc->f.rewrite_resident_alt) {
         iobufferblock_memcpy(doc->data(), vc->write_len, res_alt_blk, 0);
@@ -932,12 +939,11 @@ agg_copy(char *p, CacheVC *vc)
     // for evacuated documents, copy the data, and update directory
     Doc *doc = reinterpret_cast<Doc *>(vc->buf->data());
     int l    = vc->vol->round_to_approx_size(doc->len);
-    {
-      ProxyMutex *mutex ATS_UNUSED = vc->vol->mutex.get();
-      ink_assert(mutex->thread_holding == this_ethread());
-      CACHE_DEBUG_INCREMENT_DYN_STAT(cache_gc_frags_evacuated_stat);
-      CACHE_DEBUG_SUM_DYN_STAT(cache_gc_bytes_evacuated_stat, l);
-    }
+
+#ifdef DEBUG
+    Metrics::increment(cache_rsb.gc_frags_evacuated);
+    Metrics::increment(vol->cache_vol->vol_rsb.gc_frags_evacuated);
+#endif
 
     doc->sync_serial  = vc->vol->header->sync_serial;
     doc->write_serial = vc->vol->header->write_serial;
@@ -1023,7 +1029,8 @@ Vol::agg_wrap()
   dir_clean_vol(this);
   {
     Vol *vol = this;
-    CACHE_INCREMENT_DYN_STAT(cache_directory_wrap_stat);
+    Metrics::increment(cache_rsb.directory_wrap);
+    Metrics::increment(vol->cache_vol->vol_rsb.directory_wrap);
     Note("Cache volume %d on disk '%s' wraps around", vol->cache_vol->vol_number, vol->hash_text.get());
   }
   periodic_scan();
@@ -1197,17 +1204,9 @@ CacheVC::openWriteCloseDir(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED *
   // size of the document
   if ((closed == 1) && (total_len > 0 || f.allow_empty_doc)) {
     DDbg(dbg_ctl_cache_stats, "Fragment = %d", fragment);
-    switch (fragment) {
-    case 0:
-      CACHE_INCREMENT_DYN_STAT(cache_single_fragment_document_count_stat);
-      break;
-    case 1:
-      CACHE_INCREMENT_DYN_STAT(cache_two_fragment_document_count_stat);
-      break;
-    default:
-      CACHE_INCREMENT_DYN_STAT(cache_three_plus_plus_fragment_document_count_stat);
-      break;
-    }
+
+    Metrics::increment(cache_rsb.fragment_document_count[std::max(fragment, 2)]);
+    Metrics::increment(vol->cache_vol->vol_rsb.fragment_document_count[std::max(fragment, 2)]);
   }
   if (f.close_complete) {
     recursive++;
@@ -1658,7 +1657,8 @@ Lsuccess:
   return callcont(CACHE_EVENT_OPEN_WRITE);
 
 Lfailure:
-  CACHE_INCREMENT_DYN_STAT(base_stat + CACHE_STAT_FAILURE);
+  Metrics::increment(cache_rsb.status[op_type].failure);
+  Metrics::increment(vol->cache_vol->vol_rsb.status[op_type].failure);
   _action.continuation->handleEvent(CACHE_EVENT_OPEN_WRITE_FAILED, (void *)-err);
 Lcancel:
   if (od) {
@@ -1681,7 +1681,8 @@ CacheVC::openWriteStartBegin(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED
     return free_CacheVC(this);
   }
   if (((err = vol->open_write_lock(this, false, 1)) > 0)) {
-    CACHE_INCREMENT_DYN_STAT(base_stat + CACHE_STAT_FAILURE);
+    Metrics::increment(cache_rsb.status[op_type].failure);
+    Metrics::increment(vol->cache_vol->vol_rsb.status[op_type].failure);
     free_CacheVC(this);
     _action.continuation->handleEvent(CACHE_EVENT_OPEN_WRITE_FAILED, (void *)-err);
     return EVENT_DONE;
@@ -1711,15 +1712,15 @@ Cache::open_write(Continuation *cont, const CacheKey *key, CacheFragType frag_ty
 
   ink_assert(caches[frag_type] == this);
 
-  intptr_t res      = 0;
-  CacheVC *c        = new_CacheVC(cont);
-  ProxyMutex *mutex = cont->mutex.get();
+  intptr_t res = 0;
+  CacheVC *c   = new_CacheVC(cont);
   SCOPED_MUTEX_LOCK(lock, c->mutex, this_ethread());
-  c->vio.op    = VIO::WRITE;
-  c->base_stat = cache_write_active_stat;
-  c->vol       = key_to_vol(key, hostname, host_len);
-  Vol *vol     = c->vol;
-  CACHE_INCREMENT_DYN_STAT(c->base_stat + CACHE_STAT_ACTIVE);
+  c->vio.op  = VIO::WRITE;
+  c->op_type = static_cast<int>(CacheOpType::Write);
+  c->vol     = key_to_vol(key, hostname, host_len);
+  Vol *vol   = c->vol;
+  Metrics::increment(cache_rsb.status[c->op_type].active);
+  Metrics::increment(vol->cache_vol->vol_rsb.status[c->op_type].active);
   c->first_key = c->key = *key;
   c->frag_type          = frag_type;
   /*
@@ -1741,7 +1742,8 @@ Cache::open_write(Continuation *cont, const CacheKey *key, CacheFragType frag_ty
 
   if ((res = c->vol->open_write_lock(c, false, 1)) > 0) {
     // document currently being written, abort
-    CACHE_INCREMENT_DYN_STAT(c->base_stat + CACHE_STAT_FAILURE);
+    Metrics::increment(cache_rsb.status[c->op_type].failure);
+    Metrics::increment(vol->cache_vol->vol_rsb.status[c->op_type].failure);
     cont->handleEvent(CACHE_EVENT_OPEN_WRITE_FAILED, (void *)-res);
     free_CacheVC(c);
     return ACTION_RESULT_DONE;
@@ -1776,12 +1778,11 @@ Cache::open_write(Continuation *cont, const CacheKey *key, CacheHTTPInfo *info,
   }
 
   ink_assert(caches[type] == this);
-  intptr_t err      = 0;
-  int if_writers    = (uintptr_t)info == CACHE_ALLOW_MULTIPLE_WRITES;
-  CacheVC *c        = new_CacheVC(cont);
-  ProxyMutex *mutex = cont->mutex.get();
-  c->vio.op         = VIO::WRITE;
-  c->first_key      = *key;
+  intptr_t err   = 0;
+  int if_writers = (uintptr_t)info == CACHE_ALLOW_MULTIPLE_WRITES;
+  CacheVC *c     = new_CacheVC(cont);
+  c->vio.op      = VIO::WRITE;
+  c->first_key   = *key;
   /*
      The transition from single fragment document to a multi-fragment document
      would cause a problem if the key and the first_key collide. In case of
@@ -1827,16 +1828,18 @@ Cache::open_write(Continuation *cont, const CacheKey *key, CacheHTTPInfo *info,
        open_write with info set
        close
      */
-    c->f.update  = 1;
-    c->base_stat = cache_update_active_stat;
+    c->f.update = 1;
+    c->op_type  = static_cast<int>(CacheOpType::Update);
     DDbg(dbg_ctl_cache_update, "Update called");
     info->object_key_get(&c->update_key);
     ink_assert(!(c->update_key.is_zero()));
     c->update_len = info->object_size_get();
   } else {
-    c->base_stat = cache_write_active_stat;
+    c->op_type = static_cast<int>(CacheOpType::Write);
   }
-  CACHE_INCREMENT_DYN_STAT(c->base_stat + CACHE_STAT_ACTIVE);
+
+  Metrics::increment(cache_rsb.status[c->op_type].active);
+  Metrics::increment(vol->cache_vol->vol_rsb.status[c->op_type].active);
   c->pin_in_cache = apin_in_cache;
 
   {
@@ -1886,7 +1889,8 @@ Lmiss:
   return ACTION_RESULT_DONE;
 
 Lfailure:
-  CACHE_INCREMENT_DYN_STAT(c->base_stat + CACHE_STAT_FAILURE);
+  Metrics::increment(cache_rsb.status[c->op_type].failure);
+  Metrics::increment(vol->cache_vol->vol_rsb.status[c->op_type].failure);
   cont->handleEvent(CACHE_EVENT_OPEN_WRITE_FAILED, (void *)-err);
   if (c->od) {
     c->openWriteCloseDir(EVENT_IMMEDIATE, nullptr);
diff --git a/iocore/cache/P_Cache.h b/iocore/cache/P_Cache.h
index 832d7d282c..f657870552 100644
--- a/iocore/cache/P_Cache.h
+++ b/iocore/cache/P_Cache.h
@@ -26,13 +26,13 @@
 #include "tscore/ink_platform.h"
 #include "P_EventSystem.h"
 #include "P_AIO.h"
-#include "records/I_RecProcess.h"
 
 #include "HTTP.h"
 #include "MIME.h"
 #include "HttpTransactCache.h"
 
 #include "I_Cache.h"
+#include "P_CacheStats.h"
 #include "P_CacheDisk.h"
 #include "P_CacheDir.h"
 #include "P_RamCache.h"
diff --git a/iocore/cache/P_CacheInternal.h b/iocore/cache/P_CacheInternal.h
index e1fbbb8552..8c6dba1aba 100644
--- a/iocore/cache/P_CacheInternal.h
+++ b/iocore/cache/P_CacheInternal.h
@@ -29,6 +29,9 @@
 #include "HTTP.h"
 #include "P_CacheHttp.h"
 #include "P_CacheHosting.h"
+#include "api/Metrics.h"
+
+using ts::Metrics;
 
 struct EvacuationBlock;
 
@@ -96,117 +99,7 @@ struct EvacuationBlock;
     return EVENT_CONT;                                                    \
   } while (0)
 
-// cache stats definitions
-enum {
-  cache_bytes_used_stat,
-  cache_bytes_total_stat,
-  cache_stripes_stat,
-  cache_ram_cache_bytes_stat,
-  cache_ram_cache_bytes_total_stat,
-  cache_direntries_total_stat,
-  cache_direntries_used_stat,
-  cache_ram_cache_hits_stat,
-  cache_ram_cache_misses_stat,
-  cache_pread_count_stat,
-  cache_percent_full_stat,
-  cache_lookup_active_stat,
-  cache_lookup_success_stat,
-  cache_lookup_failure_stat,
-  cache_read_active_stat,
-  cache_read_success_stat,
-  cache_read_failure_stat,
-  cache_read_seek_fail_stat,
-  cache_read_invalid_stat,
-  cache_write_active_stat,
-  cache_write_success_stat,
-  cache_write_failure_stat,
-  cache_write_backlog_failure_stat,
-  cache_update_active_stat,
-  cache_update_success_stat,
-  cache_update_failure_stat,
-  cache_remove_active_stat,
-  cache_remove_success_stat,
-  cache_remove_failure_stat,
-  cache_evacuate_active_stat,
-  cache_evacuate_success_stat,
-  cache_evacuate_failure_stat,
-  cache_scan_active_stat,
-  cache_scan_success_stat,
-  cache_scan_failure_stat,
-  cache_directory_collision_count_stat,
-  cache_single_fragment_document_count_stat,
-  cache_two_fragment_document_count_stat,
-  cache_three_plus_plus_fragment_document_count_stat,
-  cache_read_busy_success_stat,
-  cache_read_busy_failure_stat,
-  cache_gc_bytes_evacuated_stat,
-  cache_gc_frags_evacuated_stat,
-  cache_write_bytes_stat,
-  cache_hdr_vector_marshal_stat,
-  cache_hdr_marshal_stat,
-  cache_hdr_marshal_bytes_stat,
-  cache_directory_wrap_stat,
-  cache_directory_sync_count_stat,
-  cache_directory_sync_time_stat,
-  cache_directory_sync_bytes_stat,
-  /* AIO read/write error counters */
-  cache_span_errors_read_stat,
-  cache_span_errors_write_stat,
-  /* Span related gauges. A span "moves" from "online" (errors==0)
-   * to "failing" (errors > 0 && errors < proxy.config.cache.max_disk_errors)
-   * to "offline"(errors >= proxy.config.cache.max_disk_errors.
-   * "failing" + "offline" + "online" = total number of spans */
-  cache_span_offline_stat,
-  cache_span_online_stat,
-  cache_span_failing_stat,
-  cache_stat_count
-};
-
-extern RecRawStatBlock *cache_rsb;
-
-#define GLOBAL_CACHE_SET_DYN_STAT(x, y) RecSetGlobalRawStatSum(cache_rsb, (x), (y))
-
-#define CACHE_SET_DYN_STAT(x, y) \
-  RecSetGlobalRawStatSum(cache_rsb, (x), (y)) RecSetGlobalRawStatSum(vol->cache_vol->vol_rsb, (x), (y))
-
-#define CACHE_INCREMENT_DYN_STAT(x)                                              \
-  do {                                                                           \
-    RecIncrRawStat(cache_rsb, mutex->thread_holding, (int)(x), 1);               \
-    RecIncrRawStat(vol->cache_vol->vol_rsb, mutex->thread_holding, (int)(x), 1); \
-  } while (0);
-
-#define CACHE_DECREMENT_DYN_STAT(x)                                               \
-  do {                                                                            \
-    RecIncrRawStat(cache_rsb, mutex->thread_holding, (int)(x), -1);               \
-    RecIncrRawStat(vol->cache_vol->vol_rsb, mutex->thread_holding, (int)(x), -1); \
-  } while (0);
-
-#define CACHE_VOL_SUM_DYN_STAT(x, y) RecIncrRawStat(vol->cache_vol->vol_rsb, mutex->thread_holding, (int)(x), (int64_t)y);
-
-#define CACHE_SUM_DYN_STAT(x, y)                                                            \
-  do {                                                                                      \
-    RecIncrRawStat(cache_rsb, mutex->thread_holding, (int)(x), (int64_t)(y));               \
-    RecIncrRawStat(vol->cache_vol->vol_rsb, mutex->thread_holding, (int)(x), (int64_t)(y)); \
-  } while (0);
-
-#define CACHE_SUM_DYN_STAT_THREAD(x, y)                                              \
-  do {                                                                               \
-    RecIncrRawStat(cache_rsb, this_ethread(), (int)(x), (int64_t)(y));               \
-    RecIncrRawStat(vol->cache_vol->vol_rsb, this_ethread(), (int)(x), (int64_t)(y)); \
-  } while (0);
-
-#define GLOBAL_CACHE_SUM_GLOBAL_DYN_STAT(x, y) RecIncrGlobalRawStatSum(cache_rsb, (x), (y))
-
-#define CACHE_SUM_GLOBAL_DYN_STAT(x, y) \
-  RecIncrGlobalRawStatSum(cache_rsb, (x), (y)) RecIncrGlobalRawStatSum(vol->cache_vol->vol_rsb, (x), (y))
-
-#define CACHE_CLEAR_DYN_STAT(x)                          \
-  do {                                                   \
-    RecSetRawStatSum(cache_rsb, (x), 0);                 \
-    RecSetRawStatCount(cache_rsb, (x), 0);               \
-    RecSetRawStatSum(vol->cache_vol->vol_rsb, (x), 0);   \
-    RecSetRawStatCount(vol->cache_vol->vol_rsb, (x), 0); \
-  } while (0);
+extern CacheStatsBlock cache_rsb;
 
 // Configuration
 extern int cache_config_dir_sync_frequency;
@@ -402,11 +295,6 @@ struct CacheVC : public CacheVConnection {
   bool set_pin_in_cache(time_t time_pin) override;
   time_t get_pin_in_cache() override;
 
-// offsets from the base stat
-#define CACHE_STAT_ACTIVE  0
-#define CACHE_STAT_SUCCESS 1
-#define CACHE_STAT_FAILURE 2
-
   // number of bytes to memset to 0 in the CacheVC when we free
   // it. All member variables starting from vio are memset to 0.
   // This variable is initialized in CacheVC constructor.
@@ -467,7 +355,7 @@ struct CacheVC : public CacheVConnection {
   ContinuationHandler save_handler;
   time_t pin_in_cache;
   ink_hrtime start_time;
-  int base_stat;
+  int op_type; // Index into the metrics array for this operation, rather than a CacheOpType (fewer casts)
   int recursive;
   int closed;
   uint64_t seek_to;      // pread offset
@@ -579,10 +467,13 @@ free_CacheVC(CacheVC *cont)
   Dbg(dbg_ctl, "free %p", cont);
   ProxyMutex *mutex = cont->mutex.get();
   Vol *vol          = cont->vol;
+
   if (vol) {
-    CACHE_DECREMENT_DYN_STAT(cont->base_stat + CACHE_STAT_ACTIVE);
+    Metrics::decrement(cache_rsb.status[cont->op_type].active);
+    Metrics::decrement(vol->cache_vol->vol_rsb.status[cont->op_type].active);
     if (cont->closed > 0) {
-      CACHE_INCREMENT_DYN_STAT(cont->base_stat + CACHE_STAT_SUCCESS);
+      Metrics::increment(cache_rsb.status[cont->op_type].success);
+      Metrics::increment(vol->cache_vol->vol_rsb.status[cont->op_type].success);
     } // else abort,cancel
   }
   ink_assert(mutex->thread_holding == this_ethread());
@@ -786,10 +677,14 @@ Vol::open_write(CacheVC *cont, int allow_if_writers, int max_writers)
     agg_error = agg_error || ((uint32_t)mutex->thread_holding->generator.random() < (uint32_t)(UINT_MAX * CACHE_AGG_FAIL_RATE));
 #endif
   }
+
   if (agg_error) {
-    CACHE_INCREMENT_DYN_STAT(cache_write_backlog_failure_stat);
+    Metrics::increment(cache_rsb.write_backlog_failure);
+    Metrics::increment(vol->cache_vol->vol_rsb.write_backlog_failure);
+
     return ECACHE_WRITE_FAIL;
   }
+
   if (open_dir.open_write(cont, allow_if_writers, max_writers)) {
 #ifdef CACHE_STAT_PAGES
     ink_assert(cont->mutex->thread_holding == this_ethread());
@@ -956,17 +851,6 @@ CacheRemoveCont::event_handler(int event, void *data)
   return EVENT_DONE;
 }
 
-int64_t cache_bytes_used();
-int64_t cache_bytes_total();
-
-#ifdef DEBUG
-#define CACHE_DEBUG_INCREMENT_DYN_STAT(_x) CACHE_INCREMENT_DYN_STAT(_x)
-#define CACHE_DEBUG_SUM_DYN_STAT(_x, _y)   CACHE_SUM_DYN_STAT(_x, _y)
-#else
-#define CACHE_DEBUG_INCREMENT_DYN_STAT(_x)
-#define CACHE_DEBUG_SUM_DYN_STAT(_x, _y)
-#endif
-
 struct CacheHostRecord;
 struct Vol;
 class CacheHostTable;
diff --git a/iocore/cache/P_CacheStats.h b/iocore/cache/P_CacheStats.h
new file mode 100644
index 0000000000..b87b8f7dcf
--- /dev/null
+++ b/iocore/cache/P_CacheStats.h
@@ -0,0 +1,70 @@
+/** @file
+
+  A brief file description
+
+  @section license License
+
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing, software
+  distributed under the License is distributed on an "AS IS" BASIS,
+  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+  See the License for the specific language governing permissions and
+  limitations under the License.
+ */
+
+#pragma once
+
+// cache stats definitions, for both global cache metrics, as well as per volume metrics.
+enum class CacheOpType { Lookup = 0, Read, Write, Update, Remove, Evacuate, Scan, Last };
+
+struct CacheStatsBlock {
+  struct {
+    ts::Metrics::IntType *active;
+    ts::Metrics::IntType *success;
+    ts::Metrics::IntType *failure;
+  } status[static_cast<int>(CacheOpType::Last)];
+
+  ts::Metrics::IntType *fragment_document_count[3]; // For 1, 2 and 3+ fragments
+
+  ts::Metrics::IntType *bytes_used;
+  ts::Metrics::IntType *bytes_total;
+  ts::Metrics::IntType *stripes;
+  ts::Metrics::IntType *ram_cache_bytes;
+  ts::Metrics::IntType *ram_cache_bytes_total;
+  ts::Metrics::IntType *direntries_total;
+  ts::Metrics::IntType *direntries_used;
+  ts::Metrics::IntType *ram_cache_hits;
+  ts::Metrics::IntType *ram_cache_misses;
+  ts::Metrics::IntType *pread_count;
+  ts::Metrics::IntType *percent_full;
+  ts::Metrics::IntType *read_seek_fail;
+  ts::Metrics::IntType *read_invalid;
+  ts::Metrics::IntType *write_backlog_failure;
+  ts::Metrics::IntType *directory_collision_count;
+  ts::Metrics::IntType *read_busy_success;
+  ts::Metrics::IntType *read_busy_failure;
+  ts::Metrics::IntType *gc_bytes_evacuated;
+  ts::Metrics::IntType *gc_frags_evacuated;
+  ts::Metrics::IntType *write_bytes;
+  ts::Metrics::IntType *hdr_vector_marshal;
+  ts::Metrics::IntType *hdr_marshal;
+  ts::Metrics::IntType *hdr_marshal_bytes;
+  ts::Metrics::IntType *directory_wrap;
+  ts::Metrics::IntType *directory_sync_count;
+  ts::Metrics::IntType *directory_sync_time;
+  ts::Metrics::IntType *directory_sync_bytes;
+  ts::Metrics::IntType *span_errors_read;
+  ts::Metrics::IntType *span_errors_write;
+  ts::Metrics::IntType *span_offline;
+  ts::Metrics::IntType *span_online;
+  ts::Metrics::IntType *span_failing;
+};
diff --git a/iocore/cache/P_CacheVol.h b/iocore/cache/P_CacheVol.h
index 9c9e99592a..37c7ea36e9 100644
--- a/iocore/cache/P_CacheVol.h
+++ b/iocore/cache/P_CacheVol.h
@@ -27,6 +27,8 @@
 
 #include "tscore/CryptoHash.h"
 
+#include "P_Cache.h"
+
 #define CACHE_BLOCK_SHIFT        9
 #define CACHE_BLOCK_SIZE         (1 << CACHE_BLOCK_SHIFT) // 512, smallest sector size
 #define ROUND_TO_STORE_BLOCK(_x) INK_ALIGN((_x), STORE_BLOCK_SIZE)
@@ -272,7 +274,7 @@ struct CacheVol {
   DiskVol **disk_vols   = nullptr;
   LINK(CacheVol, link);
   // per volume stats
-  RecRawStatBlock *vol_rsb = nullptr;
+  CacheStatsBlock vol_rsb;
 
   CacheVol() {}
 };
diff --git a/iocore/cache/RamCacheCLFUS.cc b/iocore/cache/RamCacheCLFUS.cc
index 9439597f4b..1e8e8424b4 100644
--- a/iocore/cache/RamCacheCLFUS.cc
+++ b/iocore/cache/RamCacheCLFUS.cc
@@ -301,7 +301,8 @@ RamCacheCLFUS::get(CryptoHash *key, Ptr<IOBufferData> *ret_data, uint64_t auxkey
           if (!e->flag_bits.copy) { // don't bother if we have to copy anyway
             int64_t delta  = (static_cast<int64_t>(e->compressed_len)) - static_cast<int64_t>(e->size);
             this->_bytes  += delta;
-            CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_bytes_stat, delta);
+            Metrics::increment(cache_rsb.ram_cache_bytes, delta);
+            Metrics::increment(vol->cache_vol->vol_rsb.ram_cache_bytes, delta);
             e->size = e->compressed_len;
             check_accounting(this);
             e->flag_bits.compressed = 0;
@@ -316,11 +317,13 @@ RamCacheCLFUS::get(CryptoHash *key, Ptr<IOBufferData> *ret_data, uint64_t auxkey
           }
           (*ret_data) = data;
         }
-        CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_hits_stat, 1);
+        Metrics::increment(cache_rsb.ram_cache_hits);
+        Metrics::increment(vol->cache_vol->vol_rsb.ram_cache_hits);
         DDbg(dbg_ctl_ram_cache, "get %X %" PRId64 " size %d HIT", key->slice32(3), auxkey, e->size);
         return ram_hit_state;
       } else {
-        CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_misses_stat, 1);
+        Metrics::increment(cache_rsb.ram_cache_misses);
+        Metrics::increment(vol->cache_vol->vol_rsb.ram_cache_misses);
         DDbg(dbg_ctl_ram_cache, "get %X %" PRId64 " HISTORY", key->slice32(3), auxkey);
         return 0;
       }
@@ -330,7 +333,9 @@ RamCacheCLFUS::get(CryptoHash *key, Ptr<IOBufferData> *ret_data, uint64_t auxkey
   }
   DDbg(dbg_ctl_ram_cache, "get %X %" PRId64 " MISS", key->slice32(3), auxkey);
 Lerror:
-  CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_misses_stat, 1);
+  Metrics::increment(cache_rsb.ram_cache_misses);
+  Metrics::increment(vol->cache_vol->vol_rsb.ram_cache_misses);
+
   return 0;
 Lfailed:
   ats_free(b);
@@ -402,7 +407,8 @@ RamCacheCLFUS::_destroy(RamCacheCLFUSEntry *e)
   if (!e->flag_bits.lru) {
     this->_objects--;
     this->_bytes -= e->size + ENTRY_OVERHEAD;
-    CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_bytes_stat, -(int64_t)e->size);
+    Metrics::decrement(cache_rsb.ram_cache_bytes, e->size);
+    Metrics::decrement(vol->cache_vol->vol_rsb.ram_cache_bytes, e->size);
     e->data = nullptr;
   } else {
     this->_history--;
@@ -530,7 +536,8 @@ RamCacheCLFUS::compress_entries(EThread *thread, int do_at_most)
         e->compressed_len  = l;
         int64_t delta      = (static_cast<int64_t>(l)) - static_cast<int64_t>(e->size);
         this->_bytes      += delta;
-        CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_bytes_stat, delta);
+        Metrics::increment(cache_rsb.ram_cache_bytes, delta);
+        Metrics::increment(vol->cache_vol->vol_rsb.ram_cache_bytes, delta);
         e->size = l;
       } else {
         ats_free(b);
@@ -539,7 +546,8 @@ RamCacheCLFUS::compress_entries(EThread *thread, int do_at_most)
         memcpy(bb, e->data->data(), e->len);
         int64_t delta  = (static_cast<int64_t>(e->len)) - static_cast<int64_t>(e->size);
         this->_bytes  += delta;
-        CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_bytes_stat, delta);
+        Metrics::increment(cache_rsb.ram_cache_bytes, delta);
+        Metrics::increment(vol->cache_vol->vol_rsb.ram_cache_bytes, delta);
         e->size = e->len;
         l       = e->len;
       }
@@ -570,7 +578,8 @@ RamCacheCLFUS::_requeue_victims(Que(RamCacheCLFUSEntry, lru_link) & victims)
   RamCacheCLFUSEntry *victim = nullptr;
   while ((victim = victims.dequeue())) {
     this->_bytes += victim->size + ENTRY_OVERHEAD;
-    CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_bytes_stat, victim->size);
+    Metrics::increment(cache_rsb.ram_cache_bytes, victim->size);
+    Metrics::increment(vol->cache_vol->vol_rsb.ram_cache_bytes, victim->size);
     victim->hits = REQUEUE_HITS(victim->hits);
     this->_lru[0].enqueue(victim);
   }
@@ -605,7 +614,8 @@ RamCacheCLFUS::put(CryptoHash *key, IOBufferData *data, uint32_t len, bool copy,
       this->_lru[e->flag_bits.lru].enqueue(e);
       int64_t delta  = (static_cast<int64_t>(size)) - static_cast<int64_t>(e->size);
       this->_bytes  += delta;
-      CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_bytes_stat, delta);
+      Metrics::increment(cache_rsb.ram_cache_bytes, delta);
+      Metrics::increment(vol->cache_vol->vol_rsb.ram_cache_bytes, delta);
       if (!copy) {
         e->size = size;
         e->data = data;
@@ -666,7 +676,8 @@ RamCacheCLFUS::put(CryptoHash *key, IOBufferData *data, uint32_t len, bool copy,
       continue;
     }
     this->_bytes -= victim->size + ENTRY_OVERHEAD;
-    CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_bytes_stat, -(int64_t)victim->size);
+    Metrics::decrement(cache_rsb.ram_cache_bytes, victim->size);
+    Metrics::decrement(vol->cache_vol->vol_rsb.ram_cache_bytes, victim->size);
     victims.enqueue(victim);
     if (victim == this->_compressed) {
       this->_compressed = nullptr;
@@ -694,7 +705,8 @@ Linsert:
   while ((victim = victims.dequeue())) {
     if (this->_bytes + size + victim->size <= this->_max_bytes) {
       this->_bytes += victim->size + ENTRY_OVERHEAD;
-      CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_bytes_stat, victim->size);
+      Metrics::increment(cache_rsb.ram_cache_bytes, victim->size);
+      Metrics::increment(vol->cache_vol->vol_rsb.ram_cache_bytes, victim->size);
       victim->hits = REQUEUE_HITS(victim->hits);
       this->_lru[0].enqueue(victim);
     } else {
@@ -726,7 +738,8 @@ Linsert:
   }
   e->flag_bits.copy  = copy;
   this->_bytes      += size + ENTRY_OVERHEAD;
-  CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_bytes_stat, size);
+  Metrics::increment(cache_rsb.ram_cache_bytes, size);
+  Metrics::increment(vol->cache_vol->vol_rsb.ram_cache_bytes, size);
   e->size = size;
   this->_objects++;
   this->_lru[0].enqueue(e);
diff --git a/iocore/cache/RamCacheLRU.cc b/iocore/cache/RamCacheLRU.cc
index f62da888e9..912c1e340a 100644
--- a/iocore/cache/RamCacheLRU.cc
+++ b/iocore/cache/RamCacheLRU.cc
@@ -141,13 +141,17 @@ RamCacheLRU::get(CryptoHash *key, Ptr<IOBufferData> *ret_data, uint64_t auxkey)
       lru.enqueue(e);
       (*ret_data) = e->data;
       DDbg(dbg_ctl_ram_cache, "get %X %" PRIu64 " HIT", key->slice32(3), auxkey);
-      CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_hits_stat, 1);
+      Metrics::increment(cache_rsb.ram_cache_hits);
+      Metrics::increment(vol->cache_vol->vol_rsb.ram_cache_hits);
+
       return 1;
     }
     e = e->hash_link.next;
   }
   DDbg(dbg_ctl_ram_cache, "get %X %" PRIu64 " MISS", key->slice32(3), auxkey);
-  CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_misses_stat, 1);
+  Metrics::increment(cache_rsb.ram_cache_misses);
+  Metrics::increment(vol->cache_vol->vol_rsb.ram_cache_misses);
+
   return 0;
 }
 
@@ -159,7 +163,9 @@ RamCacheLRU::remove(RamCacheLRUEntry *e)
   bucket[b].remove(e);
   lru.remove(e);
   bytes -= ENTRY_OVERHEAD + e->data->block_size();
-  CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_bytes_stat, -(ENTRY_OVERHEAD + e->data->block_size()));
+  Metrics::decrement(cache_rsb.ram_cache_bytes, ENTRY_OVERHEAD + e->data->block_size());
+  Metrics::decrement(vol->cache_vol->vol_rsb.ram_cache_bytes, ENTRY_OVERHEAD + e->data->block_size());
+
   DDbg(dbg_ctl_ram_cache, "put %X %" PRIu64 " FREED", e->key.slice32(3), e->auxkey);
   e->data = nullptr;
   THREAD_FREE(e, ramCacheLRUEntryAllocator, this_thread());
@@ -206,7 +212,8 @@ RamCacheLRU::put(CryptoHash *key, IOBufferData *data, uint32_t len, bool, uint64
   lru.enqueue(e);
   bytes += ENTRY_OVERHEAD + data->block_size();
   objects++;
-  CACHE_SUM_DYN_STAT_THREAD(cache_ram_cache_bytes_stat, ENTRY_OVERHEAD + data->block_size());
+  Metrics::increment(cache_rsb.ram_cache_bytes, ENTRY_OVERHEAD + data->block_size());
+  Metrics::increment(vol->cache_vol->vol_rsb.ram_cache_bytes, ENTRY_OVERHEAD + data->block_size());
   while (bytes > max_bytes) {
     RamCacheLRUEntry *ee = lru.dequeue();
     if (ee) {
diff --git a/iocore/dns/DNS.cc b/iocore/dns/DNS.cc
index fb710acb9e..c2b2182830 100644
--- a/iocore/dns/DNS.cc
+++ b/iocore/dns/DNS.cc
@@ -470,7 +470,7 @@ DNSHandler::open_cons(sockaddr const *target, bool failed, int icon)
 bool
 DNSHandler::reset_tcp_conn(int ndx)
 {
-  DNS_INCREMENT_DYN_STAT(dns_tcp_reset_stat);
+  Metrics::increment(dns_rsb.tcp_reset);
   tcpcon[ndx].close();
   return open_con(&m_res->nsaddr_list[ndx].sa, true, ndx, true);
 }
@@ -824,7 +824,7 @@ DNSHandler::rr_failure(int ndx)
         ++(e->retries); // give them another chance
       }
       --in_flight;
-      DNS_DECREMENT_DYN_STAT(dns_in_flight_stat);
+      Metrics::decrement(dns_rsb.in_flight);
     }
   } else {
     // move outstanding requests that were sent to this nameserver to another
@@ -835,7 +835,7 @@ DNSHandler::rr_failure(int ndx)
           ++(e->retries); // give them another chance
         }
         --in_flight;
-        DNS_DECREMENT_DYN_STAT(dns_in_flight_stat);
+        Metrics::decrement(dns_rsb.in_flight);
       }
     }
   }
@@ -1079,8 +1079,7 @@ get_entry(DNSHandler *h, char *qname, int qtype)
 static void
 write_dns(DNSHandler *h, bool tcp_retry)
 {
-  ProxyMutex *mutex = h->mutex.get();
-  DNS_INCREMENT_DYN_STAT(dns_total_lookups_stat);
+  Metrics::increment(dns_rsb.total_lookups);
   int max_nscount = h->m_res->nscount;
   if (max_nscount > MAX_NAMED) {
     max_nscount = MAX_NAMED;
@@ -1164,7 +1163,6 @@ DNSHandler::get_query_id()
 static bool
 write_dns_event(DNSHandler *h, DNSEntry *e, bool over_tcp)
 {
-  ProxyMutex *mutex = h->mutex.get();
   unsigned char buffer[MAX_DNS_REQUEST_LEN];
   int offset     = over_tcp ? tcp_data_length_offset : 0;
   HEADER *header = reinterpret_cast<HEADER *>(buffer + offset);
@@ -1219,7 +1217,7 @@ write_dns_event(DNSHandler *h, DNSEntry *e, bool over_tcp)
   e->which_ns          = h->name_server;
   e->once_written_flag = true;
   ++h->in_flight;
-  DNS_INCREMENT_DYN_STAT(dns_in_flight_stat);
+  Metrics::increment(dns_rsb.in_flight);
 
   e->send_time = ink_get_hrtime();
 
@@ -1304,7 +1302,7 @@ DNSEntry::mainEvent(int event, Event *e)
       Dbg(dbg_ctl_dns, "marking %s as not-written", qname);
       written_flag = false;
       --(dnsH->in_flight);
-      DNS_DECREMENT_DYN_STAT(dns_in_flight_stat);
+      Metrics::decrement(dns_rsb.in_flight);
     }
     timeout = nullptr;
     dns_result(dnsH, this, result_ent.get(), true);
@@ -1343,16 +1341,15 @@ DNSProcessor::getby(DNSQueryData x, int type, Continuation *cont, Options const
 static void
 dns_result(DNSHandler *h, DNSEntry *e, HostEnt *ent, bool retry, bool tcp_retry)
 {
-  ProxyMutex *mutex = h->mutex.get();
-  bool cancelled    = (e->action.cancelled ? true : false);
-  retry             = retry || tcp_retry;
+  bool cancelled = (e->action.cancelled ? true : false);
+  retry          = retry || tcp_retry;
 
   if ((!ent || !ent->good) && !cancelled) {
     // try to retry operation
     if (retry && e->retries) {
       Dbg(dbg_ctl_dns, "doing retry for %s", e->qname);
 
-      DNS_INCREMENT_DYN_STAT(dns_retries_stat);
+      Metrics::increment(dns_rsb.tcp_retries);
 
       --(e->retries);
       write_dns(h, tcp_retry);
@@ -1388,17 +1385,24 @@ dns_result(DNSHandler *h, DNSEntry *e, HostEnt *ent, bool retry, bool tcp_retry)
       }
     }
     if (retry) {
-      DNS_INCREMENT_DYN_STAT(dns_max_retries_exceeded_stat);
+      Metrics::increment(dns_rsb.max_retries_exceeded);
     }
   }
   if (ent == BAD_DNS_RESULT) {
     ent = nullptr;
   }
   if (!cancelled) {
+    // ToDo: Should this possibly be send_time() ??
+    ink_hrtime diff = (ink_get_hrtime() - e->submit_time) / HRTIME_MSECOND;
+
+    // These are rolling averages, this requires that the lookup_fail/success counters are incremented later
     if (!ent || !ent->good) {
-      DNS_SUM_DYN_STAT(dns_fail_time_stat, ink_get_hrtime() - e->submit_time);
+      Metrics::increment(dns_rsb.fail_time, diff);
+      Metrics::increment(dns_rsb.lookup_fail);
     } else {
-      DNS_SUM_DYN_STAT(dns_success_time_stat, ink_get_hrtime() - e->submit_time);
+      Metrics::increment(dns_rsb.success_time, diff);
+
+      Metrics::increment(dns_rsb.lookup_success);
     }
   }
 
@@ -1431,12 +1435,6 @@ dns_result(DNSHandler *h, DNSEntry *e, HostEnt *ent, bool retry, bool tcp_retry)
     }
   }
 
-  if (ent && ent->good) {
-    DNS_INCREMENT_DYN_STAT(dns_lookup_success_stat);
-  } else {
-    DNS_INCREMENT_DYN_STAT(dns_lookup_fail_stat);
-  }
-
   // Save HostEnt to the head node
   e->result_ent = ent;
   e->retries    = 0;
@@ -1524,7 +1522,6 @@ DNSEntry::postOneEvent(int /* event ATS_UNUSED */, Event * /* e ATS_UNUSED */)
 static bool
 dns_process(DNSHandler *handler, HostEnt *buf, int len)
 {
-  ProxyMutex *mutex = handler->mutex.get();
   HEADER *h         = reinterpret_cast<HEADER *>(buf->buf);
   DNSEntry *e       = get_dns(handler, static_cast<uint16_t>(ntohs(h->id)));
   bool retry        = false;
@@ -1562,15 +1559,17 @@ dns_process(DNSHandler *handler, HostEnt *buf, int len)
   //
   e->written_flag = false;
   --(handler->in_flight);
-  DNS_DECREMENT_DYN_STAT(dns_in_flight_stat);
+  Metrics::decrement(dns_rsb.in_flight);
+  // These are rolling averages
+  ink_hrtime diff = (ink_get_hrtime() - e->send_time) / HRTIME_MSECOND;
 
-  DNS_SUM_DYN_STAT(dns_response_time_stat, ink_get_hrtime() - e->send_time);
+  Metrics::increment(dns_rsb.response_time, diff);
 
   // retrying over TCP when truncated is set
   if (dns_conn_mode == DNS_CONN_MODE::TCP_RETRY && h->tc == 1) {
     Dbg(dbg_ctl_dns, "Retrying DNS query over TCP for [%s]", e->qname);
     tcp_retry = true;
-    DNS_INCREMENT_DYN_STAT(dns_tcp_retries_stat);
+    Metrics::increment(dns_rsb.tcp_retries);
     goto Lerror;
   }
 
@@ -1883,13 +1882,13 @@ dns_process(DNSHandler *handler, HostEnt *buf, int len)
     }
   }
 Lerror:;
-  DNS_INCREMENT_DYN_STAT(dns_lookup_fail_stat);
+  Metrics::increment(dns_rsb.lookup_fail);
   buf->good = false;
   dns_result(handler, e, buf, retry, tcp_retry);
   return server_ok;
 }
 
-RecRawStatBlock *dns_rsb;
+DNSStatsBlock dns_rsb;
 
 void
 ink_dns_init(ts::ModuleVersion v)
@@ -1904,45 +1903,23 @@ ink_dns_init(ts::ModuleVersion v)
   }
 
   init_called = 1;
-  // do one time stuff
-  // create a stat block for HostDBStats
-  dns_rsb = RecAllocateRawStatBlock(static_cast<int>(DNS_Stat_Count));
 
   //
   // Register statistics callbacks
   //
-  RecRegisterRawStat(dns_rsb, RECT_PROCESS, "proxy.process.dns.total_dns_lookups", RECD_INT, RECP_PERSISTENT,
-                     (int)dns_total_lookups_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(dns_rsb, RECT_PROCESS, "proxy.process.dns.lookup_avg_time", RECD_INT, RECP_PERSISTENT,
-                     (int)dns_response_time_stat, RecRawStatSyncHrTimeAvg);
-
-  RecRegisterRawStat(dns_rsb, RECT_PROCESS, "proxy.process.dns.success_avg_time", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)dns_success_time_stat, RecRawStatSyncHrTimeAvg);
-
-  RecRegisterRawStat(dns_rsb, RECT_PROCESS, "proxy.process.dns.lookup_successes", RECD_INT, RECP_PERSISTENT,
-                     (int)dns_lookup_success_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(dns_rsb, RECT_PROCESS, "proxy.process.dns.fail_avg_time", RECD_INT, RECP_PERSISTENT, (int)dns_fail_time_stat,
-                     RecRawStatSyncHrTimeAvg);
-
-  RecRegisterRawStat(dns_rsb, RECT_PROCESS, "proxy.process.dns.lookup_failures", RECD_INT, RECP_PERSISTENT,
-                     (int)dns_lookup_fail_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(dns_rsb, RECT_PROCESS, "proxy.process.dns.retries", RECD_INT, RECP_PERSISTENT, (int)dns_retries_stat,
-                     RecRawStatSyncSum);
-
-  RecRegisterRawStat(dns_rsb, RECT_PROCESS, "proxy.process.dns.max_retries_exceeded", RECD_INT, RECP_PERSISTENT,
-                     (int)dns_max_retries_exceeded_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(dns_rsb, RECT_PROCESS, "proxy.process.dns.in_flight", RECD_INT, RECP_NON_PERSISTENT, (int)dns_in_flight_stat,
-                     RecRawStatSyncSum);
-
-  RecRegisterRawStat(dns_rsb, RECT_PROCESS, "proxy.process.dns.tcp_retries", RECD_INT, RECP_PERSISTENT, (int)dns_tcp_retries_stat,
-                     RecRawStatSyncSum);
-
-  RecRegisterRawStat(dns_rsb, RECT_PROCESS, "proxy.process.dns.tcp_reset", RECD_INT, RECP_PERSISTENT, (int)dns_tcp_reset_stat,
-                     RecRawStatSyncSum);
+  ts::Metrics &intm = ts::Metrics::getInstance();
+
+  dns_rsb.fail_time            = intm.newMetricPtr("proxy.process.dns.fail_time");
+  dns_rsb.in_flight            = intm.newMetricPtr("proxy.process.dns.in_flight");
+  dns_rsb.lookup_fail          = intm.newMetricPtr("proxy.process.dns.lookup_failures");
+  dns_rsb.lookup_success       = intm.newMetricPtr("proxy.process.dns.lookup_successes");
+  dns_rsb.max_retries_exceeded = intm.newMetricPtr("proxy.process.dns.max_retries_exceeded");
+  dns_rsb.response_time        = intm.newMetricPtr("proxy.process.dns.lookup_time");
+  dns_rsb.retries              = intm.newMetricPtr("proxy.process.dns.retries");
+  dns_rsb.success_time         = intm.newMetricPtr("proxy.process.dns.success_time");
+  dns_rsb.tcp_reset            = intm.newMetricPtr("proxy.process.dns.tcp_reset");
+  dns_rsb.tcp_retries          = intm.newMetricPtr("proxy.process.dns.tcp_retries");
+  dns_rsb.total_lookups        = intm.newMetricPtr("proxy.process.dns.total_dns_lookups");
 }
 
 #if TS_HAS_TESTS
diff --git a/iocore/dns/P_DNSProcessor.h b/iocore/dns/P_DNSProcessor.h
index 12976842f3..25e10cb05a 100644
--- a/iocore/dns/P_DNSProcessor.h
+++ b/iocore/dns/P_DNSProcessor.h
@@ -25,6 +25,9 @@
 
 #include "I_EventSystem.h"
 #include "tscore/PendingAction.h"
+#include "api/Metrics.h"
+
+using ts::Metrics;
 
 #define MAX_NAMED                       32
 #define DEFAULT_DNS_RETRIES             5
@@ -75,33 +78,24 @@ extern unsigned int dns_sequence_number;
 #endif
 
 // Stats
-enum DNS_Stats {
-  dns_total_lookups_stat,
-  dns_response_time_stat,
-  dns_success_time_stat,
-  dns_lookup_success_stat,
-  dns_lookup_fail_stat,
-  dns_fail_time_stat,
-  dns_retries_stat,
-  dns_max_retries_exceeded_stat,
-  dns_in_flight_stat,
-  dns_tcp_retries_stat,
-  dns_tcp_reset_stat,
-  DNS_Stat_Count
+struct DNSStatsBlock {
+  ts::Metrics::IntType *fail_time;
+  ts::Metrics::IntType *in_flight;
+  ts::Metrics::IntType *lookup_fail;
+  ts::Metrics::IntType *lookup_success;
+  ts::Metrics::IntType *max_retries_exceeded;
+  ts::Metrics::IntType *response_time;
+  ts::Metrics::IntType *retries;
+  ts::Metrics::IntType *success_time;
+  ts::Metrics::IntType *tcp_reset;
+  ts::Metrics::IntType *tcp_retries;
+  ts::Metrics::IntType *total_lookups;
 };
 
 struct HostEnt;
 struct DNSHandler;
 
-struct RecRawStatBlock;
-extern RecRawStatBlock *dns_rsb;
-
-// Stat Macros
-#define DNS_INCREMENT_DYN_STAT(_x) RecIncrRawStatSum(dns_rsb, mutex->thread_holding, (int)_x, 1)
-
-#define DNS_DECREMENT_DYN_STAT(_x) RecIncrRawStatSum(dns_rsb, mutex->thread_holding, (int)_x, -1)
-
-#define DNS_SUM_DYN_STAT(_x, _r) RecIncrRawStatSum(dns_rsb, mutex->thread_holding, (int)_x, _r)
+extern DNSStatsBlock dns_rsb;
 
 /**
   One DNSEntry is allocated per outstanding request. This continuation
diff --git a/iocore/hostdb/HostDB.cc b/iocore/hostdb/HostDB.cc
index 8dca07a3c6..d2a03d6eee 100644
--- a/iocore/hostdb/HostDB.cc
+++ b/iocore/hostdb/HostDB.cc
@@ -593,7 +593,7 @@ probe(HostDBHash const &hash, bool ignore_timeout)
       return NO_RECORD;
       // if we aren't ignoring timeouts, and we are past it-- then remove the record
     } else if (!ignore_timeout && record->is_ip_timeout() && !record->serve_stale_but_revalidate()) {
-      HOSTDB_INCREMENT_DYN_STAT_THREAD(hostdb_ttl_expires_stat, this_ethread());
+      Metrics::increment(hostdb_rsb.ttl_expires);
       return NO_RECORD;
     }
   }
@@ -601,7 +601,7 @@ probe(HostDBHash const &hash, bool ignore_timeout)
   // If the record is stale, but we want to revalidate-- lets start that up
   if ((!ignore_timeout && record->is_ip_configured_stale() && record->record_type != HostDBType::HOST) ||
       (record->is_ip_timeout() && record->serve_stale_but_revalidate())) {
-    HOSTDB_INCREMENT_DYN_STAT_THREAD(hostdb_total_serve_stale_stat, this_ethread());
+    Metrics::increment(hostdb_rsb.total_serve_stale);
     if (hostDB.is_pending_dns_for_hash(hash.hash)) {
       Dbg(dbg_ctl_hostdb, "%s",
           swoc::bwprint(ts::bw_dbg, "stale {} {} {}, using with pending refresh", record->ip_age(),
@@ -639,11 +639,11 @@ HostDBProcessor::getby(Continuation *cont, cb_process_result_pfn cb_process_resu
   } else if (opt.flags & HOSTDB_FORCE_DNS_RELOAD) {
     force_dns = hostdb_re_dns_on_reload;
     if (force_dns) {
-      HOSTDB_INCREMENT_DYN_STAT(hostdb_re_dns_on_reload_stat);
+      Metrics::increment(hostdb_rsb.re_dns_on_reload);
     }
   }
 
-  HOSTDB_INCREMENT_DYN_STAT(hostdb_total_lookups_stat);
+  Metrics::increment(hostdb_rsb.total_lookups);
 
   if (!hostdb_enable ||                                       // if the HostDB is disabled,
       (hash.host_name && !*hash.host_name) ||                 // or host_name is empty string
@@ -687,7 +687,7 @@ HostDBProcessor::getby(Continuation *cont, cb_process_result_pfn cb_process_resu
           } else {
             Dbg(dbg_ctl_hostdb, "immediate answer for %s", hash.ip.isValid() ? hash.ip.toString(ipb, sizeof ipb) : "<null>");
           }
-          HOSTDB_INCREMENT_DYN_STAT(hostdb_total_hits_stat);
+          Metrics::increment(hostdb_rsb.total_hits);
           if (cb_process_result) {
             (cont->*cb_process_result)(r.get());
           } else {
@@ -830,10 +830,9 @@ Action *
 HostDBProcessor::iterate(Continuation *cont)
 {
   ink_assert(cont->mutex->thread_holding == this_ethread());
-  EThread *thread   = cont->mutex->thread_holding;
-  ProxyMutex *mutex = thread->mutex.get();
+  EThread *thread = cont->mutex->thread_holding;
 
-  HOSTDB_INCREMENT_DYN_STAT(hostdb_total_lookups_stat);
+  Metrics::increment(hostdb_rsb.total_lookups);
 
   HostDBContinuation *c = hostDBContAllocator.alloc();
   HostDBContinuation::Options copt;
@@ -898,7 +897,7 @@ HostDBContinuation::lookup_done(TextView query_name, ts_seconds answer_ttl, SRVH
       }
       break;
     }
-    HOSTDB_SUM_DYN_STAT(hostdb_ttl_stat, answer_ttl.count());
+    Metrics::increment(hostdb_rsb.ttl, answer_ttl.count());
 
     // update the TTL
     record->ip_timestamp        = hostdb_current_timestamp;
@@ -1268,7 +1267,7 @@ HostDBContinuation::probeEvent(int /* event ATS_UNUSED */, Event *e)
     Ptr<HostDBRecord> r = probe(hash, false);
 
     if (r) {
-      HOSTDB_INCREMENT_DYN_STAT(hostdb_total_hits_stat);
+      Metrics::increment(hostdb_rsb.total_hits);
     }
 
     if (action.continuation && r) {
@@ -1296,7 +1295,7 @@ HostDBContinuation::set_check_pending_dns()
   Queue<HostDBContinuation> &q = hostDB.pending_dns_for_hash(hash.hash);
   this->setThreadAffinity(this_ethread());
   if (q.in(this)) {
-    HOSTDB_INCREMENT_DYN_STAT(hostdb_insert_duplicate_to_pending_dns_stat);
+    Metrics::increment(hostdb_rsb.insert_duplicate_to_pending_dns);
     Dbg(dbg_ctl_hostdb, "Skip the insertion of the same continuation to pending dns");
     return false;
   }
@@ -1857,7 +1856,7 @@ REGRESSION_TEST(HostDBTests)(RegressionTest *t, int atype, int *pstatus)
 }
 #endif
 
-RecRawStatBlock *hostdb_rsb;
+HostDBStatsBlock hostdb_rsb;
 
 void
 ink_hostdb_init(ts::ModuleVersion v)
@@ -1870,34 +1869,19 @@ ink_hostdb_init(ts::ModuleVersion v)
   }
 
   init_called = 1;
-  // do one time stuff
-  // create a stat block for HostDBStats
-  hostdb_rsb = RecAllocateRawStatBlock(static_cast<int>(HostDB_Stat_Count));
 
   //
   // Register stats
   //
-
-  RecRegisterRawStat(hostdb_rsb, RECT_PROCESS, "proxy.process.hostdb.total_lookups", RECD_INT, RECP_PERSISTENT,
-                     (int)hostdb_total_lookups_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(hostdb_rsb, RECT_PROCESS, "proxy.process.hostdb.total_hits", RECD_INT, RECP_PERSISTENT,
-                     (int)hostdb_total_hits_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(hostdb_rsb, RECT_PROCESS, "proxy.process.hostdb.total_serve_stale", RECD_INT, RECP_PERSISTENT,
-                     (int)hostdb_total_serve_stale_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(hostdb_rsb, RECT_PROCESS, "proxy.process.hostdb.ttl", RECD_FLOAT, RECP_PERSISTENT, (int)hostdb_ttl_stat,
-                     RecRawStatSyncAvg);
-
-  RecRegisterRawStat(hostdb_rsb, RECT_PROCESS, "proxy.process.hostdb.ttl_expires", RECD_INT, RECP_PERSISTENT,
-                     (int)hostdb_ttl_expires_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(hostdb_rsb, RECT_PROCESS, "proxy.process.hostdb.re_dns_on_reload", RECD_INT, RECP_PERSISTENT,
-                     (int)hostdb_re_dns_on_reload_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(hostdb_rsb, RECT_PROCESS, "proxy.process.hostdb.insert_duplicate_to_pending_dns", RECD_INT, RECP_PERSISTENT,
-                     (int)hostdb_insert_duplicate_to_pending_dns_stat, RecRawStatSyncSum);
+  ts::Metrics &intm = ts::Metrics::getInstance();
+
+  hostdb_rsb.total_lookups                   = intm.newMetricPtr("proxy.process.hostdb.total_lookups");
+  hostdb_rsb.total_hits                      = intm.newMetricPtr("proxy.process.hostdb.total_hits");
+  hostdb_rsb.total_serve_stale               = intm.newMetricPtr("proxy.process.hostdb.total_serve_stale");
+  hostdb_rsb.ttl                             = intm.newMetricPtr("proxy.process.hostdb.ttl");
+  hostdb_rsb.ttl_expires                     = intm.newMetricPtr("proxy.process.hostdb.ttl_expires");
+  hostdb_rsb.re_dns_on_reload                = intm.newMetricPtr("proxy.process.hostdb.re_dns_on_reload");
+  hostdb_rsb.insert_duplicate_to_pending_dns = intm.newMetricPtr("proxy.process.hostdb.insert_duplicate_to_pending_dns");
 
   ts_host_res_global_init();
 }
diff --git a/iocore/hostdb/P_HostDBProcessor.h b/iocore/hostdb/P_HostDBProcessor.h
index 29e31bc3f7..304a7b571b 100644
--- a/iocore/hostdb/P_HostDBProcessor.h
+++ b/iocore/hostdb/P_HostDBProcessor.h
@@ -35,6 +35,9 @@
 #include "I_HostDBProcessor.h"
 #include "P_RefCountCache.h"
 #include "tscore/PendingAction.h"
+#include "api/Metrics.h"
+
+using ts::Metrics;
 
 //
 // Data
@@ -116,43 +119,17 @@ const unsigned int HOST_DB_MAX_TTL = (0x1FFFFF); // 24 days
 struct HostEnt;
 
 // Stats
-enum HostDB_Stats {
-  hostdb_total_lookups_stat,
-  hostdb_total_hits_stat,        // D == total hits
-  hostdb_total_serve_stale_stat, // D == total times we served a stale response
-  hostdb_ttl_stat,               // D average TTL
-  hostdb_ttl_expires_stat,       // D == TTL Expires
-  hostdb_re_dns_on_reload_stat,
-  hostdb_insert_duplicate_to_pending_dns_stat,
-  HostDB_Stat_Count
+struct HostDBStatsBlock {
+  ts::Metrics::IntType *total_lookups;
+  ts::Metrics::IntType *total_hits;
+  ts::Metrics::IntType *total_serve_stale;
+  ts::Metrics::IntType *ttl;
+  ts::Metrics::IntType *ttl_expires;
+  ts::Metrics::IntType *re_dns_on_reload;
+  ts::Metrics::IntType *insert_duplicate_to_pending_dns;
 };
 
-struct RecRawStatBlock;
-extern RecRawStatBlock *hostdb_rsb;
-
-// Stat Macros
-
-#define HOSTDB_DEBUG_COUNT_DYN_STAT(_x, _y) RecIncrRawStatCount(hostdb_rsb, mutex->thread_holding, (int)_x, _y)
-
-#define HOSTDB_INCREMENT_DYN_STAT(_x) RecIncrRawStatSum(hostdb_rsb, mutex->thread_holding, (int)_x, 1)
-
-#define HOSTDB_INCREMENT_DYN_STAT_THREAD(_x, _t) RecIncrRawStatSum(hostdb_rsb, _t, (int)_x, 1)
-
-#define HOSTDB_DECREMENT_DYN_STAT(_x) RecIncrRawStatSum(hostdb_rsb, mutex->thread_holding, (int)_x, -1)
-
-#define HOSTDB_SUM_DYN_STAT(_x, _r) RecIncrRawStatSum(hostdb_rsb, mutex->thread_holding, (int)_x, _r)
-
-#define HOSTDB_READ_DYN_STAT(_x, _count, _sum)        \
-  do {                                                \
-    RecGetRawStatSum(hostdb_rsb, (int)_x, &_sum);     \
-    RecGetRawStatCount(hostdb_rsb, (int)_x, &_count); \
-  } while (0)
-
-#define HOSTDB_SET_DYN_COUNT(_x, _count) RecSetRawStatCount(hostdb_rsb, _x, _count);
-
-#define HOSTDB_INCREMENT_THREAD_DYN_STAT(_s, _t) RecIncrRawStatSum(hostdb_rsb, _t, (int)_s, 1);
-
-#define HOSTDB_DECREMENT_THREAD_DYN_STAT(_s, _t) RecIncrRawStatSum(hostdb_rsb, _t, (int)_s, -1);
+extern HostDBStatsBlock hostdb_rsb;
 
 struct HostFile;
 
diff --git a/iocore/hostdb/P_RefCountCache.h b/iocore/hostdb/P_RefCountCache.h
index 120bb2b88f..67bf89f8bb 100644
--- a/iocore/hostdb/P_RefCountCache.h
+++ b/iocore/hostdb/P_RefCountCache.h
@@ -34,9 +34,13 @@
 
 #include "tscore/I_Version.h"
 #include "tscpp/util/TsSharedMutex.h"
+
+#include "api/Metrics.h"
 #include <cstdint>
 #include <unistd.h>
 
+using ts::Metrics;
+
 #define REFCOUNT_CACHE_EVENT_SYNC REFCOUNT_CACHE_EVENT_EVENTS_START
 
 #define REFCOUNTCACHE_MAGIC_NUMBER 0x0BAD2D9
@@ -46,20 +50,16 @@ static constexpr unsigned char REFCOUNTCACHE_MINOR_VERSION = 0;
 static constexpr ts::VersionNumber REFCOUNTCACHE_VERSION(1, 0);
 
 // Stats
-enum RefCountCache_Stats {
-  refcountcache_current_items_stat,        // current number of items
-  refcountcache_current_size_stat,         // current size of cache
-  refcountcache_total_inserts_stat,        // total items inserted
-  refcountcache_total_failed_inserts_stat, // total items unable to insert
-  refcountcache_total_lookups_stat,        // total get() calls
-  refcountcache_total_hits_stat,           // total hits
-
-  // Persistence metrics
-  refcountcache_last_sync_time,   // seconds since epoch of last successful sync
-  refcountcache_last_total_items, // number of items sync last time
-  refcountcache_last_total_size,  // total size at last sync
-
-  RefCountCache_Stat_Count
+struct RefCountCacheBlock {
+  Metrics::IntType *refcountcache_current_items;
+  Metrics::IntType *refcountcache_current_size;
+  Metrics::IntType *refcountcache_total_inserts;
+  Metrics::IntType *refcountcache_total_failed_inserts;
+  Metrics::IntType *refcountcache_total_lookups;
+  Metrics::IntType *refcountcache_total_hits;
+  Metrics::IntType *refcountcache_last_sync_time;
+  Metrics::IntType *refcountcache_last_total_items;
+  Metrics::IntType *refcountcache_last_total_size;
 };
 
 struct RefCountCacheItemMeta {
@@ -163,7 +163,7 @@ template <class C> class RefCountCachePartition : private RefCountCacheBase
 public:
   using hash_type = swoc::IntrusiveHashMap<RefCountCacheLinkage>;
 
-  RefCountCachePartition(unsigned int part_num, uint64_t max_size, unsigned int max_items, RecRawStatBlock *rsb = nullptr);
+  RefCountCachePartition(unsigned int part_num, uint64_t max_size, unsigned int max_items, RefCountCacheBlock *rsb = nullptr);
   Ptr<C> get(uint64_t key);
   void put(uint64_t key, C *item, int size = 0, int expire_time = 0);
   void erase(uint64_t key, ink_time_t expiry_time = -1);
@@ -181,8 +181,6 @@ public:
   ts::shared_mutex lock;
 
 private:
-  void metric_inc(RefCountCache_Stats metric_enum, int64_t data);
-
   unsigned int part_num;
   uint64_t max_size;
   unsigned int max_items;
@@ -192,12 +190,12 @@ private:
   hash_type item_map;
 
   PriorityQueue<RefCountCacheHashEntry *> expiry_queue;
-  RecRawStatBlock *rsb;
+  RefCountCacheBlock *rsb;
 };
 
 template <class C>
 RefCountCachePartition<C>::RefCountCachePartition(unsigned int part_num, uint64_t max_size, unsigned int max_items,
-                                                  RecRawStatBlock *rsb)
+                                                  RefCountCacheBlock *rsb)
   : part_num(part_num), max_size(max_size), max_items(max_items), size(0), items(0), rsb(rsb)
 {
 }
@@ -206,10 +204,10 @@ template <class C>
 Ptr<C>
 RefCountCachePartition<C>::get(uint64_t key)
 {
-  this->metric_inc(refcountcache_total_lookups_stat, 1);
+  Metrics::increment(this->rsb->refcountcache_total_lookups);
   if (auto it = this->item_map.find(key); it != this->item_map.end()) {
     // found
-    this->metric_inc(refcountcache_total_hits_stat, 1);
+    Metrics::increment(this->rsb->refcountcache_total_hits);
     return make_ptr(static_cast<C *>(it->item.get()));
   } else {
     return Ptr<C>();
@@ -220,7 +218,7 @@ template <class C>
 void
 RefCountCachePartition<C>::put(uint64_t key, C *item, int size, int expire_time)
 {
-  this->metric_inc(refcountcache_total_inserts_stat, 1);
+  Metrics::increment(this->rsb->refcountcache_total_inserts);
   size += sizeof(C);
   // Remove any colliding entries
   this->erase(key);
@@ -228,7 +226,7 @@ RefCountCachePartition<C>::put(uint64_t key, C *item, int size, int expire_time)
   // if we are full, and can't make space-- then don't store the item
   if (this->is_full() && !this->make_space_for(size)) {
     Dbg(dbg_ctl, "partition %d is full-- not storing item key=%" PRIu64, this->part_num, key);
-    this->metric_inc(refcountcache_total_failed_inserts_stat, 1);
+    Metrics::increment(this->rsb->refcountcache_total_failed_inserts);
     return;
   }
 
@@ -249,8 +247,8 @@ RefCountCachePartition<C>::put(uint64_t key, C *item, int size, int expire_time)
   this->item_map.insert(val);
   this->size += val->meta.size;
   this->items++;
-  this->metric_inc(refcountcache_current_size_stat, (int64_t)val->meta.size);
-  this->metric_inc(refcountcache_current_items_stat, 1);
+  Metrics::increment(this->rsb->refcountcache_current_size, (int64_t)val->meta.size);
+  Metrics::increment(this->rsb->refcountcache_current_items);
 }
 
 template <class C>
@@ -275,8 +273,8 @@ RefCountCachePartition<C>::dealloc_entry(hash_type::iterator ptr)
   this->size -= ptr->meta.size;
   this->items--;
 
-  this->metric_inc(refcountcache_current_size_stat, -((int64_t)ptr->meta.size));
-  this->metric_inc(refcountcache_current_items_stat, -1);
+  Metrics::decrement(this->rsb->refcountcache_current_size, ptr->meta.size);
+  Metrics::decrement(this->rsb->refcountcache_current_items);
 
   // remove from expiry queue
   if (ptr->expiry_entry != nullptr) {
@@ -357,15 +355,6 @@ RefCountCachePartition<C>::copy(std::vector<RefCountCacheHashEntry *> &items)
   }
 }
 
-template <class C>
-void
-RefCountCachePartition<C>::metric_inc(RefCountCache_Stats metric_enum, int64_t data)
-{
-  if (this->rsb) {
-    RecIncrGlobalRawStatCount(this->rsb, metric_enum, data);
-  }
-}
-
 template <class C>
 swoc::IntrusiveHashMap<RefCountCacheLinkage> &
 RefCountCachePartition<C>::get_map()
@@ -405,7 +394,7 @@ template <class C> class RefCountCache
 public:
   // Constructor
   RefCountCache(unsigned int num_partitions, int size = -1, int items = -1, ts::VersionNumber object_version = ts::VersionNumber(),
-                const std::string &metrics_prefix = "");
+                const std::string metrics_prefix = ".refcountcache");
   // Destructor
   ~RefCountCache();
 
@@ -422,7 +411,7 @@ public:
   RefCountCachePartition<C> &get_partition(int pnum);
   size_t count() const;
   RefCountCacheHeader &get_header();
-  RecRawStatBlock *get_rsb();
+  RefCountCacheBlock *get_rsb();
 
 private:
   int max_size;  // Total size
@@ -431,52 +420,34 @@ private:
   std::vector<RefCountCachePartition<C> *> partitions;
   // Header
   RefCountCacheHeader header; // Our header
-  RecRawStatBlock *rsb;
+  RefCountCacheBlock rsb;
 };
 
 template <class C>
 RefCountCache<C>::RefCountCache(unsigned int num_partitions, int size, int items, ts::VersionNumber object_version,
-                                const std::string &metrics_prefix)
-  : header(RefCountCacheHeader(object_version)), rsb(nullptr)
+                                const std::string metrics_prefix)
+  : header(RefCountCacheHeader(object_version))
 {
+  ts::Metrics &intm = ts::Metrics::getInstance();
+
   this->max_size       = size;
   this->max_items      = items;
   this->num_partitions = num_partitions;
 
-  if (metrics_prefix.length() > 0) {
-    this->rsb = RecAllocateRawStatBlock((int)RefCountCache_Stat_Count);
+  this->rsb.refcountcache_current_items        = intm.newMetricPtr((metrics_prefix + "current_items").c_str());
+  this->rsb.refcountcache_current_size         = intm.newMetricPtr((metrics_prefix + "current_size").c_str());
+  this->rsb.refcountcache_total_inserts        = intm.newMetricPtr((metrics_prefix + "total_inserts").c_str());
+  this->rsb.refcountcache_total_failed_inserts = intm.newMetricPtr((metrics_prefix + "total_failed_inserts").c_str());
+  this->rsb.refcountcache_total_lookups        = intm.newMetricPtr((metrics_prefix + "total_lookups").c_str());
+  this->rsb.refcountcache_total_hits           = intm.newMetricPtr((metrics_prefix + "total_hits").c_str());
+  this->rsb.refcountcache_last_sync_time       = intm.newMetricPtr((metrics_prefix + "last_sync.time").c_str());
+  this->rsb.refcountcache_last_total_items     = intm.newMetricPtr((metrics_prefix + "last_sync.total_items").c_str());
+  this->rsb.refcountcache_last_total_size      = intm.newMetricPtr((metrics_prefix + "last_sync.total_size").c_str());
 
-    RecRegisterRawStat(this->rsb, RECT_PROCESS, (metrics_prefix + "current_items").c_str(), RECD_INT, RECP_NON_PERSISTENT,
-                       (int)refcountcache_current_items_stat, RecRawStatSyncCount);
-
-    RecRegisterRawStat(this->rsb, RECT_PROCESS, (metrics_prefix + "current_size").c_str(), RECD_INT, RECP_NON_PERSISTENT,
-                       (int)refcountcache_current_size_stat, RecRawStatSyncCount);
-
-    RecRegisterRawStat(this->rsb, RECT_PROCESS, (metrics_prefix + "total_inserts").c_str(), RECD_INT, RECP_NON_PERSISTENT,
-                       (int)refcountcache_total_inserts_stat, RecRawStatSyncCount);
-
-    RecRegisterRawStat(this->rsb, RECT_PROCESS, (metrics_prefix + "total_failed_inserts").c_str(), RECD_INT, RECP_NON_PERSISTENT,
-                       (int)refcountcache_total_failed_inserts_stat, RecRawStatSyncCount);
-
-    RecRegisterRawStat(this->rsb, RECT_PROCESS, (metrics_prefix + "total_lookups").c_str(), RECD_INT, RECP_NON_PERSISTENT,
-                       (int)refcountcache_total_lookups_stat, RecRawStatSyncCount);
-
-    RecRegisterRawStat(this->rsb, RECT_PROCESS, (metrics_prefix + "total_hits").c_str(), RECD_INT, RECP_NON_PERSISTENT,
-                       (int)refcountcache_total_hits_stat, RecRawStatSyncCount);
-
-    RecRegisterRawStat(this->rsb, RECT_PROCESS, (metrics_prefix + "last_sync.time").c_str(), RECD_INT, RECP_NON_PERSISTENT,
-                       (int)refcountcache_last_sync_time, RecRawStatSyncCount);
-
-    RecRegisterRawStat(this->rsb, RECT_PROCESS, (metrics_prefix + "last_sync.total_items").c_str(), RECD_INT, RECP_NON_PERSISTENT,
-                       (int)refcountcache_last_total_items, RecRawStatSyncCount);
-
-    RecRegisterRawStat(this->rsb, RECT_PROCESS, (metrics_prefix + "last_sync.total_size").c_str(), RECD_INT, RECP_NON_PERSISTENT,
-                       (int)refcountcache_last_total_size, RecRawStatSyncCount);
-  }
   // Now lets create all the partitions
   this->partitions.reserve(num_partitions);
   for (unsigned int i = 0; i < num_partitions; i++) {
-    this->partitions.push_back(new RefCountCachePartition<C>(i, size / num_partitions, items / num_partitions, this->rsb));
+    this->partitions.push_back(new RefCountCachePartition<C>(i, size / num_partitions, items / num_partitions, &this->rsb));
   }
 }
 
@@ -551,10 +522,10 @@ RefCountCache<C>::partition_count() const
 }
 
 template <class C>
-RecRawStatBlock *
+RefCountCacheBlock *
 RefCountCache<C>::get_rsb()
 {
-  return this->rsb;
+  return &this->rsb;
 }
 
 template <class C>
diff --git a/iocore/io_uring/I_IO_URING.h b/iocore/io_uring/I_IO_URING.h
index b83df7974c..3192600f4c 100644
--- a/iocore/io_uring/I_IO_URING.h
+++ b/iocore/io_uring/I_IO_URING.h
@@ -90,6 +90,3 @@ private:
   void handle_cqe(io_uring_cqe *);
   static IOUringConfig config;
 };
-
-extern std::atomic<uint64_t> io_uring_submissions;
-extern std::atomic<uint64_t> io_uring_completions;
diff --git a/iocore/io_uring/io_uring.cc b/iocore/io_uring/io_uring.cc
index 81523f4dc3..0598a095ba 100644
--- a/iocore/io_uring/io_uring.cc
+++ b/iocore/io_uring/io_uring.cc
@@ -33,8 +33,6 @@ Linux io_uring helper library
 #include "tscore/Diags.h"
 
 std::atomic<int> main_wq_fd;
-std::atomic<uint64_t> io_uring_submissions = 0;
-std::atomic<uint64_t> io_uring_completions = 0;
 
 IOUringConfig IOUringContext::config;
 
@@ -130,7 +128,7 @@ IOUringContext::get_wq_max_workers()
 void
 IOUringContext::submit()
 {
-  io_uring_submissions.fetch_add(io_uring_submit(&ring));
+  Metrics::increment(aio_rsb.io_uring_submitted, io_uring_submit(&ring));
 }
 
 void
@@ -148,7 +146,7 @@ IOUringContext::service()
   io_uring_peek_cqe(&ring, &cqe);
   while (cqe) {
     handle_cqe(cqe);
-    io_uring_completions++;
+    Metrics::increment(aio_rsb.io_uring_completed);
     io_uring_cqe_seen(&ring, cqe);
 
     cqe = nullptr;
@@ -169,10 +167,11 @@ IOUringContext::submit_and_wait(ink_hrtime t)
   io_uring_cqe *cqe         = nullptr;
 
   int count = io_uring_submit_and_wait_timeout(&ring, &cqe, 1, &timeout, nullptr);
-  io_uring_submissions.fetch_add(count);
+
+  Metrics::increment(aio_rsb.io_uring_submitted, count);
   while (cqe) {
     handle_cqe(cqe);
-    io_uring_completions++;
+    Metrics::increment(aio_rsb.io_uring_completed);
     io_uring_cqe_seen(&ring, cqe);
 
     cqe = nullptr;
diff --git a/iocore/io_uring/unit_tests/test_diskIO.cc b/iocore/io_uring/unit_tests/test_diskIO.cc
index 36f39282f5..99967a2149 100644
--- a/iocore/io_uring/unit_tests/test_diskIO.cc
+++ b/iocore/io_uring/unit_tests/test_diskIO.cc
@@ -262,9 +262,10 @@ TEST_CASE("net_io", "[io_uring]")
     connected = true;
   });
 
-  uint64_t completions_before = io_uring_completions;
+  uint64_t completions_before = Metrics::read(aio_rsb.io_uring_completed);
   uint64_t needed             = 2;
-  while ((io_uring_completions - completions_before) < needed) {
+
+  while ((Metrics::read(aio_rsb.io_uring_completed) - completions_before) < needed) {
     ctx.submit_and_wait(1 * HRTIME_SECOND);
   }
 
diff --git a/iocore/net/BIO_fastopen.cc b/iocore/net/BIO_fastopen.cc
index 48e5abbe3f..d6774639f4 100644
--- a/iocore/net/BIO_fastopen.cc
+++ b/iocore/net/BIO_fastopen.cc
@@ -119,13 +119,11 @@ fastopen_bwrite(BIO *bio, const char *in, int insz)
     // RFC 7413. If we get EINPROGRESS it means that the SYN has been
     // sent without data and we should retry.
     const sockaddr *dst = reinterpret_cast<const sockaddr *>(BIO_get_data(bio));
-    ProxyMutex *mutex   = this_ethread()->mutex.get();
-
-    NET_INCREMENT_DYN_STAT(net_fastopen_attempts_stat);
 
+    Metrics::increment(net_rsb.fastopen_attempts);
     err = SocketManager::sendto(fd, (void *)in, insz, MSG_FASTOPEN, dst, ats_ip_size(dst));
     if (err >= 0) {
-      NET_INCREMENT_DYN_STAT(net_fastopen_successes_stat);
+      Metrics::increment(net_rsb.fastopen_successes);
     }
 
     BIO_set_data(bio, nullptr);
diff --git a/iocore/net/Net.cc b/iocore/net/Net.cc
index e8f9316cc4..0550566e5c 100644
--- a/iocore/net/Net.cc
+++ b/iocore/net/Net.cc
@@ -31,7 +31,7 @@
 #include "P_Net.h"
 #include <utility>
 
-RecRawStatBlock *net_rsb = nullptr;
+NetStatsBlock net_rsb;
 
 // All in milli-seconds
 int net_event_period   = 10;
@@ -79,66 +79,35 @@ configure_net()
 static inline void
 register_net_stats()
 {
-  const std::pair<const char *, Net_Stats> persistent[] = {
-    {"proxy.process.net.calls_to_read",                       net_calls_to_read_stat                  },
-    {"proxy.process.net.calls_to_read_nodata",                net_calls_to_read_nodata_stat           },
-    {"proxy.process.net.calls_to_readfromnet",                net_calls_to_readfromnet_stat           },
-    {"proxy.process.net.calls_to_write",                      net_calls_to_write_stat                 },
-    {"proxy.process.net.calls_to_write_nodata",               net_calls_to_write_nodata_stat          },
-    {"proxy.process.net.calls_to_writetonet",                 net_calls_to_writetonet_stat            },
-    {"proxy.process.net.inactivity_cop_lock_acquire_failure", inactivity_cop_lock_acquire_failure_stat},
-    {"proxy.process.net.net_handler_run",                     net_handler_run_stat                    },
-    {"proxy.process.net.read_bytes",                          net_read_bytes_stat                     },
-    {"proxy.process.net.write_bytes",                         net_write_bytes_stat                    },
-    {"proxy.process.net.fastopen_out.attempts",               net_fastopen_attempts_stat              },
-    {"proxy.process.net.fastopen_out.successes",              net_fastopen_successes_stat             },
-    {"proxy.process.socks.connections_successful",            socks_connections_successful_stat       },
-    {"proxy.process.socks.connections_unsuccessful",          socks_connections_unsuccessful_stat     },
-  };
-
-  const std::pair<const char *, Net_Stats> non_persistent[] = {
-    {"proxy.process.net.accepts_currently_open",              net_accepts_currently_open_stat        },
-    {"proxy.process.net.connections_currently_open",          net_connections_currently_open_stat    },
-    {"proxy.process.net.default_inactivity_timeout_applied",  default_inactivity_timeout_applied_stat},
-    {"proxy.process.net.default_inactivity_timeout_count",    default_inactivity_timeout_count_stat  },
-    {"proxy.process.net.dynamic_keep_alive_timeout_in_count", keep_alive_queue_timeout_count_stat    },
-    {"proxy.process.net.dynamic_keep_alive_timeout_in_total", keep_alive_queue_timeout_total_stat    },
-    {"proxy.process.socks.connections_currently_open",        socks_connections_currently_open_stat  },
-  };
-
-  for (auto &p : persistent) {
-    RecRegisterRawStat(net_rsb, RECT_PROCESS, p.first, RECD_INT, RECP_PERSISTENT, p.second, RecRawStatSyncSum);
-  }
-
-  for (auto &p : non_persistent) {
-    RecRegisterRawStat(net_rsb, RECT_PROCESS, p.first, RECD_INT, RECP_NON_PERSISTENT, p.second, RecRawStatSyncSum);
-  }
-
-  NET_CLEAR_DYN_STAT(net_handler_run_stat);
-  NET_CLEAR_DYN_STAT(net_connections_currently_open_stat);
-  NET_CLEAR_DYN_STAT(net_accepts_currently_open_stat);
-  NET_CLEAR_DYN_STAT(net_calls_to_readfromnet_stat);
-  NET_CLEAR_DYN_STAT(net_calls_to_read_stat);
-  NET_CLEAR_DYN_STAT(net_calls_to_read_nodata_stat);
-  NET_CLEAR_DYN_STAT(net_calls_to_writetonet_stat);
-  NET_CLEAR_DYN_STAT(net_calls_to_write_stat);
-  NET_CLEAR_DYN_STAT(net_calls_to_write_nodata_stat);
-  NET_CLEAR_DYN_STAT(socks_connections_currently_open_stat);
-  NET_CLEAR_DYN_STAT(keep_alive_queue_timeout_total_stat);
-  NET_CLEAR_DYN_STAT(keep_alive_queue_timeout_count_stat);
-  NET_CLEAR_DYN_STAT(default_inactivity_timeout_count_stat);
-  NET_CLEAR_DYN_STAT(default_inactivity_timeout_applied_stat);
-
-  RecRegisterRawStat(net_rsb, RECT_PROCESS, "proxy.process.tcp.total_accepts", RECD_INT, RECP_NON_PERSISTENT,
-                     static_cast<int>(net_tcp_accept_stat), RecRawStatSyncSum);
-  NET_CLEAR_DYN_STAT(net_tcp_accept_stat);
-
-  RecRegisterRawStat(net_rsb, RECT_PROCESS, "proxy.process.net.connections_throttled_in", RECD_INT, RECP_PERSISTENT,
-                     (int)net_connections_throttled_in_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(net_rsb, RECT_PROCESS, "proxy.process.net.connections_throttled_out", RECD_INT, RECP_PERSISTENT,
-                     (int)net_connections_throttled_out_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(net_rsb, RECT_PROCESS, "proxy.process.net.max.requests_throttled_in", RECD_INT, RECP_PERSISTENT,
-                     (int)net_requests_max_throttled_in_stat, RecRawStatSyncSum);
+  ts::Metrics &intm = ts::Metrics::getInstance();
+
+  net_rsb.accepts_currently_open              = intm.newMetricPtr("proxy.process.net.accepts_currently_open");
+  net_rsb.calls_to_read                       = intm.newMetricPtr("proxy.process.net.calls_to_read");
+  net_rsb.calls_to_read_nodata                = intm.newMetricPtr("proxy.process.net.calls_to_read_nodata");
+  net_rsb.calls_to_readfromnet                = intm.newMetricPtr("proxy.process.net.calls_to_readfromnet");
+  net_rsb.calls_to_write                      = intm.newMetricPtr("proxy.process.net.calls_to_write");
+  net_rsb.calls_to_write_nodata               = intm.newMetricPtr("proxy.process.net.calls_to_write_nodata");
+  net_rsb.calls_to_writetonet                 = intm.newMetricPtr("proxy.process.net.calls_to_writetonet");
+  net_rsb.connections_currently_open          = intm.newMetricPtr("proxy.process.net.connections_currently_open");
+  net_rsb.connections_throttled_in            = intm.newMetricPtr("proxy.process.net.connections_throttled_in");
+  net_rsb.connections_throttled_out           = intm.newMetricPtr("proxy.process.net.connections_throttled_out");
+  net_rsb.default_inactivity_timeout_applied  = intm.newMetricPtr("proxy.process.net.default_inactivity_timeout_applied");
+  net_rsb.default_inactivity_timeout_count    = intm.newMetricPtr("proxy.process.net.default_inactivity_timeout_count");
+  net_rsb.fastopen_attempts                   = intm.newMetricPtr("proxy.process.net.fastopen_out.attempts");
+  net_rsb.fastopen_successes                  = intm.newMetricPtr("proxy.process.net.fastopen_out.successes");
+  net_rsb.handler_run                         = intm.newMetricPtr("proxy.process.net.net_handler_run");
+  net_rsb.inactivity_cop_lock_acquire_failure = intm.newMetricPtr("proxy.process.net.inactivity_cop_lock_acquire_failure");
+  net_rsb.keep_alive_queue_timeout_count      = intm.newMetricPtr("proxy.process.net.dynamic_keep_alive_timeout_in_count");
+  net_rsb.keep_alive_queue_timeout_total      = intm.newMetricPtr("proxy.process.net.dynamic_keep_alive_timeout_in_total");
+  net_rsb.read_bytes                          = intm.newMetricPtr("proxy.process.net.read_bytes");
+  net_rsb.read_bytes_count                    = intm.newMetricPtr("proxy.process.net.read_bytes_count");
+  net_rsb.requests_max_throttled_in           = intm.newMetricPtr("proxy.process.net.max.requests_throttled_in");
+  net_rsb.socks_connections_currently_open    = intm.newMetricPtr("proxy.process.socks.connections_currently_open");
+  net_rsb.socks_connections_successful        = intm.newMetricPtr("proxy.process.socks.connections_successful");
+  net_rsb.socks_connections_unsuccessful      = intm.newMetricPtr("proxy.process.socks.connections_unsuccessful");
+  net_rsb.tcp_accept                          = intm.newMetricPtr("proxy.process.tcp.total_accepts");
+  net_rsb.write_bytes                         = intm.newMetricPtr("proxy.process.net.write_bytes");
+  net_rsb.write_bytes_count                   = intm.newMetricPtr("proxy.process.net.write_bytes_count");
 }
 
 void
@@ -149,9 +118,6 @@ ink_net_init(ts::ModuleVersion version)
   ink_release_assert(version.check(NET_SYSTEM_MODULE_INTERNAL_VERSION));
 
   if (!init_called) {
-    // do one time stuff
-    // create a stat block for NetStats
-    net_rsb = RecAllocateRawStatBlock(static_cast<int>(Net_Stat_Count));
     configure_net();
     register_net_stats();
   }
diff --git a/iocore/net/NetHandler.cc b/iocore/net/NetHandler.cc
index b46b67008c..3cafbcc0aa 100644
--- a/iocore/net/NetHandler.cc
+++ b/iocore/net/NetHandler.cc
@@ -313,7 +313,7 @@ NetHandler::waitForActivity(ink_hrtime timeout)
   IOUringContext *ur = IOUringContext::local_context();
 #endif
 
-  NET_INCREMENT_DYN_STAT(net_handler_run_stat);
+  Metrics::increment(net_rsb.handler_run);
   SCOPED_MUTEX_LOCK(lock, mutex, this->thread);
 
   process_enabled_list();
@@ -468,8 +468,8 @@ NetHandler::_close_ne(NetEvent *ne, ink_hrtime now, int &handle_event, int &clos
   if (diff > 0) {
     total_idle_time += diff;
     ++total_idle_count;
-    NET_SUM_DYN_STAT(keep_alive_queue_timeout_total_stat, diff);
-    NET_INCREMENT_DYN_STAT(keep_alive_queue_timeout_count_stat);
+    Metrics::increment(net_rsb.keep_alive_queue_timeout_total, diff);
+    Metrics::increment(net_rsb.keep_alive_queue_timeout_count);
   }
   Debug("net_queue", "closing connection NetEvent=%p idle: %u now: %" PRId64 " at: %" PRId64 " in: %" PRId64 " diff: %" PRId64, ne,
         keep_alive_queue_size, ink_hrtime_to_sec(now), ink_hrtime_to_sec(ne->next_inactivity_timeout_at),
@@ -547,7 +547,7 @@ NetHandler::add_to_active_queue(NetEvent *ne)
   } else {
     if (active_queue_full) {
       // there is no room left in the queue
-      NET_SUM_DYN_STAT(net_requests_max_throttled_in_stat, 1);
+      Metrics::increment(net_rsb.requests_max_throttled_in);
       return false;
     }
     // in the keep-alive queue or no queue, new to this queue
diff --git a/iocore/net/OCSPStapling.cc b/iocore/net/OCSPStapling.cc
index d117d42b16..f427cf8549 100644
--- a/iocore/net/OCSPStapling.cc
+++ b/iocore/net/OCSPStapling.cc
@@ -985,10 +985,10 @@ stapling_check_response(certinfo *cinf, TS_OCSP_RESPONSE *rsp)
   case TS_OCSP_CERTSTATUS_GOOD:
     break;
   case TS_OCSP_CERTSTATUS_REVOKED:
-    SSL_INCREMENT_DYN_STAT(ssl_ocsp_revoked_cert_stat);
+    Metrics::increment(ssl_rsb.ocsp_revoked_cert);
     break;
   case TS_OCSP_CERTSTATUS_UNKNOWN:
-    SSL_INCREMENT_DYN_STAT(ssl_ocsp_unknown_cert_stat);
+    Metrics::increment(ssl_rsb.ocsp_unknown_cert);
     break;
   default:
     break;
@@ -1281,10 +1281,10 @@ ocsp_update()
               ink_mutex_release(&cinf->stapling_mutex);
               if (stapling_refresh_response(cinf, &resp)) {
                 Debug("ssl_ocsp", "Successfully refreshed OCSP for %s certificate. url=%s", cinf->certname, cinf->uri);
-                SSL_INCREMENT_DYN_STAT(ssl_ocsp_refreshed_cert_stat);
+                Metrics::increment(ssl_rsb.ocsp_refreshed_cert);
               } else {
                 Error("Failed to refresh OCSP for %s certificate. url=%s", cinf->certname, cinf->uri);
-                SSL_INCREMENT_DYN_STAT(ssl_ocsp_refresh_cert_failure_stat);
+                Metrics::increment(ssl_rsb.ocsp_refresh_cert_failure);
               }
             } else {
               ink_mutex_release(&cinf->stapling_mutex);
diff --git a/iocore/net/P_Net.h b/iocore/net/P_Net.h
index 7516b106cd..0d0fa0107e 100644
--- a/iocore/net/P_Net.h
+++ b/iocore/net/P_Net.h
@@ -29,68 +29,50 @@
 **************************************************************************/
 #pragma once
 
+#include "api/Metrics.h"
+
+using ts::Metrics;
+
 // Net Stats
 
-enum Net_Stats {
-  net_handler_run_stat,
-  net_read_bytes_stat,
-  net_write_bytes_stat,
-  net_connections_currently_open_stat,
-  net_accepts_currently_open_stat,
-  net_calls_to_readfromnet_stat,
-  net_calls_to_read_stat,
-  net_calls_to_read_nodata_stat,
-  net_calls_to_writetonet_stat,
-  net_calls_to_write_stat,
-  net_calls_to_write_nodata_stat,
-  socks_connections_successful_stat,
-  socks_connections_unsuccessful_stat,
-  socks_connections_currently_open_stat,
-  inactivity_cop_lock_acquire_failure_stat,
-  keep_alive_queue_timeout_total_stat,
-  keep_alive_queue_timeout_count_stat,
-  default_inactivity_timeout_applied_stat,
-  default_inactivity_timeout_count_stat,
-  net_fastopen_attempts_stat,
-  net_fastopen_successes_stat,
-  net_tcp_accept_stat,
-  net_connections_throttled_in_stat,
-  net_connections_throttled_out_stat,
-  net_requests_max_throttled_in_stat,
-  Net_Stat_Count
+struct NetStatsBlock {
+  Metrics::IntType *accepts_currently_open;
+  Metrics::IntType *calls_to_read_nodata;
+  Metrics::IntType *calls_to_read;
+  Metrics::IntType *calls_to_readfromnet;
+  Metrics::IntType *calls_to_write_nodata;
+  Metrics::IntType *calls_to_write;
+  Metrics::IntType *calls_to_writetonet;
+  Metrics::IntType *connections_currently_open;
+  Metrics::IntType *connections_throttled_in;
+  Metrics::IntType *connections_throttled_out;
+  Metrics::IntType *default_inactivity_timeout_applied;
+  Metrics::IntType *default_inactivity_timeout_count;
+  Metrics::IntType *fastopen_attempts;
+  Metrics::IntType *fastopen_successes;
+  Metrics::IntType *handler_run;
+  Metrics::IntType *handler_run_count;
+  Metrics::IntType *inactivity_cop_lock_acquire_failure;
+  Metrics::IntType *keep_alive_queue_timeout_count;
+  Metrics::IntType *keep_alive_queue_timeout_total;
+  Metrics::IntType *read_bytes;
+  Metrics::IntType *read_bytes_count;
+  Metrics::IntType *requests_max_throttled_in;
+  Metrics::IntType *socks_connections_currently_open;
+  Metrics::IntType *socks_connections_successful;
+  Metrics::IntType *socks_connections_unsuccessful;
+  Metrics::IntType *tcp_accept;
+  Metrics::IntType *write_bytes;
+  Metrics::IntType *write_bytes_count;
 };
 
-struct RecRawStatBlock;
-extern RecRawStatBlock *net_rsb;
+extern NetStatsBlock net_rsb;
+
 #define SSL_HANDSHAKE_WANT_READ    6
 #define SSL_HANDSHAKE_WANT_WRITE   7
 #define SSL_HANDSHAKE_WANT_ACCEPT  8
 #define SSL_HANDSHAKE_WANT_CONNECT 9
 
-#define NET_INCREMENT_DYN_STAT(_x) RecIncrRawStatSum(net_rsb, mutex->thread_holding, (int)_x, 1)
-
-#define NET_DECREMENT_DYN_STAT(_x) RecIncrRawStatSum(net_rsb, mutex->thread_holding, (int)_x, -1)
-
-#define NET_SUM_DYN_STAT(_x, _r) RecIncrRawStatSum(net_rsb, mutex->thread_holding, (int)_x, _r)
-
-#define NET_READ_DYN_SUM(_x, _sum) RecGetRawStatSum(net_rsb, (int)_x, &_sum)
-
-#define NET_READ_DYN_STAT(_x, _count, _sum)        \
-  do {                                             \
-    RecGetRawStatSum(net_rsb, (int)_x, &_sum);     \
-    RecGetRawStatCount(net_rsb, (int)_x, &_count); \
-  } while (0)
-
-#define NET_CLEAR_DYN_STAT(x)          \
-  do {                                 \
-    RecSetRawStatSum(net_rsb, x, 0);   \
-    RecSetRawStatCount(net_rsb, x, 0); \
-  } while (0);
-
-// For global access
-#define NET_SUM_GLOBAL_DYN_STAT(_x, _r)   RecIncrGlobalRawStatSum(net_rsb, (_x), (_r))
-#define NET_READ_GLOBAL_DYN_SUM(_x, _sum) RecGetGlobalRawStatSum(net_rsb, _x, &_sum)
-
 #include "tscore/ink_platform.h"
 #include "P_EventSystem.h"
 #include "I_Net.h"
diff --git a/iocore/net/P_SSLConfig.h b/iocore/net/P_SSLConfig.h
index 924072341c..5a85fae99f 100644
--- a/iocore/net/P_SSLConfig.h
+++ b/iocore/net/P_SSLConfig.h
@@ -37,7 +37,6 @@
 #include "swoc/swoc_ip.h"
 
 #include "tscore/ink_inet.h"
-
 #include "ConfigProcessor.h"
 
 #include "SSLSessionCache.h"
diff --git a/iocore/net/P_UnixNet.h b/iocore/net/P_UnixNet.h
index 6dce358cc2..af37bc1ff3 100644
--- a/iocore/net/P_UnixNet.h
+++ b/iocore/net/P_UnixNet.h
@@ -92,11 +92,9 @@ enum ThrottleType {
 TS_INLINE int
 net_connections_to_throttle(ThrottleType t)
 {
-  double headroom = t == ACCEPT ? NET_THROTTLE_ACCEPT_HEADROOM : NET_THROTTLE_CONNECT_HEADROOM;
-  int64_t sval    = 0;
+  double headroom    = t == ACCEPT ? NET_THROTTLE_ACCEPT_HEADROOM : NET_THROTTLE_CONNECT_HEADROOM;
+  int currently_open = static_cast<int>(Metrics::read(net_rsb.connections_currently_open));
 
-  NET_READ_GLOBAL_DYN_SUM(net_connections_currently_open_stat, sval);
-  int currently_open = static_cast<int>(sval);
   // deal with race if we got to multiple net threads
   if (currently_open < 0) {
     currently_open = 0;
diff --git a/iocore/net/QUICNetProcessor.cc b/iocore/net/QUICNetProcessor.cc
index 5235b248bd..85a011ab8a 100644
--- a/iocore/net/QUICNetProcessor.cc
+++ b/iocore/net/QUICNetProcessor.cc
@@ -204,7 +204,7 @@ QUICNetProcessor::main_accept(Continuation *cont, SOCKET fd, AcceptOptions const
   if (accept_threads < 0) {
     REC_ReadConfigInteger(accept_threads, "proxy.config.accept_threads");
   }
-  NET_INCREMENT_DYN_STAT(net_accepts_currently_open_stat);
+  Metrics::increment(net_rsb.accepts_currently_open);
 
   if (opt.localhost_only) {
     accept_ip.setToLoopback(opt.ip_family);
diff --git a/iocore/net/QUICNetProcessor_quiche.cc b/iocore/net/QUICNetProcessor_quiche.cc
index f32ea7a84d..6605728933 100644
--- a/iocore/net/QUICNetProcessor_quiche.cc
+++ b/iocore/net/QUICNetProcessor_quiche.cc
@@ -218,7 +218,6 @@ QUICNetProcessor::main_accept(Continuation *cont, SOCKET fd, AcceptOptions const
   Debug("iocore_net_processor", "NetProcessor::main_accept - port %d,recv_bufsize %d, send_bufsize %d, sockopt 0x%0x",
         opt.local_port, opt.recv_bufsize, opt.send_bufsize, opt.sockopt_flags);
 
-  ProxyMutex *mutex  = this_ethread()->mutex.get();
   int accept_threads = opt.accept_threads; // might be changed.
   IpEndpoint accept_ip;                    // local binding address.
   // char thr_name[MAX_THREAD_NAME_LENGTH];
@@ -228,7 +227,7 @@ QUICNetProcessor::main_accept(Continuation *cont, SOCKET fd, AcceptOptions const
   if (accept_threads < 0) {
     REC_ReadConfigInteger(accept_threads, "proxy.config.accept_threads");
   }
-  NET_INCREMENT_DYN_STAT(net_accepts_currently_open_stat);
+  Metrics::increment(net_rsb.accepts_currently_open);
 
   if (opt.localhost_only) {
     accept_ip.setToLoopback(opt.ip_family);
diff --git a/iocore/net/SSLDiags.cc b/iocore/net/SSLDiags.cc
index cd75e1bcf6..d78ffbad2f 100644
--- a/iocore/net/SSLDiags.cc
+++ b/iocore/net/SSLDiags.cc
@@ -37,7 +37,7 @@ increment_ssl_client_error(unsigned long err)
 {
   // we only look for LIB_SSL errors atm
   if (ERR_LIB_SSL != ERR_GET_LIB(err)) {
-    SSL_INCREMENT_DYN_STAT(ssl_user_agent_other_errors_stat);
+    Metrics::increment(ssl_rsb.user_agent_other_errors);
     return false;
   }
 
@@ -46,31 +46,31 @@ increment_ssl_client_error(unsigned long err)
   // the error came from, hope that's ok?)
   switch (ERR_GET_REASON(err)) {
   case SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED:
-    SSL_INCREMENT_DYN_STAT(ssl_user_agent_expired_cert_stat);
+    Metrics::increment(ssl_rsb.user_agent_expired_cert);
     break;
   case SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED:
-    SSL_INCREMENT_DYN_STAT(ssl_user_agent_revoked_cert_stat);
+    Metrics::increment(ssl_rsb.user_agent_revoked_cert);
     break;
   case SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN:
-    SSL_INCREMENT_DYN_STAT(ssl_user_agent_unknown_cert_stat);
+    Metrics::increment(ssl_rsb.user_agent_unknown_cert);
     break;
   case SSL_R_CERTIFICATE_VERIFY_FAILED:
-    SSL_INCREMENT_DYN_STAT(ssl_user_agent_cert_verify_failed_stat);
+    Metrics::increment(ssl_rsb.user_agent_cert_verify_failed);
     break;
   case SSL_R_SSLV3_ALERT_BAD_CERTIFICATE:
-    SSL_INCREMENT_DYN_STAT(ssl_user_agent_bad_cert_stat);
+    Metrics::increment(ssl_rsb.user_agent_bad_cert);
     break;
   case SSL_R_TLSV1_ALERT_DECRYPTION_FAILED:
-    SSL_INCREMENT_DYN_STAT(ssl_user_agent_decryption_failed_stat);
+    Metrics::increment(ssl_rsb.user_agent_decryption_failed);
     break;
   case SSL_R_WRONG_VERSION_NUMBER:
-    SSL_INCREMENT_DYN_STAT(ssl_user_agent_wrong_version_stat);
+    Metrics::increment(ssl_rsb.user_agent_wrong_version);
     break;
   case SSL_R_TLSV1_ALERT_UNKNOWN_CA:
-    SSL_INCREMENT_DYN_STAT(ssl_user_agent_unknown_ca_stat);
+    Metrics::increment(ssl_rsb.user_agent_unknown_ca);
     break;
   default:
-    SSL_INCREMENT_DYN_STAT(ssl_user_agent_other_errors_stat);
+    Metrics::increment(ssl_rsb.user_agent_other_errors);
     return false;
   }
 
@@ -84,7 +84,7 @@ increment_ssl_server_error(unsigned long err)
 {
   // we only look for LIB_SSL errors atm
   if (ERR_LIB_SSL != ERR_GET_LIB(err)) {
-    SSL_INCREMENT_DYN_STAT(ssl_origin_server_other_errors_stat);
+    Metrics::increment(ssl_rsb.origin_server_other_errors);
     return false;
   }
 
@@ -93,31 +93,31 @@ increment_ssl_server_error(unsigned long err)
   // the error came from, hope that's ok?)
   switch (ERR_GET_REASON(err)) {
   case SSL_R_SSLV3_ALERT_CERTIFICATE_EXPIRED:
-    SSL_INCREMENT_DYN_STAT(ssl_origin_server_expired_cert_stat);
+    Metrics::increment(ssl_rsb.origin_server_expired_cert);
     break;
   case SSL_R_SSLV3_ALERT_CERTIFICATE_REVOKED:
-    SSL_INCREMENT_DYN_STAT(ssl_origin_server_revoked_cert_stat);
+    Metrics::increment(ssl_rsb.origin_server_revoked_cert);
     break;
   case SSL_R_SSLV3_ALERT_CERTIFICATE_UNKNOWN:
-    SSL_INCREMENT_DYN_STAT(ssl_origin_server_unknown_cert_stat);
+    Metrics::increment(ssl_rsb.origin_server_unknown_cert);
     break;
   case SSL_R_CERTIFICATE_VERIFY_FAILED:
-    SSL_INCREMENT_DYN_STAT(ssl_origin_server_cert_verify_failed_stat);
+    Metrics::increment(ssl_rsb.origin_server_cert_verify_failed);
     break;
   case SSL_R_SSLV3_ALERT_BAD_CERTIFICATE:
-    SSL_INCREMENT_DYN_STAT(ssl_origin_server_bad_cert_stat);
+    Metrics::increment(ssl_rsb.origin_server_bad_cert);
     break;
   case SSL_R_TLSV1_ALERT_DECRYPTION_FAILED:
-    SSL_INCREMENT_DYN_STAT(ssl_origin_server_decryption_failed_stat);
+    Metrics::increment(ssl_rsb.origin_server_decryption_failed);
     break;
   case SSL_R_WRONG_VERSION_NUMBER:
-    SSL_INCREMENT_DYN_STAT(ssl_origin_server_wrong_version_stat);
+    Metrics::increment(ssl_rsb.origin_server_wrong_version);
     break;
   case SSL_R_TLSV1_ALERT_UNKNOWN_CA:
-    SSL_INCREMENT_DYN_STAT(ssl_origin_server_unknown_ca_stat);
+    Metrics::increment(ssl_rsb.origin_server_unknown_ca);
     break;
   default:
-    SSL_INCREMENT_DYN_STAT(ssl_origin_server_other_errors_stat);
+    Metrics::increment(ssl_rsb.origin_server_other_errors);
     return false;
   }
 
diff --git a/iocore/net/SSLNetProcessor.cc b/iocore/net/SSLNetProcessor.cc
index 815eb19c81..16ffdb240e 100644
--- a/iocore/net/SSLNetProcessor.cc
+++ b/iocore/net/SSLNetProcessor.cc
@@ -65,9 +65,6 @@ SSLNetProcessor::start(int, size_t stacksize)
   }
   SSLTicketKeyConfig::startup();
 
-  // Acquire a SSLConfigParams instance *after* we start SSL up.
-  // SSLConfig::scoped_config params;
-
   // Initialize SSL statistics. This depends on an initial set of certificates being loaded above.
   SSLInitializeStatistics();
 
diff --git a/iocore/net/SSLNetVConnection.cc b/iocore/net/SSLNetVConnection.cc
index 7f0f74eaf0..d96ee16ba5 100644
--- a/iocore/net/SSLNetVConnection.cc
+++ b/iocore/net/SSLNetVConnection.cc
@@ -348,7 +348,7 @@ SSLNetVConnection::_ssl_read_from_net(EThread *lthread, int64_t &ret)
     case SSL_ERROR_SYSCALL:
       if (nread != 0) {
         // not EOF
-        SSL_INCREMENT_DYN_STAT(ssl_error_syscall);
+        Metrics::increment(ssl_rsb.error_syscall);
         event = SSL_READ_ERROR;
         ret   = errno;
         Dbg(dbg_ctl_ssl_error, "SSL_ERROR_SYSCALL, underlying IO error: %s", strerror(errno));
@@ -368,7 +368,8 @@ SSLNetVConnection::_ssl_read_from_net(EThread *lthread, int64_t &ret)
       ERR_error_string_n(e, buf, sizeof(buf));
       event = SSL_READ_ERROR;
       ret   = errno;
-      SSL_CLR_ERR_INCR_DYN_STAT(this, ssl_error_ssl, "errno=%d", errno);
+      SSLVCDebug(this, "errno=%d", errno);
+      Metrics::increment(ssl_rsb.error_ssl);
     } break;
     } // switch
   }   // while
@@ -419,7 +420,7 @@ SSLNetVConnection::read_raw_data()
     b       = b->next.get();
 
     r = SocketManager::read(this->con.fd, buffer, buf_len);
-    NET_INCREMENT_DYN_STAT(net_calls_to_read_stat);
+    Metrics::increment(net_rsb.calls_to_read);
     total_read += rattempted;
 
     Dbg(dbg_ctl_ssl, "read_raw_data r=%" PRId64 " rattempted=%" PRId64 " total_read=%" PRId64 " fd=%d", r, rattempted, total_read,
@@ -441,7 +442,8 @@ SSLNetVConnection::read_raw_data()
       r = total_read - rattempted + r;
     }
   }
-  NET_SUM_DYN_STAT(net_read_bytes_stat, r);
+  Metrics::increment(net_rsb.read_bytes, r);
+  Metrics::increment(net_rsb.read_bytes_count);
 
   swoc::IPRangeSet *pp_ipmap;
   pp_ipmap = SSLConfigParams::proxy_protocol_ip_addrs;
@@ -511,7 +513,7 @@ proxy_protocol_bypass:
   // check for errors
   if (r <= 0) {
     if (r == -EAGAIN || r == -ENOTCONN) {
-      NET_INCREMENT_DYN_STAT(net_calls_to_read_nodata_stat);
+      Metrics::increment(net_rsb.calls_to_read_nodata);
     }
   }
 
@@ -829,10 +831,10 @@ SSLNetVConnection::load_buffer_and_write(int64_t towrite, MIOBufferAccessor &buf
       } else if (SSLConfigParams::ssl_maxrecord == -1) {
         if (sslTotalBytesSent < SSL_DEF_TLS_RECORD_BYTE_THRESHOLD) {
           dynamic_tls_record_size = SSL_DEF_TLS_RECORD_SIZE;
-          SSL_INCREMENT_DYN_STAT(ssl_total_dyn_def_tls_record_count);
+          Metrics::increment(ssl_rsb.total_dyn_def_tls_record_count);
         } else {
           dynamic_tls_record_size = SSL_MAX_TLS_RECORD_SIZE;
-          SSL_INCREMENT_DYN_STAT(ssl_total_dyn_max_tls_record_count);
+          Metrics::increment(ssl_rsb.total_dyn_max_tls_record_count);
         }
         if (l > dynamic_tls_record_size) {
           l = dynamic_tls_record_size;
@@ -857,7 +859,7 @@ SSLNetVConnection::load_buffer_and_write(int64_t towrite, MIOBufferAccessor &buf
 
     Dbg(dbg_ctl_ssl, "try_to_write=%" PRId64 " written=%" PRId64 " total_written=%" PRId64, try_to_write, num_really_written,
         total_written);
-    NET_INCREMENT_DYN_STAT(net_calls_to_write_stat);
+    Metrics::increment(net_rsb.calls_to_write);
   } while (num_really_written == try_to_write && total_written < towrite);
 
   if (total_written > 0) {
@@ -894,7 +896,7 @@ SSLNetVConnection::load_buffer_and_write(int64_t towrite, MIOBufferAccessor &buf
       // SSL_ERROR_SYSCALL is an IO error. errno is likely 0, so set EPIPE, as
       // we do with SSL_ERROR_SSL below, to indicate a connection error.
       num_really_written = -EPIPE;
-      SSL_INCREMENT_DYN_STAT(ssl_error_syscall);
+      Metrics::increment(ssl_rsb.error_syscall);
       Dbg(dbg_ctl_ssl_error, "SSL_write-SSL_ERROR_SYSCALL");
       break;
     // end of stream
@@ -906,7 +908,8 @@ SSLNetVConnection::load_buffer_and_write(int64_t towrite, MIOBufferAccessor &buf
     default: {
       // Treat SSL_ERROR_SSL as EPIPE error.
       num_really_written = -EPIPE;
-      SSL_CLR_ERR_INCR_DYN_STAT(this, ssl_error_ssl, "SSL_write-SSL_ERROR_SSL errno=%d", errno);
+      SSLVCDebug(this, "SSL_write-SSL_ERROR_SSL errno=%d", errno);
+      Metrics::increment(ssl_rsb.error_ssl);
     } break;
     }
   }
@@ -1021,7 +1024,7 @@ SSLNetVConnection::free_thread(EThread *t)
 
   // close socket fd
   if (con.fd != NO_FD) {
-    NET_SUM_GLOBAL_DYN_STAT(net_connections_currently_open_stat, -1);
+    Metrics::decrement(net_rsb.connections_currently_open);
   }
   con.close();
 
@@ -1218,7 +1221,7 @@ SSLNetVConnection::sslStartHandShake(int event, int &err)
           Dbg(dbg_ctl_ssl, "using SNI name '%s' for client handshake", tlsext_host_name.get());
         } else {
           Dbg(dbg_ctl_ssl_error, "failed to set SNI name '%s' for client handshake", tlsext_host_name.get());
-          SSL_INCREMENT_DYN_STAT(ssl_sni_name_set_failure);
+          Metrics::increment(ssl_rsb.sni_name_set_failure);
         }
       }
 
@@ -1252,7 +1255,7 @@ SSLNetVConnection::sslServerHandShakeEvent(int &err)
 
   // Go do the preaccept hooks
   if (sslHandshakeHookState == HANDSHAKE_HOOKS_PRE) {
-    SSL_INCREMENT_DYN_STAT(ssl_total_attempts_handshake_count_in_stat);
+    Metrics::increment(ssl_rsb.total_attempts_handshake_count_in);
     if (!curHook) {
       Dbg(dbg_ctl_ssl, "Initialize preaccept curHook from NULL");
       curHook = ssl_hooks->get(TSSslHookInternalID(TS_VCONN_START_HOOK));
@@ -1391,7 +1394,7 @@ SSLNetVConnection::sslServerHandShakeEvent(int &err)
 
     if (this->get_tls_handshake_begin_time()) {
       this->_record_tls_handshake_end_time();
-      SSL_INCREMENT_DYN_STAT(ssl_total_success_handshake_count_in_stat);
+      Metrics::increment(ssl_rsb.total_success_handshake_count_in);
     }
 
     if (this->get_tunnel_type() != SNIRoutingType::NONE) {
@@ -1473,7 +1476,7 @@ SSLNetVConnection::sslServerHandShakeEvent(int &err)
 
 #if TS_USE_TLS_ASYNC
   case SSL_ERROR_WANT_ASYNC:
-    SSL_INCREMENT_DYN_STAT(ssl_error_async);
+    Metrics::increment(ssl_rsb.error_async);
     return SSL_WAIT_FOR_ASYNC;
 #endif
 
@@ -1481,7 +1484,7 @@ SSLNetVConnection::sslServerHandShakeEvent(int &err)
     return EVENT_CONT;
 
   case SSL_ERROR_SSL: {
-    SSL_CLR_ERR_INCR_DYN_STAT(this, ssl_error_ssl, "SSLNetVConnection::sslServerHandShakeEvent, SSL_ERROR_SSL errno=%d", errno);
+    SSLVCDebug(this, "SSLNetVConnection::sslServerHandShakeEvent, SSL_ERROR_SSL errno=%d", errno);
     return EVENT_ERROR;
   }
 
@@ -1543,7 +1546,7 @@ SSLNetVConnection::sslClientHandShakeEvent(int &err)
 
   // Go do the preaccept hooks
   if (sslHandshakeHookState == HANDSHAKE_HOOKS_OUTBOUND_PRE) {
-    SSL_INCREMENT_DYN_STAT(ssl_total_attempts_handshake_count_out_stat);
+    Metrics::increment(ssl_rsb.total_attempts_handshake_count_out);
     if (!curHook) {
       Dbg(dbg_ctl_ssl, "Initialize outbound connect curHook from NULL");
       curHook = ssl_hooks->get(TSSslHookInternalID(TS_VCONN_OUTBOUND_START_HOOK));
@@ -1593,7 +1596,7 @@ SSLNetVConnection::sslClientHandShakeEvent(int &err)
       writeReschedule(nh);
     }
 
-    SSL_INCREMENT_DYN_STAT(ssl_total_success_handshake_count_out_stat);
+    Metrics::increment(ssl_rsb.total_success_handshake_count_out);
 
     sslHandshakeStatus = SSLHandshakeStatus::SSL_HANDSHAKE_DONE;
     return EVENT_DONE;
@@ -1626,7 +1629,7 @@ SSLNetVConnection::sslClientHandShakeEvent(int &err)
 
   case SSL_ERROR_SYSCALL:
     err = errno;
-    SSL_INCREMENT_DYN_STAT(ssl_error_syscall);
+    Metrics::increment(ssl_rsb.error_syscall);
     Dbg(dbg_ctl_ssl_error, "syscall");
     return EVENT_ERROR;
     break;
@@ -1637,8 +1640,9 @@ SSLNetVConnection::sslClientHandShakeEvent(int &err)
     char buf[512];
     unsigned long e = ERR_peek_last_error();
     ERR_error_string_n(e, buf, sizeof(buf));
-    // FIXME -- This triggers a retry on cases of cert validation errors....
-    SSL_CLR_ERR_INCR_DYN_STAT(this, ssl_error_ssl, "SSL_ERROR_SSL errno=%d", errno);
+    // FIXME -- This triggers a retry on cases of cert validation errors...
+    SSLVCDebug(this, "SSL_ERROR_SSL errno=%d", errno);
+    Metrics::increment(ssl_rsb.error_ssl);
     Dbg(dbg_ctl_ssl_error, "SSL_ERROR_SSL");
     if (e) {
       if (this->options.sni_servername) {
@@ -1941,20 +1945,20 @@ SSLNetVConnection::increment_ssl_version_metric(int version) const
 {
   switch (version) {
   case SSL3_VERSION:
-    SSL_INCREMENT_DYN_STAT(ssl_total_sslv3);
+    Metrics::increment(ssl_rsb.total_sslv3);
     break;
   case TLS1_VERSION:
-    SSL_INCREMENT_DYN_STAT(ssl_total_tlsv1);
+    Metrics::increment(ssl_rsb.total_tlsv1);
     break;
   case TLS1_1_VERSION:
-    SSL_INCREMENT_DYN_STAT(ssl_total_tlsv11);
+    Metrics::increment(ssl_rsb.total_tlsv11);
     break;
   case TLS1_2_VERSION:
-    SSL_INCREMENT_DYN_STAT(ssl_total_tlsv12);
+    Metrics::increment(ssl_rsb.total_tlsv12);
     break;
 #ifdef TLS1_3_VERSION
   case TLS1_3_VERSION:
-    SSL_INCREMENT_DYN_STAT(ssl_total_tlsv13);
+    Metrics::increment(ssl_rsb.total_tlsv13);
     break;
 #endif
   default:
@@ -2228,7 +2232,7 @@ SSLNetVConnection::_ssl_accept()
           }
           block->fill(nread);
           this->_early_data_buf->append_block(block);
-          SSL_INCREMENT_DYN_STAT(ssl_early_data_received_count);
+          Metrics::increment(ssl_rsb.early_data_received_count);
 
           if (dbg_ctl_ssl_early_data_show_received.on()) {
             std::string early_data_str(reinterpret_cast<char *>(block->buf()), nread);
@@ -2303,7 +2307,7 @@ SSLNetVConnection::_ssl_connect()
 
   if (ret > 0) {
     if (SSL_session_reused(ssl)) {
-      SSL_INCREMENT_DYN_STAT(ssl_origin_session_reused_count);
+      Metrics::increment(ssl_rsb.origin_session_reused_count);
       Dbg(dbg_ctl_ssl_origin_session_cache, "reused session to origin server");
     } else {
       Dbg(dbg_ctl_ssl_origin_session_cache, "new session to origin server");
@@ -2455,7 +2459,7 @@ SSLNetVConnection::_ssl_read_buffer(void *buf, int64_t nbytes, int64_t &nread)
       } else {
         if ((nread = read_bytes) > 0) {
           this->_increment_early_data_len(read_bytes);
-          SSL_INCREMENT_DYN_STAT(ssl_early_data_received_count);
+          Metrics::increment(ssl_rsb.early_data_received_count);
           if (dbg_ctl_ssl_early_data_show_received.on()) {
             std::string early_data_str(reinterpret_cast<char *>(buf), nread);
             DbgPrint(dbg_ctl_ssl_early_data_show_received, "Early data buffer: \n%s", early_data_str.c_str());
diff --git a/iocore/net/SSLSessionCache.cc b/iocore/net/SSLSessionCache.cc
index 0e7f0323d7..e978ffc3d2 100644
--- a/iocore/net/SSLSessionCache.cc
+++ b/iocore/net/SSLSessionCache.cc
@@ -91,10 +91,8 @@ SSLSessionCache::removeSession(const SSLSessionID &sid)
     Debug("ssl.session_cache.remove", "SessionCache using bucket %" PRId64 " (%p): Removing session '%s' (hash: %" PRIX64 ").",
           target_bucket, bucket, buf, hash);
   }
+  Metrics::increment(ssl_rsb.session_cache_eviction);
 
-  if (ssl_rsb) {
-    SSL_INCREMENT_DYN_STAT(ssl_session_cache_eviction);
-  }
   bucket->removeSession(sid);
 }
 
@@ -120,9 +118,7 @@ SSLSessionBucket::insertSession(const SSLSessionID &id, SSL_SESSION *sess, SSL *
 {
   std::shared_lock r_lock(mutex, std::try_to_lock);
   if (!r_lock.owns_lock()) {
-    if (ssl_rsb) {
-      SSL_INCREMENT_DYN_STAT(ssl_session_cache_lock_contention);
-    }
+    Metrics::increment(ssl_rsb.session_cache_lock_contention);
     if (SSLConfigParams::session_cache_skip_on_lock_contention) {
       return;
     }
@@ -166,9 +162,7 @@ SSLSessionBucket::insertSession(const SSLSessionID &id, SSL_SESSION *sess, SSL *
 
   std::unique_lock w_lock(mutex, std::try_to_lock);
   if (!w_lock.owns_lock()) {
-    if (ssl_rsb) {
-      SSL_INCREMENT_DYN_STAT(ssl_session_cache_lock_contention);
-    }
+    Metrics::increment(ssl_rsb.session_cache_lock_contention);
     if (SSLConfigParams::session_cache_skip_on_lock_contention) {
       return;
     }
@@ -177,9 +171,7 @@ SSLSessionBucket::insertSession(const SSLSessionID &id, SSL_SESSION *sess, SSL *
 
   PRINT_BUCKET("insertSession before")
   if (bucket_map.size() >= SSLConfigParams::session_cache_max_bucket_size) {
-    if (ssl_rsb) {
-      SSL_INCREMENT_DYN_STAT(ssl_session_cache_eviction);
-    }
+    Metrics::increment(ssl_rsb.session_cache_eviction);
     removeOldestSession(w_lock);
   }
 
@@ -197,9 +189,7 @@ SSLSessionBucket::getSessionBuffer(const SSLSessionID &id, char *buffer, int &le
   int true_len = 0;
   std::shared_lock lock(mutex, std::try_to_lock);
   if (!lock.owns_lock()) {
-    if (ssl_rsb) {
-      SSL_INCREMENT_DYN_STAT(ssl_session_cache_lock_contention);
-    }
+    Metrics::increment(ssl_rsb.session_cache_lock_contention);
     if (SSLConfigParams::session_cache_skip_on_lock_contention) {
       return true_len;
     }
@@ -232,9 +222,7 @@ SSLSessionBucket::getSession(const SSLSessionID &id, SSL_SESSION **sess, ssl_ses
 
   std::shared_lock lock(mutex, std::try_to_lock);
   if (!lock.owns_lock()) {
-    if (ssl_rsb) {
-      SSL_INCREMENT_DYN_STAT(ssl_session_cache_lock_contention);
-    }
+    Metrics::increment(ssl_rsb.session_cache_lock_contention);
     if (SSLConfigParams::session_cache_skip_on_lock_contention) {
       return false;
     }
diff --git a/iocore/net/SSLStats.cc b/iocore/net/SSLStats.cc
index 13f247c17c..25d065b1fe 100644
--- a/iocore/net/SSLStats.cc
+++ b/iocore/net/SSLStats.cc
@@ -27,15 +27,15 @@
 
 #include "P_SSLConfig.h"
 #include "P_SSLUtils.h"
+#include "records/P_RecProcess.h"
 
-RecRawStatBlock *ssl_rsb = nullptr;
-std::unordered_map<std::string, intptr_t> cipher_map;
+SSLStatsBlock ssl_rsb;
+std::unordered_map<std::string, ts::Metrics::IntType *> cipher_map;
 
-static int
-SSLRecRawStatSyncCount(const char *name, RecDataT data_type, RecData *data, RecRawStatBlock *rsb, int id)
+// ToDo: This gets called once per global sync, for now at least.
+void
+SSLPeriodicMetricsUpdate()
 {
-  // Grab all the stats we want from OpenSSL and set the stats. This function only needs to be called by one of the
-  // involved stats, all others *must* call RecRawStatSyncSum.
   SSLCertificateConfig::scoped_config certLookup;
 
   int64_t sessions = 0;
@@ -43,6 +43,7 @@ SSLRecRawStatSyncCount(const char *name, RecDataT data_type, RecData *data, RecR
   int64_t misses   = 0;
   int64_t timeouts = 0;
 
+  Debug("ssl", "Starting to update the new session metrics");
   if (certLookup) {
     const unsigned ctxCount = certLookup->count();
     for (size_t i = 0; i < ctxCount; i++) {
@@ -59,31 +60,21 @@ SSLRecRawStatSyncCount(const char *name, RecDataT data_type, RecData *data, RecR
     }
   }
 
-  SSL_SET_COUNT_DYN_STAT(ssl_user_agent_sessions_stat, sessions);
-  SSL_SET_COUNT_DYN_STAT(ssl_user_agent_session_hit_stat, hits);
-  SSL_SET_COUNT_DYN_STAT(ssl_user_agent_session_miss_stat, misses);
-  SSL_SET_COUNT_DYN_STAT(ssl_user_agent_session_timeout_stat, timeouts);
-
-  return RecRawStatSyncCount(name, data_type, data, rsb, id);
+  Metrics::write(ssl_rsb.user_agent_sessions, sessions);
+  Metrics::write(ssl_rsb.user_agent_session_hit, hits);
+  Metrics::write(ssl_rsb.user_agent_session_miss, misses);
+  Metrics::write(ssl_rsb.user_agent_session_timeout, timeouts);
 }
 
 static void
-add_cipher_stat(const char *cipherName, const std::string &statName, int index)
+add_cipher_stat(const char *cipherName, const std::string &statName)
 {
-  // If room in allocated space ...
-  if ((ssl_cipher_stats_start + index) > ssl_cipher_stats_end) {
-    // Too many ciphers, increase ssl_cipher_stats_end.
-    SSLError("too many ciphers to register metric '%s', increase SSL_Stats::ssl_cipher_stats_end", statName.c_str());
-    return;
-  }
-
   // If not already registered ...
   if (cipherName && cipher_map.find(cipherName) == cipher_map.end()) {
-    cipher_map.emplace(cipherName, static_cast<intptr_t>(ssl_cipher_stats_start + index));
-    // Register as non-persistent since the order/index is dependent upon configuration.
-    RecRegisterRawStat(ssl_rsb, RECT_PROCESS, statName.c_str(), RECD_INT, RECP_NON_PERSISTENT, (int)ssl_cipher_stats_start + index,
-                       RecRawStatSyncSum);
-    SSL_CLEAR_DYN_STAT((int)ssl_cipher_stats_start + index);
+    ts::Metrics &intm            = ts::Metrics::getInstance();
+    ts::Metrics::IntType *metric = intm.newMetricPtr(statName);
+
+    cipher_map.emplace(cipherName, metric);
     Debug("ssl", "registering SSL cipher metric '%s'", statName.c_str());
   }
 }
@@ -94,181 +85,90 @@ SSLInitializeStatistics()
   SSL_CTX *ctx;
   SSL *ssl;
   STACK_OF(SSL_CIPHER) * ciphers;
-
-  // Allocate SSL statistics block.
-  ssl_rsb = RecAllocateRawStatBlock(static_cast<int>(Ssl_Stat_Count));
-  ink_assert(ssl_rsb != nullptr);
-
-  // SSL client errors.
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.user_agent_other_errors", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_user_agent_other_errors_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.user_agent_expired_cert", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_user_agent_expired_cert_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.user_agent_revoked_cert", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_user_agent_revoked_cert_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.user_agent_unknown_cert", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_user_agent_unknown_cert_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.user_agent_cert_verify_failed", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_user_agent_cert_verify_failed_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.user_agent_bad_cert", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_user_agent_bad_cert_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.user_agent_decryption_failed", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_user_agent_decryption_failed_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.user_agent_wrong_version", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_user_agent_wrong_version_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.user_agent_unknown_ca", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_user_agent_unknown_ca_stat, RecRawStatSyncSum);
-
-  // Polled SSL context statistics.
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.user_agent_sessions", RECD_COUNTER, RECP_NON_PERSISTENT,
-                     (int)ssl_user_agent_sessions_stat,
-                     SSLRecRawStatSyncCount); //<- only use this fn once
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.user_agent_session_hit", RECD_COUNTER, RECP_NON_PERSISTENT,
-                     (int)ssl_user_agent_session_hit_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.user_agent_session_miss", RECD_COUNTER, RECP_NON_PERSISTENT,
-                     (int)ssl_user_agent_session_miss_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.user_agent_session_timeout", RECD_COUNTER, RECP_NON_PERSISTENT,
-                     (int)ssl_user_agent_session_timeout_stat, RecRawStatSyncCount);
-
-  // SSL server errors.
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.origin_server_other_errors", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_origin_server_other_errors_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.origin_server_expired_cert", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_origin_server_expired_cert_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.origin_server_revoked_cert", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_origin_server_revoked_cert_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.origin_server_unknown_cert", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_origin_server_unknown_cert_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.origin_server_cert_verify_failed", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_origin_server_cert_verify_failed_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.origin_server_bad_cert", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_origin_server_bad_cert_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.origin_server_decryption_failed", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_origin_server_decryption_failed_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.origin_server_wrong_version", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_origin_server_wrong_version_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.origin_server_unknown_ca", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_origin_server_unknown_ca_stat, RecRawStatSyncSum);
-
-  // SSL handshake time
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.total_handshake_time", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_handshake_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.total_attempts_handshake_count_in", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_attempts_handshake_count_in_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.total_success_handshake_count_in", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_success_handshake_count_in_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.total_attempts_handshake_count_out", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_attempts_handshake_count_out_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.total_success_handshake_count_out", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_success_handshake_count_out_stat, RecRawStatSyncCount);
-
-  // TLS tickets
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.total_tickets_created", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_tickets_created_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.total_tickets_verified", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_tickets_verified_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.total_tickets_not_found", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_tickets_not_found_stat, RecRawStatSyncCount);
-  // TODO: ticket renewal is not used right now.
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.total_tickets_renewed", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_tickets_renewed_stat, RecRawStatSyncCount);
-  // The number of session tickets verified with an "old" key.
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.total_tickets_verified_old_key", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_tickets_verified_old_key_stat, RecRawStatSyncCount);
-  // The number of ticket keys renewed.
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.total_ticket_keys_renewed", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_ticket_keys_renewed_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_session_cache_hit", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_session_cache_hit, RecRawStatSyncCount);
-
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_origin_session_cache_hit", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_origin_session_cache_hit, RecRawStatSyncCount);
-
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_session_cache_new_session", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_session_cache_new_session, RecRawStatSyncCount);
-
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_session_cache_miss", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_session_cache_miss, RecRawStatSyncCount);
-
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_origin_session_cache_miss", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_origin_session_cache_miss, RecRawStatSyncCount);
-
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_session_cache_eviction", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_session_cache_eviction, RecRawStatSyncCount);
-
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_session_cache_lock_contention", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_session_cache_lock_contention, RecRawStatSyncCount);
-
-  // Track dynamic record size
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.default_record_size_count", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_dyn_def_tls_record_count, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.max_record_size_count", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_dyn_max_tls_record_count, RecRawStatSyncSum);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.redo_record_size_count", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_dyn_redo_tls_record_count, RecRawStatSyncCount);
-
-  // error stats
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_error_syscall", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_error_syscall, RecRawStatSyncCount);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_error_ssl", RECD_COUNTER, RECP_PERSISTENT, (int)ssl_error_ssl,
-                     RecRawStatSyncCount);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_error_async", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_error_async, RecRawStatSyncCount);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_sni_name_set_failure", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_sni_name_set_failure, RecRawStatSyncCount);
-
-  // ocsp stapling stats
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_ocsp_revoked_cert_stat", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_ocsp_revoked_cert_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_ocsp_unknown_cert_stat", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_ocsp_unknown_cert_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_ocsp_refreshed_cert", RECD_INT, RECP_PERSISTENT,
-                     (int)ssl_ocsp_refreshed_cert_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_ocsp_refresh_cert_failure", RECD_INT, RECP_PERSISTENT,
-                     (int)ssl_ocsp_refresh_cert_failure_stat, RecRawStatSyncCount);
-
-  // SSL Version stats
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_total_sslv3", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_sslv3, RecRawStatSyncCount);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_total_tlsv1", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_tlsv1, RecRawStatSyncCount);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_total_tlsv11", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_tlsv11, RecRawStatSyncCount);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_total_tlsv12", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_tlsv12, RecRawStatSyncCount);
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.ssl_total_tlsv13", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)ssl_total_tlsv13, RecRawStatSyncCount);
-
-  // TLSv1.3 0-RTT stats
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.early_data_received", RECD_INT, RECP_PERSISTENT,
-                     (int)ssl_early_data_received_count, RecRawStatSyncCount);
-
-  // Origin Server Session Reuse stats
-  RecRegisterRawStat(ssl_rsb, RECT_PROCESS, "proxy.process.ssl.origin_session_reused", RECD_INT, RECP_PERSISTENT,
-                     (int)ssl_origin_session_reused_count, RecRawStatSyncCount);
+  ts::Metrics &intm = ts::Metrics::getInstance();
+
+  // For now, register with the librecords global sync.
+  RecRegNewSyncStatSync(SSLPeriodicMetricsUpdate);
+
+  ssl_rsb.early_data_received_count          = intm.newMetricPtr("proxy.process.ssl.early_data_received");
+  ssl_rsb.error_async                        = intm.newMetricPtr("proxy.process.ssl.ssl_error_async");
+  ssl_rsb.error_ssl                          = intm.newMetricPtr("proxy.process.ssl.ssl_error_ssl");
+  ssl_rsb.error_syscall                      = intm.newMetricPtr("proxy.process.ssl.ssl_error_syscall");
+  ssl_rsb.ocsp_refresh_cert_failure          = intm.newMetricPtr("proxy.process.ssl.ssl_ocsp_refresh_cert_failure");
+  ssl_rsb.ocsp_refreshed_cert                = intm.newMetricPtr("proxy.process.ssl.ssl_ocsp_refreshed_cert");
+  ssl_rsb.ocsp_revoked_cert                  = intm.newMetricPtr("proxy.process.ssl.ssl_ocsp_revoked_cert_stat");
+  ssl_rsb.ocsp_unknown_cert                  = intm.newMetricPtr("proxy.process.ssl.ssl_ocsp_unknown_cert_stat");
+  ssl_rsb.origin_server_bad_cert             = intm.newMetricPtr("proxy.process.ssl.origin_server_bad_cert");
+  ssl_rsb.origin_server_cert_verify_failed   = intm.newMetricPtr("proxy.process.ssl.origin_server_cert_verify_failed");
+  ssl_rsb.origin_server_decryption_failed    = intm.newMetricPtr("proxy.process.ssl.origin_server_decryption_failed");
+  ssl_rsb.origin_server_expired_cert         = intm.newMetricPtr("proxy.process.ssl.origin_server_expired_cert");
+  ssl_rsb.origin_server_other_errors         = intm.newMetricPtr("proxy.process.ssl.origin_server_other_errors");
+  ssl_rsb.origin_server_revoked_cert         = intm.newMetricPtr("proxy.process.ssl.origin_server_revoked_cert");
+  ssl_rsb.origin_server_unknown_ca           = intm.newMetricPtr("proxy.process.ssl.origin_server_unknown_ca");
+  ssl_rsb.origin_server_unknown_cert         = intm.newMetricPtr("proxy.process.ssl.origin_server_unknown_cert");
+  ssl_rsb.origin_server_wrong_version        = intm.newMetricPtr("proxy.process.ssl.origin_server_wrong_version");
+  ssl_rsb.origin_session_reused_count        = intm.newMetricPtr("proxy.process.ssl.origin_session_reused");
+  ssl_rsb.sni_name_set_failure               = intm.newMetricPtr("proxy.process.ssl.ssl_sni_name_set_failure");
+  ssl_rsb.origin_session_cache_hit           = intm.newMetricPtr("proxy.process.ssl.ssl_origin_session_cache_hit");
+  ssl_rsb.origin_session_cache_miss          = intm.newMetricPtr("proxy.process.ssl.ssl_origin_session_cache_miss");
+  ssl_rsb.session_cache_eviction             = intm.newMetricPtr("proxy.process.ssl.ssl_session_cache_eviction");
+  ssl_rsb.session_cache_hit                  = intm.newMetricPtr("proxy.process.ssl.ssl_session_cache_hit");
+  ssl_rsb.session_cache_lock_contention      = intm.newMetricPtr("proxy.process.ssl.ssl_session_cache_lock_contention");
+  ssl_rsb.session_cache_miss                 = intm.newMetricPtr("proxy.process.ssl.ssl_session_cache_miss");
+  ssl_rsb.session_cache_new_session          = intm.newMetricPtr("proxy.process.ssl.ssl_session_cache_new_session");
+  ssl_rsb.total_attempts_handshake_count_in  = intm.newMetricPtr("proxy.process.ssl.total_attempts_handshake_count_in");
+  ssl_rsb.total_attempts_handshake_count_out = intm.newMetricPtr("proxy.process.ssl.total_attempts_handshake_count_out");
+  ssl_rsb.total_dyn_def_tls_record_count     = intm.newMetricPtr("proxy.process.ssl.default_record_size_count");
+  ssl_rsb.total_dyn_max_tls_record_count     = intm.newMetricPtr("proxy.process.ssl.max_record_size_count");
+  ssl_rsb.total_dyn_redo_tls_record_count    = intm.newMetricPtr("proxy.process.ssl.redo_record_size_count");
+  ssl_rsb.total_handshake_time               = intm.newMetricPtr("proxy.process.ssl.total_handshake_time");
+  ssl_rsb.total_sslv3                        = intm.newMetricPtr("proxy.process.ssl.ssl_total_sslv3");
+  ssl_rsb.total_success_handshake_count_in   = intm.newMetricPtr("proxy.process.ssl.total_success_handshake_count_in");
+  ssl_rsb.total_success_handshake_count_out  = intm.newMetricPtr("proxy.process.ssl.total_success_handshake_count_out");
+  ssl_rsb.total_ticket_keys_renewed          = intm.newMetricPtr("proxy.process.ssl.total_ticket_keys_renewed");
+  ssl_rsb.total_tickets_created              = intm.newMetricPtr("proxy.process.ssl.total_tickets_created");
+  ssl_rsb.total_tickets_not_found            = intm.newMetricPtr("proxy.process.ssl.total_tickets_not_found");
+  ssl_rsb.total_tickets_renewed              = intm.newMetricPtr("proxy.process.ssl.total_tickets_renewed"); // ToDo: Not used?
+  ssl_rsb.total_tickets_verified             = intm.newMetricPtr("proxy.process.ssl.total_tickets_verified");
+  ssl_rsb.total_tickets_verified_old_key     = intm.newMetricPtr("proxy.process.ssl.total_tickets_verified_old_key");
+  ssl_rsb.total_tlsv1                        = intm.newMetricPtr("proxy.process.ssl.ssl_total_tlsv1");
+  ssl_rsb.total_tlsv11                       = intm.newMetricPtr("proxy.process.ssl.ssl_total_tlsv11");
+  ssl_rsb.total_tlsv12                       = intm.newMetricPtr("proxy.process.ssl.ssl_total_tlsv12");
+  ssl_rsb.total_tlsv13                       = intm.newMetricPtr("proxy.process.ssl.ssl_total_tlsv13");
+  ssl_rsb.user_agent_bad_cert                = intm.newMetricPtr("proxy.process.ssl.user_agent_bad_cert");
+  ssl_rsb.user_agent_cert_verify_failed      = intm.newMetricPtr("proxy.process.ssl.user_agent_cert_verify_failed");
+  ssl_rsb.user_agent_decryption_failed       = intm.newMetricPtr("proxy.process.ssl.user_agent_decryption_failed");
+  ssl_rsb.user_agent_expired_cert            = intm.newMetricPtr("proxy.process.ssl.user_agent_expired_cert");
+  ssl_rsb.user_agent_other_errors            = intm.newMetricPtr("proxy.process.ssl.user_agent_other_errors");
+  ssl_rsb.user_agent_revoked_cert            = intm.newMetricPtr("proxy.process.ssl.user_agent_revoked_cert");
+  ssl_rsb.user_agent_session_hit             = intm.newMetricPtr("proxy.process.ssl.user_agent_session_hit");
+  ssl_rsb.user_agent_session_miss            = intm.newMetricPtr("proxy.process.ssl.user_agent_session_miss");
+  ssl_rsb.user_agent_session_timeout         = intm.newMetricPtr("proxy.process.ssl.user_agent_session_timeout");
+  ssl_rsb.user_agent_sessions                = intm.newMetricPtr("proxy.process.ssl.user_agent_sessions");
+  ssl_rsb.user_agent_unknown_ca              = intm.newMetricPtr("proxy.process.ssl.user_agent_unknown_ca");
+  ssl_rsb.user_agent_unknown_cert            = intm.newMetricPtr("proxy.process.ssl.user_agent_unknown_cert");
+  ssl_rsb.user_agent_wrong_version           = intm.newMetricPtr("proxy.process.ssl.user_agent_wrong_version");
 
   // Get and register the SSL cipher stats. Note that we are using the default SSL context to obtain
   // the cipher list. This means that the set of ciphers is fixed by the build configuration and not
   // filtered by proxy.config.ssl.server.cipher_suite. This keeps the set of cipher suites stable across
   // configuration reloads and works for the case where we honor the client cipher preference.
-
   SSLMultiCertConfigLoader loader(nullptr);
   ctx     = loader.default_server_ssl_ctx();
   ssl     = SSL_new(ctx);
   ciphers = SSL_get_ciphers(ssl);
 
   // BoringSSL has sk_SSL_CIPHER_num() return a size_t (well, sk_num() is)
-  int index;
-  for (index = 0; index < static_cast<int>(sk_SSL_CIPHER_num(ciphers)); index++) {
+  for (int index = 0; index < static_cast<int>(sk_SSL_CIPHER_num(ciphers)); index++) {
     SSL_CIPHER *cipher     = const_cast<SSL_CIPHER *>(sk_SSL_CIPHER_value(ciphers, index));
     const char *cipherName = SSL_CIPHER_get_name(cipher);
     std::string statName   = "proxy.process.ssl.cipher.user_agent." + std::string(cipherName);
-    add_cipher_stat(cipherName, statName, index);
+
+    add_cipher_stat(cipherName, statName);
   }
 
   // Add "OTHER" for ciphers not on the map
-  add_cipher_stat(SSL_CIPHER_STAT_OTHER.c_str(), "proxy.process.ssl.cipher.user_agent." + SSL_CIPHER_STAT_OTHER, index);
+  add_cipher_stat(SSL_CIPHER_STAT_OTHER.c_str(), "proxy.process.ssl.cipher.user_agent." + SSL_CIPHER_STAT_OTHER);
 
   SSL_free(ssl);
   SSLReleaseContext(ctx);
diff --git a/iocore/net/SSLStats.h b/iocore/net/SSLStats.h
index 8d0ba02de9..051e2576a7 100644
--- a/iocore/net/SSLStats.h
+++ b/iocore/net/SSLStats.h
@@ -28,96 +28,77 @@
 #include "records/I_RecProcess.h"
 #include "SSLDiags.h"
 
-/* Stats should only be accessed using these macros */
-#define SSL_INCREMENT_DYN_STAT(x)        RecIncrRawStat(ssl_rsb, nullptr, (int)x, 1)
-#define SSL_DECREMENT_DYN_STAT(x)        RecIncrRawStat(ssl_rsb, nullptr, (int)x, -1)
-#define SSL_SET_COUNT_DYN_STAT(x, count) RecSetRawStatCount(ssl_rsb, x, count)
-#define SSL_INCREMENT_DYN_STAT_EX(x, y)  RecIncrRawStat(ssl_rsb, nullptr, (int)x, y)
-#define SSL_CLEAR_DYN_STAT(x)            \
-  do {                                   \
-    RecSetRawStatSum(ssl_rsb, (x), 0);   \
-    RecSetRawStatCount(ssl_rsb, (x), 0); \
-  } while (0)
-#define SSL_CLR_ERR_INCR_DYN_STAT(vc, x, fmt, ...) \
-  do {                                             \
-    SSLVCDebug((vc), fmt, ##__VA_ARGS__);          \
-    RecIncrRawStat(ssl_rsb, nullptr, (int)x, 1);   \
-  } while (0)
-
-enum SSL_Stats {
-  ssl_origin_server_expired_cert_stat,
-  ssl_user_agent_expired_cert_stat,
-  ssl_origin_server_revoked_cert_stat,
-  ssl_user_agent_revoked_cert_stat,
-  ssl_origin_server_unknown_cert_stat,
-  ssl_user_agent_unknown_cert_stat,
-  ssl_origin_server_cert_verify_failed_stat,
-  ssl_user_agent_cert_verify_failed_stat,
-  ssl_origin_server_bad_cert_stat,
-  ssl_user_agent_bad_cert_stat,
-  ssl_origin_server_decryption_failed_stat,
-  ssl_user_agent_decryption_failed_stat,
-  ssl_origin_server_wrong_version_stat,
-  ssl_user_agent_wrong_version_stat,
-  ssl_origin_server_other_errors_stat,
-  ssl_user_agent_other_errors_stat,
-  ssl_origin_server_unknown_ca_stat,
-  ssl_user_agent_unknown_ca_stat,
-  ssl_user_agent_sessions_stat,
-  ssl_user_agent_session_hit_stat,
-  ssl_user_agent_session_miss_stat,
-  ssl_user_agent_session_timeout_stat,
-  ssl_total_handshake_time_stat,
-  ssl_total_attempts_handshake_count_in_stat,
-  ssl_total_success_handshake_count_in_stat,
-  ssl_total_tickets_created_stat,
-  ssl_total_tickets_verified_stat,
-  ssl_total_tickets_verified_old_key_stat, // verified with old key.
-  ssl_total_ticket_keys_renewed_stat,      // number of keys renewed.
-  ssl_total_tickets_not_found_stat,
-  ssl_total_tickets_renewed_stat,
-  ssl_total_dyn_def_tls_record_count,
-  ssl_total_dyn_max_tls_record_count,
-  ssl_total_dyn_redo_tls_record_count,
-  ssl_session_cache_hit,
-  ssl_origin_session_cache_hit,
-  ssl_session_cache_miss,
-  ssl_origin_session_cache_miss,
-  ssl_session_cache_eviction,
-  ssl_session_cache_lock_contention,
-  ssl_session_cache_new_session,
-  ssl_early_data_received_count, // how many times we received early data
-  ssl_origin_session_reused_count,
-
-  /* error stats */
-  ssl_error_syscall,
-  ssl_error_ssl,
-  ssl_error_async,
-  ssl_sni_name_set_failure,
-  ssl_total_attempts_handshake_count_out_stat,
-  ssl_total_success_handshake_count_out_stat,
-
-  /* ocsp stapling stats */
-  ssl_ocsp_revoked_cert_stat,
-  ssl_ocsp_unknown_cert_stat,
-  ssl_ocsp_refreshed_cert_stat,
-  ssl_ocsp_refresh_cert_failure_stat,
-
-  /* SSL/TLS versions */
-  ssl_total_sslv3,
-  ssl_total_tlsv1,
-  ssl_total_tlsv11,
-  ssl_total_tlsv12,
-  ssl_total_tlsv13,
-
-  ssl_cipher_stats_start = 100,
-  ssl_cipher_stats_end   = 300,
-
-  Ssl_Stat_Count
+#include "api/Metrics.h"
+
+using ts::Metrics;
+
+// For some odd reason, these have to be initialized with nullptr, because the order
+// of initialization and how we load certs is weird... In reality only the metric
+// for ssl_rsb.total_ticket_keys_renewed needs this initialization, but lets be
+// consistent at least.
+struct SSLStatsBlock {
+  ts::Metrics::IntType *early_data_received_count          = nullptr;
+  ts::Metrics::IntType *error_async                        = nullptr;
+  ts::Metrics::IntType *error_ssl                          = nullptr;
+  ts::Metrics::IntType *error_syscall                      = nullptr;
+  ts::Metrics::IntType *ocsp_refresh_cert_failure          = nullptr;
+  ts::Metrics::IntType *ocsp_refreshed_cert                = nullptr;
+  ts::Metrics::IntType *ocsp_revoked_cert                  = nullptr;
+  ts::Metrics::IntType *ocsp_unknown_cert                  = nullptr;
+  ts::Metrics::IntType *origin_server_bad_cert             = nullptr;
+  ts::Metrics::IntType *origin_server_cert_verify_failed   = nullptr;
+  ts::Metrics::IntType *origin_server_decryption_failed    = nullptr;
+  ts::Metrics::IntType *origin_server_expired_cert         = nullptr;
+  ts::Metrics::IntType *origin_server_other_errors         = nullptr;
+  ts::Metrics::IntType *origin_server_revoked_cert         = nullptr;
+  ts::Metrics::IntType *origin_server_unknown_ca           = nullptr;
+  ts::Metrics::IntType *origin_server_unknown_cert         = nullptr;
+  ts::Metrics::IntType *origin_server_wrong_version        = nullptr;
+  ts::Metrics::IntType *origin_session_cache_hit           = nullptr;
+  ts::Metrics::IntType *origin_session_cache_miss          = nullptr;
+  ts::Metrics::IntType *origin_session_reused_count        = nullptr;
+  ts::Metrics::IntType *session_cache_eviction             = nullptr;
+  ts::Metrics::IntType *session_cache_hit                  = nullptr;
+  ts::Metrics::IntType *session_cache_lock_contention      = nullptr;
+  ts::Metrics::IntType *session_cache_miss                 = nullptr;
+  ts::Metrics::IntType *session_cache_new_session          = nullptr;
+  ts::Metrics::IntType *sni_name_set_failure               = nullptr;
+  ts::Metrics::IntType *total_attempts_handshake_count_in  = nullptr;
+  ts::Metrics::IntType *total_attempts_handshake_count_out = nullptr;
+  ts::Metrics::IntType *total_dyn_def_tls_record_count     = nullptr;
+  ts::Metrics::IntType *total_dyn_max_tls_record_count     = nullptr;
+  ts::Metrics::IntType *total_dyn_redo_tls_record_count    = nullptr;
+  ts::Metrics::IntType *total_handshake_time               = nullptr;
+  ts::Metrics::IntType *total_sslv3                        = nullptr;
+  ts::Metrics::IntType *total_success_handshake_count_in   = nullptr;
+  ts::Metrics::IntType *total_success_handshake_count_out  = nullptr;
+  ts::Metrics::IntType *total_ticket_keys_renewed          = nullptr;
+  ts::Metrics::IntType *total_tickets_created              = nullptr;
+  ts::Metrics::IntType *total_tickets_not_found            = nullptr;
+  ts::Metrics::IntType *total_tickets_renewed              = nullptr;
+  ts::Metrics::IntType *total_tickets_verified_old_key     = nullptr;
+  ts::Metrics::IntType *total_tickets_verified             = nullptr;
+  ts::Metrics::IntType *total_tlsv1                        = nullptr;
+  ts::Metrics::IntType *total_tlsv11                       = nullptr;
+  ts::Metrics::IntType *total_tlsv12                       = nullptr;
+  ts::Metrics::IntType *total_tlsv13                       = nullptr;
+  ts::Metrics::IntType *user_agent_bad_cert                = nullptr;
+  ts::Metrics::IntType *user_agent_cert_verify_failed      = nullptr;
+  ts::Metrics::IntType *user_agent_decryption_failed       = nullptr;
+  ts::Metrics::IntType *user_agent_expired_cert            = nullptr;
+  ts::Metrics::IntType *user_agent_other_errors            = nullptr;
+  ts::Metrics::IntType *user_agent_revoked_cert            = nullptr;
+  ts::Metrics::IntType *user_agent_session_hit             = nullptr;
+  ts::Metrics::IntType *user_agent_session_miss            = nullptr;
+  ts::Metrics::IntType *user_agent_session_timeout         = nullptr;
+  ts::Metrics::IntType *user_agent_sessions                = nullptr;
+  ts::Metrics::IntType *user_agent_unknown_ca              = nullptr;
+  ts::Metrics::IntType *user_agent_unknown_cert            = nullptr;
+  ts::Metrics::IntType *user_agent_wrong_version           = nullptr;
 };
 
-extern RecRawStatBlock *ssl_rsb;
-extern std::unordered_map<std::string, intptr_t> cipher_map;
+extern SSLStatsBlock ssl_rsb;
+extern std::unordered_map<std::string, Metrics::IntType *> cipher_map;
 
 // Initialize SSL statistics.
 void SSLInitializeStatistics();
diff --git a/iocore/net/SSLUtils.cc b/iocore/net/SSLUtils.cc
index 5c056e2977..def98ce212 100644
--- a/iocore/net/SSLUtils.cc
+++ b/iocore/net/SSLUtils.cc
@@ -224,7 +224,7 @@ ssl_new_cached_session(SSL *ssl, SSL_SESSION *sess)
     }
   }
 
-  SSL_INCREMENT_DYN_STAT(ssl_session_cache_new_session);
+  Metrics::increment(ssl_rsb.session_cache_new_session);
   session_cache->insertSession(sid, sess, ssl);
 
   // Call hook after new session is created
@@ -645,14 +645,14 @@ ssl_context_enable_tickets(SSL_CTX *ctx, const char *ticket_key_path)
 
   keyblock = ssl_create_ticket_keyblock(ticket_key_path);
 
-  // Increase the stats.
-  if (ssl_rsb != nullptr) { // ssl_rsb is not initialized during the first run.
-    SSL_INCREMENT_DYN_STAT(ssl_total_ticket_keys_renewed_stat);
+  // On the "first run" the metrics have not been initialized, so this has to check it.
+  if (ssl_rsb.total_ticket_keys_renewed) {
+    Metrics::increment(ssl_rsb.total_ticket_keys_renewed);
   }
 
-  // Setting the callback can only fail if OpenSSL does not recognize the
-  // SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB constant. we set the callback first
-  // so that we don't leave a ticket_key pointer attached if it fails.
+// Setting the callback can only fail if OpenSSL does not recognize the
+// SSL_CTRL_SET_TLSEXT_TICKET_KEY_CB constant. we set the callback first
+// so that we don't leave a ticket_key pointer attached if it fails.
 #ifdef HAVE_SSL_CTX_SET_TLSEXT_TICKET_KEY_EVP_CB
   if (SSL_CTX_set_tlsext_ticket_key_evp_cb(ctx, ssl_callback_session_ticket) == 0) {
 #else
@@ -1129,7 +1129,7 @@ ssl_callback_info(const SSL *ssl, int where, int ret)
         it = cipher_map.find(SSL_CIPHER_STAT_OTHER);
         ink_assert(it != cipher_map.end());
       }
-      SSL_INCREMENT_DYN_STAT((intptr_t)it->second);
+      Metrics::increment(it->second);
     }
   }
 }
diff --git a/iocore/net/Socks.cc b/iocore/net/Socks.cc
index b987116e8e..f8ab5b967a 100644
--- a/iocore/net/Socks.cc
+++ b/iocore/net/Socks.cc
@@ -164,7 +164,7 @@ SocksEntry::free()
   if (!action_.cancelled) {
     if (lerrno || !netVConnection) {
       Dbg(dbg_ctl_Socks, "retryevent: Sent errno %d to HTTP", lerrno);
-      NET_INCREMENT_DYN_STAT(socks_connections_unsuccessful_stat);
+      Metrics::increment(net_rsb.socks_connections_unsuccessful);
       action_.continuation->handleEvent(NET_EVENT_OPEN_FAILED, (void *)static_cast<intptr_t>(-lerrno));
     } else {
       netVConnection->do_io_read(this, 0, nullptr);
@@ -172,7 +172,7 @@ SocksEntry::free()
       netVConnection->action_ = action_; // assign the original continuation
       netVConnection->con.setRemote(&server_addr.sa);
       Dbg(dbg_ctl_Socks, "Sent success to HTTP");
-      NET_INCREMENT_DYN_STAT(socks_connections_successful_stat);
+      Metrics::increment(net_rsb.socks_connections_successful);
       action_.continuation->handleEvent(NET_EVENT_OPEN, netVConnection);
     }
   }
diff --git a/iocore/net/TLSBasicSupport.cc b/iocore/net/TLSBasicSupport.cc
index a27f9d5e49..2236334903 100644
--- a/iocore/net/TLSBasicSupport.cc
+++ b/iocore/net/TLSBasicSupport.cc
@@ -130,5 +130,5 @@ TLSBasicSupport::_record_tls_handshake_end_time()
   const ink_hrtime ssl_handshake_time = this->_tls_handshake_end_time - this->_tls_handshake_begin_time;
 
   Debug("ssl", "ssl handshake time:%" PRId64, ssl_handshake_time);
-  SSL_INCREMENT_DYN_STAT_EX(ssl_total_handshake_time_stat, ssl_handshake_time);
+  Metrics::increment(ssl_rsb.total_handshake_time, ssl_handshake_time);
 }
diff --git a/iocore/net/TLSSessionResumptionSupport.cc b/iocore/net/TLSSessionResumptionSupport.cc
index 79e45611d7..e1da969892 100644
--- a/iocore/net/TLSSessionResumptionSupport.cc
+++ b/iocore/net/TLSSessionResumptionSupport.cc
@@ -164,7 +164,7 @@ TLSSessionResumptionSupport::getSession(SSL *ssl, const unsigned char *id, int l
 
     // Double check the timeout
     if (is_ssl_session_timed_out(session)) {
-      SSL_INCREMENT_DYN_STAT(ssl_session_cache_miss);
+      Metrics::increment(ssl_rsb.session_cache_miss);
 // Due to bug in openssl, the timeout is checked, but only removed
 // from the openssl built-in hash table.  The external remove cb is not called
 #if 0 // This is currently eliminated, since it breaks things in odd ways (see TS-3710)
@@ -173,12 +173,12 @@ TLSSessionResumptionSupport::getSession(SSL *ssl, const unsigned char *id, int l
       SSL_SESSION_free(session);
       session = nullptr;
     } else {
-      SSL_INCREMENT_DYN_STAT(ssl_session_cache_hit);
+      Metrics::increment(ssl_rsb.session_cache_hit);
       this->_setSSLSessionCacheHit(true);
       this->_setSSLCurveNID(exdata->curve);
     }
   } else {
-    SSL_INCREMENT_DYN_STAT(ssl_session_cache_miss);
+    Metrics::increment(ssl_rsb.session_cache_miss);
   }
   return session;
 }
@@ -192,16 +192,16 @@ TLSSessionResumptionSupport::getOriginSession(SSL *ssl, const std::string &looku
   if (shared_sess != nullptr) {
     // Double check the timeout
     if (is_ssl_session_timed_out(shared_sess.get())) {
-      SSL_INCREMENT_DYN_STAT(ssl_origin_session_cache_miss);
+      Metrics::increment(ssl_rsb.origin_session_cache_miss);
       origin_sess_cache->remove_session(lookup_key);
       shared_sess.reset();
     } else {
-      SSL_INCREMENT_DYN_STAT(ssl_origin_session_cache_hit);
+      Metrics::increment(ssl_rsb.origin_session_cache_hit);
       this->_setSSLOriginSessionCacheHit(true);
       this->_setSSLCurveNID(curve);
     }
   } else {
-    SSL_INCREMENT_DYN_STAT(ssl_origin_session_cache_miss);
+    Metrics::increment(ssl_rsb.origin_session_cache_miss);
   }
   return shared_sess;
 }
@@ -247,7 +247,7 @@ TLSSessionResumptionSupport::_setSessionInformation(ssl_ticket_key_block *keyblo
 #endif
 
   Debug("ssl_session_ticket", "create ticket for a new session.");
-  SSL_INCREMENT_DYN_STAT(ssl_total_tickets_created_stat);
+  Metrics::increment(ssl_rsb.total_tickets_created);
   return 1;
 }
 
@@ -283,10 +283,10 @@ TLSSessionResumptionSupport::_getSessionInformation(ssl_ticket_key_block *keyblo
 
       Debug("ssl_session_ticket", "verify the ticket for an existing session.");
       // Increase the total number of decrypted tickets.
-      SSL_INCREMENT_DYN_STAT(ssl_total_tickets_verified_stat);
+      Metrics::increment(ssl_rsb.total_tickets_verified);
 
       if (i != 0) { // The number of tickets decrypted with "older" keys.
-        SSL_INCREMENT_DYN_STAT(ssl_total_tickets_verified_old_key_stat);
+        Metrics::increment(ssl_rsb.total_tickets_verified_old_key);
       }
 
       this->_setSSLSessionCacheHit(true);
@@ -304,7 +304,7 @@ TLSSessionResumptionSupport::_getSessionInformation(ssl_ticket_key_block *keyblo
   }
 
   Debug("ssl_session_ticket", "keyname is not consistent.");
-  SSL_INCREMENT_DYN_STAT(ssl_total_tickets_not_found_stat);
+  Metrics::increment(ssl_rsb.total_tickets_not_found);
   return 0;
 }
 
diff --git a/iocore/net/UnixNet.cc b/iocore/net/UnixNet.cc
index 44e1f3676b..52e6ee068b 100644
--- a/iocore/net/UnixNet.cc
+++ b/iocore/net/UnixNet.cc
@@ -90,7 +90,7 @@ public:
       // If we cannot get the lock don't stop just keep cleaning
       MUTEX_TRY_LOCK(lock, ne->get_mutex(), this_ethread());
       if (!lock.is_locked()) {
-        NET_INCREMENT_DYN_STAT(inactivity_cop_lock_acquire_failure_stat);
+        Metrics::increment(net_rsb.inactivity_cop_lock_acquire_failure);
         continue;
       }
 
@@ -117,20 +117,20 @@ public:
         ne->use_default_inactivity_timeout = true;
         ne->next_inactivity_timeout_at     = ink_get_hrtime() + ne->default_inactivity_timeout_in;
         ne->inactivity_timeout_in          = 0;
-        NET_INCREMENT_DYN_STAT(default_inactivity_timeout_applied_stat);
+        Metrics::increment(net_rsb.default_inactivity_timeout_applied);
       }
 
       if (ne->next_inactivity_timeout_at && ne->next_inactivity_timeout_at < now) {
         if (ne->is_default_inactivity_timeout()) {
           // track the connections that timed out due to default inactivity
           Dbg(dbg_ctl_inactivity_cop, "vc: %p timed out due to default inactivity timeout", ne);
-          NET_INCREMENT_DYN_STAT(default_inactivity_timeout_count_stat);
+          Metrics::increment(net_rsb.default_inactivity_timeout_count);
         }
         if (nh.keep_alive_queue.in(ne)) {
           // only stat if the connection is in keep-alive, there can be other inactivity timeouts
           ink_hrtime diff = (now - (ne->next_inactivity_timeout_at - ne->inactivity_timeout_in)) / HRTIME_SECOND;
-          NET_SUM_DYN_STAT(keep_alive_queue_timeout_total_stat, diff);
-          NET_INCREMENT_DYN_STAT(keep_alive_queue_timeout_count_stat);
+          Metrics::increment(net_rsb.keep_alive_queue_timeout_total, diff);
+          Metrics::increment(net_rsb.keep_alive_queue_timeout_count);
         }
         Dbg(dbg_ctl_inactivity_cop_verbose, "ne: %p now: %" PRId64 " timeout at: %" PRId64 " timeout in: %" PRId64, ne,
             ink_hrtime_to_sec(now), ne->next_inactivity_timeout_at, ne->inactivity_timeout_in);
diff --git a/iocore/net/UnixNetAccept.cc b/iocore/net/UnixNetAccept.cc
index 138208b6e7..2ac59090c2 100644
--- a/iocore/net/UnixNetAccept.cc
+++ b/iocore/net/UnixNetAccept.cc
@@ -81,7 +81,7 @@ net_accept(NetAccept *na, void *ep, bool blockable)
       count = res;
       goto Ldone;
     }
-    NET_SUM_GLOBAL_DYN_STAT(net_tcp_accept_stat, 1);
+    Metrics::increment(net_rsb.tcp_accept);
 
     vc = static_cast<UnixNetVConnection *>(na->getNetProcessor()->allocate_vc(e->ethread));
     if (!vc) {
@@ -89,7 +89,7 @@ net_accept(NetAccept *na, void *ep, bool blockable)
     }
 
     ++count;
-    NET_SUM_GLOBAL_DYN_STAT(net_connections_currently_open_stat, 1);
+    Metrics::increment(net_rsb.connections_currently_open);
     vc->id = net_next_connection_number();
     vc->con.move(con);
     vc->set_remote_addr(con.addr);
@@ -329,7 +329,7 @@ NetAccept::do_blocking_accept(EThread *t)
       check_throttle_warning(ACCEPT);
       // close the connection as we are in throttle state
       con.close();
-      NET_SUM_DYN_STAT(net_connections_throttled_in_stat, 1);
+      Metrics::increment(net_rsb.connections_throttled_in);
       continue;
     }
 
@@ -337,7 +337,7 @@ NetAccept::do_blocking_accept(EThread *t)
       return -1;
     }
 
-    NET_SUM_GLOBAL_DYN_STAT(net_tcp_accept_stat, 1);
+    Metrics::increment(net_rsb.tcp_accept);
 
     // Use 'nullptr' to Bypass thread allocator
     vc = (UnixNetVConnection *)this->getNetProcessor()->allocate_vc(nullptr);
@@ -345,7 +345,7 @@ NetAccept::do_blocking_accept(EThread *t)
       return -1;
     }
 
-    NET_SUM_GLOBAL_DYN_STAT(net_connections_currently_open_stat, 1);
+    Metrics::increment(net_rsb.connections_currently_open);
     vc->id = net_next_connection_number();
     vc->con.move(con);
     vc->set_remote_addr(con.addr);
@@ -400,14 +400,14 @@ NetAccept::acceptEvent(int event, void *ep)
   if (lock.is_locked()) {
     if (action_->cancelled) {
       e->cancel();
-      NET_DECREMENT_DYN_STAT(net_accepts_currently_open_stat);
+      Metrics::decrement(net_rsb.accepts_currently_open);
       delete this;
       return EVENT_DONE;
     }
 
     int res;
     if ((res = accept_fn(this, e, false)) < 0) {
-      NET_DECREMENT_DYN_STAT(net_accepts_currently_open_stat);
+      Metrics::decrement(net_rsb.accepts_currently_open);
       /* INKqa11179 */
       Warning("Accept on port %d failed with error no %d", ats_ip_port_host_order(&server.addr), res);
       Warning("Traffic Server may be unable to accept more network"
@@ -445,11 +445,11 @@ NetAccept::acceptFastEvent(int event, void *ep)
       if (check_net_throttle(ACCEPT)) {
         // close the connection as we are in throttle state
         con.close();
-        NET_SUM_DYN_STAT(net_connections_throttled_in_stat, 1);
+        Metrics::increment(net_rsb.connections_throttled_in);
         continue;
       }
       Dbg(dbg_ctl_iocore_net, "accepted a new socket: %d", fd);
-      NET_SUM_GLOBAL_DYN_STAT(net_tcp_accept_stat, 1);
+      Metrics::increment(net_rsb.tcp_accept);
       if (opt.send_bufsize > 0) {
         if (unlikely(SocketManager::set_sndbuf_size(fd, opt.send_bufsize))) {
           bufsz = ROUNDUP(opt.send_bufsize, 1024);
@@ -498,7 +498,7 @@ NetAccept::acceptFastEvent(int event, void *ep)
     vc = (UnixNetVConnection *)this->getNetProcessor()->allocate_vc(e->ethread);
     ink_release_assert(vc);
 
-    NET_SUM_GLOBAL_DYN_STAT(net_connections_currently_open_stat, 1);
+    Metrics::increment(net_rsb.connections_currently_open);
     vc->id = net_next_connection_number();
     vc->con.move(con);
     vc->set_remote_addr(con.addr);
@@ -541,7 +541,7 @@ Ldone:
 Lerror:
   server.close();
   e->cancel();
-  NET_DECREMENT_DYN_STAT(net_accepts_currently_open_stat);
+  Metrics::decrement(net_rsb.accepts_currently_open);
   delete this;
   return EVENT_DONE;
 }
@@ -558,7 +558,7 @@ NetAccept::acceptLoopEvent(int event, Event *e)
   }
 
   // Don't think this ever happens ...
-  NET_DECREMENT_DYN_STAT(net_accepts_currently_open_stat);
+  Metrics::decrement(net_rsb.accepts_currently_open);
   delete this;
   return EVENT_DONE;
 }
diff --git a/iocore/net/UnixNetProcessor.cc b/iocore/net/UnixNetProcessor.cc
index 87ed2035cb..11e19fc949 100644
--- a/iocore/net/UnixNetProcessor.cc
+++ b/iocore/net/UnixNetProcessor.cc
@@ -80,11 +80,9 @@ Action *
 UnixNetProcessor::accept_internal(Continuation *cont, int fd, AcceptOptions const &opt)
 {
   static int net_accept_number = 0;
-
-  ProxyMutex *mutex  = this_ethread()->mutex.get();
-  int accept_threads = opt.accept_threads; // might be changed.
-  IpEndpoint accept_ip;                    // local binding address.
-  int listen_per_thread = 0;
+  int accept_threads           = opt.accept_threads; // might be changed.
+  int listen_per_thread        = 0;
+  IpEndpoint accept_ip; // local binding address.
 
   NetAccept *na = createNetAccept(opt);
   na->id        = ink_atomic_increment(&net_accept_number, 1);
@@ -99,7 +97,7 @@ UnixNetProcessor::accept_internal(Continuation *cont, int fd, AcceptOptions cons
     Fatal("Please disable accept_threads or exec_thread.listen");
   }
 
-  NET_INCREMENT_DYN_STAT(net_accepts_currently_open_stat);
+  Metrics::increment(net_rsb.accepts_currently_open);
 
   // We've handled the config stuff at start up, but there are a few cases
   // we must handle at this point.
diff --git a/iocore/net/UnixNetVConnection.cc b/iocore/net/UnixNetVConnection.cc
index ee7fe8a93f..c97fc70f97 100644
--- a/iocore/net/UnixNetVConnection.cc
+++ b/iocore/net/UnixNetVConnection.cc
@@ -187,9 +187,8 @@ write_signal_error(NetHandler *nh, UnixNetVConnection *vc, int lerrno)
 static void
 read_from_net(NetHandler *nh, UnixNetVConnection *vc, EThread *thread)
 {
-  NetState *s       = &vc->read;
-  ProxyMutex *mutex = thread->mutex.get();
-  int64_t r         = 0;
+  NetState *s = &vc->read;
+  int64_t r   = 0;
 
   MUTEX_TRY_LOCK(lock, s->vio.mutex, thread);
 
@@ -263,7 +262,7 @@ read_from_net(NetHandler *nh, UnixNetVConnection *vc, EThread *thread)
       msg.msg_iovlen  = niov;
       r               = SocketManager::recvmsg(vc->con.fd, &msg, 0);
 
-      NET_INCREMENT_DYN_STAT(net_calls_to_read_stat);
+      Metrics::increment(net_rsb.calls_to_read);
 
       total_read += rattempted;
     } while (rattempted && r == rattempted && total_read < toread);
@@ -279,7 +278,7 @@ read_from_net(NetHandler *nh, UnixNetVConnection *vc, EThread *thread)
     // check for errors
     if (r <= 0) {
       if (r == -EAGAIN || r == -ENOTCONN) {
-        NET_INCREMENT_DYN_STAT(net_calls_to_read_nodata_stat);
+        Metrics::increment(net_rsb.calls_to_read_nodata);
         vc->read.triggered = 0;
         nh->read_ready_list.remove(vc);
         return;
@@ -295,7 +294,8 @@ read_from_net(NetHandler *nh, UnixNetVConnection *vc, EThread *thread)
       read_signal_error(nh, vc, static_cast<int>(-r));
       return;
     }
-    NET_SUM_DYN_STAT(net_read_bytes_stat, r);
+    Metrics::increment(net_rsb.read_bytes, r);
+    Metrics::increment(net_rsb.read_bytes_count);
 
     // Add data to buffer and signal continuation.
     buf.writer()->fill(r);
@@ -347,19 +347,15 @@ read_from_net(NetHandler *nh, UnixNetVConnection *vc, EThread *thread)
 void
 write_to_net(NetHandler *nh, UnixNetVConnection *vc, EThread *thread)
 {
-  ProxyMutex *mutex = thread->mutex.get();
-
-  NET_INCREMENT_DYN_STAT(net_calls_to_writetonet_stat);
-
+  Metrics::increment(net_rsb.calls_to_writetonet);
   write_to_net_io(nh, vc, thread);
 }
 
 void
 write_to_net_io(NetHandler *nh, UnixNetVConnection *vc, EThread *thread)
 {
-  NetState *s       = &vc->write;
-  ProxyMutex *mutex = thread->mutex.get();
-  Continuation *c   = vc->write.vio.cont;
+  NetState *s     = &vc->write;
+  Continuation *c = vc->write.vio.cont;
 
   MUTEX_TRY_LOCK(lock, s->vio.mutex, thread);
 
@@ -476,7 +472,8 @@ write_to_net_io(NetHandler *nh, UnixNetVConnection *vc, EThread *thread)
   int64_t r             = vc->load_buffer_and_write(towrite, buf, total_written, needs);
 
   if (total_written > 0) {
-    NET_SUM_DYN_STAT(net_write_bytes_stat, total_written);
+    Metrics::increment(net_rsb.write_bytes, total_written);
+    Metrics::increment(net_rsb.write_bytes_count);
     s->vio.ndone += total_written;
     net_activity(vc, thread);
   }
@@ -487,7 +484,7 @@ write_to_net_io(NetHandler *nh, UnixNetVConnection *vc, EThread *thread)
   // check for errors
   if (r < 0) { // if the socket was not ready, add to WaitList
     if (r == -EAGAIN || r == -ENOTCONN || -r == EINPROGRESS) {
-      NET_INCREMENT_DYN_STAT(net_calls_to_write_nodata_stat);
+      Metrics::increment(net_rsb.calls_to_write_nodata);
       if ((needs & EVENTIO_WRITE) == EVENTIO_WRITE) {
         vc->write.triggered = 0;
         nh->write_ready_list.remove(vc);
@@ -919,7 +916,7 @@ UnixNetVConnection::load_buffer_and_write(int64_t towrite, MIOBufferAccessor &bu
     int flags       = 0;
 
     if (!this->con.is_connected && this->options.f_tcp_fastopen) {
-      NET_INCREMENT_DYN_STAT(net_fastopen_attempts_stat);
+      Metrics::increment(net_rsb.fastopen_attempts);
       flags = MSG_FASTOPEN;
     }
     r = SocketManager::sendmsg(con.fd, &msg, flags);
@@ -929,7 +926,7 @@ UnixNetVConnection::load_buffer_and_write(int64_t towrite, MIOBufferAccessor &bu
           this->con.is_connected = true;
         }
       } else {
-        NET_INCREMENT_DYN_STAT(net_fastopen_successes_stat);
+        Metrics::increment(net_rsb.fastopen_successes);
         this->con.is_connected = true;
       }
     }
@@ -939,8 +936,7 @@ UnixNetVConnection::load_buffer_and_write(int64_t towrite, MIOBufferAccessor &bu
       total_written += r;
     }
 
-    ProxyMutex *mutex = thread->mutex.get();
-    NET_INCREMENT_DYN_STAT(net_calls_to_write_stat);
+    Metrics::increment(net_rsb.calls_to_write);
   } while (r == try_to_write && total_written < towrite);
 
   tmp_reader->dealloc();
@@ -1163,7 +1159,7 @@ UnixNetVConnection::connectUp(EThread *t, int fd)
   if (check_net_throttle(CONNECT)) {
     check_throttle_warning(CONNECT);
     res = -ENET_THROTTLING;
-    NET_INCREMENT_DYN_STAT(net_connections_throttled_out_stat);
+    Metrics::increment(net_rsb.connections_throttled_out);
     goto fail;
   }
 
@@ -1216,7 +1212,7 @@ UnixNetVConnection::connectUp(EThread *t, int fd)
   }
 
   // Did not fail, increment connection count
-  NET_SUM_GLOBAL_DYN_STAT(net_connections_currently_open_stat, 1);
+  Metrics::increment(net_rsb.connections_currently_open);
   ink_release_assert(con.fd != NO_FD);
 
   // Setup a timeout callback handler.
@@ -1292,7 +1288,7 @@ UnixNetVConnection::free_thread(EThread *t)
 
   // close socket fd
   if (con.fd != NO_FD) {
-    NET_SUM_GLOBAL_DYN_STAT(net_connections_currently_open_stat, -1);
+    Metrics::decrement(net_rsb.connections_currently_open);
   }
   con.close();
 
diff --git a/proxy/http/Http1ClientSession.cc b/proxy/http/Http1ClientSession.cc
index ff1f58bbfd..023fd88e47 100644
--- a/proxy/http/Http1ClientSession.cc
+++ b/proxy/http/Http1ClientSession.cc
@@ -118,7 +118,7 @@ Http1ClientSession::free()
 #endif
 
   if (conn_decrease) {
-    HTTP_DECREMENT_DYN_STAT(http_current_client_connections_stat);
+    Metrics::decrement(http_rsb.current_client_connections);
     conn_decrease = false;
   }
 
@@ -154,26 +154,26 @@ Http1ClientSession::new_connection(NetVConnection *new_vc, MIOBuffer *iobuf, IOB
 
   schedule_event = nullptr;
 
-  HTTP_INCREMENT_DYN_STAT(http_current_client_connections_stat);
+  Metrics::increment(http_rsb.current_client_connections);
   conn_decrease = true;
-  HTTP_INCREMENT_DYN_STAT(http_total_client_connections_stat);
+  Metrics::increment(http_rsb.total_client_connections);
   if (static_cast<HttpProxyPort::TransportType>(new_vc->attributes) == HttpProxyPort::TRANSPORT_SSL) {
-    HTTP_INCREMENT_DYN_STAT(https_total_client_connections_stat);
+    Metrics::increment(http_rsb.https_total_client_connections);
   }
 
   /* inbound requests stat should be incremented here, not after the
    * header has been read */
-  HTTP_INCREMENT_DYN_STAT(http_total_incoming_connections_stat);
+  Metrics::increment(http_rsb.total_incoming_connections);
 
   // check what type of socket address we just accepted
   // by looking at the address family value of sockaddr_storage
   // and logging to stat system
   switch (new_vc->get_remote_addr()->sa_family) {
   case AF_INET:
-    HTTP_INCREMENT_DYN_STAT(http_total_client_connections_ipv4_stat);
+    Metrics::increment(http_rsb.total_client_connections_ipv4);
     break;
   case AF_INET6:
-    HTTP_INCREMENT_DYN_STAT(http_total_client_connections_ipv6_stat);
+    Metrics::increment(http_rsb.total_client_connections_ipv6);
     break;
   default:
     // don't do anything if the address family is not ipv4 or ipv6
@@ -263,7 +263,6 @@ Http1ClientSession::do_io_close(int alerrno)
     _reader->consume(_reader->read_avail());
   } else {
     HttpSsnDebug("[%" PRId64 "] session closed", con_id);
-    HTTP_SUM_DYN_STAT(http_transactions_per_client_con, transact_count);
     read_state = HCS_CLOSED;
 
     if (_vc) {
@@ -514,12 +513,12 @@ Http1ClientSession::attach_server_session(PoolableSession *ssession, bool transa
 void
 Http1ClientSession::increment_current_active_connections_stat()
 {
-  HTTP_INCREMENT_DYN_STAT(http_current_active_client_connections_stat);
+  Metrics::increment(http_rsb.current_active_client_connections);
 }
 void
 Http1ClientSession::decrement_current_active_connections_stat()
 {
-  HTTP_DECREMENT_DYN_STAT(http_current_active_client_connections_stat);
+  Metrics::decrement(http_rsb.current_active_client_connections);
 }
 
 void
diff --git a/proxy/http/Http1ClientTransaction.cc b/proxy/http/Http1ClientTransaction.cc
index 3309063989..320c331688 100644
--- a/proxy/http/Http1ClientTransaction.cc
+++ b/proxy/http/Http1ClientTransaction.cc
@@ -59,11 +59,11 @@ Http1ClientTransaction::allow_half_open() const
 void
 Http1ClientTransaction::increment_transactions_stat()
 {
-  HTTP_INCREMENT_DYN_STAT(http_current_client_transactions_stat);
+  Metrics::increment(http_rsb.current_client_transactions);
 }
 
 void
 Http1ClientTransaction::decrement_transactions_stat()
 {
-  HTTP_DECREMENT_DYN_STAT(http_current_client_transactions_stat);
+  Metrics::decrement(http_rsb.current_client_transactions);
 }
diff --git a/proxy/http/Http1ServerSession.cc b/proxy/http/Http1ServerSession.cc
index eab2736e9a..43f0b01b53 100644
--- a/proxy/http/Http1ServerSession.cc
+++ b/proxy/http/Http1ServerSession.cc
@@ -80,8 +80,8 @@ Http1ServerSession::new_connection(NetVConnection *new_vc, MIOBuffer *iobuf, IOB
   con_id = ProxySession::next_connection_id();
 
   magic = HTTP_SS_MAGIC_ALIVE;
-  HTTP_SUM_GLOBAL_DYN_STAT(http_current_server_connections_stat, 1); // Update the true global stat
-  HTTP_INCREMENT_DYN_STAT(http_total_server_connections_stat);
+  Metrics::increment(http_rsb.current_server_connections);
+  Metrics::increment(http_rsb.total_server_connections);
 
   if (iobuf == nullptr) {
     read_buffer = new_MIOBuffer(HTTP_SERVER_RESP_HDR_BUFFER_INDEX);
@@ -110,8 +110,7 @@ Http1ServerSession::do_io_close(int alerrno)
       w.print("[{}] session close: nevtc {:x}", con_id, _vc);
     }
 
-    HTTP_SUM_GLOBAL_DYN_STAT(http_current_server_connections_stat, -1); // Make sure to work on the global stat
-    HTTP_SUM_DYN_STAT(http_transactions_per_server_con, transact_count);
+    Metrics::decrement(http_rsb.current_server_connections);
 
     // Update upstream connection tracking data if present.
     this->release_outbound_connection_tracking();
@@ -126,7 +125,7 @@ Http1ServerSession::do_io_close(int alerrno)
     _vc = nullptr;
 
     if (to_parent_proxy) {
-      HTTP_DECREMENT_DYN_STAT(http_current_parent_proxy_connections_stat);
+      Metrics::decrement(http_rsb.current_parent_proxy_connections);
     }
   }
 
@@ -208,7 +207,7 @@ Http1ServerSession ::release_transaction()
   // Private sessions are never released back to the shared pool
   if (this->is_private() || sharing_match == 0) {
     if (this->is_private()) {
-      HTTP_INCREMENT_DYN_STAT(http_origin_close_private);
+      Metrics::increment(http_rsb.origin_close_private);
     }
     this->do_io_close();
   } else if (state == SSN_TO_RELEASE) {
@@ -226,7 +225,7 @@ Http1ServerSession ::release_transaction()
       //  due to lock contention
       // FIX:  should retry instead of closing
       do_io_close(HTTP_ERRNO);
-      HTTP_INCREMENT_DYN_STAT(http_origin_shutdown_pool_lock_contention);
+      Metrics::increment(http_rsb.origin_shutdown_pool_lock_contention);
     } else {
       // The session was successfully put into the session
       //    manager and it will manage it
diff --git a/proxy/http/Http1ServerTransaction.cc b/proxy/http/Http1ServerTransaction.cc
index 55c48a77b5..68c5eea3a8 100644
--- a/proxy/http/Http1ServerTransaction.cc
+++ b/proxy/http/Http1ServerTransaction.cc
@@ -33,13 +33,13 @@ Http1ServerTransaction::release()
 void
 Http1ServerTransaction::increment_transactions_stat()
 {
-  HTTP_INCREMENT_DYN_STAT(http_current_server_transactions_stat);
+  Metrics::increment(http_rsb.current_server_transactions);
 }
 
 void
 Http1ServerTransaction::decrement_transactions_stat()
 {
-  HTTP_DECREMENT_DYN_STAT(http_current_server_transactions_stat);
+  Metrics::decrement(http_rsb.current_server_transactions);
 }
 
 void
diff --git a/proxy/http/HttpCacheSM.cc b/proxy/http/HttpCacheSM.cc
index 8fce829348..c1255244af 100644
--- a/proxy/http/HttpCacheSM.cc
+++ b/proxy/http/HttpCacheSM.cc
@@ -107,7 +107,7 @@ HttpCacheSM::state_cache_open_read(int event, void *data)
 
   switch (event) {
   case CACHE_EVENT_OPEN_READ:
-    HTTP_INCREMENT_DYN_STAT(http_current_cache_connections_stat);
+    Metrics::increment(http_rsb.current_cache_connections);
     ink_assert((cache_read_vc == nullptr) || master_sm->t_state.redirect_info.redirect_in_process);
     if (cache_read_vc) {
       // redirect follow in progress, close the previous cache_read_vc
@@ -186,7 +186,7 @@ HttpCacheSM::state_cache_open_write(int event, void *data)
 
   switch (event) {
   case CACHE_EVENT_OPEN_WRITE:
-    HTTP_INCREMENT_DYN_STAT(http_current_cache_connections_stat);
+    Metrics::increment(http_rsb.current_cache_connections);
     ink_assert(cache_write_vc == nullptr);
     cache_write_vc = static_cast<CacheVConnection *>(data);
     open_write_cb  = true;
diff --git a/proxy/http/HttpCacheSM.h b/proxy/http/HttpCacheSM.h
index cb330c027a..3c77520c15 100644
--- a/proxy/http/HttpCacheSM.h
+++ b/proxy/http/HttpCacheSM.h
@@ -160,7 +160,7 @@ public:
   abort_read()
   {
     if (cache_read_vc) {
-      HTTP_DECREMENT_DYN_STAT(http_current_cache_connections_stat);
+      Metrics::decrement(http_rsb.current_cache_connections);
       cache_read_vc->do_io_close(0); // passing zero as aborting read is not an error
       cache_read_vc = nullptr;
     }
@@ -169,7 +169,7 @@ public:
   abort_write()
   {
     if (cache_write_vc) {
-      HTTP_DECREMENT_DYN_STAT(http_current_cache_connections_stat);
+      Metrics::decrement(http_rsb.current_cache_connections);
       cache_write_vc->do_io_close(0); // passing zero as aborting write is not an error
       cache_write_vc = nullptr;
     }
@@ -178,7 +178,7 @@ public:
   close_write()
   {
     if (cache_write_vc) {
-      HTTP_DECREMENT_DYN_STAT(http_current_cache_connections_stat);
+      Metrics::decrement(http_rsb.current_cache_connections);
       cache_write_vc->do_io_close();
       cache_write_vc = nullptr;
     }
@@ -187,7 +187,7 @@ public:
   close_read()
   {
     if (cache_read_vc) {
-      HTTP_DECREMENT_DYN_STAT(http_current_cache_connections_stat);
+      Metrics::decrement(http_rsb.current_cache_connections);
       cache_read_vc->do_io_close();
       cache_read_vc = nullptr;
     }
diff --git a/proxy/http/HttpConfig.cc b/proxy/http/HttpConfig.cc
index f5594657d1..6dfcc3dc73 100644
--- a/proxy/http/HttpConfig.cc
+++ b/proxy/http/HttpConfig.cc
@@ -52,13 +52,6 @@ extern void HostDB_Config_Init();
   REC_EstablishStaticConfigByte(_ix, _n);      \
   REC_RegisterConfigUpdateFunc(_n, http_config_cb, NULL)
 
-RecRawStatBlock *http_rsb;
-#define HTTP_CLEAR_DYN_STAT(x)          \
-  do {                                  \
-    RecSetRawStatSum(http_rsb, x, 0);   \
-    RecSetRawStatCount(http_rsb, x, 0); \
-  } while (0);
-
 class HttpConfigCont : public Continuation
 {
 public:
@@ -303,786 +296,264 @@ http_insert_forwarded_cb(const char *name, RecDataT dtype, RecData data, void *c
 void
 register_stat_callbacks()
 {
-  // Dynamic stats
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.background_fill_current_count", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_background_fill_current_count_stat, RecRawStatSyncSum);
-  HTTP_CLEAR_DYN_STAT(http_background_fill_current_count_stat);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.current_client_connections", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_current_client_connections_stat, RecRawStatSyncSum);
-  HTTP_CLEAR_DYN_STAT(http_current_client_connections_stat);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.current_active_client_connections", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_current_active_client_connections_stat, RecRawStatSyncSum);
-  HTTP_CLEAR_DYN_STAT(http_current_active_client_connections_stat);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.websocket.current_active_client_connections", RECD_INT,
-                     RECP_NON_PERSISTENT, (int)http_websocket_current_active_client_connections_stat, RecRawStatSyncSum);
-  HTTP_CLEAR_DYN_STAT(http_websocket_current_active_client_connections_stat);
-
-  // Tunnel Stats
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.tunnel.current_active_connections", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)tunnel_current_active_connections_stat, RecRawStatSyncSum);
-  HTTP_CLEAR_DYN_STAT(tunnel_current_active_connections_stat);
-
-  // Current Transaction Stats
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.current_client_transactions", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_current_client_transactions_stat, RecRawStatSyncSum);
-  HTTP_CLEAR_DYN_STAT(http_current_client_transactions_stat);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.current_server_transactions", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_current_server_transactions_stat, RecRawStatSyncSum);
-  HTTP_CLEAR_DYN_STAT(http_current_server_transactions_stat);
-  // Total connections stats
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.completed_requests", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_completed_requests_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.total_incoming_connections", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_total_incoming_connections_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.total_client_connections", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_total_client_connections_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.total_client_connections_ipv4", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_total_client_connections_ipv4_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.total_client_connections_ipv6", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_total_client_connections_ipv6_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.total_server_connections", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_total_server_connections_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.total_parent_proxy_connections", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_total_parent_proxy_connections_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.total_parent_retries", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_total_parent_retries_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.total_parent_switches", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_total_parent_switches_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.total_parent_retries_exhausted", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_total_parent_retries_exhausted_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.total_parent_marked_down_count", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_total_parent_marked_down_count, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.background_fill_total_count", RECD_INT, RECP_PERSISTENT,
-                     (int)http_background_fill_total_count_stat, RecRawStatSyncCount);
-
-  // Stats to track causes of ATS initiated origin shutdowns
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.pool_lock_contention", RECD_INT,
-                     RECP_NON_PERSISTENT, (int)http_origin_shutdown_pool_lock_contention, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.migration_failure", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_origin_shutdown_migration_failure, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.tunnel_server", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_origin_shutdown_tunnel_server, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.tunnel_server_no_keep_alive", RECD_INT,
-                     RECP_NON_PERSISTENT, (int)http_origin_shutdown_tunnel_server_no_keep_alive, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.tunnel_server_eos", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_origin_shutdown_tunnel_server_eos, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.tunnel_server_plugin_tunnel", RECD_INT,
-                     RECP_NON_PERSISTENT, (int)http_origin_shutdown_tunnel_server_plugin_tunnel, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.tunnel_server_detach", RECD_INT,
-                     RECP_NON_PERSISTENT, (int)http_origin_shutdown_tunnel_server_detach, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.tunnel_client", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_origin_shutdown_tunnel_client, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.tunnel_transform_read", RECD_INT,
-                     RECP_NON_PERSISTENT, (int)http_origin_shutdown_tunnel_transform_read, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.release_no_sharing", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_origin_shutdown_release_no_sharing, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.release_no_server", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_origin_shutdown_release_no_server, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.release_no_keep_alive", RECD_INT,
-                     RECP_NON_PERSISTENT, (int)http_origin_shutdown_release_no_keep_alive, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.release_invalid_response", RECD_INT,
-                     RECP_NON_PERSISTENT, (int)http_origin_shutdown_release_invalid_response, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.release_invalid_request", RECD_INT,
-                     RECP_NON_PERSISTENT, (int)http_origin_shutdown_release_invalid_request, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.release_modified", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_origin_shutdown_release_modified, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.release_misc", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_origin_shutdown_release_misc, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.cleanup_entry", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_origin_shutdown_cleanup_entry, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_shutdown.tunnel_abort", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_origin_shutdown_tunnel_abort, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin.reuse", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_origin_reuse, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin.not_found", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_origin_not_found, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin.reuse_fail", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_origin_reuse_fail, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin.make_new", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_origin_make_new, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin.no_sharing", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_origin_no_sharing, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin.body", RECD_INT, RECP_NON_PERSISTENT, (int)http_origin_body,
-                     RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin.private", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_origin_private, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin.close_private", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_origin_close_private, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin.raw", RECD_INT, RECP_NON_PERSISTENT, (int)http_origin_raw,
-                     RecRawStatSyncCount);
-
-  // Upstream current connections stats
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.current_parent_proxy_connections", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_current_parent_proxy_connections_stat, RecRawStatSyncSum);
-  HTTP_CLEAR_DYN_STAT(http_current_parent_proxy_connections_stat);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.current_server_connections", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_current_server_connections_stat, RecRawStatSyncSum);
-  HTTP_CLEAR_DYN_STAT(http_current_server_connections_stat);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.current_cache_connections", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_current_cache_connections_stat, RecRawStatSyncSum);
-  HTTP_CLEAR_DYN_STAT(http_current_cache_connections_stat);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.avg_transactions_per_client_connection", RECD_FLOAT,
-                     RECP_PERSISTENT, (int)http_transactions_per_client_con, RecRawStatSyncAvg);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.avg_transactions_per_server_connection", RECD_FLOAT,
-                     RECP_PERSISTENT, (int)http_transactions_per_server_con, RecRawStatSyncAvg);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_counts.errors.pre_accept_hangups", RECD_COUNTER,
-                     RECP_PERSISTENT, (int)http_ua_msecs_counts_errors_pre_accept_hangups_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_totaltime.errors.pre_accept_hangups", RECD_FLOAT,
-                     RECP_PERSISTENT, (int)http_ua_msecs_counts_errors_pre_accept_hangups_stat,
-                     RecRawStatSyncIntMsecsToFloatSeconds);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.pooled_server_connections", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)http_pooled_server_connections_stat, RecRawStatSyncSum);
-  HTTP_CLEAR_DYN_STAT(http_pooled_server_connections_stat);
-
-  // Transactional stats
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.incoming_requests", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_incoming_requests_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.outgoing_requests", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_outgoing_requests_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.incoming_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_incoming_responses_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.invalid_client_requests", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_invalid_client_requests_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.missing_host_hdr", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_missing_host_hdr_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.get_requests", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_get_requests_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.head_requests", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_head_requests_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.trace_requests", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_trace_requests_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.options_requests", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_options_requests_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.post_requests", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_post_requests_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.put_requests", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_put_requests_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.push_requests", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_push_requests_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.delete_requests", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_delete_requests_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.purge_requests", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_purge_requests_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.connect_requests", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_connect_requests_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.extension_method_requests", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_extension_method_requests_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.http_proxy_loop_detected", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_proxy_loop_detected_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.http_proxy_mh_loop_detected", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_proxy_mh_loop_detected_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.broken_server_connections", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_broken_server_connections_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_lookups", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_lookups_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_writes", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_writes_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_updates", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_updates_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_deletes", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_deletes_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tunnels", RECD_COUNTER, RECP_PERSISTENT, (int)http_tunnels_stat,
-                     RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.parent_proxy_transaction_time", RECD_INT, RECP_PERSISTENT,
-                     (int)http_parent_proxy_transaction_time_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.user_agent_request_header_total_size", RECD_INT, RECP_PERSISTENT,
-                     (int)http_user_agent_request_header_total_size_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.user_agent_response_header_total_size", RECD_INT, RECP_PERSISTENT,
-                     (int)http_user_agent_response_header_total_size_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.user_agent_request_document_total_size", RECD_INT, RECP_PERSISTENT,
-                     (int)http_user_agent_request_document_total_size_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.user_agent_response_document_total_size", RECD_INT,
-                     RECP_PERSISTENT, (int)http_user_agent_response_document_total_size_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_server_request_header_total_size", RECD_INT,
-                     RECP_PERSISTENT, (int)http_origin_server_request_header_total_size_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_server_response_header_total_size", RECD_INT,
-                     RECP_PERSISTENT, (int)http_origin_server_response_header_total_size_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_server_request_document_total_size", RECD_INT,
-                     RECP_PERSISTENT, (int)http_origin_server_request_document_total_size_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_server_response_document_total_size", RECD_INT,
-                     RECP_PERSISTENT, (int)http_origin_server_response_document_total_size_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.parent_proxy_request_total_bytes", RECD_INT, RECP_PERSISTENT,
-                     (int)http_parent_proxy_request_total_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.parent_proxy_response_total_bytes", RECD_INT, RECP_PERSISTENT,
-                     (int)http_parent_proxy_response_total_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.pushed_response_header_total_size", RECD_INT, RECP_PERSISTENT,
-                     (int)http_pushed_response_header_total_size_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.pushed_document_total_size", RECD_INT, RECP_PERSISTENT,
-                     (int)http_pushed_document_total_size_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.response_document_size_100", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_document_size_100_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.response_document_size_1K", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_document_size_1K_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.response_document_size_3K", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_document_size_3K_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.response_document_size_5K", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_document_size_5K_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.response_document_size_10K", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_document_size_10K_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.response_document_size_1M", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_document_size_1M_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.response_document_size_inf", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_document_size_inf_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.request_document_size_100", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_request_document_size_100_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.request_document_size_1K", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_request_document_size_1K_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.request_document_size_3K", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_request_document_size_3K_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.request_document_size_5K", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_request_document_size_5K_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.request_document_size_10K", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_request_document_size_10K_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.request_document_size_1M", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_request_document_size_1M_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.request_document_size_inf", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_request_document_size_inf_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.user_agent_speed_bytes_per_sec_100", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_user_agent_speed_bytes_per_sec_100_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.user_agent_speed_bytes_per_sec_1K", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_user_agent_speed_bytes_per_sec_1K_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.user_agent_speed_bytes_per_sec_10K", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_user_agent_speed_bytes_per_sec_10K_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.user_agent_speed_bytes_per_sec_100K", RECD_COUNTER,
-                     RECP_PERSISTENT, (int)http_user_agent_speed_bytes_per_sec_100K_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.user_agent_speed_bytes_per_sec_1M", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_user_agent_speed_bytes_per_sec_1M_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.user_agent_speed_bytes_per_sec_10M", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_user_agent_speed_bytes_per_sec_10M_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.user_agent_speed_bytes_per_sec_100M", RECD_COUNTER,
-                     RECP_PERSISTENT, (int)http_user_agent_speed_bytes_per_sec_100M_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_server_speed_bytes_per_sec_100", RECD_COUNTER,
-                     RECP_PERSISTENT, (int)http_origin_server_speed_bytes_per_sec_100_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_server_speed_bytes_per_sec_1K", RECD_COUNTER,
-                     RECP_PERSISTENT, (int)http_origin_server_speed_bytes_per_sec_1K_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_server_speed_bytes_per_sec_10K", RECD_COUNTER,
-                     RECP_PERSISTENT, (int)http_origin_server_speed_bytes_per_sec_10K_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_server_speed_bytes_per_sec_100K", RECD_COUNTER,
-                     RECP_PERSISTENT, (int)http_origin_server_speed_bytes_per_sec_100K_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_server_speed_bytes_per_sec_1M", RECD_COUNTER,
-                     RECP_PERSISTENT, (int)http_origin_server_speed_bytes_per_sec_1M_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_server_speed_bytes_per_sec_10M", RECD_COUNTER,
-                     RECP_PERSISTENT, (int)http_origin_server_speed_bytes_per_sec_10M_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_server_speed_bytes_per_sec_100M", RECD_COUNTER,
-                     RECP_PERSISTENT, (int)http_origin_server_speed_bytes_per_sec_100M_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.total_transactions_time", RECD_INT, RECP_PERSISTENT,
-                     (int)http_total_transactions_time_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_hit_fresh", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_hit_fresh_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_hit_mem_fresh", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_hit_mem_fresh_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_hit_rww", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_hit_rww_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_hit_revalidated", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_hit_reval_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_hit_ims", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_hit_ims_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_hit_stale_served", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_hit_stale_served_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_miss_cold", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_miss_cold_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_miss_changed", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_miss_changed_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_miss_client_no_cache", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_miss_client_no_cache_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_miss_client_not_cacheable", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_miss_uncacheable_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_miss_ims", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_miss_ims_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_read_error", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_read_error_stat, RecRawStatSyncCount);
-
-  /////////////////////////////////////////
-  // Bandwidth Savings Transaction Stats //
-  /////////////////////////////////////////
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_hit_count_stat", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_tcp_hit_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_hit_user_agent_bytes_stat", RECD_INT, RECP_PERSISTENT,
-                     (int)http_tcp_hit_user_agent_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_hit_origin_server_bytes_stat", RECD_INT, RECP_PERSISTENT,
-                     (int)http_tcp_hit_origin_server_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_miss_count_stat", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_tcp_miss_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_miss_user_agent_bytes_stat", RECD_INT, RECP_PERSISTENT,
-                     (int)http_tcp_miss_user_agent_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_miss_origin_server_bytes_stat", RECD_INT, RECP_PERSISTENT,
-                     (int)http_tcp_miss_origin_server_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_expired_miss_count_stat", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_tcp_expired_miss_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_expired_miss_user_agent_bytes_stat", RECD_INT, RECP_PERSISTENT,
-                     (int)http_tcp_expired_miss_user_agent_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_expired_miss_origin_server_bytes_stat", RECD_INT,
-                     RECP_PERSISTENT, (int)http_tcp_expired_miss_origin_server_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_refresh_hit_count_stat", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_tcp_refresh_hit_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_refresh_hit_user_agent_bytes_stat", RECD_INT, RECP_PERSISTENT,
-                     (int)http_tcp_refresh_hit_user_agent_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_refresh_hit_origin_server_bytes_stat", RECD_INT,
-                     RECP_PERSISTENT, (int)http_tcp_refresh_hit_origin_server_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_refresh_miss_count_stat", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_tcp_refresh_miss_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_refresh_miss_user_agent_bytes_stat", RECD_INT, RECP_PERSISTENT,
-                     (int)http_tcp_refresh_miss_user_agent_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_refresh_miss_origin_server_bytes_stat", RECD_INT,
-                     RECP_PERSISTENT, (int)http_tcp_refresh_miss_origin_server_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_client_refresh_count_stat", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_tcp_client_refresh_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_client_refresh_user_agent_bytes_stat", RECD_INT,
-                     RECP_PERSISTENT, (int)http_tcp_client_refresh_user_agent_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_client_refresh_origin_server_bytes_stat", RECD_INT,
-                     RECP_PERSISTENT, (int)http_tcp_client_refresh_origin_server_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_ims_hit_count_stat", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_tcp_ims_hit_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_ims_hit_user_agent_bytes_stat", RECD_INT, RECP_PERSISTENT,
-                     (int)http_tcp_ims_hit_user_agent_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_ims_hit_origin_server_bytes_stat", RECD_INT, RECP_PERSISTENT,
-                     (int)http_tcp_ims_hit_origin_server_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_ims_miss_count_stat", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_tcp_ims_miss_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_ims_miss_user_agent_bytes_stat", RECD_INT, RECP_PERSISTENT,
-                     (int)http_tcp_ims_miss_user_agent_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.tcp_ims_miss_origin_server_bytes_stat", RECD_INT, RECP_PERSISTENT,
-                     (int)http_tcp_ims_miss_origin_server_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.err_client_abort_count_stat", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_err_client_abort_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.err_client_abort_user_agent_bytes_stat", RECD_INT, RECP_PERSISTENT,
-                     (int)http_err_client_abort_user_agent_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.err_client_abort_origin_server_bytes_stat", RECD_INT,
-                     RECP_PERSISTENT, (int)http_err_client_abort_origin_server_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.err_client_read_error_count_stat", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_err_client_read_error_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.err_client_read_error_user_agent_bytes_stat", RECD_INT,
-                     RECP_PERSISTENT, (int)http_err_client_read_error_user_agent_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.err_client_read_error_origin_server_bytes_stat", RECD_INT,
-                     RECP_PERSISTENT, (int)http_err_client_read_error_origin_server_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.err_connect_fail_count_stat", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_err_connect_fail_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.err_connect_fail_user_agent_bytes_stat", RECD_INT, RECP_PERSISTENT,
-                     (int)http_err_connect_fail_user_agent_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.err_connect_fail_origin_server_bytes_stat", RECD_INT,
-                     RECP_PERSISTENT, (int)http_err_connect_fail_origin_server_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.misc_count_stat", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_misc_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.misc_user_agent_bytes_stat", RECD_INT, RECP_PERSISTENT,
-                     (int)http_misc_user_agent_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.http_misc_origin_server_bytes_stat", RECD_INT, RECP_PERSISTENT,
-                     (int)http_misc_origin_server_bytes_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.background_fill_bytes_aborted_stat", RECD_INT, RECP_PERSISTENT,
-                     (int)http_background_fill_bytes_aborted_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.background_fill_bytes_completed_stat", RECD_INT, RECP_PERSISTENT,
-                     (int)http_background_fill_bytes_completed_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_write_errors", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_write_errors, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache_read_errors", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_read_errors, RecRawStatSyncSum);
-
-  ////////////////////////////////////////////////////////////////////////////////
-  // status code counts
-  ////////////////////////////////////////////////////////////////////////////////
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.100_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_100_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.101_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_101_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.1xx_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_1xx_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.200_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_200_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.201_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_201_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.202_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_202_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.203_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_203_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.204_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_204_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.205_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_205_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.206_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_206_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.2xx_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_2xx_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.300_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_300_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.301_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_301_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.302_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_302_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.303_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_303_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.304_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_304_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.305_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_305_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.307_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_307_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.308_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_308_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.3xx_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_3xx_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.400_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_400_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.401_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_401_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.402_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_402_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.403_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_403_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.404_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_404_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.405_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_405_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.406_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_406_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.407_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_407_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.408_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_408_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.409_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_409_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.410_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_410_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.411_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_411_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.412_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_412_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.413_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_413_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.414_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_414_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.415_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_415_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.416_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_416_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.4xx_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_4xx_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.500_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_500_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.501_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_501_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.502_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_502_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.503_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_503_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.504_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_504_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.505_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_505_count_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.5xx_responses", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_response_status_5xx_count_stat, RecRawStatSyncCount);
-
-  ////////////////////////////////////////////////////////////////////////////////
-  // http - time and count of transactions classified by client's point of view //
-  //  the internal stat is in msecs, the output time is float seconds           //
-  ////////////////////////////////////////////////////////////////////////////////
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_counts.hit_fresh", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_ua_msecs_counts_hit_fresh_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_totaltime.hit_fresh", RECD_FLOAT, RECP_PERSISTENT,
-                     (int)http_ua_msecs_counts_hit_fresh_stat, RecRawStatSyncIntMsecsToFloatSeconds);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_counts.hit_fresh.process", RECD_COUNTER,
-                     RECP_PERSISTENT, (int)http_ua_msecs_counts_hit_fresh_process_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_totaltime.hit_fresh.process", RECD_FLOAT,
-                     RECP_PERSISTENT, (int)http_ua_msecs_counts_hit_fresh_process_stat, RecRawStatSyncIntMsecsToFloatSeconds);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_counts.hit_revalidated", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_ua_msecs_counts_hit_reval_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_totaltime.hit_revalidated", RECD_FLOAT,
-                     RECP_PERSISTENT, (int)http_ua_msecs_counts_hit_reval_stat, RecRawStatSyncIntMsecsToFloatSeconds);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_counts.miss_cold", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_ua_msecs_counts_miss_cold_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_totaltime.miss_cold", RECD_FLOAT, RECP_PERSISTENT,
-                     (int)http_ua_msecs_counts_miss_cold_stat, RecRawStatSyncIntMsecsToFloatSeconds);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_counts.miss_not_cacheable", RECD_COUNTER,
-                     RECP_PERSISTENT, (int)http_ua_msecs_counts_miss_uncacheable_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_totaltime.miss_not_cacheable", RECD_FLOAT,
-                     RECP_PERSISTENT, (int)http_ua_msecs_counts_miss_uncacheable_stat, RecRawStatSyncIntMsecsToFloatSeconds);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_counts.miss_changed", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_ua_msecs_counts_miss_changed_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_totaltime.miss_changed", RECD_FLOAT, RECP_PERSISTENT,
-                     (int)http_ua_msecs_counts_miss_changed_stat, RecRawStatSyncIntMsecsToFloatSeconds);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_counts.miss_client_no_cache", RECD_COUNTER,
-                     RECP_PERSISTENT, (int)http_ua_msecs_counts_miss_client_no_cache_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_totaltime.miss_client_no_cache", RECD_FLOAT,
-                     RECP_PERSISTENT, (int)http_ua_msecs_counts_miss_client_no_cache_stat, RecRawStatSyncIntMsecsToFloatSeconds);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_counts.errors.aborts", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_ua_msecs_counts_errors_aborts_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_totaltime.errors.aborts", RECD_FLOAT, RECP_PERSISTENT,
-                     (int)http_ua_msecs_counts_errors_aborts_stat, RecRawStatSyncIntMsecsToFloatSeconds);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_counts.errors.possible_aborts", RECD_COUNTER,
-                     RECP_PERSISTENT, (int)http_ua_msecs_counts_errors_possible_aborts_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_totaltime.errors.possible_aborts", RECD_FLOAT,
-                     RECP_PERSISTENT, (int)http_ua_msecs_counts_errors_possible_aborts_stat, RecRawStatSyncIntMsecsToFloatSeconds);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_counts.errors.connect_failed", RECD_COUNTER,
-                     RECP_PERSISTENT, (int)http_ua_msecs_counts_errors_connect_failed_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_totaltime.errors.connect_failed", RECD_FLOAT,
-                     RECP_PERSISTENT, (int)http_ua_msecs_counts_errors_connect_failed_stat, RecRawStatSyncIntMsecsToFloatSeconds);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_counts.errors.other", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_ua_msecs_counts_errors_other_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_totaltime.errors.other", RECD_FLOAT, RECP_PERSISTENT,
-                     (int)http_ua_msecs_counts_errors_other_stat, RecRawStatSyncIntMsecsToFloatSeconds);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_counts.other.unclassified", RECD_COUNTER,
-                     RECP_PERSISTENT, (int)http_ua_msecs_counts_other_unclassified_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.transaction_totaltime.other.unclassified", RECD_FLOAT,
-                     RECP_PERSISTENT, (int)http_ua_msecs_counts_other_unclassified_stat, RecRawStatSyncIntMsecsToFloatSeconds);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.disallowed_post_100_continue", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)disallowed_post_100_continue, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.total_x_redirect_count", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_total_x_redirect_stat, RecRawStatSyncCount);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.https.incoming_requests", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)https_incoming_requests_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.https.total_client_connections", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)https_total_client_connections_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin_connections_throttled_out", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_origin_connections_throttled_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.post_body_too_large", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_post_body_too_large, RecRawStatSyncCount);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.origin.connect.adjust_thread", RECD_COUNTER, RECP_NON_PERSISTENT,
-                     (int)http_origin_connect_adjust_thread_stat, RecRawStatSyncCount);
-  HTTP_CLEAR_DYN_STAT(http_origin_connect_adjust_thread_stat);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.cache.open_write.adjust_thread", RECD_COUNTER, RECP_NON_PERSISTENT,
-                     (int)http_cache_open_write_adjust_thread_stat, RecRawStatSyncCount);
-  HTTP_CLEAR_DYN_STAT(http_cache_open_write_adjust_thread_stat);
-  // milestones
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.ua_begin", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_ua_begin_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.ua_first_read", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_ua_first_read_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.ua_read_header_done", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_ua_read_header_done_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.ua_begin_write", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_ua_begin_write_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.ua_close", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_ua_close_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.server_first_connect", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_server_first_connect_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.server_connect", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_server_connect_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.server_connect_end", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_server_connect_end_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.server_begin_write", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_server_begin_write_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.server_first_read", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_server_first_read_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.server_read_header_done", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_server_read_header_done_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.server_close", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_server_close_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.cache_open_read_begin", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_open_read_begin_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.cache_open_read_end", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_open_read_end_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.cache_open_write_begin", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_open_write_begin_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.cache_open_write_end", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_cache_open_write_end_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.dns_lookup_begin", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_dns_lookup_begin_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.dns_lookup_end", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_dns_lookup_end_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.sm_start", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_sm_start_time_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.milestone.sm_finish", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_sm_finish_time_stat, RecRawStatSyncSum);
-
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http.down_server.no_requests", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_down_server_no_requests, RecRawStatSyncSum);
-
-  // Current transaction stats parent counter
-  RecRegisterRawStat(http_rsb, RECT_PROCESS, "proxy.process.http_parent_count", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)http_parent_count, RecRawStatSyncCount);
+  ts::Metrics &intm = ts::Metrics::getInstance();
+
+  http_rsb.background_fill_bytes_aborted        = intm.newMetricPtr("proxy.process.http.background_fill_bytes_aborted_stat");
+  http_rsb.background_fill_bytes_completed      = intm.newMetricPtr("proxy.process.http.background_fill_bytes_completed_stat");
+  http_rsb.background_fill_current_count        = intm.newMetricPtr("proxy.process.http.background_fill_current_count");
+  http_rsb.background_fill_total_count          = intm.newMetricPtr("proxy.process.http.background_fill_total_count");
+  http_rsb.broken_server_connections            = intm.newMetricPtr("proxy.process.http.broken_server_connections");
+  http_rsb.cache_deletes                        = intm.newMetricPtr("proxy.process.http.cache_deletes");
+  http_rsb.cache_hit_fresh                      = intm.newMetricPtr("proxy.process.http.cache_hit_fresh");
+  http_rsb.cache_hit_ims                        = intm.newMetricPtr("proxy.process.http.cache_hit_ims");
+  http_rsb.cache_hit_mem_fresh                  = intm.newMetricPtr("proxy.process.http.cache_hit_mem_fresh");
+  http_rsb.cache_hit_reval                      = intm.newMetricPtr("proxy.process.http.cache_hit_revalidated");
+  http_rsb.cache_hit_rww                        = intm.newMetricPtr("proxy.process.http.cache_hit_rww");
+  http_rsb.cache_hit_stale_served               = intm.newMetricPtr("proxy.process.http.cache_hit_stale_served");
+  http_rsb.cache_lookups                        = intm.newMetricPtr("proxy.process.http.cache_lookups");
+  http_rsb.cache_miss_changed                   = intm.newMetricPtr("proxy.process.http.cache_miss_changed");
+  http_rsb.cache_miss_client_no_cache           = intm.newMetricPtr("proxy.process.http.cache_miss_client_no_cache");
+  http_rsb.cache_miss_cold                      = intm.newMetricPtr("proxy.process.http.cache_miss_cold");
+  http_rsb.cache_miss_ims                       = intm.newMetricPtr("proxy.process.http.cache_miss_ims");
+  http_rsb.cache_miss_uncacheable               = intm.newMetricPtr("proxy.process.http.cache_miss_client_not_cacheable");
+  http_rsb.cache_open_read_begin_time           = intm.newMetricPtr("proxy.process.http.milestone.cache_open_read_begin");
+  http_rsb.cache_open_read_end_time             = intm.newMetricPtr("proxy.process.http.milestone.cache_open_read_end");
+  http_rsb.cache_open_write_adjust_thread       = intm.newMetricPtr("proxy.process.http.cache.open_write.adjust_thread");
+  http_rsb.cache_open_write_begin_time          = intm.newMetricPtr("proxy.process.http.milestone.cache_open_write_begin");
+  http_rsb.cache_open_write_end_time            = intm.newMetricPtr("proxy.process.http.milestone.cache_open_write_end");
+  http_rsb.cache_read_error                     = intm.newMetricPtr("proxy.process.http.cache_read_error");
+  http_rsb.cache_read_errors                    = intm.newMetricPtr("proxy.process.http.cache_read_errors");
+  http_rsb.cache_updates                        = intm.newMetricPtr("proxy.process.http.cache_updates");
+  http_rsb.cache_write_errors                   = intm.newMetricPtr("proxy.process.http.cache_write_errors");
+  http_rsb.cache_writes                         = intm.newMetricPtr("proxy.process.http.cache_writes");
+  http_rsb.completed_requests                   = intm.newMetricPtr("proxy.process.http.completed_requests");
+  http_rsb.connect_requests                     = intm.newMetricPtr("proxy.process.http.connect_requests");
+  http_rsb.current_active_client_connections    = intm.newMetricPtr("proxy.process.http.current_active_client_connections");
+  http_rsb.current_cache_connections            = intm.newMetricPtr("proxy.process.http.current_cache_connections");
+  http_rsb.current_client_connections           = intm.newMetricPtr("proxy.process.http.current_client_connections");
+  http_rsb.current_client_transactions          = intm.newMetricPtr("proxy.process.http.current_client_transactions");
+  http_rsb.current_parent_proxy_connections     = intm.newMetricPtr("proxy.process.http.current_parent_proxy_connections");
+  http_rsb.current_server_connections           = intm.newMetricPtr("proxy.process.http.current_server_connections");
+  http_rsb.current_server_transactions          = intm.newMetricPtr("proxy.process.http.current_server_transactions");
+  http_rsb.delete_requests                      = intm.newMetricPtr("proxy.process.http.delete_requests");
+  http_rsb.disallowed_post_100_continue         = intm.newMetricPtr("proxy.process.http.disallowed_post_100_continue");
+  http_rsb.dns_lookup_begin_time                = intm.newMetricPtr("proxy.process.http.milestone.dns_lookup_begin");
+  http_rsb.dns_lookup_end_time                  = intm.newMetricPtr("proxy.process.http.milestone.dns_lookup_end");
+  http_rsb.down_server_no_requests              = intm.newMetricPtr("proxy.process.http.down_server.no_requests");
+  http_rsb.err_client_abort_count               = intm.newMetricPtr("proxy.process.http.err_client_abort_count_stat");
+  http_rsb.err_client_abort_origin_server_bytes = intm.newMetricPtr("proxy.process.http.err_client_abort_origin_server_bytes_stat");
+  http_rsb.err_client_abort_user_agent_bytes    = intm.newMetricPtr("proxy.process.http.err_client_abort_user_agent_bytes_stat");
+  http_rsb.err_client_read_error_count          = intm.newMetricPtr("proxy.process.http.err_client_read_error_count_stat");
+  http_rsb.err_client_read_error_origin_server_bytes =
+    intm.newMetricPtr("proxy.process.http.err_client_read_error_origin_server_bytes_stat");
+  http_rsb.err_client_read_error_user_agent_bytes =
+    intm.newMetricPtr("proxy.process.http.err_client_read_error_user_agent_bytes_stat");
+  http_rsb.err_connect_fail_count               = intm.newMetricPtr("proxy.process.http.err_connect_fail_count_stat");
+  http_rsb.err_connect_fail_origin_server_bytes = intm.newMetricPtr("proxy.process.http.err_connect_fail_origin_server_bytes_stat");
+  http_rsb.err_connect_fail_user_agent_bytes    = intm.newMetricPtr("proxy.process.http.err_connect_fail_user_agent_bytes_stat");
+  http_rsb.extension_method_requests            = intm.newMetricPtr("proxy.process.http.extension_method_requests");
+  http_rsb.get_requests                         = intm.newMetricPtr("proxy.process.http.get_requests");
+  http_rsb.head_requests                        = intm.newMetricPtr("proxy.process.http.head_requests");
+  http_rsb.https_incoming_requests              = intm.newMetricPtr("proxy.process.https.incoming_requests");
+  http_rsb.https_total_client_connections       = intm.newMetricPtr("proxy.process.https.total_client_connections");
+  http_rsb.incoming_requests                    = intm.newMetricPtr("proxy.process.http.incoming_requests");
+  http_rsb.incoming_responses                   = intm.newMetricPtr("proxy.process.http.incoming_responses");
+  http_rsb.invalid_client_requests              = intm.newMetricPtr("proxy.process.http.invalid_client_requests");
+  http_rsb.misc_count                           = intm.newMetricPtr("proxy.process.http.misc_count_stat");
+  http_rsb.misc_origin_server_bytes             = intm.newMetricPtr("proxy.process.http.http_misc_origin_server_bytes_stat");
+  http_rsb.misc_user_agent_bytes                = intm.newMetricPtr("proxy.process.http.misc_user_agent_bytes_stat");
+  http_rsb.missing_host_hdr                     = intm.newMetricPtr("proxy.process.http.missing_host_hdr");
+  http_rsb.options_requests                     = intm.newMetricPtr("proxy.process.http.options_requests");
+  http_rsb.origin_body                          = intm.newMetricPtr("proxy.process.http.origin.body");
+  http_rsb.origin_close_private                 = intm.newMetricPtr("proxy.process.http.origin.close_private");
+  http_rsb.origin_connect_adjust_thread         = intm.newMetricPtr("proxy.process.http.origin.connect.adjust_thread");
+  http_rsb.origin_connections_throttled         = intm.newMetricPtr("proxy.process.http.origin_connections_throttled_out");
+  http_rsb.origin_make_new                      = intm.newMetricPtr("proxy.process.http.origin.make_new");
+  http_rsb.origin_no_sharing                    = intm.newMetricPtr("proxy.process.http.origin.no_sharing");
+  http_rsb.origin_not_found                     = intm.newMetricPtr("proxy.process.http.origin.not_found");
+  http_rsb.origin_private                       = intm.newMetricPtr("proxy.process.http.origin.private");
+  http_rsb.origin_raw                           = intm.newMetricPtr("proxy.process.http.origin.raw");
+  http_rsb.origin_reuse                         = intm.newMetricPtr("proxy.process.http.origin.reuse");
+  http_rsb.origin_reuse_fail                    = intm.newMetricPtr("proxy.process.http.origin.reuse_fail");
+  http_rsb.origin_server_request_document_total_size =
+    intm.newMetricPtr("proxy.process.http.origin_server_request_document_total_size");
+  http_rsb.origin_server_request_header_total_size =
+    intm.newMetricPtr("proxy.process.http.origin_server_request_header_total_size");
+  http_rsb.origin_server_response_document_total_size =
+    intm.newMetricPtr("proxy.process.http.origin_server_response_document_total_size");
+  http_rsb.origin_server_response_header_total_size =
+    intm.newMetricPtr("proxy.process.http.origin_server_response_header_total_size");
+  http_rsb.origin_shutdown_cleanup_entry        = intm.newMetricPtr("proxy.process.http.origin_shutdown.cleanup_entry");
+  http_rsb.origin_shutdown_migration_failure    = intm.newMetricPtr("proxy.process.http.origin_shutdown.migration_failure");
+  http_rsb.origin_shutdown_pool_lock_contention = intm.newMetricPtr("proxy.process.http.origin_shutdown.pool_lock_contention");
+  http_rsb.origin_shutdown_release_invalid_request =
+    intm.newMetricPtr("proxy.process.http.origin_shutdown.release_invalid_request");
+  http_rsb.origin_shutdown_release_invalid_response =
+    intm.newMetricPtr("proxy.process.http.origin_shutdown.release_invalid_response");
+  http_rsb.origin_shutdown_release_misc          = intm.newMetricPtr("proxy.process.http.origin_shutdown.release_misc");
+  http_rsb.origin_shutdown_release_modified      = intm.newMetricPtr("proxy.process.http.origin_shutdown.release_modified");
+  http_rsb.origin_shutdown_release_no_keep_alive = intm.newMetricPtr("proxy.process.http.origin_shutdown.release_no_keep_alive");
+  http_rsb.origin_shutdown_release_no_server     = intm.newMetricPtr("proxy.process.http.origin_shutdown.release_no_server");
+  http_rsb.origin_shutdown_release_no_sharing    = intm.newMetricPtr("proxy.process.http.origin_shutdown.release_no_sharing");
+  http_rsb.origin_shutdown_tunnel_abort          = intm.newMetricPtr("proxy.process.http.origin_shutdown.tunnel_abort");
+  http_rsb.origin_shutdown_tunnel_client         = intm.newMetricPtr("proxy.process.http.origin_shutdown.tunnel_client");
+  http_rsb.origin_shutdown_tunnel_server         = intm.newMetricPtr("proxy.process.http.origin_shutdown.tunnel_server");
+  http_rsb.origin_shutdown_tunnel_server_detach  = intm.newMetricPtr("proxy.process.http.origin_shutdown.tunnel_server_detach");
+  http_rsb.origin_shutdown_tunnel_server_eos     = intm.newMetricPtr("proxy.process.http.origin_shutdown.tunnel_server_eos");
+  http_rsb.origin_shutdown_tunnel_server_no_keep_alive =
+    intm.newMetricPtr("proxy.process.http.origin_shutdown.tunnel_server_no_keep_alive");
+  http_rsb.origin_shutdown_tunnel_server_plugin_tunnel =
+    intm.newMetricPtr("proxy.process.http.origin_shutdown.tunnel_server_plugin_tunnel");
+  http_rsb.origin_shutdown_tunnel_transform_read = intm.newMetricPtr("proxy.process.http.origin_shutdown.tunnel_transform_read");
+  http_rsb.outgoing_requests                     = intm.newMetricPtr("proxy.process.http.outgoing_requests");
+  http_rsb.parent_count                          = intm.newMetricPtr("proxy.process.http_parent_count");
+  http_rsb.parent_proxy_request_total_bytes      = intm.newMetricPtr("proxy.process.http.parent_proxy_request_total_bytes");
+  http_rsb.parent_proxy_response_total_bytes     = intm.newMetricPtr("proxy.process.http.parent_proxy_response_total_bytes");
+  http_rsb.parent_proxy_transaction_time         = intm.newMetricPtr("proxy.process.http.parent_proxy_transaction_time");
+  http_rsb.pooled_server_connections             = intm.newMetricPtr("proxy.process.http.pooled_server_connections");
+  http_rsb.post_body_too_large                   = intm.newMetricPtr("proxy.process.http.post_body_too_large");
+  http_rsb.post_requests                         = intm.newMetricPtr("proxy.process.http.post_requests");
+  http_rsb.proxy_loop_detected                   = intm.newMetricPtr("proxy.process.http.http_proxy_loop_detected");
+  http_rsb.proxy_mh_loop_detected                = intm.newMetricPtr("proxy.process.http.http_proxy_mh_loop_detected");
+  http_rsb.purge_requests                        = intm.newMetricPtr("proxy.process.http.purge_requests");
+  http_rsb.push_requests                         = intm.newMetricPtr("proxy.process.http.push_requests");
+  http_rsb.pushed_document_total_size            = intm.newMetricPtr("proxy.process.http.pushed_document_total_size");
+  http_rsb.pushed_response_header_total_size     = intm.newMetricPtr("proxy.process.http.pushed_response_header_total_size");
+  http_rsb.put_requests                          = intm.newMetricPtr("proxy.process.http.put_requests");
+  http_rsb.response_status_100_count             = intm.newMetricPtr("proxy.process.http.100_responses");
+  http_rsb.response_status_101_count             = intm.newMetricPtr("proxy.process.http.101_responses");
+  http_rsb.response_status_1xx_count             = intm.newMetricPtr("proxy.process.http.1xx_responses");
+  http_rsb.response_status_200_count             = intm.newMetricPtr("proxy.process.http.200_responses");
+  http_rsb.response_status_201_count             = intm.newMetricPtr("proxy.process.http.201_responses");
+  http_rsb.response_status_202_count             = intm.newMetricPtr("proxy.process.http.202_responses");
+  http_rsb.response_status_203_count             = intm.newMetricPtr("proxy.process.http.203_responses");
+  http_rsb.response_status_204_count             = intm.newMetricPtr("proxy.process.http.204_responses");
+  http_rsb.response_status_205_count             = intm.newMetricPtr("proxy.process.http.205_responses");
+  http_rsb.response_status_206_count             = intm.newMetricPtr("proxy.process.http.206_responses");
+  http_rsb.response_status_2xx_count             = intm.newMetricPtr("proxy.process.http.2xx_responses");
+  http_rsb.response_status_300_count             = intm.newMetricPtr("proxy.process.http.300_responses");
+  http_rsb.response_status_301_count             = intm.newMetricPtr("proxy.process.http.301_responses");
+  http_rsb.response_status_302_count             = intm.newMetricPtr("proxy.process.http.302_responses");
+  http_rsb.response_status_303_count             = intm.newMetricPtr("proxy.process.http.303_responses");
+  http_rsb.response_status_304_count             = intm.newMetricPtr("proxy.process.http.304_responses");
+  http_rsb.response_status_305_count             = intm.newMetricPtr("proxy.process.http.305_responses");
+  http_rsb.response_status_307_count             = intm.newMetricPtr("proxy.process.http.307_responses");
+  http_rsb.response_status_308_count             = intm.newMetricPtr("proxy.process.http.308_responses");
+  http_rsb.response_status_3xx_count             = intm.newMetricPtr("proxy.process.http.3xx_responses");
+  http_rsb.response_status_400_count             = intm.newMetricPtr("proxy.process.http.400_responses");
+  http_rsb.response_status_401_count             = intm.newMetricPtr("proxy.process.http.401_responses");
+  http_rsb.response_status_402_count             = intm.newMetricPtr("proxy.process.http.402_responses");
+  http_rsb.response_status_403_count             = intm.newMetricPtr("proxy.process.http.403_responses");
+  http_rsb.response_status_404_count             = intm.newMetricPtr("proxy.process.http.404_responses");
+  http_rsb.response_status_405_count             = intm.newMetricPtr("proxy.process.http.405_responses");
+  http_rsb.response_status_406_count             = intm.newMetricPtr("proxy.process.http.406_responses");
+  http_rsb.response_status_407_count             = intm.newMetricPtr("proxy.process.http.407_responses");
+  http_rsb.response_status_408_count             = intm.newMetricPtr("proxy.process.http.408_responses");
+  http_rsb.response_status_409_count             = intm.newMetricPtr("proxy.process.http.409_responses");
+  http_rsb.response_status_410_count             = intm.newMetricPtr("proxy.process.http.410_responses");
+  http_rsb.response_status_411_count             = intm.newMetricPtr("proxy.process.http.411_responses");
+  http_rsb.response_status_412_count             = intm.newMetricPtr("proxy.process.http.412_responses");
+  http_rsb.response_status_413_count             = intm.newMetricPtr("proxy.process.http.413_responses");
+  http_rsb.response_status_414_count             = intm.newMetricPtr("proxy.process.http.414_responses");
+  http_rsb.response_status_415_count             = intm.newMetricPtr("proxy.process.http.415_responses");
+  http_rsb.response_status_416_count             = intm.newMetricPtr("proxy.process.http.416_responses");
+  http_rsb.response_status_4xx_count             = intm.newMetricPtr("proxy.process.http.4xx_responses");
+  http_rsb.response_status_500_count             = intm.newMetricPtr("proxy.process.http.500_responses");
+  http_rsb.response_status_501_count             = intm.newMetricPtr("proxy.process.http.501_responses");
+  http_rsb.response_status_502_count             = intm.newMetricPtr("proxy.process.http.502_responses");
+  http_rsb.response_status_503_count             = intm.newMetricPtr("proxy.process.http.503_responses");
+  http_rsb.response_status_504_count             = intm.newMetricPtr("proxy.process.http.504_responses");
+  http_rsb.response_status_505_count             = intm.newMetricPtr("proxy.process.http.505_responses");
+  http_rsb.response_status_5xx_count             = intm.newMetricPtr("proxy.process.http.5xx_responses");
+  http_rsb.server_begin_write_time               = intm.newMetricPtr("proxy.process.http.milestone.server_begin_write");
+  http_rsb.server_close_time                     = intm.newMetricPtr("proxy.process.http.milestone.server_close");
+  http_rsb.server_connect_end_time               = intm.newMetricPtr("proxy.process.http.milestone.server_connect_end");
+  http_rsb.server_connect_time                   = intm.newMetricPtr("proxy.process.http.milestone.server_connect");
+  http_rsb.server_first_connect_time             = intm.newMetricPtr("proxy.process.http.milestone.server_first_connect");
+  http_rsb.server_first_read_time                = intm.newMetricPtr("proxy.process.http.milestone.server_first_read");
+  http_rsb.server_read_header_done_time          = intm.newMetricPtr("proxy.process.http.milestone.server_read_header_done");
+  http_rsb.sm_finish_time                        = intm.newMetricPtr("proxy.process.http.milestone.sm_finish");
+  http_rsb.sm_start_time                         = intm.newMetricPtr("proxy.process.http.milestone.sm_start");
+  http_rsb.tcp_client_refresh_count              = intm.newMetricPtr("proxy.process.http.tcp_client_refresh_count_stat");
+  http_rsb.tcp_client_refresh_origin_server_bytes =
+    intm.newMetricPtr("proxy.process.http.tcp_client_refresh_origin_server_bytes_stat");
+  http_rsb.tcp_client_refresh_user_agent_bytes  = intm.newMetricPtr("proxy.process.http.tcp_client_refresh_user_agent_bytes_stat");
+  http_rsb.tcp_expired_miss_count               = intm.newMetricPtr("proxy.process.http.tcp_expired_miss_count_stat");
+  http_rsb.tcp_expired_miss_origin_server_bytes = intm.newMetricPtr("proxy.process.http.tcp_expired_miss_origin_server_bytes_stat");
+  http_rsb.tcp_expired_miss_user_agent_bytes    = intm.newMetricPtr("proxy.process.http.tcp_expired_miss_user_agent_bytes_stat");
+  http_rsb.tcp_hit_count                        = intm.newMetricPtr("proxy.process.http.tcp_hit_count_stat");
+  http_rsb.tcp_hit_origin_server_bytes          = intm.newMetricPtr("proxy.process.http.tcp_hit_origin_server_bytes_stat");
+  http_rsb.tcp_hit_user_agent_bytes             = intm.newMetricPtr("proxy.process.http.tcp_hit_user_agent_bytes_stat");
+  http_rsb.tcp_ims_hit_count                    = intm.newMetricPtr("proxy.process.http.tcp_ims_hit_count_stat");
+  http_rsb.tcp_ims_hit_origin_server_bytes      = intm.newMetricPtr("proxy.process.http.tcp_ims_hit_origin_server_bytes_stat");
+  http_rsb.tcp_ims_hit_user_agent_bytes         = intm.newMetricPtr("proxy.process.http.tcp_ims_hit_user_agent_bytes_stat");
+  http_rsb.tcp_ims_miss_count                   = intm.newMetricPtr("proxy.process.http.tcp_ims_miss_count_stat");
+  http_rsb.tcp_ims_miss_origin_server_bytes     = intm.newMetricPtr("proxy.process.http.tcp_ims_miss_origin_server_bytes_stat");
+  http_rsb.tcp_ims_miss_user_agent_bytes        = intm.newMetricPtr("proxy.process.http.tcp_ims_miss_user_agent_bytes_stat");
+  http_rsb.tcp_miss_count                       = intm.newMetricPtr("proxy.process.http.tcp_miss_count_stat");
+  http_rsb.tcp_miss_origin_server_bytes         = intm.newMetricPtr("proxy.process.http.tcp_miss_origin_server_bytes_stat");
+  http_rsb.tcp_miss_user_agent_bytes            = intm.newMetricPtr("proxy.process.http.tcp_miss_user_agent_bytes_stat");
+  http_rsb.tcp_refresh_hit_count                = intm.newMetricPtr("proxy.process.http.tcp_refresh_hit_count_stat");
+  http_rsb.tcp_refresh_hit_origin_server_bytes  = intm.newMetricPtr("proxy.process.http.tcp_refresh_hit_origin_server_bytes_stat");
+  http_rsb.tcp_refresh_hit_user_agent_bytes     = intm.newMetricPtr("proxy.process.http.tcp_refresh_hit_user_agent_bytes_stat");
+  http_rsb.tcp_refresh_miss_count               = intm.newMetricPtr("proxy.process.http.tcp_refresh_miss_count_stat");
+  http_rsb.tcp_refresh_miss_origin_server_bytes = intm.newMetricPtr("proxy.process.http.tcp_refresh_miss_origin_server_bytes_stat");
+  http_rsb.tcp_refresh_miss_user_agent_bytes    = intm.newMetricPtr("proxy.process.http.tcp_refresh_miss_user_agent_bytes_stat");
+  http_rsb.total_client_connections             = intm.newMetricPtr("proxy.process.http.total_client_connections");
+  http_rsb.total_client_connections_ipv4        = intm.newMetricPtr("proxy.process.http.total_client_connections_ipv4");
+  http_rsb.total_client_connections_ipv6        = intm.newMetricPtr("proxy.process.http.total_client_connections_ipv6");
+  http_rsb.total_incoming_connections           = intm.newMetricPtr("proxy.process.http.total_incoming_connections");
+  http_rsb.total_parent_marked_down_count       = intm.newMetricPtr("proxy.process.http.total_parent_marked_down_count");
+  http_rsb.total_parent_proxy_connections       = intm.newMetricPtr("proxy.process.http.total_parent_proxy_connections");
+  http_rsb.total_parent_retries                 = intm.newMetricPtr("proxy.process.http.total_parent_retries");
+  http_rsb.total_parent_retries_exhausted       = intm.newMetricPtr("proxy.process.http.total_parent_retries_exhausted");
+  http_rsb.total_parent_switches                = intm.newMetricPtr("proxy.process.http.total_parent_switches");
+  http_rsb.total_server_connections             = intm.newMetricPtr("proxy.process.http.total_server_connections");
+  http_rsb.total_transactions_time              = intm.newMetricPtr("proxy.process.http.total_transactions_time");
+  http_rsb.total_x_redirect                     = intm.newMetricPtr("proxy.process.http.total_x_redirect_count");
+  http_rsb.trace_requests                       = intm.newMetricPtr("proxy.process.http.trace_requests");
+  http_rsb.tunnel_current_active_connections    = intm.newMetricPtr("proxy.process.tunnel.current_active_connections");
+  http_rsb.tunnels                              = intm.newMetricPtr("proxy.process.http.tunnels");
+  http_rsb.ua_begin_time                        = intm.newMetricPtr("proxy.process.http.milestone.ua_begin");
+  http_rsb.ua_begin_write_time                  = intm.newMetricPtr("proxy.process.http.milestone.ua_begin_write");
+  http_rsb.ua_close_time                        = intm.newMetricPtr("proxy.process.http.milestone.ua_close");
+  http_rsb.ua_counts_errors_aborts              = intm.newMetricPtr("proxy.process.http.transaction_counts.errors.aborts");
+  http_rsb.ua_counts_errors_connect_failed      = intm.newMetricPtr("proxy.process.http.transaction_counts.errors.connect_failed");
+  http_rsb.ua_counts_errors_other               = intm.newMetricPtr("proxy.process.http.transaction_counts.errors.other");
+  http_rsb.ua_counts_errors_possible_aborts     = intm.newMetricPtr("proxy.process.http.transaction_counts.errors.possible_aborts");
+  http_rsb.ua_counts_errors_pre_accept_hangups =
+    intm.newMetricPtr("proxy.process.http.transaction_counts.errors.pre_accept_hangups");
+  http_rsb.ua_counts_hit_fresh             = intm.newMetricPtr("proxy.process.http.transaction_counts.hit_fresh");
+  http_rsb.ua_counts_hit_fresh_process     = intm.newMetricPtr("proxy.process.http.transaction_counts.hit_fresh.process");
+  http_rsb.ua_counts_hit_reval             = intm.newMetricPtr("proxy.process.http.transaction_counts.hit_revalidated");
+  http_rsb.ua_counts_miss_changed          = intm.newMetricPtr("proxy.process.http.transaction_counts.miss_changed");
+  http_rsb.ua_counts_miss_client_no_cache  = intm.newMetricPtr("proxy.process.http.transaction_counts.miss_client_no_cache");
+  http_rsb.ua_counts_miss_cold             = intm.newMetricPtr("proxy.process.http.transaction_counts.miss_cold");
+  http_rsb.ua_counts_miss_uncacheable      = intm.newMetricPtr("proxy.process.http.transaction_counts.miss_not_cacheable");
+  http_rsb.ua_counts_other_unclassified    = intm.newMetricPtr("proxy.process.http.transaction_counts.other.unclassified");
+  http_rsb.ua_first_read_time              = intm.newMetricPtr("proxy.process.http.milestone.ua_first_read");
+  http_rsb.ua_msecs_errors_aborts          = intm.newMetricPtr("proxy.process.http.transaction_totaltime.errors.aborts");
+  http_rsb.ua_msecs_errors_connect_failed  = intm.newMetricPtr("proxy.process.http.transaction_totaltime.errors.connect_failed");
+  http_rsb.ua_msecs_errors_other           = intm.newMetricPtr("proxy.process.http.transaction_totaltime.errors.other");
+  http_rsb.ua_msecs_errors_possible_aborts = intm.newMetricPtr("proxy.process.http.transaction_totaltime.errors.possible_aborts");
+  http_rsb.ua_msecs_errors_pre_accept_hangups =
+    intm.newMetricPtr("proxy.process.http.transaction_totaltime.errors.pre_accept_hangups");
+  http_rsb.ua_msecs_hit_fresh            = intm.newMetricPtr("proxy.process.http.transaction_totaltime.hit_fresh");
+  http_rsb.ua_msecs_hit_fresh_process    = intm.newMetricPtr("proxy.process.http.transaction_totaltime.hit_fresh.process");
+  http_rsb.ua_msecs_hit_reval            = intm.newMetricPtr("proxy.process.http.transaction_totaltime.hit_revalidated");
+  http_rsb.ua_msecs_miss_changed         = intm.newMetricPtr("proxy.process.http.transaction_totaltime.miss_changed");
+  http_rsb.ua_msecs_miss_client_no_cache = intm.newMetricPtr("proxy.process.http.transaction_totaltime.miss_client_no_cache");
+  http_rsb.ua_msecs_miss_cold            = intm.newMetricPtr("proxy.process.http.transaction_totaltime.miss_cold");
+  http_rsb.ua_msecs_miss_uncacheable     = intm.newMetricPtr("proxy.process.http.transaction_totaltime.miss_not_cacheable");
+  http_rsb.ua_msecs_other_unclassified   = intm.newMetricPtr("proxy.process.http.transaction_totaltime.other.unclassified");
+  http_rsb.ua_read_header_done_time      = intm.newMetricPtr("proxy.process.http.milestone.ua_read_header_done");
+  http_rsb.user_agent_request_document_total_size = intm.newMetricPtr("proxy.process.http.user_agent_request_document_total_size");
+  http_rsb.user_agent_request_header_total_size   = intm.newMetricPtr("proxy.process.http.user_agent_request_header_total_size");
+  http_rsb.user_agent_response_document_total_size =
+    intm.newMetricPtr("proxy.process.http.user_agent_response_document_total_size");
+  http_rsb.user_agent_response_header_total_size = intm.newMetricPtr("proxy.process.http.user_agent_response_header_total_size");
+  http_rsb.websocket_current_active_client_connections =
+    intm.newMetricPtr("proxy.process.http.websocket.current_active_client_connections");
 }
 
 static bool
@@ -1140,11 +611,12 @@ load_negative_caching_var(RecRecord const *r, void *cookie)
 //  HttpConfig::startup()
 //
 ////////////////////////////////////////////////////////////////
+HttpStatsBlock http_rsb;
+
 void
 HttpConfig::startup()
 {
   extern void SSLConfigInit(swoc::IPRangeSet * addrs);
-  http_rsb = RecAllocateRawStatBlock(static_cast<int>(http_stat_count));
   register_stat_callbacks();
 
   HttpConfigParams &c = m_master;
diff --git a/proxy/http/HttpConfig.h b/proxy/http/HttpConfig.h
index c7d728c81c..d4a535b32b 100644
--- a/proxy/http/HttpConfig.h
+++ b/proxy/http/HttpConfig.h
@@ -53,6 +53,9 @@
 #include "records/I_RecProcess.h"
 #include "HttpConnectionCount.h"
 #include "tscpp/util/ts_ip.h"
+#include "api/Metrics.h"
+
+using ts::Metrics;
 
 static const unsigned HTTP_STATUS_NUMBER = 600;
 using HttpStatusBitset                   = std::bitset<HTTP_STATUS_NUMBER>;
@@ -60,315 +63,249 @@ using HttpStatusBitset                   = std::bitset<HTTP_STATUS_NUMBER>;
 /* Instead of enumerating the stats in DynamicStats.h, each module needs
    to enumerate its stats separately and register them with librecords
    */
-enum {
-  http_background_fill_current_count_stat,
-  http_current_client_connections_stat,
-  http_current_active_client_connections_stat,
-  http_websocket_current_active_client_connections_stat,
-  tunnel_current_active_connections_stat,
-  http_current_client_transactions_stat,
-  http_total_incoming_connections_stat,
-  http_current_server_transactions_stat,
-  http_pooled_server_connections_stat,
-
-  //  Http Abort information (from HttpNetConnection)
-  http_ua_msecs_counts_errors_pre_accept_hangups_stat,
-
-  // Http Total Connections Stats
-  //
-  // it is assumed that this inequality will always be satisfied:
-  //   http_total_client_connections_stat >=
-  //     http_total_client_connections_ipv4_stat +
-  //     http_total_client_connections_ipv6_stat
-  http_total_client_connections_stat,
-  http_total_client_connections_ipv4_stat,
-  http_total_client_connections_ipv6_stat,
-  http_total_server_connections_stat,
-  http_total_parent_proxy_connections_stat,
-  http_total_parent_retries_stat,
-  http_total_parent_switches_stat,
-  http_total_parent_retries_exhausted_stat,
-  http_total_parent_marked_down_count,
-  http_background_fill_total_count_stat,
-  http_current_parent_proxy_connections_stat,
-  http_current_server_connections_stat,
-  http_current_cache_connections_stat,
-
-  // Http K-A Stats
-  http_transactions_per_client_con,
-  http_transactions_per_server_con,
-
-  // Transactional stats
-  http_incoming_requests_stat,
-  http_outgoing_requests_stat,
-  http_incoming_responses_stat,
-  http_invalid_client_requests_stat,
-  http_missing_host_hdr_stat,
-  http_get_requests_stat,
-  http_head_requests_stat,
-  http_trace_requests_stat,
-  http_options_requests_stat,
-  http_post_requests_stat,
-  http_put_requests_stat,
-  http_push_requests_stat,
-  http_delete_requests_stat,
-  http_purge_requests_stat,
-  http_connect_requests_stat,
-  http_extension_method_requests_stat,
-  http_proxy_loop_detected_stat,
-  http_proxy_mh_loop_detected_stat,
-
-  http_completed_requests_stat,
-  http_broken_server_connections_stat,
-
-  http_cache_lookups_stat,
-  http_cache_writes_stat,
-  http_cache_updates_stat,
-  http_cache_deletes_stat,
-
-  http_tunnels_stat,
-
-  // document size stats
-  http_user_agent_request_header_total_size_stat,
-  http_user_agent_response_header_total_size_stat,
-  http_user_agent_request_document_total_size_stat,
-  http_user_agent_response_document_total_size_stat,
-
-  http_origin_server_request_header_total_size_stat,
-  http_origin_server_response_header_total_size_stat,
-  http_origin_server_request_document_total_size_stat,
-  http_origin_server_response_document_total_size_stat,
-
-  http_parent_proxy_request_total_bytes_stat,
-  http_parent_proxy_response_total_bytes_stat,
-
-  http_pushed_response_header_total_size_stat,
-  http_pushed_document_total_size_stat,
-
-  http_background_fill_bytes_aborted_stat,
-  http_background_fill_bytes_completed_stat,
-
-  http_response_document_size_100_stat,
-  http_response_document_size_1K_stat,
-  http_response_document_size_3K_stat,
-  http_response_document_size_5K_stat,
-  http_response_document_size_10K_stat,
-  http_response_document_size_1M_stat,
-  http_response_document_size_inf_stat,
-
-  http_request_document_size_100_stat,
-  http_request_document_size_1K_stat,
-  http_request_document_size_3K_stat,
-  http_request_document_size_5K_stat,
-  http_request_document_size_10K_stat,
-  http_request_document_size_1M_stat,
-  http_request_document_size_inf_stat,
-
-  // connection speed stats
-  http_user_agent_speed_bytes_per_sec_100_stat,
-  http_user_agent_speed_bytes_per_sec_1K_stat,
-  http_user_agent_speed_bytes_per_sec_10K_stat,
-  http_user_agent_speed_bytes_per_sec_100K_stat,
-  http_user_agent_speed_bytes_per_sec_1M_stat,
-  http_user_agent_speed_bytes_per_sec_10M_stat,
-  http_user_agent_speed_bytes_per_sec_100M_stat,
-  http_origin_server_speed_bytes_per_sec_100_stat,
-  http_origin_server_speed_bytes_per_sec_1K_stat,
-  http_origin_server_speed_bytes_per_sec_10K_stat,
-  http_origin_server_speed_bytes_per_sec_100K_stat,
-  http_origin_server_speed_bytes_per_sec_1M_stat,
-  http_origin_server_speed_bytes_per_sec_10M_stat,
-  http_origin_server_speed_bytes_per_sec_100M_stat,
-
-  // cache result stats
-  http_cache_hit_fresh_stat,
-  http_cache_hit_mem_fresh_stat,
-  http_cache_hit_rww_stat,
-  http_cache_hit_reval_stat,
-  http_cache_hit_ims_stat,
-  http_cache_hit_stale_served_stat,
-  http_cache_miss_cold_stat,
-  http_cache_miss_changed_stat,
-  http_cache_miss_client_no_cache_stat,
-  http_cache_miss_uncacheable_stat,
-  http_cache_miss_ims_stat,
-  http_cache_read_error_stat,
-
-  // bandwidth savings stats
-  http_tcp_hit_count_stat,
-  http_tcp_hit_user_agent_bytes_stat,
-  http_tcp_hit_origin_server_bytes_stat,
-  http_tcp_miss_count_stat,
-  http_tcp_miss_user_agent_bytes_stat,
-  http_tcp_miss_origin_server_bytes_stat,
-  http_tcp_expired_miss_count_stat,
-  http_tcp_expired_miss_user_agent_bytes_stat,
-  http_tcp_expired_miss_origin_server_bytes_stat,
-  http_tcp_refresh_hit_count_stat,
-  http_tcp_refresh_hit_user_agent_bytes_stat,
-  http_tcp_refresh_hit_origin_server_bytes_stat,
-  http_tcp_refresh_miss_count_stat,
-  http_tcp_refresh_miss_user_agent_bytes_stat,
-  http_tcp_refresh_miss_origin_server_bytes_stat,
-  http_tcp_client_refresh_count_stat,
-  http_tcp_client_refresh_user_agent_bytes_stat,
-  http_tcp_client_refresh_origin_server_bytes_stat,
-  http_tcp_ims_hit_count_stat,
-  http_tcp_ims_hit_user_agent_bytes_stat,
-  http_tcp_ims_hit_origin_server_bytes_stat,
-  http_tcp_ims_miss_count_stat,
-  http_tcp_ims_miss_user_agent_bytes_stat,
-  http_tcp_ims_miss_origin_server_bytes_stat,
-  http_err_client_abort_count_stat,
-  http_err_client_abort_user_agent_bytes_stat,
-  http_err_client_abort_origin_server_bytes_stat,
-  http_err_client_read_error_count_stat,
-  http_err_client_read_error_user_agent_bytes_stat,
-  http_err_client_read_error_origin_server_bytes_stat,
-  http_err_connect_fail_count_stat,
-  http_err_connect_fail_user_agent_bytes_stat,
-  http_err_connect_fail_origin_server_bytes_stat,
-  http_misc_count_stat,
-  http_misc_user_agent_bytes_stat,
-  http_misc_origin_server_bytes_stat,
-
-  // http - time and count of transactions classified by client's point of view
-  http_ua_msecs_counts_hit_fresh_stat,
-
-  http_ua_msecs_counts_hit_fresh_process_stat,
-  http_ua_msecs_counts_hit_reval_stat,
-  http_ua_msecs_counts_miss_cold_stat,
-  http_ua_msecs_counts_miss_changed_stat,
-  http_ua_msecs_counts_miss_client_no_cache_stat,
-  http_ua_msecs_counts_miss_uncacheable_stat,
-  http_ua_msecs_counts_errors_aborts_stat,
-  http_ua_msecs_counts_errors_possible_aborts_stat,
-  http_ua_msecs_counts_errors_connect_failed_stat,
-  http_ua_msecs_counts_errors_other_stat,
-  http_ua_msecs_counts_other_unclassified_stat,
-
-  disallowed_post_100_continue,
-  http_post_body_too_large,
-
-  http_total_x_redirect_stat,
-
-  // Times
-  http_total_transactions_time_stat,
-  http_parent_proxy_transaction_time_stat,
-
-  // Http cache errors
-  http_cache_write_errors,
-  http_cache_read_errors,
-
-  // status code stats
-  http_response_status_100_count_stat,
-  http_response_status_101_count_stat,
-  http_response_status_1xx_count_stat,
-  http_response_status_200_count_stat,
-  http_response_status_201_count_stat,
-  http_response_status_202_count_stat,
-  http_response_status_203_count_stat,
-  http_response_status_204_count_stat,
-  http_response_status_205_count_stat,
-  http_response_status_206_count_stat,
-  http_response_status_2xx_count_stat,
-  http_response_status_300_count_stat,
-  http_response_status_301_count_stat,
-  http_response_status_302_count_stat,
-  http_response_status_303_count_stat,
-  http_response_status_304_count_stat,
-  http_response_status_305_count_stat,
-  http_response_status_307_count_stat,
-  http_response_status_308_count_stat,
-  http_response_status_3xx_count_stat,
-  http_response_status_400_count_stat,
-  http_response_status_401_count_stat,
-  http_response_status_402_count_stat,
-  http_response_status_403_count_stat,
-  http_response_status_404_count_stat,
-  http_response_status_405_count_stat,
-  http_response_status_406_count_stat,
-  http_response_status_407_count_stat,
-  http_response_status_408_count_stat,
-  http_response_status_409_count_stat,
-  http_response_status_410_count_stat,
-  http_response_status_411_count_stat,
-  http_response_status_412_count_stat,
-  http_response_status_413_count_stat,
-  http_response_status_414_count_stat,
-  http_response_status_415_count_stat,
-  http_response_status_416_count_stat,
-  http_response_status_4xx_count_stat,
-  http_response_status_500_count_stat,
-  http_response_status_501_count_stat,
-  http_response_status_502_count_stat,
-  http_response_status_503_count_stat,
-  http_response_status_504_count_stat,
-  http_response_status_505_count_stat,
-  http_response_status_5xx_count_stat,
-
-  https_incoming_requests_stat,
-  https_total_client_connections_stat,
-
-  // milestone timing statistics in milliseconds
-  http_ua_begin_time_stat,
-  http_ua_first_read_time_stat,
-  http_ua_read_header_done_time_stat,
-  http_ua_begin_write_time_stat,
-  http_ua_close_time_stat,
-  http_server_first_connect_time_stat,
-  http_server_connect_time_stat,
-  http_server_connect_end_time_stat,
-  http_server_begin_write_time_stat,
-  http_server_first_read_time_stat,
-  http_server_read_header_done_time_stat,
-  http_server_close_time_stat,
-  http_cache_open_read_begin_time_stat,
-  http_cache_open_read_end_time_stat,
-  http_cache_open_write_begin_time_stat,
-  http_cache_open_write_end_time_stat,
-  http_dns_lookup_begin_time_stat,
-  http_dns_lookup_end_time_stat,
-  http_sm_start_time_stat,
-  http_sm_finish_time_stat,
-
-  http_origin_connections_throttled_stat,
-
-  http_origin_connect_adjust_thread_stat,
-  http_cache_open_write_adjust_thread_stat,
-
-  http_origin_shutdown_pool_lock_contention,
-  http_origin_shutdown_migration_failure,
-  http_origin_shutdown_tunnel_server,
-  http_origin_shutdown_tunnel_server_no_keep_alive,
-  http_origin_shutdown_tunnel_server_eos,
-  http_origin_shutdown_tunnel_server_plugin_tunnel,
-  http_origin_shutdown_tunnel_server_detach,
-  http_origin_shutdown_tunnel_client,
-  http_origin_shutdown_tunnel_transform_read,
-  http_origin_shutdown_release_no_sharing,
-  http_origin_shutdown_release_no_server,
-  http_origin_shutdown_release_no_keep_alive,
-  http_origin_shutdown_release_invalid_response,
-  http_origin_shutdown_release_invalid_request,
-  http_origin_shutdown_release_modified,
-  http_origin_shutdown_release_misc,
-  http_origin_shutdown_cleanup_entry,
-  http_origin_shutdown_tunnel_abort,
-
-  http_down_server_no_requests,
-
-  http_origin_reuse,
-  http_origin_not_found,
-  http_origin_reuse_fail,
-  http_origin_make_new,
-  http_origin_no_sharing,
-  http_origin_body,
-  http_origin_private,
-  http_origin_close_private,
-  http_origin_raw,
-  http_parent_count,
-  http_stat_count
+struct HttpStatsBlock {
+  // Need two stats for these for counts and times
+  ts::Metrics::IntType *background_fill_bytes_aborted;
+  ts::Metrics::IntType *background_fill_bytes_completed;
+  ts::Metrics::IntType *background_fill_current_count;
+  ts::Metrics::IntType *background_fill_total_count;
+  ts::Metrics::IntType *broken_server_connections;
+  ts::Metrics::IntType *cache_deletes;
+  ts::Metrics::IntType *cache_hit_fresh;
+  ts::Metrics::IntType *cache_hit_ims;
+  ts::Metrics::IntType *cache_hit_mem_fresh;
+  ts::Metrics::IntType *cache_hit_reval;
+  ts::Metrics::IntType *cache_hit_rww;
+  ts::Metrics::IntType *cache_hit_stale_served;
+  ts::Metrics::IntType *cache_lookups;
+  ts::Metrics::IntType *cache_miss_changed;
+  ts::Metrics::IntType *cache_miss_client_no_cache;
+  ts::Metrics::IntType *cache_miss_cold;
+  ts::Metrics::IntType *cache_miss_ims;
+  ts::Metrics::IntType *cache_miss_uncacheable;
+  ts::Metrics::IntType *cache_open_read_begin_time;
+  ts::Metrics::IntType *cache_open_read_end_time;
+  ts::Metrics::IntType *cache_open_write_adjust_thread;
+  ts::Metrics::IntType *cache_open_write_begin_time;
+  ts::Metrics::IntType *cache_open_write_end_time;
+  ts::Metrics::IntType *cache_read_error;
+  ts::Metrics::IntType *cache_read_errors;
+  ts::Metrics::IntType *cache_updates;
+  ts::Metrics::IntType *cache_write_errors;
+  ts::Metrics::IntType *cache_writes;
+  ts::Metrics::IntType *completed_requests;
+  ts::Metrics::IntType *connect_requests;
+  ts::Metrics::IntType *current_active_client_connections;
+  ts::Metrics::IntType *current_cache_connections;
+  ts::Metrics::IntType *current_client_connections;
+  ts::Metrics::IntType *current_client_transactions;
+  ts::Metrics::IntType *current_parent_proxy_connections;
+  ts::Metrics::IntType *current_server_connections;
+  ts::Metrics::IntType *current_server_transactions;
+  ts::Metrics::IntType *delete_requests;
+  ts::Metrics::IntType *disallowed_post_100_continue;
+  ts::Metrics::IntType *dns_lookup_begin_time;
+  ts::Metrics::IntType *dns_lookup_end_time;
+  ts::Metrics::IntType *down_server_no_requests;
+  ts::Metrics::IntType *err_client_abort_count;
+  ts::Metrics::IntType *err_client_abort_origin_server_bytes;
+  ts::Metrics::IntType *err_client_abort_user_agent_bytes;
+  ts::Metrics::IntType *err_client_read_error_count;
+  ts::Metrics::IntType *err_client_read_error_origin_server_bytes;
+  ts::Metrics::IntType *err_client_read_error_user_agent_bytes;
+  ts::Metrics::IntType *err_connect_fail_count;
+  ts::Metrics::IntType *err_connect_fail_origin_server_bytes;
+  ts::Metrics::IntType *err_connect_fail_user_agent_bytes;
+  ts::Metrics::IntType *extension_method_requests;
+  ts::Metrics::IntType *get_requests;
+  ts::Metrics::IntType *head_requests;
+  ts::Metrics::IntType *https_incoming_requests;
+  ts::Metrics::IntType *https_total_client_connections;
+  ts::Metrics::IntType *incoming_requests;
+  ts::Metrics::IntType *incoming_responses;
+  ts::Metrics::IntType *invalid_client_requests;
+  ts::Metrics::IntType *misc_count;
+  ts::Metrics::IntType *misc_origin_server_bytes;
+  ts::Metrics::IntType *misc_user_agent_bytes;
+  ts::Metrics::IntType *missing_host_hdr;
+  ts::Metrics::IntType *options_requests;
+  ts::Metrics::IntType *origin_body;
+  ts::Metrics::IntType *origin_close_private;
+  ts::Metrics::IntType *origin_connect_adjust_thread;
+  ts::Metrics::IntType *origin_connections_throttled;
+  ts::Metrics::IntType *origin_make_new;
+  ts::Metrics::IntType *origin_no_sharing;
+  ts::Metrics::IntType *origin_not_found;
+  ts::Metrics::IntType *origin_private;
+  ts::Metrics::IntType *origin_raw;
+  ts::Metrics::IntType *origin_reuse;
+  ts::Metrics::IntType *origin_reuse_fail;
+  ts::Metrics::IntType *origin_server_request_document_total_size;
+  ts::Metrics::IntType *origin_server_request_header_total_size;
+  ts::Metrics::IntType *origin_server_response_document_total_size;
+  ts::Metrics::IntType *origin_server_response_header_total_size;
+  ts::Metrics::IntType *origin_shutdown_cleanup_entry;
+  ts::Metrics::IntType *origin_shutdown_migration_failure;
+  ts::Metrics::IntType *origin_shutdown_pool_lock_contention;
+  ts::Metrics::IntType *origin_shutdown_release_invalid_request;
+  ts::Metrics::IntType *origin_shutdown_release_invalid_response;
+  ts::Metrics::IntType *origin_shutdown_release_misc;
+  ts::Metrics::IntType *origin_shutdown_release_modified;
+  ts::Metrics::IntType *origin_shutdown_release_no_keep_alive;
+  ts::Metrics::IntType *origin_shutdown_release_no_server;
+  ts::Metrics::IntType *origin_shutdown_release_no_sharing;
+  ts::Metrics::IntType *origin_shutdown_tunnel_abort;
+  ts::Metrics::IntType *origin_shutdown_tunnel_client;
+  ts::Metrics::IntType *origin_shutdown_tunnel_server;
+  ts::Metrics::IntType *origin_shutdown_tunnel_server_detach;
+  ts::Metrics::IntType *origin_shutdown_tunnel_server_eos;
+  ts::Metrics::IntType *origin_shutdown_tunnel_server_no_keep_alive;
+  ts::Metrics::IntType *origin_shutdown_tunnel_server_plugin_tunnel;
+  ts::Metrics::IntType *origin_shutdown_tunnel_transform_read;
+  ts::Metrics::IntType *outgoing_requests;
+  ts::Metrics::IntType *parent_count;
+  ts::Metrics::IntType *parent_proxy_request_total_bytes;
+  ts::Metrics::IntType *parent_proxy_response_total_bytes;
+  ts::Metrics::IntType *parent_proxy_transaction_time;
+  ts::Metrics::IntType *pooled_server_connections;
+  ts::Metrics::IntType *post_body_too_large;
+  ts::Metrics::IntType *post_requests;
+  ts::Metrics::IntType *proxy_loop_detected;
+  ts::Metrics::IntType *proxy_mh_loop_detected;
+  ts::Metrics::IntType *purge_requests;
+  ts::Metrics::IntType *push_requests;
+  ts::Metrics::IntType *pushed_document_total_size;
+  ts::Metrics::IntType *pushed_response_header_total_size;
+  ts::Metrics::IntType *put_requests;
+  ts::Metrics::IntType *response_status_100_count;
+  ts::Metrics::IntType *response_status_101_count;
+  ts::Metrics::IntType *response_status_1xx_count;
+  ts::Metrics::IntType *response_status_200_count;
+  ts::Metrics::IntType *response_status_201_count;
+  ts::Metrics::IntType *response_status_202_count;
+  ts::Metrics::IntType *response_status_203_count;
+  ts::Metrics::IntType *response_status_204_count;
+  ts::Metrics::IntType *response_status_205_count;
+  ts::Metrics::IntType *response_status_206_count;
+  ts::Metrics::IntType *response_status_2xx_count;
+  ts::Metrics::IntType *response_status_300_count;
+  ts::Metrics::IntType *response_status_301_count;
+  ts::Metrics::IntType *response_status_302_count;
+  ts::Metrics::IntType *response_status_303_count;
+  ts::Metrics::IntType *response_status_304_count;
+  ts::Metrics::IntType *response_status_305_count;
+  ts::Metrics::IntType *response_status_307_count;
+  ts::Metrics::IntType *response_status_308_count;
+  ts::Metrics::IntType *response_status_3xx_count;
+  ts::Metrics::IntType *response_status_400_count;
+  ts::Metrics::IntType *response_status_401_count;
+  ts::Metrics::IntType *response_status_402_count;
+  ts::Metrics::IntType *response_status_403_count;
+  ts::Metrics::IntType *response_status_404_count;
+  ts::Metrics::IntType *response_status_405_count;
+  ts::Metrics::IntType *response_status_406_count;
+  ts::Metrics::IntType *response_status_407_count;
+  ts::Metrics::IntType *response_status_408_count;
+  ts::Metrics::IntType *response_status_409_count;
+  ts::Metrics::IntType *response_status_410_count;
+  ts::Metrics::IntType *response_status_411_count;
+  ts::Metrics::IntType *response_status_412_count;
+  ts::Metrics::IntType *response_status_413_count;
+  ts::Metrics::IntType *response_status_414_count;
+  ts::Metrics::IntType *response_status_415_count;
+  ts::Metrics::IntType *response_status_416_count;
+  ts::Metrics::IntType *response_status_4xx_count;
+  ts::Metrics::IntType *response_status_500_count;
+  ts::Metrics::IntType *response_status_501_count;
+  ts::Metrics::IntType *response_status_502_count;
+  ts::Metrics::IntType *response_status_503_count;
+  ts::Metrics::IntType *response_status_504_count;
+  ts::Metrics::IntType *response_status_505_count;
+  ts::Metrics::IntType *response_status_5xx_count;
+  ts::Metrics::IntType *server_begin_write_time;
+  ts::Metrics::IntType *server_close_time;
+  ts::Metrics::IntType *server_connect_end_time;
+  ts::Metrics::IntType *server_connect_time;
+  ts::Metrics::IntType *server_first_connect_time;
+  ts::Metrics::IntType *server_first_read_time;
+  ts::Metrics::IntType *server_read_header_done_time;
+  ts::Metrics::IntType *sm_finish_time;
+  ts::Metrics::IntType *sm_start_time;
+  ts::Metrics::IntType *tcp_client_refresh_count;
+  ts::Metrics::IntType *tcp_client_refresh_origin_server_bytes;
+  ts::Metrics::IntType *tcp_client_refresh_user_agent_bytes;
+  ts::Metrics::IntType *tcp_expired_miss_count;
+  ts::Metrics::IntType *tcp_expired_miss_origin_server_bytes;
+  ts::Metrics::IntType *tcp_expired_miss_user_agent_bytes;
+  ts::Metrics::IntType *tcp_hit_count;
+  ts::Metrics::IntType *tcp_hit_origin_server_bytes;
+  ts::Metrics::IntType *tcp_hit_user_agent_bytes;
+  ts::Metrics::IntType *tcp_ims_hit_count;
+  ts::Metrics::IntType *tcp_ims_hit_origin_server_bytes;
+  ts::Metrics::IntType *tcp_ims_hit_user_agent_bytes;
+  ts::Metrics::IntType *tcp_ims_miss_count;
+  ts::Metrics::IntType *tcp_ims_miss_origin_server_bytes;
+  ts::Metrics::IntType *tcp_ims_miss_user_agent_bytes;
+  ts::Metrics::IntType *tcp_miss_count;
+  ts::Metrics::IntType *tcp_miss_origin_server_bytes;
+  ts::Metrics::IntType *tcp_miss_user_agent_bytes;
+  ts::Metrics::IntType *tcp_refresh_hit_count;
+  ts::Metrics::IntType *tcp_refresh_hit_origin_server_bytes;
+  ts::Metrics::IntType *tcp_refresh_hit_user_agent_bytes;
+  ts::Metrics::IntType *tcp_refresh_miss_count;
+  ts::Metrics::IntType *tcp_refresh_miss_origin_server_bytes;
+  ts::Metrics::IntType *tcp_refresh_miss_user_agent_bytes;
+  ts::Metrics::IntType *total_client_connections;
+  ts::Metrics::IntType *total_client_connections_ipv4;
+  ts::Metrics::IntType *total_client_connections_ipv6;
+  ts::Metrics::IntType *total_incoming_connections;
+  ts::Metrics::IntType *total_parent_marked_down_count;
+  ts::Metrics::IntType *total_parent_proxy_connections;
+  ts::Metrics::IntType *total_parent_retries;
+  ts::Metrics::IntType *total_parent_retries_exhausted;
+  ts::Metrics::IntType *total_parent_switches;
+  ts::Metrics::IntType *total_server_connections;
+  ts::Metrics::IntType *total_transactions_time;
+  ts::Metrics::IntType *total_x_redirect;
+  ts::Metrics::IntType *trace_requests;
+  ts::Metrics::IntType *tunnel_current_active_connections;
+  ts::Metrics::IntType *tunnels;
+  ts::Metrics::IntType *ua_begin_time;
+  ts::Metrics::IntType *ua_begin_write_time;
+  ts::Metrics::IntType *ua_close_time;
+  ts::Metrics::IntType *ua_counts_errors_aborts;
+  ts::Metrics::IntType *ua_counts_errors_connect_failed;
+  ts::Metrics::IntType *ua_counts_errors_other;
+  ts::Metrics::IntType *ua_counts_errors_possible_aborts;
+  ts::Metrics::IntType *ua_counts_errors_pre_accept_hangups;
+  ts::Metrics::IntType *ua_counts_hit_fresh;
+  ts::Metrics::IntType *ua_counts_hit_fresh_process;
+  ts::Metrics::IntType *ua_counts_hit_reval;
+  ts::Metrics::IntType *ua_counts_miss_changed;
+  ts::Metrics::IntType *ua_counts_miss_client_no_cache;
+  ts::Metrics::IntType *ua_counts_miss_cold;
+  ts::Metrics::IntType *ua_counts_miss_uncacheable;
+  ts::Metrics::IntType *ua_counts_other_unclassified;
+  ts::Metrics::IntType *ua_first_read_time;
+  ts::Metrics::IntType *ua_msecs_errors_aborts;
+  ts::Metrics::IntType *ua_msecs_errors_connect_failed;
+  ts::Metrics::IntType *ua_msecs_errors_other;
+  ts::Metrics::IntType *ua_msecs_errors_possible_aborts;
+  ts::Metrics::IntType *ua_msecs_errors_pre_accept_hangups;
+  ts::Metrics::IntType *ua_msecs_hit_fresh;
+  ts::Metrics::IntType *ua_msecs_hit_fresh_process;
+  ts::Metrics::IntType *ua_msecs_hit_reval;
+  ts::Metrics::IntType *ua_msecs_miss_changed;
+  ts::Metrics::IntType *ua_msecs_miss_client_no_cache;
+  ts::Metrics::IntType *ua_msecs_miss_cold;
+  ts::Metrics::IntType *ua_msecs_miss_uncacheable;
+  ts::Metrics::IntType *ua_msecs_other_unclassified;
+  ts::Metrics::IntType *ua_read_header_done_time;
+  ts::Metrics::IntType *user_agent_request_document_total_size;
+  ts::Metrics::IntType *user_agent_request_header_total_size;
+  ts::Metrics::IntType *user_agent_response_document_total_size;
+  ts::Metrics::IntType *user_agent_response_header_total_size;
+  ts::Metrics::IntType *websocket_current_active_client_connections;
 };
 
 enum CacheOpenWriteFailAction_t {
@@ -381,22 +318,7 @@ enum CacheOpenWriteFailAction_t {
   TOTAL_CACHE_WL_FAIL_ACTION_TYPES
 };
 
-extern RecRawStatBlock *http_rsb;
-
-/* Stats should only be accessed using these macros */
-#define HTTP_INCREMENT_DYN_STAT(x)     RecIncrRawStat(http_rsb, this_ethread(), (int)x, 1)
-#define HTTP_DECREMENT_DYN_STAT(x)     RecIncrRawStat(http_rsb, this_ethread(), (int)x, -1)
-#define HTTP_SUM_DYN_STAT(x, y)        RecIncrRawStat(http_rsb, this_ethread(), (int)x, (int64_t)y)
-#define HTTP_SUM_GLOBAL_DYN_STAT(x, y) RecIncrGlobalRawStatSum(http_rsb, x, y)
-
-#define HTTP_CLEAR_DYN_STAT(x)          \
-  do {                                  \
-    RecSetRawStatSum(http_rsb, x, 0);   \
-    RecSetRawStatCount(http_rsb, x, 0); \
-  } while (0);
-
-#define HTTP_READ_DYN_SUM(x, S)        RecGetRawStatSum(http_rsb, (int)x, &S) // This aggregates threads too
-#define HTTP_READ_GLOBAL_DYN_SUM(x, S) RecGetGlobalRawStatSum(http_rsb, (int)x, &S)
+extern HttpStatsBlock http_rsb;
 
 /////////////////////////////////////////////////////////////
 //
diff --git a/proxy/http/HttpSM.cc b/proxy/http/HttpSM.cc
index 7babbe6070..919a079f4d 100644
--- a/proxy/http/HttpSM.cc
+++ b/proxy/http/HttpSM.cc
@@ -1603,7 +1603,7 @@ HttpSM::handle_api_return()
       // a blind tunnel.
       IOBufferReader *initial_data = nullptr;
       if (t_state.is_websocket) {
-        HTTP_INCREMENT_DYN_STAT(http_websocket_current_active_client_connections_stat);
+        Metrics::increment(http_rsb.websocket_current_active_client_connections);
         if (server_txn) {
           initial_data = server_txn->get_remote_reader();
         }
@@ -1720,8 +1720,8 @@ HttpSM::create_server_txn(PoolableSession *new_session)
     server_txn->attach_transaction(this);
     if (t_state.current.request_to == ResolveInfo::PARENT_PROXY) {
       new_session->to_parent_proxy = true;
-      HTTP_INCREMENT_DYN_STAT(http_current_parent_proxy_connections_stat);
-      HTTP_INCREMENT_DYN_STAT(http_total_parent_proxy_connections_stat);
+      Metrics::increment(http_rsb.current_parent_proxy_connections);
+      Metrics::increment(http_rsb.total_parent_proxy_connections);
     } else {
       new_session->to_parent_proxy = false;
     }
@@ -1841,7 +1841,7 @@ HttpSM::state_http_server_open(int event, void *data)
       t_state.client_info.keep_alive = HTTP_NO_KEEPALIVE; // part of the problem, clear it.
       terminate_sm                   = true;
     } else if (ENET_THROTTLING == t_state.current.server->connect_result) {
-      HTTP_INCREMENT_DYN_STAT(http_origin_connections_throttled_stat);
+      Metrics::increment(http_rsb.origin_connections_throttled);
       send_origin_throttled_response();
     } else {
       // Go ahead and release the failed server session.  Since it didn't receive a response, the release logic will
@@ -2454,7 +2454,7 @@ HttpSM::state_cache_open_write(int event, void *data)
   if (_ua.get_txn()) {
     pending_action = _ua.get_txn()->adjust_thread(this, event, data);
     if (!pending_action.empty()) {
-      HTTP_INCREMENT_DYN_STAT(http_cache_open_write_adjust_thread_stat);
+      Metrics::increment(http_rsb.cache_open_write_adjust_thread);
       return 0; // Go away if we reschedule
     }
     NetVConnection *vc = _ua.get_txn()->get_netvc();
@@ -3006,7 +3006,7 @@ HttpSM::tunnel_handler(int event, void *data)
   terminate_sm = true;
 
   if (unlikely(t_state.is_websocket)) {
-    HTTP_DECREMENT_DYN_STAT(http_websocket_current_active_client_connections_stat);
+    Metrics::decrement(http_rsb.websocket_current_active_client_connections);
   }
 
   return 0;
@@ -3067,11 +3067,11 @@ HttpSM::tunnel_handler_server(int event, HttpTunnelProducer *p)
     close_connection = false;
   } else {
     if (t_state.current.server->keep_alive != HTTP_KEEPALIVE) {
-      HTTP_INCREMENT_DYN_STAT(http_origin_shutdown_tunnel_server_no_keep_alive);
+      Metrics::increment(http_rsb.origin_shutdown_tunnel_server_no_keep_alive);
     } else if (server_entry->eos == true) {
-      HTTP_INCREMENT_DYN_STAT(http_origin_shutdown_tunnel_server_eos);
+      Metrics::increment(http_rsb.origin_shutdown_tunnel_server_eos);
     } else {
-      HTTP_INCREMENT_DYN_STAT(http_origin_shutdown_tunnel_server_plugin_tunnel);
+      Metrics::increment(http_rsb.origin_shutdown_tunnel_server_plugin_tunnel);
     }
     close_connection = true;
   }
@@ -3100,7 +3100,7 @@ HttpSM::tunnel_handler_server(int event, HttpTunnelProducer *p)
       t_state.current.server->state = HttpTransact::TRANSACTION_COMPLETE;
       break;
     }
-    HTTP_INCREMENT_DYN_STAT(http_origin_shutdown_tunnel_server);
+    Metrics::increment(http_rsb.origin_shutdown_tunnel_server);
     close_connection = true;
 
     ink_assert(p->vc_type == HT_HTTP_SERVER);
@@ -3178,7 +3178,7 @@ HttpSM::tunnel_handler_server(int event, HttpTunnelProducer *p)
     p->read_success               = true;
     t_state.current.server->state = HttpTransact::TRANSACTION_COMPLETE;
     t_state.current.server->abort = HttpTransact::DIDNOT_ABORT;
-    HTTP_INCREMENT_DYN_STAT(http_origin_shutdown_tunnel_server_detach);
+    Metrics::increment(http_rsb.origin_shutdown_tunnel_server_detach);
     close_connection = true;
     break;
 
@@ -3199,7 +3199,7 @@ HttpSM::tunnel_handler_server(int event, HttpTunnelProducer *p)
   // If we had a ground fill, check update our status
   if (background_fill == BACKGROUND_FILL_STARTED) {
     background_fill = p->read_success ? BACKGROUND_FILL_COMPLETED : BACKGROUND_FILL_ABORTED;
-    HTTP_DECREMENT_DYN_STAT(http_background_fill_current_count_stat);
+    Metrics::decrement(http_rsb.background_fill_current_count);
   }
   // We handled the event.  Now either shutdown the connection or
   //   setup it up for keep-alive
@@ -3446,8 +3446,8 @@ HttpSM::tunnel_handler_ua(int event, HttpTunnelConsumer *c)
       // There is another consumer (cache write) so
       //  detach the user agent
       if (background_fill == BACKGROUND_FILL_STARTED) {
-        HTTP_INCREMENT_DYN_STAT(http_background_fill_current_count_stat);
-        HTTP_INCREMENT_DYN_STAT(http_background_fill_total_count_stat);
+        Metrics::increment(http_rsb.background_fill_current_count);
+        Metrics::increment(http_rsb.background_fill_total_count);
 
         ink_assert(c->is_downstream_from(server_txn));
         server_txn->set_active_timeout(HRTIME_SECONDS(t_state.txn_conf->background_fill_active_timeout));
@@ -3664,7 +3664,7 @@ HttpSM::tunnel_handler_cache_read(int event, HttpTunnelProducer *p)
       p->vc->do_io_close(EHTTP_ERROR);
       p->read_vio = nullptr;
       tunnel.chain_abort_all(p);
-      HTTP_INCREMENT_DYN_STAT(http_cache_read_errors);
+      Metrics::increment(http_rsb.cache_read_errors);
       break;
     } else {
       tunnel.local_finish_all(p);
@@ -3685,7 +3685,7 @@ HttpSM::tunnel_handler_cache_read(int event, HttpTunnelProducer *p)
     break;
   }
 
-  HTTP_DECREMENT_DYN_STAT(http_current_cache_connections_stat);
+  Metrics::decrement(http_rsb.current_cache_connections);
   return 0;
 }
 
@@ -3706,7 +3706,7 @@ HttpSM::tunnel_handler_cache_write(int event, HttpTunnelConsumer *c)
     c->write_vio = nullptr;
     c->vc->do_io_close(EHTTP_ERROR);
 
-    HTTP_INCREMENT_DYN_STAT(http_cache_write_errors);
+    Metrics::increment(http_rsb.cache_write_errors);
     SMDebug("http", "aborting cache write due %s event from cache", HttpDebugNames::get_event_name(event));
     // abort the producer if the cache_writevc is the only consumer.
     if (c->producer->alive && c->producer->num_consumers == 1) {
@@ -3740,7 +3740,7 @@ HttpSM::tunnel_handler_cache_write(int event, HttpTunnelConsumer *c)
     server_response_body_bytes = c->bytes_written;
   }
 
-  HTTP_DECREMENT_DYN_STAT(http_current_cache_connections_stat);
+  Metrics::decrement(http_rsb.current_cache_connections);
   return 0;
 }
 
@@ -4231,7 +4231,7 @@ HttpSM::tunnel_handler_transform_read(int event, HttpTunnelProducer *p)
   //  transform hasn't detached yet.  If it is still alive,
   //  don't close the transform vc
   if (p->self_consumer->alive == false) {
-    HTTP_INCREMENT_DYN_STAT(http_origin_shutdown_tunnel_transform_read);
+    Metrics::increment(http_rsb.origin_shutdown_tunnel_transform_read);
     p->vc->do_io_close();
   }
   p->handler_state = HTTP_SM_TRANSFORM_CLOSED;
@@ -4934,7 +4934,7 @@ HttpSM::do_cache_lookup_and_read()
   t_state.request_sent_time      = UNDEFINED_TIME;
   t_state.response_received_time = UNDEFINED_TIME;
 
-  HTTP_INCREMENT_DYN_STAT(http_cache_lookups_stat);
+  Metrics::increment(http_rsb.cache_lookups);
 
   milestones[TS_MILESTONE_CACHE_OPEN_READ_BEGIN] = ink_get_hrtime();
   t_state.cache_lookup_result                    = HttpTransact::CACHE_LOOKUP_NONE;
@@ -5382,16 +5382,16 @@ HttpSM::do_http_server_open(bool raw, bool only_direct)
 
     switch (shared_result) {
     case HSM_DONE:
-      HTTP_INCREMENT_DYN_STAT(http_origin_reuse);
+      Metrics::increment(http_rsb.origin_reuse);
       hsm_release_assert(server_txn != nullptr);
       handle_http_server_open();
       return;
     case HSM_NOT_FOUND:
-      HTTP_INCREMENT_DYN_STAT(http_origin_not_found);
+      Metrics::increment(http_rsb.origin_not_found);
       hsm_release_assert(server_txn == nullptr);
       break;
     case HSM_RETRY:
-      HTTP_INCREMENT_DYN_STAT(http_origin_reuse_fail);
+      Metrics::increment(http_rsb.origin_reuse_fail);
       //  Could not get shared pool lock
       //   FIX: should retry lock
       break;
@@ -5439,15 +5439,15 @@ HttpSM::do_http_server_open(bool raw, bool only_direct)
   }
 
   if (!try_reuse) {
-    HTTP_INCREMENT_DYN_STAT(http_origin_make_new);
+    Metrics::increment(http_rsb.origin_make_new);
     if (TS_SERVER_SESSION_SHARING_MATCH_NONE == t_state.txn_conf->server_session_sharing_match) {
-      HTTP_INCREMENT_DYN_STAT(http_origin_no_sharing);
+      Metrics::increment(http_rsb.origin_no_sharing);
     } else if ((t_state.txn_conf->keep_alive_post_out != 1 && t_state.hdr_info.request_content_length > 0)) {
-      HTTP_INCREMENT_DYN_STAT(http_origin_body);
+      Metrics::increment(http_rsb.origin_body);
     } else if (is_private()) {
-      HTTP_INCREMENT_DYN_STAT(http_origin_private);
+      Metrics::increment(http_rsb.origin_private);
     } else if (raw) {
-      HTTP_INCREMENT_DYN_STAT(http_origin_raw);
+      Metrics::increment(http_rsb.origin_raw);
     } else {
       ink_release_assert(_ua.get_txn() == nullptr);
     }
@@ -5468,15 +5468,7 @@ HttpSM::do_http_server_open(bool raw, bool only_direct)
   // Atomically read the current number of connections and check to see
   // if we have gone above the max allowed.
   if (t_state.http_config_param->server_max_connections > 0) {
-    int64_t sum;
-
-    HTTP_READ_GLOBAL_DYN_SUM(http_current_server_connections_stat, sum);
-
-    // Note that there is a potential race condition here where
-    // the value of the http_current_server_connections_stat gets changed
-    // between the statement above and the check below.
-    // If this happens, we might go over the max by 1 but this is ok.
-    if (sum >= t_state.http_config_param->server_max_connections) {
+    if (Metrics::read(http_rsb.current_server_connections) >= t_state.http_config_param->server_max_connections) {
       httpSessionManager.purge_keepalives();
       // Eventually may want to have a queue as the origin_max_connection does to allow for a combination
       // of retries and errors.  But at this point, we are just going to allow the error case.
@@ -5502,7 +5494,7 @@ HttpSM::do_http_server_open(bool raw, bool only_direct)
       ink_assert(pending_action.empty()); // in case of reschedule must not have already pending.
 
       ct_state.blocked();
-      HTTP_INCREMENT_DYN_STAT(http_origin_connections_throttled_stat);
+      Metrics::increment(http_rsb.origin_connections_throttled);
       ct_state.Warn_Blocked(&t_state.txn_conf->outbound_conntrack, sm_id, ccount - 1, &t_state.current.server->dst_addr.sa,
                             debug_on && is_debug_tag_set("http") ? "http" : nullptr);
       send_origin_throttled_response();
@@ -5881,21 +5873,21 @@ HttpSM::release_server_session(bool serve_from_cache)
   } else {
     server_txn->do_io_close();
     if (TS_SERVER_SESSION_SHARING_MATCH_NONE == t_state.txn_conf->server_session_sharing_match) {
-      HTTP_INCREMENT_DYN_STAT(http_origin_shutdown_release_no_sharing);
+      Metrics::increment(http_rsb.origin_shutdown_release_no_sharing);
     } else if (t_state.current.server == nullptr) {
-      HTTP_INCREMENT_DYN_STAT(http_origin_shutdown_release_no_server);
+      Metrics::increment(http_rsb.origin_shutdown_release_no_server);
     } else if (t_state.current.server->keep_alive != HTTP_KEEPALIVE) {
-      HTTP_INCREMENT_DYN_STAT(http_origin_shutdown_release_no_keep_alive);
+      Metrics::increment(http_rsb.origin_shutdown_release_no_keep_alive);
     } else if (!t_state.hdr_info.server_response.valid()) {
-      HTTP_INCREMENT_DYN_STAT(http_origin_shutdown_release_invalid_response);
+      Metrics::increment(http_rsb.origin_shutdown_release_invalid_response);
     } else if (!t_state.hdr_info.server_request.valid()) {
-      HTTP_INCREMENT_DYN_STAT(http_origin_shutdown_release_invalid_request);
+      Metrics::increment(http_rsb.origin_shutdown_release_invalid_request);
     } else if (t_state.hdr_info.server_response.status_get() != HTTP_STATUS_NOT_MODIFIED &&
                (t_state.hdr_info.server_request.method_get_wksidx() != HTTP_WKSIDX_HEAD ||
                 t_state.www_auth_content == HttpTransact::CACHE_AUTH_NONE)) {
-      HTTP_INCREMENT_DYN_STAT(http_origin_shutdown_release_modified);
+      Metrics::increment(http_rsb.origin_shutdown_release_modified);
     } else {
-      HTTP_INCREMENT_DYN_STAT(http_origin_shutdown_release_misc);
+      Metrics::increment(http_rsb.origin_shutdown_release_misc);
     }
   }
 
@@ -8236,7 +8228,7 @@ HttpSM::do_redirect()
         ats_free((void *)redirect_url);
         redirect_url     = nullptr;
         redirect_url_len = 0;
-        HTTP_INCREMENT_DYN_STAT(http_total_x_redirect_stat);
+        Metrics::increment(http_rsb.total_x_redirect);
       } else {
         // get the location header and setup the redirect
         int redir_len = 0;
diff --git a/proxy/http/HttpSessionAccept.cc b/proxy/http/HttpSessionAccept.cc
index c7a1cb2a1d..278efe25af 100644
--- a/proxy/http/HttpSessionAccept.cc
+++ b/proxy/http/HttpSessionAccept.cc
@@ -81,7 +81,8 @@ HttpSessionAccept::mainEvent(int event, void *data)
   /////////////////
   if (((long)data) == -ECONNABORTED) {
     // FIX: add time to user_agent_hangup
-    HTTP_SUM_DYN_STAT(http_ua_msecs_counts_errors_pre_accept_hangups_stat, 0);
+    Metrics::increment(http_rsb.ua_counts_errors_pre_accept_hangups);
+    // Metrics::increment(http_rsb.ua_msecs_errors_pre_accept_hangups, 0); // ToDo: Weird, but we added 0 here before
   }
 
   ink_abort("HTTP accept received fatal error: errno = %d", -(static_cast<int>((intptr_t)data)));
diff --git a/proxy/http/HttpSessionManager.cc b/proxy/http/HttpSessionManager.cc
index 09aeb8d73e..5d3745d8b8 100644
--- a/proxy/http/HttpSessionManager.cc
+++ b/proxy/http/HttpSessionManager.cc
@@ -423,7 +423,7 @@ HttpSessionManager::_acquire_session(sockaddr const *ip, CryptoHash const &hostn
               ink_assert(new_vc == nullptr || new_vc->nh != nullptr);
               if (!new_vc) {
                 // Close out to_return, we were't able to get a connection
-                HTTP_INCREMENT_DYN_STAT(http_origin_shutdown_migration_failure);
+                Metrics::increment(http_rsb.origin_shutdown_migration_failure);
                 to_return->do_io_close();
                 to_return = nullptr;
                 retval    = HSM_NOT_FOUND;
@@ -500,7 +500,7 @@ ServerSessionPool::removeSession(PoolableSession *to_remove)
   }
   m_fqdn_pool.erase(to_remove);
   if (m_ip_pool.erase(to_remove)) {
-    HTTP_DECREMENT_DYN_STAT(http_pooled_server_connections_stat);
+    Metrics::decrement(http_rsb.pooled_server_connections);
   }
   if (is_debug_tag_set("http_ss")) {
     Debug("http_ss", "After Remove session %p m_fqdn_pool size=%zu m_ip_pool_size=%zu", to_remove, m_fqdn_pool.count(),
@@ -516,7 +516,7 @@ ServerSessionPool::addSession(PoolableSession *ss)
   // put it in the pools.
   m_ip_pool.insert(ss);
   m_fqdn_pool.insert(ss);
-  HTTP_INCREMENT_DYN_STAT(http_pooled_server_connections_stat);
+  Metrics::increment(http_rsb.pooled_server_connections);
 
   if (is_debug_tag_set("http_ss")) {
     char peer_ip[INET6_ADDRPORTSTRLEN];
diff --git a/proxy/http/HttpTransact.cc b/proxy/http/HttpTransact.cc
index f379b16b5b..0e5c9562c9 100644
--- a/proxy/http/HttpTransact.cc
+++ b/proxy/http/HttpTransact.cc
@@ -189,7 +189,7 @@ inline static void
 findParent(HttpTransact::State *s)
 {
   url_mapping *mp = s->url_map.getMapping();
-  HTTP_INCREMENT_DYN_STAT(http_parent_count);
+  Metrics::increment(http_rsb.parent_count);
   if (s->response_action.handled) {
     s->parent_result.hostname = s->response_action.action.hostname;
     s->parent_result.port     = s->response_action.action.port;
@@ -214,7 +214,7 @@ findParent(HttpTransact::State *s)
 inline static void
 markParentDown(HttpTransact::State *s)
 {
-  HTTP_INCREMENT_DYN_STAT(http_total_parent_marked_down_count);
+  Metrics::increment(http_rsb.total_parent_marked_down_count);
   url_mapping *mp = s->url_map.getMapping();
 
   TxnDebug("http_trans", "enable_parent_timeout_markdowns: %d, disable_parent_markdowns: %d",
@@ -280,7 +280,7 @@ nextParent(HttpTransact::State *s)
   TxnDebug("parent_down", "connection to parent %s failed, conn_state: %s, request to origin: %s", s->parent_result.hostname,
            HttpDebugNames::get_server_state_name(s->current.state), s->request_data.get_host());
   url_mapping *mp = s->url_map.getMapping();
-  HTTP_INCREMENT_DYN_STAT(http_parent_count);
+  Metrics::increment(http_rsb.parent_count);
   if (s->response_action.handled) {
     s->parent_result.hostname = s->response_action.action.hostname;
     s->parent_result.port     = s->response_action.action.port;
@@ -910,7 +910,7 @@ HttpTransact::OriginDown(State *s)
   TxnDebug("http_trans", "origin server is marked down");
   bootstrap_state_variables_from_request(s, &s->hdr_info.client_request);
   build_error_response(s, HTTP_STATUS_BAD_GATEWAY, "Origin Server Marked Down", "connect#failed_connect");
-  HTTP_INCREMENT_DYN_STAT(http_down_server_no_requests);
+  Metrics::increment(http_rsb.down_server_no_requests);
   char *url_str = s->hdr_info.client_request.url_string_get(&s->arena);
   int host_len;
   const char *host_name_ptr = s->unmapped_url.host_get(&host_len);
@@ -1195,7 +1195,7 @@ done:
   */
   if (!s->reverse_proxy && s->state_machine->plugin_tunnel_type == HTTP_NO_PLUGIN_TUNNEL) {
     TxnDebug("http_trans", "END HttpTransact::EndRemapRequest");
-    HTTP_INCREMENT_DYN_STAT(http_invalid_client_requests_stat);
+    Metrics::increment(http_rsb.invalid_client_requests);
     TRANSACT_RETURN(SM_ACTION_SEND_ERROR_CACHE_NOOP, nullptr);
   } else {
     s->hdr_info.client_response.destroy(); // release the underlying memory.
@@ -1490,10 +1490,10 @@ HttpTransact::HandleRequest(State *s)
   if (!s->state_machine->is_waiting_for_full_body && !s->state_machine->is_using_post_buffer) {
     ink_assert(!s->hdr_info.server_request.valid());
 
-    HTTP_INCREMENT_DYN_STAT(http_incoming_requests_stat);
+    Metrics::increment(http_rsb.incoming_requests);
 
     if (s->client_info.port_attribute == HttpProxyPort::TRANSPORT_SSL) {
-      HTTP_INCREMENT_DYN_STAT(https_incoming_requests_stat);
+      Metrics::increment(http_rsb.https_incoming_requests);
     }
 
     ///////////////////////////////////////////////
@@ -1501,7 +1501,7 @@ HttpTransact::HandleRequest(State *s)
     ///////////////////////////////////////////////
 
     if (!(is_request_valid(s, &s->hdr_info.client_request))) {
-      HTTP_INCREMENT_DYN_STAT(http_invalid_client_requests_stat);
+      Metrics::increment(http_rsb.invalid_client_requests);
       TxnDebug("http_seq", "request invalid.");
       s->next_action = SM_ACTION_SEND_ERROR_CACHE_NOOP;
       //  s->next_action = HttpTransact::PROXY_INTERNAL_CACHE_NOOP;
@@ -1518,9 +1518,7 @@ HttpTransact::HandleRequest(State *s)
     initialize_state_variables_from_request(s, &s->hdr_info.client_request);
     // The following chunk of code will limit the maximum number of websocket connections (TS-3659)
     if (s->is_upgrade_request && s->is_websocket && s->http_config_param->max_websocket_connections >= 0) {
-      int64_t val = 0;
-      HTTP_READ_DYN_SUM(http_websocket_current_active_client_connections_stat, val);
-      if (val >= s->http_config_param->max_websocket_connections) {
+      if (Metrics::read(http_rsb.websocket_current_active_client_connections) >= s->http_config_param->max_websocket_connections) {
         s->is_websocket = false; // unset to avoid screwing up stats.
         TxnDebug("http_trans", "Rejecting websocket connection because the limit has been exceeded");
         bootstrap_state_variables_from_request(s, &s->hdr_info.client_request);
@@ -1534,7 +1532,7 @@ HttpTransact::HandleRequest(State *s)
         s->hdr_info.request_content_length > s->http_config_param->max_post_size) {
       TxnDebug("http_trans", "Max post size %" PRId64 " Client tried to post a body that was too large.",
                s->http_config_param->max_post_size);
-      HTTP_INCREMENT_DYN_STAT(http_post_body_too_large);
+      Metrics::increment(http_rsb.post_body_too_large);
       bootstrap_state_variables_from_request(s, &s->hdr_info.client_request);
       build_error_response(s, HTTP_STATUS_REQUEST_ENTITY_TOO_LARGE, "Request Entity Too Large", "request#entity_too_large");
       s->squid_codes.log_code = SQUID_LOG_ERR_POST_ENTITY_TOO_LARGE;
@@ -1552,7 +1550,7 @@ HttpTransact::HandleRequest(State *s)
         if (ptr_len_casecmp(expect_hdr_val, expect_hdr_val_len, HTTP_VALUE_100_CONTINUE, HTTP_LEN_100_CONTINUE) == 0) {
           // Let's error out this request.
           TxnDebug("http_trans", "Client sent a post expect: 100-continue, sending 405.");
-          HTTP_INCREMENT_DYN_STAT(disallowed_post_100_continue);
+          Metrics::increment(http_rsb.disallowed_post_100_continue);
           build_error_response(s, HTTP_STATUS_METHOD_NOT_ALLOWED, "Method Not Allowed", "request#method_unsupported");
           TRANSACT_RETURN(SM_ACTION_SEND_ERROR_CACHE_NOOP, nullptr);
         }
@@ -1682,7 +1680,7 @@ HttpTransact::setup_plugin_request_intercept(State *s)
   if (s->cache_info.action != HttpTransact::CACHE_DO_NO_ACTION) {
     s->cache_info.action = HttpTransact::CACHE_DO_NO_ACTION;
     s->current.mode      = TUNNELLING_PROXY;
-    HTTP_INCREMENT_DYN_STAT(http_tunnels_stat);
+    Metrics::increment(http_rsb.tunnels);
   }
   // Regardless of the protocol we're gatewaying to
   //   we see the scheme as http
@@ -2097,7 +2095,7 @@ HttpTransact::DecideCacheLookup(State *s)
     } else {
       s->cache_info.action = CACHE_DO_NO_ACTION;
       s->current.mode      = TUNNELLING_PROXY;
-      HTTP_INCREMENT_DYN_STAT(http_tunnels_stat);
+      Metrics::increment(http_rsb.tunnels);
     }
   }
 
@@ -3428,7 +3426,7 @@ HttpTransact::HandleResponse(State *s)
   TxnDebug("http_trans", "response_received_time: %" PRId64, (int64_t)s->response_received_time);
   DUMP_HEADER("http_hdrs", &s->hdr_info.server_response, s->state_machine_id(), "Incoming O.S. Response");
 
-  HTTP_INCREMENT_DYN_STAT(http_incoming_responses_stat);
+  Metrics::increment(http_rsb.incoming_responses);
 
   ink_release_assert(s->current.request_to != ResolveInfo::UNDEFINED_LOOKUP);
   if (s->cache_info.action != CACHE_DO_WRITE) {
@@ -3648,13 +3646,13 @@ HttpTransact::handle_response_from_parent(State *s)
     }
 
     if (s->current.retry_attempts.get() < (s->txn_conf->parent_connect_attempts - 1)) {
-      HTTP_INCREMENT_DYN_STAT(http_total_parent_retries_stat);
+      Metrics::increment(http_rsb.total_parent_retries);
       s->current.retry_attempts.increment();
 
       // Are we done with this particular parent?
       if (s->current.retry_attempts.get() % s->txn_conf->per_parent_connect_attempts != 0) {
         // No we are not done with this parent so retry
-        HTTP_INCREMENT_DYN_STAT(http_total_parent_switches_stat);
+        Metrics::increment(http_rsb.total_parent_switches);
         s->next_action = how_to_open_connection(s);
         TxnDebug("http_trans", "%s Retrying parent for attempt %d, max %" PRId64, "[handle_response_from_parent]",
                  s->current.retry_attempts.get(), s->txn_conf->per_parent_connect_attempts);
@@ -3662,7 +3660,7 @@ HttpTransact::handle_response_from_parent(State *s)
       } else {
         TxnDebug("http_trans", "%s %d per parent attempts exhausted", "[handle_response_from_parent]",
                  s->current.retry_attempts.get());
-        HTTP_INCREMENT_DYN_STAT(http_total_parent_retries_exhausted_stat);
+        Metrics::increment(http_rsb.total_parent_retries_exhausted);
 
         // Only mark the parent down if we failed to connect
         //  to the parent otherwise slow origin servers cause
@@ -3676,7 +3674,7 @@ HttpTransact::handle_response_from_parent(State *s)
     } else {
       // Done trying parents... fail over to origin server if that is
       //   appropriate
-      HTTP_INCREMENT_DYN_STAT(http_total_parent_retries_exhausted_stat);
+      Metrics::increment(http_rsb.total_parent_retries_exhausted);
       TxnDebug("http_trans", "Error. No more retries.");
       if (s->current.state == CONNECTION_ERROR || s->current.state == INACTIVE_TIMEOUT) {
         markParentDown(s);
@@ -3897,7 +3895,7 @@ HttpTransact::handle_server_connection_not_open(State *s)
   ink_assert(s->current.state != CONNECTION_ALIVE);
 
   SET_VIA_STRING(VIA_SERVER_RESULT, VIA_SERVER_ERROR);
-  HTTP_INCREMENT_DYN_STAT(http_broken_server_connections_stat);
+  Metrics::increment(http_rsb.broken_server_connections);
 
   // Fire off a hostdb update to mark the server as down
   s->state_machine->do_hostdb_update_if_necessary();
@@ -4358,7 +4356,7 @@ HttpTransact::handle_cache_operation_on_forward_server_response(State *s)
         base_response->set_expires(exp_time);
 
         SET_VIA_STRING(VIA_CACHE_FILL_ACTION, VIA_CACHE_UPDATED);
-        HTTP_INCREMENT_DYN_STAT(http_cache_updates_stat);
+        Metrics::increment(http_rsb.cache_updates);
 
         // unset Cache-control: "need-revalidate-once" (if it's set)
         // This directive is used internally by T.S. to invalidate
@@ -4561,12 +4559,12 @@ HttpTransact::handle_cache_operation_on_forward_server_response(State *s)
   case CACHE_DO_DELETE:
     TxnDebug("http_trans", "[hcoofsr] delete cached copy");
     SET_VIA_STRING(VIA_CACHE_FILL_ACTION, VIA_CACHE_DELETED);
-    HTTP_INCREMENT_DYN_STAT(http_cache_deletes_stat);
+    Metrics::increment(http_rsb.cache_deletes);
     break;
   case CACHE_DO_WRITE:
     TxnDebug("http_trans", "[hcoofsr] cache write");
     SET_VIA_STRING(VIA_CACHE_FILL_ACTION, VIA_CACHE_WRITTEN);
-    HTTP_INCREMENT_DYN_STAT(http_cache_writes_stat);
+    Metrics::increment(http_rsb.cache_writes);
     break;
   case CACHE_DO_SERVE_AND_UPDATE:
   // fall through
@@ -4575,7 +4573,7 @@ HttpTransact::handle_cache_operation_on_forward_server_response(State *s)
   case CACHE_DO_REPLACE:
     TxnDebug("http_trans", "[hcoofsr] cache update/replace");
     SET_VIA_STRING(VIA_CACHE_FILL_ACTION, VIA_CACHE_UPDATED);
-    HTTP_INCREMENT_DYN_STAT(http_cache_updates_stat);
+    Metrics::increment(http_rsb.cache_updates);
     break;
   default:
     break;
@@ -5419,7 +5417,7 @@ HttpTransact::check_request_validity(State *s, HTTPHdr *incoming_hdr)
   if (!incoming_hdr->presence(MIME_PRESENCE_HOST) && incoming_hdr->version_get() != HTTP_0_9) {
     // Update the number of incoming 1.0 or 1.1 requests that do
     // not contain Host header fields.
-    HTTP_INCREMENT_DYN_STAT(http_missing_host_hdr_stat);
+    Metrics::increment(http_rsb.missing_host_hdr);
   }
   // Did the client send a "TE: identity;q=0"? We have to respond
   // with an error message because we only support identity
@@ -5576,7 +5574,7 @@ HttpTransact::handle_trace_and_options_requests(State *s, HTTPHdr *incoming_hdr)
     // Trace and Options requests should not be looked up in cache.
     // s->cache_info.action = CACHE_DO_NO_ACTION;
     s->current.mode = TUNNELLING_PROXY;
-    HTTP_INCREMENT_DYN_STAT(http_tunnels_stat);
+    Metrics::increment(http_rsb.tunnels);
     return false;
   }
 
@@ -5642,7 +5640,7 @@ HttpTransact::handle_trace_and_options_requests(State *s, HTTPHdr *incoming_hdr)
     // Trace and Options requests should not be looked up in cache.
     // s->cache_info.action = CACHE_DO_NO_ACTION;
     s->current.mode = TUNNELLING_PROXY;
-    HTTP_INCREMENT_DYN_STAT(http_tunnels_stat);
+    Metrics::increment(http_rsb.tunnels);
   }
 
   return false;
@@ -5750,27 +5748,27 @@ HttpTransact::initialize_state_variables_from_request(State *s, HTTPHdr *obsolet
   if (!do_increment_stat) {
     ;
   } else if (s->method == HTTP_WKSIDX_GET) {
-    HTTP_INCREMENT_DYN_STAT(http_get_requests_stat);
+    Metrics::increment(http_rsb.get_requests);
   } else if (s->method == HTTP_WKSIDX_HEAD) {
-    HTTP_INCREMENT_DYN_STAT(http_head_requests_stat);
+    Metrics::increment(http_rsb.head_requests);
   } else if (s->method == HTTP_WKSIDX_POST) {
-    HTTP_INCREMENT_DYN_STAT(http_post_requests_stat);
+    Metrics::increment(http_rsb.post_requests);
   } else if (s->method == HTTP_WKSIDX_PUT) {
-    HTTP_INCREMENT_DYN_STAT(http_put_requests_stat);
+    Metrics::increment(http_rsb.put_requests);
   } else if (s->method == HTTP_WKSIDX_CONNECT) {
-    HTTP_INCREMENT_DYN_STAT(http_connect_requests_stat);
+    Metrics::increment(http_rsb.connect_requests);
   } else if (s->method == HTTP_WKSIDX_DELETE) {
-    HTTP_INCREMENT_DYN_STAT(http_delete_requests_stat);
+    Metrics::increment(http_rsb.delete_requests);
   } else if (s->method == HTTP_WKSIDX_PURGE) {
-    HTTP_INCREMENT_DYN_STAT(http_purge_requests_stat);
+    Metrics::increment(http_rsb.purge_requests);
   } else if (s->method == HTTP_WKSIDX_TRACE) {
-    HTTP_INCREMENT_DYN_STAT(http_trace_requests_stat);
+    Metrics::increment(http_rsb.trace_requests);
   } else if (s->method == HTTP_WKSIDX_PUSH) {
-    HTTP_INCREMENT_DYN_STAT(http_push_requests_stat);
+    Metrics::increment(http_rsb.push_requests);
   } else if (s->method == HTTP_WKSIDX_OPTIONS) {
-    HTTP_INCREMENT_DYN_STAT(http_options_requests_stat);
+    Metrics::increment(http_rsb.options_requests);
   } else {
-    HTTP_INCREMENT_DYN_STAT(http_extension_method_requests_stat);
+    Metrics::increment(http_rsb.extension_method_requests);
     SET_VIA_STRING(VIA_DETAIL_TUNNEL, VIA_DETAIL_TUNNEL_METHOD);
     s->squid_codes.log_code      = SQUID_LOG_TCP_MISS;
     s->hdr_info.extension_method = true;
@@ -6625,7 +6623,7 @@ HttpTransact::will_this_request_self_loop(State *s)
           break;
         }
         SET_VIA_STRING(VIA_ERROR_TYPE, VIA_ERROR_LOOP_DETECTED);
-        HTTP_INCREMENT_DYN_STAT(http_proxy_loop_detected_stat);
+        Metrics::increment(http_rsb.proxy_loop_detected);
         build_error_response(s, HTTP_STATUS_BAD_REQUEST, "Cycle Detected", "request#cycle_detected");
         return true;
       }
@@ -6659,7 +6657,7 @@ HttpTransact::will_this_request_self_loop(State *s)
     if (count > max_proxy_cycles) {
       TxnDebug("http_transact", "count = %d > max_proxy_cycles = %d : detected loop", count, max_proxy_cycles);
       SET_VIA_STRING(VIA_ERROR_TYPE, VIA_ERROR_LOOP_DETECTED);
-      HTTP_INCREMENT_DYN_STAT(http_proxy_mh_loop_detected_stat);
+      Metrics::increment(http_rsb.proxy_mh_loop_detected);
       build_error_response(s, HTTP_STATUS_BAD_REQUEST, "Multi-Hop Cycle Detected", "request#cycle_detected");
       return true;
     } else {
@@ -7828,7 +7826,7 @@ HttpTransact::build_request(State *s, HTTPHdr *base_request, HTTPHdr *outgoing_r
   TxnDebug("http_trans", "request_sent_time: %" PRId64, (int64_t)s->request_sent_time);
   DUMP_HEADER("http_hdrs", outgoing_request, s->state_machine_id(), "Proxy's Request");
 
-  HTTP_INCREMENT_DYN_STAT(http_outgoing_requests_stat);
+  Metrics::increment(http_rsb.outgoing_requests);
 }
 
 // build a (status_code) response based upon the given info
@@ -8306,74 +8304,6 @@ HttpTransact::milestone_update_api_time(State *s)
   s->state_machine->milestone_update_api_time();
 }
 
-void
-HttpTransact::histogram_response_document_size(State *s, int64_t doc_size)
-{
-  if (doc_size >= 0 && doc_size <= 100) {
-    HTTP_INCREMENT_DYN_STAT(http_response_document_size_100_stat);
-  } else if (doc_size <= 1024) {
-    HTTP_INCREMENT_DYN_STAT(http_response_document_size_1K_stat);
-  } else if (doc_size <= 3072) {
-    HTTP_INCREMENT_DYN_STAT(http_response_document_size_3K_stat);
-  } else if (doc_size <= 5120) {
-    HTTP_INCREMENT_DYN_STAT(http_response_document_size_5K_stat);
-  } else if (doc_size <= 10240) {
-    HTTP_INCREMENT_DYN_STAT(http_response_document_size_10K_stat);
-  } else if (doc_size <= 1048576) {
-    HTTP_INCREMENT_DYN_STAT(http_response_document_size_1M_stat);
-  } else {
-    HTTP_INCREMENT_DYN_STAT(http_response_document_size_inf_stat);
-  }
-  return;
-}
-
-void
-HttpTransact::histogram_request_document_size(State *s, int64_t doc_size)
-{
-  if (doc_size >= 0 && doc_size <= 100) {
-    HTTP_INCREMENT_DYN_STAT(http_request_document_size_100_stat);
-  } else if (doc_size <= 1024) {
-    HTTP_INCREMENT_DYN_STAT(http_request_document_size_1K_stat);
-  } else if (doc_size <= 3072) {
-    HTTP_INCREMENT_DYN_STAT(http_request_document_size_3K_stat);
-  } else if (doc_size <= 5120) {
-    HTTP_INCREMENT_DYN_STAT(http_request_document_size_5K_stat);
-  } else if (doc_size <= 10240) {
-    HTTP_INCREMENT_DYN_STAT(http_request_document_size_10K_stat);
-  } else if (doc_size <= 1048576) {
-    HTTP_INCREMENT_DYN_STAT(http_request_document_size_1M_stat);
-  } else {
-    HTTP_INCREMENT_DYN_STAT(http_request_document_size_inf_stat);
-  }
-  return;
-}
-
-void
-HttpTransact::user_agent_connection_speed(State *s, ink_hrtime transfer_time, int64_t nbytes)
-{
-  float bytes_per_hrtime =
-    (transfer_time == 0) ? (nbytes) : (static_cast<float>(nbytes) / static_cast<float>(static_cast<int64_t>(transfer_time)));
-  int bytes_per_sec = static_cast<int>(bytes_per_hrtime * HRTIME_SECOND);
-
-  if (bytes_per_sec <= 100) {
-    HTTP_INCREMENT_DYN_STAT(http_user_agent_speed_bytes_per_sec_100_stat);
-  } else if (bytes_per_sec <= 1024) {
-    HTTP_INCREMENT_DYN_STAT(http_user_agent_speed_bytes_per_sec_1K_stat);
-  } else if (bytes_per_sec <= 10240) {
-    HTTP_INCREMENT_DYN_STAT(http_user_agent_speed_bytes_per_sec_10K_stat);
-  } else if (bytes_per_sec <= 102400) {
-    HTTP_INCREMENT_DYN_STAT(http_user_agent_speed_bytes_per_sec_100K_stat);
-  } else if (bytes_per_sec <= 1048576) {
-    HTTP_INCREMENT_DYN_STAT(http_user_agent_speed_bytes_per_sec_1M_stat);
-  } else if (bytes_per_sec <= 10485760) {
-    HTTP_INCREMENT_DYN_STAT(http_user_agent_speed_bytes_per_sec_10M_stat);
-  } else {
-    HTTP_INCREMENT_DYN_STAT(http_user_agent_speed_bytes_per_sec_100M_stat);
-  }
-
-  return;
-}
-
 /*
  * added request_process_time stat for loadshedding foo
  */
@@ -8396,68 +8326,68 @@ HttpTransact::client_result_stat(State *s, ink_hrtime total_time, ink_hrtime req
 
   switch (s->squid_codes.log_code) {
   case SQUID_LOG_ERR_CONNECT_FAIL:
-    HTTP_INCREMENT_DYN_STAT(http_cache_miss_cold_stat);
+    Metrics::increment(http_rsb.cache_miss_cold);
     client_transaction_result = CLIENT_TRANSACTION_RESULT_ERROR_CONNECT_FAIL;
     break;
 
   case SQUID_LOG_TCP_CF_HIT:
-    HTTP_INCREMENT_DYN_STAT(http_cache_hit_rww_stat);
+    Metrics::increment(http_rsb.cache_hit_rww);
     client_transaction_result = CLIENT_TRANSACTION_RESULT_HIT_FRESH;
     break;
 
   case SQUID_LOG_TCP_MEM_HIT:
-    HTTP_INCREMENT_DYN_STAT(http_cache_hit_mem_fresh_stat);
+    Metrics::increment(http_rsb.cache_hit_mem_fresh);
     // fallthrough
 
   case SQUID_LOG_TCP_HIT:
     // It's possible to have two stat's instead of one, if needed.
-    HTTP_INCREMENT_DYN_STAT(http_cache_hit_fresh_stat);
+    Metrics::increment(http_rsb.cache_hit_fresh);
     client_transaction_result = CLIENT_TRANSACTION_RESULT_HIT_FRESH;
     break;
 
   case SQUID_LOG_TCP_REFRESH_HIT:
-    HTTP_INCREMENT_DYN_STAT(http_cache_hit_reval_stat);
+    Metrics::increment(http_rsb.cache_hit_reval);
     client_transaction_result = CLIENT_TRANSACTION_RESULT_HIT_REVALIDATED;
     break;
 
   case SQUID_LOG_TCP_IMS_HIT:
-    HTTP_INCREMENT_DYN_STAT(http_cache_hit_ims_stat);
+    Metrics::increment(http_rsb.cache_hit_ims);
     client_transaction_result = CLIENT_TRANSACTION_RESULT_HIT_FRESH;
     break;
 
   case SQUID_LOG_TCP_REF_FAIL_HIT:
-    HTTP_INCREMENT_DYN_STAT(http_cache_hit_stale_served_stat);
+    Metrics::increment(http_rsb.cache_hit_stale_served);
     client_transaction_result = CLIENT_TRANSACTION_RESULT_HIT_FRESH;
     break;
 
   case SQUID_LOG_TCP_MISS:
     if ((GET_VIA_STRING(VIA_CACHE_RESULT) == VIA_IN_CACHE_NOT_ACCEPTABLE) || (GET_VIA_STRING(VIA_CACHE_RESULT) == VIA_CACHE_MISS)) {
-      HTTP_INCREMENT_DYN_STAT(http_cache_miss_cold_stat);
+      Metrics::increment(http_rsb.cache_miss_cold);
       client_transaction_result = CLIENT_TRANSACTION_RESULT_MISS_COLD;
     } else {
       // FIX: what case is this for?  can it ever happen?
-      HTTP_INCREMENT_DYN_STAT(http_cache_miss_uncacheable_stat);
+      Metrics::increment(http_rsb.cache_miss_uncacheable);
       client_transaction_result = CLIENT_TRANSACTION_RESULT_MISS_UNCACHABLE;
     }
     break;
 
   case SQUID_LOG_TCP_REFRESH_MISS:
-    HTTP_INCREMENT_DYN_STAT(http_cache_miss_changed_stat);
+    Metrics::increment(http_rsb.cache_miss_changed);
     client_transaction_result = CLIENT_TRANSACTION_RESULT_MISS_CHANGED;
     break;
 
   case SQUID_LOG_TCP_CLIENT_REFRESH:
-    HTTP_INCREMENT_DYN_STAT(http_cache_miss_client_no_cache_stat);
+    Metrics::increment(http_rsb.cache_miss_client_no_cache);
     client_transaction_result = CLIENT_TRANSACTION_RESULT_MISS_CLIENT_NO_CACHE;
     break;
 
   case SQUID_LOG_TCP_IMS_MISS:
-    HTTP_INCREMENT_DYN_STAT(http_cache_miss_ims_stat);
+    Metrics::increment(http_rsb.cache_miss_ims);
     client_transaction_result = CLIENT_TRANSACTION_RESULT_MISS_COLD;
     break;
 
   case SQUID_LOG_TCP_SWAPFAIL:
-    HTTP_INCREMENT_DYN_STAT(http_cache_read_error_stat);
+    Metrics::increment(http_rsb.cache_read_error);
     client_transaction_result = CLIENT_TRANSACTION_RESULT_HIT_FRESH;
     break;
 
@@ -8490,143 +8420,143 @@ HttpTransact::client_result_stat(State *s, ink_hrtime total_time, ink_hrtime req
   if ((s->source != SOURCE_NONE) && (s->client_info.abort == DIDNOT_ABORT)) {
     switch (client_response_status) {
     case 100:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_100_count_stat);
+      Metrics::increment(http_rsb.response_status_100_count);
       break;
     case 101:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_101_count_stat);
+      Metrics::increment(http_rsb.response_status_101_count);
       break;
     case 200:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_200_count_stat);
+      Metrics::increment(http_rsb.response_status_200_count);
       break;
     case 201:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_201_count_stat);
+      Metrics::increment(http_rsb.response_status_201_count);
       break;
     case 202:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_202_count_stat);
+      Metrics::increment(http_rsb.response_status_202_count);
       break;
     case 203:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_203_count_stat);
+      Metrics::increment(http_rsb.response_status_203_count);
       break;
     case 204:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_204_count_stat);
+      Metrics::increment(http_rsb.response_status_204_count);
       break;
     case 205:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_205_count_stat);
+      Metrics::increment(http_rsb.response_status_205_count);
       break;
     case 206:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_206_count_stat);
+      Metrics::increment(http_rsb.response_status_206_count);
       break;
     case 300:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_300_count_stat);
+      Metrics::increment(http_rsb.response_status_300_count);
       break;
     case 301:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_301_count_stat);
+      Metrics::increment(http_rsb.response_status_301_count);
       break;
     case 302:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_302_count_stat);
+      Metrics::increment(http_rsb.response_status_302_count);
       break;
     case 303:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_303_count_stat);
+      Metrics::increment(http_rsb.response_status_303_count);
       break;
     case 304:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_304_count_stat);
+      Metrics::increment(http_rsb.response_status_304_count);
       break;
     case 305:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_305_count_stat);
+      Metrics::increment(http_rsb.response_status_305_count);
       break;
     case 307:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_307_count_stat);
+      Metrics::increment(http_rsb.response_status_307_count);
       break;
     case 308:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_308_count_stat);
+      Metrics::increment(http_rsb.response_status_308_count);
       break;
     case 400:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_400_count_stat);
+      Metrics::increment(http_rsb.response_status_400_count);
       break;
     case 401:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_401_count_stat);
+      Metrics::increment(http_rsb.response_status_401_count);
       break;
     case 402:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_402_count_stat);
+      Metrics::increment(http_rsb.response_status_402_count);
       break;
     case 403:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_403_count_stat);
+      Metrics::increment(http_rsb.response_status_403_count);
       break;
     case 404:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_404_count_stat);
+      Metrics::increment(http_rsb.response_status_404_count);
       break;
     case 405:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_405_count_stat);
+      Metrics::increment(http_rsb.response_status_405_count);
       break;
     case 406:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_406_count_stat);
+      Metrics::increment(http_rsb.response_status_406_count);
       break;
     case 407:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_407_count_stat);
+      Metrics::increment(http_rsb.response_status_407_count);
       break;
     case 408:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_408_count_stat);
+      Metrics::increment(http_rsb.response_status_408_count);
       break;
     case 409:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_409_count_stat);
+      Metrics::increment(http_rsb.response_status_409_count);
       break;
     case 410:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_410_count_stat);
+      Metrics::increment(http_rsb.response_status_410_count);
       break;
     case 411:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_411_count_stat);
+      Metrics::increment(http_rsb.response_status_411_count);
       break;
     case 412:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_412_count_stat);
+      Metrics::increment(http_rsb.response_status_412_count);
       break;
     case 413:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_413_count_stat);
+      Metrics::increment(http_rsb.response_status_413_count);
       break;
     case 414:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_414_count_stat);
+      Metrics::increment(http_rsb.response_status_414_count);
       break;
     case 415:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_415_count_stat);
+      Metrics::increment(http_rsb.response_status_415_count);
       break;
     case 416:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_416_count_stat);
+      Metrics::increment(http_rsb.response_status_416_count);
       break;
     case 500:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_500_count_stat);
+      Metrics::increment(http_rsb.response_status_500_count);
       break;
     case 501:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_501_count_stat);
+      Metrics::increment(http_rsb.response_status_501_count);
       break;
     case 502:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_502_count_stat);
+      Metrics::increment(http_rsb.response_status_502_count);
       break;
     case 503:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_503_count_stat);
+      Metrics::increment(http_rsb.response_status_503_count);
       break;
     case 504:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_504_count_stat);
+      Metrics::increment(http_rsb.response_status_504_count);
       break;
     case 505:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_505_count_stat);
+      Metrics::increment(http_rsb.response_status_505_count);
       break;
     default:
       break;
     }
     switch (client_response_status / 100) {
     case 1:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_1xx_count_stat);
+      Metrics::increment(http_rsb.response_status_1xx_count);
       break;
     case 2:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_2xx_count_stat);
+      Metrics::increment(http_rsb.response_status_2xx_count);
       break;
     case 3:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_3xx_count_stat);
+      Metrics::increment(http_rsb.response_status_3xx_count);
       break;
     case 4:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_4xx_count_stat);
+      Metrics::increment(http_rsb.response_status_4xx_count);
       break;
     case 5:
-      HTTP_INCREMENT_DYN_STAT(http_response_status_5xx_count_stat);
+      Metrics::increment(http_rsb.response_status_5xx_count);
       break;
     default:
       break;
@@ -8634,77 +8564,63 @@ HttpTransact::client_result_stat(State *s, ink_hrtime total_time, ink_hrtime req
   }
 
   // Increment the completed connection count
-  HTTP_INCREMENT_DYN_STAT(http_completed_requests_stat);
+  Metrics::increment(http_rsb.completed_requests);
 
   // Set the stat now that we know what happend
   ink_hrtime total_msec   = ink_hrtime_to_msec(total_time);
   ink_hrtime process_msec = ink_hrtime_to_msec(request_process_time);
   switch (client_transaction_result) {
   case CLIENT_TRANSACTION_RESULT_HIT_FRESH:
-    HTTP_SUM_DYN_STAT(http_ua_msecs_counts_hit_fresh_stat, total_msec);
-    HTTP_SUM_DYN_STAT(http_ua_msecs_counts_hit_fresh_process_stat, process_msec);
+    Metrics::increment(http_rsb.ua_counts_hit_fresh);
+    Metrics::increment(http_rsb.ua_msecs_hit_fresh, total_msec);
+    Metrics::increment(http_rsb.ua_counts_hit_fresh_process);
+    Metrics::increment(http_rsb.ua_msecs_hit_fresh_process, process_msec);
     break;
   case CLIENT_TRANSACTION_RESULT_HIT_REVALIDATED:
-    HTTP_SUM_DYN_STAT(http_ua_msecs_counts_hit_reval_stat, total_msec);
+    Metrics::increment(http_rsb.ua_counts_hit_reval);
+    Metrics::increment(http_rsb.ua_msecs_hit_reval, total_msec);
     break;
   case CLIENT_TRANSACTION_RESULT_MISS_COLD:
-    HTTP_SUM_DYN_STAT(http_ua_msecs_counts_miss_cold_stat, total_msec);
+    Metrics::increment(http_rsb.ua_counts_miss_cold);
+    Metrics::increment(http_rsb.ua_msecs_miss_cold, total_msec);
     break;
   case CLIENT_TRANSACTION_RESULT_MISS_CHANGED:
-    HTTP_SUM_DYN_STAT(http_ua_msecs_counts_miss_changed_stat, total_msec);
+    Metrics::increment(http_rsb.ua_counts_miss_changed);
+    Metrics::increment(http_rsb.ua_msecs_miss_changed, total_msec);
     break;
   case CLIENT_TRANSACTION_RESULT_MISS_CLIENT_NO_CACHE:
-    HTTP_SUM_DYN_STAT(http_ua_msecs_counts_miss_client_no_cache_stat, total_msec);
+    Metrics::increment(http_rsb.ua_counts_miss_client_no_cache);
+    Metrics::increment(http_rsb.ua_msecs_miss_client_no_cache, total_msec);
     break;
   case CLIENT_TRANSACTION_RESULT_MISS_UNCACHABLE:
-    HTTP_SUM_DYN_STAT(http_ua_msecs_counts_miss_uncacheable_stat, total_msec);
+    Metrics::increment(http_rsb.ua_counts_miss_uncacheable);
+    Metrics::increment(http_rsb.ua_msecs_miss_uncacheable, total_msec);
     break;
   case CLIENT_TRANSACTION_RESULT_ERROR_ABORT:
-    HTTP_SUM_DYN_STAT(http_ua_msecs_counts_errors_aborts_stat, total_msec);
+    Metrics::increment(http_rsb.ua_counts_errors_aborts);
+    Metrics::increment(http_rsb.ua_msecs_errors_aborts, total_msec);
     break;
   case CLIENT_TRANSACTION_RESULT_ERROR_POSSIBLE_ABORT:
-    HTTP_SUM_DYN_STAT(http_ua_msecs_counts_errors_possible_aborts_stat, total_msec);
+    Metrics::increment(http_rsb.ua_counts_errors_possible_aborts);
+    Metrics::increment(http_rsb.ua_msecs_errors_possible_aborts, total_msec);
     break;
   case CLIENT_TRANSACTION_RESULT_ERROR_CONNECT_FAIL:
-    HTTP_SUM_DYN_STAT(http_ua_msecs_counts_errors_connect_failed_stat, total_msec);
+    Metrics::increment(http_rsb.ua_counts_errors_connect_failed);
+    Metrics::increment(http_rsb.ua_msecs_errors_connect_failed, total_msec);
     break;
   case CLIENT_TRANSACTION_RESULT_ERROR_OTHER:
-    HTTP_SUM_DYN_STAT(http_ua_msecs_counts_errors_other_stat, total_msec);
+    Metrics::increment(http_rsb.ua_counts_errors_other);
+    Metrics::increment(http_rsb.ua_msecs_errors_other, total_msec);
     break;
   default:
-    HTTP_SUM_DYN_STAT(http_ua_msecs_counts_other_unclassified_stat, total_msec);
+    Metrics::increment(http_rsb.ua_counts_other_unclassified);
+    Metrics::increment(http_rsb.ua_msecs_other_unclassified, total_msec);
     // This can happen if a plugin manually sets the status code after an error.
     TxnDebug("http", "Unclassified statistic");
     break;
   }
 }
 
-void
-HttpTransact::origin_server_connection_speed(State *s, ink_hrtime transfer_time, int64_t nbytes)
-{
-  float bytes_per_hrtime =
-    (transfer_time == 0) ? (nbytes) : (static_cast<float>(nbytes) / static_cast<float>(static_cast<int64_t>(transfer_time)));
-  int bytes_per_sec = static_cast<int>(bytes_per_hrtime * HRTIME_SECOND);
-
-  if (bytes_per_sec <= 100) {
-    HTTP_INCREMENT_DYN_STAT(http_origin_server_speed_bytes_per_sec_100_stat);
-  } else if (bytes_per_sec <= 1024) {
-    HTTP_INCREMENT_DYN_STAT(http_origin_server_speed_bytes_per_sec_1K_stat);
-  } else if (bytes_per_sec <= 10240) {
-    HTTP_INCREMENT_DYN_STAT(http_origin_server_speed_bytes_per_sec_10K_stat);
-  } else if (bytes_per_sec <= 102400) {
-    HTTP_INCREMENT_DYN_STAT(http_origin_server_speed_bytes_per_sec_100K_stat);
-  } else if (bytes_per_sec <= 1048576) {
-    HTTP_INCREMENT_DYN_STAT(http_origin_server_speed_bytes_per_sec_1M_stat);
-  } else if (bytes_per_sec <= 10485760) {
-    HTTP_INCREMENT_DYN_STAT(http_origin_server_speed_bytes_per_sec_10M_stat);
-  } else {
-    HTTP_INCREMENT_DYN_STAT(http_origin_server_speed_bytes_per_sec_100M_stat);
-  }
-
-  return;
-}
-
 void
 HttpTransact::update_size_and_time_stats(State *s, ink_hrtime total_time, ink_hrtime user_agent_write_time,
                                          ink_hrtime origin_server_read_time, int user_agent_request_header_size,
@@ -8727,7 +8643,7 @@ HttpTransact::update_size_and_time_stats(State *s, ink_hrtime total_time, ink_hr
   case BACKGROUND_FILL_COMPLETED: {
     int64_t bg_size = origin_server_response_body_size - user_agent_response_body_size;
     bg_size         = std::max(static_cast<int64_t>(0), bg_size);
-    HTTP_SUM_DYN_STAT(http_background_fill_bytes_completed_stat, bg_size);
+    Metrics::increment(http_rsb.background_fill_bytes_completed, bg_size);
     break;
   }
   case BACKGROUND_FILL_ABORTED: {
@@ -8736,7 +8652,7 @@ HttpTransact::update_size_and_time_stats(State *s, ink_hrtime total_time, ink_hr
     if (bg_size < 0) {
       bg_size = 0;
     }
-    HTTP_SUM_DYN_STAT(http_background_fill_bytes_aborted_stat, bg_size);
+    Metrics::increment(http_rsb.background_fill_bytes_aborted, bg_size);
     break;
   }
   case BACKGROUND_FILL_NONE:
@@ -8752,144 +8668,133 @@ HttpTransact::update_size_and_time_stats(State *s, ink_hrtime total_time, ink_hr
   case SQUID_LOG_TCP_MEM_HIT:
   case SQUID_LOG_TCP_CF_HIT:
     // It's possible to have two stat's instead of one, if needed.
-    HTTP_INCREMENT_DYN_STAT(http_tcp_hit_count_stat);
-    HTTP_SUM_DYN_STAT(http_tcp_hit_user_agent_bytes_stat, user_agent_bytes);
-    HTTP_SUM_DYN_STAT(http_tcp_hit_origin_server_bytes_stat, origin_server_bytes);
+    Metrics::increment(http_rsb.tcp_hit_count);
+    Metrics::increment(http_rsb.tcp_hit_user_agent_bytes, user_agent_bytes);
+    Metrics::increment(http_rsb.tcp_hit_origin_server_bytes, origin_server_bytes);
     break;
   case SQUID_LOG_TCP_MISS:
-    HTTP_INCREMENT_DYN_STAT(http_tcp_miss_count_stat);
-    HTTP_SUM_DYN_STAT(http_tcp_miss_user_agent_bytes_stat, user_agent_bytes);
-    HTTP_SUM_DYN_STAT(http_tcp_miss_origin_server_bytes_stat, origin_server_bytes);
+    Metrics::increment(http_rsb.tcp_miss_count);
+    Metrics::increment(http_rsb.tcp_miss_user_agent_bytes, user_agent_bytes);
+    Metrics::increment(http_rsb.tcp_miss_origin_server_bytes, origin_server_bytes);
     break;
   case SQUID_LOG_TCP_EXPIRED_MISS:
-    HTTP_INCREMENT_DYN_STAT(http_tcp_expired_miss_count_stat);
-    HTTP_SUM_DYN_STAT(http_tcp_expired_miss_user_agent_bytes_stat, user_agent_bytes);
-    HTTP_SUM_DYN_STAT(http_tcp_expired_miss_origin_server_bytes_stat, origin_server_bytes);
+    Metrics::increment(http_rsb.tcp_expired_miss_count);
+    Metrics::increment(http_rsb.tcp_expired_miss_user_agent_bytes, user_agent_bytes);
+    Metrics::increment(http_rsb.tcp_expired_miss_origin_server_bytes, origin_server_bytes);
     break;
   case SQUID_LOG_TCP_REFRESH_HIT:
-    HTTP_INCREMENT_DYN_STAT(http_tcp_refresh_hit_count_stat);
-    HTTP_SUM_DYN_STAT(http_tcp_refresh_hit_user_agent_bytes_stat, user_agent_bytes);
-    HTTP_SUM_DYN_STAT(http_tcp_refresh_hit_origin_server_bytes_stat, origin_server_bytes);
+    Metrics::increment(http_rsb.tcp_refresh_hit_count);
+    Metrics::increment(http_rsb.tcp_refresh_hit_user_agent_bytes, user_agent_bytes);
+    Metrics::increment(http_rsb.tcp_refresh_hit_origin_server_bytes, origin_server_bytes);
     break;
   case SQUID_LOG_TCP_REFRESH_MISS:
-    HTTP_INCREMENT_DYN_STAT(http_tcp_refresh_miss_count_stat);
-    HTTP_SUM_DYN_STAT(http_tcp_refresh_miss_user_agent_bytes_stat, user_agent_bytes);
-    HTTP_SUM_DYN_STAT(http_tcp_refresh_miss_origin_server_bytes_stat, origin_server_bytes);
+    Metrics::increment(http_rsb.tcp_refresh_miss_count);
+    Metrics::increment(http_rsb.tcp_refresh_miss_user_agent_bytes, user_agent_bytes);
+    Metrics::increment(http_rsb.tcp_refresh_miss_origin_server_bytes, origin_server_bytes);
     break;
   case SQUID_LOG_TCP_CLIENT_REFRESH:
-    HTTP_INCREMENT_DYN_STAT(http_tcp_client_refresh_count_stat);
-    HTTP_SUM_DYN_STAT(http_tcp_client_refresh_user_agent_bytes_stat, user_agent_bytes);
-    HTTP_SUM_DYN_STAT(http_tcp_client_refresh_origin_server_bytes_stat, origin_server_bytes);
+    Metrics::increment(http_rsb.tcp_client_refresh_count);
+    Metrics::increment(http_rsb.tcp_client_refresh_user_agent_bytes, user_agent_bytes);
+    Metrics::increment(http_rsb.tcp_client_refresh_origin_server_bytes, origin_server_bytes);
     break;
   case SQUID_LOG_TCP_IMS_HIT:
-    HTTP_INCREMENT_DYN_STAT(http_tcp_ims_hit_count_stat);
-    HTTP_SUM_DYN_STAT(http_tcp_ims_hit_user_agent_bytes_stat, user_agent_bytes);
-    HTTP_SUM_DYN_STAT(http_tcp_ims_hit_origin_server_bytes_stat, origin_server_bytes);
+    Metrics::increment(http_rsb.tcp_ims_hit_count);
+    Metrics::increment(http_rsb.tcp_ims_hit_user_agent_bytes, user_agent_bytes);
+    Metrics::increment(http_rsb.tcp_ims_hit_origin_server_bytes, origin_server_bytes);
     break;
   case SQUID_LOG_TCP_IMS_MISS:
-    HTTP_INCREMENT_DYN_STAT(http_tcp_ims_miss_count_stat);
-    HTTP_SUM_DYN_STAT(http_tcp_ims_miss_user_agent_bytes_stat, user_agent_bytes);
-    HTTP_SUM_DYN_STAT(http_tcp_ims_miss_origin_server_bytes_stat, origin_server_bytes);
+    Metrics::increment(http_rsb.tcp_ims_miss_count);
+    Metrics::increment(http_rsb.tcp_ims_miss_user_agent_bytes, user_agent_bytes);
+    Metrics::increment(http_rsb.tcp_ims_miss_origin_server_bytes, origin_server_bytes);
     break;
   case SQUID_LOG_ERR_CLIENT_ABORT:
-    HTTP_INCREMENT_DYN_STAT(http_err_client_abort_count_stat);
-    HTTP_SUM_DYN_STAT(http_err_client_abort_user_agent_bytes_stat, user_agent_bytes);
-    HTTP_SUM_DYN_STAT(http_err_client_abort_origin_server_bytes_stat, origin_server_bytes);
+    Metrics::increment(http_rsb.err_client_abort_count);
+    Metrics::increment(http_rsb.err_client_abort_user_agent_bytes, user_agent_bytes);
+    Metrics::increment(http_rsb.err_client_abort_origin_server_bytes, origin_server_bytes);
     break;
   case SQUID_LOG_ERR_CLIENT_READ_ERROR:
-    HTTP_INCREMENT_DYN_STAT(http_err_client_read_error_count_stat);
-    HTTP_SUM_DYN_STAT(http_err_client_read_error_user_agent_bytes_stat, user_agent_bytes);
-    HTTP_SUM_DYN_STAT(http_err_client_read_error_origin_server_bytes_stat, origin_server_bytes);
+    Metrics::increment(http_rsb.err_client_read_error_count);
+    Metrics::increment(http_rsb.err_client_read_error_user_agent_bytes, user_agent_bytes);
+    Metrics::increment(http_rsb.err_client_read_error_origin_server_bytes, origin_server_bytes);
     break;
   case SQUID_LOG_ERR_CONNECT_FAIL:
-    HTTP_INCREMENT_DYN_STAT(http_err_connect_fail_count_stat);
-    HTTP_SUM_DYN_STAT(http_err_connect_fail_user_agent_bytes_stat, user_agent_bytes);
-    HTTP_SUM_DYN_STAT(http_err_connect_fail_origin_server_bytes_stat, origin_server_bytes);
+    Metrics::increment(http_rsb.err_connect_fail_count);
+    Metrics::increment(http_rsb.err_connect_fail_user_agent_bytes, user_agent_bytes);
+    Metrics::increment(http_rsb.err_connect_fail_origin_server_bytes, origin_server_bytes);
     break;
   default:
-    HTTP_INCREMENT_DYN_STAT(http_misc_count_stat);
-    HTTP_SUM_DYN_STAT(http_misc_user_agent_bytes_stat, user_agent_bytes);
-    HTTP_SUM_DYN_STAT(http_misc_origin_server_bytes_stat, origin_server_bytes);
+    Metrics::increment(http_rsb.misc_count);
+    Metrics::increment(http_rsb.misc_user_agent_bytes, user_agent_bytes);
+    Metrics::increment(http_rsb.misc_origin_server_bytes, origin_server_bytes);
     break;
   }
 
   // times
-  HTTP_SUM_DYN_STAT(http_total_transactions_time_stat, total_time);
+  Metrics::increment(http_rsb.total_transactions_time, total_time);
 
   // sizes
-  HTTP_SUM_DYN_STAT(http_user_agent_request_header_total_size_stat, user_agent_request_header_size);
-  HTTP_SUM_DYN_STAT(http_user_agent_response_header_total_size_stat, user_agent_response_header_size);
-  HTTP_SUM_DYN_STAT(http_user_agent_request_document_total_size_stat, user_agent_request_body_size);
-  HTTP_SUM_DYN_STAT(http_user_agent_response_document_total_size_stat, user_agent_response_body_size);
+  Metrics::increment(http_rsb.user_agent_request_header_total_size, user_agent_request_header_size);
+  Metrics::increment(http_rsb.user_agent_response_header_total_size, user_agent_response_header_size);
+  Metrics::increment(http_rsb.user_agent_request_document_total_size, user_agent_request_body_size);
+  Metrics::increment(http_rsb.user_agent_response_document_total_size, user_agent_response_body_size);
 
   // proxy stats
   if (s->current.request_to == ResolveInfo::PARENT_PROXY) {
-    HTTP_SUM_DYN_STAT(http_parent_proxy_request_total_bytes_stat,
-                      origin_server_request_header_size + origin_server_request_body_size);
-    HTTP_SUM_DYN_STAT(http_parent_proxy_response_total_bytes_stat,
-                      origin_server_response_header_size + origin_server_response_body_size);
-    HTTP_SUM_DYN_STAT(http_parent_proxy_transaction_time_stat, total_time);
+    Metrics::increment(http_rsb.parent_proxy_request_total_bytes,
+                       origin_server_request_header_size + origin_server_request_body_size);
+    Metrics::increment(http_rsb.parent_proxy_response_total_bytes,
+                       origin_server_response_header_size + origin_server_response_body_size);
+    Metrics::increment(http_rsb.parent_proxy_transaction_time, total_time);
   }
   // request header zero means the document was cached.
   // do not add to stats.
   if (origin_server_request_header_size > 0) {
-    HTTP_SUM_DYN_STAT(http_origin_server_request_header_total_size_stat, origin_server_request_header_size);
-    HTTP_SUM_DYN_STAT(http_origin_server_response_header_total_size_stat, origin_server_response_header_size);
-    HTTP_SUM_DYN_STAT(http_origin_server_request_document_total_size_stat, origin_server_request_body_size);
-    HTTP_SUM_DYN_STAT(http_origin_server_response_document_total_size_stat, origin_server_response_body_size);
+    Metrics::increment(http_rsb.origin_server_request_header_total_size, origin_server_request_header_size);
+    Metrics::increment(http_rsb.origin_server_response_header_total_size, origin_server_response_header_size);
+    Metrics::increment(http_rsb.origin_server_request_document_total_size, origin_server_request_body_size);
+    Metrics::increment(http_rsb.origin_server_response_document_total_size, origin_server_response_body_size);
   }
 
   if (s->method == HTTP_WKSIDX_PUSH) {
-    HTTP_SUM_DYN_STAT(http_pushed_response_header_total_size_stat, pushed_response_header_size);
-    HTTP_SUM_DYN_STAT(http_pushed_document_total_size_stat, pushed_response_body_size);
-  }
-
-  histogram_request_document_size(s, user_agent_request_body_size);
-  histogram_response_document_size(s, user_agent_response_body_size);
-
-  if (user_agent_write_time >= 0) {
-    user_agent_connection_speed(s, user_agent_write_time, user_agent_response_size);
-  }
-
-  if (origin_server_request_header_size > 0 && origin_server_read_time > 0) {
-    origin_server_connection_speed(s, origin_server_read_time, origin_server_response_size);
+    Metrics::increment(http_rsb.pushed_response_header_total_size, pushed_response_header_size);
+    Metrics::increment(http_rsb.pushed_document_total_size, pushed_response_body_size);
   }
 
   // update milestones stats
-  HTTP_SUM_DYN_STAT(http_ua_begin_time_stat, milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_UA_BEGIN, 0));
-  HTTP_SUM_DYN_STAT(http_ua_first_read_time_stat, milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_UA_FIRST_READ, 0));
-  HTTP_SUM_DYN_STAT(http_ua_read_header_done_time_stat,
-                    milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_UA_READ_HEADER_DONE, 0));
-  HTTP_SUM_DYN_STAT(http_ua_begin_write_time_stat,
-                    milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_UA_BEGIN_WRITE, 0));
-  HTTP_SUM_DYN_STAT(http_ua_close_time_stat, milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_UA_CLOSE, 0));
-  HTTP_SUM_DYN_STAT(http_server_first_connect_time_stat,
-                    milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SERVER_FIRST_CONNECT, 0));
-  HTTP_SUM_DYN_STAT(http_server_connect_time_stat,
-                    milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SERVER_CONNECT, 0));
-  HTTP_SUM_DYN_STAT(http_server_connect_end_time_stat,
-                    milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SERVER_CONNECT_END, 0));
-  HTTP_SUM_DYN_STAT(http_server_begin_write_time_stat,
-                    milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SERVER_BEGIN_WRITE, 0));
-  HTTP_SUM_DYN_STAT(http_server_first_read_time_stat,
-                    milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SERVER_FIRST_READ, 0));
-  HTTP_SUM_DYN_STAT(http_server_read_header_done_time_stat,
-                    milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SERVER_READ_HEADER_DONE, 0));
-  HTTP_SUM_DYN_STAT(http_server_close_time_stat, milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SERVER_CLOSE, 0));
-  HTTP_SUM_DYN_STAT(http_cache_open_read_begin_time_stat,
-                    milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_CACHE_OPEN_READ_BEGIN, 0));
-  HTTP_SUM_DYN_STAT(http_cache_open_read_end_time_stat,
-                    milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_CACHE_OPEN_READ_END, 0));
-  HTTP_SUM_DYN_STAT(http_cache_open_write_begin_time_stat,
-                    milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_CACHE_OPEN_WRITE_BEGIN, 0));
-  HTTP_SUM_DYN_STAT(http_cache_open_write_end_time_stat,
-                    milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_CACHE_OPEN_WRITE_END, 0));
-  HTTP_SUM_DYN_STAT(http_dns_lookup_begin_time_stat,
-                    milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_DNS_LOOKUP_BEGIN, 0));
-  HTTP_SUM_DYN_STAT(http_dns_lookup_end_time_stat,
-                    milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_DNS_LOOKUP_END, 0));
-  HTTP_SUM_DYN_STAT(http_sm_start_time_stat, milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SM_START, 0));
-  HTTP_SUM_DYN_STAT(http_sm_finish_time_stat, milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SM_FINISH, 0));
+  Metrics::increment(http_rsb.ua_begin_time, milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_UA_BEGIN, 0));
+  Metrics::increment(http_rsb.ua_first_read_time, milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_UA_FIRST_READ, 0));
+  Metrics::increment(http_rsb.ua_read_header_done_time,
+                     milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_UA_READ_HEADER_DONE, 0));
+  Metrics::increment(http_rsb.ua_begin_write_time,
+                     milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_UA_BEGIN_WRITE, 0));
+  Metrics::increment(http_rsb.ua_close_time, milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_UA_CLOSE, 0));
+  Metrics::increment(http_rsb.server_first_connect_time,
+                     milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SERVER_FIRST_CONNECT, 0));
+  Metrics::increment(http_rsb.server_connect_time,
+                     milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SERVER_CONNECT, 0));
+  Metrics::increment(http_rsb.server_connect_end_time,
+                     milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SERVER_CONNECT_END, 0));
+  Metrics::increment(http_rsb.server_begin_write_time,
+                     milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SERVER_BEGIN_WRITE, 0));
+  Metrics::increment(http_rsb.server_first_read_time,
+                     milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SERVER_FIRST_READ, 0));
+  Metrics::increment(http_rsb.server_read_header_done_time,
+                     milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SERVER_READ_HEADER_DONE, 0));
+  Metrics::increment(http_rsb.server_close_time, milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SERVER_CLOSE, 0));
+  Metrics::increment(http_rsb.cache_open_read_begin_time,
+                     milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_CACHE_OPEN_READ_BEGIN, 0));
+  Metrics::increment(http_rsb.cache_open_read_end_time,
+                     milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_CACHE_OPEN_READ_END, 0));
+  Metrics::increment(http_rsb.cache_open_write_begin_time,
+                     milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_CACHE_OPEN_WRITE_BEGIN, 0));
+  Metrics::increment(http_rsb.cache_open_write_end_time,
+                     milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_CACHE_OPEN_WRITE_END, 0));
+  Metrics::increment(http_rsb.dns_lookup_begin_time,
+                     milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_DNS_LOOKUP_BEGIN, 0));
+  Metrics::increment(http_rsb.dns_lookup_end_time,
+                     milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_DNS_LOOKUP_END, 0));
+  Metrics::increment(http_rsb.sm_start_time, milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SM_START, 0));
+  Metrics::increment(http_rsb.sm_finish_time, milestones.difference_msec(TS_MILESTONE_SM_START, TS_MILESTONE_SM_FINISH, 0));
 }
 
 void
diff --git a/proxy/http/HttpTransact.h b/proxy/http/HttpTransact.h
index ff32c2d027..f4779da445 100644
--- a/proxy/http/HttpTransact.h
+++ b/proxy/http/HttpTransact.h
@@ -1108,10 +1108,6 @@ public:
                                          int64_t pushed_response_body_size, const TransactionMilestones &milestones);
   static void milestone_start_api_time(State *s);
   static void milestone_update_api_time(State *s);
-  static void histogram_request_document_size(State *s, int64_t size);
-  static void histogram_response_document_size(State *s, int64_t size);
-  static void user_agent_connection_speed(State *s, ink_hrtime transfer_time, int64_t nbytes);
-  static void origin_server_connection_speed(State *s, ink_hrtime transfer_time, int64_t nbytes);
   static void client_result_stat(State *s, ink_hrtime total_time, ink_hrtime request_process_time);
   static void delete_warning_value(HTTPHdr *to_warn, HTTPWarningCode warning_code);
   static bool is_connection_collapse_checks_success(State *s); // YTS Team, yamsat
diff --git a/proxy/http/HttpTunnel.cc b/proxy/http/HttpTunnel.cc
index f113f2b755..671bbbefa0 100644
--- a/proxy/http/HttpTunnel.cc
+++ b/proxy/http/HttpTunnel.cc
@@ -1480,7 +1480,7 @@ HttpTunnel::chain_abort_all(HttpTunnelProducer *p)
     }
     p->read_vio = nullptr;
     p->vc->do_io_close(EHTTP_ERROR);
-    HTTP_INCREMENT_DYN_STAT(http_origin_shutdown_tunnel_abort);
+    Metrics::increment(http_rsb.origin_shutdown_tunnel_abort);
     update_stats_after_abort(p->vc_type);
   }
 }
@@ -1597,7 +1597,7 @@ HttpTunnel::chain_abort_cache_write(HttpTunnelProducer *p)
         c->write_vio = nullptr;
         c->vc->do_io_close(EHTTP_ERROR);
         c->alive = false;
-        HTTP_DECREMENT_DYN_STAT(http_current_cache_connections_stat);
+        Metrics::decrement(http_rsb.current_cache_connections);
       } else if (c->self_producer) {
         chain_abort_cache_write(c->self_producer);
       }
@@ -1711,7 +1711,7 @@ HttpTunnel::update_stats_after_abort(HttpTunnelType_t t)
   switch (t) {
   case HT_CACHE_READ:
   case HT_CACHE_WRITE:
-    HTTP_DECREMENT_DYN_STAT(http_current_cache_connections_stat);
+    Metrics::decrement(http_rsb.current_cache_connections);
     break;
   default:
     // Handled here:
@@ -1736,7 +1736,7 @@ HttpTunnel::mark_tls_tunnel_active()
   }
 
   _tls_tunnel_active = true;
-  HTTP_INCREMENT_DYN_STAT(tunnel_current_active_connections_stat);
+  Metrics::increment(http_rsb.tunnel_current_active_connections);
 
   _schedule_tls_tunnel_activity_check_event();
 }
@@ -1749,7 +1749,7 @@ HttpTunnel::mark_tls_tunnel_inactive()
   }
 
   _tls_tunnel_active = false;
-  HTTP_DECREMENT_DYN_STAT(tunnel_current_active_connections_stat);
+  Metrics::decrement(http_rsb.tunnel_current_active_connections);
 
   if (_tls_tunnel_activity_check_event) {
     _tls_tunnel_activity_check_event->cancel();
diff --git a/proxy/http/HttpVCTable.cc b/proxy/http/HttpVCTable.cc
index 09efb4b3b9..0667009317 100644
--- a/proxy/http/HttpVCTable.cc
+++ b/proxy/http/HttpVCTable.cc
@@ -117,7 +117,7 @@ HttpVCTable::cleanup_entry(HttpVCTableEntry *e)
   ink_assert(e->vc);
   if (e->in_tunnel == false) {
     if (e->vc_type == HTTP_SERVER_VC) {
-      HTTP_INCREMENT_DYN_STAT(http_origin_shutdown_cleanup_entry);
+      Metrics::increment(http_rsb.origin_shutdown_cleanup_entry);
     }
     e->vc->do_io_close();
     e->vc = nullptr;
diff --git a/proxy/http2/HTTP2.cc b/proxy/http2/HTTP2.cc
index 454d040b61..9ee035d237 100644
--- a/proxy/http2/HTTP2.cc
+++ b/proxy/http2/HTTP2.cc
@@ -48,40 +48,7 @@ static VersionConverter hvc;
 } // namespace
 
 // Statistics
-RecRawStatBlock *http2_rsb;
-static const char *const HTTP2_STAT_CURRENT_CLIENT_CONNECTION_NAME        = "proxy.process.http2.current_client_connections";
-static const char *const HTTP2_STAT_CURRENT_SERVER_CONNECTION_NAME        = "proxy.process.http2.current_server_connections";
-static const char *const HTTP2_STAT_CURRENT_ACTIVE_CLIENT_CONNECTION_NAME = "proxy.process.http2.current_active_client_connections";
-static const char *const HTTP2_STAT_CURRENT_ACTIVE_SERVER_CONNECTION_NAME = "proxy.process.http2.current_active_server_connections";
-static const char *const HTTP2_STAT_CURRENT_CLIENT_STREAM_NAME            = "proxy.process.http2.current_client_streams";
-static const char *const HTTP2_STAT_CURRENT_SERVER_STREAM_NAME            = "proxy.process.http2.current_server_streams";
-static const char *const HTTP2_STAT_TOTAL_CLIENT_STREAM_NAME              = "proxy.process.http2.total_client_streams";
-static const char *const HTTP2_STAT_TOTAL_SERVER_STREAM_NAME              = "proxy.process.http2.total_server_streams";
-static const char *const HTTP2_STAT_TOTAL_TRANSACTIONS_TIME_NAME          = "proxy.process.http2.total_transactions_time";
-static const char *const HTTP2_STAT_TOTAL_CLIENT_CONNECTION_NAME          = "proxy.process.http2.total_client_connections";
-static const char *const HTTP2_STAT_TOTAL_SERVER_CONNECTION_NAME          = "proxy.process.http2.total_server_connections";
-static const char *const HTTP2_STAT_CONNECTION_ERRORS_NAME                = "proxy.process.http2.connection_errors";
-static const char *const HTTP2_STAT_STREAM_ERRORS_NAME                    = "proxy.process.http2.stream_errors";
-static const char *const HTTP2_STAT_SESSION_DIE_DEFAULT_NAME              = "proxy.process.http2.session_die_default";
-static const char *const HTTP2_STAT_SESSION_DIE_OTHER_NAME                = "proxy.process.http2.session_die_other";
-static const char *const HTTP2_STAT_SESSION_DIE_ACTIVE_NAME               = "proxy.process.http2.session_die_active";
-static const char *const HTTP2_STAT_SESSION_DIE_INACTIVE_NAME             = "proxy.process.http2.session_die_inactive";
-static const char *const HTTP2_STAT_SESSION_DIE_EOS_NAME                  = "proxy.process.http2.session_die_eos";
-static const char *const HTTP2_STAT_SESSION_DIE_ERROR_NAME                = "proxy.process.http2.session_die_error";
-static const char *const HTTP2_STAT_SESSION_DIE_HIGH_ERROR_RATE_NAME      = "proxy.process.http2.session_die_high_error_rate";
-static const char *const HTTP2_STAT_MAX_SETTINGS_PER_FRAME_EXCEEDED_NAME  = "proxy.process.http2.max_settings_per_frame_exceeded";
-static const char *const HTTP2_STAT_MAX_SETTINGS_PER_MINUTE_EXCEEDED_NAME = "proxy.process.http2.max_settings_per_minute_exceeded";
-static const char *const HTTP2_STAT_MAX_SETTINGS_FRAMES_PER_MINUTE_EXCEEDED_NAME =
-  "proxy.process.http2.max_settings_frames_per_minute_exceeded";
-static const char *const HTTP2_STAT_MAX_PING_FRAMES_PER_MINUTE_EXCEEDED_NAME =
-  "proxy.process.http2.max_ping_frames_per_minute_exceeded";
-static const char *const HTTP2_STAT_MAX_PRIORITY_FRAMES_PER_MINUTE_EXCEEDED_NAME =
-  "proxy.process.http2.max_priority_frames_per_minute_exceeded";
-static const char *const HTTP2_STAT_INSUFFICIENT_AVG_WINDOW_UPDATE_NAME = "proxy.process.http2.insufficient_avg_window_update";
-static const char *const HTTP2_STAT_MAX_CONCURRENT_STREAMS_EXCEEDED_IN_NAME =
-  "proxy.process.http2.max_concurrent_streams_exceeded_in";
-static const char *const HTTP2_STAT_MAX_CONCURRENT_STREAMS_EXCEEDED_OUT_NAME =
-  "proxy.process.http2.max_concurrent_streams_exceeded_out";
+Http2StatsBlock http2_rsb;
 
 union byte_pointer {
   byte_pointer(void *p) : ptr(p) {}
@@ -600,69 +567,38 @@ Http2::init()
   } while (0);
 
   // Setup statistics
-  http2_rsb = RecAllocateRawStatBlock(static_cast<int>(HTTP2_N_STATS));
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_CURRENT_CLIENT_CONNECTION_NAME, RECD_INT, RECP_NON_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_CURRENT_CLIENT_SESSION_COUNT), RecRawStatSyncSum);
-  HTTP2_CLEAR_DYN_STAT(HTTP2_STAT_CURRENT_CLIENT_SESSION_COUNT);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_CURRENT_SERVER_CONNECTION_NAME, RECD_INT, RECP_NON_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_CURRENT_SERVER_SESSION_COUNT), RecRawStatSyncSum);
-  HTTP2_CLEAR_DYN_STAT(HTTP2_STAT_CURRENT_SERVER_SESSION_COUNT);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_CURRENT_ACTIVE_CLIENT_CONNECTION_NAME, RECD_INT, RECP_NON_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_CURRENT_ACTIVE_CLIENT_CONNECTION_COUNT), RecRawStatSyncSum);
-  HTTP2_CLEAR_DYN_STAT(HTTP2_STAT_CURRENT_ACTIVE_CLIENT_CONNECTION_COUNT);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_CURRENT_ACTIVE_SERVER_CONNECTION_NAME, RECD_INT, RECP_NON_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_CURRENT_ACTIVE_SERVER_CONNECTION_COUNT), RecRawStatSyncSum);
-  HTTP2_CLEAR_DYN_STAT(HTTP2_STAT_CURRENT_ACTIVE_SERVER_CONNECTION_COUNT);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_CURRENT_CLIENT_STREAM_NAME, RECD_INT, RECP_NON_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_CURRENT_CLIENT_STREAM_COUNT), RecRawStatSyncSum);
-  HTTP2_CLEAR_DYN_STAT(HTTP2_STAT_CURRENT_CLIENT_STREAM_COUNT);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_CURRENT_SERVER_STREAM_NAME, RECD_INT, RECP_NON_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_CURRENT_SERVER_STREAM_COUNT), RecRawStatSyncSum);
-  HTTP2_CLEAR_DYN_STAT(HTTP2_STAT_CURRENT_SERVER_STREAM_COUNT);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_TOTAL_CLIENT_STREAM_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_TOTAL_CLIENT_STREAM_COUNT), RecRawStatSyncCount);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_TOTAL_SERVER_STREAM_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_TOTAL_SERVER_STREAM_COUNT), RecRawStatSyncCount);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_TOTAL_TRANSACTIONS_TIME_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_TOTAL_TRANSACTIONS_TIME), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_TOTAL_CLIENT_CONNECTION_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_TOTAL_CLIENT_CONNECTION_COUNT), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_TOTAL_SERVER_CONNECTION_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_TOTAL_SERVER_CONNECTION_COUNT), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_CONNECTION_ERRORS_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_CONNECTION_ERRORS_COUNT), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_STREAM_ERRORS_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_STREAM_ERRORS_COUNT), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_SESSION_DIE_DEFAULT_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_SESSION_DIE_DEFAULT), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_SESSION_DIE_OTHER_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_SESSION_DIE_OTHER), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_SESSION_DIE_EOS_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_SESSION_DIE_EOS), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_SESSION_DIE_ACTIVE_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_SESSION_DIE_ACTIVE), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_SESSION_DIE_INACTIVE_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_SESSION_DIE_INACTIVE), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_SESSION_DIE_ERROR_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_SESSION_DIE_ERROR), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_SESSION_DIE_HIGH_ERROR_RATE_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_SESSION_DIE_HIGH_ERROR_RATE), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_MAX_SETTINGS_PER_FRAME_EXCEEDED_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_MAX_SETTINGS_PER_FRAME_EXCEEDED), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_MAX_SETTINGS_PER_MINUTE_EXCEEDED_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_MAX_SETTINGS_PER_MINUTE_EXCEEDED), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_MAX_SETTINGS_FRAMES_PER_MINUTE_EXCEEDED_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_MAX_SETTINGS_FRAMES_PER_MINUTE_EXCEEDED), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_MAX_PING_FRAMES_PER_MINUTE_EXCEEDED_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_MAX_PING_FRAMES_PER_MINUTE_EXCEEDED), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_MAX_PRIORITY_FRAMES_PER_MINUTE_EXCEEDED_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_MAX_PRIORITY_FRAMES_PER_MINUTE_EXCEEDED), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_INSUFFICIENT_AVG_WINDOW_UPDATE_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_INSUFFICIENT_AVG_WINDOW_UPDATE), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_MAX_CONCURRENT_STREAMS_EXCEEDED_IN_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_MAX_CONCURRENT_STREAMS_EXCEEDED_IN), RecRawStatSyncSum);
-  RecRegisterRawStat(http2_rsb, RECT_PROCESS, HTTP2_STAT_MAX_CONCURRENT_STREAMS_EXCEEDED_OUT_NAME, RECD_INT, RECP_PERSISTENT,
-                     static_cast<int>(HTTP2_STAT_MAX_CONCURRENT_STREAMS_EXCEEDED_OUT), RecRawStatSyncSum);
+  ts::Metrics &intm = ts::Metrics::getInstance();
+
+  http2_rsb.current_client_session_count           = intm.newMetricPtr("proxy.process.http2.current_client_connections");
+  http2_rsb.current_server_session_count           = intm.newMetricPtr("proxy.process.http2.current_server_connections");
+  http2_rsb.current_active_client_connection_count = intm.newMetricPtr("proxy.process.http2.current_active_client_connections");
+  http2_rsb.current_active_server_connection_count = intm.newMetricPtr("proxy.process.http2.current_active_server_connections");
+  http2_rsb.current_client_stream_count            = intm.newMetricPtr("proxy.process.http2.current_client_streams");
+  http2_rsb.current_server_stream_count            = intm.newMetricPtr("proxy.process.http2.current_server_streams");
+  http2_rsb.total_client_stream_count              = intm.newMetricPtr("proxy.process.http2.total_client_streams");
+  http2_rsb.total_server_stream_count              = intm.newMetricPtr("proxy.process.http2.total_server_streams");
+  http2_rsb.total_transactions_time                = intm.newMetricPtr("proxy.process.http2.total_transactions_time");
+  http2_rsb.total_client_connection_count          = intm.newMetricPtr("proxy.process.http2.total_client_connections");
+  http2_rsb.total_server_connection_count          = intm.newMetricPtr("proxy.process.http2.total_server_connections");
+  http2_rsb.stream_errors_count                    = intm.newMetricPtr("proxy.process.http2.stream_errors");
+  http2_rsb.connection_errors_count                = intm.newMetricPtr("proxy.process.http2.connection_errors");
+  http2_rsb.session_die_default                    = intm.newMetricPtr("proxy.process.http2.session_die_default");
+  http2_rsb.session_die_other                      = intm.newMetricPtr("proxy.process.http2.session_die_other");
+  http2_rsb.session_die_active                     = intm.newMetricPtr("proxy.process.http2.session_die_active");
+  http2_rsb.session_die_inactive                   = intm.newMetricPtr("proxy.process.http2.session_die_inactive");
+  http2_rsb.session_die_eos                        = intm.newMetricPtr("proxy.process.http2.session_die_eos");
+  http2_rsb.session_die_error                      = intm.newMetricPtr("proxy.process.http2.session_die_error");
+  http2_rsb.session_die_high_error_rate            = intm.newMetricPtr("proxy.process.http2.session_die_high_error_rate");
+  http2_rsb.max_settings_per_frame_exceeded        = intm.newMetricPtr("proxy.process.http2.max_settings_per_frame_exceeded");
+  http2_rsb.max_settings_per_minute_exceeded       = intm.newMetricPtr("proxy.process.http2.max_settings_per_minute_exceeded");
+  http2_rsb.max_settings_frames_per_minute_exceeded =
+    intm.newMetricPtr("proxy.process.http2.max_settings_frames_per_minute_exceeded");
+  http2_rsb.max_ping_frames_per_minute_exceeded = intm.newMetricPtr("proxy.process.http2.max_ping_frames_per_minute_exceeded");
+  http2_rsb.max_priority_frames_per_minute_exceeded =
+    intm.newMetricPtr("proxy.process.http2.max_priority_frames_per_minute_exceeded");
+  http2_rsb.insufficient_avg_window_update      = intm.newMetricPtr("proxy.process.http2.insufficient_avg_window_update");
+  http2_rsb.max_concurrent_streams_exceeded_in  = intm.newMetricPtr("proxy.process.http2.max_concurrent_streams_exceeded_in");
+  http2_rsb.max_concurrent_streams_exceeded_out = intm.newMetricPtr("proxy.process.http2.max_concurrent_streams_exceeded_out");
 
   http2_init();
 }
diff --git a/proxy/http2/HTTP2.h b/proxy/http2/HTTP2.h
index 65b5413ef8..2c65a6b323 100644
--- a/proxy/http2/HTTP2.h
+++ b/proxy/http2/HTTP2.h
@@ -29,6 +29,10 @@
 #include "MIME.h"
 #include "records/I_RecDefs.h"
 
+#include "api/Metrics.h"
+
+using ts::Metrics;
+
 class HTTPHdr;
 
 // [RFC 9113] 5.1.1 Stream identifiers.
@@ -72,43 +76,38 @@ const uint32_t HTTP2_PRIORITY_DEFAULT_STREAM_DEPENDENCY = 0;
 const uint8_t HTTP2_PRIORITY_DEFAULT_WEIGHT             = 15;
 
 // Statistics
-enum {
-  HTTP2_STAT_CURRENT_CLIENT_SESSION_COUNT,           // Current # of inbound HTTP2 connections
-  HTTP2_STAT_CURRENT_SERVER_SESSION_COUNT,           // Current # of outbound HTTP2 connections
-  HTTP2_STAT_CURRENT_ACTIVE_CLIENT_CONNECTION_COUNT, // Current # of active inbound HTTP2 connections
-  HTTP2_STAT_CURRENT_ACTIVE_SERVER_CONNECTION_COUNT, // Current # of active outbound HTTP2 connections
-  HTTP2_STAT_CURRENT_CLIENT_STREAM_COUNT,            // Current # of active inbound HTTP2 streams
-  HTTP2_STAT_CURRENT_SERVER_STREAM_COUNT,            // Current # of active outboundHTTP2 streams
-  HTTP2_STAT_TOTAL_CLIENT_STREAM_COUNT,
-  HTTP2_STAT_TOTAL_SERVER_STREAM_COUNT,
-  HTTP2_STAT_TOTAL_TRANSACTIONS_TIME,       // Total stream time and streams
-  HTTP2_STAT_TOTAL_CLIENT_CONNECTION_COUNT, // Total inbound connections running http2
-  HTTP2_STAT_TOTAL_SERVER_CONNECTION_COUNT, // Total outbound connections running http2
-  HTTP2_STAT_STREAM_ERRORS_COUNT,
-  HTTP2_STAT_CONNECTION_ERRORS_COUNT,
-  HTTP2_STAT_SESSION_DIE_DEFAULT,
-  HTTP2_STAT_SESSION_DIE_OTHER,
-  HTTP2_STAT_SESSION_DIE_ACTIVE,
-  HTTP2_STAT_SESSION_DIE_INACTIVE,
-  HTTP2_STAT_SESSION_DIE_EOS,
-  HTTP2_STAT_SESSION_DIE_ERROR,
-  HTTP2_STAT_SESSION_DIE_HIGH_ERROR_RATE,
-  HTTP2_STAT_MAX_SETTINGS_PER_FRAME_EXCEEDED,
-  HTTP2_STAT_MAX_SETTINGS_PER_MINUTE_EXCEEDED,
-  HTTP2_STAT_MAX_SETTINGS_FRAMES_PER_MINUTE_EXCEEDED,
-  HTTP2_STAT_MAX_PING_FRAMES_PER_MINUTE_EXCEEDED,
-  HTTP2_STAT_MAX_PRIORITY_FRAMES_PER_MINUTE_EXCEEDED,
-  HTTP2_STAT_INSUFFICIENT_AVG_WINDOW_UPDATE,
-  HTTP2_STAT_MAX_CONCURRENT_STREAMS_EXCEEDED_IN,
-  HTTP2_STAT_MAX_CONCURRENT_STREAMS_EXCEEDED_OUT,
-
-  HTTP2_N_STATS // Terminal counter, NOT A STAT INDEX.
+struct Http2StatsBlock {
+  Metrics::IntType *current_client_session_count;
+  Metrics::IntType *current_server_session_count;
+  Metrics::IntType *current_active_client_connection_count;
+  Metrics::IntType *current_active_server_connection_count;
+  Metrics::IntType *current_client_stream_count;
+  Metrics::IntType *current_server_stream_count;
+  Metrics::IntType *total_client_stream_count;
+  Metrics::IntType *total_server_stream_count;
+  Metrics::IntType *total_transactions_time;
+  Metrics::IntType *total_client_connection_count;
+  Metrics::IntType *total_server_connection_count;
+  Metrics::IntType *stream_errors_count;
+  Metrics::IntType *connection_errors_count;
+  Metrics::IntType *session_die_default;
+  Metrics::IntType *session_die_other;
+  Metrics::IntType *session_die_active;
+  Metrics::IntType *session_die_inactive;
+  Metrics::IntType *session_die_eos;
+  Metrics::IntType *session_die_error;
+  Metrics::IntType *session_die_high_error_rate;
+  Metrics::IntType *max_settings_per_frame_exceeded;
+  Metrics::IntType *max_settings_per_minute_exceeded;
+  Metrics::IntType *max_settings_frames_per_minute_exceeded;
+  Metrics::IntType *max_ping_frames_per_minute_exceeded;
+  Metrics::IntType *max_priority_frames_per_minute_exceeded;
+  Metrics::IntType *insufficient_avg_window_update;
+  Metrics::IntType *max_concurrent_streams_exceeded_in;
+  Metrics::IntType *max_concurrent_streams_exceeded_out;
 };
 
-#define HTTP2_INCREMENT_THREAD_DYN_STAT(_s, _t) RecIncrRawStat(http2_rsb, _t, (int)_s, 1);
-#define HTTP2_DECREMENT_THREAD_DYN_STAT(_s, _t) RecIncrRawStat(http2_rsb, _t, (int)_s, -1);
-#define HTTP2_SUM_THREAD_DYN_STAT(_s, _t, _v)   RecIncrRawStat(http2_rsb, _t, (int)_s, _v);
-extern RecRawStatBlock *http2_rsb; // Container for statistics.
+extern Http2StatsBlock http2_rsb;
 
 // [RFC 7540] 6.9.1. The Flow Control Window
 static const Http2WindowSize HTTP2_MAX_WINDOW_SIZE = 0x7FFFFFFF;
diff --git a/proxy/http2/Http2ClientSession.cc b/proxy/http2/Http2ClientSession.cc
index 8684f7257d..4e945deba0 100644
--- a/proxy/http2/Http2ClientSession.cc
+++ b/proxy/http2/Http2ClientSession.cc
@@ -60,7 +60,7 @@ Http2ClientSession::free()
 {
   auto mutex_thread = this->mutex->thread_holding;
   if (Http2CommonSession::common_free(this)) {
-    HTTP2_DECREMENT_THREAD_DYN_STAT(HTTP2_STAT_CURRENT_CLIENT_SESSION_COUNT, mutex_thread);
+    Metrics::decrement(http2_rsb.current_client_session_count);
     THREAD_FREE(this, http2ClientSessionAllocator, mutex_thread);
   }
 }
@@ -88,8 +88,8 @@ void
 Http2ClientSession::new_connection(NetVConnection *new_vc, MIOBuffer *iobuf, IOBufferReader *reader)
 {
   ink_assert(new_vc->mutex->thread_holding == this_ethread());
-  HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_CURRENT_CLIENT_SESSION_COUNT, new_vc->mutex->thread_holding);
-  HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_TOTAL_CLIENT_CONNECTION_COUNT, new_vc->mutex->thread_holding);
+  Metrics::increment(http2_rsb.current_client_session_count);
+  Metrics::increment(http2_rsb.total_client_connection_count);
   this->_milestones.mark(Http2SsnMilestone::OPEN);
 
   // Unique client session identifier.
@@ -254,13 +254,13 @@ Http2ClientSession::main_event_handler(int event, void *edata)
 void
 Http2ClientSession::increment_current_active_connections_stat()
 {
-  HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_CURRENT_ACTIVE_CLIENT_CONNECTION_COUNT, this_ethread());
+  Metrics::increment(http2_rsb.current_active_client_connection_count);
 }
 
 void
 Http2ClientSession::decrement_current_active_connections_stat()
 {
-  HTTP2_DECREMENT_THREAD_DYN_STAT(HTTP2_STAT_CURRENT_ACTIVE_CLIENT_CONNECTION_COUNT, this_ethread());
+  Metrics::decrement(http2_rsb.current_active_client_connection_count);
 }
 
 sockaddr const *
diff --git a/proxy/http2/Http2CommonSession.cc b/proxy/http2/Http2CommonSession.cc
index 613d6a1de4..768e90e17c 100644
--- a/proxy/http2/Http2CommonSession.cc
+++ b/proxy/http2/Http2CommonSession.cc
@@ -98,32 +98,32 @@ Http2CommonSession::common_free(ProxySession *ssn)
   if (cause_of_death != Http2SessionCod::NOT_PROVIDED) {
     switch (cause_of_death) {
     case Http2SessionCod::HIGH_ERROR_RATE:
-      HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_SESSION_DIE_HIGH_ERROR_RATE, this_ethread());
+      Metrics::increment(http2_rsb.session_die_high_error_rate);
       break;
     case Http2SessionCod::NOT_PROVIDED:
       // Can't happen but this case is here to not have default case.
-      HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_SESSION_DIE_OTHER, this_ethread());
+      Metrics::increment(http2_rsb.session_die_other);
       break;
     }
   } else {
     switch (dying_event) {
     case VC_EVENT_NONE:
-      HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_SESSION_DIE_DEFAULT, this_ethread());
+      Metrics::increment(http2_rsb.session_die_default);
       break;
     case VC_EVENT_ACTIVE_TIMEOUT:
-      HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_SESSION_DIE_ACTIVE, this_ethread());
+      Metrics::increment(http2_rsb.session_die_active);
       break;
     case VC_EVENT_INACTIVITY_TIMEOUT:
-      HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_SESSION_DIE_INACTIVE, this_ethread());
+      Metrics::increment(http2_rsb.session_die_inactive);
       break;
     case VC_EVENT_ERROR:
-      HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_SESSION_DIE_ERROR, this_ethread());
+      Metrics::increment(http2_rsb.session_die_error);
       break;
     case VC_EVENT_EOS:
-      HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_SESSION_DIE_EOS, this_ethread());
+      Metrics::increment(http2_rsb.session_die_eos);
       break;
     default:
-      HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_SESSION_DIE_OTHER, this_ethread());
+      Metrics::increment(http2_rsb.session_die_other);
       break;
     }
   }
diff --git a/proxy/http2/Http2ConnectionState.cc b/proxy/http2/Http2ConnectionState.cc
index fbc53d9f38..39ab088b70 100644
--- a/proxy/http2/Http2ConnectionState.cc
+++ b/proxy/http2/Http2ConnectionState.cc
@@ -553,7 +553,7 @@ Http2ConnectionState::rcv_priority_frame(const Http2Frame &frame)
   // Close this connection if its priority frame count received exceeds a limit
   if (Http2::max_priority_frames_per_minute != 0 &&
       this->get_received_priority_frame_count() > Http2::max_priority_frames_per_minute) {
-    HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_MAX_PRIORITY_FRAMES_PER_MINUTE_EXCEEDED, this_ethread());
+    Metrics::increment(http2_rsb.max_priority_frames_per_minute_exceeded);
     Http2StreamDebug(this->session, stream_id, "Observed too frequent priority changes: %u priority changes within a last minute",
                      this->get_received_priority_frame_count());
     return Http2Error(Http2ErrorClass::HTTP2_ERROR_CLASS_CONNECTION, Http2ErrorCode::HTTP2_ERROR_ENHANCE_YOUR_CALM,
@@ -664,7 +664,7 @@ Http2ConnectionState::rcv_settings_frame(const Http2Frame &frame)
   this->increment_received_settings_frame_count();
   // Close this connection if its SETTINGS frame count exceeds a limit
   if (this->get_received_settings_frame_count() > Http2::max_settings_frames_per_minute) {
-    HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_MAX_SETTINGS_FRAMES_PER_MINUTE_EXCEEDED, this_ethread());
+    Metrics::increment(http2_rsb.max_settings_frames_per_minute_exceeded);
     Http2StreamDebug(this->session, stream_id, "Observed too frequent SETTINGS frames: %u frames within a last minute",
                      this->get_received_settings_frame_count());
     return Http2Error(Http2ErrorClass::HTTP2_ERROR_CLASS_CONNECTION, Http2ErrorCode::HTTP2_ERROR_ENHANCE_YOUR_CALM,
@@ -704,7 +704,7 @@ Http2ConnectionState::rcv_settings_frame(const Http2Frame &frame)
   uint32_t n_settings = 0;
   while (nbytes < frame.header().length) {
     if (n_settings >= Http2::max_settings_per_frame) {
-      HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_MAX_SETTINGS_PER_FRAME_EXCEEDED, this_ethread());
+      Metrics::increment(http2_rsb.max_settings_per_frame_exceeded);
       Http2StreamDebug(this->session, stream_id, "Observed too many settings in a frame");
       return Http2Error(Http2ErrorClass::HTTP2_ERROR_CLASS_CONNECTION, Http2ErrorCode::HTTP2_ERROR_ENHANCE_YOUR_CALM,
                         "recv settings too many settings in a frame");
@@ -745,7 +745,7 @@ Http2ConnectionState::rcv_settings_frame(const Http2Frame &frame)
   this->increment_received_settings_count(n_settings);
   // Close this connection if its settings count received exceeds a limit
   if (this->get_received_settings_count() > Http2::max_settings_per_minute) {
-    HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_MAX_SETTINGS_PER_MINUTE_EXCEEDED, this_ethread());
+    Metrics::increment(http2_rsb.max_settings_per_minute_exceeded);
     Http2StreamDebug(this->session, stream_id, "Observed too frequent setting changes: %u settings within a last minute",
                      this->get_received_settings_count());
     return Http2Error(Http2ErrorClass::HTTP2_ERROR_CLASS_CONNECTION, Http2ErrorCode::HTTP2_ERROR_ENHANCE_YOUR_CALM,
@@ -799,7 +799,7 @@ Http2ConnectionState::rcv_ping_frame(const Http2Frame &frame)
   this->increment_received_ping_frame_count();
   // Close this connection if its ping count received exceeds a limit
   if (this->get_received_ping_frame_count() > Http2::max_ping_frames_per_minute) {
-    HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_MAX_PING_FRAMES_PER_MINUTE_EXCEEDED, this_ethread());
+    Metrics::increment(http2_rsb.max_ping_frames_per_minute_exceeded);
     Http2StreamDebug(this->session, stream_id, "Observed too frequent PING frames: %u PING frames within a last minute",
                      this->get_received_ping_frame_count());
     return Http2Error(Http2ErrorClass::HTTP2_ERROR_CLASS_CONNECTION, Http2ErrorCode::HTTP2_ERROR_ENHANCE_YOUR_CALM,
@@ -1616,10 +1616,8 @@ Http2ConnectionState::create_stream(Http2StreamId new_id, Http2Error &error)
   // stream limit to be exceeded MUST treat this as a stream error.
   int check_max_concurrent_limit = 0;
   int check_count                = 0;
-  int max_streams_stat           = 0;
   if (is_client_streamid) {
-    check_count      = peer_streams_count_in;
-    max_streams_stat = HTTP2_STAT_MAX_CONCURRENT_STREAMS_EXCEEDED_IN;
+    check_count = peer_streams_count_in;
     // If this is an outbound client stream, must check against the peer's max_concurrent
     if (session->is_outbound()) {
       check_max_concurrent_limit = peer_settings.get(HTTP2_SETTINGS_MAX_CONCURRENT_STREAMS);
@@ -1627,8 +1625,7 @@ Http2ConnectionState::create_stream(Http2StreamId new_id, Http2Error &error)
       check_max_concurrent_limit = acknowledged_local_settings.get(HTTP2_SETTINGS_MAX_CONCURRENT_STREAMS);
     }
   } else { // Not a client stream (i.e. a push)
-    check_count      = peer_streams_count_out;
-    max_streams_stat = HTTP2_STAT_MAX_CONCURRENT_STREAMS_EXCEEDED_OUT;
+    check_count = peer_streams_count_out;
     // If this is an outbound non-client stream, must check against the local max_concurrent
     if (session->is_outbound()) {
       check_max_concurrent_limit = acknowledged_local_settings.get(HTTP2_SETTINGS_MAX_CONCURRENT_STREAMS);
@@ -1638,7 +1635,8 @@ Http2ConnectionState::create_stream(Http2StreamId new_id, Http2Error &error)
   }
   // If we haven't got the peers settings yet, just hope for the best
   if (check_max_concurrent_limit >= 0 && check_count >= check_max_concurrent_limit) {
-    HTTP2_INCREMENT_THREAD_DYN_STAT(max_streams_stat, this_ethread());
+    Metrics::increment(is_client_streamid ? http2_rsb.max_concurrent_streams_exceeded_in :
+                                            http2_rsb.max_concurrent_streams_exceeded_out);
     error = Http2Error(Http2ErrorClass::HTTP2_ERROR_CLASS_STREAM, Http2ErrorCode::HTTP2_ERROR_REFUSED_STREAM,
                        "recv headers creating stream beyond max_concurrent limit");
     return nullptr;
@@ -2394,7 +2392,7 @@ Http2ConnectionState::send_rst_stream_frame(Http2StreamId id, Http2ErrorCode ec)
   Http2StreamDebug(session, id, "Send RST_STREAM frame");
 
   if (ec != Http2ErrorCode::HTTP2_ERROR_NO_ERROR) {
-    HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_STREAM_ERRORS_COUNT, this_ethread());
+    Metrics::increment(http2_rsb.stream_errors_count);
     ++stream_error_count;
   }
 
@@ -2502,7 +2500,7 @@ Http2ConnectionState::send_goaway_frame(Http2StreamId id, Http2ErrorCode ec)
   Http2ConDebug(session, "Send GOAWAY frame, last_stream_id: %d", id);
 
   if (ec != Http2ErrorCode::HTTP2_ERROR_NO_ERROR) {
-    HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_CONNECTION_ERRORS_COUNT, this_ethread());
+    Metrics::increment(http2_rsb.connection_errors_count);
   }
 
   this->tx_error_code = {ProxyErrorClass::SSN, static_cast<uint32_t>(ec)};
@@ -2590,8 +2588,7 @@ Http2ConnectionState::_adjust_concurrent_stream()
     return max_concurrent_streams;
   }
 
-  int64_t current_client_streams = 0;
-  RecGetRawStatSum(http2_rsb, HTTP2_STAT_CURRENT_CLIENT_STREAM_COUNT, &current_client_streams);
+  int64_t current_client_streams = Metrics::read(http2_rsb.current_client_stream_count);
 
   Http2ConDebug(session, "current client streams: %" PRId64, current_client_streams);
 
@@ -2660,7 +2657,7 @@ Http2ConnectionState::increment_peer_rwnd(size_t amount)
   double sum = std::accumulate(this->_recent_rwnd_increment.begin(), this->_recent_rwnd_increment.end(), 0.0);
   double avg = sum / this->_recent_rwnd_increment.size();
   if (avg < Http2::min_avg_window_update) {
-    HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_INSUFFICIENT_AVG_WINDOW_UPDATE, this_ethread());
+    Metrics::increment(http2_rsb.insufficient_avg_window_update);
     return Http2ErrorCode::HTTP2_ERROR_ENHANCE_YOUR_CALM;
   }
   return Http2ErrorCode::HTTP2_ERROR_NO_ERROR;
diff --git a/proxy/http2/Http2ServerSession.cc b/proxy/http2/Http2ServerSession.cc
index 81d9aad92c..38e8cf3d3c 100644
--- a/proxy/http2/Http2ServerSession.cc
+++ b/proxy/http2/Http2ServerSession.cc
@@ -61,7 +61,7 @@ Http2ServerSession::free()
 {
   auto mutex_thread = this->mutex->thread_holding;
   if (Http2CommonSession::common_free(this)) {
-    HTTP2_DECREMENT_THREAD_DYN_STAT(HTTP2_STAT_CURRENT_SERVER_SESSION_COUNT, mutex_thread);
+    Metrics::decrement(http2_rsb.current_server_session_count);
     THREAD_FREE(this, http2ServerSessionAllocator, mutex_thread);
   }
 }
@@ -95,8 +95,9 @@ void
 Http2ServerSession::new_connection(NetVConnection *new_vc, MIOBuffer *iobuf, IOBufferReader *reader)
 {
   ink_assert(new_vc->mutex->thread_holding == this_ethread());
-  HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_CURRENT_SERVER_SESSION_COUNT, new_vc->mutex->thread_holding);
-  HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_TOTAL_SERVER_CONNECTION_COUNT, new_vc->mutex->thread_holding);
+
+  Metrics::increment(http2_rsb.current_server_session_count);
+  Metrics::increment(http2_rsb.total_server_connection_count);
   this->_milestones.mark(Http2SsnMilestone::OPEN);
 
   // Unique client session identifier.
@@ -245,18 +246,6 @@ Http2ServerSession::main_event_handler(int event, void *edata)
   return retval;
 }
 
-void
-Http2ServerSession::increment_current_active_connections_stat()
-{
-  HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_CURRENT_ACTIVE_SERVER_CONNECTION_COUNT, this_ethread());
-}
-
-void
-Http2ServerSession::decrement_current_active_connections_stat()
-{
-  HTTP2_DECREMENT_THREAD_DYN_STAT(HTTP2_STAT_CURRENT_ACTIVE_SERVER_CONNECTION_COUNT, this_ethread());
-}
-
 sockaddr const *
 Http2ServerSession::get_remote_addr() const
 {
diff --git a/proxy/http2/Http2ServerSession.h b/proxy/http2/Http2ServerSession.h
index 93d8f9fbf2..30f3a074b7 100644
--- a/proxy/http2/Http2ServerSession.h
+++ b/proxy/http2/Http2ServerSession.h
@@ -65,12 +65,22 @@ public:
   int populate_protocol(std::string_view *result, int size) const override;
   const char *protocol_contains(std::string_view prefix) const override;
   HTTPVersion get_version(HTTPHdr &hdr) const override;
-  void increment_current_active_connections_stat() override;
-  void decrement_current_active_connections_stat() override;
   IOBufferReader *get_remote_reader() override;
 
   ProxySession *get_proxy_session() override;
 
+  void
+  increment_current_active_connections_stat() override
+  {
+    Metrics::increment(http2_rsb.current_active_server_connection_count);
+  }
+
+  void
+  decrement_current_active_connections_stat() override
+  {
+    Metrics::decrement(http2_rsb.current_active_server_connection_count);
+  }
+
   // noncopyable
   Http2ServerSession(Http2ServerSession &)                  = delete;
   Http2ServerSession &operator=(const Http2ServerSession &) = delete;
diff --git a/proxy/http2/Http2SessionAccept.cc b/proxy/http2/Http2SessionAccept.cc
index f0226fdee8..4455975da2 100644
--- a/proxy/http2/Http2SessionAccept.cc
+++ b/proxy/http2/Http2SessionAccept.cc
@@ -81,7 +81,8 @@ Http2SessionAccept::mainEvent(int event, void *data)
   // XXX We should hoist the error handling so that all the protocols generate the statistics
   // without code duplication.
   if (((long)data) == -ECONNABORTED) {
-    HTTP_SUM_DYN_STAT(http_ua_msecs_counts_errors_pre_accept_hangups_stat, 0);
+    Metrics::increment(http_rsb.ua_counts_errors_pre_accept_hangups);
+    // Metrics::increment(http_rsb.ua_msecs_errors_pre_accept_hangups, 0); // ToDo: This is odd, but we added 0 before as well
   }
 
   ink_abort("HTTP/2 accept received fatal error: errno = %d", -(static_cast<int>((intptr_t)data)));
diff --git a/proxy/http2/Http2Stream.cc b/proxy/http2/Http2Stream.cc
index 1d35d82aac..24ac4ab1ec 100644
--- a/proxy/http2/Http2Stream.cc
+++ b/proxy/http2/Http2Stream.cc
@@ -121,7 +121,7 @@ Http2Stream::~Http2Stream()
   this->_milestones.mark(Http2StreamMilestone::CLOSE);
 
   ink_hrtime total_time = this->_milestones.elapsed(Http2StreamMilestone::OPEN, Http2StreamMilestone::CLOSE);
-  HTTP2_SUM_THREAD_DYN_STAT(HTTP2_STAT_TOTAL_TRANSACTIONS_TIME, this->_thread, total_time);
+  Metrics::increment(http2_rsb.total_transactions_time, total_time);
 
   // Slow Log
   if (Http2::stream_slow_log_threshold != 0 && ink_hrtime_from_msec(Http2::stream_slow_log_threshold) < total_time) {
@@ -1030,11 +1030,11 @@ void
 Http2Stream::increment_transactions_stat()
 {
   if (this->is_outbound_connection()) {
-    HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_CURRENT_SERVER_STREAM_COUNT, _thread);
-    HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_TOTAL_SERVER_STREAM_COUNT, _thread);
+    Metrics::increment(http2_rsb.current_server_stream_count);
+    Metrics::increment(http2_rsb.total_server_stream_count);
   } else {
-    HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_CURRENT_CLIENT_STREAM_COUNT, _thread);
-    HTTP2_INCREMENT_THREAD_DYN_STAT(HTTP2_STAT_TOTAL_CLIENT_STREAM_COUNT, _thread);
+    Metrics::increment(http2_rsb.current_client_stream_count);
+    Metrics::increment(http2_rsb.total_client_stream_count);
   }
 }
 
@@ -1042,9 +1042,9 @@ void
 Http2Stream::decrement_transactions_stat()
 {
   if (this->is_outbound_connection()) {
-    HTTP2_DECREMENT_THREAD_DYN_STAT(HTTP2_STAT_CURRENT_SERVER_STREAM_COUNT, _thread);
+    Metrics::decrement(http2_rsb.current_server_stream_count);
   } else {
-    HTTP2_DECREMENT_THREAD_DYN_STAT(HTTP2_STAT_CURRENT_CLIENT_STREAM_COUNT, _thread);
+    Metrics::decrement(http2_rsb.current_client_stream_count);
   }
 }
 
diff --git a/proxy/logging/Log.cc b/proxy/logging/Log.cc
index 0e2ee40e86..4957b39144 100644
--- a/proxy/logging/Log.cc
+++ b/proxy/logging/Log.cc
@@ -78,7 +78,7 @@ uint32_t Log::periodic_tasks_interval = PERIODIC_TASKS_INTERVAL_FALLBACK;
 // Hash table for LogField symbols
 std::unordered_map<std::string, LogField *> Log::field_symbol_hash;
 
-RecRawStatBlock *log_rsb;
+LogsStatsBlock log_rsb;
 
 /*-------------------------------------------------------------------------
   Log::change_configuration
@@ -1042,7 +1042,6 @@ Log::init(int flags)
   if (config_flags & LOGCAT) {
     logging_mode = LOG_MODE_NONE;
   } else {
-    log_rsb = RecAllocateRawStatBlock(static_cast<int>(log_stat_count));
     LogConfig::register_stat_callbacks();
 
     config->read_configuration_variables();
@@ -1075,11 +1074,6 @@ Log::init(int flags)
   //
   if (!(config_flags & NO_REMOTE_MANAGEMENT)) {
     REC_RegisterConfigUpdateFunc("proxy.config.log.logging_enabled", &Log::handle_logging_mode_change, nullptr);
-
-    // Clear any stat values that need to be reset on startup
-    //
-    RecSetRawStatSum(log_rsb, log_stat_log_files_open_stat, 0);
-    RecSetRawStatCount(log_rsb, log_stat_log_files_open_stat, 0);
   }
 
   init_fields();
@@ -1169,7 +1163,6 @@ Log::access(LogAccess *lad)
   int ret;
   static long sample = 1;
   long this_sample;
-  ProxyMutex *mutex = this_ethread()->mutex.get();
 
   // See if we're sampling and it is not time for another sample
   //
@@ -1177,7 +1170,7 @@ Log::access(LogAccess *lad)
     this_sample = sample++;
     if (this_sample && this_sample % Log::config->sampling_frequency) {
       Debug("log", "sampling, skipping this entry ...");
-      RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_event_log_access_skip_stat, 1);
+      Metrics::increment(log_rsb.event_log_access_skip);
       ret = Log::SKIP;
       goto done;
     } else {
@@ -1188,7 +1181,7 @@ Log::access(LogAccess *lad)
 
   if (Log::config->log_object_manager.get_num_objects() == 0) {
     Debug("log", "no log objects, skipping this entry ...");
-    RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_event_log_access_skip_stat, 1);
+    Metrics::increment(log_rsb.event_log_access_skip);
     ret = Log::SKIP;
     goto done;
   }
@@ -1224,8 +1217,7 @@ Log::error(const char *format, ...)
 int
 Log::va_error(const char *format, va_list ap)
 {
-  int ret_val       = Log::SKIP;
-  ProxyMutex *mutex = this_ethread()->mutex.get();
+  int ret_val = Log::SKIP;
 
   if (error_log) {
     ink_assert(format != nullptr);
@@ -1233,19 +1225,19 @@ Log::va_error(const char *format, va_list ap)
 
     switch (ret_val) {
     case Log::LOG_OK:
-      RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_event_log_error_ok_stat, 1);
+      Metrics::increment(log_rsb.event_log_error_ok);
       break;
     case Log::SKIP:
-      RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_event_log_error_skip_stat, 1);
+      Metrics::increment(log_rsb.event_log_error_skip);
       break;
     case Log::AGGR:
-      RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_event_log_error_aggr_stat, 1);
+      Metrics::increment(log_rsb.event_log_error_aggr);
       break;
     case Log::FULL:
-      RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_event_log_error_full_stat, 1);
+      Metrics::increment(log_rsb.event_log_error_full);
       break;
     case Log::FAIL:
-      RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_event_log_error_fail_stat, 1);
+      Metrics::increment(log_rsb.event_log_error_fail);
       break;
     default:
       ink_release_assert(!"Unexpected result");
@@ -1254,7 +1246,7 @@ Log::va_error(const char *format, va_list ap)
     return ret_val;
   }
 
-  RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_event_log_error_skip_stat, 1);
+  Metrics::increment(log_rsb.event_log_error_skip);
 
   return ret_val;
 }
@@ -1314,7 +1306,6 @@ Log::flush_thread_main(void * /* args ATS_UNUSED */)
   ink_hrtime now, last_time = 0;
   int len, total_bytes;
   SLL<LogFlushData, LogFlushData::Link_link> link, invert_link;
-  ProxyMutex *mutex = this_thread()->mutex.get();
 
   Log::flush_notify->lock();
 
@@ -1358,7 +1349,7 @@ Log::flush_thread_main(void * /* args ATS_UNUSED */)
       if (!logfile->is_open()) {
         SiteThrottledWarning("File:%s was closed, have dropped (%d) bytes.", logfile->get_name(), total_bytes);
 
-        RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_bytes_lost_before_written_to_disk_stat, total_bytes);
+        Metrics::increment(log_rsb.bytes_lost_before_written_to_disk, total_bytes);
         delete fdata;
         continue;
       }
@@ -1374,8 +1365,7 @@ Log::flush_thread_main(void * /* args ATS_UNUSED */)
           Debug("log", "logging space exhausted, failed to write file:%s, have dropped (%d) bytes.", logfile->get_name(),
                 (total_bytes - bytes_written));
 
-          RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_bytes_lost_before_written_to_disk_stat,
-                         total_bytes - bytes_written);
+          Metrics::increment(log_rsb.bytes_lost_before_written_to_disk, total_bytes - bytes_written);
           break;
         }
 
@@ -1385,15 +1375,14 @@ Log::flush_thread_main(void * /* args ATS_UNUSED */)
           SiteThrottledError("Failed to write log to %s: [tried %d, wrote %d, %s]", logfile->get_name(),
                              total_bytes - bytes_written, bytes_written, strerror(errno));
 
-          RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_bytes_lost_before_written_to_disk_stat,
-                         total_bytes - bytes_written);
+          Metrics::increment(log_rsb.bytes_lost_before_written_to_disk, total_bytes - bytes_written);
           break;
         }
         Debug("log", "Successfully wrote some stuff to %s", logfile->get_name());
         bytes_written += len;
       }
 
-      RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_bytes_written_to_disk_stat, bytes_written);
+      Metrics::increment(log_rsb.bytes_written_to_disk, bytes_written);
 
       if (logfile->m_log) {
         ink_atomic_increment(&logfile->m_log->m_bytes_written, bytes_written);
diff --git a/proxy/logging/LogAccess.cc b/proxy/logging/LogAccess.cc
index f0b1843147..36ed7187ea 100644
--- a/proxy/logging/LogAccess.cc
+++ b/proxy/logging/LogAccess.cc
@@ -214,9 +214,21 @@ LogAccess::marshal_record(char *record, char *buf)
   RecDataT stype = RECD_NULL;
   bool found     = false;
 
+  // Since, for now at least, String metrics are still in librecords, do that lookup
+  // first, and only do the new metrics lookup on a miss.
   if (RecGetRecordDataType(record, &stype) != REC_ERR_OKAY) {
-    out_buf   = "INVALID_RECORD";
-    num_chars = ::strlen(out_buf) + 1;
+    ts::Metrics &intm          = ts::Metrics::getInstance();
+    ts::Metrics::IdType metric = intm[record];
+
+    if (metric != ts::Metrics::NOT_FOUND) {
+      int64_t val = intm[metric];
+
+      out_buf = int64_to_str(ascii_buf, max_chars, val, &num_chars);
+      ink_assert(out_buf);
+    } else {
+      out_buf   = "INVALID_RECORD";
+      num_chars = ::strlen(out_buf) + 1;
+    }
   } else {
     if (LOG_INTEGER == stype || LOG_COUNTER == stype) {
       // we assume MgmtInt and MgmtIntCounter are int64_t for the
diff --git a/proxy/logging/LogConfig.cc b/proxy/logging/LogConfig.cc
index 8ecdf56344..ec9e9e9362 100644
--- a/proxy/logging/LogConfig.cc
+++ b/proxy/logging/LogConfig.cc
@@ -507,62 +507,32 @@ LogConfig::register_stat_callbacks()
   //
   // events
   //
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.event_log_error_ok", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)log_stat_event_log_error_ok_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.event_log_error_skip", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)log_stat_event_log_error_skip_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.event_log_error_aggr", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)log_stat_event_log_error_aggr_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.event_log_error_full", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)log_stat_event_log_error_full_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.event_log_error_fail", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)log_stat_event_log_error_fail_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.event_log_access_ok", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)log_stat_event_log_access_ok_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.event_log_access_skip", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)log_stat_event_log_access_skip_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.event_log_access_aggr", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)log_stat_event_log_access_aggr_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.event_log_access_full", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)log_stat_event_log_access_full_stat, RecRawStatSyncCount);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.event_log_access_fail", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)log_stat_event_log_access_fail_stat, RecRawStatSyncCount);
-  //
-  // number vs bytes of logs
-  //
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.num_sent_to_network", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)log_stat_num_sent_to_network_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.num_lost_before_sent_to_network", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)log_stat_num_lost_before_sent_to_network_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.num_received_from_network", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)log_stat_num_received_from_network_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.num_flush_to_disk", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)log_stat_num_flush_to_disk_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.num_lost_before_flush_to_disk", RECD_COUNTER, RECP_PERSISTENT,
-                     (int)log_stat_num_lost_before_flush_to_disk_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.bytes_lost_before_preproc", RECD_INT, RECP_PERSISTENT,
-                     (int)log_stat_bytes_lost_before_preproc_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.bytes_sent_to_network", RECD_INT, RECP_PERSISTENT,
-                     (int)log_stat_bytes_sent_to_network_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.bytes_lost_before_sent_to_network", RECD_INT, RECP_PERSISTENT,
-                     (int)log_stat_bytes_lost_before_sent_to_network_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.bytes_received_from_network", RECD_INT, RECP_PERSISTENT,
-                     (int)log_stat_bytes_received_from_network_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.bytes_flush_to_disk", RECD_INT, RECP_PERSISTENT,
-                     (int)log_stat_bytes_flush_to_disk_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.bytes_lost_before_flush_to_disk", RECD_INT, RECP_PERSISTENT,
-                     (int)log_stat_bytes_lost_before_flush_to_disk_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.bytes_written_to_disk", RECD_INT, RECP_PERSISTENT,
-                     (int)log_stat_bytes_written_to_disk_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.bytes_lost_before_written_to_disk", RECD_INT, RECP_PERSISTENT,
-                     (int)log_stat_bytes_lost_before_written_to_disk_stat, RecRawStatSyncSum);
-  //
-  // I/O
-  //
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.log_files_open", RECD_COUNTER, RECP_NON_PERSISTENT,
-                     (int)log_stat_log_files_open_stat, RecRawStatSyncSum);
-  RecRegisterRawStat(log_rsb, RECT_PROCESS, "proxy.process.log.log_files_space_used", RECD_INT, RECP_NON_PERSISTENT,
-                     (int)log_stat_log_files_space_used_stat, RecRawStatSyncSum);
+  ts::Metrics &intm                         = ts::Metrics::getInstance();
+  log_rsb.event_log_error_skip              = intm.newMetricPtr("proxy.process.log.event_log_error_skip");
+  log_rsb.event_log_error_ok                = intm.newMetricPtr("proxy.process.log.event_log_error_ok");
+  log_rsb.event_log_error_aggr              = intm.newMetricPtr("proxy.process.log.event_log_error_aggr");
+  log_rsb.event_log_error_full              = intm.newMetricPtr("proxy.process.log.event_log_error_full");
+  log_rsb.event_log_error_fail              = intm.newMetricPtr("proxy.process.log.event_log_error_fail");
+  log_rsb.event_log_access_ok               = intm.newMetricPtr("proxy.process.log.event_log_access_ok");
+  log_rsb.event_log_access_skip             = intm.newMetricPtr("proxy.process.log.event_log_access_skip");
+  log_rsb.event_log_access_aggr             = intm.newMetricPtr("proxy.process.log.event_log_access_aggr");
+  log_rsb.event_log_access_full             = intm.newMetricPtr("proxy.process.log.event_log_access_full");
+  log_rsb.event_log_access_fail             = intm.newMetricPtr("proxy.process.log.event_log_access_fail");
+  log_rsb.num_sent_to_network               = intm.newMetricPtr("proxy.process.log.num_sent_to_network");
+  log_rsb.num_lost_before_sent_to_network   = intm.newMetricPtr("proxy.process.log.num_lost_before_sent_to_network");
+  log_rsb.num_received_from_network         = intm.newMetricPtr("proxy.process.log.num_received_from_network");
+  log_rsb.num_flush_to_disk                 = intm.newMetricPtr("proxy.process.log.num_flush_to_disk");
+  log_rsb.num_lost_before_flush_to_disk     = intm.newMetricPtr("proxy.process.log.num_lost_before_flush_to_disk");
+  log_rsb.bytes_lost_before_preproc         = intm.newMetricPtr("proxy.process.log.bytes_lost_before_preproc");
+  log_rsb.bytes_sent_to_network             = intm.newMetricPtr("proxy.process.log.bytes_sent_to_network");
+  log_rsb.bytes_lost_before_sent_to_network = intm.newMetricPtr("proxy.process.log.bytes_lost_before_sent_to_network");
+  log_rsb.bytes_received_from_network       = intm.newMetricPtr("proxy.process.log.bytes_received_from_network");
+  log_rsb.bytes_flush_to_disk               = intm.newMetricPtr("proxy.process.log.bytes_flush_to_disk");
+  log_rsb.bytes_lost_before_flush_to_disk   = intm.newMetricPtr("proxy.process.log.bytes_lost_before_flush_to_disk");
+  log_rsb.bytes_written_to_disk             = intm.newMetricPtr("proxy.process.log.bytes_written_to_disk");
+  log_rsb.bytes_lost_before_written_to_disk = intm.newMetricPtr("proxy.process.log.bytes_lost_before_written_to_disk");
+  log_rsb.log_files_open                    = intm.newMetricPtr("proxy.process.log.log_files_open");
+  log_rsb.log_files_space_used              = intm.newMetricPtr("proxy.process.log.log_files_space_used");
 }
 
 /*-------------------------------------------------------------------------
@@ -688,8 +658,7 @@ LogConfig::update_space_used()
   //
   m_space_used           = total_space_used;
   m_partition_space_left = partition_space_left;
-  RecSetRawStatSum(log_rsb, log_stat_log_files_space_used_stat, m_space_used);
-  RecSetRawStatCount(log_rsb, log_stat_log_files_space_used_stat, 1);
+  Metrics::write(log_rsb.log_files_space_used, m_space_used);
 
   Debug("logspace", "%" PRId64 " bytes being used for logs", m_space_used);
   Debug("logspace", "%" PRId64 " bytes left on partition", m_partition_space_left);
diff --git a/proxy/logging/LogConfig.h b/proxy/logging/LogConfig.h
index b0ddbd344a..1bc2fbb8c2 100644
--- a/proxy/logging/LogConfig.h
+++ b/proxy/logging/LogConfig.h
@@ -32,49 +32,39 @@
 #include "LogObject.h"
 #include "RolledLogDeleter.h"
 #include "swoc/MemSpan.h"
-
-/* Instead of enumerating the stats in DynamicStats.h, each module needs
-   to enumerate its stats separately and register them with librecords
-   */
-enum {
-  // Logging Events
-  log_stat_event_log_error_ok_stat,
-  log_stat_event_log_error_skip_stat,
-  log_stat_event_log_error_aggr_stat,
-  log_stat_event_log_error_full_stat,
-  log_stat_event_log_error_fail_stat,
-
-  log_stat_event_log_access_ok_stat,
-  log_stat_event_log_access_skip_stat,
-  log_stat_event_log_access_aggr_stat,
-  log_stat_event_log_access_full_stat,
-  log_stat_event_log_access_fail_stat,
-
-  // Logging Data
-  log_stat_num_sent_to_network_stat,
-  log_stat_num_lost_before_sent_to_network_stat,
-  log_stat_num_received_from_network_stat,
-  log_stat_num_flush_to_disk_stat,
-  log_stat_num_lost_before_flush_to_disk_stat,
-
-  log_stat_bytes_lost_before_preproc_stat,
-  log_stat_bytes_sent_to_network_stat,
-  log_stat_bytes_lost_before_sent_to_network_stat,
-  log_stat_bytes_received_from_network_stat,
-
-  log_stat_bytes_flush_to_disk_stat,
-  log_stat_bytes_lost_before_flush_to_disk_stat,
-  log_stat_bytes_written_to_disk_stat,
-  log_stat_bytes_lost_before_written_to_disk_stat,
-
-  // Logging I/O
-  log_stat_log_files_open_stat,
-  log_stat_log_files_space_used_stat,
-
-  log_stat_count
+#include "api/Metrics.h"
+
+using ts::Metrics;
+
+struct LogsStatsBlock {
+  Metrics::IntType *event_log_error_ok;
+  Metrics::IntType *event_log_error_skip;
+  Metrics::IntType *event_log_error_aggr;
+  Metrics::IntType *event_log_error_full;
+  Metrics::IntType *event_log_error_fail;
+  Metrics::IntType *event_log_access_ok;
+  Metrics::IntType *event_log_access_skip;
+  Metrics::IntType *event_log_access_aggr;
+  Metrics::IntType *event_log_access_full;
+  Metrics::IntType *event_log_access_fail;
+  Metrics::IntType *num_sent_to_network;
+  Metrics::IntType *num_lost_before_sent_to_network;
+  Metrics::IntType *num_received_from_network;
+  Metrics::IntType *num_flush_to_disk;
+  Metrics::IntType *num_lost_before_flush_to_disk;
+  Metrics::IntType *bytes_lost_before_preproc;
+  Metrics::IntType *bytes_sent_to_network;
+  Metrics::IntType *bytes_lost_before_sent_to_network;
+  Metrics::IntType *bytes_received_from_network;
+  Metrics::IntType *bytes_flush_to_disk;
+  Metrics::IntType *bytes_lost_before_flush_to_disk;
+  Metrics::IntType *bytes_written_to_disk;
+  Metrics::IntType *bytes_lost_before_written_to_disk;
+  Metrics::IntType *log_files_open;
+  Metrics::IntType *log_files_space_used;
 };
 
-extern RecRawStatBlock *log_rsb;
+extern LogsStatsBlock log_rsb;
 
 struct dirent;
 
diff --git a/proxy/logging/LogFile.cc b/proxy/logging/LogFile.cc
index 6b708a2a30..6e28dd6ea5 100644
--- a/proxy/logging/LogFile.cc
+++ b/proxy/logging/LogFile.cc
@@ -223,7 +223,7 @@ LogFile::open_file()
     }
   }
 
-  RecIncrRawStat(log_rsb, this_thread()->mutex->thread_holding, log_stat_log_files_open_stat, 1);
+  Metrics::increment(log_rsb.log_files_open);
 
   Debug("log", "exiting LogFile::open_file(), file=%s presumably open", m_name);
   return LOG_FILE_NO_ERROR;
@@ -244,7 +244,7 @@ LogFile::close_file()
         Error("Error closing LogFile %s: %s.", m_name, strerror(errno));
       } else {
         Debug("log-file", "LogFile %s (fd=%d) is closed", m_name, m_fd);
-        RecIncrRawStat(log_rsb, this_thread()->mutex->thread_holding, log_stat_log_files_open_stat, -1);
+        Metrics::decrement(log_rsb.log_files_open);
       }
       m_fd = -1;
     } else if (m_log) {
@@ -252,7 +252,7 @@ LogFile::close_file()
         Error("Error closing LogFile %s: %s.", m_log->get_name(), strerror(errno));
       } else {
         Debug("log-file", "LogFile %s is closed", m_log->get_name());
-        RecIncrRawStat(log_rsb, this_thread()->mutex->thread_holding, log_stat_log_files_open_stat, -1);
+        Metrics::decrement(log_rsb.log_files_open);
       }
     } else {
       Warning("LogFile %s is open but was not closed", m_name);
@@ -454,11 +454,8 @@ LogFile::preproc_and_try_delete(LogBuffer *lb)
     //
     LogFlushData *flush_data = new LogFlushData(this, lb);
 
-    ProxyMutex *mutex = this_thread()->mutex.get();
-
-    RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_num_flush_to_disk_stat, lb->header()->entry_count);
-
-    RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_bytes_flush_to_disk_stat, lb->header()->byte_count);
+    Metrics::increment(log_rsb.num_flush_to_disk, lb->header()->entry_count);
+    Metrics::increment(log_rsb.bytes_flush_to_disk, lb->header()->byte_count);
 
     ink_atomiclist_push(Log::flush_data_list, flush_data);
 
@@ -563,7 +560,6 @@ LogFile::write_ascii_logbuffer3(LogBufferHeader *buffer_header, const char *alt_
         m_name, this);
   ink_assert(buffer_header != nullptr);
 
-  ProxyMutex *mutex = this_thread()->mutex.get();
   LogBufferIterator iter(buffer_header);
   LogEntryHeader *entry_header;
   int fmt_entry_count = 0;
@@ -617,9 +613,8 @@ LogFile::write_ascii_logbuffer3(LogBufferHeader *buffer_header, const char *alt_
       } else {
         Note("Failed to convert LogBuffer to ascii, have dropped (%" PRIu32 ") bytes.", entry_header->entry_len);
 
-        RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_num_lost_before_flush_to_disk_stat, fmt_entry_count);
-
-        RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_bytes_lost_before_flush_to_disk_stat, fmt_buf_bytes);
+        Metrics::increment(log_rsb.num_lost_before_flush_to_disk, fmt_entry_count);
+        Metrics::increment(log_rsb.bytes_lost_before_flush_to_disk, fmt_buf_bytes);
       }
       // if writing to a pipe, fill the buffer with a single
       // record to avoid as much as possible overflowing the
@@ -638,9 +633,8 @@ LogFile::write_ascii_logbuffer3(LogBufferHeader *buffer_header, const char *alt_
     //
     LogFlushData *flush_data = new LogFlushData(this, ascii_buffer, fmt_buf_bytes);
 
-    RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_num_flush_to_disk_stat, fmt_entry_count);
-
-    RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_bytes_flush_to_disk_stat, fmt_buf_bytes);
+    Metrics::increment(log_rsb.num_flush_to_disk, fmt_entry_count);
+    Metrics::increment(log_rsb.bytes_flush_to_disk, fmt_buf_bytes);
 
     ink_atomiclist_push(Log::flush_data_list, flush_data);
 
diff --git a/proxy/logging/LogObject.cc b/proxy/logging/LogObject.cc
index d88d02d50b..70a8dbbc3a 100644
--- a/proxy/logging/LogObject.cc
+++ b/proxy/logging/LogObject.cc
@@ -66,8 +66,7 @@ LogBufferManager::preproc_buffers(LogBufferSink *sink)
     } else if (_num_flush_buffers > FLUSH_ARRAY_SIZE) {
       ink_atomic_increment(&_num_flush_buffers, -1);
       Warning("Dropping log buffer, can't keep up.");
-      RecIncrRawStat(log_rsb, this_thread()->mutex->thread_holding, log_stat_bytes_lost_before_preproc_stat,
-                     b->header()->byte_count);
+      Metrics::increment(log_rsb.bytes_lost_before_preproc, b->header()->byte_count);
       delete b;
     } else {
       new_q.push(b);
@@ -1338,8 +1337,7 @@ LogObjectManager::find_by_format_name(const char *name) const
 int
 LogObjectManager::log(LogAccess *lad)
 {
-  int ret           = Log::SKIP;
-  ProxyMutex *mutex = this_thread()->mutex.get();
+  int ret = Log::SKIP;
 
   for (unsigned i = 0; i < this->_objects.size(); i++) {
     ret |= _objects[i]->log(lad);
@@ -1351,15 +1349,15 @@ LogObjectManager::log(LogAccess *lad)
   // The if-statement should keep step with the priority order.
   //
   if (unlikely(ret & Log::FAIL)) {
-    RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_event_log_access_fail_stat, 1);
+    Metrics::increment(log_rsb.event_log_access_fail);
   } else if (unlikely(ret & Log::FULL)) {
-    RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_event_log_access_full_stat, 1);
+    Metrics::increment(log_rsb.event_log_access_full);
   } else if (likely(ret & Log::LOG_OK)) {
-    RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_event_log_access_ok_stat, 1);
+    Metrics::increment(log_rsb.event_log_access_ok);
   } else if (unlikely(ret & Log::AGGR)) {
-    RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_event_log_access_aggr_stat, 1);
+    Metrics::increment(log_rsb.event_log_access_aggr);
   } else if (likely(ret & Log::SKIP)) {
-    RecIncrRawStat(log_rsb, mutex->thread_holding, log_stat_event_log_access_skip_stat, 1);
+    Metrics::increment(log_rsb.event_log_access_skip);
   } else {
     ink_release_assert(!"Unexpected result");
   }
diff --git a/src/api/InkAPI.cc b/src/api/InkAPI.cc
index a8782ebe6b..59c4ae9504 100644
--- a/src/api/InkAPI.cc
+++ b/src/api/InkAPI.cc
@@ -6561,29 +6561,20 @@ tsapi::c::TSHttpTxnLookingUpTypeGet(TSHttpTxn txnp)
 int
 tsapi::c::TSHttpCurrentClientConnectionsGet()
 {
-  int64_t S;
-
-  HTTP_READ_DYN_SUM(http_current_client_connections_stat, S);
-  return static_cast<int>(S);
+  return Metrics::read(http_rsb.current_client_connections);
 }
 
 int
 tsapi::c::TSHttpCurrentActiveClientConnectionsGet()
 {
-  int64_t S;
-
-  HTTP_READ_DYN_SUM(http_current_active_client_connections_stat, S);
-  return static_cast<int>(S);
+  return Metrics::read(http_rsb.current_active_client_connections);
 }
 
 int
 tsapi::c::TSHttpCurrentIdleClientConnectionsGet()
 {
-  int64_t total  = 0;
-  int64_t active = 0;
-
-  HTTP_READ_DYN_SUM(http_current_client_connections_stat, total);
-  HTTP_READ_DYN_SUM(http_current_active_client_connections_stat, active);
+  int64_t total  = Metrics::read(http_rsb.current_client_connections);
+  int64_t active = Metrics::read(http_rsb.current_active_client_connections);
 
   if (total >= active) {
     return static_cast<int>(total - active);
@@ -6595,19 +6586,13 @@ tsapi::c::TSHttpCurrentIdleClientConnectionsGet()
 int
 tsapi::c::TSHttpCurrentCacheConnectionsGet()
 {
-  int64_t S;
-
-  HTTP_READ_DYN_SUM(http_current_cache_connections_stat, S);
-  return static_cast<int>(S);
+  return Metrics::read(http_rsb.current_cache_connections);
 }
 
 int
 tsapi::c::TSHttpCurrentServerConnectionsGet()
 {
-  int64_t S;
-
-  HTTP_READ_GLOBAL_DYN_SUM(http_current_server_connections_stat, S);
-  return static_cast<int>(S);
+  return Metrics::read(http_rsb.current_server_connections);
 }
 
 /* HTTP alternate selection */
@@ -7007,7 +6992,7 @@ tsapi::c::TSVConnCacheHttpInfoSet(TSVConn connp, TSCacheHttpInfo infop)
   sdk_assert(sdk_sanity_check_iocore_structure(connp) == TS_SUCCESS);
 
   CacheVC *vc = (CacheVC *)connp;
-  if (vc->base_stat == cache_scan_active_stat) {
+  if (static_cast<CacheOpType>(vc->op_type) == CacheOpType::Scan) {
     vc->set_http_info((CacheHTTPInfo *)infop);
   }
 }
@@ -7423,14 +7408,14 @@ void
 tsapi::c::TSStatIntIncrement(int id, TSMgmtInt amount)
 {
   sdk_assert(sdk_sanity_check_stat_id(id) == TS_SUCCESS);
-  global_api_metrics[id].fetch_add(amount);
+  global_api_metrics[id].fetch_add(amount, ts::Metrics::MEMORY_ORDER);
 }
 
 void
 tsapi::c::TSStatIntDecrement(int id, TSMgmtInt amount)
 {
   sdk_assert(sdk_sanity_check_stat_id(id) == TS_SUCCESS);
-  global_api_metrics[id].fetch_sub(amount);
+  global_api_metrics[id].fetch_sub(amount, ts::Metrics::MEMORY_ORDER);
 }
 
 tsapi::c::TSMgmtInt
diff --git a/src/api/Metrics.cc b/src/api/Metrics.cc
index 1d38e04ea2..c9e5c2eb55 100644
--- a/src/api/Metrics.cc
+++ b/src/api/Metrics.cc
@@ -86,7 +86,7 @@ Metrics::lookup(const std::string_view name) const
   return NOT_FOUND;
 }
 
-Metrics::AtomicType *
+Metrics::IntType *
 Metrics::lookup(IdType id, std::string_view *name) const
 {
   auto [blob_ix, offset]       = _splitID(id);
diff --git a/src/records/RecCore.cc b/src/records/RecCore.cc
index d79a37e61e..a18fce2ea2 100644
--- a/src/records/RecCore.cc
+++ b/src/records/RecCore.cc
@@ -36,13 +36,13 @@
 #include "tscpp/util/ts_errata.h"
 #include "api/Metrics.h"
 
+using ts::Metrics;
+
 // This is needed to manage the size of the librecords record. It can't be static, because it needs to be modified
 // and used (read) from several binaries / modules.
-int max_records_entries = REC_MAX_RECORDS;
-
+int max_records_entries   = REC_MAX_RECORDS;
 static bool g_initialized = false;
-
-RecRecord *g_records = nullptr;
+RecRecord *g_records      = nullptr;
 std::unordered_map<std::string, RecRecord *> g_records_ht;
 ink_rwlock g_records_rwlock;
 int g_num_records = 0;
diff --git a/src/records/RecRawStats.cc b/src/records/RecRawStats.cc
index deaf839825..ad16e4caf0 100644
--- a/src/records/RecRawStats.cc
+++ b/src/records/RecRawStats.cc
@@ -24,6 +24,7 @@ Record statistics support
 #include "records/P_RecCore.h"
 #include "records/P_RecProcess.h"
 #include <string_view>
+#include <list>
 
 //-------------------------------------------------------------------------
 // RecAllocateRawStatBlock
@@ -340,15 +341,38 @@ RecRegisterRawStatSyncCb(const char *name, RecRawStatSyncCb sync_cb, RecRawStatB
   return err;
 }
 
+//-------------------------------------------------------------------------
+// Register a new stats sync feature. ToDo: This is piggybacking on the
+// old metrics for now, this should likely move to the Metrics interface
+// later, and let it create a sync thread (or use TASK threads if these
+// callbacks are deemed cheap.)
+//-------------------------------------------------------------------------
+
+static std::list<RecCallbackFunction> _newCbs;
+
+void
+RecRegNewSyncStatSync(RecCallbackFunction callback)
+{
+  _newCbs.push_back(callback);
+}
+
 //-------------------------------------------------------------------------
 // RecExecRawStatSyncCbs
 //-------------------------------------------------------------------------
+
 int
 RecExecRawStatSyncCbs()
 {
   RecRecord *r;
   int i, num_records;
 
+  // Call the new sync callbacks, needed for the new Metrics. ToDo: This should move
+  // once the old sync thread and events are completely removed.
+  for (const auto &callback : _newCbs) {
+    callback();
+  }
+
+  // Now sync all the legacy metrics
   num_records = g_num_records;
   for (i = 0; i < num_records; i++) {
     r = &(g_records[i]);
diff --git a/src/traffic_server/traffic_server.cc b/src/traffic_server/traffic_server.cc
index d80af430d6..7e634870ad 100644
--- a/src/traffic_server/traffic_server.cc
+++ b/src/traffic_server/traffic_server.cc
@@ -1393,34 +1393,26 @@ struct ShowStats : public Continuation {
     if (!(cycle++ % 24)) {
       printf("r:rr w:ww r:rbs w:wbs open polls\n");
     }
-    int64_t sval, cval;
-
-    NET_READ_DYN_SUM(net_calls_to_readfromnet_stat, sval);
-    int64_t d_rb  = sval - last_rb;
+    int64_t d_rb  = Metrics::read(net_rsb.calls_to_readfromnet) - last_rb;
     last_rb      += d_rb;
 
-    NET_READ_DYN_SUM(net_calls_to_writetonet_stat, sval);
-    int64_t d_wb  = sval - last_wb;
+    int64_t d_wb  = Metrics::read(net_rsb.calls_to_writetonet) - last_wb;
     last_wb      += d_wb;
 
-    NET_READ_DYN_STAT(net_read_bytes_stat, sval, cval);
-    int64_t d_nrb  = sval - last_nrb;
+    int64_t d_nrb  = Metrics::read(net_rsb.read_bytes) - last_nrb;
     last_nrb      += d_nrb;
-    int64_t d_nr   = cval - last_nr;
+    int64_t d_nr   = Metrics::read(net_rsb.read_bytes_count) - last_nr;
     last_nr       += d_nr;
 
-    NET_READ_DYN_STAT(net_write_bytes_stat, sval, cval);
-    int64_t d_nwb  = sval - last_nwb;
+    int64_t d_nwb  = Metrics::read(net_rsb.write_bytes) - last_nwb;
     last_nwb      += d_nwb;
-    int64_t d_nw   = cval - last_nw;
+    int64_t d_nw   = Metrics::read(net_rsb.write_bytes_count) - last_nw;
     last_nw       += d_nw;
 
-    NET_READ_GLOBAL_DYN_SUM(net_connections_currently_open_stat, sval);
-    int64_t d_o = sval;
+    int64_t d_o = Metrics::read(net_rsb.connections_currently_open);
+    int64_t d_p = Metrics::read(net_rsb.handler_run) - last_p;
 
-    NET_READ_DYN_STAT(net_handler_run_stat, sval, cval);
-    int64_t d_p  = cval - last_p;
-    last_p      += d_p;
+    last_p += d_p;
     printf("%" PRId64 ":%" PRId64 ":%" PRId64 ":%" PRId64 " %" PRId64 ":%" PRId64 " %" PRId64 " %" PRId64 "\n", d_rb, d_wb, d_nrb,
            d_nr, d_nwb, d_nw, d_o, d_p);
 #ifdef ENABLE_TIME_TRACE
diff --git a/src/traffic_top/stats.h b/src/traffic_top/stats.h
index 037142b60c..0cb12e411f 100644
--- a/src/traffic_top/stats.h
+++ b/src/traffic_top/stats.h
@@ -261,14 +261,6 @@ public:
     lookup_table.insert(make_pair("505", LookupItem("505", "proxy.process.http.505_responses", 5)));
     lookup_table.insert(make_pair("5xx", LookupItem("5xx", "proxy.process.http.5xx_responses", 5)));
 
-    lookup_table.insert(make_pair("s_100", LookupItem("100 B", "proxy.process.http.response_document_size_100", 5)));
-    lookup_table.insert(make_pair("s_1k", LookupItem("1 KB", "proxy.process.http.response_document_size_1K", 5)));
-    lookup_table.insert(make_pair("s_3k", LookupItem("3 KB", "proxy.process.http.response_document_size_3K", 5)));
-    lookup_table.insert(make_pair("s_5k", LookupItem("5 KB", "proxy.process.http.response_document_size_5K", 5)));
-    lookup_table.insert(make_pair("s_10k", LookupItem("10 KB", "proxy.process.http.response_document_size_10K", 5)));
-    lookup_table.insert(make_pair("s_1m", LookupItem("1 MB", "proxy.process.http.response_document_size_1M", 5)));
-    lookup_table.insert(make_pair("s_>1m", LookupItem("> 1 MB", "proxy.process.http.response_document_size_inf", 5)));
-
     // sum together
     lookup_table.insert(make_pair("ram_hit_miss", LookupItem("Ram Hit+Miss", "ram_hit", "ram_miss", 6)));
     lookup_table.insert(make_pair("client_net", LookupItem("Net (bits)", "client_head", "client_body", 7)));
diff --git a/src/traffic_top/traffic_top.cc b/src/traffic_top/traffic_top.cc
index 4bddbc393c..cbf2c338cf 100644
--- a/src/traffic_top/traffic_top.cc
+++ b/src/traffic_top/traffic_top.cc
@@ -341,13 +341,6 @@ main_stats_page(Stats &stats)
   response2.push_back("304");
   response2.push_back("404");
   response2.push_back("502");
-  response2.push_back("s_100");
-  response2.push_back("s_1k");
-  response2.push_back("s_3k");
-  response2.push_back("s_5k");
-  response2.push_back("s_10k");
-  response2.push_back("s_1m");
-  response2.push_back("s_>1m");
   makeTable(62, 1, response2, stats);
 
   list<string> client1;