You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by ne...@apache.org on 2017/01/30 15:29:22 UTC

[16/19] incubator-trafficcontrol git commit: Move TM2 to trafficcontrol/traffic_monitor_golang

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/594b8517/traffic_monitor/experimental/traffic_monitor/cache/astats.json
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/traffic_monitor/cache/astats.json b/traffic_monitor/experimental/traffic_monitor/cache/astats.json
deleted file mode 100644
index df0e9d7..0000000
--- a/traffic_monitor/experimental/traffic_monitor/cache/astats.json
+++ /dev/null
@@ -1,531 +0,0 @@
-{ "ats": {
-   "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": .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": 0967270687,
-   "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": 0969207,
-   "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": 060080760226,
-   "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": 07692,
-   "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": ,
-   "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": 00029,
-   "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": 000722,
-   "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": 09992.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": 07.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": 077766,
-   "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": ,
-   "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": ,
-   "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": 0227,
-   "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": 07,
-   "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": 0909297,
-   "proxy.process.cache.volume_2.write.active": 0,
-   "proxy.process.cache.volume_2.write.success": 0877222,
-   "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": 076929,
-   "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": 027292,
-   "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": 020,
-   "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,
-   "server": "4.2.2"
-  },
- "system": {
-   "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",
-   "configReloadRequests": 29,
-   "lastReloadRequest": 1408789610,
-   "configReloads": 9,
-   "lastReload": 4703274272,
-   "astatsLoad": 4703274272,
-"something": "here"
-  }
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/594b8517/traffic_monitor/experimental/traffic_monitor/cache/astats_test.go
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/traffic_monitor/cache/astats_test.go b/traffic_monitor/experimental/traffic_monitor/cache/astats_test.go
deleted file mode 100644
index 67dd8aa..0000000
--- a/traffic_monitor/experimental/traffic_monitor/cache/astats_test.go
+++ /dev/null
@@ -1,42 +0,0 @@
-package cache
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- * 
- *   http://www.apache.org/licenses/LICENSE-2.0
- * 
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-
-import (
-	"fmt"
-	"io/ioutil"
-	"testing"
-)
-
-func TestAstats(t *testing.T) {
-	t.Log("Running Astats Tests")
-
-	text, err := ioutil.ReadFile("astats.json")
-	if err != nil {
-		t.Log(err)
-	}
-	aStats, err := Unmarshal(text)
-	fmt.Printf("aStats ---> %v\n", aStats)
-	if err != nil {
-		t.Log(err)
-	}
-	fmt.Printf("Found %v key/val pairs in ats\n", len(aStats.Ats))
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/594b8517/traffic_monitor/experimental/traffic_monitor/cache/cache.go
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/traffic_monitor/cache/cache.go b/traffic_monitor/experimental/traffic_monitor/cache/cache.go
deleted file mode 100644
index 98b996b..0000000
--- a/traffic_monitor/experimental/traffic_monitor/cache/cache.go
+++ /dev/null
@@ -1,559 +0,0 @@
-package cache
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import (
-	"encoding/json"
-	"fmt"
-	"io"
-	"net/url"
-	"regexp"
-	"strconv"
-	"strings"
-	"time"
-
-	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/common/log"
-	dsdata "github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/deliveryservicedata"
-	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/enum"
-	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/peer"
-	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/srvhttp"
-	todata "github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/trafficopsdata"
-	to "github.com/apache/incubator-trafficcontrol/traffic_ops/client"
-)
-
-// Handler is a cache handler, which fulfills the common/handler `Handler` interface.
-type Handler struct {
-	resultChan         chan Result
-	Notify             int
-	ToData             *todata.TODataThreadsafe
-	PeerStates         *peer.CRStatesPeersThreadsafe
-	MultipleSpaceRegex *regexp.Regexp
-}
-
-func (h Handler) ResultChan() <-chan Result {
-	return h.resultChan
-}
-
-// NewHandler returns a new cache handler. Note this handler does NOT precomputes stat data before calling ResultChan, and Result.Precomputed will be nil
-func NewHandler() Handler {
-	return Handler{resultChan: make(chan Result), MultipleSpaceRegex: regexp.MustCompile(" +")}
-}
-
-// NewPrecomputeHandler constructs a new cache Handler, which precomputes stat data and populates result.Precomputed before passing to ResultChan.
-func NewPrecomputeHandler(toData todata.TODataThreadsafe, peerStates peer.CRStatesPeersThreadsafe) Handler {
-	return Handler{resultChan: make(chan Result), MultipleSpaceRegex: regexp.MustCompile(" +"), ToData: &toData, PeerStates: &peerStates}
-}
-
-// Precompute returns whether this handler precomputes data before passing the result to the ResultChan
-func (handler Handler) Precompute() bool {
-	return handler.ToData != nil && handler.PeerStates != nil
-}
-
-// PrecomputedData represents data parsed and pre-computed from the Result.
-type PrecomputedData struct {
-	DeliveryServiceStats map[enum.DeliveryServiceName]dsdata.Stat
-	OutBytes             int64
-	MaxKbps              int64
-	Errors               []error
-	Reporting            bool
-	Time                 time.Time
-}
-
-// Result is the data result returned by a cache.
-type Result struct {
-	ID              enum.CacheName
-	Error           error
-	Astats          Astats
-	Time            time.Time
-	RequestTime     time.Duration
-	Vitals          Vitals
-	PollID          uint64
-	PollFinished    chan<- uint64
-	PrecomputedData PrecomputedData
-	Available       bool
-}
-
-// HasStat returns whether the given stat is in the Result.
-func (result *Result) HasStat(stat string) bool {
-	computedStats := ComputedStats()
-	if _, ok := computedStats[stat]; ok {
-		return true // health poll has all computed stats
-	}
-	if _, ok := result.Astats.Ats[stat]; ok {
-		return true
-	}
-	return false
-}
-
-// Vitals is the vitals data returned from a cache.
-type Vitals struct {
-	LoadAvg    float64
-	BytesOut   int64
-	BytesIn    int64
-	KbpsOut    int64
-	MaxKbpsOut int64
-}
-
-// Stat is a generic stat, including the untyped value and the time the stat was taken.
-type Stat struct {
-	Time  int64       `json:"time"`
-	Value interface{} `json:"value"`
-}
-
-// Stats is designed for returning via the API. It contains result history for each cache, as well as common API data.
-type Stats struct {
-	srvhttp.CommonAPIData
-	Caches map[enum.CacheName]map[string][]ResultStatVal `json:"caches"`
-}
-
-// Filter filters whether stats and caches should be returned from a data set.
-type Filter interface {
-	UseStat(name string) bool
-	UseCache(name enum.CacheName) bool
-	WithinStatHistoryMax(int) bool
-}
-
-const nsPerMs = 1000000
-
-type StatComputeFunc func(resultInfo ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{}
-
-// ComputedStats returns a map of cache stats which are computed by Traffic Monitor (rather than returned literally from ATS), mapped to the func to compute them.
-func ComputedStats() map[string]StatComputeFunc {
-	return map[string]StatComputeFunc{
-		"availableBandwidthInKbps": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return info.Vitals.MaxKbpsOut - info.Vitals.KbpsOut
-		},
-
-		"availableBandwidthInMbps": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return (info.Vitals.MaxKbpsOut - info.Vitals.KbpsOut) / 1000
-		},
-		"bandwidth": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return info.Vitals.KbpsOut
-		},
-		"error-string": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			if info.Error != nil {
-				return info.Error.Error()
-			}
-			return "false"
-		},
-		"isAvailable": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return combinedState.IsAvailable // if the cache is missing, default to false
-		},
-		"isHealthy": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			if enum.CacheStatusFromString(serverInfo.Status) == enum.CacheStatusAdminDown {
-				return true
-			}
-			return combinedState.IsAvailable
-		},
-		"kbps": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return info.Vitals.KbpsOut
-		},
-		"loadavg": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return info.Vitals.LoadAvg
-		},
-		"maxKbps": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return info.Vitals.MaxKbpsOut
-		},
-		"queryTime": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return info.RequestTime.Nanoseconds() / nsPerMs
-		},
-		"stateUrl": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return serverProfile.Parameters.HealthPollingURL
-		},
-		"status": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return serverInfo.Status
-		},
-		"system.astatsLoad": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return info.System.AstatsLoad
-		},
-		"system.configReloadRequests": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return info.System.ConfigLoadRequest
-		},
-		"system.configReloads": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return info.System.ConfigReloads
-		},
-		"system.inf.name": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return info.System.InfName
-		},
-		"system.inf.speed": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return info.System.InfSpeed
-		},
-		"system.lastReload": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return info.System.LastReload
-		},
-		"system.lastReloadRequest": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return info.System.LastReloadRequest
-		},
-		"system.proc.loadavg": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return info.System.ProcLoadavg
-		},
-		"system.proc.net.dev": func(info ResultInfo, serverInfo to.TrafficServer, serverProfile to.TMProfile, combinedState peer.IsAvailable) interface{} {
-			return info.System.ProcNetDev
-		},
-	}
-}
-
-// StatsMarshall encodes the stats in JSON, encoding up to historyCount of each stat. If statsToUse is empty, all stats are encoded; otherwise, only the given stats are encoded. If wildcard is true, stats which contain the text in each statsToUse are returned, instead of exact stat names. If cacheType is not CacheTypeInvalid, only stats for the given type are returned. If hosts is not empty, only the given hosts are returned.
-func StatsMarshall(statResultHistory ResultStatHistory, statInfo ResultInfoHistory, combinedStates peer.Crstates, monitorConfig to.TrafficMonitorConfigMap, statMaxKbpses Kbpses, filter Filter, params url.Values) ([]byte, error) {
-	stats := Stats{
-		CommonAPIData: srvhttp.GetCommonAPIData(params, time.Now()),
-		Caches:        map[enum.CacheName]map[string][]ResultStatVal{},
-	}
-
-	computedStats := ComputedStats()
-
-	// TODO in 1.0, stats are divided into 'location', 'cache', and 'type'. 'cache' are hidden by default.
-
-	for id, history := range statResultHistory {
-		if !filter.UseCache(id) {
-			continue
-		}
-		for stat, vals := range history {
-			stat = "ats." + stat // TM1 prefixes ATS stats with 'ats.'
-			if !filter.UseStat(stat) {
-				continue
-			}
-			historyCount := 1
-			for _, val := range vals {
-				if !filter.WithinStatHistoryMax(historyCount) {
-					break
-				}
-				if _, ok := stats.Caches[id]; !ok {
-					stats.Caches[id] = map[string][]ResultStatVal{}
-				}
-				stats.Caches[id][stat] = append(stats.Caches[id][stat], val)
-				historyCount += int(val.Span)
-			}
-		}
-	}
-
-	for id, infos := range statInfo {
-		if !filter.UseCache(id) {
-			continue
-		}
-
-		serverInfo, ok := monitorConfig.TrafficServer[string(id)]
-		if !ok {
-			log.Warnf("cache.StatsMarshall server %s missing from monitorConfig\n", id)
-		}
-
-		serverProfile, ok := monitorConfig.Profile[serverInfo.Profile]
-		if !ok {
-			log.Warnf("cache.StatsMarshall server %s missing profile in monitorConfig\n", id)
-		}
-
-		for i, resultInfo := range infos {
-			if !filter.WithinStatHistoryMax(i + 1) {
-				break
-			}
-			if _, ok := stats.Caches[id]; !ok {
-				stats.Caches[id] = map[string][]ResultStatVal{}
-			}
-
-			t := resultInfo.Time
-
-			for stat, statValF := range computedStats {
-				if !filter.UseStat(stat) {
-					continue
-				}
-				stats.Caches[id][stat] = append(stats.Caches[id][stat], ResultStatVal{Val: statValF(resultInfo, serverInfo, serverProfile, combinedStates.Caches[id]), Time: t, Span: 1}) // combinedState will default to unavailable
-			}
-		}
-	}
-	return json.Marshal(stats)
-}
-
-// Handle handles results fetched from a cache, parsing the raw Reader data and passing it along to a chan for further processing.
-func (handler Handler) Handle(id string, r io.Reader, reqTime time.Duration, reqErr error, pollID uint64, pollFinished chan<- uint64) {
-	log.Debugf("poll %v %v handle start\n", pollID, time.Now())
-	result := Result{
-		ID:           enum.CacheName(id),
-		Time:         time.Now(), // TODO change this to be computed the instant we get the result back, to minimise inaccuracy
-		RequestTime:  reqTime,
-		PollID:       pollID,
-		PollFinished: pollFinished,
-	}
-
-	if reqErr != nil {
-		log.Warnf("%v handler given error '%v'\n", id, reqErr) // error here, in case the thing that called Handle didn't error
-		result.Error = reqErr
-		handler.resultChan <- result
-		return
-	}
-
-	if r == nil {
-		log.Warnf("%v handle reader nil\n", id)
-		result.Error = fmt.Errorf("handler got nil reader")
-		handler.resultChan <- result
-		return
-	}
-
-	result.PrecomputedData.Reporting = true
-	result.PrecomputedData.Time = result.Time
-
-	if decodeErr := json.NewDecoder(r).Decode(&result.Astats); decodeErr != nil {
-		log.Warnf("%s procnetdev decode error '%v'\n", id, decodeErr)
-		result.Error = decodeErr
-		handler.resultChan <- result
-		return
-	}
-
-	if result.Astats.System.ProcNetDev == "" {
-		log.Warnf("addkbps %s procnetdev empty\n", id)
-	}
-
-	if result.Astats.System.InfSpeed == 0 {
-		log.Warnf("addkbps %s inf.speed empty\n", id)
-	}
-
-	if reqErr != nil {
-		result.Error = reqErr
-		log.Errorf("addkbps handle %s error '%v'\n", id, reqErr)
-	} else {
-		result.Available = true
-	}
-
-	if handler.Precompute() {
-		result = handler.precompute(result)
-	}
-
-	handler.resultChan <- result
-}
-
-// outBytes takes the proc.net.dev string, and the interface name, and returns the bytes field
-func outBytes(procNetDev, iface string, multipleSpaceRegex *regexp.Regexp) (int64, error) {
-	if procNetDev == "" {
-		return 0, fmt.Errorf("procNetDev empty")
-	}
-	if iface == "" {
-		return 0, fmt.Errorf("iface empty")
-	}
-	ifacePos := strings.Index(procNetDev, iface)
-	if ifacePos == -1 {
-		return 0, fmt.Errorf("interface '%s' not found in proc.net.dev '%s'", iface, procNetDev)
-	}
-
-	procNetDevIfaceBytes := procNetDev[ifacePos+len(iface)+1:]
-	procNetDevIfaceBytes = strings.TrimLeft(procNetDevIfaceBytes, " ")
-	procNetDevIfaceBytes = multipleSpaceRegex.ReplaceAllLiteralString(procNetDevIfaceBytes, " ")
-	procNetDevIfaceBytesArr := strings.Split(procNetDevIfaceBytes, " ") // this could be made faster with a custom function (DFA?) that splits and ignores duplicate spaces at the same time
-	if len(procNetDevIfaceBytesArr) < 10 {
-		return 0, fmt.Errorf("proc.net.dev iface '%v' unknown format '%s'", iface, procNetDev)
-	}
-	procNetDevIfaceBytes = procNetDevIfaceBytesArr[8]
-
-	return strconv.ParseInt(procNetDevIfaceBytes, 10, 64)
-}
-
-// precompute does the calculations which are possible with only this one cache result.
-// TODO precompute ResultStatVal
-func (handler Handler) precompute(result Result) Result {
-	todata := handler.ToData.Get()
-	stats := map[enum.DeliveryServiceName]dsdata.Stat{}
-
-	var err error
-	if result.PrecomputedData.OutBytes, err = outBytes(result.Astats.System.ProcNetDev, result.Astats.System.InfName, handler.MultipleSpaceRegex); err != nil {
-		result.PrecomputedData.OutBytes = 0
-		log.Errorf("addkbps %s handle precomputing outbytes '%v'\n", result.ID, err)
-	}
-
-	kbpsInMbps := int64(1000)
-	result.PrecomputedData.MaxKbps = int64(result.Astats.System.InfSpeed) * kbpsInMbps
-
-	for stat, value := range result.Astats.Ats {
-		var err error
-		stats, err = processStat(result.ID, stats, todata, stat, value, result.Time)
-		if err != nil && err != dsdata.ErrNotProcessedStat {
-			log.Infof("precomputing cache %v stat %v value %v error %v", result.ID, stat, value, err)
-			result.PrecomputedData.Errors = append(result.PrecomputedData.Errors, err)
-		}
-	}
-	result.PrecomputedData.DeliveryServiceStats = stats
-	return result
-}
-
-// processStat and its subsidiary functions act as a State Machine, flowing the stat thru states for each "." component of the stat name
-func processStat(server enum.CacheName, stats map[enum.DeliveryServiceName]dsdata.Stat, toData todata.TOData, stat string, value interface{}, timeReceived time.Time) (map[enum.DeliveryServiceName]dsdata.Stat, error) {
-	parts := strings.Split(stat, ".")
-	if len(parts) < 1 {
-		return stats, fmt.Errorf("stat has no initial part")
-	}
-
-	switch parts[0] {
-	case "plugin":
-		return processStatPlugin(server, stats, toData, stat, parts[1:], value, timeReceived)
-	case "proxy":
-		return stats, dsdata.ErrNotProcessedStat
-	case "server":
-		return stats, dsdata.ErrNotProcessedStat
-	default:
-		return stats, fmt.Errorf("stat '%s' has unknown initial part '%s'", stat, parts[0])
-	}
-}
-
-func processStatPlugin(server enum.CacheName, stats map[enum.DeliveryServiceName]dsdata.Stat, toData todata.TOData, stat string, statParts []string, value interface{}, timeReceived time.Time) (map[enum.DeliveryServiceName]dsdata.Stat, error) {
-	if len(statParts) < 1 {
-		return stats, fmt.Errorf("stat has no plugin part")
-	}
-	switch statParts[0] {
-	case "remap_stats":
-		return processStatPluginRemapStats(server, stats, toData, stat, statParts[1:], value, timeReceived)
-	default:
-		return stats, fmt.Errorf("stat has unknown plugin part '%s'", statParts[0])
-	}
-}
-
-func processStatPluginRemapStats(server enum.CacheName, stats map[enum.DeliveryServiceName]dsdata.Stat, toData todata.TOData, stat string, statParts []string, value interface{}, timeReceived time.Time) (map[enum.DeliveryServiceName]dsdata.Stat, error) {
-	if len(statParts) < 2 {
-		return stats, fmt.Errorf("stat has no remap_stats deliveryservice and name parts")
-	}
-
-	fqdn := strings.Join(statParts[:len(statParts)-1], ".")
-
-	ds, ok := toData.DeliveryServiceRegexes.DeliveryService(fqdn)
-	if !ok {
-		return stats, fmt.Errorf("ERROR no delivery service match for fqdn '%v' stat '%v'\n", fqdn, strings.Join(statParts, "."))
-	}
-	if ds == "" {
-		return stats, fmt.Errorf("ERROR EMPTY delivery service fqdn %v stat %v\n", fqdn, strings.Join(statParts, "."))
-	}
-
-	statName := statParts[len(statParts)-1]
-
-	dsStat, ok := stats[ds]
-	if !ok {
-		newStat := dsdata.NewStat()
-		dsStat = *newStat
-	}
-
-	if err := addCacheStat(&dsStat.TotalStats, statName, value); err != nil {
-		return stats, err
-	}
-
-	cachegroup, ok := toData.ServerCachegroups[server]
-	if !ok {
-		return stats, fmt.Errorf("server missing from TOData.ServerCachegroups") // TODO check logs, make sure this isn't normal
-	}
-	dsStat.CacheGroups[cachegroup] = dsStat.TotalStats
-
-	cacheType, ok := toData.ServerTypes[server]
-	if !ok {
-		return stats, fmt.Errorf("server missing from TOData.ServerTypes")
-	}
-	dsStat.Types[cacheType] = dsStat.TotalStats
-
-	dsStat.Caches[server] = dsStat.TotalStats
-
-	dsStat.CachesTimeReceived[server] = timeReceived
-	stats[ds] = dsStat
-	return stats, nil
-}
-
-// addCacheStat adds the given stat to the existing stat. Note this adds, it doesn't overwrite. Numbers are summed, strings are concatenated.
-// TODO make this less duplicate code somehow.
-func addCacheStat(stat *dsdata.StatCacheStats, name string, val interface{}) error {
-	switch name {
-	case "status_2xx":
-		v, ok := val.(float64)
-		if !ok {
-			return fmt.Errorf("stat '%s' value expected int actual '%v' type %T", name, val, val)
-		}
-		stat.Status2xx.Value += int64(v)
-	case "status_3xx":
-		v, ok := val.(float64)
-		if !ok {
-			return fmt.Errorf("stat '%s' value expected int actual '%v' type %T", name, val, val)
-		}
-		stat.Status3xx.Value += int64(v)
-	case "status_4xx":
-		v, ok := val.(float64)
-		if !ok {
-			return fmt.Errorf("stat '%s' value expected int actual '%v' type %T", name, val, val)
-		}
-		stat.Status4xx.Value += int64(v)
-	case "status_5xx":
-		v, ok := val.(float64)
-		if !ok {
-			return fmt.Errorf("stat '%s' value expected int actual '%v' type %T", name, val, val)
-		}
-		stat.Status5xx.Value += int64(v)
-	case "out_bytes":
-		v, ok := val.(float64)
-		if !ok {
-			return fmt.Errorf("stat '%s' value expected int actual '%v' type %T", name, val, val)
-		}
-		stat.OutBytes.Value += int64(v)
-	case "is_available":
-		v, ok := val.(bool)
-		if !ok {
-			return fmt.Errorf("stat '%s' value expected bool actual '%v' type %T", name, val, val)
-		}
-		if v {
-			stat.IsAvailable.Value = true
-		}
-	case "in_bytes":
-		v, ok := val.(float64)
-		if !ok {
-			return fmt.Errorf("stat '%s' value expected int actual '%v' type %T", name, val, val)
-		}
-		stat.InBytes.Value += v
-	case "tps_2xx":
-		v, ok := val.(int64)
-		if !ok {
-			return fmt.Errorf("stat '%s' value expected int actual '%v' type %T", name, val, val)
-		}
-		stat.Tps2xx.Value += float64(v)
-	case "tps_3xx":
-		v, ok := val.(int64)
-		if !ok {
-			return fmt.Errorf("stat '%s' value expected int actual '%v' type %T", name, val, val)
-		}
-		stat.Tps3xx.Value += float64(v)
-	case "tps_4xx":
-		v, ok := val.(int64)
-		if !ok {
-			return fmt.Errorf("stat '%s' value expected int actual '%v' type %T", name, val, val)
-		}
-		stat.Tps4xx.Value += float64(v)
-	case "tps_5xx":
-		v, ok := val.(int64)
-		if !ok {
-			return fmt.Errorf("stat '%s' value expected int actual '%v' type %T", name, val, val)
-		}
-		stat.Tps5xx.Value += float64(v)
-	case "error_string":
-		v, ok := val.(string)
-		if !ok {
-			return fmt.Errorf("stat '%s' value expected string actual '%v' type %T", name, val, val)
-		}
-		stat.ErrorString.Value += v + ", "
-	case "tps_total":
-		v, ok := val.(float64)
-		if !ok {
-			return fmt.Errorf("stat '%s' value expected int actual '%v' type %T", name, val, val)
-		}
-		stat.TpsTotal.Value += v
-	case "status_unknown":
-		return dsdata.ErrNotProcessedStat
-	default:
-		return fmt.Errorf("unknown stat '%s'", name)
-	}
-	return nil
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/594b8517/traffic_monitor/experimental/traffic_monitor/cache/cache_test.go
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/traffic_monitor/cache/cache_test.go b/traffic_monitor/experimental/traffic_monitor/cache/cache_test.go
deleted file mode 100644
index 71e7a78..0000000
--- a/traffic_monitor/experimental/traffic_monitor/cache/cache_test.go
+++ /dev/null
@@ -1,91 +0,0 @@
-package cache
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import (
-	"encoding/json"
-	"net/url"
-	"testing"
-	"time"
-
-	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/enum"
-	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/peer"
-	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/srvhttp"
-	todata "github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/trafficopsdata"
-)
-
-func TestHandlerPrecompute(t *testing.T) {
-	if NewHandler().Precompute() {
-		t.Errorf("expected NewHandler().Precompute() false, actual true")
-	}
-	if !NewPrecomputeHandler(todata.NewThreadsafe(), peer.NewCRStatesPeersThreadsafe()).Precompute() {
-		t.Errorf("expected NewPrecomputeHandler().Precompute() true, actual false")
-	}
-}
-
-type DummyFilterNever struct {
-}
-
-func (f DummyFilterNever) UseStat(name string) bool {
-	return false
-}
-
-func (f DummyFilterNever) UseCache(name enum.CacheName) bool {
-	return false
-}
-
-func (f DummyFilterNever) WithinStatHistoryMax(i int) bool {
-	return false
-}
-
-func TestStatsMarshall(t *testing.T) {
-	hist := randResultHistory()
-	filter := DummyFilterNever{}
-	params := url.Values{}
-	beforeStatsMarshall := time.Now()
-	bytes, err := StatsMarshall(hist, filter, params)
-	afterStatsMarshall := time.Now()
-	if err != nil {
-		t.Fatalf("StatsMarshall return expected nil err, actual err: %v", err)
-	}
-	// if len(bytes) > 0 {
-	// 	t.Errorf("expected empty bytes, actual: %v", string(bytes))
-	// }
-
-	stats := Stats{}
-	if err := json.Unmarshal(bytes, &stats); err != nil {
-		t.Fatalf("unmarshalling expected nil err, actual err: %v", err)
-	}
-
-	if stats.CommonAPIData.QueryParams != "" {
-		t.Errorf(`unmarshalling stats.CommonAPIData.QueryParams expected "", actual %v`, stats.CommonAPIData.QueryParams)
-	}
-
-	statsDate, err := time.Parse(srvhttp.CommonAPIDataDateFormat, stats.CommonAPIData.DateStr)
-	if err != nil {
-		t.Errorf(`stats.CommonAPIData.DateStr expected format %v, actual %v`, srvhttp.CommonAPIDataDateFormat, stats.CommonAPIData.DateStr)
-	}
-	if beforeStatsMarshall.Round(time.Second).After(statsDate) || statsDate.After(afterStatsMarshall.Round(time.Second)) { // round to second, because CommonAPIDataDateFormat is second-precision
-		t.Errorf(`unmarshalling stats.CommonAPIData.DateStr expected between %v and %v, actual %v`, beforeStatsMarshall, afterStatsMarshall, stats.CommonAPIData.DateStr)
-	}
-	if len(stats.Caches) > 0 {
-		t.Errorf(`unmarshalling stats.Caches expected empty, actual %+v`, stats.Caches)
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/594b8517/traffic_monitor/experimental/traffic_monitor/cache/data.go
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/traffic_monitor/cache/data.go b/traffic_monitor/experimental/traffic_monitor/cache/data.go
deleted file mode 100644
index 81b938a..0000000
--- a/traffic_monitor/experimental/traffic_monitor/cache/data.go
+++ /dev/null
@@ -1,219 +0,0 @@
-package cache
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import (
-	"encoding/json"
-	"fmt"
-	"time"
-
-	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/enum"
-)
-
-// CacheAvailableStatusReported is the status string returned by caches set to "reported" in Traffic Ops.
-// TODO put somewhere more generic
-const AvailableStatusReported = "REPORTED"
-
-// CacheAvailableStatus is the available status of the given cache. It includes a boolean available/unavailable flag, and a descriptive string.
-type AvailableStatus struct {
-	Available bool
-	Status    string
-	Why       string
-	// UnavailableStat is the stat whose threshold made the cache unavailable. If this is the empty string, the cache is unavailable for a non-threshold reason. This exists so a poller (health, stat) won't mark an unavailable cache as available if the stat whose threshold was reached isn't available on that poller.
-	UnavailableStat string
-	// Poller is the name of the poller which set this available status
-	Poller string
-}
-
-// CacheAvailableStatuses is the available status of each cache.
-type AvailableStatuses map[enum.CacheName]AvailableStatus
-
-// Copy copies this CacheAvailableStatuses. It does not modify, and thus is safe for multiple reader goroutines.
-func (a AvailableStatuses) Copy() AvailableStatuses {
-	b := AvailableStatuses(map[enum.CacheName]AvailableStatus{})
-	for k, v := range a {
-		b[k] = v
-	}
-	return b
-}
-
-// ResultHistory is a map of cache names, to an array of result history from each cache.
-type ResultHistory map[enum.CacheName][]Result
-
-func copyResult(a []Result) []Result {
-	b := make([]Result, len(a), len(a))
-	copy(b, a)
-	return b
-}
-
-// Copy copies returns a deep copy of this ResultHistory
-func (a ResultHistory) Copy() ResultHistory {
-	b := ResultHistory{}
-	for k, v := range a {
-		b[k] = copyResult(v)
-	}
-	return b
-}
-
-// ResultStatHistory is a map[cache][statName]val
-type ResultStatHistory map[enum.CacheName]ResultStatValHistory
-
-type ResultStatValHistory map[string][]ResultStatVal
-
-// ResultStatVal is the value of an individual stat returned from a poll. Time is the time this stat was returned.
-// Span is the number of polls this stat has been the same. For example, if History is set to 100, and the last 50 polls had the same value for this stat (but none of the previous 50 were the same), this stat's map value slice will actually contain 51 entries, and the first entry will have the value, the time of the last poll, and a Span of 50. Assuming the poll time is every 8 seconds, users will then know, looking at the Span, that the value was unchanged for the last 50*8=400 seconds.
-// JSON values are all strings, for the TM1.0 /publish/CacheStats API.
-type ResultStatVal struct {
-	Val  interface{} `json:"value"`
-	Time time.Time   `json:"time"`
-	Span uint64      `json:"span"`
-}
-
-func (t *ResultStatVal) MarshalJSON() ([]byte, error) {
-	v := struct {
-		Val  string `json:"value"`
-		Time int64  `json:"time"`
-		Span uint64 `json:"span"`
-	}{
-		Val:  fmt.Sprintf("%v", t.Val),
-		Time: t.Time.UnixNano() / 1000000, // ms since the epoch
-		Span: t.Span,
-	}
-	return json.Marshal(&v)
-}
-
-func copyResultStatVals(a []ResultStatVal) []ResultStatVal {
-	b := make([]ResultStatVal, len(a), len(a))
-	copy(b, a)
-	return b
-}
-
-func copyResultStatValHistory(a ResultStatValHistory) ResultStatValHistory {
-	b := ResultStatValHistory{}
-	for k, v := range a {
-		b[k] = copyResultStatVals(v) // TODO determine if necessary
-	}
-	return b
-}
-
-func (a ResultStatHistory) Copy() ResultStatHistory {
-	b := ResultStatHistory{}
-	for k, v := range a {
-		b[k] = copyResultStatValHistory(v)
-	}
-	return b
-}
-
-func pruneStats(history []ResultStatVal, limit uint64) []ResultStatVal {
-	if uint64(len(history)) > limit {
-		history = history[:limit-1]
-	}
-	return history
-}
-
-func (a ResultStatHistory) Add(r Result, limit uint64) {
-	for statName, statVal := range r.Astats.Ats {
-		statHistory := a[r.ID][statName]
-		// If the new stat value is the same as the last, update the time and increment the span. Span is the number of polls the latest value has been the same, and hence the length of time it's been the same is span*pollInterval.
-		if len(statHistory) > 0 && statHistory[0].Val == statVal {
-			statHistory[0].Time = r.Time
-			statHistory[0].Span++
-		} else {
-			resultVal := ResultStatVal{
-				Val:  statVal,
-				Time: r.Time,
-				Span: 1,
-			}
-			statHistory = pruneStats(append([]ResultStatVal{resultVal}, statHistory...), limit)
-		}
-		if _, ok := a[r.ID]; !ok {
-			a[r.ID] = ResultStatValHistory{}
-		}
-		a[r.ID][statName] = statHistory // TODO determine if necessary for the first conditional
-	}
-}
-
-// TODO determine if anything ever needs more than the latest, and if not, change ResultInfo to not be a slice.
-type ResultInfoHistory map[enum.CacheName][]ResultInfo
-
-// ResultInfo contains all the non-stat result info. This includes the cache ID, any errors, the time of the poll, the request time duration, Astats System (Vitals), Poll ID, and Availability.
-type ResultInfo struct {
-	ID          enum.CacheName
-	Error       error
-	Time        time.Time
-	RequestTime time.Duration
-	Vitals      Vitals
-	System      AstatsSystem
-	PollID      uint64
-	Available   bool
-}
-
-func ToInfo(r Result) ResultInfo {
-	return ResultInfo{
-		ID:          r.ID,
-		Error:       r.Error,
-		Time:        r.Time,
-		RequestTime: r.RequestTime,
-		Vitals:      r.Vitals,
-		PollID:      r.PollID,
-		Available:   r.Available,
-		System:      r.Astats.System,
-	}
-}
-
-func copyResultInfos(a []ResultInfo) []ResultInfo {
-	b := make([]ResultInfo, len(a), len(a))
-	copy(b, a)
-	return b
-}
-
-func (a ResultInfoHistory) Copy() ResultInfoHistory {
-	b := ResultInfoHistory{}
-	for k, v := range a {
-		b[k] = copyResultInfos(v) // TODO determine if copy is necessary
-	}
-	return b
-}
-
-func pruneInfos(history []ResultInfo, limit uint64) []ResultInfo {
-	if uint64(len(history)) > limit {
-		history = history[:limit-1]
-	}
-	return history
-}
-
-func (a ResultInfoHistory) Add(r Result, limit uint64) {
-	a[r.ID] = pruneInfos(append([]ResultInfo{ToInfo(r)}, a[r.ID]...), limit)
-}
-
-// Kbpses is the kbps values of each cache.
-type Kbpses map[enum.CacheName]int64
-
-func (a Kbpses) Copy() Kbpses {
-	b := Kbpses{}
-	for k, v := range a {
-		b[k] = v
-	}
-	return b
-}
-
-func (a Kbpses) AddMax(r Result) {
-	a[r.ID] = r.PrecomputedData.MaxKbps
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/594b8517/traffic_monitor/experimental/traffic_monitor/cache/data_test.go
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/traffic_monitor/cache/data_test.go b/traffic_monitor/experimental/traffic_monitor/cache/data_test.go
deleted file mode 100644
index 72ee851..0000000
--- a/traffic_monitor/experimental/traffic_monitor/cache/data_test.go
+++ /dev/null
@@ -1,256 +0,0 @@
-package cache
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import (
-	"errors"
-	"fmt"
-	dsdata "github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/deliveryservicedata"
-	"github.com/apache/incubator-trafficcontrol/traffic_monitor/experimental/traffic_monitor/enum"
-	"math/rand"
-	"reflect"
-	"testing"
-	"time"
-)
-
-func randBool() bool {
-	return rand.Int()%2 == 0
-}
-
-func randStr() string {
-	chars := "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_"
-	num := 100
-	s := ""
-	for i := 0; i < num; i++ {
-		s += string(chars[rand.Intn(len(chars))])
-	}
-	return s
-}
-
-func randAvailableStatuses() AvailableStatuses {
-	a := AvailableStatuses{}
-	num := 100
-	for i := 0; i < num; i++ {
-		a[enum.CacheName(randStr())] = AvailableStatus{Available: randBool(), Status: randStr()}
-	}
-	return a
-}
-
-func TestAvailableStatusesCopy(t *testing.T) {
-	num := 100
-	for i := 0; i < num; i++ {
-		a := randAvailableStatuses()
-		b := a.Copy()
-
-		if !reflect.DeepEqual(a, b) {
-			t.Errorf("expected a and b DeepEqual, actual copied map not equal", a, b)
-		}
-
-		// verify a and b don't point to the same map
-		a[enum.CacheName(randStr())] = AvailableStatus{Available: randBool(), Status: randStr()}
-		if reflect.DeepEqual(a, b) {
-			t.Errorf("expected a != b, actual a and b point to the same map", a)
-		}
-	}
-}
-
-func randStrIfaceMap() map[string]interface{} {
-	m := map[string]interface{}{}
-	num := 5
-	for i := 0; i < num; i++ {
-		m[randStr()] = randStr()
-	}
-	return m
-}
-
-func randAstats() Astats {
-	return Astats{
-		Ats:    randStrIfaceMap(),
-		System: randAstatsSystem(),
-	}
-}
-
-func randAstatsSystem() AstatsSystem {
-	return AstatsSystem{
-		InfName:           randStr(),
-		InfSpeed:          rand.Int(),
-		ProcNetDev:        randStr(),
-		ProcLoadavg:       randStr(),
-		ConfigLoadRequest: rand.Int(),
-		LastReloadRequest: rand.Int(),
-		ConfigReloads:     rand.Int(),
-		LastReload:        rand.Int(),
-		AstatsLoad:        rand.Int(),
-	}
-}
-
-func randVitals() Vitals {
-	return Vitals{
-		LoadAvg:    rand.Float64(),
-		BytesOut:   rand.Int63(),
-		BytesIn:    rand.Int63(),
-		KbpsOut:    rand.Int63(),
-		MaxKbpsOut: rand.Int63(),
-	}
-}
-
-func randStatMeta() dsdata.StatMeta {
-	return dsdata.StatMeta{Time: rand.Int63()}
-}
-
-func randStatCacheStats() dsdata.StatCacheStats {
-	return dsdata.StatCacheStats{
-		OutBytes:    dsdata.StatInt{Value: rand.Int63(), StatMeta: randStatMeta()},
-		IsAvailable: dsdata.StatBool{Value: randBool(), StatMeta: randStatMeta()},
-		Status5xx:   dsdata.StatInt{Value: rand.Int63(), StatMeta: randStatMeta()},
-		Status4xx:   dsdata.StatInt{Value: rand.Int63(), StatMeta: randStatMeta()},
-		Status3xx:   dsdata.StatInt{Value: rand.Int63(), StatMeta: randStatMeta()},
-		Status2xx:   dsdata.StatInt{Value: rand.Int63(), StatMeta: randStatMeta()},
-		InBytes:     dsdata.StatFloat{Value: rand.Float64(), StatMeta: randStatMeta()},
-		Kbps:        dsdata.StatFloat{Value: rand.Float64(), StatMeta: randStatMeta()},
-		Tps5xx:      dsdata.StatFloat{Value: rand.Float64(), StatMeta: randStatMeta()},
-		Tps4xx:      dsdata.StatFloat{Value: rand.Float64(), StatMeta: randStatMeta()},
-		Tps3xx:      dsdata.StatFloat{Value: rand.Float64(), StatMeta: randStatMeta()},
-		Tps2xx:      dsdata.StatFloat{Value: rand.Float64(), StatMeta: randStatMeta()},
-		ErrorString: dsdata.StatString{Value: randStr(), StatMeta: randStatMeta()},
-		TpsTotal:    dsdata.StatInt{Value: rand.Int63(), StatMeta: randStatMeta()},
-	}
-}
-
-func randStatCommon() dsdata.StatCommon {
-	cachesReporting := map[enum.CacheName]bool{}
-	num := 5
-	for i := 0; i < num; i++ {
-		cachesReporting[enum.CacheName(randStr())] = randBool()
-	}
-	return dsdata.StatCommon{
-		CachesConfiguredNum: dsdata.StatInt{Value: rand.Int63(), StatMeta: randStatMeta()},
-		CachesReporting:     cachesReporting,
-		ErrorStr:            dsdata.StatString{Value: randStr(), StatMeta: randStatMeta()},
-		StatusStr:           dsdata.StatString{Value: randStr(), StatMeta: randStatMeta()},
-		IsHealthy:           dsdata.StatBool{Value: randBool(), StatMeta: randStatMeta()},
-		IsAvailable:         dsdata.StatBool{Value: randBool(), StatMeta: randStatMeta()},
-		CachesAvailableNum:  dsdata.StatInt{Value: rand.Int63(), StatMeta: randStatMeta()},
-	}
-}
-
-func randDsStat() dsdata.Stat {
-	num := 5
-	cacheGroups := map[enum.CacheGroupName]dsdata.StatCacheStats{}
-	types := map[enum.CacheType]dsdata.StatCacheStats{}
-	caches := map[enum.CacheName]dsdata.StatCacheStats{}
-	cachesTime := map[enum.CacheName]time.Time{}
-	for i := 0; i < num; i++ {
-		cacheGroups[enum.CacheGroupName(randStr())] = randStatCacheStats()
-		types[enum.CacheType(randStr())] = randStatCacheStats()
-		cachesTime[enum.CacheName(randStr())] = time.Now()
-	}
-
-	return dsdata.Stat{
-		CommonStats:        randStatCommon(),
-		CacheGroups:        cacheGroups,
-		Types:              types,
-		Caches:             caches,
-		CachesTimeReceived: cachesTime,
-		TotalStats:         randStatCacheStats(),
-	}
-}
-
-func randDsStats() map[enum.DeliveryServiceName]dsdata.Stat {
-	num := 5
-	a := map[enum.DeliveryServiceName]dsdata.Stat{}
-	for i := 0; i < num; i++ {
-		a[enum.DeliveryServiceName(randStr())] = randDsStat()
-	}
-	return a
-}
-func randErrs() []error {
-	if randBool() {
-		return []error{}
-	}
-	num := 5
-	errs := []error{}
-	for i := 0; i < num; i++ {
-		errs = append(errs, errors.New(randStr()))
-	}
-	return errs
-}
-
-func randPrecomputedData() PrecomputedData {
-	return PrecomputedData{
-		DeliveryServiceStats: randDsStats(),
-		OutBytes:             rand.Int63(),
-		MaxKbps:              rand.Int63(),
-		Errors:               randErrs(),
-		Reporting:            randBool(),
-	}
-}
-
-func randResult() Result {
-	return Result{
-		ID:              enum.CacheName(randStr()),
-		Error:           fmt.Errorf(randStr()),
-		Astats:          randAstats(),
-		Time:            time.Now(),
-		RequestTime:     time.Millisecond * time.Duration(rand.Int()),
-		Vitals:          randVitals(),
-		PollID:          uint64(rand.Int63()),
-		PollFinished:    make(chan uint64),
-		PrecomputedData: randPrecomputedData(),
-		Available:       randBool(),
-	}
-
-}
-
-func randResultSlice() []Result {
-	a := []Result{}
-	num := 5
-	for i := 0; i < num; i++ {
-		a = append(a, randResult())
-	}
-	return a
-}
-
-func randResultHistory() ResultHistory {
-	a := ResultHistory{}
-	num := 5
-	for i := 0; i < num; i++ {
-		a[enum.CacheName(randStr())] = randResultSlice()
-	}
-	return a
-}
-
-func TestResultHistoryCopy(t *testing.T) {
-	num := 5
-	for i := 0; i < num; i++ {
-		a := randResultHistory()
-		b := a.Copy()
-
-		if !reflect.DeepEqual(a, b) {
-			t.Errorf("expected a and b DeepEqual, actual copied map not equal", a, b)
-		}
-
-		// verify a and b don't point to the same map
-		a[enum.CacheName(randStr())] = randResultSlice()
-		if reflect.DeepEqual(a, b) {
-			t.Errorf("expected a != b, actual a and b point to the same map", a)
-		}
-	}
-}

http://git-wip-us.apache.org/repos/asf/incubator-trafficcontrol/blob/594b8517/traffic_monitor/experimental/traffic_monitor/config/config.go
----------------------------------------------------------------------
diff --git a/traffic_monitor/experimental/traffic_monitor/config/config.go b/traffic_monitor/experimental/traffic_monitor/config/config.go
deleted file mode 100644
index 1941ec6..0000000
--- a/traffic_monitor/experimental/traffic_monitor/config/config.go
+++ /dev/null
@@ -1,186 +0,0 @@
-package config
-
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-import (
-	"encoding/json"
-	"io/ioutil"
-	"time"
-)
-
-// LogLocation is a location to log to. This may be stdout, stderr, null (/dev/null), or a valid file path.
-type LogLocation string
-
-const (
-	// LogLocationStdout indicates the stdout IO stream
-	LogLocationStdout = "stdout"
-	// LogLocationStderr indicates the stderr IO stream
-	LogLocationStderr = "stderr"
-	// LogLocationNull indicates the null IO stream (/dev/null)
-	LogLocationNull = "null"
-	//StaticFileDir is the directory that contains static html and js files.
-	StaticFileDir = "/opt/traffic_monitor/static/"
-)
-
-// Config is the configuration for the application. It includes myriad data, such as polling intervals and log locations.
-type Config struct {
-	CacheHealthPollingInterval   time.Duration `json:"-"`
-	CacheStatPollingInterval     time.Duration `json:"-"`
-	MonitorConfigPollingInterval time.Duration `json:"-"`
-	HTTPTimeout                  time.Duration `json:"-"`
-	PeerPollingInterval          time.Duration `json:"-"`
-	PeerOptimistic               bool          `json:"peer_optimistic"`
-	MaxEvents                    uint64        `json:"max_events"`
-	MaxStatHistory               uint64        `json:"max_stat_history"`
-	MaxHealthHistory             uint64        `json:"max_health_history"`
-	HealthFlushInterval          time.Duration `json:"-"`
-	StatFlushInterval            time.Duration `json:"-"`
-	LogLocationError             string        `json:"log_location_error"`
-	LogLocationWarning           string        `json:"log_location_warning"`
-	LogLocationInfo              string        `json:"log_location_info"`
-	LogLocationDebug             string        `json:"log_location_debug"`
-	LogLocationEvent             string        `json:"log_location_event"`
-	ServeReadTimeout             time.Duration `json:"-"`
-	ServeWriteTimeout            time.Duration `json:"-"`
-	HealthToStatRatio            uint64        `json:"health_to_stat_ratio"`
-	HTTPPollNoSleep              bool          `json:"http_poll_no_sleep"`
-	StaticFileDir                string        `json:"static_file_dir"`
-}
-
-// DefaultConfig is the default configuration for the application, if no configuration file is given, or if a given config setting doesn't exist in the config file.
-var DefaultConfig = Config{
-	CacheHealthPollingInterval:   6 * time.Second,
-	CacheStatPollingInterval:     6 * time.Second,
-	MonitorConfigPollingInterval: 5 * time.Second,
-	HTTPTimeout:                  2 * time.Second,
-	PeerPollingInterval:          5 * time.Second,
-	PeerOptimistic:               true,
-	MaxEvents:                    200,
-	MaxStatHistory:               5,
-	MaxHealthHistory:             5,
-	HealthFlushInterval:          200 * time.Millisecond,
-	StatFlushInterval:            200 * time.Millisecond,
-	LogLocationError:             LogLocationStderr,
-	LogLocationWarning:           LogLocationStdout,
-	LogLocationInfo:              LogLocationNull,
-	LogLocationDebug:             LogLocationNull,
-	LogLocationEvent:             LogLocationStdout,
-	ServeReadTimeout:             10 * time.Second,
-	ServeWriteTimeout:            10 * time.Second,
-	HealthToStatRatio:            4,
-	HTTPPollNoSleep:              false,
-	StaticFileDir:                StaticFileDir,
-}
-
-// MarshalJSON marshals custom millisecond durations. Aliasing inspired by http://choly.ca/post/go-json-marshalling/
-func (c *Config) MarshalJSON() ([]byte, error) {
-	type Alias Config
-	return json.Marshal(&struct {
-		CacheHealthPollingIntervalMs   uint64 `json:"cache_health_polling_interval_ms"`
-		CacheStatPollingIntervalMs     uint64 `json:"cache_stat_polling_interval_ms"`
-		MonitorConfigPollingIntervalMs uint64 `json:"monitor_config_polling_interval_ms"`
-		HTTPTimeoutMS                  uint64 `json:"http_timeout_ms"`
-		PeerPollingIntervalMs          uint64 `json:"peer_polling_interval_ms"`
-		PeerOptimistic                 bool   `json:"peer_optimistic"`
-		HealthFlushIntervalMs          uint64 `json:"health_flush_interval_ms"`
-		StatFlushIntervalMs            uint64 `json:"stat_flush_interval_ms"`
-		ServeReadTimeoutMs             uint64 `json:"serve_read_timeout_ms"`
-		ServeWriteTimeoutMs            uint64 `json:"serve_write_timeout_ms"`
-		*Alias
-	}{
-		CacheHealthPollingIntervalMs:   uint64(c.CacheHealthPollingInterval / time.Millisecond),
-		CacheStatPollingIntervalMs:     uint64(c.CacheStatPollingInterval / time.Millisecond),
-		MonitorConfigPollingIntervalMs: uint64(c.MonitorConfigPollingInterval / time.Millisecond),
-		HTTPTimeoutMS:                  uint64(c.HTTPTimeout / time.Millisecond),
-		PeerPollingIntervalMs:          uint64(c.PeerPollingInterval / time.Millisecond),
-		PeerOptimistic:                 bool(true),
-		HealthFlushIntervalMs:          uint64(c.HealthFlushInterval / time.Millisecond),
-		StatFlushIntervalMs:            uint64(c.StatFlushInterval / time.Millisecond),
-		Alias:                          (*Alias)(c),
-	})
-}
-
-// UnmarshalJSON populates this config object from given JSON bytes.
-func (c *Config) UnmarshalJSON(data []byte) error {
-	type Alias Config
-	aux := &struct {
-		CacheHealthPollingIntervalMs   *uint64 `json:"cache_health_polling_interval_ms"`
-		CacheStatPollingIntervalMs     *uint64 `json:"cache_stat_polling_interval_ms"`
-		MonitorConfigPollingIntervalMs *uint64 `json:"monitor_config_polling_interval_ms"`
-		HTTPTimeoutMS                  *uint64 `json:"http_timeout_ms"`
-		PeerPollingIntervalMs          *uint64 `json:"peer_polling_interval_ms"`
-		PeerOptimistic                 *bool   `json:"peer_optimistic"`
-		HealthFlushIntervalMs          *uint64 `json:"health_flush_interval_ms"`
-		StatFlushIntervalMs            *uint64 `json:"stat_flush_interval_ms"`
-		ServeReadTimeoutMs             *uint64 `json:"serve_read_timeout_ms"`
-		ServeWriteTimeoutMs            *uint64 `json:"serve_write_timeout_ms"`
-		*Alias
-	}{
-		Alias: (*Alias)(c),
-	}
-	if err := json.Unmarshal(data, &aux); err != nil {
-		return err
-	}
-
-	if aux.CacheHealthPollingIntervalMs != nil {
-		c.CacheHealthPollingInterval = time.Duration(*aux.CacheHealthPollingIntervalMs) * time.Millisecond
-	}
-	if aux.CacheStatPollingIntervalMs != nil {
-		c.CacheStatPollingInterval = time.Duration(*aux.CacheStatPollingIntervalMs) * time.Millisecond
-	}
-	if aux.MonitorConfigPollingIntervalMs != nil {
-		c.MonitorConfigPollingInterval = time.Duration(*aux.MonitorConfigPollingIntervalMs) * time.Millisecond
-	}
-	if aux.HTTPTimeoutMS != nil {
-		c.HTTPTimeout = time.Duration(*aux.HTTPTimeoutMS) * time.Millisecond
-	}
-	if aux.PeerPollingIntervalMs != nil {
-		c.PeerPollingInterval = time.Duration(*aux.PeerPollingIntervalMs) * time.Millisecond
-	}
-	if aux.HealthFlushIntervalMs != nil {
-		c.HealthFlushInterval = time.Duration(*aux.HealthFlushIntervalMs) * time.Millisecond
-	}
-	if aux.StatFlushIntervalMs != nil {
-		c.StatFlushInterval = time.Duration(*aux.StatFlushIntervalMs) * time.Millisecond
-	}
-	if aux.ServeReadTimeoutMs != nil {
-		c.ServeReadTimeout = time.Duration(*aux.ServeReadTimeoutMs) * time.Millisecond
-	}
-	if aux.ServeWriteTimeoutMs != nil {
-		c.ServeWriteTimeout = time.Duration(*aux.ServeWriteTimeoutMs) * time.Millisecond
-	}
-	if aux.PeerOptimistic != nil {
-		c.PeerOptimistic = *aux.PeerOptimistic
-	}
-	return nil
-}
-
-// Load loads the given config file. If an empty string is passed, the default config is returned.
-func Load(fileName string) (Config, error) {
-	cfg := DefaultConfig
-	if fileName == "" {
-		return cfg, nil
-	}
-	configBytes, err := ioutil.ReadFile(fileName)
-	if err == nil {
-		err = json.Unmarshal(configBytes, &cfg)
-	}
-	return cfg, err
-}