Merge remote-tracking branch 'base/master' into fix/collect-metrics-if-metrics-per-host-false

This commit is contained in:
Christian Hoffmeister 2020-03-13 07:17:49 +01:00
commit 19770f5b41
2674 changed files with 371760 additions and 171868 deletions

View file

@ -228,7 +228,7 @@ func (cm Controller) Collect(ch chan<- prometheus.Metric) {
// SetSSLExpireTime sets the expiration time of SSL Certificates
func (cm *Controller) SetSSLExpireTime(servers []*ingress.Server) {
for _, s := range servers {
if s.Hostname != "" && s.SSLCert.ExpireTime.Unix() > 0 {
if s.Hostname != "" && s.SSLCert != nil && s.SSLCert.ExpireTime.Unix() > 0 {
labels := make(prometheus.Labels, len(cm.labels)+1)
for k, v := range cm.labels {
labels[k] = v

View file

@ -80,13 +80,13 @@ func TestControllerCounters(t *testing.T) {
servers := []*ingress.Server{
{
Hostname: "demo",
SSLCert: ingress.SSLCert{
SSLCert: &ingress.SSLCert{
ExpireTime: t1,
},
},
{
Hostname: "invalid",
SSLCert: ingress.SSLCert{
SSLCert: &ingress.SSLCert{
ExpireTime: time.Unix(0, 0),
},
},
@ -135,13 +135,13 @@ func TestRemoveMetrics(t *testing.T) {
servers := []*ingress.Server{
{
Hostname: "demo",
SSLCert: ingress.SSLCert{
SSLCert: &ingress.SSLCert{
ExpireTime: t1,
},
},
{
Hostname: "invalid",
SSLCert: ingress.SSLCert{
SSLCert: &ingress.SSLCert{
ExpireTime: time.Unix(0, 0),
},
},

View file

@ -21,7 +21,6 @@ import (
"net"
"net/http"
"net/http/httptest"
"os"
"testing"
"time"
@ -97,7 +96,7 @@ func TestStatusCollector(t *testing.T) {
for _, c := range cases {
t.Run(c.name, func(t *testing.T) {
listener, err := net.Listen("unix", nginx.StatusSocket)
listener, err := net.Listen("tcp", fmt.Sprintf(":%v", nginx.StatusPort))
if err != nil {
t.Fatalf("crating unix listener: %s", err)
}
@ -145,7 +144,6 @@ func TestStatusCollector(t *testing.T) {
cm.Stop()
listener.Close()
os.Remove(nginx.StatusSocket)
})
}
}

View file

@ -38,6 +38,13 @@ type Stopable interface {
Stop()
}
func newBinaryNameMatcher(name, binary string) common.MatchNamer {
return BinaryNameMatcher{
Name: name,
Binary: binary,
}
}
// BinaryNameMatcher define a namer using the binary name
type BinaryNameMatcher struct {
Name string
@ -97,14 +104,11 @@ func NewNGINXProcess(pod, namespace, ingressClass string) (NGINXProcessCollector
return nil, err
}
nm := BinaryNameMatcher{
Name: name,
Binary: binary,
}
nm := newBinaryNameMatcher(name, binary)
p := namedProcess{
scrapeChan: make(chan scrapeRequest),
Grouper: proc.NewGrouper(nm, true, false, false),
Grouper: proc.NewGrouper(nm, true, false, false, false),
fs: fs,
}

View file

@ -22,6 +22,7 @@ import (
"io/ioutil"
"net"
"os"
"syscall"
jsoniter "github.com/json-iterator/go"
"github.com/prometheus/client_golang/prometheus"
@ -93,10 +94,17 @@ var (
}
)
// DefObjectives was removed in https://github.com/prometheus/client_golang/pull/262
// updating the library to latest version changed the output of the metrics
var defObjectives = map[float64]float64{0.5: 0.05, 0.9: 0.01, 0.99: 0.001}
// NewSocketCollector creates a new SocketCollector instance using
// the ingress watch namespace and class used by the controller
func NewSocketCollector(pod, namespace, class string, metricsPerHost bool) (*SocketCollector, error) {
socket := "/tmp/prometheus-nginx.socket"
// unix sockets must be unlink()ed before being used
_ = syscall.Unlink(socket)
listener, err := net.Listen("unix", socket)
if err != nil {
return nil, err
@ -169,7 +177,7 @@ func NewSocketCollector(pod, namespace, class string, metricsPerHost bool) (*Soc
Namespace: PrometheusNamespace,
ConstLabels: constLabels,
},
[]string{"ingress", "namespace", "status"},
[]string{"ingress", "namespace", "status", "service"},
),
bytesSent: prometheus.NewHistogramVec(
@ -189,6 +197,7 @@ func NewSocketCollector(pod, namespace, class string, metricsPerHost bool) (*Soc
Help: "Upstream service latency per Ingress",
Namespace: PrometheusNamespace,
ConstLabels: constLabels,
Objectives: defObjectives,
},
[]string{"ingress", "namespace", "service"},
),
@ -243,6 +252,7 @@ func (sc *SocketCollector) handleMessage(msg []byte) {
"namespace": stats.Namespace,
"ingress": stats.Ingress,
"status": stats.Status,
"service": stats.Service,
}
latencyLabels := prometheus.Labels{

View file

@ -18,9 +18,12 @@ package metric
import (
"os"
"sync/atomic"
"time"
"github.com/prometheus/client_golang/prometheus"
"k8s.io/klog"
"k8s.io/apimachinery/pkg/util/sets"
"k8s.io/ingress-nginx/internal/ingress"
"k8s.io/ingress-nginx/internal/ingress/annotations/class"
@ -153,6 +156,11 @@ func (c *collector) Stop() {
}
func (c *collector) SetSSLExpireTime(servers []*ingress.Server) {
if !isLeader() {
return
}
klog.V(2).Infof("Updating ssl expiration metrics.")
c.ingressController.SetSSLExpireTime(servers)
}
@ -162,11 +170,30 @@ func (c *collector) SetHosts(hosts sets.String) {
// OnStartedLeading indicates the pod was elected as the leader
func (c *collector) OnStartedLeading(electionID string) {
setLeader(true)
c.ingressController.OnStartedLeading(electionID)
}
// OnStoppedLeading indicates the pod stopped being the leader
func (c *collector) OnStoppedLeading(electionID string) {
setLeader(false)
c.ingressController.OnStoppedLeading(electionID)
c.ingressController.RemoveAllSSLExpireMetrics(c.registry)
}
var (
currentLeader uint32
)
func setLeader(leader bool) {
var i uint32
if leader {
i = 1
}
atomic.StoreUint32(&currentLeader, i)
}
func isLeader() bool {
return atomic.LoadUint32(&currentLeader) != 0
}