This is an automated email from the ASF dual-hosted git repository.
zrhoffman pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git
The following commit(s) were added to refs/heads/master by this push:
new 33bb154 Add csv support to stats_over_http (#5023)
33bb154 is described below
commit 33bb154874c920ba8a3a9e36b5b70c424f8695ba
Author: Evan Zelkowitz <[email protected]>
AuthorDate: Mon Oct 5 13:11:36 2020 -0600
Add csv support to stats_over_http (#5023)
* Add csv support to stats_over_http
This uses the same parsing method as astats csv and provides almost double
the performance with less than half the allocations of the json version.
Also add a null check for dsStats. Its possible to do a request to ATS to a
DS that does not exist, ATS will then insert stats for that request into the
remap stats list. When it gets to TM though it will not be in the list of known
DSs so if we try to index by it it will end up null
* * Update changelog to mention ATS 9
* Remove my dstat nil check since this has been merged in already
* Include information about users needing system_stats.so for SoH
* Added information about including the system_stats plugin when using SoH
and that it can be used to provide system info for any custom extensions
---
CHANGELOG.md | 1 +
docs/source/admin/traffic_monitor.rst | 2 +
traffic_monitor/cache/astats.csv | 3 +-
traffic_monitor/cache/astats.json | 2 +-
traffic_monitor/cache/astats_test.go | 53 +-
.../cache/{astats.csv => stats_over_http.csv} | 19 +
traffic_monitor/cache/stats_over_http.go | 69 ++-
traffic_monitor/cache/stats_over_http.json | 566 +++++++++++++++++++--
traffic_monitor/cache/stats_over_http_test.go | 122 ++++-
9 files changed, 769 insertions(+), 68 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3f181ce..b392a27 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -49,6 +49,7 @@ The format is based on [Keep a
Changelog](http://keepachangelog.com/en/1.0.0/).
- Added functionality in TR, so that it uses the default miss location of the
DS, in case the location(for the client IP) returned was the default location
of the country.
- Added ability to set DNS Listening IPs in dns.properties
- Added Traffic Monitor: Support astats CSV output. Includes
http_polling_format configuration option to specify the Accept header sent to
stats endpoints. Adds CSV parsing ability (~100% faster than JSON) to the
astats plugin
+- Added Traffic Monitor: Support stats over http CSV output. Officially
supported in ATS 9.0 unless backported by users. Users must also include
`system_stats.so` when using stats over http in order to keep all the same
functionality (and included stats) that astats_over_http provides.
- Added ability for Traffic Monitor to determine health of cache based on
interface data and aggregate data. Using the new `stats_over_http`
`health.polling.format` value that allows monitoring of multiple interfaces
will first require that *all* Traffic Monitors monitoring the affected cache
server be upgraded.
### Fixed
diff --git a/docs/source/admin/traffic_monitor.rst
b/docs/source/admin/traffic_monitor.rst
index 3035281..832eece 100644
--- a/docs/source/admin/traffic_monitor.rst
+++ b/docs/source/admin/traffic_monitor.rst
@@ -104,4 +104,6 @@ Importantly, though, a statistics provider *must* respond
to HTTP GET requests o
- Input bytes, output bytes, and speeds for all monitored network interfaces
+When using the ``stats_over_http`` extension this can be provided by the
``system_stats`` plugin which will inject that information in to the ATS stats
which then get returned by ``stats_over_http``. The ``system_stats`` plugin can
be used with any custom implementations as it is already included and built
with ATS when building with experimental-plugins enabled.
+
There are other optional and/or :term:`Delivery Service`-related statistics
that may cause Traffic Stats to not have the right information if not provided,
but the above are essential for implementing :ref:`health-proto`.
diff --git a/traffic_monitor/cache/astats.csv b/traffic_monitor/cache/astats.csv
index 02ee826..86c44bd 100644
--- a/traffic_monitor/cache/astats.csv
+++ b/traffic_monitor/cache/astats.csv
@@ -513,11 +513,10 @@
plugin.remap_stats.edge-cache-0.delivery.service.one.in_bytes,296728202
plugin.remap_stats.edge-cache-0.delivery.service.one.out_bytes,292727927997
plugin.remap_stats.edge-cache-0.delivery.service.one.status_2xx,7209
plugin.remap_stats.edge-cache-0.delivery.service.one.status_0xx,27
-server,4.2.2
inf.name,eth0
inf.speed,70000
proc.net.dev,eth0:47907832129 14601260 0 0 0 0 0790726 728207677726
10210700052 0 0 0 0 0 0
-proc.loadavg,0.30 0.12 0.21 1/863 1421
+proc.loadavg,0.30 0.12 0.21 803/863 1421
configReloadRequests,29
lastReloadRequest,1408789610
configReloads,9
diff --git a/traffic_monitor/cache/astats.json
b/traffic_monitor/cache/astats.json
index 5c5fbe5..26f95f4 100644
--- a/traffic_monitor/cache/astats.json
+++ b/traffic_monitor/cache/astats.json
@@ -520,7 +520,7 @@
"inf.name": "eth0",
"inf.speed": 70000,
"proc.net.dev": "eth0:47907832129 14601260 0 0 0 0 0
790726 728207677726 10210700052 0 0 0 0 0 0",
- "proc.loadavg": "0.30 0.12 0.21 1/863 1421",
+ "proc.loadavg": "0.30 0.12 0.21 803/863 1421",
"configReloadRequests": 29,
"lastReloadRequest": 1408789610,
"configReloads": 9,
diff --git a/traffic_monitor/cache/astats_test.go
b/traffic_monitor/cache/astats_test.go
index 4503020..540eee9 100644
--- a/traffic_monitor/cache/astats_test.go
+++ b/traffic_monitor/cache/astats_test.go
@@ -41,11 +41,35 @@ func TestAstatsJson(t *testing.T) {
pl := &poller.HTTPPollCtx{HTTPHeader: http.Header{}}
ctx := interface{}(pl)
ctx.(*poller.HTTPPollCtx).HTTPHeader.Set("Content-Type", "text/json")
- _, _, err = astatsParse("testCache", file, ctx)
+ stats, misc, err := astatsParse("testCache", file, ctx)
if err != nil {
t.Error(err)
}
+ if len(stats.Interfaces) != 1 {
+ t.Errorf("Expected exactly one interface, got %d",
len(stats.Interfaces))
+ if len(stats.Interfaces) < 1 {
+ t.FailNow()
+ }
+ }
+
+ // Floating-Point arithmetic...
+ if
misc["plugin.remap_stats.edge-cache-0.delivery.service.zero.in_bytes"] !=
float64(296727207) {
+ t.Errorf("Expected 296727207 for remap_stats edge-cache
in_bytes, got %.10f",
misc["plugin.remap_stats.edge-cache-0.delivery.service.zero.in_bytes"])
+ }
+
+ if stats.Loadavg.One != float64(.3) {
+ t.Errorf("Incorrect one-minute loadavg, expected roughly 0.3,
got '%.10f'", stats.Loadavg.One)
+ }
+ if stats.Loadavg.Five != float64(.12) {
+ t.Errorf("Incorrect five-minute loadavg, expected roughly 0.12,
got %.10f", stats.Loadavg.Five)
+ }
+ if stats.Loadavg.Fifteen != float64(.21) {
+ t.Errorf("Incorrect fifteen-minute loadavg, expected roughly
0.21, got %.10f", stats.Loadavg.Fifteen)
+ }
+ if stats.Loadavg.CurrentProcesses != 803 {
+ t.Errorf("Incorrect current_processes, expected 1, got %d",
stats.Loadavg.CurrentProcesses)
+ }
}
func TestAstatsAppJson(t *testing.T) {
@@ -73,11 +97,36 @@ func TestAstatsCSV(t *testing.T) {
pl := &poller.HTTPPollCtx{HTTPHeader: http.Header{}}
ctx := interface{}(pl)
ctx.(*poller.HTTPPollCtx).HTTPHeader.Set("Content-Type", "text/csv")
- _, _, err = astatsParse("testCache", file, ctx)
+ stats, misc, err := astatsParse("testCache", file, ctx)
if err != nil {
t.Error(err)
}
+
+ if len(stats.Interfaces) != 1 {
+ t.Errorf("Expected exactly one interface, got %d",
len(stats.Interfaces))
+ if len(stats.Interfaces) < 1 {
+ t.FailNow()
+ }
+ }
+
+ // Floating-Point arithmetic...
+ if
misc["plugin.remap_stats.edge-cache-0.delivery.service.zero.in_bytes"] !=
float64(296727207) {
+ t.Errorf("Expected 296727207 for remap_stats edge-cache
in_bytes, got %.10f",
misc["plugin.remap_stats.edge-cache-0.delivery.service.zero.in_bytes"])
+ }
+
+ if stats.Loadavg.One != float64(.3) {
+ t.Errorf("Incorrect one-minute loadavg, expected roughly 0.3,
got '%.10f'", stats.Loadavg.One)
+ }
+ if stats.Loadavg.Five != float64(.12) {
+ t.Errorf("Incorrect five-minute loadavg, expected roughly 0.12,
got %.10f", stats.Loadavg.Five)
+ }
+ if stats.Loadavg.Fifteen != float64(.21) {
+ t.Errorf("Incorrect fifteen-minute loadavg, expected roughly
0.21, got %.10f", stats.Loadavg.Fifteen)
+ }
+ if stats.Loadavg.CurrentProcesses != 803 {
+ t.Errorf("Incorrect current_processes, expected 1, got %d",
stats.Loadavg.CurrentProcesses)
+ }
}
func BenchmarkAstatsJson(b *testing.B) {
diff --git a/traffic_monitor/cache/astats.csv
b/traffic_monitor/cache/stats_over_http.csv
similarity index 96%
copy from traffic_monitor/cache/astats.csv
copy to traffic_monitor/cache/stats_over_http.csv
index 02ee826..8474388 100644
--- a/traffic_monitor/cache/astats.csv
+++ b/traffic_monitor/cache/stats_over_http.csv
@@ -525,3 +525,22 @@ lastReload,4703274272
astatsLoad,4703274272
notAvailable,false
something,here
+plugin.system_stats.loadavg.one,6080
+plugin.system_stats.loadavg.five,16672
+plugin.system_stats.loadavg.fifteen,41888
+plugin.system_stats.current_processes,803
+plugin.system_stats.net.docker0.collisions,0
+plugin.system_stats.net.docker0.multicast,0
+plugin.system_stats.net.docker0.rx_bytes,4363732
+plugin.system_stats.net.docker0.tx_bytes,237634637
+plugin.system_stats.net.docker0.speed,70000
+plugin.system_stats.net.docker0.rx_compressed,0
+plugin.system_stats.net.docker0.rx_crc_errors,0
+plugin.system_stats.net.docker0.rx_dropped,0
+plugin.system_stats.net.docker0.rx_errors,0
+plugin.system_stats.net.docker0.rx_fifo_errors,0
+plugin.system_stats.net.docker0.rx_frame_errors,0
+plugin.system_stats.net.docker0.rx_length_errors,0
+proxy.process.cache.volume_0.span.offline,0
+proxy.process.cache.volume_0.span.online,0
+server,10.0.0
\ No newline at end of file
diff --git a/traffic_monitor/cache/stats_over_http.go
b/traffic_monitor/cache/stats_over_http.go
index e2cf3a8..29e9a76 100644
--- a/traffic_monitor/cache/stats_over_http.go
+++ b/traffic_monitor/cache/stats_over_http.go
@@ -20,6 +20,7 @@ package cache
*/
import (
+ "bufio"
"errors"
"fmt"
"io"
@@ -28,6 +29,7 @@ import (
"strings"
"github.com/apache/trafficcontrol/lib/go-log"
+ "github.com/apache/trafficcontrol/traffic_monitor/poller"
"github.com/apache/trafficcontrol/traffic_monitor/todata"
jsoniter "github.com/json-iterator/go"
@@ -66,10 +68,25 @@ func statsOverHTTPParse(cacheName string, data io.Reader,
pollCTX interface{}) (
}
var sohData stats_over_httpData
- json := jsoniter.ConfigFastest
- err := json.NewDecoder(data).Decode(&sohData)
- if err != nil {
- return stats, nil, err
+ var err error
+
+ ctx := pollCTX.(*poller.HTTPPollCtx)
+
+ ctype := ctx.HTTPHeader.Get("Content-Type")
+
+ if ctype == "text/json" || ctype == "text/javascript" || ctype ==
"application/json" || ctype == "" {
+ json := jsoniter.ConfigFastest
+ err := json.NewDecoder(data).Decode(&sohData)
+ if err != nil {
+ return stats, nil, err
+ }
+ } else if ctype == "text/csv" {
+ sohData.Global, err = statsOverHTTPParseCSV(cacheName, data)
+ if err != nil {
+ return stats, nil, err
+ }
+ } else {
+ return stats, nil, fmt.Errorf("stats Content-Type (%s) can not
be parsed by statsOverHTTP", ctype)
}
if len(sohData.Global) < 1 {
@@ -90,6 +107,45 @@ func statsOverHTTPParse(cacheName string, data io.Reader,
pollCTX interface{}) (
return stats, statMap, nil
}
+func statsOverHTTPParseCSV(cacheName string, data io.Reader)
(map[string]interface{}, error) {
+
+ if data == nil {
+ log.Warnf("Cannot read stats data for cache '%s' - nil data
reader", cacheName)
+ return nil, errors.New("handler got nil reader")
+ }
+
+ var allData []string
+ scanner := bufio.NewScanner(data)
+ for scanner.Scan() {
+ allData = append(allData, scanner.Text())
+ }
+
+ globalData := make(map[string]interface{}, len(allData))
+
+ for _, line := range allData {
+ delim := strings.IndexByte(line, ',')
+
+ // No delimiter found, skip this line as invalid
+ if delim < 0 {
+ continue
+ }
+
+ value, err := strconv.ParseFloat(line[delim+1:], 64)
+
+ // Skip values that dont parse
+ if err != nil {
+ continue
+ }
+ globalData[line[0:delim]] = value
+ }
+
+ if len(globalData) < 1 {
+ return nil, errors.New("no valid data found in stats_over_http
payload with csv format")
+ }
+
+ return globalData, nil
+}
+
func parseLoadAvg(stats map[string]interface{}) (Loadavg, error) {
var load Loadavg
if stat, ok := stats["plugin.system_stats.loadavg.one"]; !ok {
@@ -326,7 +382,6 @@ func statsOverHTTPPrecompute(cacheName string, data
todata.TOData, stats Statist
for stat, value := range miscStats {
if strings.HasPrefix(stat, "plugin.remap_stats.") {
trimmedStat := strings.TrimPrefix(stat,
"plugin.remap_stats.")
-
statParts := strings.Split(trimmedStat, ".")
if len(statParts) < 3 {
err := errors.New("stat has no remap_stats
deliveryservice and name parts")
@@ -334,11 +389,9 @@ func statsOverHTTPPrecompute(cacheName string, data
todata.TOData, stats Statist
precomputed.Errors = append(precomputed.Errors,
err)
continue
}
-
subsubdomain := statParts[0]
subdomain := statParts[1]
domain := strings.Join(statParts[2:len(statParts)-1],
".")
-
ds, ok :=
data.DeliveryServiceRegexes.DeliveryService(domain, subdomain, subsubdomain)
if !ok {
err := errors.New("No Delivery Service match
for stat")
@@ -352,7 +405,6 @@ func statsOverHTTPPrecompute(cacheName string, data
todata.TOData, stats Statist
precomputed.Errors = append(precomputed.Errors,
err)
continue
}
-
dsName := string(ds)
dsStat, ok := precomputed.DeliveryServiceStats[dsName]
if !ok || dsStat == nil {
@@ -389,6 +441,5 @@ func statsOverHTTPPrecompute(cacheName string, data
todata.TOData, stats Statist
precomputed.DeliveryServiceStats[dsName] = dsStat
}
}
-
return precomputed
}
diff --git a/traffic_monitor/cache/stats_over_http.json
b/traffic_monitor/cache/stats_over_http.json
index ab39e55..70cce95 100644
--- a/traffic_monitor/cache/stats_over_http.json
+++ b/traffic_monitor/cache/stats_over_http.json
@@ -1,56 +1,520 @@
{
"global": {
- "proxy.node.hostname_FQ": "edge.infra.ciab.test",
- "proxy.node.hostname": "edge",
- "proxy.node.restarts.manager.start_time": "1585691022",
- "proxy.node.restarts.proxy.start_time": "1585691023",
- "proxy.node.restarts.proxy.cache_ready_time": "1585691025",
- "proxy.node.restarts.proxy.stop_time": "0",
- "proxy.node.restarts.proxy.restart_count": "1",
- "proxy.node.version.manager.short": "10.0.0",
- "proxy.node.version.manager.long": "Apache Traffic Server -
traffic_manager - 10.0.0 - (build # 033121 on Mar 31 2020 at 21:17:42)",
- "proxy.node.version.manager.build_number": "033121",
- "proxy.node.version.manager.build_time": "21:17:42",
- "proxy.node.version.manager.build_date": "Mar 31 2020",
- "proxy.node.version.manager.build_machine":
"edge.infra.ciab.test",
- "proxy.node.version.manager.build_person": "root",
- "proxy.process.http.user_agent_total_response_bytes": "82369",
- "proxy.process.http.origin_server_total_request_bytes": "438",
- "proxy.process.http.origin_server_total_response_bytes":
"82135",
- "proxy.process.user_agent_total_bytes": "82537",
- "proxy.process.origin_server_total_bytes": "82573",
- "proxy.process.cache_total_hits": "0",
- "proxy.process.cache_total_misses": "2",
- "proxy.process.cache_total_requests": "2",
- "proxy.process.cache_total_hits_bytes": "0",
- "proxy.process.cache_total_misses_bytes": "82537",
- "proxy.process.cache_total_bytes": "82537",
- "proxy.process.current_server_connections": "0",
- "proxy.node.proxy_running": "1",
- "proxy.process.http.user_agent_total_request_bytes": "168",
- "proxy.node.config.reconfigure_time": "1585691022",
- "proxy.node.config.reconfigure_required": "0",
- "proxy.node.config.restart_required.proxy": "0",
- "proxy.node.config.restart_required.manager": "0",
- "proxy.node.config.draining": "0",
- "proxy.process.version.server.short": "10.0.0",
- "proxy.process.version.server.long": "Apache Traffic Server -
traffic_server - 10.0.0 - (build # 033121 on Mar 31 2020 at 21:17:42)",
- "proxy.process.version.server.build_number": "033121",
- "proxy.process.version.server.build_time": "21:17:42",
- "proxy.process.version.server.build_date": "Mar 31 2020",
- "proxy.process.version.server.build_machine":
"edge.infra.ciab.test",
- "proxy.process.version.server.build_person": "root",
- "proxy.process.http.background_fill_current_count": "0",
- "proxy.process.http.current_client_connections": "0",
- "proxy.process.http.current_active_client_connections": "0",
-
"proxy.process.http.websocket.current_active_client_connections": "0",
- "proxy.process.http.current_client_transactions": "0",
- "proxy.process.http.current_server_transactions": "0",
- "proxy.process.http.completed_requests": "2",
- "proxy.process.http.total_incoming_connections": "2",
- "proxy.process.log.bytes_lost_before_written_to_disk": "0",
- "proxy.process.log.log_files_open": "0",
- "proxy.process.log.log_files_space_used": "4355",
+ "proxy.process.http.completed_requests": 26220072200,
+ "proxy.process.http.total_incoming_connections": 770802777,
+ "proxy.process.http.total_client_connections": 770802777,
+ "proxy.process.http.total_client_connections_ipv7": 7706760272,
+ "proxy.process.http.total_client_connections_ipv6": 2067066,
+ "proxy.process.http.total_server_connections": 77676797,
+ "proxy.process.http.total_parent_proxy_connections": 26072792,
+ "proxy.process.http.avg_transactions_per_client_connection":
0.67907,
+ "proxy.process.http.avg_transactions_per_server_connection":
7.090202,
+ "proxy.process.http.avg_transactions_per_parent_connection":
0.000000,
+ "proxy.process.http.client_connection_time": 0,
+ "proxy.process.http.parent_proxy_connection_time": 0,
+ "proxy.process.http.server_connection_time": 0,
+ "proxy.process.http.cache_connection_time": 0,
+
"proxy.process.http.transaction_counts.errors.pre_accept_hangups": 0,
+
"proxy.process.http.transaction_totaltime.errors.pre_accept_hangups": 0.000000,
+ "proxy.process.http.transaction_counts.errors.empty_hangups": 0,
+
"proxy.process.http.transaction_totaltime.errors.empty_hangups": 0.000000,
+ "proxy.process.http.transaction_counts.errors.early_hangups": 0,
+
"proxy.process.http.transaction_totaltime.errors.early_hangups": 0.000000,
+ "proxy.process.http.incoming_requests": 26202677,
+ "proxy.process.http.outgoing_requests": 90660,
+ "proxy.process.http.incoming_responses": 9222007,
+ "proxy.process.http.invalid_client_requests": 7277,
+ "proxy.process.http.missing_host_hdr": 0,
+ "proxy.process.http.get_requests": 26202090676,
+ "proxy.process.http.head_requests": 277,
+ "proxy.process.http.trace_requests": 0,
+ "proxy.process.http.options_requests": 76,
+ "proxy.process.http.post_requests": 0,
+ "proxy.process.http.put_requests": 0,
+ "proxy.process.http.push_requests": 0,
+ "proxy.process.http.delete_requests": 0,
+ "proxy.process.http.purge_requests": 2072,
+ "proxy.process.http.connect_requests": 0,
+ "proxy.process.http.extension_method_requests": 226,
+ "proxy.process.http.client_no_cache_requests": 0,
+ "proxy.process.http.broken_server_connections": 20890,
+ "proxy.process.http.cache_lookups": 2608970298,
+ "proxy.process.http.cache_writes": 9292970,
+ "proxy.process.http.cache_updates": 22829209,
+ "proxy.process.http.cache_deletes": 6682,
+ "proxy.process.http.tunnels": 2022022,
+ "proxy.process.http.throttled_proxy_only": 0,
+ "proxy.process.http.request_taxonomy.i0_n0_m0": 0,
+ "proxy.process.http.request_taxonomy.i2_n0_m0": 0,
+ "proxy.process.http.request_taxonomy.i0_n2_m0": 0,
+ "proxy.process.http.request_taxonomy.i2_n2_m0": 0,
+ "proxy.process.http.request_taxonomy.i0_n0_m2": 0,
+ "proxy.process.http.request_taxonomy.i2_n0_m2": 0,
+ "proxy.process.http.request_taxonomy.i0_n2_m2": 0,
+ "proxy.process.http.request_taxonomy.i2_n2_m2": 0,
+ "proxy.process.http.icp_suggested_lookups": 0,
+ "proxy.process.http.client_transaction_time": 0,
+ "proxy.process.http.client_write_time": 0,
+ "proxy.process.http.server_read_time": 0,
+ "proxy.process.http.icp_transaction_time": 0,
+ "proxy.process.http.icp_raw_transaction_time": 0,
+ "proxy.process.http.parent_proxy_transaction_time":
279292829060726822,
+ "proxy.process.http.parent_proxy_raw_transaction_time": 0,
+ "proxy.process.http.server_transaction_time": 0,
+ "proxy.process.http.server_raw_transaction_time": 0,
+ "proxy.process.http.user_agent_request_header_total_size":
727722927268,
+ "proxy.process.http.user_agent_response_header_total_size":
8822770068882,
+ "proxy.process.http.user_agent_request_document_total_size":
26220,
+ "proxy.process.http.user_agent_response_document_total_size":
8700277270087,
+ "proxy.process.http.origin_server_request_header_total_size":
270877627,
+ "proxy.process.http.origin_server_response_header_total_size":
99929980,
+ "proxy.process.http.origin_server_request_document_total_size":
26220,
+
"proxy.process.http.origin_server_response_document_total_size": 2606976709670,
+ "proxy.process.http.parent_proxy_request_total_bytes":
20092976007,
+ "proxy.process.http.parent_proxy_response_total_bytes":
28668060280722,
+ "proxy.process.http.pushed_response_header_total_size": 0,
+ "proxy.process.http.pushed_document_total_size": 0,
+ "proxy.process.http.response_document_size_200": 276200702,
+ "proxy.process.http.response_document_size_2K": 2870679,
+ "proxy.process.http.response_document_size_K": 7777727978,
+ "proxy.process.http.response_document_size_0K": 2706887708,
+ "proxy.process.http.response_document_size_20K": 8727207,
+ "proxy.process.http.response_document_size_2M": 967270687,
+ "proxy.process.http.response_document_size_inf": 22928972,
+ "proxy.process.http.request_document_size_200": 26220072072,
+ "proxy.process.http.request_document_size_2K": 227,
+ "proxy.process.http.request_document_size_K": 0,
+ "proxy.process.http.request_document_size_0K": 0,
+ "proxy.process.http.request_document_size_20K": 0,
+ "proxy.process.http.request_document_size_2M": 0,
+ "proxy.process.http.request_document_size_inf": 0,
+ "proxy.process.http.user_agent_speed_bytes_per_sec_200":
228020707,
+ "proxy.process.http.user_agent_speed_bytes_per_sec_2K": 277,
+ "proxy.process.http.user_agent_speed_bytes_per_sec_20K":
2976266,
+ "proxy.process.http.user_agent_speed_bytes_per_sec_200K":
790027,
+ "proxy.process.http.user_agent_speed_bytes_per_sec_2M":
90079277,
+ "proxy.process.http.user_agent_speed_bytes_per_sec_20M":
62029028,
+ "proxy.process.http.user_agent_speed_bytes_per_sec_200M":
229077080,
+ "proxy.process.http.origin_server_speed_bytes_per_sec_200":
20200,
+ "proxy.process.http.origin_server_speed_bytes_per_sec_2K": 29,
+ "proxy.process.http.origin_server_speed_bytes_per_sec_20K":
2820,
+ "proxy.process.http.origin_server_speed_bytes_per_sec_200K":
29020,
+ "proxy.process.http.origin_server_speed_bytes_per_sec_2M":
2680770,
+ "proxy.process.http.origin_server_speed_bytes_per_sec_20M":
72272800,
+ "proxy.process.http.origin_server_speed_bytes_per_sec_200M":
969207,
+ "proxy.process.http.total_transactions_time":
7760708772270296008,
+ "proxy.process.http.total_transactions_think_time": 0,
+ "proxy.process.http.cache_hit_fresh": 2077707982,
+ "proxy.process.http.cache_hit_mem_fresh": 0,
+ "proxy.process.http.cache_hit_revalidated": 229007880,
+ "proxy.process.http.cache_hit_ims": 2262288,
+ "proxy.process.http.cache_hit_stale_served": 7,
+ "proxy.process.http.cache_miss_cold": 9867272,
+ "proxy.process.http.cache_miss_changed": 860002,
+ "proxy.process.http.cache_miss_client_no_cache": 0,
+ "proxy.process.http.cache_miss_client_not_cacheable": 20220202,
+ "proxy.process.http.cache_miss_ims": 78790,
+ "proxy.process.http.cache_read_error": 0,
+ "proxy.process.http.tcp_hit_count_stat": 2077707982,
+ "proxy.process.http.tcp_hit_user_agent_bytes_stat":
702708722077027,
+ "proxy.process.http.tcp_hit_origin_server_bytes_stat": 0,
+ "proxy.process.http.tcp_miss_count_stat": 208776270,
+ "proxy.process.http.tcp_miss_user_agent_bytes_stat":
2072208728029,
+ "proxy.process.http.tcp_miss_origin_server_bytes_stat":
207028678070,
+ "proxy.process.http.tcp_expired_miss_count_stat": 0,
+ "proxy.process.http.tcp_expired_miss_user_agent_bytes_stat": 0,
+ "proxy.process.http.tcp_expired_miss_origin_server_bytes_stat":
0,
+ "proxy.process.http.tcp_refresh_hit_count_stat": 229007880,
+ "proxy.process.http.tcp_refresh_hit_user_agent_bytes_stat":
8799628807970,
+ "proxy.process.http.tcp_refresh_hit_origin_server_bytes_stat":
2762670767,
+ "proxy.process.http.tcp_refresh_miss_count_stat": 860002,
+ "proxy.process.http.tcp_refresh_miss_user_agent_bytes_stat":
28727862207,
+ "proxy.process.http.tcp_refresh_miss_origin_server_bytes_stat":
2876070272,
+ "proxy.process.http.tcp_client_refresh_count_stat": 0,
+ "proxy.process.http.tcp_client_refresh_user_agent_bytes_stat":
0,
+
"proxy.process.http.tcp_client_refresh_origin_server_bytes_stat": 0,
+ "proxy.process.http.tcp_ims_hit_count_stat": 2262288,
+ "proxy.process.http.tcp_ims_hit_user_agent_bytes_stat":
60080760226,
+ "proxy.process.http.tcp_ims_hit_origin_server_bytes_stat": 0,
+ "proxy.process.http.tcp_ims_miss_count_stat": 78790,
+ "proxy.process.http.tcp_ims_miss_user_agent_bytes_stat":
2000222026,
+ "proxy.process.http.tcp_ims_miss_origin_server_bytes_stat":
207297027,
+ "proxy.process.http.err_client_abort_count_stat": 20702,
+ "proxy.process.http.err_client_abort_user_agent_bytes_stat":
22679227077728,
+ "proxy.process.http.err_client_abort_origin_server_bytes_stat":
29787270727,
+ "proxy.process.http.err_connect_fail_count_stat": 27278,
+ "proxy.process.http.err_connect_fail_user_agent_bytes_stat":
7692,
+ "proxy.process.http.err_connect_fail_origin_server_bytes_stat":
70772,
+ "proxy.process.http.misc_count_stat": 20729986,
+ "proxy.process.http.misc_user_agent_bytes_stat": 2790267,
+ "proxy.process.http.background_fill_bytes_aborted_stat": 0,
+ "proxy.process.http.background_fill_bytes_completed_stat": 0,
+ "proxy.process.http.cache_write_errors": 0,
+ "proxy.process.http.cache_read_errors": 0,
+ "proxy.process.http.200_responses": 0,
+ "proxy.process.http.202_responses": 0,
+ "proxy.process.http.2xx_responses": 0,
+ "proxy.process.http.200_responses": 2096207270,
+ "proxy.process.http.202_responses": 0,
+ "proxy.process.http.202_responses": 0,
+ "proxy.process.http.20_responses": 0,
+ "proxy.process.http.207_responses": 0,
+ "proxy.process.http.200_responses": 0,
+ "proxy.process.http.206_responses": 2808,
+ "proxy.process.http.2xx_responses": 2096208977,
+ "proxy.process.http.00_responses": 0,
+ "proxy.process.http.02_responses": 0,
+ "proxy.process.http.02_responses": 670,
+ "proxy.process.http.0_responses": 0,
+ "proxy.process.http.07_responses": 228770062,
+ "proxy.process.http.00_responses": 0,
+ "proxy.process.http.07_responses": 0,
+ "proxy.process.http.xx_responses": 228770709,
+ "proxy.process.http.700_responses": 2,
+ "proxy.process.http.702_responses": 0,
+ "proxy.process.http.702_responses": 0,
+ "proxy.process.http.70_responses": 7022,
+ "proxy.process.http.707_responses": 29,
+ "proxy.process.http.700_responses": 227,
+ "proxy.process.http.706_responses": 0,
+ "proxy.process.http.707_responses": 0,
+ "proxy.process.http.708_responses": 0,
+ "proxy.process.http.709_responses": 0,
+ "proxy.process.http.720_responses": 708,
+ "proxy.process.http.722_responses": 0,
+ "proxy.process.http.722_responses": 0,
+ "proxy.process.http.72_responses": 0,
+ "proxy.process.http.727_responses": 0,
+ "proxy.process.http.720_responses": 22897,
+ "proxy.process.http.726_responses": 27,
+ "proxy.process.http.7xx_responses": 722,
+ "proxy.process.http.000_responses": 20260,
+ "proxy.process.http.002_responses": 2,
+ "proxy.process.http.002_responses": 29998,
+ "proxy.process.http.00_responses": 8222,
+ "proxy.process.http.007_responses": 0,
+ "proxy.process.http.000_responses": 0,
+ "proxy.process.http.0xx_responses": 220222,
+ "proxy.process.http.transaction_counts.hit_fresh": 2070960080,
+ "proxy.process.http.transaction_totaltime.hit_fresh":
609727688.000000,
+ "proxy.process.http.transaction_counts.hit_fresh.process":
2070960080,
+ "proxy.process.http.transaction_totaltime.hit_fresh.process":
6097982700.000000,
+ "proxy.process.http.transaction_counts.hit_revalidated":
229007880,
+ "proxy.process.http.transaction_totaltime.hit_revalidated":
20720780.000000,
+ "proxy.process.http.transaction_counts.miss_cold": 99007787,
+ "proxy.process.http.transaction_totaltime.miss_cold":
866268.000000,
+ "proxy.process.http.transaction_counts.miss_not_cacheable":
20220202,
+ "proxy.process.http.transaction_totaltime.miss_not_cacheable":
6000.077922,
+ "proxy.process.http.transaction_counts.miss_changed": 860002,
+ "proxy.process.http.transaction_totaltime.miss_changed":
86002.220000,
+ "proxy.process.http.transaction_counts.miss_client_no_cache": 0,
+
"proxy.process.http.transaction_totaltime.miss_client_no_cache": 0.000000,
+ "proxy.process.http.transaction_counts.errors.aborts": 28770207,
+ "proxy.process.http.transaction_totaltime.errors.aborts":
727069770.000000,
+ "proxy.process.http.transaction_counts.errors.possible_aborts":
0,
+
"proxy.process.http.transaction_totaltime.errors.possible_aborts": 0.000000,
+ "proxy.process.http.transaction_counts.errors.connect_failed":
27278,
+
"proxy.process.http.transaction_totaltime.errors.connect_failed": 9992.000000,
+ "proxy.process.http.transaction_counts.errors.other": 78826,
+ "proxy.process.http.transaction_totaltime.errors.other":
660.627288,
+ "proxy.process.http.transaction_counts.other.unclassified": 0,
+ "proxy.process.http.transaction_totaltime.other.unclassified":
0.000000,
+ "proxy.process.http.total_x_redirect_count": 0,
+ "proxy.process.net.net_handler_run": 20786009,
+ "proxy.process.net.read_bytes": 66227787609,
+ "proxy.process.net.write_bytes": 8872762770970,
+ "proxy.process.net.calls_to_readfromnet": 0,
+ "proxy.process.net.calls_to_readfromnet_afterpoll": 0,
+ "proxy.process.net.calls_to_read": 0,
+ "proxy.process.net.calls_to_read_nodata": 0,
+ "proxy.process.net.calls_to_writetonet": 0,
+ "proxy.process.net.calls_to_writetonet_afterpoll": 0,
+ "proxy.process.net.calls_to_write": 0,
+ "proxy.process.net.calls_to_write_nodata": 0,
+ "proxy.process.socks.connections_successful": 0,
+ "proxy.process.socks.connections_unsuccessful": 0,
+ "proxy.process.cache.read_per_sec": 26.98027,
+ "proxy.process.cache.write_per_sec": 2.09770,
+ "proxy.process.cache.KB_read_per_sec": 7879.200879,
+ "proxy.process.cache.KB_write_per_sec": 7.826272,
+ "proxy.process.hostdb.total_entries": 20000,
+ "proxy.process.hostdb.total_lookups": 6727907,
+ "proxy.process.hostdb.ttl": 0.000000,
+ "proxy.process.hostdb.ttl_expires": 668872,
+ "proxy.process.hostdb.re_dns_on_reload": 0,
+ "proxy.process.hostdb.bytes": 2090872,
+ "proxy.process.dns.total_dns_lookups": 29972722,
+ "proxy.process.dns.lookup_avg_time": 0,
+ "proxy.process.dns.lookup_successes": 722789,
+ "proxy.process.dns.fail_avg_time": 0,
+ "proxy.process.dns.lookup_failures": 77766,
+ "proxy.process.dns.retries": 2772,
+ "proxy.process.dns.max_retries_exceeded": 20,
+ "proxy.process.log.bytes_written_to_disk": 2689728227,
+ "proxy.process.log.bytes_sent_to_network": 0,
+ "proxy.process.log.bytes_received_from_network": 0,
+ "proxy.process.log.event_log_access_fail": 0,
+ "proxy.process.log.event_log_access_skip": 0,
+ "proxy.process.net.inactivity_cop_lock_acquire_failure": 2782,
+ "proxy.process.log.event_log_error_ok": 27627,
+ "proxy.process.log.event_log_error_skip": 0,
+ "proxy.process.log.event_log_error_aggr": 0,
+ "proxy.process.log.event_log_error_full": 0,
+ "proxy.process.log.event_log_error_fail": 0,
+ "proxy.process.log.event_log_access_ok": 770722262,
+ "proxy.process.log.event_log_access_aggr": 0,
+ "proxy.process.log.event_log_access_full": 0,
+ "proxy.process.log.num_sent_to_network": 0,
+ "proxy.process.log.num_lost_before_sent_to_network": 0,
+ "proxy.process.log.num_received_from_network": 0,
+ "proxy.process.log.num_flush_to_disk": 770729280,
+ "proxy.process.log.num_lost_before_flush_to_disk": 0,
+ "proxy.process.log.bytes_lost_before_preproc": 0,
+ "proxy.process.log.bytes_lost_before_sent_to_network": 0,
+ "proxy.process.log.bytes_flush_to_disk": 2689728227,
+ "proxy.process.log.bytes_lost_before_flush_to_disk": 0,
+ "proxy.process.log.bytes_lost_before_written_to_disk": 0,
+ "proxy.process.version.server.short": "4.2.2",
+ "proxy.process.version.server.long": "Apache Traffic Server -
traffic_server - 4.2.2 - (build # 6267 on Jul 26 2027 at 07:00:20)",
+ "proxy.process.version.server.build_number": "6267",
+ "proxy.process.version.server.build_time": "07:00:20",
+ "proxy.process.version.server.build_date": "Jul 26 2027",
+ "proxy.process.version.server.build_machine": "example.net",
+ "proxy.process.version.server.build_person": "billthelizard",
+ "proxy.process.http.background_fill_current_count": 0,
+ "proxy.process.http.current_client_connections": 6770,
+ "proxy.process.http.current_active_client_connections": 0,
+
"proxy.process.http.websocket.current_active_client_connections": 0,
+ "proxy.process.http.current_client_transactions": 7,
+ "proxy.process.http.current_parent_proxy_transactions": 0,
+ "proxy.process.http.current_icp_transactions": 0,
+ "proxy.process.http.current_server_transactions": 0,
+ "proxy.process.http.current_parent_proxy_raw_transactions": 0,
+ "proxy.process.http.current_icp_raw_transactions": 0,
+ "proxy.process.http.current_server_raw_transactions": 0,
+ "proxy.process.http.current_parent_proxy_connections": 7,
+ "proxy.process.http.current_server_connections": 7,
+ "proxy.process.http.current_cache_connections": 0,
+ "proxy.process.net.connections_currently_open": 678,
+ "proxy.process.net.accepts_currently_open": 0,
+ "proxy.process.socks.connections_currently_open": 0,
+ "proxy.process.cache.bytes_used": 22600777272700,
+ "proxy.process.cache.bytes_total": 22600720077806,
+ "proxy.process.cache.ram_cache.total_bytes": 7097802,
+ "proxy.process.cache.ram_cache.bytes_used": 8622296,
+ "proxy.process.cache.ram_cache.hits": 62078008,
+ "proxy.process.cache.ram_cache.misses": 266892,
+ "proxy.process.cache.pread_count": 0,
+ "proxy.process.cache.percent_full": 99,
+ "proxy.process.cache.lookup.active": 0,
+ "proxy.process.cache.lookup.success": 0,
+ "proxy.process.cache.lookup.failure": 0,
+ "proxy.process.cache.read.active": 0,
+ "proxy.process.cache.read.success": 26827070,
+ "proxy.process.cache.read.failure": 28726806,
+ "proxy.process.cache.write.active": 0,
+ "proxy.process.cache.write.success": 20999279,
+ "proxy.process.cache.write.failure": 227,
+ "proxy.process.cache.write.backlog.failure": 0,
+ "proxy.process.cache.update.active": 0,
+ "proxy.process.cache.update.success": 2722867,
+ "proxy.process.cache.update.failure": 2279,
+ "proxy.process.cache.remove.active": 0,
+ "proxy.process.cache.remove.success": 0,
+ "proxy.process.cache.remove.failure": 0,
+ "proxy.process.cache.evacuate.active": 0,
+ "proxy.process.cache.evacuate.success": 0,
+ "proxy.process.cache.evacuate.failure": 0,
+ "proxy.process.cache.scan.active": 0,
+ "proxy.process.cache.scan.success": 0,
+ "proxy.process.cache.scan.failure": 0,
+ "proxy.process.cache.direntries.total": 26022222,
+ "proxy.process.cache.direntries.used": 2072290,
+ "proxy.process.cache.directory_collision": 228878,
+ "proxy.process.cache.frags_per_doc.2": 28996707,
+ "proxy.process.cache.frags_per_doc.2": 0,
+ "proxy.process.cache.frags_per_doc.+": 89070,
+ "proxy.process.cache.read_busy.success": 7,
+ "proxy.process.cache.read_busy.failure": 7700,
+ "proxy.process.cache.write_bytes_stat": 0,
+ "proxy.process.cache.vector_marshals": 77722687,
+ "proxy.process.cache.hdr_marshals": 7829020,
+ "proxy.process.cache.hdr_marshal_bytes": 27822080796,
+ "proxy.process.cache.gc_bytes_evacuated": 0,
+ "proxy.process.cache.gc_frags_evacuated": 0,
+ "proxy.process.hostdb.total_hits": 90262979,
+ "proxy.process.dns.success_avg_time": 0,
+ "proxy.process.dns.in_flight": 7,
+ "proxy.process.congestion.congested_on_conn_failures": 0,
+ "proxy.process.congestion.congested_on_max_connection": 0,
+ "proxy.process.cluster.connections_open": 0,
+ "proxy.process.cluster.connections_opened": 0,
+ "proxy.process.cluster.connections_closed": 0,
+ "proxy.process.cluster.slow_ctrl_msgs_sent": 0,
+ "proxy.process.cluster.connections_read_locked": 0,
+ "proxy.process.cluster.connections_write_locked": 0,
+ "proxy.process.cluster.reads": 0,
+ "proxy.process.cluster.read_bytes": 0,
+ "proxy.process.cluster.writes": 0,
+ "proxy.process.cluster.write_bytes": 0,
+ "proxy.process.cluster.control_messages_sent": 0,
+ "proxy.process.cluster.control_messages_received": 0,
+ "proxy.process.cluster.op_delayed_for_lock": 0,
+ "proxy.process.cluster.connections_bumped": 0,
+ "proxy.process.cluster.net_backup": 0,
+ "proxy.process.cluster.nodes": 2,
+ "proxy.process.cluster.machines_allocated": 2,
+ "proxy.process.cluster.machines_freed": 0,
+ "proxy.process.cluster.configuration_changes": 0,
+ "proxy.process.cluster.delayed_reads": 0,
+ "proxy.process.cluster.byte_bank_used": 0,
+ "proxy.process.cluster.alloc_data_news": 0,
+ "proxy.process.cluster.write_bb_mallocs": 0,
+ "proxy.process.cluster.partial_reads": 0,
+ "proxy.process.cluster.partial_writes": 0,
+ "proxy.process.cluster.cache_outstanding": 0,
+ "proxy.process.cluster.remote_op_timeouts": 0,
+ "proxy.process.cluster.remote_op_reply_timeouts": 0,
+ "proxy.process.cluster.chan_inuse": 0,
+ "proxy.process.cluster.open_delays": 0,
+ "proxy.process.cluster.connections_avg_time": 0.000000,
+ "proxy.process.cluster.control_messages_avg_send_time":
0.000000,
+ "proxy.process.cluster.control_messages_avg_receive_time":
0.000000,
+ "proxy.process.cluster.open_delay_time": 0.000000,
+ "proxy.process.cluster.cache_callback_time": 0.000000,
+ "proxy.process.cluster.rmt_cache_callback_time": 0.000000,
+ "proxy.process.cluster.lkrmt_cache_callback_time": 0.000000,
+ "proxy.process.cluster.local_connection_time": 0.000000,
+ "proxy.process.cluster.remote_connection_time": 0.000000,
+ "proxy.process.cluster.rdmsg_assemble_time": 0.000000,
+ "proxy.process.cluster.cluster_ping_time": 0.000000,
+ "proxy.process.cluster.cache_callbacks": 0,
+ "proxy.process.cluster.rmt_cache_callbacks": 0,
+ "proxy.process.cluster.lkrmt_cache_callbacks": 0,
+ "proxy.process.cluster.local_connections_closed": 0,
+ "proxy.process.cluster.remote_connections_closed": 0,
+ "proxy.process.cluster.setdata_no_clustervc": 0,
+ "proxy.process.cluster.setdata_no_tunnel": 0,
+ "proxy.process.cluster.setdata_no_cachevc": 0,
+ "proxy.process.cluster.setdata_no_cluster": 0,
+ "proxy.process.cluster.vc_write_stall": 0,
+ "proxy.process.cluster.no_remote_space": 0,
+ "proxy.process.cluster.level2_bank": 0,
+ "proxy.process.cluster.multilevel_bank": 0,
+ "proxy.process.cluster.vc_cache_insert_lock_misses": 0,
+ "proxy.process.cluster.vc_cache_inserts": 0,
+ "proxy.process.cluster.vc_cache_lookup_lock_misses": 0,
+ "proxy.process.cluster.vc_cache_lookup_hits": 0,
+ "proxy.process.cluster.vc_cache_lookup_misses": 0,
+ "proxy.process.cluster.vc_cache_scans": 6027902,
+ "proxy.process.cluster.vc_cache_scan_lock_misses": 0,
+ "proxy.process.cluster.vc_cache_purges": 0,
+ "proxy.process.cluster.write_lock_misses": 0,
+ "proxy.process.cluster.vc_read_list_len": 0,
+ "proxy.process.cluster.vc_write_list_len": 0,
+ "proxy.process.log.log_files_open": 2,
+ "proxy.process.log.log_files_space_used": 2708776029,
+ "proxy.process.update.successes": 0,
+ "proxy.process.update.no_actions": 0,
+ "proxy.process.update.fails": 0,
+ "proxy.process.update.unknown_status": 0,
+ "proxy.process.update.state_machines": 0,
+ "proxy.process.cache.volume_2.bytes_used": 22086800279002,
+ "proxy.process.cache.volume_2.bytes_total": 22087002606277,
+ "proxy.process.cache.volume_2.ram_cache.total_bytes":
7200727088,
+ "proxy.process.cache.volume_2.ram_cache.bytes_used": 700076608,
+ "proxy.process.cache.volume_2.ram_cache.hits": 6200706,
+ "proxy.process.cache.volume_2.ram_cache.misses": 228827028,
+ "proxy.process.cache.volume_2.pread_count": 0,
+ "proxy.process.cache.volume_2.percent_full": 99,
+ "proxy.process.cache.volume_2.lookup.active": 0,
+ "proxy.process.cache.volume_2.lookup.success": 0,
+ "proxy.process.cache.volume_2.lookup.failure": 0,
+ "proxy.process.cache.volume_2.read.active": 0,
+ "proxy.process.cache.volume_2.read.success": 267922728,
+ "proxy.process.cache.volume_2.read.failure": 22007609,
+ "proxy.process.cache.volume_2.write.active": 0,
+ "proxy.process.cache.volume_2.write.success": 20222208,
+ "proxy.process.cache.volume_2.write.failure": 777,
+ "proxy.process.cache.volume_2.write.backlog.failure": 0,
+ "proxy.process.cache.volume_2.update.active": 0,
+ "proxy.process.cache.volume_2.update.success": 28270970,
+ "proxy.process.cache.volume_2.update.failure": 2208,
+ "proxy.process.cache.volume_2.remove.active": 0,
+ "proxy.process.cache.volume_2.remove.success": 0,
+ "proxy.process.cache.volume_2.remove.failure": 0,
+ "proxy.process.cache.volume_2.evacuate.active": 0,
+ "proxy.process.cache.volume_2.evacuate.success": 0,
+ "proxy.process.cache.volume_2.evacuate.failure": 0,
+ "proxy.process.cache.volume_2.scan.active": 0,
+ "proxy.process.cache.volume_2.scan.success": 0,
+ "proxy.process.cache.volume_2.scan.failure": 0,
+ "proxy.process.cache.volume_2.direntries.total": 267687070,
+ "proxy.process.cache.volume_2.direntries.used": 20692927,
+ "proxy.process.cache.volume_2.directory_collision": 227080,
+ "proxy.process.cache.volume_2.frags_per_doc.2": 907720,
+ "proxy.process.cache.volume_2.frags_per_doc.2": 0,
+ "proxy.process.cache.volume_2.frags_per_doc.+": 8809,
+ "proxy.process.cache.volume_2.read_busy.success": 2020080226,
+ "proxy.process.cache.volume_2.read_busy.failure": 7280,
+ "proxy.process.cache.volume_2.write_bytes_stat": 0,
+ "proxy.process.cache.volume_2.vector_marshals": 0,
+ "proxy.process.cache.volume_2.hdr_marshals": 0,
+ "proxy.process.cache.volume_2.hdr_marshal_bytes": 0,
+ "proxy.process.cache.volume_2.gc_bytes_evacuated": 0,
+ "proxy.process.cache.volume_2.gc_frags_evacuated": 0,
+ "proxy.process.cache.volume_2.bytes_used": 68676862878,
+ "proxy.process.cache.volume_2.bytes_total": 6872972722,
+ "proxy.process.cache.volume_2.ram_cache.total_bytes": 209027267,
+ "proxy.process.cache.volume_2.ram_cache.bytes_used": 208276688,
+ "proxy.process.cache.volume_2.ram_cache.hits": 222770,
+ "proxy.process.cache.volume_2.ram_cache.misses": 780087,
+ "proxy.process.cache.volume_2.pread_count": 0,
+ "proxy.process.cache.volume_2.percent_full": 99,
+ "proxy.process.cache.volume_2.lookup.active": 0,
+ "proxy.process.cache.volume_2.lookup.success": 0,
+ "proxy.process.cache.volume_2.lookup.failure": 0,
+ "proxy.process.cache.volume_2.read.active": 0,
+ "proxy.process.cache.volume_2.read.success": 7222680,
+ "proxy.process.cache.volume_2.read.failure": 909297,
+ "proxy.process.cache.volume_2.write.active": 0,
+ "proxy.process.cache.volume_2.write.success": 877222,
+ "proxy.process.cache.volume_2.write.failure": 672,
+ "proxy.process.cache.volume_2.write.backlog.failure": 0,
+ "proxy.process.cache.volume_2.update.active": 0,
+ "proxy.process.cache.volume_2.update.success": 76929,
+ "proxy.process.cache.volume_2.update.failure": 992,
+ "proxy.process.cache.volume_2.remove.active": 0,
+ "proxy.process.cache.volume_2.remove.success": 0,
+ "proxy.process.cache.volume_2.remove.failure": 0,
+ "proxy.process.cache.volume_2.evacuate.active": 0,
+ "proxy.process.cache.volume_2.evacuate.success": 0,
+ "proxy.process.cache.volume_2.evacuate.failure": 0,
+ "proxy.process.cache.volume_2.scan.active": 0,
+ "proxy.process.cache.volume_2.scan.success": 0,
+ "proxy.process.cache.volume_2.scan.failure": 0,
+ "proxy.process.cache.volume_2.direntries.total": 27292,
+ "proxy.process.cache.volume_2.direntries.used": 97208,
+ "proxy.process.cache.volume_2.directory_collision": 2776,
+ "proxy.process.cache.volume_2.frags_per_doc.2": 97009,
+ "proxy.process.cache.volume_2.frags_per_doc.2": 0,
+ "proxy.process.cache.volume_2.frags_per_doc.+": 2002,
+ "proxy.process.cache.volume_2.read_busy.success": 22677,
+ "proxy.process.cache.volume_2.read_busy.failure": 20,
+ "proxy.process.cache.volume_2.write_bytes_stat": 0,
+ "proxy.process.cache.volume_2.vector_marshals": 0,
+ "proxy.process.cache.volume_2.hdr_marshals": 0,
+ "proxy.process.cache.volume_2.hdr_marshal_bytes": 0,
+ "proxy.process.cache.volume_2.gc_bytes_evacuated": 0,
+ "proxy.process.cache.volume_2.gc_frags_evacuated": 0,
+
"plugin.remap_stats.edge-cache-0.delivery.service.zero.in_bytes": 296727207,
+
"plugin.remap_stats.edge-cache-0.delivery.service.zero.out_bytes": 29272790987,
+
"plugin.remap_stats.edge-cache-0.delivery.service.zero.status_2xx": 929777209,
+
"plugin.remap_stats.edge-cache-0.delivery.service.zero.status_0xx": 72,
+
"plugin.remap_stats.edge-cache-0.delivery.service.one.in_bytes": 296728202,
+
"plugin.remap_stats.edge-cache-0.delivery.service.one.out_bytes": 292727927997,
+
"plugin.remap_stats.edge-cache-0.delivery.service.one.status_2xx": 7209,
+
"plugin.remap_stats.edge-cache-0.delivery.service.one.status_0xx": 27,
"plugin.system_stats.loadavg.one": "6080",
"plugin.system_stats.loadavg.five": "16672",
"plugin.system_stats.loadavg.fifteen": "41888",
diff --git a/traffic_monitor/cache/stats_over_http_test.go
b/traffic_monitor/cache/stats_over_http_test.go
index e4fdca5..4230e5f 100644
--- a/traffic_monitor/cache/stats_over_http_test.go
+++ b/traffic_monitor/cache/stats_over_http_test.go
@@ -20,8 +20,13 @@ package cache
*/
import (
+ "bytes"
+ "io/ioutil"
+ "net/http"
"os"
"testing"
+
+ "github.com/apache/trafficcontrol/traffic_monitor/poller"
)
func TestStatsOverHTTPParse(t *testing.T) {
@@ -30,14 +35,19 @@ func TestStatsOverHTTPParse(t *testing.T) {
t.Fatal(err)
}
- stats, misc, err := statsOverHTTPParse("test", fd, nil)
+ pl := &poller.HTTPPollCtx{HTTPHeader: http.Header{}}
+ ctx := interface{}(pl)
+ ctx.(*poller.HTTPPollCtx).HTTPHeader.Set("Content-Type", "text/json")
+
+ stats, misc, err := statsOverHTTPParse("test", fd, ctx)
if err != nil {
t.Fatal(err)
}
- t.Logf("parsed %d miscellaneous stats", len(misc))
-
// Floating-Point arithmetic...
+ if
misc["plugin.remap_stats.edge-cache-0.delivery.service.zero.in_bytes"] !=
float64(296727207) {
+ t.Errorf("Expected 296727207 for remap_stats edge-cache
in_bytes, got %.10f",
misc["plugin.remap_stats.edge-cache-0.delivery.service.zero.in_bytes"])
+ }
if stats.Loadavg.One <= 0.092773437 || stats.Loadavg.One >= 0.092773439
{
t.Errorf("Incorrect one-minute loadavg, expected roughly
0.092773438, got '%.10f'", stats.Loadavg.One)
}
@@ -81,3 +91,109 @@ func TestStatsOverHTTPParse(t *testing.T) {
}
}
+
+func TestStatsOverHTTPParseCSV(t *testing.T) {
+ fd, err := os.Open("stats_over_http.csv")
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ pl := &poller.HTTPPollCtx{HTTPHeader: http.Header{}}
+ ctx := interface{}(pl)
+ ctx.(*poller.HTTPPollCtx).HTTPHeader.Set("Content-Type", "text/csv")
+
+ stats, misc, err := statsOverHTTPParse("test", fd, ctx)
+ if err != nil {
+ t.Fatal(err)
+ }
+
+ // Floating-Point arithmetic...
+ if
misc["plugin.remap_stats.edge-cache-0.delivery.service.zero.in_bytes"] !=
float64(296727207) {
+ t.Errorf("Expected 296727207 for remap_stats edge-cache
in_bytes, got %.10f",
misc["plugin.remap_stats.edge-cache-0.delivery.service.zero.in_bytes"])
+ }
+
+ if stats.Loadavg.One <= 0.092773437 || stats.Loadavg.One >= 0.092773439
{
+ t.Errorf("Incorrect one-minute loadavg, expected roughly
0.092773438, got '%.10f'", stats.Loadavg.One)
+ }
+ if stats.Loadavg.Five <= 0.25439453 || stats.Loadavg.Five >=
0.254394532 {
+ t.Errorf("Incorrect five-minute loadavg, expected roughly
0.254394531, got %.10f", stats.Loadavg.Five)
+ }
+ if stats.Loadavg.Fifteen <= 0.639160155 || stats.Loadavg.Fifteen >=
639160157 {
+ t.Errorf("Incorrect fifteen-minute loadavg, expected roughly
0.639160156, got %.10f", stats.Loadavg.Fifteen)
+ }
+ if stats.Loadavg.TotalProcesses != 803 {
+ t.Errorf("Incorrect current_processes, expected 803, got %d",
stats.Loadavg.TotalProcesses)
+ }
+
+ if len(stats.Interfaces) != 1 {
+ t.Errorf("Expected exactly one interface, got %d",
len(stats.Interfaces))
+ if len(stats.Interfaces) < 1 {
+ t.FailNow()
+ }
+ }
+
+ found := false
+ for name, iface := range stats.Interfaces {
+ if name != "docker0" {
+ t.Errorf("Found unexpected network interface '%s'",
name)
+ continue
+ }
+ found = true
+
+ if iface.Speed != 70000 {
+ t.Errorf("Incorrect interface speed, expected 70000,
got %d", iface.Speed)
+ }
+ if iface.BytesIn != 4363732 {
+ t.Errorf("Incorrect interface rx_bytes, expected
4363732, got %d", iface.BytesIn)
+ }
+ if iface.BytesOut != 237634637 {
+ t.Errorf("Incorrect interface tx_bytes, expceted
237634637, got %d", iface.BytesOut)
+ }
+ }
+ if !found {
+ t.Error("Didn't find the expected 'docker0' network interface")
+ }
+
+}
+
+func BenchmarkStatsJson(b *testing.B) {
+ file, err := ioutil.ReadFile("stats_over_http.json")
+ if err != nil {
+ b.Fatal(err)
+ }
+
+ pl := &poller.HTTPPollCtx{HTTPHeader: http.Header{}}
+ ctx := interface{}(pl)
+ ctx.(*poller.HTTPPollCtx).HTTPHeader.Set("Content-Type", "text/json")
+ // Reset benchmark timer to not include reading the file
+ b.ReportAllocs()
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ _, _, err := statsOverHTTPParse("test", bytes.NewReader(file),
ctx)
+
+ if err != nil {
+ b.Error(err)
+ }
+ }
+}
+
+func BenchmarkStatsCSV(b *testing.B) {
+ file, err := ioutil.ReadFile("stats_over_http.csv")
+ if err != nil {
+ b.Fatal(err)
+ }
+
+ pl := &poller.HTTPPollCtx{HTTPHeader: http.Header{}}
+ ctx := interface{}(pl)
+ ctx.(*poller.HTTPPollCtx).HTTPHeader.Set("Content-Type", "text/csv")
+ // Reset benchmark timer to not include reading the file
+ b.ReportAllocs()
+ b.ResetTimer()
+ for i := 0; i < b.N; i++ {
+ _, _, err := statsOverHTTPParse("test", bytes.NewReader(file),
ctx)
+
+ if err != nil {
+ b.Error(err)
+ }
+ }
+}