Add a flag to make per-host metrics optional
When serving many hosts from one nginx, the metrics may become too numerous for Prometheus. Add a flag to disable the host label, so that metrics are totalled across all hosts.
This commit is contained in:
parent
63b01370e4
commit
f33a2090dd
6 changed files with 23 additions and 9 deletions
|
|
@ -87,7 +87,8 @@ type Configuration struct {
|
|||
|
||||
EnableProfiling bool
|
||||
|
||||
EnableMetrics bool
|
||||
EnableMetrics bool
|
||||
MetricsPerHost bool
|
||||
|
||||
EnableSSLChainCompletion bool
|
||||
|
||||
|
|
|
|||
|
|
@ -76,12 +76,12 @@ type SocketCollector struct {
|
|||
metricMapping map[string]interface{}
|
||||
|
||||
hosts sets.String
|
||||
|
||||
metricsPerHost bool
|
||||
}
|
||||
|
||||
var (
|
||||
requestTags = []string{
|
||||
"host",
|
||||
|
||||
"status",
|
||||
|
||||
"method",
|
||||
|
|
@ -95,7 +95,7 @@ var (
|
|||
|
||||
// NewSocketCollector creates a new SocketCollector instance using
|
||||
// the ingress watch namespace and class used by the controller
|
||||
func NewSocketCollector(pod, namespace, class string) (*SocketCollector, error) {
|
||||
func NewSocketCollector(pod, namespace, class string, metricsPerHost bool) (*SocketCollector, error) {
|
||||
socket := "/tmp/prometheus-nginx.socket"
|
||||
listener, err := net.Listen("unix", socket)
|
||||
if err != nil {
|
||||
|
|
@ -113,9 +113,16 @@ func NewSocketCollector(pod, namespace, class string) (*SocketCollector, error)
|
|||
"controller_pod": pod,
|
||||
}
|
||||
|
||||
requestTags := requestTags
|
||||
if metricsPerHost {
|
||||
requestTags = append(requestTags, "host")
|
||||
}
|
||||
|
||||
sc := &SocketCollector{
|
||||
listener: listener,
|
||||
|
||||
metricsPerHost: metricsPerHost,
|
||||
|
||||
responseTime: prometheus.NewHistogramVec(
|
||||
prometheus.HistogramOpts{
|
||||
Name: "response_duration_seconds",
|
||||
|
|
@ -219,8 +226,8 @@ func (sc *SocketCollector) handleMessage(msg []byte) {
|
|||
continue
|
||||
}
|
||||
|
||||
// Note these must match the order in requestTags at the top
|
||||
requestLabels := prometheus.Labels{
|
||||
"host": stats.Host,
|
||||
"status": stats.Status,
|
||||
"method": stats.Method,
|
||||
"path": stats.Path,
|
||||
|
|
@ -228,6 +235,9 @@ func (sc *SocketCollector) handleMessage(msg []byte) {
|
|||
"ingress": stats.Ingress,
|
||||
"service": stats.Service,
|
||||
}
|
||||
if sc.metricsPerHost {
|
||||
requestLabels["host"] = stats.Host
|
||||
}
|
||||
|
||||
collectorLabels := prometheus.Labels{
|
||||
"namespace": stats.Namespace,
|
||||
|
|
|
|||
|
|
@ -288,7 +288,7 @@ func TestCollector(t *testing.T) {
|
|||
t.Run(c.name, func(t *testing.T) {
|
||||
registry := prometheus.NewPedanticRegistry()
|
||||
|
||||
sc, err := NewSocketCollector("pod", "default", "ingress")
|
||||
sc, err := NewSocketCollector("pod", "default", "ingress", true)
|
||||
if err != nil {
|
||||
t.Errorf("%v: unexpected error creating new SocketCollector: %v", c.name, err)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -59,7 +59,7 @@ type collector struct {
|
|||
}
|
||||
|
||||
// NewCollector creates a new metric collector the for ingress controller
|
||||
func NewCollector(statusPort int, registry *prometheus.Registry) (Collector, error) {
|
||||
func NewCollector(statusPort int, metricsPerHost bool, registry *prometheus.Registry) (Collector, error) {
|
||||
podNamespace := os.Getenv("POD_NAMESPACE")
|
||||
if podNamespace == "" {
|
||||
podNamespace = "default"
|
||||
|
|
@ -77,7 +77,7 @@ func NewCollector(statusPort int, registry *prometheus.Registry) (Collector, err
|
|||
return nil, err
|
||||
}
|
||||
|
||||
s, err := collectors.NewSocketCollector(podName, podNamespace, class.IngressClass)
|
||||
s, err := collectors.NewSocketCollector(podName, podNamespace, class.IngressClass, metricsPerHost)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue