mirror of
				https://github.com/coredns/coredns.git
				synced 2025-10-30 17:53:21 -04:00 
			
		
		
		
	Add metric counting DNS-over-HTTPS responses (#5130)
Signed-off-by: Rudolf Schonecker <rudolf.schonecker@jamf.com>
This commit is contained in:
		
				
					committed by
					
						 GitHub
						GitHub
					
				
			
			
				
	
			
			
			
						parent
						
							e5626a77bb
						
					
				
				
					commit
					c121aaab34
				
			| @@ -10,6 +10,7 @@ import ( | |||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"github.com/coredns/caddy" | 	"github.com/coredns/caddy" | ||||||
|  | 	"github.com/coredns/coredns/plugin/metrics/vars" | ||||||
| 	"github.com/coredns/coredns/plugin/pkg/dnsutil" | 	"github.com/coredns/coredns/plugin/pkg/dnsutil" | ||||||
| 	"github.com/coredns/coredns/plugin/pkg/doh" | 	"github.com/coredns/coredns/plugin/pkg/doh" | ||||||
| 	"github.com/coredns/coredns/plugin/pkg/response" | 	"github.com/coredns/coredns/plugin/pkg/response" | ||||||
| @@ -128,12 +129,14 @@ func (s *ServerHTTPS) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |||||||
|  |  | ||||||
| 	if !s.validRequest(r) { | 	if !s.validRequest(r) { | ||||||
| 		http.Error(w, "", http.StatusNotFound) | 		http.Error(w, "", http.StatusNotFound) | ||||||
|  | 		s.countResponse(http.StatusNotFound) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	msg, err := doh.RequestToMsg(r) | 	msg, err := doh.RequestToMsg(r) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		http.Error(w, err.Error(), http.StatusBadRequest) | 		http.Error(w, err.Error(), http.StatusBadRequest) | ||||||
|  | 		s.countResponse(http.StatusBadRequest) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -157,6 +160,7 @@ func (s *ServerHTTPS) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |||||||
| 	// handler has not provided any response message. | 	// handler has not provided any response message. | ||||||
| 	if dw.Msg == nil { | 	if dw.Msg == nil { | ||||||
| 		http.Error(w, "No response", http.StatusInternalServerError) | 		http.Error(w, "No response", http.StatusInternalServerError) | ||||||
|  | 		s.countResponse(http.StatusInternalServerError) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -169,10 +173,15 @@ func (s *ServerHTTPS) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |||||||
| 	w.Header().Set("Cache-Control", fmt.Sprintf("max-age=%f", age.Seconds())) | 	w.Header().Set("Cache-Control", fmt.Sprintf("max-age=%f", age.Seconds())) | ||||||
| 	w.Header().Set("Content-Length", strconv.Itoa(len(buf))) | 	w.Header().Set("Content-Length", strconv.Itoa(len(buf))) | ||||||
| 	w.WriteHeader(http.StatusOK) | 	w.WriteHeader(http.StatusOK) | ||||||
|  | 	s.countResponse(http.StatusOK) | ||||||
|  |  | ||||||
| 	w.Write(buf) | 	w.Write(buf) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (s *ServerHTTPS) countResponse(status int) { | ||||||
|  | 	vars.HTTPSResponsesCount.WithLabelValues(s.Addr, strconv.Itoa(status)).Inc() | ||||||
|  | } | ||||||
|  |  | ||||||
| // Shutdown stops the server (non gracefully). | // Shutdown stops the server (non gracefully). | ||||||
| func (s *ServerHTTPS) Shutdown() error { | func (s *ServerHTTPS) Shutdown() error { | ||||||
| 	if s.httpsServer != nil { | 	if s.httpsServer != nil { | ||||||
|   | |||||||
| @@ -20,9 +20,10 @@ the following metrics are exported: | |||||||
| * `coredns_dns_do_requests_total{server, zone}` -  queries that have the DO bit set | * `coredns_dns_do_requests_total{server, zone}` -  queries that have the DO bit set | ||||||
| * `coredns_dns_response_size_bytes{server, zone, proto}` - response size in bytes. | * `coredns_dns_response_size_bytes{server, zone, proto}` - response size in bytes. | ||||||
| * `coredns_dns_responses_total{server, zone, rcode, plugin}` - response per zone, rcode and plugin. | * `coredns_dns_responses_total{server, zone, rcode, plugin}` - response per zone, rcode and plugin. | ||||||
|  | * `coredns_dns_https_responses_total{server, status}` - responses per server and http status code. | ||||||
| * `coredns_plugin_enabled{server, zone, name}` - indicates whether a plugin is enabled on per server and zone basis. | * `coredns_plugin_enabled{server, zone, name}` - indicates whether a plugin is enabled on per server and zone basis. | ||||||
|  |  | ||||||
| Each counter has a label `zone` which is the zonename used for the request/response. | Almost each counter has a label `zone` which is the zonename used for the request/response. | ||||||
|  |  | ||||||
| Extra labels used are: | Extra labels used are: | ||||||
|  |  | ||||||
| @@ -34,6 +35,11 @@ Extra labels used are: | |||||||
| * `type` which holds the query type. It holds most common types (A, AAAA, MX, SOA, CNAME, PTR, TXT, | * `type` which holds the query type. It holds most common types (A, AAAA, MX, SOA, CNAME, PTR, TXT, | ||||||
|   NS, SRV, DS, DNSKEY, RRSIG, NSEC, NSEC3, HTTPS, IXFR, AXFR and ANY) and "other" which lumps together all |   NS, SRV, DS, DNSKEY, RRSIG, NSEC, NSEC3, HTTPS, IXFR, AXFR and ANY) and "other" which lumps together all | ||||||
|   other types. |   other types. | ||||||
|  | * `status` which holds the https status code. Possible values are: | ||||||
|  |   * 200 - request is processed, | ||||||
|  |   * 404 - request has been rejected on validation, | ||||||
|  |   * 400 - request to dns message conversion failed, | ||||||
|  |   * 500 - processing ended up with no response.  | ||||||
| * the `plugin` label holds the name of the plugin that made the write to the client. If the server | * the `plugin` label holds the name of the plugin that made the write to the client. If the server | ||||||
|   did the write (on error for instance), the value is empty. |   did the write (on error for instance), the value is empty. | ||||||
|  |  | ||||||
|   | |||||||
| @@ -65,6 +65,13 @@ var ( | |||||||
| 		Name:      "plugin_enabled", | 		Name:      "plugin_enabled", | ||||||
| 		Help:      "A metric that indicates whether a plugin is enabled on per server and zone basis.", | 		Help:      "A metric that indicates whether a plugin is enabled on per server and zone basis.", | ||||||
| 	}, []string{"server", "zone", "name"}) | 	}, []string{"server", "zone", "name"}) | ||||||
|  |  | ||||||
|  | 	HTTPSResponsesCount = promauto.NewCounterVec(prometheus.CounterOpts{ | ||||||
|  | 		Namespace: plugin.Namespace, | ||||||
|  | 		Subsystem: subsystem, | ||||||
|  | 		Name:      "https_responses_total", | ||||||
|  | 		Help:      "Counter of DoH responses per server and http status code.", | ||||||
|  | 	}, []string{"server", "status"}) | ||||||
| ) | ) | ||||||
|  |  | ||||||
| const ( | const ( | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user