Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
78 changes: 77 additions & 1 deletion Gopkg.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

5 changes: 0 additions & 5 deletions Gopkg.toml
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,6 @@ required = [ "k8s.io/code-generator/cmd/client-gen", "k8s.io/gengo/types", "gith
non-go = false
unused-packages = false

[[constraint]]
name = "github.com/golang/glog"
revision = "3c92600d7533018d216b534fe894ad60a1e6d5bf"
source = "https://github.com/openshift/golang-glog.git"

[[constraint]]
name = "github.com/google/uuid"
revision = "8c31c18f31ede9fc8eae72290a7e7a8064e9b3e3"
Expand Down
12 changes: 11 additions & 1 deletion docs/dev/metrics.md
Original file line number Diff line number Diff line change
Expand Up @@ -55,4 +55,14 @@ cluster_version_payload{type="pending",version="4.0.3"} 1
# HELP cluster_operator_payload_errors Report the number of errors encountered applying the image.
# TYPE cluster_operator_payload_errors gauge
cluster_operator_payload_errors{version="4.0.3"} 10
```
```

Metrics about the installation:

`cluster_installer` records information about the installation process. The type is either "openshift-install", indicating that `openshift-install` was used to install the cluster (IPI) or "", indicating that an unknown process installed the cluster (UPI). When `openshift-install` creates a cluster, it will also report its version and invoker. The version is helpful for determining exactly which builds are being used to install (e.g. were they official builds or had they been modified). The invoker is "user" by default, but it may be overridden by a consuming tool (e.g. Hive, CI).

```
# TYPE cluster_installer gauge
cluster_installer{type="openshift-install",invoker="user",version="unreleased-master-1209-gfd08f44181f2111486749e2fb38399088f315cfb"} 1
cluster_installer{type="",invoker="",version=""} 1
```
15 changes: 11 additions & 4 deletions pkg/cvo/cvo.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,11 @@ import (
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
utilruntime "k8s.io/apimachinery/pkg/util/runtime"
"k8s.io/apimachinery/pkg/util/wait"
informerscorev1 "k8s.io/client-go/informers/core/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/kubernetes/scheme"
coreclientsetv1 "k8s.io/client-go/kubernetes/typed/core/v1"
listerscorev1 "k8s.io/client-go/listers/core/v1"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/cache"
"k8s.io/client-go/tools/record"
Expand All @@ -35,8 +37,9 @@ import (
"github.com/openshift/cluster-version-operator/lib/resourceapply"
"github.com/openshift/cluster-version-operator/lib/resourcebuilder"
"github.com/openshift/cluster-version-operator/lib/validation"
"github.com/openshift/cluster-version-operator/pkg/cvo/internal"
cvointernal "github.com/openshift/cluster-version-operator/pkg/cvo/internal"
"github.com/openshift/cluster-version-operator/pkg/cvo/internal/dynamicclient"
"github.com/openshift/cluster-version-operator/pkg/internal"
"github.com/openshift/cluster-version-operator/pkg/payload"
)

Expand Down Expand Up @@ -101,6 +104,7 @@ type Operator struct {

cvLister configlistersv1.ClusterVersionLister
coLister configlistersv1.ClusterOperatorLister
cmLister listerscorev1.ConfigMapNamespaceLister
proxyLister configlistersv1.ProxyLister
cacheSynced []cache.InformerSynced

Expand Down Expand Up @@ -136,6 +140,7 @@ func New(
minimumInterval time.Duration,
cvInformer configinformersv1.ClusterVersionInformer,
coInformer configinformersv1.ClusterOperatorInformer,
cmInformer informerscorev1.ConfigMapInformer,
proxyInformer configinformersv1.ProxyInformer,
client clientset.Interface,
kubeClient kubernetes.Interface,
Expand Down Expand Up @@ -175,6 +180,8 @@ func New(
optr.cvLister = cvInformer.Lister()
optr.cacheSynced = append(optr.cacheSynced, cvInformer.Informer().HasSynced)

optr.cmLister = cmInformer.Lister().ConfigMaps(internal.ConfigNamespace)

if enableMetrics {
if err := optr.registerMetrics(coInformer.Informer()); err != nil {
panic(err)
Expand Down Expand Up @@ -515,7 +522,7 @@ type resourceBuilder struct {
burstConfig *rest.Config
modifier resourcebuilder.MetaV1ObjectModifierFunc

clusterOperators internal.ClusterOperatorsGetter
clusterOperators cvointernal.ClusterOperatorsGetter
}

// NewResourceBuilder creates the default resource builder implementation.
Expand All @@ -534,7 +541,7 @@ func (b *resourceBuilder) builderFor(m *lib.Manifest, state payload.State) (reso
}

if b.clusterOperators != nil && m.GVK == configv1.SchemeGroupVersion.WithKind("ClusterOperator") {
return internal.NewClusterOperatorBuilder(b.clusterOperators, *m), nil
return cvointernal.NewClusterOperatorBuilder(b.clusterOperators, *m), nil
}
if resourcebuilder.Mapper.Exists(m.GVK) {
return resourcebuilder.New(resourcebuilder.Mapper, config, *m)
Expand All @@ -543,7 +550,7 @@ func (b *resourceBuilder) builderFor(m *lib.Manifest, state payload.State) (reso
if err != nil {
return nil, err
}
return internal.NewGenericBuilder(client, *m)
return cvointernal.NewGenericBuilder(client, *m)
}

func (b *resourceBuilder) Apply(ctx context.Context, m *lib.Manifest, state payload.State) error {
Expand Down
22 changes: 22 additions & 0 deletions pkg/cvo/cvo_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import (
"github.com/google/uuid"
apiextv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1"
apiextclientv1 "k8s.io/apiextensions-apiserver/pkg/client/clientset/clientset/typed/apiextensions/v1beta1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/labels"
Expand Down Expand Up @@ -152,6 +153,27 @@ func (r *coLister) Get(name string) (*configv1.ClusterOperator, error) {
return nil, errors.NewNotFound(schema.GroupResource{}, name)
}

type cmLister struct {
Err error
Items []*corev1.ConfigMap
}

func (l *cmLister) List(selector labels.Selector) ([]*corev1.ConfigMap, error) {
return l.Items, l.Err
}

func (l *cmLister) Get(name string) (*corev1.ConfigMap, error) {
if l.Err != nil {
return nil, l.Err
}
for _, cm := range l.Items {
if cm.Name == name {
return cm, nil
}
}
return nil, errors.NewNotFound(schema.GroupResource{}, name)
}

type crdLister struct {
Err error
Items []*apiextv1beta1.CustomResourceDefinition
Expand Down
29 changes: 29 additions & 0 deletions pkg/cvo/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package cvo
import (
"time"

apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/util/sets"

"github.com/prometheus/client_golang/prometheus"
Expand All @@ -13,6 +14,7 @@ import (
configv1 "github.com/openshift/api/config/v1"

"github.com/openshift/cluster-version-operator/lib/resourcemerge"
"github.com/openshift/cluster-version-operator/pkg/internal"
)

func (optr *Operator) registerMetrics(coInformer cache.SharedInformer) error {
Expand All @@ -33,6 +35,7 @@ type operatorMetrics struct {
clusterOperatorUp *prometheus.GaugeVec
clusterOperatorConditions *prometheus.GaugeVec
clusterOperatorConditionTransitions *prometheus.GaugeVec
clusterInstaller *prometheus.GaugeVec
}

func newOperatorMetrics(optr *Operator) *operatorMetrics {
Expand Down Expand Up @@ -78,6 +81,10 @@ version for 'cluster', or empty for 'initial'.
Name: "cluster_operator_condition_transitions",
Help: "Reports the number of times that a condition on a cluster operator changes status",
}, []string{"name", "condition"}),
clusterInstaller: prometheus.NewGaugeVec(prometheus.GaugeOpts{
Name: "cluster_installer",
Help: "Reports info about the installation process and, if applicable, the install tool.",
}, []string{"type", "version", "invoker"}),
}
}

Expand Down Expand Up @@ -127,6 +134,7 @@ func (m *operatorMetrics) Describe(ch chan<- *prometheus.Desc) {
ch <- m.clusterOperatorUp.WithLabelValues("", "").Desc()
ch <- m.clusterOperatorConditions.WithLabelValues("", "", "").Desc()
ch <- m.clusterOperatorConditionTransitions.WithLabelValues("", "").Desc()
ch <- m.clusterInstaller.WithLabelValues("", "", "").Desc()
}

func (m *operatorMetrics) Collect(ch chan<- prometheus.Metric) {
Expand Down Expand Up @@ -269,6 +277,27 @@ func (m *operatorMetrics) Collect(ch chan<- prometheus.Metric) {
g.Set(float64(value))
ch <- g
}

installer, err := m.optr.cmLister.Get(internal.InstallerConfigMap)
if err == nil {
version := "<missing>"
invoker := "<missing>"

if v, ok := installer.Data["version"]; ok {
version = v
}
if i, ok := installer.Data["invoker"]; ok {
invoker = i
}

g := m.clusterInstaller.WithLabelValues("openshift-install", version, invoker)
g.Set(1.0)
ch <- g
} else if apierrors.IsNotFound(err) {
g := m.clusterInstaller.WithLabelValues("", "", "")
g.Set(1.0)
ch <- g
}
}

// mostRecentTimestamp finds the most recent change recorded to the status and
Expand Down
Loading