Skip to content

Commit

Permalink
add more detailed metrics (#379)
Browse files Browse the repository at this point in the history
* add more detailed metrics

* fix name of two metrics

* add space to some of sync metrics

* fix some spelling and cleanup some metrics

* async -> custom

* register missing metrics

* cleanup metrics names

* httpapi -> config
  • Loading branch information
mthenw committed Mar 1, 2018
1 parent 5b51ea0 commit 464619f
Show file tree
Hide file tree
Showing 6 changed files with 309 additions and 82 deletions.
5 changes: 4 additions & 1 deletion event/system.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ const SystemFunctionInvokingType = Type("gateway.function.invoking")

// SystemFunctionInvokingData struct.
type SystemFunctionInvokingData struct {
Space string `json:"space"`
FunctionID function.ID `json:"functionId"`
Event Event `json:"event"`
}
Expand All @@ -28,6 +29,7 @@ const SystemFunctionInvokedType = Type("gateway.function.invoked")

// SystemFunctionInvokedData struct.
type SystemFunctionInvokedData struct {
Space string `json:"space"`
FunctionID function.ID `json:"functionId"`
Event Event `json:"event"`
Result []byte `json:"result"`
Expand All @@ -38,7 +40,8 @@ const SystemFunctionInvocationFailedType = Type("gateway.function.invocationFail

// SystemFunctionInvocationFailedData struct.
type SystemFunctionInvocationFailedData struct {
Space string `json:"space"`
FunctionID function.ID `json:"functionId"`
Event Event `json:"event"`
Error []byte `json:"result"`
Error error `json:"result"`
}
2 changes: 1 addition & 1 deletion httpapi/config.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ var requestDuration = prometheus.NewHistogram(
Namespace: "gateway",
Subsystem: "config",
Name: "request_duration_seconds",
Help: "Bucketed histogram of request duration of config API requests",
Help: "Bucketed histogram of request duration of Config API requests",
Buckets: prometheus.ExponentialBuckets(0.0005, 2, 16),
})

Expand Down
60 changes: 45 additions & 15 deletions httpapi/httpapi.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,8 @@ func (h HTTPAPI) getFunction(w http.ResponseWriter, r *http.Request, params http
w.Header().Set("Content-Type", "application/json")
encoder := json.NewEncoder(w)

fn, err := h.Functions.GetFunction(params.ByName("space"), function.ID(params.ByName("id")))
space := params.ByName("space")
fn, err := h.Functions.GetFunction(space, function.ID(params.ByName("id")))
if err != nil {
if _, ok := err.(*function.ErrFunctionNotFound); ok {
w.WriteHeader(http.StatusNotFound)
Expand All @@ -60,19 +61,24 @@ func (h HTTPAPI) getFunction(w http.ResponseWriter, r *http.Request, params http
} else {
encoder.Encode(fn)
}

metricFunctionGetRequests.WithLabelValues(space).Inc()
}

func (h HTTPAPI) getFunctions(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
w.Header().Set("Content-Type", "application/json")
encoder := json.NewEncoder(w)

fns, err := h.Functions.GetFunctions(params.ByName("space"))
space := params.ByName("space")
fns, err := h.Functions.GetFunctions(space)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
encoder.Encode(&Response{Errors: []Error{{Message: err.Error()}}})
} else {
encoder.Encode(&FunctionsResponse{fns})
}

metricFunctionListRequests.WithLabelValues(space).Inc()
}

func (h HTTPAPI) registerFunction(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
Expand Down Expand Up @@ -100,11 +106,14 @@ func (h HTTPAPI) registerFunction(w http.ResponseWriter, r *http.Request, params
}

encoder.Encode(&Response{Errors: []Error{{Message: err.Error()}}})
return
} else {
w.WriteHeader(http.StatusCreated)
encoder.Encode(output)

metricFunctionRegistered.WithLabelValues(fn.Space).Inc()
}

w.WriteHeader(http.StatusCreated)
encoder.Encode(output)
metricFunctionRegisterRequests.WithLabelValues(fn.Space).Inc()
}

func (h HTTPAPI) updateFunction(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
Expand All @@ -120,8 +129,9 @@ func (h HTTPAPI) updateFunction(w http.ResponseWriter, r *http.Request, params h
return
}

space := params.ByName("space")
fn.ID = function.ID(params.ByName("id"))
output, err := h.Functions.UpdateFunction(params.ByName("space"), fn)
output, err := h.Functions.UpdateFunction(space, fn)
if err != nil {
if _, ok := err.(*function.ErrFunctionValidation); ok {
w.WriteHeader(http.StatusBadRequest)
Expand All @@ -132,17 +142,19 @@ func (h HTTPAPI) updateFunction(w http.ResponseWriter, r *http.Request, params h
}

encoder.Encode(&Response{Errors: []Error{{Message: err.Error()}}})
return
} else {
encoder.Encode(output)
}

encoder.Encode(output)
metricFunctionUpdateRequests.WithLabelValues(space).Inc()
}

func (h HTTPAPI) deleteFunction(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
w.Header().Set("Content-Type", "application/json")
encoder := json.NewEncoder(w)

err := h.Functions.DeleteFunction(params.ByName("space"), function.ID(params.ByName("id")))
space := params.ByName("space")
err := h.Functions.DeleteFunction(space, function.ID(params.ByName("id")))
if err != nil {
if _, ok := err.(*function.ErrFunctionNotFound); ok {
w.WriteHeader(http.StatusNotFound)
Expand All @@ -155,27 +167,35 @@ func (h HTTPAPI) deleteFunction(w http.ResponseWriter, r *http.Request, params h
encoder.Encode(&Response{Errors: []Error{{Message: err.Error()}}})
} else {
w.WriteHeader(http.StatusNoContent)

metricFunctionDeleted.WithLabelValues(space).Inc()
}

metricFunctionDeleteRequests.WithLabelValues(space).Inc()
}

func (h HTTPAPI) getSubscriptions(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
w.Header().Set("Content-Type", "application/json")
encoder := json.NewEncoder(w)

subs, err := h.Subscriptions.GetSubscriptions(params.ByName("space"))
space := params.ByName("space")
subs, err := h.Subscriptions.GetSubscriptions(space)
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
encoder.Encode(&Response{Errors: []Error{{Message: err.Error()}}})
} else {
encoder.Encode(&SubscriptionsResponse{subs})
}

metricSubscriptionListRequests.WithLabelValues(space).Inc()
}

func (h HTTPAPI) getSubscription(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
w.Header().Set("Content-Type", "application/json")
encoder := json.NewEncoder(w)

fn, err := h.Subscriptions.GetSubscription(params.ByName("space"), extractSubscriptionID(r.URL.RawPath))
space := params.ByName("space")
fn, err := h.Subscriptions.GetSubscription(space, extractSubscriptionID(r.URL.RawPath))
if err != nil {
if _, ok := err.(*subscription.ErrSubscriptionNotFound); ok {
w.WriteHeader(http.StatusNotFound)
Expand All @@ -187,6 +207,8 @@ func (h HTTPAPI) getSubscription(w http.ResponseWriter, r *http.Request, params
} else {
encoder.Encode(fn)
}

metricSubscriptionGetRequests.WithLabelValues(space).Inc()
}

func (h HTTPAPI) createSubscription(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
Expand Down Expand Up @@ -218,18 +240,22 @@ func (h HTTPAPI) createSubscription(w http.ResponseWriter, r *http.Request, para
}

encoder.Encode(&Response{Errors: []Error{{Message: err.Error()}}})
return
} else {
w.WriteHeader(http.StatusCreated)
encoder.Encode(output)

metricSubscriptionCreated.WithLabelValues(s.Space).Inc()
}

w.WriteHeader(http.StatusCreated)
encoder.Encode(output)
metricSubscriptionCreateRequests.WithLabelValues(s.Space).Inc()
}

func (h HTTPAPI) deleteSubscription(w http.ResponseWriter, r *http.Request, params httprouter.Params) {
w.Header().Set("Content-Type", "application/json")
encoder := json.NewEncoder(w)

err := h.Subscriptions.DeleteSubscription(params.ByName("space"), extractSubscriptionID(r.URL.RawPath))
space := params.ByName("space")
err := h.Subscriptions.DeleteSubscription(space, extractSubscriptionID(r.URL.RawPath))
if err != nil {
if _, ok := err.(*subscription.ErrSubscriptionNotFound); ok {
w.WriteHeader(http.StatusNotFound)
Expand All @@ -239,7 +265,11 @@ func (h HTTPAPI) deleteSubscription(w http.ResponseWriter, r *http.Request, para
encoder.Encode(&Response{Errors: []Error{{Message: err.Error()}}})
} else {
w.WriteHeader(http.StatusNoContent)

metricSubscriptionDeleted.WithLabelValues(space).Inc()
}

metricSubscriptionDeleteRequests.WithLabelValues(space).Inc()
}

// httprouter weirdness: params are based on Request.URL.Path, not Request.URL.RawPath
Expand Down
136 changes: 136 additions & 0 deletions httpapi/metrics.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,136 @@
package httpapi

import (
"github.com/prometheus/client_golang/prometheus"
)

func init() {
prometheus.MustRegister(metricFunctionRegistered)
prometheus.MustRegister(metricFunctionDeleted)

prometheus.MustRegister(metricFunctionGetRequests)
prometheus.MustRegister(metricFunctionRegisterRequests)
prometheus.MustRegister(metricFunctionDeleteRequests)
prometheus.MustRegister(metricFunctionUpdateRequests)
prometheus.MustRegister(metricFunctionListRequests)

prometheus.MustRegister(metricSubscriptionCreated)
prometheus.MustRegister(metricSubscriptionDeleted)

prometheus.MustRegister(metricSubscriptionGetRequests)
prometheus.MustRegister(metricSubscriptionCreateRequests)
prometheus.MustRegister(metricSubscriptionDeleteRequests)
prometheus.MustRegister(metricSubscriptionListRequests)
}

// Functions

var metricFunctionRegistered = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "gateway",
Subsystem: "functions",
Name: "registered_total",
Help: "Total of functions registered.",
}, []string{"space"})

var metricFunctionDeleted = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "gateway",
Subsystem: "functions",
Name: "deleted_total",
Help: "Total of functions deleted.",
}, []string{"space"})

// Functions Config API

var metricFunctionGetRequests = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "gateway",
Subsystem: "config",
Name: "function_get_requests_total",
Help: "Total of Config API get function requests.",
}, []string{"space"})

var metricFunctionRegisterRequests = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "gateway",
Subsystem: "config",
Name: "function_register_requests_total",
Help: "Total of Config API register function requests.",
}, []string{"space"})

