You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by jp...@apache.org on 2016/01/22 04:23:51 UTC

[03/10] trafficserver git commit: TS-4099: add Lua bindings for custom metrics

http://git-wip-us.apache.org/repos/asf/trafficserver/blob/1a590016/proxy/config/metrics.config.default
----------------------------------------------------------------------
diff --git a/proxy/config/metrics.config.default b/proxy/config/metrics.config.default
new file mode 100644
index 0000000..0eec83a
--- /dev/null
+++ b/proxy/config/metrics.config.default
@@ -0,0 +1,1802 @@
+-- Dynamic metrics.
+-- This file is processed by Traffic Manager to evaluate dynamic metric definitions.
+
+-- XML Transliteration Notes:
+--
+-- The 'minimum' and 'maximum' XML elements effectively do nothing.
+-- These are called to set the initial value during XML parsing, so
+-- the net effect is to set the value to 'minimum. Since we always
+-- zero metrice on creation there's nothing to do there.
+--
+-- In the cluster-based statistics, the aggregation is further
+-- divided into two types: sum and re-calculate. Sum refers calculating
+-- the proxy.cluster.* variable by simply summing all required
+-- proxy.node.* variables from nodes in the cluster. Re-calculate
+-- refers to summing all proxy.nodes.* variables that are used in the
+-- process of calculation before performing the calculation.  An analogy
+-- would be, summing all open connection in the cluster vs. the average
+-- hit rate in the cluster.
+--
+-- The "operation" attribute ends up in StatExprToken::m_sum_var. For "sum"
+-- and default, m_sum_var is true. For "sum" operations, the cluster metric
+-- don't evaluate expression, then just sum the associated node metric across
+-- the cluster.
+
+-- Handling periodic updates.
+--
+-- Some metrics calculate periodic updates using the interval_of()
+-- and delta_of() APIs. These rely on the fact that the metric name
+-- is passed as the first argument to each evaluation function (so
+-- we can use it as a unique table key), and that if the evaluation
+-- function returns nil, no value is stored (ie. the metric simply
+-- retains its previous value. We combine these characteristics to
+-- run the evaluators on every update cycle but to only store the
+-- value or calculate a delta when the desired interval has passed.
+
+-- Lua API.
+--
+-- VALUE metrics.cluster.sum(METRIC)
+--    Sum the named METRIC across the cluster. METRIC must be a string naming a node
+--    metric since only node metrics are shared across the cluster.
+--
+-- metrics.now.msec
+--    Wall-clock time in milliseconds.
+--
+-- metrics.update.pass
+--    Count of metric updates passes performed in this Lua state
+--
+-- integer(NAME, FUNC), counter(NAME, FUNC), float(NAME, FUNC)
+--    These global functions register a metric of the corresponding name. Each
+--    registered metric will be periodically recalculated by evaluating the 
+--    given function.
+--
+--    The scope of a metric is derived from the name. 'proxy.cluster.*' metrics
+--    are placed in CLUSTER scope and 'proxy.node.*' metrics are placed in NODE
+--    scope.
+--
+--    The name of the metric is passed to evaluation function on each invocation.
+--    This can be used to greate a unique key for persisting data in global tables.
+
+-- Multiplier to convert seconds to milliseconds
+sec_to_msec = 1000
+
+-- Return the sum of the given metric across all cluster nodes. metrics.cluster.sum()
+-- will memoize its result so that summing the same value multiple times in the same
+-- metrics pass is not too expensive. The metric name should always be a node metric.
+function cluster(name)
+  return metrics.cluster.sum(name)
+end
+
+-- Convert bytes to megabits.
+function mbits(bytes)
+  return bytes * 8 / 1000000
+end
+
+-- Convert bytes to mebibytes.
+function mbytes(bytes)
+  return bytes / (1024 * 1024)
+end
+
+-- Return the current time in milliseconds.
+function now()
+  return metrics.now.msec
+end
+
+-- interval_of(msec, key, fn)
+--
+-- Call a function after an interval (in milliseconds) elapses.
+-- The function is called with a single argument of the elapsed
+-- time in milliseconds.
+--
+-- key: unique persistence key
+-- fn: function to call after the interval elapses
+interval_of = (function()
+
+  function __interval_of(msec, fn)
+    local previous = now()
+    return function()
+      local current = now()
+      local elapsed = current - previous
+      if elapsed > msec then
+        previous = current
+        return fn(elapsed)
+      else
+        return nil
+      end
+    end
+  end
+
+  local intervals = {}
+
+  return function(msec, scope, fn)
+    if intervals[scope] == nil then
+      intervals[scope] = __interval_of(msec, fn)
+    end
+    return intervals[scope]()
+  end
+end)()
+
+function interval_of_10s(key, fn)
+  return interval_of(10 * 1000, key, fn)
+end
+
+-- Register a function that returns the delta in every call.
+delta_of = (function ()
+
+  function __delta_of(fn)
+    local previous = fn()
+    return function()
+      local current = fn()
+      local difference = current - previous
+      previous = current
+      return difference
+    end
+  end
+
+  local deltas = {}
+
+  return function(key, fn)
+    if deltas[key] == nil then
+      deltas[key] = __delta_of(fn)
+    end
+
+    return deltas[key]()
+  end
+end)()
+
+-- Wrap delta_of() over an interval to find the rate of change
+-- for a value over the given interval in milliseconds.
+--
+-- msec: interval in milliseconds
+-- key: unique persistence key
+-- fn: function that returns the value
+function rate_of(msec, key, fn)
+  return interval_of(msec, key,
+    function(elapsed)
+      return delta_of(key, fn) * 1000 / elapsed
+    end
+  )
+end
+
+-- Find the per-second rate of change for a value over 10sec.
+function rate_of_10s(key, fn)
+  return rate_of(10 * 1000, key, fn)
+end
+
+-- Return the change over an interval. Most of the metrics that use
+-- this don't really make sense. It's not an average in the way that
+-- people would reasonably expect it to be.
+function interval_delta_of_10s(key, fn)
+  return interval_of_10s(key, function()
+    return delta_of(key, fn)
+  end)
+end
+
+counter 'proxy.node.http.user_agents_total_documents_served' [[
+  return proxy.process.http.incoming_requests
+]]
+
+counter 'proxy.cluster.http.user_agents_total_documents_served' [[
+  return cluster('proxy.node.http.user_agents_total_documents_served')
+]]
+
+counter 'proxy.node.http.user_agents_total_transactions_count' [[
+  return proxy.process.http.incoming_requests
+]]
+
+counter 'proxy.cluster.http.user_agents_total_transactions_count' [[
+  return cluster('proxy.node.http.user_agents_total_transactions_count')
+]]
+
+counter 'proxy.node.http.origin_server_total_transactions_count' [[
+  return proxy.process.http.outgoing_requests
+]]
+
+counter 'proxy.cluster.http.origin_server_total_transactions_count' [[
+  return cluster('proxy.node.http.origin_server_total_transactions_count')
+]]
+
+counter 'proxy.node.http.cache_current_connections_count' [[
+  return proxy.process.http.current_cache_connections
+]]
+
+counter 'proxy.cluster.http.cache_current_connections_count' [[
+  return cluster('proxy.node.http.cache_current_connections_count')
+]]
+
+counter 'proxy.node.http.user_agent_current_connections_count' [[
+  return proxy.process.http.current_client_connections
+]]
+
+counter 'proxy.cluster.http.user_agent_current_connections_count' [[
+  return cluster('proxy.node.http.user_agent_current_connections_count')
+]]
+
+counter 'proxy.node.http.origin_server_current_connections_count' [[
+  return proxy.process.http.current_server_connections
+]]
+
+counter 'proxy.cluster.http.origin_server_current_connections_count' [[
+  return cluster('proxy.node.http.origin_server_current_connections_count')
+]]
+
+--
+-- Cache metrics.
+--
+
+integer 'proxy.node.cache.bytes_total' [[
+  return proxy.process.cache.bytes_total
+]]
+
+--
+-- DNS metrics.
+--
+
+counter 'proxy.node.dns.total_dns_lookups' [[
+  return proxy.process.dns.total_dns_lookups
+]]
+
+counter 'proxy.cluster.dns.total_dns_lookups' [[
+  return cluster('proxy.node.dns.total_dns_lookups')
+]]
+
+--
+-- HostDB metrics.
+--
+
+counter 'proxy.node.hostdb.total_lookups' [[
+  return proxy.process.hostdb.total_lookups
+]]
+
+counter 'proxy.node.hostdb.total_hits' [[
+  return proxy.process.hostdb.total_hits
+]]
+
+--
+-- Cluster metrics.
+--
+
+integer 'proxy.node.cluster.nodes' [[
+  return proxy.process.cluster.nodes
+]]
+
+--
+-- HTTP Cache.
+--
+
+counter 'proxy.node.http.cache_lookups' [[
+  return proxy.process.http.cache_lookups
+]]
+
+counter 'proxy.node.http.cache_writes' [[
+  return proxy.process.http.cache_writes
+]]
+
+counter 'proxy.node.http.cache_updates' [[
+  return proxy.process.http.cache_updates
+]]
+
+counter 'proxy.node.http.cache_deletes' [[
+  return proxy.process.http.cache_deletes
+]]
+
+counter 'proxy.node.http.cache_hit_fresh' [[
+  return proxy.process.http.cache_hit_fresh
+]]
+
+counter 'proxy.node.http.cache_hit_mem_fresh' [[
+  return proxy.process.http.cache_hit_mem_fresh
+]]
+
+counter 'proxy.node.http.cache_hit_revalidated' [[
+  return proxy.process.http.cache_hit_revalidated
+]]
+
+counter 'proxy.node.http.cache_hit_ims' [[
+  return proxy.process.http.cache_hit_ims
+]]
+
+counter 'proxy.node.http.cache_hit_stale_served' [[
+  return proxy.process.http.cache_hit_stale_served
+]]
+
+counter 'proxy.node.http.cache_miss_cold' [[
+  return proxy.process.http.cache_miss_cold
+]]
+
+counter 'proxy.node.http.cache_miss_changed' [[
+  return proxy.process.http.cache_miss_changed
+]]
+
+counter 'proxy.node.http.cache_miss_client_no_cache' [[
+  return proxy.process.http.cache_miss_client_no_cache
+]]
+
+counter 'proxy.node.http.cache_miss_client_not_cacheable' [[
+  return proxy.process.http.cache_miss_client_not_cacheable
+]]
+
+counter 'proxy.node.http.cache_miss_ims' [[
+  return proxy.process.http.cache_miss_ims
+]]
+
+counter 'proxy.node.http.cache_read_error' [[
+  return proxy.process.http.cache_read_error
+]]
+
+counter 'proxy.node.http.cache_write_errors' [[
+  return proxy.process.http.cache_write_errors
+]]
+
+counter 'proxy.node.http.cache_read_errors' [[
+  return proxy.process.http.cache_read_errors
+]]
+
+-- StatAggregation::Ag_XactsPerSecond() -->
+integer 'proxy.node.http.user_agent_xacts_per_second' [[
+  local self = ...
+
+  return rate_of_10s(self,
+    function() return proxy.process.http.incoming_requests end
+  )
+]]
+
+integer'proxy.cluster.http.user_agent_xacts_per_second' [[
+  return cluster('proxy.node.http.user_agent_xacts_per_second')
+]]
+
+integer 'proxy.node.user_agent_xacts_per_second' [[
+  return proxy.node.http.user_agent_xacts_per_second
+]]
+
+integer 'proxy.cluster.user_agent_xacts_per_second' [[
+  return cluster('proxy.cluster.http.user_agent_xacts_per_second')
+]]
+
+counter 'proxy.node.user_agents_total_documents_served' [[
+  return proxy.node.http.user_agents_total_documents_served
+]]
+
+-- StatAggregation::Ag_DnsLookupsPerSecond()
+integer 'proxy.node.dns.lookups_per_second' [[
+  local self = ...
+
+  return rate_of_10s(self,
+    function() return proxy.process.dns.total_dns_lookups end
+  )
+]]
+
+integer 'proxy.cluster.dns.lookups_per_second' [[
+  return cluster('proxy.node.dns.lookups_per_second')
+]]
+
+-- StatAggregation::Ag_HostdbHitRate() -->
+integer 'proxy.node.hostdb.total_lookups_avg_10s' [[
+  local self = ...
+
+  return interval_delta_of_10s(self, function()
+    return proxy.process.hostdb.total_lookups
+  end)
+]]
+
+integer 'proxy.cluster.hostdb.total_lookups_avg_10s' [[
+  return cluster('proxy.node.hostdb.total_lookups_avg_10s')
+]]
+
+integer 'proxy.node.hostdb.total_hits_avg_10s' [[
+  local self = ...
+
+  return interval_delta_of_10s(self, function()
+    return proxy.process.hostdb.total_hits
+  end)
+]]
+
+integer 'proxy.cluster.hostdb.total_hits_avg_10s' [[
+  return cluster('proxy.node.hostdb.total_hits_avg_10s')
+]]
+
+float 'proxy.node.hostdb.hit_ratio_avg_10s' [[
+  local self = ...
+
+  return interval_of_10s(self, function()
+    return
+      proxy.node.hostdb.total_hits_avg_10s    /
+      proxy.node.hostdb.total_lookups_avg_10s
+  end)
+]]
+
+float 'proxy.cluster.hostdb.hit_ratio_avg_10s' [[
+  local self = ...
+
+  return interval_of_10s(self, function()
+    return
+      cluster('proxy.node.hostdb.total_hits_avg_10s')    /
+      cluster('proxy.node.hostdb.total_lookups_avg_10s')
+  end)
+]]
+
+float 'proxy.node.hostdb.hit_ratio' [[
+  return proxy.process.hostdb.total_hits / proxy.process.hostdb.total_lookups
+]]
+
+counter 'proxy.node.http.user_agent_total_request_bytes' [[
+  return proxy.process.http.user_agent_request_document_total_size +
+    proxy.process.http.user_agent_request_header_total_size
+]]
+
+counter 'proxy.cluster.http.user_agent_total_request_bytes' [[
+  return cluster('proxy.node.http.user_agent_total_request_bytes')
+]]
+
+counter 'proxy.node.http.user_agent_total_response_bytes' [[
+  return proxy.process.http.user_agent_response_document_total_size +
+    proxy.process.http.user_agent_response_header_total_size
+]]
+
+counter 'proxy.cluster.http.user_agent_total_response_bytes' [[
+  return cluster('proxy.node.http.user_agent_total_response_bytes')
+]]
+
+counter 'proxy.node.http.origin_server_total_request_bytes' [[
+  return proxy.process.http.origin_server_request_document_total_size +
+    proxy.process.http.origin_server_request_header_total_size
+]]
+
+counter 'proxy.cluster.http.origin_server_total_request_bytes' [[
+  return cluster('proxy.node.http.origin_server_total_request_bytes')
+]]
+
+counter 'proxy.node.http.origin_server_total_response_bytes' [[
+  return proxy.process.http.origin_server_response_document_total_size +
+    proxy.process.http.origin_server_response_header_total_size
+]]
+
+counter 'proxy.cluster.http.origin_server_total_response_bytes' [[
+  return cluster('proxy.node.http.origin_server_total_response_bytes')
+]]
+
+-- Add up the downstream (client <-> proxy) traffic volume.
+counter 'proxy.node.user_agent_total_bytes' [[
+  return proxy.node.http.user_agent_total_request_bytes +
+    proxy.node.http.user_agent_total_response_bytes
+]]
+
+-- Add up the upstream (client <-> proxy) traffic volume.
+counter 'proxy.node.origin_server_total_bytes' [[
+  return proxy.node.http.origin_server_total_request_bytes +
+    proxy.node.http.origin_server_total_response_bytes +
+    proxy.node.http.parent_proxy_total_request_bytes +
+    proxy.node.http.parent_proxy_total_response_bytes
+]]
+
+float 'proxy.node.bandwidth_hit_ratio' [[
+  return (proxy.node.user_agent_total_bytes - proxy.node.origin_server_total_bytes)
+      / proxy.node.user_agent_total_bytes
+]]
+
+float 'proxy.cluster.bandwidth_hit_ratio' [[
+  return (cluster('proxy.node.user_agent_total_bytes') - cluster('proxy.node.origin_server_total_bytes'))
+      / cluster('proxy.node.user_agent_total_bytes')
+]]
+
+float 'proxy.node.user_agent_total_bytes_avg_10s' [[
+  local self = ...
+
+  return interval_delta_of_10s(self, function()
+    return proxy.node.user_agent_total_bytes
+  end)
+]]
+
+float 'proxy.cluster.user_agent_total_bytes_avg_10s' [[
+  return cluster('proxy.node.user_agent_total_bytes_avg_10s')
+]]
+
+float 'proxy.node.origin_server_total_bytes_avg_10s' [[
+  local self = ...
+
+  return interval_delta_of_10s(self, function()
+    return proxy.node.origin_server_total_bytes
+  end)
+]]
+
+float 'proxy.cluster.origin_server_total_bytes_avg_10s' [[
+  return cluster('proxy.node.origin_server_total_bytes_avg_10s')
+]]
+
+float 'proxy.node.bandwidth_hit_ratio_avg_10s' [[
+  local self = ...
+
+  return interval_of_10s(self, function()
+    return (
+      proxy.node.user_agent_total_bytes_avg_10s -
+      proxy.node.origin_server_total_bytes_avg_10s
+    ) / proxy.node.user_agent_total_bytes_avg_10s
+  end)
+]]
+
+float 'proxy.cluster.bandwidth_hit_ratio_avg_10s' [[
+  return (
+    cluster('proxy.node.user_agent_total_bytes_avg_10s') -
+    cluster('proxy.node.origin_server_total_bytes_avg_10s')
+  ) / cluster('proxy.node.user_agent_total_bytes_avg_10s')
+]]
+
+integer 'proxy.node.bandwidth_hit_ratio_avg_10s_int_pct' [[
+  return proxy.node.bandwidth_hit_ratio_avg_10s * 100
+]]
+
+-- StatAggregation::Ag_Throughput()
+integer 'proxy.node.http.throughput' [[
+  local self = ...
+
+  return rate_of_10s(self,
+    function() return proxy.node.http.user_agent_total_response_bytes end
+  )
+]]
+
+integer 'proxy.cluster.http.throughput' [[
+  return cluster('proxy.cluster.http.throughput')
+]]
+
+float 'proxy.node.client_throughput_out' [[
+  return mbits(proxy.node.http.throughput)
+]]
+
+float 'proxy.cluster.client_throughput_out' [[
+  return cluster('proxy.node.client_throughput_out')
+]]
+
+-- StatAggregation::Ag_cacheHits()
+float 'proxy.node.http.cache_hit_fresh_avg_10s' [[
+  local self = ...
+
+  return interval_delta_of_10s(self, function()
+    return proxy.process.http.cache_hit_fresh
+  end)
+]]
+
+float 'proxy.node.http.cache_hit_mem_fresh_avg_10s' [[
+  local self = ...
+
+  return interval_delta_of_10s(self, function()
+    return proxy.process.http.cache_hit_mem_fresh
+  end)
+]]
+
+float 'proxy.node.http.cache_hit_revalidated_avg_10s' [[
+  local self = ...
+
+  return interval_delta_of_10s(self, function()
+    return proxy.process.http.cache_hit_revalidated
+  end)
+]]
+
+float 'proxy.node.http.cache_hit_ims_avg_10s' [[
+  local self = ...
+
+  return interval_delta_of_10s(self, function()
+    return proxy.process.http.cache_hit_ims
+  end)
+]]
+
+float 'proxy.node.http.cache_hit_stale_served_avg_10s' [[
+  local self = ...
+
+  return interval_delta_of_10s(self, function()
+    return proxy.process.http.cache_hit_stale_served
+  end)
+]]
+
+float 'proxy.node.http.cache_miss_cold_avg_10s' [[
+  local self = ...
+
+  return interval_delta_of_10s(self, function()
+    return proxy.process.http.cache_miss_cold
+  end)
+]]
+
+float 'proxy.node.http.cache_miss_changed_avg_10s' [[
+  local self = ...
+
+  return interval_delta_of_10s(self, function()
+    return proxy.process.http.cache_miss_changed
+  end)
+]]
+
+float 'proxy.node.http.cache_miss_client_no_cache_avg_10s' [[
+  local self = ...
+
+  return interval_delta_of_10s(self, function()
+    return proxy.process.http.cache_miss_client_no_cache
+  end)
+]]
+
+float 'proxy.node.http.cache_miss_ims_avg_10s' [[
+  local self = ...
+
+  return interval_delta_of_10s(self, function()
+    return proxy.process.http.cache_miss_ims
+  end)
+]]
+
+float 'proxy.node.http.cache_read_error_avg_10s' [[
+  local self = ...
+
+  return interval_delta_of_10s(self, function()
+    return proxy.process.http.cache_read_error
+  end)
+]]
+
+float 'proxy.node.cache_total_hits_avg_10s' [[
+  return
+    proxy.node.http.cache_hit_fresh_avg_10s        +
+    proxy.node.http.cache_hit_revalidated_avg_10s  +
+    proxy.node.http.cache_hit_ims_avg_10s          +
+    proxy.node.http.cache_hit_stale_served_avg_10s
+]]
+
+float 'proxy.cluster.cache_total_hits_avg_10s' [[
+  return cluster('proxy.node.cache_total_hits_avg_10s')
+]]
+
+float 'proxy.node.cache_total_hits_mem_avg_10s' [[
+  return proxy.node.http.cache_hit_mem_fresh_avg_10s
+]]
+
+float 'proxy.cluster.cache_total_hits_mem_avg_10s' [[
+  return cluster('proxy.node.cache_total_hits_mem_avg_10s')
+]]
+
+float 'proxy.node.cache_total_misses_avg_10s' [[
+  return
+    proxy.node.http.cache_miss_cold_avg_10s            +
+    proxy.node.http.cache_miss_changed_avg_10s         +
+    proxy.node.http.cache_miss_client_no_cache_avg_10s +
+    proxy.node.http.cache_miss_ims_avg_10s             +
+    proxy.node.http.cache_read_error_avg_10s
+]]
+
+float 'proxy.cluster.cache_total_misses_avg_10s' [[
+  return cluster('proxy.node.cache_total_misses_avg_10s')
+]]
+
+float 'proxy.node.cache_hit_ratio_avg_10s' [[
+  return
+    proxy.node.cache_total_hits_avg_10s   /
+    (
+    proxy.node.cache_total_hits_avg_10s   +
+    proxy.node.cache_total_misses_avg_10s
+    )
+]]
+
+float 'proxy.cluster.cache_hit_ratio_avg_10s' [[
+  return
+    cluster('proxy.node.cache_total_hits_avg_10s')   /
+    (
+    cluster('proxy.node.cache_total_hits_avg_10s')   +
+    cluster('proxy.node.cache_total_misses_avg_10s')
+    )
+]]
+
+float 'proxy.node.cache_hit_mem_ratio_avg_10s' [[
+  return
+    proxy.node.cache_total_hits_mem_avg_10s   /
+    (
+    proxy.node.cache_total_hits_avg_10s   +
+    proxy.node.cache_total_misses_avg_10s
+    )
+]]
+
+float 'proxy.cluster.cache_hit_mem_ratio_avg_10s' [[
+  return
+    cluster('proxy.node.cache_total_hits_mem_avg_10s')   /
+    (
+    cluster('proxy.node.cache_total_hits_avg_10s')   +
+    cluster('proxy.node.cache_total_misses_avg_10s')
+    )
+]]
+
+integer 'proxy.node.cache_hit_ratio_avg_10s_int_pct' [[
+  return proxy.node.cache_hit_ratio_avg_10s * 100
+]]
+
+integer 'proxy.node.cache_hit_mem_ratio_avg_10s_int_pct' [[
+  return proxy.node.cache_hit_mem_ratio_avg_10s * 100
+]]
+
+counter 'proxy.node.cache_total_hits' [[
+  return proxy.process.http.cache_hit_fresh +
+    proxy.process.http.cache_hit_revalidated +
+    proxy.process.http.cache_hit_ims +
+    proxy.process.http.cache_hit_stale_served
+]]
+
+counter 'proxy.cluster.cache_total_hits' [[
+  return cluster('proxy.node.cache_total_hits')
+]]
+
+counter 'proxy.node.cache_total_hits_mem' [[
+  return proxy.process.http.cache_hit_mem_fresh
+]]
+
+counter 'proxy.cluster.cache_total_hits_mem' [[
+  return cluster('proxy.node.cache_total_hits_mem')
+]]
+
+counter 'proxy.node.cache_total_misses' [[
+  return
+    proxy.process.http.cache_miss_cold            +
+    proxy.process.http.cache_miss_changed         +
+    proxy.process.http.cache_miss_client_no_cache +
+    proxy.process.http.cache_miss_ims             +
+    proxy.process.http.cache_read_error
+]]
+
+counter 'proxy.cluster.cache_total_misses' [[
+  return
+    cluster('proxy.node.http.cache_miss_cold')            +
+    cluster('proxy.node.http.cache_miss_changed')         +
+    cluster('proxy.node.http.cache_miss_client_no_cache') +
+    cluster('proxy.node.http.cache_miss_ims')             +
+    cluster('proxy.node.http.cache_read_error')
+]]
+
+float 'proxy.node.cache_hit_ratio' [[
+  return
+    proxy.node.cache_total_hits   /
+    (
+      proxy.node.cache_total_hits   +
+      proxy.node.cache_total_misses
+    )
+]]
+
+float 'proxy.cluster.cache_hit_ratio' [[
+  return
+    cluster('proxy.node.cache_total_hits')   /
+    (
+      cluster('proxy.node.cache_total_hits')   +
+      cluster('proxy.node.cache_total_misses')
+    )
+]]
+
+float 'proxy.node.cache_hit_mem_ratio' [[
+  return
+    proxy.node.cache_total_hits_mem   /
+    (
+    proxy.node.cache_total_hits   +
+    proxy.node.cache_total_misses
+    )
+]]
+
+float 'proxy.cluster.cache_hit_mem_ratio' [[
+  return
+    cluster('proxy.node.cache_total_hits_mem')   /
+    (
+    cluster('proxy.node.cache_total_hits')   +
+    cluster('proxy.node.cache_total_misses')
+    )
+]]
+
+-- StatAggregation::Ag_cachePercent().
+integer 'proxy.node.cache.bytes_free' [[
+  return
+    proxy.process.cache.bytes_total -
+    proxy.process.cache.bytes_used
+]]
+
+float 'proxy.node.cache.percent_free' [[
+  return
+    proxy.node.cache.bytes_free /
+    proxy.process.cache.bytes_total
+]]
+
+float 'proxy.cluster.cache.percent_free' [[
+  return
+    cluster('proxy.node.cache.bytes_free') /
+    cluster('proxy.node.cache.bytes_total')
+]]
+
+-- StatAggregation::Ag_TransactionPercentsAndMeanTimes()
+
+integer 'proxy.node.http.transaction_counts_avg_10s.hit_fresh' [[
+  return interval_delta_of_10s(..., function()
+    return proxy.process.http.transaction_counts.hit_fresh
+  end)
+]]
+
+integer 'proxy.node.http.transaction_counts_avg_10s.hit_revalidated' [[
+  return interval_delta_of_10s(..., function()
+    return proxy.process.http.transaction_counts.hit_revalidated
+  end)
+]]
+
+integer 'proxy.node.http.transaction_counts_avg_10s.miss_cold' [[
+  return interval_delta_of_10s(..., function()
+    return proxy.process.http.transaction_counts.miss_cold
+  end)
+]]
+
+integer 'proxy.node.http.transaction_counts_avg_10s.miss_changed' [[
+  return interval_delta_of_10s(..., function()
+    return proxy.process.http.transaction_counts.miss_changed
+  end)
+]]
+
+integer 'proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache' [[
+  return interval_delta_of_10s(..., function()
+    return proxy.process.http.transaction_counts.miss_client_no_cache
+  end)
+]]
+
+integer 'proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable' [[
+  return interval_delta_of_10s(..., function()
+    return proxy.process.http.transaction_counts.miss_not_cacheable
+  end)
+]]
+
+integer 'proxy.node.http.transaction_counts_avg_10s.errors.connect_failed' [[
+  return interval_delta_of_10s(..., function()
+    return proxy.process.http.transaction_counts.errors.connect_failed
+  end)
+]]
+
+integer 'proxy.node.http.transaction_counts_avg_10s.errors.aborts' [[
+  return interval_delta_of_10s(..., function()
+    return proxy.process.http.transaction_counts.errors.aborts
+  end)
+]]
+
+integer 'proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts' [[
+  return interval_delta_of_10s(..., function()
+    return proxy.process.http.transaction_counts.errors.possible_aborts
+  end)
+]]
+
+integer 'proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups' [[
+  return interval_delta_of_10s(..., function()
+    return proxy.process.http.transaction_counts.errors.pre_accept_hangups
+  end)
+]]
+
+integer 'proxy.node.http.transaction_counts_avg_10s.errors.early_hangups' [[
+  return interval_delta_of_10s(..., function()
+    return proxy.process.http.transaction_counts.errors.early_hangups
+  end)
+]]
+
+integer 'proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups' [[
+  return interval_delta_of_10s(..., function()
+    return proxy.process.http.transaction_counts.errors.empty_hangups
+  end)
+]]
+
+integer 'proxy.node.http.transaction_counts_avg_10s.errors.errors' [[
+  return interval_delta_of_10s(..., function()
+    return proxy.process.http.transaction_counts.errors.errors
+  end)
+]]
+
+-- StatAggregation.cc::frac_names()
+float 'proxy.node.http.transaction_frac_avg_10s.hit_fresh' [[
+  return interval_of_10s(..., function()
+    return
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+  end)
+]]
+
+float 'proxy.node.http.transaction_frac_avg_10s.hit_revalidated' [[
+  return interval_of_10s(..., function()
+    return
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+  end)
+]]
+
+float 'proxy.node.http.transaction_frac_avg_10s.miss_cold' [[
+  return interval_of_10s(..., function()
+    return
+      proxy.node.http.transaction_counts_avg_10s.miss_cold /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+  end)
+]]
+
+float 'proxy.node.http.transaction_frac_avg_10s.miss_changed' [[
+  return interval_of_10s(..., function()
+    proxy.node.http.transaction_counts_avg_10s.miss_changed /
+    (
+    proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+    proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+    proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+    proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+    proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+    proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+    proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+    proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+    proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+    proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+    proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+    proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+    proxy.node.http.transaction_counts_avg_10s.errors.other
+    )
+  end)
+]]
+
+float 'proxy.node.http.transaction_frac_avg_10s.miss_client_no_cache' [[
+  return interval_of_10s(..., function()
+    return
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+  end)
+]]
+
+float 'proxy.node.http.transaction_frac_avg_10s.miss_not_cacheable' [[
+  return interval_of_10s(..., function()
+    return
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+  end)
+]]
+
+float 'proxy.node.http.transaction_frac_avg_10s.errors.connect_failed' [[
+  return interval_of_10s(..., function()
+    return
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+float 'proxy.node.http.transaction_frac_avg_10s.errors.aborts' [[
+  return interval_of_10s(..., function()
+    return
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+float 'proxy.node.http.transaction_frac_avg_10s.errors.possible_aborts' [[
+  return interval_of_10s(..., function()
+    return
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+float 'proxy.node.http.transaction_frac_avg_10s.errors.pre_accept_hangups' [[
+  return interval_of_10s(..., function()
+    return
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+float 'proxy.node.http.transaction_frac_avg_10s.errors.early_hangups' [[
+  return interval_of_10s(..., function()
+    return
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+float 'proxy.node.http.transaction_frac_avg_10s.errors.empty_hangups' [[
+  return interval_of_10s(..., function()
+    return
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+float 'proxy.node.http.transaction_frac_avg_10s.errors.other' [[
+  return interval_of_10s(..., function()
+    return
+      proxy.node.http.transaction_counts_avg_10s.errors.other /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+integer 'proxy.node.http.transaction_frac_avg_10s.hit_fresh_int_pct' [[
+  return proxy.node.http.transaction_frac_avg_10s.hit_fresh * 100
+]]
+
+integer 'proxy.node.http.transaction_frac_avg_10s.miss_cold_int_pct' [[
+  return proxy.node.http.transaction_frac_avg_10s.miss_cold * 100
+]]
+
+integer 'proxy.node.http.transaction_frac_avg_10s.hit_revalidated_int_pct' [[
+  return proxy.node.http.transaction_frac_avg_10s.hit_revalidated * 100
+]]
+
+integer 'proxy.node.http.transaction_frac_avg_10s.miss_changed_int_pct' [[
+  return proxy.node.http.transaction_frac_avg_10s.miss_changed * 100
+]]
+
+integer 'proxy.node.http.transaction_frac_avg_10s.miss_client_no_cache_int_pct' [[
+  return proxy.node.http.transaction_frac_avg_10s.miss_client_no_cache * 100
+]]
+
+integer 'proxy.node.http.transaction_frac_avg_10s.miss_not_cacheable_int_pct' [[
+  return proxy.node.http.transaction_frac_avg_10s.miss_not_cacheable * 100
+]]
+
+integer 'proxy.node.http.transaction_frac_avg_10s.errors.connect_failed_int_pct' [[
+  return proxy.node.http.transaction_frac_avg_10s.errors.connect_failed * 100
+]]
+
+integer 'proxy.node.http.transaction_frac_avg_10s.errors.aborts_int_pct' [[
+  return proxy.node.http.transaction_frac_avg_10s.errors.aborts * 100
+]]
+
+integer 'proxy.node.http.transaction_frac_avg_10s.errors.possible_aborts_int_pct' [[
+  return proxy.node.http.transaction_frac_avg_10s.errors.possible_aborts * 100
+]]
+
+integer 'proxy.node.http.transaction_frac_avg_10s.errors.pre_accept_hangups_int_pct' [[
+  return proxy.node.http.transaction_frac_avg_10s.errors.pre_accept_hangups * 100
+]]
+
+integer 'proxy.node.http.transaction_frac_avg_10s.errors.early_hangups_int_pct' [[
+  return proxy.node.http.transaction_frac_avg_10s.errors.early_hangups * 100
+]]
+
+integer 'proxy.node.http.transaction_frac_avg_10s.errors.empty_hangups_int_pct' [[
+  return proxy.node.http.transaction_frac_avg_10s.errors.empty_hangups * 100
+]]
+
+integer 'proxy.node.http.transaction_frac_avg_10s.errors.other_int_pct' [[
+  return proxy.node.http.transaction_frac_avg_10s.errors.other * 100
+]]
+
+integer 'proxy.node.http.transaction_msec_avg_10s.hit_fresh' [[
+  local self = ...
+  return interval_of_10s(self, function()
+    return
+      sec_to_msec                  *
+      delta_of(self, function()
+        return proxy.process.http.transaction_totaltime.hit_fresh
+      end) /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+integer 'proxy.node.http.transaction_msec_avg_10s.hit_revalidated' [[
+  local self = ...
+  return interval_of_10s(self, function()
+    return
+      sec_to_msec         *
+      delta_of(self, function()
+        return proxy.process.http.transaction_totaltime.hit_revalidated
+      end) /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+integer 'proxy.node.http.transaction_msec_avg_10s.miss_cold' [[
+  local self = ...
+  return interval_of_10s(self, function()
+    return
+      sec_to_msec   *
+      delta_of(self, function()
+        proxy.process.http.transaction_totaltime.miss_cold
+      end) /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+integer 'proxy.node.http.transaction_msec_avg_10s.miss_changed' [[
+  local self = ...
+  return interval_of_10s(self, function()
+    return
+      sec_to_msec   *
+      delta_of(self, function()
+        return proxy.process.http.transaction_totaltime.miss_changed
+      end) /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+integer 'proxy.node.http.transaction_msec_avg_10s.miss_client_no_cache' [[
+  local self = ...
+  return interval_of_10s(self, function()
+    return
+      sec_to_msec              *
+      delta_of(self, function()
+        return proxy.process.http.transaction_totaltime.miss_client_no_cache
+      end) /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+integer 'proxy.node.http.transaction_msec_avg_10s.miss_not_cacheable' [[
+  local self = ...
+  return interval_of_10s(self, function()
+    return
+      sec_to_msec            *
+      delta_of)self, function()
+        return proxy.process.http.transaction_totaltime.miss_not_cacheable
+      end) /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+integer 'proxy.node.http.transaction_msec_avg_10s.errors.connect_failed' [[
+  local self = ...
+  return interval_of_10s(self, function()
+    return
+      sec_to_msec               *
+      delta_of(self, function()
+        return proxy.process.http.transaction_totaltime.errors.connect_failed
+      end) /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+integer 'proxy.node.http.transaction_msec_avg_10s.errors.aborts' [[
+  local self = ...
+  return interval_of_10s(self, function()
+    return
+      sec_to_msec       *
+      delta_of(self, function()
+        return proxy.process.http.transaction_totaltime.errors.aborts
+      end) /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+integer 'proxy.node.http.transaction_msec_avg_10s.errors.possible_aborts' [[
+  local self = ...
+  return interval_of_10s(self, function()
+    return
+      sec_to_msec                *
+      delta_of(self, function()
+        return proxy.process.http.transaction_totaltime.errors.possible_aborts
+      end) /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+integer 'proxy.node.http.transaction_msec_avg_10s.errors.pre_accept_hangups' [[
+  local self = ...
+  return interval_of_10s(self, function()
+    return
+      sec_to_msec                   *
+      delta_of(self, function()
+        return proxy.process.http.transaction_totaltime.errors.pre_accept_hangups
+      end) /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+integer 'proxy.node.http.transaction_msec_avg_10s.errors.early_hangups' [[
+  local self = ...
+  return interval_of_10s(self, function()
+    return
+      sec_to_msec              *
+      delta_of(self, function()
+        self proxy.process.http.transaction_totaltime.errors.early_hangups
+      end) /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+integer 'proxy.node.http.transaction_msec_avg_10s.errors.empty_hangups' [[
+  local self = ...
+  return interval_of_10s(self, function()
+    return
+      sec_to_msec              *
+      delta_of(self, function()
+        return proxy.process.http.transaction_totaltime.errors.empty_hangups
+      end) /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+integer 'proxy.node.http.transaction_msec_avg_10s.errors.other' [[
+  local self = ...
+  return interval_of_10s(self, function()
+    return
+      sec_to_msec      *
+      delta_of(self, function()
+        return proxy.process.http.transaction_totaltime.errors.other
+      end) /
+      (
+      proxy.node.http.transaction_counts_avg_10s.hit_fresh                 +
+      proxy.node.http.transaction_counts_avg_10s.hit_revalidated           +
+      proxy.node.http.transaction_counts_avg_10s.miss_cold                 +
+      proxy.node.http.transaction_counts_avg_10s.miss_changed              +
+      proxy.node.http.transaction_counts_avg_10s.miss_client_no_cache      +
+      proxy.node.http.transaction_counts_avg_10s.miss_not_cacheable        +
+      proxy.node.http.transaction_counts_avg_10s.errors.connect_failed     +
+      proxy.node.http.transaction_counts_avg_10s.errors.aborts             +
+      proxy.node.http.transaction_counts_avg_10s.errors.possible_aborts    +
+      proxy.node.http.transaction_counts_avg_10s.errors.pre_accept_hangups +
+      proxy.node.http.transaction_counts_avg_10s.errors.early_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.empty_hangups      +
+      proxy.node.http.transaction_counts_avg_10s.errors.other
+      )
+    end)
+]]
+
+-- StatAggregation::Ag_Connections().
+
+integer 'proxy.node.current_client_connections' [[
+  return proxy.node.http.user_agent_current_connections_count
+]]
+
+integer 'proxy.cluster.current_client_connections' [[
+  return cluster('proxy.node.current_client_connections')
+]]
+
+integer 'proxy.node.current_server_connections' [[
+  return
+    proxy.node.http.origin_server_current_connections_count +
+    proxy.node.http.current_parent_proxy_connections
+]]
+
+integer 'proxy.cluster.current_server_connections' [[
+  return cluster('proxy.node.current_server_connections')
+]]
+
+integer 'proxy.node.current_cache_connections' [[
+  return
+    proxy.node.http.cache_current_connections_count
+]]
+
+integer 'proxy.cluster.current_cache_connections' [[
+  return cluster('proxy.node.current_cache_connections')
+]]
+
+integer 'proxy.node.client_throughput_out_kbit' [[
+  -- Convert Mbit/sec to Kbit/sec.
+  return proxy.node.client_throughput_out * 1000
+]]
+
+integer 'proxy.cluster.client_throughput_out_kbit' [[
+  return cluster('proxy.node.client_throughput_out_kbit')
+]]
+
+-- If proxy.node.cache_hit_ratio represents 100% as 1.0, this
+-- represents it as 100.
+integer 'proxy.node.cache_hit_ratio_int_pct' [[
+    return proxy.node.cache_hit_ratio * 100
+]]
+
+integer 'proxy.cluster.cache_hit_ratio_int_pct' [[
+  return proxy.cluster.cache_hit_ratio * 100
+]]
+
+integer 'proxy.node.cache_hit_mem_ratio_int_pct' [[
+  return proxy.node.cache_hit_mem_ratio * 100
+]]
+
+integer 'proxy.cluster.cache_hit_mem_ratio_int_pct' [[
+  return proxy.node.cache_hit_mem_ratio * 100
+]]
+
+integer 'proxy.node.bandwidth_hit_ratio_int_pct' [[
+  return proxy.node.bandwidth_hit_ratio * 100
+]]
+
+integer 'proxy.cluster.bandwidth_hit_ratio_int_pct' [[
+  return proxy.cluster.bandwidth_hit_ratio * 100
+]]
+
+integer 'proxy.node.cache.percent_free_int_pct' [[
+  return proxy.node.cache.percent_free * 100
+]]
+
+integer 'proxy.cluster.cache.percent_free_int_pct' [[
+  return proxy.cluster.cache.percent_free * 100
+]]
+
+integer 'proxy.node.hostdb.hit_ratio_int_pct' [[
+  return proxy.node.hostdb.hit_ratio * 100
+]]
+
+integer 'proxy.cluster.hostdb.hit_ratio_int_pct' [[
+  return proxy.cluster.hostdb.hit_ratio * 100
+]]
+
+integer 'proxy.node.cache.bytes_total_mb' [[
+  return mbytes(proxy.process.cache.bytes_total)
+]]
+
+integer 'proxy.node.cache.bytes_free_mb' [[
+  return mbytes(proxy.node.cache.bytes_free)
+]]
+
+integer 'proxy.cluster.cache.bytes_free_mb' [[
+  return mbytes(proxy.cluster.cache.bytes_free)
+]]
+
+integer 'proxy.cluster.http.current_parent_proxy_connections' [[
+  return cluster('proxy.node.http.current_parent_proxy_connections')
+]]
+
+counter 'proxy.cluster.http.parent_proxy_total_request_bytes' [[
+  return cluster('proxy.node.http.parent_proxy_total_request_bytes')
+]]
+
+counter 'proxy.cluster.http.parent_proxy_total_response_bytes' [[
+  return cluster('proxy.node.http.parent_proxy_total_response_bytes')
+]]
+
+-- Logging.
+counter 'proxy.node.log.event_log_access_ok' [[
+  return proxy.process.log.event_log_access_ok
+]]
+
+counter 'proxy.cluster.log.event_log_access_ok' [[
+  return cluster('proxy.node.log.event_log_access_ok')
+]]
+
+counter 'proxy.node.log.event_log_access_skip' [[
+  return proxy.process.log.event_log_access_skip
+]]
+
+counter 'proxy.cluster.log.event_log_access_skip' [[
+  return cluster('proxy.node.log.event_log_access_skip')
+]]
+
+counter 'proxy.node.log.event_log_access_aggr' [[
+  return proxy.process.log.event_log_access_aggr
+]]
+
+counter 'proxy.cluster.log.event_log_access_aggr' [[
+  return cluster('proxy.node.log.event_log_access_aggr')
+]]
+
+counter 'proxy.node.log.event_log_access_full' [[
+  return proxy.process.log.event_log_access_full
+]]
+
+counter 'proxy.cluster.log.event_log_access_full' [[
+  return cluster('proxy.node.log.event_log_access_full')
+]]
+
+counter 'proxy.node.log.event_log_access_fail' [[
+  return proxy.process.log.event_log_access_fail
+]]
+
+counter 'proxy.cluster.log.event_log_access_fail' [[
+  return cluster('proxy.node.log.event_log_access_fail')
+]]
+
+counter 'proxy.node.log.num_lost_before_sent_to_network' [[
+  return proxy.process.log.num_lost_before_sent_to_network
+]]
+
+counter 'proxy.cluster.log.num_lost_before_sent_to_network' [[
+  return cluster('proxy.node.log.num_lost_before_sent_to_network')
+]]
+
+counter 'proxy.node.log.num_sent_to_network' [[
+  return proxy.process.log.num_sent_to_network
+]]
+
+counter 'proxy.cluster.log.num_sent_to_network' [[
+  return cluster('proxy.node.log.num_sent_to_network')
+]]
+
+counter 'proxy.node.log.bytes_lost_before_sent_to_network' [[
+  return proxy.process.log.bytes_lost_before_sent_to_network
+]]
+
+counter 'proxy.cluster.log.bytes_lost_before_sent_to_network' [[
+  return cluster('proxy.node.log.bytes_lost_before_sent_to_network')
+]]
+
+counter 'proxy.node.log.bytes_sent_to_network' [[
+  return proxy.process.log.bytes_sent_to_network
+]]
+
+counter 'proxy.cluster.log.bytes_sent_to_network' [[
+  return cluster('proxy.node.log.bytes_sent_to_network')
+]]
+
+counter 'proxy.node.log.num_received_from_network' [[
+  return proxy.process.log.num_received_from_network
+]]
+
+counter 'proxy.cluster.log.num_received_from_network' [[
+  return cluster('proxy.node.log.num_received_from_network')
+]]
+
+counter 'proxy.node.log.bytes_received_from_network' [[
+  return proxy.process.log.bytes_received_from_network
+]]
+
+counter 'proxy.cluster.log.bytes_received_from_network' [[
+  return cluster('proxy.node.log.bytes_received_from_network')
+]]
+
+counter 'proxy.node.log.bytes_lost_before_preproc' [[
+  return proxy.process.log.bytes_lost_before_preproc
+]]
+
+counter 'proxy.cluster.log.bytes_lost_before_preproc' [[
+  return cluster('proxy.node.log.bytes_lost_before_preproc')
+]]
+
+counter 'proxy.node.log.num_lost_before_flush_to_disk' [[
+  return proxy.process.log.num_lost_before_flush_to_disk
+]]
+
+counter 'proxy.cluster.log.num_lost_before_flush_to_disk' [[
+  return cluster('proxy.node.log.bytes_lost_before_preproc')
+]]
+
+counter 'proxy.node.log.bytes_lost_before_flush_to_disk' [[
+  return proxy.process.log.bytes_lost_before_flush_to_disk
+]]
+
+counter 'proxy.cluster.log.bytes_lost_before_flush_to_disk' [[
+  return cluster('proxy.node.log.bytes_lost_before_preproc')
+]]
+
+counter 'proxy.node.log.bytes_lost_before_written_to_disk' [[
+  return proxy.process.log.bytes_lost_before_written_to_disk
+]]
+
+counter 'proxy.cluster.log.bytes_lost_before_written_to_disk' [[
+  return cluster('proxy.node.log.bytes_lost_before_written_to_disk')
+]]
+
+integer 'proxy.node.log.bytes_sent_to_network_avg_10s' [[
+  return interval_delta_of_10s(..., function()
+    return proxy.process.log.bytes_sent_to_network
+  end)
+]]
+
+integer 'proxy.cluster.log.bytes_sent_to_network_avg_10s' [[
+  return cluster(' proxy.node.log.bytes_sent_to_network_avg_10s')
+]]
+
+integer 'proxy.node.log.bytes_received_from_network_avg_10s' [[
+  return interval_delta_of_10s(..., function()
+    return proxy.process.log.bytes_received_from_network
+  end)
+]]
+
+integer 'proxy.cluster.log.bytes_received_from_network_avg_10s' [[
+  return cluster('proxy.node.log.bytes_received_from_network_avg_10s')
+]]
+
+counter 'proxy.process.ssl.total_success_handshake_count_in' [[
+  return proxy.process.ssl.total_success_handshake_count
+]]