Using labels

This commit is contained in:
Diptanu Choudhury 2017-12-21 20:30:29 -08:00
parent 7f28391cbf
commit 294151c1ad
2 changed files with 47 additions and 21 deletions

View File

@ -12,7 +12,8 @@ import (
var durations = NewDurationFixer("interval", "timeout", "deregistercriticalserviceafter") var durations = NewDurationFixer("interval", "timeout", "deregistercriticalserviceafter")
func (s *HTTPServer) CatalogRegister(resp http.ResponseWriter, req *http.Request) (interface{}, error) { func (s *HTTPServer) CatalogRegister(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
metrics.IncrCounter([]string{"client", "api", "catalog_register"}, 1) metrics.IncrCounterWithLabels([]string{"client", "api", "catalog_register"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
if req.Method != "PUT" { if req.Method != "PUT" {
return nil, MethodNotAllowedError{req.Method, []string{"PUT"}} return nil, MethodNotAllowedError{req.Method, []string{"PUT"}}
} }
@ -33,15 +34,18 @@ func (s *HTTPServer) CatalogRegister(resp http.ResponseWriter, req *http.Request
// Forward to the servers // Forward to the servers
var out struct{} var out struct{}
if err := s.agent.RPC("Catalog.Register", &args, &out); err != nil { if err := s.agent.RPC("Catalog.Register", &args, &out); err != nil {
metrics.IncrCounter([]string{"client", "rpc", "error", "catalog_register"}, 1) metrics.IncrCounterWithLabels([]string{"client", "rpc", "error", "catalog_register"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
return nil, err return nil, err
} }
metrics.IncrCounter([]string{"client", "api", "success", "catalog_register"}, 1) metrics.IncrCounterWithLabels([]string{"client", "api", "success", "catalog_register"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
return true, nil return true, nil
} }
func (s *HTTPServer) CatalogDeregister(resp http.ResponseWriter, req *http.Request) (interface{}, error) { func (s *HTTPServer) CatalogDeregister(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
metrics.IncrCounter([]string{"client", "api", "catalog_deregister"}, 1) metrics.IncrCounterWithLabels([]string{"client", "api", "catalog_deregister"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
if req.Method != "PUT" { if req.Method != "PUT" {
return nil, MethodNotAllowedError{req.Method, []string{"PUT"}} return nil, MethodNotAllowedError{req.Method, []string{"PUT"}}
} }
@ -62,30 +66,36 @@ func (s *HTTPServer) CatalogDeregister(resp http.ResponseWriter, req *http.Reque
// Forward to the servers // Forward to the servers
var out struct{} var out struct{}
if err := s.agent.RPC("Catalog.Deregister", &args, &out); err != nil { if err := s.agent.RPC("Catalog.Deregister", &args, &out); err != nil {
metrics.IncrCounter([]string{"client", "rpc", "error", "catalog_deregister"}, 1) metrics.IncrCounterWithLabels([]string{"client", "rpc", "error", "catalog_deregister"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
return nil, err return nil, err
} }
metrics.IncrCounter([]string{"client", "api", "success", "catalog_deregister"}, 1) metrics.IncrCounterWithLabels([]string{"client", "api", "success", "catalog_deregister"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
return true, nil return true, nil
} }
func (s *HTTPServer) CatalogDatacenters(resp http.ResponseWriter, req *http.Request) (interface{}, error) { func (s *HTTPServer) CatalogDatacenters(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
metrics.IncrCounter([]string{"client", "api", "catalog_datacenters"}, 1) metrics.IncrCounterWithLabels([]string{"client", "api", "catalog_datacenters"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
if req.Method != "GET" { if req.Method != "GET" {
return nil, MethodNotAllowedError{req.Method, []string{"GET"}} return nil, MethodNotAllowedError{req.Method, []string{"GET"}}
} }
var out []string var out []string
if err := s.agent.RPC("Catalog.ListDatacenters", struct{}{}, &out); err != nil { if err := s.agent.RPC("Catalog.ListDatacenters", struct{}{}, &out); err != nil {
metrics.IncrCounter([]string{"client", "rpc", "error", "catalog_datacenters"}, 1) metrics.IncrCounterWithLabels([]string{"client", "rpc", "error", "catalog_datacenters"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
return nil, err return nil, err
} }
metrics.IncrCounter([]string{"client", "api", "success", "catalog_datacenters"}, 1) metrics.IncrCounterWithLabels([]string{"client", "api", "success", "catalog_datacenters"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
return out, nil return out, nil
} }
func (s *HTTPServer) CatalogNodes(resp http.ResponseWriter, req *http.Request) (interface{}, error) { func (s *HTTPServer) CatalogNodes(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
metrics.IncrCounter([]string{"client", "api", "catalog_nodes"}, 1) metrics.IncrCounterWithLabels([]string{"client", "api", "catalog_nodes"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
if req.Method != "GET" { if req.Method != "GET" {
return nil, MethodNotAllowedError{req.Method, []string{"GET"}} return nil, MethodNotAllowedError{req.Method, []string{"GET"}}
} }
@ -95,7 +105,8 @@ func (s *HTTPServer) CatalogNodes(resp http.ResponseWriter, req *http.Request) (
s.parseSource(req, &args.Source) s.parseSource(req, &args.Source)
args.NodeMetaFilters = s.parseMetaFilter(req) args.NodeMetaFilters = s.parseMetaFilter(req)
if done := s.parse(resp, req, &args.Datacenter, &args.QueryOptions); done { if done := s.parse(resp, req, &args.Datacenter, &args.QueryOptions); done {
metrics.IncrCounter([]string{"client", "rpc", "error", "catalog_nodes"}, 1) metrics.IncrCounterWithLabels([]string{"client", "rpc", "error", "catalog_nodes"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
return nil, nil return nil, nil
} }
@ -110,12 +121,14 @@ func (s *HTTPServer) CatalogNodes(resp http.ResponseWriter, req *http.Request) (
if out.Nodes == nil { if out.Nodes == nil {
out.Nodes = make(structs.Nodes, 0) out.Nodes = make(structs.Nodes, 0)
} }
metrics.IncrCounter([]string{"client", "api", "success", "catalog_nodes"}, 1) metrics.IncrCounterWithLabels([]string{"client", "api", "success", "catalog_nodes"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
return out.Nodes, nil return out.Nodes, nil
} }
func (s *HTTPServer) CatalogServices(resp http.ResponseWriter, req *http.Request) (interface{}, error) { func (s *HTTPServer) CatalogServices(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
metrics.IncrCounter([]string{"client", "api", "catalog_services"}, 1) metrics.IncrCounterWithLabels([]string{"client", "api", "catalog_services"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
if req.Method != "GET" { if req.Method != "GET" {
return nil, MethodNotAllowedError{req.Method, []string{"GET"}} return nil, MethodNotAllowedError{req.Method, []string{"GET"}}
} }
@ -130,7 +143,8 @@ func (s *HTTPServer) CatalogServices(resp http.ResponseWriter, req *http.Request
var out structs.IndexedServices var out structs.IndexedServices
defer setMeta(resp, &out.QueryMeta) defer setMeta(resp, &out.QueryMeta)
if err := s.agent.RPC("Catalog.ListServices", &args, &out); err != nil { if err := s.agent.RPC("Catalog.ListServices", &args, &out); err != nil {
metrics.IncrCounter([]string{"client", "rpc", "error", "catalog_services"}, 1) metrics.IncrCounterWithLabels([]string{"client", "rpc", "error", "catalog_services"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
return nil, err return nil, err
} }
@ -138,12 +152,14 @@ func (s *HTTPServer) CatalogServices(resp http.ResponseWriter, req *http.Request
if out.Services == nil { if out.Services == nil {
out.Services = make(structs.Services, 0) out.Services = make(structs.Services, 0)
} }
metrics.IncrCounter([]string{"client", "api", "success", "catalog_services"}, 1) metrics.IncrCounterWithLabels([]string{"client", "api", "success", "catalog_services"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
return out.Services, nil return out.Services, nil
} }
func (s *HTTPServer) CatalogServiceNodes(resp http.ResponseWriter, req *http.Request) (interface{}, error) { func (s *HTTPServer) CatalogServiceNodes(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
metrics.IncrCounter([]string{"client", "api", "catalog_service_nodes"}, 1) metrics.IncrCounterWithLabels([]string{"client", "api", "catalog_service_nodes"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
if req.Method != "GET" { if req.Method != "GET" {
return nil, MethodNotAllowedError{req.Method, []string{"GET"}} return nil, MethodNotAllowedError{req.Method, []string{"GET"}}
} }
@ -175,7 +191,8 @@ func (s *HTTPServer) CatalogServiceNodes(resp http.ResponseWriter, req *http.Req
var out structs.IndexedServiceNodes var out structs.IndexedServiceNodes
defer setMeta(resp, &out.QueryMeta) defer setMeta(resp, &out.QueryMeta)
if err := s.agent.RPC("Catalog.ServiceNodes", &args, &out); err != nil { if err := s.agent.RPC("Catalog.ServiceNodes", &args, &out); err != nil {
metrics.IncrCounter([]string{"client", "rpc", "error", "catalog_service_nodes"}, 1) metrics.IncrCounterWithLabels([]string{"client", "rpc", "error", "catalog_service_nodes"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
return nil, err return nil, err
} }
s.agent.TranslateAddresses(args.Datacenter, out.ServiceNodes) s.agent.TranslateAddresses(args.Datacenter, out.ServiceNodes)
@ -189,12 +206,14 @@ func (s *HTTPServer) CatalogServiceNodes(resp http.ResponseWriter, req *http.Req
s.ServiceTags = make([]string, 0) s.ServiceTags = make([]string, 0)
} }
} }
metrics.IncrCounter([]string{"client", "api", "success", "catalog_service_nodes"}, 1) metrics.IncrCounterWithLabels([]string{"client", "api", "success", "catalog_service_nodes"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
return out.ServiceNodes, nil return out.ServiceNodes, nil
} }
func (s *HTTPServer) CatalogNodeServices(resp http.ResponseWriter, req *http.Request) (interface{}, error) { func (s *HTTPServer) CatalogNodeServices(resp http.ResponseWriter, req *http.Request) (interface{}, error) {
metrics.IncrCounter([]string{"client", "api", "catalog_node_services"}, 1) metrics.IncrCounterWithLabels([]string{"client", "api", "catalog_node_services"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
if req.Method != "GET" { if req.Method != "GET" {
return nil, MethodNotAllowedError{req.Method, []string{"GET"}} return nil, MethodNotAllowedError{req.Method, []string{"GET"}}
} }
@ -217,7 +236,8 @@ func (s *HTTPServer) CatalogNodeServices(resp http.ResponseWriter, req *http.Req
var out structs.IndexedNodeServices var out structs.IndexedNodeServices
defer setMeta(resp, &out.QueryMeta) defer setMeta(resp, &out.QueryMeta)
if err := s.agent.RPC("Catalog.NodeServices", &args, &out); err != nil { if err := s.agent.RPC("Catalog.NodeServices", &args, &out); err != nil {
metrics.IncrCounter([]string{"client", "rpc", "error", "catalog_node_services"}, 1) metrics.IncrCounterWithLabels([]string{"client", "rpc", "error", "catalog_node_services"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
return nil, err return nil, err
} }
if out.NodeServices != nil && out.NodeServices.Node != nil { if out.NodeServices != nil && out.NodeServices.Node != nil {
@ -232,6 +252,7 @@ func (s *HTTPServer) CatalogNodeServices(resp http.ResponseWriter, req *http.Req
} }
} }
} }
metrics.IncrCounter([]string{"client", "api", "success", "catalog_node_services"}, 1) metrics.IncrCounterWithLabels([]string{"client", "api", "success", "catalog_node_services"}, 1,
[]metrics.Label{{Name: "node", Value: s.nodeName()}})
return out.NodeServices, nil return out.NodeServices, nil
} }

View File

@ -139,6 +139,11 @@ func (s *HTTPServer) handler(enableDebug bool) http.Handler {
} }
} }
// nodeName returns the node name of the agent
func (s *HTTPServer) nodeName() string {
return s.agent.config.NodeName
}
// aclEndpointRE is used to find old ACL endpoints that take tokens in the URL // aclEndpointRE is used to find old ACL endpoints that take tokens in the URL
// so that we can redact them. The ACL endpoints that take the token in the URL // so that we can redact them. The ACL endpoints that take the token in the URL
// are all of the form /v1/acl/<verb>/<token>, and can optionally include query // are all of the form /v1/acl/<verb>/<token>, and can optionally include query