You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficcontrol.apache.org by ro...@apache.org on 2021/11/02 22:56:51 UTC

[trafficcontrol] branch master updated: Adds support for querying Traffic Monitors via a caching Proxy server. (#6320)

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

rob 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 5cc9fd9  Adds support for querying Traffic Monitors via a caching Proxy server. (#6320)
5cc9fd9 is described below

commit 5cc9fd90f7425ee5ed2705d09d82f099a1d7eead
Author: John J. Rushford <jr...@apache.org>
AuthorDate: Tue Nov 2 16:56:40 2021 -0600

    Adds support for querying Traffic Monitors via a caching Proxy server. (#6320)
    
    - adds a tm-proxy-url config property
    - updates the traffic_monitor/tmclient to use an optional http.Transport
      object needed to support an Http Proxy.
---
 tc-health-client/README.md             | 16 +++++++++-------
 tc-health-client/config/config.go      | 18 ++++++++++++++++++
 tc-health-client/tc-health-client.json |  1 +
 tc-health-client/tmagent/tmagent.go    |  6 ++++++
 traffic_monitor/tmclient/tmclient.go   |  8 ++++++--
 5 files changed, 40 insertions(+), 9 deletions(-)

diff --git a/tc-health-client/README.md b/tc-health-client/README.md
index 326d68c..90702e9 100644
--- a/tc-health-client/README.md
+++ b/tc-health-client/README.md
@@ -1,9 +1,3 @@
-% tc-health-client(1) tc-health-client 6.1.0 | ATC tc-health-client Manual
-%
-% 2021-09-20
-% tc-health-client(1) tc-health-client 6.1.0 
-%
-% 2021-09-17
 <!--
     Licensed to the Apache Software Foundation (ASF) under one
     or more contributor license agreements.  See the NOTICE file
@@ -109,6 +103,7 @@ Sample configuarion file:
     "to-url": "https://tp.cdn.com:443", 
     "to-request-timeout-seconds": "5s",
     "tm-poll-interval-seconds": "60s",
+    "tm-proxy-url", "http://sample-http-proxy.cdn.net:80",
     "tm-update-cycles": 5,
     "trafficserver-config-dir": "/opt/trafficserver/etc/trafficserver",
     "trafficserver-bin-dir": "/opt/trafficserver/bin",
@@ -154,6 +149,13 @@ Sample configuarion file:
   The polling interval in seconds used to update **Traffic Server** parent
   status.
 
+### tm-proxy-url
+
+  If not nil, all Traffic Monitor requests will be proxied through this 
+  proxy endpoint.  This is useful when there are large numbers of caches
+  polling a Traffic Monitor and you wish to funnel queries through a caching
+  proxy server to limit direct direct connections to Traffic Monitor.
+
 ### tm-update-cycles
 
   Each time a polling cycle completes a count is incremented. When the count
@@ -181,4 +183,4 @@ Sample configuarion file:
 * Traffic Server **strategies.yaml**
 * Traffic Server **traffic_ctl** command
   
-   
\ No newline at end of file
+   
diff --git a/tc-health-client/config/config.go b/tc-health-client/config/config.go
index dd14e8b..e35f3d7 100644
--- a/tc-health-client/config/config.go
+++ b/tc-health-client/config/config.go
@@ -60,6 +60,7 @@ type Cfg struct {
 	TOPass                  string          `json:"to-pass"`
 	TOUrl                   string          `json:"to-url"`
 	TOUser                  string          `json:"to-user"`
+	TmProxyURL              string          `json:"tm-proxy-url"`
 	TmPollIntervalSeconds   string          `json:"tm-poll-interval-seconds"`
 	TmUpdateCycles          int             `json:"tm-update-cycles"`
 	TrafficServerConfigDir  string          `json:"trafficserver-config-dir"`
@@ -67,6 +68,7 @@ type Cfg struct {
 	TrafficMonitors         map[string]bool `json:"trafficmonitors,omitempty"`
 	HealthClientConfigFile  util.ConfigFile
 	CredentialFile          util.ConfigFile
+	ParsedProxyURL          *url.URL
 }
 
 type LogCfg struct {
@@ -328,6 +330,22 @@ func LoadConfig(cfg *Cfg) (bool, error) {
 		if cfg.TOCredentialFile != "" {
 			cfg.CredentialFile.Filename = cfg.TOCredentialFile
 		}
+
+		// if tm-proxy-url is set in the config, verify the proxy
+		// url
+		if cfg.TmProxyURL != "" {
+			if cfg.ParsedProxyURL, err = url.Parse(cfg.TmProxyURL); err != nil {
+				cfg.ParsedProxyURL = nil
+				return false, errors.New("parsing TmProxyUrl: " + err.Error())
+			}
+			if cfg.ParsedProxyURL.Port() == "" {
+				cfg.ParsedProxyURL = nil
+				return false, errors.New("TmProxyUrl invalid port specified")
+			}
+			log.Infof("TM queries will use the proxy: %s", cfg.TmProxyURL)
+		} else {
+			cfg.ParsedProxyURL = nil
+		}
 		updated = true
 	}
 	return updated, nil
diff --git a/tc-health-client/tc-health-client.json b/tc-health-client/tc-health-client.json
index 8df62f6..501f6b7 100644
--- a/tc-health-client/tc-health-client.json
+++ b/tc-health-client/tc-health-client.json
@@ -5,6 +5,7 @@
   "to-credential-file": "/etc/credentials",
   "to-url": "https://tp.cdn.com:443", 
   "to-request-timeout-seconds": "5s",
+  "tm-proxy-url":, "proxy.net:80",
   "tm-poll-interval-seconds": "15s",
   "tm-update-cycles": 5,
   "trafficserver-config-dir": "/opt/trafficserver/etc/trafficserver",
diff --git a/tc-health-client/tmagent/tmagent.go b/tc-health-client/tmagent/tmagent.go
index cc9710c..a922bf7 100644
--- a/tc-health-client/tmagent/tmagent.go
+++ b/tc-health-client/tmagent/tmagent.go
@@ -27,6 +27,7 @@ import (
 	"io/ioutil"
 	"math/rand"
 	"net"
+	"net/http"
 	"os"
 	"os/exec"
 	"path/filepath"
@@ -245,6 +246,11 @@ func (c *ParentInfo) GetCacheStatuses() (map[tc.CacheName]datareq.CacheStatus, e
 	}
 	tmc := tmclient.New("http://"+tmHostName, config.GetRequestTimeout())
 
+	// Use a proxy to query TM if the ProxyURL is set
+	if c.Cfg.ParsedProxyURL != nil {
+		tmc.Transport = &http.Transport{Proxy: http.ProxyURL(c.Cfg.ParsedProxyURL)}
+	}
+
 	return tmc.CacheStatuses()
 }
 
diff --git a/traffic_monitor/tmclient/tmclient.go b/traffic_monitor/tmclient/tmclient.go
index 732a52e..3837cd8 100644
--- a/traffic_monitor/tmclient/tmclient.go
+++ b/traffic_monitor/tmclient/tmclient.go
@@ -38,8 +38,9 @@ import (
 )
 
 type TMClient struct {
-	url     string
-	timeout time.Duration
+	url       string
+	timeout   time.Duration
+	Transport *http.Transport // optional http Transport
 }
 
 func New(url string, timeout time.Duration) *TMClient {
@@ -198,6 +199,9 @@ func (c *TMClient) ConfigDoc() (handler.OpsConfig, error) {
 func (c *TMClient) getBytes(path string) ([]byte, error) {
 	url := c.url + path
 	httpClient := http.Client{Timeout: c.timeout}
+	if c.Transport != nil {
+		httpClient.Transport = c.Transport
+	}
 	resp, err := httpClient.Get(url)
 	if err != nil {
 		return nil, errors.New("getting from '" + url + "': " + err.Error())