var metricFunctionDeleteRequests = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "gateway",
Subsystem: "config",
Name: "function_delete_requests_total",
Help: "Total of Config API delete function requests.",
}, []string{"space"})

var metricFunctionUpdateRequests = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "gateway",
Subsystem: "config",
Name: "function_update_requests_total",
Help: "Total of Config API update function requests.",
}, []string{"space"})

var metricFunctionListRequests = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "gateway",
Subsystem: "config",
Name: "function_list_requests_total",
Help: "Total of Config API list functions requests.",
}, []string{"space"})

// Subscriptions

var metricSubscriptionCreated = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "gateway",
Subsystem: "subscriptions",
Name: "created_total",
Help: "Total of subscriptions created.",
}, []string{"space"})

var metricSubscriptionDeleted = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "gateway",
Subsystem: "subscriptions",
Name: "deleted_total",
Help: "Total of subscriptions deleted.",
}, []string{"space"})

// Subscriptions Config API

var metricSubscriptionGetRequests = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "gateway",
Subsystem: "config",
Name: "subscription_get_requests_total",
Help: "Total of Config API get subscription requests.",
}, []string{"space"})

var metricSubscriptionCreateRequests = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "gateway",
Subsystem: "config",
Name: "subscription_create_requests_total",
Help: "Total of Config API create subscription requests.",
}, []string{"space"})

var metricSubscriptionDeleteRequests = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "gateway",
Subsystem: "config",
Name: "subscription_delete_requests_total",
Help: "Total of Config API delete subscription requests.",
}, []string{"space"})

var metricSubscriptionListRequests = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "gateway",
Subsystem: "config",
Name: "subscription_list_requests_total",
Help: "Total of Config API list subscriptions requests.",
}, []string{"space"})

0 comments on commit 464619f

Please sign in to comment.