podmonitor
Change-Id: Ie79dc54cb137c9d054f93dfc53b46f75a1470ea5
This commit is contained in:
parent
cc5d82883c
commit
f59f1e4d0c
20
api/monitoring/v1/groupversion_info.go
Executable file
20
api/monitoring/v1/groupversion_info.go
Executable file
@ -0,0 +1,20 @@
|
|||||||
|
// Package v1 contains API Schema definitions for the infrastructure v1 API group
|
||||||
|
// +kubebuilder:object:generate=true
|
||||||
|
// +groupName=monitoring.coreos.com
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/scheme"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
// GroupVersion is group version used to register these objects
|
||||||
|
GroupVersion = schema.GroupVersion{Group: "monitoring.coreos.com", Version: "v1"}
|
||||||
|
|
||||||
|
// SchemeBuilder is used to add go types to the GroupVersionKind scheme
|
||||||
|
SchemeBuilder = &scheme.Builder{GroupVersion: GroupVersion}
|
||||||
|
|
||||||
|
// AddToScheme adds the types in this group-version to the given scheme.
|
||||||
|
AddToScheme = SchemeBuilder.AddToScheme
|
||||||
|
)
|
133
api/monitoring/v1/monitor_types.go
Executable file
133
api/monitoring/v1/monitor_types.go
Executable file
@ -0,0 +1,133 @@
|
|||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/util/intstr"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
Version = "v1"
|
||||||
|
|
||||||
|
PodMonitorsKind = "PodMonitor"
|
||||||
|
PodMonitorName = "podmonitors"
|
||||||
|
PodMonitorKindKey = "podmonitor"
|
||||||
|
)
|
||||||
|
|
||||||
|
// PodMonitor defines monitoring for a set of pods.
|
||||||
|
// +genclient
|
||||||
|
// +k8s:openapi-gen=true
|
||||||
|
|
||||||
|
// +kubebuilder:object:root=true
|
||||||
|
type PodMonitor struct {
|
||||||
|
metav1.TypeMeta `json:",inline"`
|
||||||
|
metav1.ObjectMeta `json:"metadata,omitempty"`
|
||||||
|
// Specification of desired Pod selection for target discovery by Prometheus.
|
||||||
|
Spec PodMonitorSpec `json:"spec"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// PodMonitorSpec contains specification parameters for a PodMonitor.
|
||||||
|
// +k8s:openapi-gen=true
|
||||||
|
type PodMonitorSpec struct {
|
||||||
|
// The label to use to retrieve the job name from.
|
||||||
|
JobLabel string `json:"jobLabel,omitempty"`
|
||||||
|
// PodTargetLabels transfers labels on the Kubernetes Pod onto the target.
|
||||||
|
PodTargetLabels []string `json:"podTargetLabels,omitempty"`
|
||||||
|
// A list of endpoints allowed as part of this PodMonitor.
|
||||||
|
PodMetricsEndpoints []PodMetricsEndpoint `json:"podMetricsEndpoints"`
|
||||||
|
// Selector to select Pod objects.
|
||||||
|
Selector metav1.LabelSelector `json:"selector"`
|
||||||
|
// Selector to select which namespaces the Endpoints objects are discovered from.
|
||||||
|
NamespaceSelector NamespaceSelector `json:"namespaceSelector,omitempty"`
|
||||||
|
// SampleLimit defines per-scrape limit on number of scraped samples that will be accepted.
|
||||||
|
SampleLimit uint64 `json:"sampleLimit,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// PodMonitorList is a list of PodMonitors.
|
||||||
|
// +k8s:openapi-gen=true
|
||||||
|
|
||||||
|
// +kubebuilder:object:root=true
|
||||||
|
type PodMonitorList struct {
|
||||||
|
metav1.TypeMeta `json:",inline"`
|
||||||
|
// Standard list metadata
|
||||||
|
// More info: https://github.com/kubernetes/community/blob/master/contributors/devel/sig-architecture/api-conventions.md#metadata
|
||||||
|
metav1.ListMeta `json:"metadata,omitempty"`
|
||||||
|
// List of PodMonitors
|
||||||
|
Items []*PodMonitor `json:"items"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// RelabelConfig allows dynamic rewriting of the label set, being applied to samples before ingestion.
|
||||||
|
// It defines `<metric_relabel_configs>`-section of Prometheus configuration.
|
||||||
|
// More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs
|
||||||
|
// +k8s:openapi-gen=true
|
||||||
|
type RelabelConfig struct {
|
||||||
|
//The source labels select values from existing labels. Their content is concatenated
|
||||||
|
//using the configured separator and matched against the configured regular expression
|
||||||
|
//for the replace, keep, and drop actions.
|
||||||
|
SourceLabels []string `json:"sourceLabels,omitempty"`
|
||||||
|
//Separator placed between concatenated source label values. default is ';'.
|
||||||
|
Separator string `json:"separator,omitempty"`
|
||||||
|
//Label to which the resulting value is written in a replace action.
|
||||||
|
//It is mandatory for replace actions. Regex capture groups are available.
|
||||||
|
TargetLabel string `json:"targetLabel,omitempty"`
|
||||||
|
//Regular expression against which the extracted value is matched. Default is '(.*)'
|
||||||
|
Regex string `json:"regex,omitempty"`
|
||||||
|
// Modulus to take of the hash of the source label values.
|
||||||
|
Modulus uint64 `json:"modulus,omitempty"`
|
||||||
|
//Replacement value against which a regex replace is performed if the
|
||||||
|
//regular expression matches. Regex capture groups are available. Default is '$1'
|
||||||
|
Replacement string `json:"replacement,omitempty"`
|
||||||
|
// Action to perform based on regex matching. Default is 'replace'
|
||||||
|
Action string `json:"action,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// PodMetricsEndpoint defines a scrapeable endpoint of a Kubernetes Pod serving Prometheus metrics.
|
||||||
|
// +k8s:openapi-gen=true
|
||||||
|
type PodMetricsEndpoint struct {
|
||||||
|
// Name of the pod port this endpoint refers to. Mutually exclusive with targetPort.
|
||||||
|
Port string `json:"port,omitempty"`
|
||||||
|
// Deprecated: Use 'port' instead.
|
||||||
|
TargetPort *intstr.IntOrString `json:"targetPort,omitempty"`
|
||||||
|
// HTTP path to scrape for metrics.
|
||||||
|
Path string `json:"path,omitempty"`
|
||||||
|
// HTTP scheme to use for scraping.
|
||||||
|
Scheme string `json:"scheme,omitempty"`
|
||||||
|
// Optional HTTP URL parameters
|
||||||
|
Params map[string][]string `json:"params,omitempty"`
|
||||||
|
// Interval at which metrics should be scraped
|
||||||
|
Interval string `json:"interval,omitempty"`
|
||||||
|
// Timeout after which the scrape is ended
|
||||||
|
ScrapeTimeout string `json:"scrapeTimeout,omitempty"`
|
||||||
|
// HonorLabels chooses the metric's labels on collisions with target labels.
|
||||||
|
HonorLabels bool `json:"honorLabels,omitempty"`
|
||||||
|
// HonorTimestamps controls whether Prometheus respects the timestamps present in scraped data.
|
||||||
|
HonorTimestamps *bool `json:"honorTimestamps,omitempty"`
|
||||||
|
// MetricRelabelConfigs to apply to samples before ingestion.
|
||||||
|
MetricRelabelConfigs []*RelabelConfig `json:"metricRelabelings,omitempty"`
|
||||||
|
// RelabelConfigs to apply to samples before ingestion.
|
||||||
|
// More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config
|
||||||
|
RelabelConfigs []*RelabelConfig `json:"relabelings,omitempty"`
|
||||||
|
// ProxyURL eg http://proxyserver:2195 Directs scrapes to proxy through this endpoint.
|
||||||
|
ProxyURL *string `json:"proxyUrl,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// NamespaceSelector is a selector for selecting either all namespaces or a
|
||||||
|
// list of namespaces.
|
||||||
|
// +k8s:openapi-gen=true
|
||||||
|
type NamespaceSelector struct {
|
||||||
|
// Boolean describing whether all namespaces are selected in contrast to a
|
||||||
|
// list restricting them.
|
||||||
|
Any bool `json:"any,omitempty"`
|
||||||
|
// List of namespace names.
|
||||||
|
MatchNames []string `json:"matchNames,omitempty"`
|
||||||
|
|
||||||
|
// TODO(fabxc): this should embed metav1.LabelSelector eventually.
|
||||||
|
// Currently the selector is only used for namespaces which require more complex
|
||||||
|
// implementation to support label selections.
|
||||||
|
}
|
||||||
|
|
||||||
|
// +kubebuilder:rbac:groups=monitoring.coreos.com,resources=podmonitors,verbs=get;list;watch;create;update;patch;delete
|
||||||
|
// +kubebuilder:rbac:groups=monitoring.coreos.com,resources=podmonitors/status,verbs=get;update;patch
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
SchemeBuilder.Register(&PodMonitor{}, &PodMonitorList{})
|
||||||
|
}
|
224
api/monitoring/v1/zz_generated.deepcopy.go
Executable file
224
api/monitoring/v1/zz_generated.deepcopy.go
Executable file
@ -0,0 +1,224 @@
|
|||||||
|
// +build !ignore_autogenerated
|
||||||
|
|
||||||
|
/*
|
||||||
|
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Code generated by controller-gen. DO NOT EDIT.
|
||||||
|
|
||||||
|
package v1
|
||||||
|
|
||||||
|
import (
|
||||||
|
runtime "k8s.io/apimachinery/pkg/runtime"
|
||||||
|
"k8s.io/apimachinery/pkg/util/intstr"
|
||||||
|
)
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *NamespaceSelector) DeepCopyInto(out *NamespaceSelector) {
|
||||||
|
*out = *in
|
||||||
|
if in.MatchNames != nil {
|
||||||
|
in, out := &in.MatchNames, &out.MatchNames
|
||||||
|
*out = make([]string, len(*in))
|
||||||
|
copy(*out, *in)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new NamespaceSelector.
|
||||||
|
func (in *NamespaceSelector) DeepCopy() *NamespaceSelector {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(NamespaceSelector)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *PodMetricsEndpoint) DeepCopyInto(out *PodMetricsEndpoint) {
|
||||||
|
*out = *in
|
||||||
|
if in.TargetPort != nil {
|
||||||
|
in, out := &in.TargetPort, &out.TargetPort
|
||||||
|
*out = new(intstr.IntOrString)
|
||||||
|
**out = **in
|
||||||
|
}
|
||||||
|
if in.Params != nil {
|
||||||
|
in, out := &in.Params, &out.Params
|
||||||
|
*out = make(map[string][]string, len(*in))
|
||||||
|
for key, val := range *in {
|
||||||
|
var outVal []string
|
||||||
|
if val == nil {
|
||||||
|
(*out)[key] = nil
|
||||||
|
} else {
|
||||||
|
in, out := &val, &outVal
|
||||||
|
*out = make([]string, len(*in))
|
||||||
|
copy(*out, *in)
|
||||||
|
}
|
||||||
|
(*out)[key] = outVal
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if in.HonorTimestamps != nil {
|
||||||
|
in, out := &in.HonorTimestamps, &out.HonorTimestamps
|
||||||
|
*out = new(bool)
|
||||||
|
**out = **in
|
||||||
|
}
|
||||||
|
if in.MetricRelabelConfigs != nil {
|
||||||
|
in, out := &in.MetricRelabelConfigs, &out.MetricRelabelConfigs
|
||||||
|
*out = make([]*RelabelConfig, len(*in))
|
||||||
|
for i := range *in {
|
||||||
|
if (*in)[i] != nil {
|
||||||
|
in, out := &(*in)[i], &(*out)[i]
|
||||||
|
*out = new(RelabelConfig)
|
||||||
|
(*in).DeepCopyInto(*out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if in.RelabelConfigs != nil {
|
||||||
|
in, out := &in.RelabelConfigs, &out.RelabelConfigs
|
||||||
|
*out = make([]*RelabelConfig, len(*in))
|
||||||
|
for i := range *in {
|
||||||
|
if (*in)[i] != nil {
|
||||||
|
in, out := &(*in)[i], &(*out)[i]
|
||||||
|
*out = new(RelabelConfig)
|
||||||
|
(*in).DeepCopyInto(*out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if in.ProxyURL != nil {
|
||||||
|
in, out := &in.ProxyURL, &out.ProxyURL
|
||||||
|
*out = new(string)
|
||||||
|
**out = **in
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodMetricsEndpoint.
|
||||||
|
func (in *PodMetricsEndpoint) DeepCopy() *PodMetricsEndpoint {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(PodMetricsEndpoint)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *PodMonitor) DeepCopyInto(out *PodMonitor) {
|
||||||
|
*out = *in
|
||||||
|
out.TypeMeta = in.TypeMeta
|
||||||
|
in.ObjectMeta.DeepCopyInto(&out.ObjectMeta)
|
||||||
|
in.Spec.DeepCopyInto(&out.Spec)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodMonitor.
|
||||||
|
func (in *PodMonitor) DeepCopy() *PodMonitor {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(PodMonitor)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
|
||||||
|
func (in *PodMonitor) DeepCopyObject() runtime.Object {
|
||||||
|
if c := in.DeepCopy(); c != nil {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *PodMonitorList) DeepCopyInto(out *PodMonitorList) {
|
||||||
|
*out = *in
|
||||||
|
out.TypeMeta = in.TypeMeta
|
||||||
|
in.ListMeta.DeepCopyInto(&out.ListMeta)
|
||||||
|
if in.Items != nil {
|
||||||
|
in, out := &in.Items, &out.Items
|
||||||
|
*out = make([]*PodMonitor, len(*in))
|
||||||
|
for i := range *in {
|
||||||
|
if (*in)[i] != nil {
|
||||||
|
in, out := &(*in)[i], &(*out)[i]
|
||||||
|
*out = new(PodMonitor)
|
||||||
|
(*in).DeepCopyInto(*out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodMonitorList.
|
||||||
|
func (in *PodMonitorList) DeepCopy() *PodMonitorList {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(PodMonitorList)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyObject is an autogenerated deepcopy function, copying the receiver, creating a new runtime.Object.
|
||||||
|
func (in *PodMonitorList) DeepCopyObject() runtime.Object {
|
||||||
|
if c := in.DeepCopy(); c != nil {
|
||||||
|
return c
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *PodMonitorSpec) DeepCopyInto(out *PodMonitorSpec) {
|
||||||
|
*out = *in
|
||||||
|
if in.PodTargetLabels != nil {
|
||||||
|
in, out := &in.PodTargetLabels, &out.PodTargetLabels
|
||||||
|
*out = make([]string, len(*in))
|
||||||
|
copy(*out, *in)
|
||||||
|
}
|
||||||
|
if in.PodMetricsEndpoints != nil {
|
||||||
|
in, out := &in.PodMetricsEndpoints, &out.PodMetricsEndpoints
|
||||||
|
*out = make([]PodMetricsEndpoint, len(*in))
|
||||||
|
for i := range *in {
|
||||||
|
(*in)[i].DeepCopyInto(&(*out)[i])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
in.Selector.DeepCopyInto(&out.Selector)
|
||||||
|
in.NamespaceSelector.DeepCopyInto(&out.NamespaceSelector)
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PodMonitorSpec.
|
||||||
|
func (in *PodMonitorSpec) DeepCopy() *PodMonitorSpec {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(PodMonitorSpec)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopyInto is an autogenerated deepcopy function, copying the receiver, writing into out. in must be non-nil.
|
||||||
|
func (in *RelabelConfig) DeepCopyInto(out *RelabelConfig) {
|
||||||
|
*out = *in
|
||||||
|
if in.SourceLabels != nil {
|
||||||
|
in, out := &in.SourceLabels, &out.SourceLabels
|
||||||
|
*out = make([]string, len(*in))
|
||||||
|
copy(*out, *in)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new RelabelConfig.
|
||||||
|
func (in *RelabelConfig) DeepCopy() *RelabelConfig {
|
||||||
|
if in == nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
out := new(RelabelConfig)
|
||||||
|
in.DeepCopyInto(out)
|
||||||
|
return out
|
||||||
|
}
|
0
api/v1alpha1/groupversion_info.go
Normal file → Executable file
0
api/v1alpha1/groupversion_info.go
Normal file → Executable file
0
api/v1alpha1/mcrouter_types.go
Normal file → Executable file
0
api/v1alpha1/mcrouter_types.go
Normal file → Executable file
0
api/v1alpha1/memcached_types.go
Normal file → Executable file
0
api/v1alpha1/memcached_types.go
Normal file → Executable file
0
api/v1alpha1/zz_generated.deepcopy.go
Normal file → Executable file
0
api/v1alpha1/zz_generated.deepcopy.go
Normal file → Executable file
68
builders/pod_metrics_endpoint.go
Executable file
68
builders/pod_metrics_endpoint.go
Executable file
@ -0,0 +1,68 @@
|
|||||||
|
package builders
|
||||||
|
|
||||||
|
import (
|
||||||
|
"k8s.io/apimachinery/pkg/util/intstr"
|
||||||
|
monitoringv1 "opendev.org/vexxhost/openstack-operator/api/monitoring/v1"
|
||||||
|
)
|
||||||
|
|
||||||
|
// PodMetricsEndpointBuilder provides an interface to build podmonitors
|
||||||
|
type PodMetricsEndpointBuilder struct {
|
||||||
|
obj *monitoringv1.PodMetricsEndpoint
|
||||||
|
}
|
||||||
|
|
||||||
|
// PodMonitor returns a new podmonitor builder
|
||||||
|
func PodMetricsEndpoint() *PodMetricsEndpointBuilder {
|
||||||
|
podMetricsEndpoint := &monitoringv1.PodMetricsEndpoint{}
|
||||||
|
return &PodMetricsEndpointBuilder{
|
||||||
|
obj: podMetricsEndpoint,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pme *PodMetricsEndpointBuilder) Port(port string) *PodMetricsEndpointBuilder {
|
||||||
|
pme.obj.Port = port
|
||||||
|
return pme
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pme *PodMetricsEndpointBuilder) TargetPort(targetPort intstr.IntOrString) *PodMetricsEndpointBuilder {
|
||||||
|
pme.obj.TargetPort = &targetPort
|
||||||
|
return pme
|
||||||
|
}
|
||||||
|
func (pme *PodMetricsEndpointBuilder) Path(path string) *PodMetricsEndpointBuilder {
|
||||||
|
pme.obj.Path = path
|
||||||
|
return pme
|
||||||
|
}
|
||||||
|
func (pme *PodMetricsEndpointBuilder) Scheme(scheme string) *PodMetricsEndpointBuilder {
|
||||||
|
pme.obj.Scheme = scheme
|
||||||
|
return pme
|
||||||
|
}
|
||||||
|
func (pme *PodMetricsEndpointBuilder) Params(params map[string][]string) *PodMetricsEndpointBuilder {
|
||||||
|
pme.obj.Params = params
|
||||||
|
return pme
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pme *PodMetricsEndpointBuilder) Interval(interval string) *PodMetricsEndpointBuilder {
|
||||||
|
pme.obj.Interval = interval
|
||||||
|
return pme
|
||||||
|
}
|
||||||
|
func (pme *PodMetricsEndpointBuilder) ScrapeTimeout(scrapeTimeout string) *PodMetricsEndpointBuilder {
|
||||||
|
pme.obj.ScrapeTimeout = scrapeTimeout
|
||||||
|
return pme
|
||||||
|
}
|
||||||
|
func (pme *PodMetricsEndpointBuilder) HonorLabels(honorLabels bool) *PodMetricsEndpointBuilder {
|
||||||
|
pme.obj.HonorLabels = honorLabels
|
||||||
|
return pme
|
||||||
|
}
|
||||||
|
func (pme *PodMetricsEndpointBuilder) HonorTimestamps(honorTimestamps bool) *PodMetricsEndpointBuilder {
|
||||||
|
pme.obj.HonorTimestamps = &honorTimestamps
|
||||||
|
return pme
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pme *PodMetricsEndpointBuilder) ProxyURL(proxyURL string) *PodMetricsEndpointBuilder {
|
||||||
|
pme.obj.ProxyURL = &proxyURL
|
||||||
|
return pme
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build returns the object after making certain assertions
|
||||||
|
func (pme *PodMetricsEndpointBuilder) Build() (monitoringv1.PodMetricsEndpoint, error) {
|
||||||
|
return *pme.obj, nil
|
||||||
|
}
|
92
builders/pod_monitor.go
Executable file
92
builders/pod_monitor.go
Executable file
@ -0,0 +1,92 @@
|
|||||||
|
package builders
|
||||||
|
|
||||||
|
import (
|
||||||
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
||||||
|
"k8s.io/apimachinery/pkg/runtime"
|
||||||
|
monitoringv1 "opendev.org/vexxhost/openstack-operator/api/monitoring/v1"
|
||||||
|
|
||||||
|
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
|
||||||
|
)
|
||||||
|
|
||||||
|
// PodMonitorBuilder provides an interface to build podmonitors
|
||||||
|
type PodMonitorBuilder struct {
|
||||||
|
obj *monitoringv1.PodMonitor
|
||||||
|
podMetricsEndpoints []*PodMetricsEndpointBuilder
|
||||||
|
owner metav1.Object
|
||||||
|
scheme *runtime.Scheme
|
||||||
|
}
|
||||||
|
|
||||||
|
// PodMonitor returns a new podmonitor builder
|
||||||
|
func PodMonitor(existing *monitoringv1.PodMonitor, owner metav1.Object, scheme *runtime.Scheme) *PodMonitorBuilder {
|
||||||
|
return &PodMonitorBuilder{
|
||||||
|
obj: existing,
|
||||||
|
owner: owner,
|
||||||
|
scheme: scheme,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pm *PodMonitorBuilder) Selector(matchLabels map[string]string) *PodMonitorBuilder {
|
||||||
|
pm.obj.Spec.Selector = metav1.LabelSelector{
|
||||||
|
MatchLabels: matchLabels,
|
||||||
|
}
|
||||||
|
return pm
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pm *PodMonitorBuilder) PodTargetLabels(podTargetLabels []string) *PodMonitorBuilder {
|
||||||
|
pm.obj.Spec.PodTargetLabels = podTargetLabels
|
||||||
|
return pm
|
||||||
|
}
|
||||||
|
func (pm *PodMonitorBuilder) JobLabel(jobLabel string) *PodMonitorBuilder {
|
||||||
|
pm.obj.Spec.JobLabel = jobLabel
|
||||||
|
return pm
|
||||||
|
}
|
||||||
|
func (pm *PodMonitorBuilder) NamespaceSelector(any bool, matchNames []string) *PodMonitorBuilder {
|
||||||
|
pm.obj.Spec.NamespaceSelector = monitoringv1.NamespaceSelector{
|
||||||
|
Any: any,
|
||||||
|
MatchNames: matchNames,
|
||||||
|
}
|
||||||
|
|
||||||
|
return pm
|
||||||
|
}
|
||||||
|
func (pm *PodMonitorBuilder) SampleLimit(sampleLimit uint64) *PodMonitorBuilder {
|
||||||
|
pm.obj.Spec.SampleLimit = sampleLimit
|
||||||
|
return pm
|
||||||
|
}
|
||||||
|
|
||||||
|
func (pm *PodMonitorBuilder) PodMetricsEndpoints(pme ...*PodMetricsEndpointBuilder) *PodMonitorBuilder {
|
||||||
|
pm.podMetricsEndpoints = pme
|
||||||
|
return pm
|
||||||
|
}
|
||||||
|
|
||||||
|
// Build returns the object after making certain assertions
|
||||||
|
func (pm *PodMonitorBuilder) Build() error {
|
||||||
|
pm.obj.Spec.PodMetricsEndpoints = []monitoringv1.PodMetricsEndpoint{}
|
||||||
|
for _, pmeBuilder := range pm.podMetricsEndpoints {
|
||||||
|
podMetricsEndpoint, err := pmeBuilder.Build()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
pm.obj.Spec.PodMetricsEndpoints = append(pm.obj.Spec.PodMetricsEndpoints, podMetricsEndpoint)
|
||||||
|
}
|
||||||
|
|
||||||
|
if !pm.isOwnedByOthers() {
|
||||||
|
return controllerutil.SetControllerReference(pm.owner, pm.obj, pm.scheme)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// isOwnedByOthers checks if this podMonitor has been possessed by an another object already.
|
||||||
|
func (pm *PodMonitorBuilder) isOwnedByOthers() bool {
|
||||||
|
ownerName := pm.owner.GetName()
|
||||||
|
|
||||||
|
existingRefs := pm.obj.GetOwnerReferences()
|
||||||
|
for _, r := range existingRefs {
|
||||||
|
if r.Name == ownerName {
|
||||||
|
return false
|
||||||
|
} else if r.Controller != nil && *r.Controller {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
265
chart/crds/monitoring.coreos.com_podmonitors.yaml
Normal file
265
chart/crds/monitoring.coreos.com_podmonitors.yaml
Normal file
@ -0,0 +1,265 @@
|
|||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: apiextensions.k8s.io/v1beta1
|
||||||
|
kind: CustomResourceDefinition
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
controller-gen.kubebuilder.io/version: v0.2.5
|
||||||
|
creationTimestamp: null
|
||||||
|
name: podmonitors.monitoring.coreos.com
|
||||||
|
spec:
|
||||||
|
group: monitoring.coreos.com
|
||||||
|
names:
|
||||||
|
kind: PodMonitor
|
||||||
|
listKind: PodMonitorList
|
||||||
|
plural: podmonitors
|
||||||
|
singular: podmonitor
|
||||||
|
scope: Namespaced
|
||||||
|
validation:
|
||||||
|
openAPIV3Schema:
|
||||||
|
properties:
|
||||||
|
apiVersion:
|
||||||
|
description: 'APIVersion defines the versioned schema of this representation
|
||||||
|
of an object. Servers should convert recognized schemas to the latest
|
||||||
|
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
|
||||||
|
type: string
|
||||||
|
kind:
|
||||||
|
description: 'Kind is a string value representing the REST resource this
|
||||||
|
object represents. Servers may infer this from the endpoint the client
|
||||||
|
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
|
||||||
|
type: string
|
||||||
|
metadata:
|
||||||
|
type: object
|
||||||
|
spec:
|
||||||
|
description: Specification of desired Pod selection for target discovery
|
||||||
|
by Prometheus.
|
||||||
|
properties:
|
||||||
|
jobLabel:
|
||||||
|
description: The label to use to retrieve the job name from.
|
||||||
|
type: string
|
||||||
|
namespaceSelector:
|
||||||
|
description: Selector to select which namespaces the Endpoints objects
|
||||||
|
are discovered from.
|
||||||
|
properties:
|
||||||
|
any:
|
||||||
|
description: Boolean describing whether all namespaces are selected
|
||||||
|
in contrast to a list restricting them.
|
||||||
|
type: boolean
|
||||||
|
matchNames:
|
||||||
|
description: List of namespace names.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
type: object
|
||||||
|
podMetricsEndpoints:
|
||||||
|
description: A list of endpoints allowed as part of this PodMonitor.
|
||||||
|
items:
|
||||||
|
description: PodMetricsEndpoint defines a scrapeable endpoint of a
|
||||||
|
Kubernetes Pod serving Prometheus metrics.
|
||||||
|
properties:
|
||||||
|
honorLabels:
|
||||||
|
description: HonorLabels chooses the metric's labels on collisions
|
||||||
|
with target labels.
|
||||||
|
type: boolean
|
||||||
|
honorTimestamps:
|
||||||
|
description: HonorTimestamps controls whether Prometheus respects
|
||||||
|
the timestamps present in scraped data.
|
||||||
|
type: boolean
|
||||||
|
interval:
|
||||||
|
description: Interval at which metrics should be scraped
|
||||||
|
type: string
|
||||||
|
metricRelabelings:
|
||||||
|
description: MetricRelabelConfigs to apply to samples before ingestion.
|
||||||
|
items:
|
||||||
|
description: 'RelabelConfig allows dynamic rewriting of the
|
||||||
|
label set, being applied to samples before ingestion. It defines
|
||||||
|
`<metric_relabel_configs>`-section of Prometheus configuration.
|
||||||
|
More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs'
|
||||||
|
properties:
|
||||||
|
action:
|
||||||
|
description: Action to perform based on regex matching.
|
||||||
|
Default is 'replace'
|
||||||
|
type: string
|
||||||
|
modulus:
|
||||||
|
description: Modulus to take of the hash of the source label
|
||||||
|
values.
|
||||||
|
format: int64
|
||||||
|
type: integer
|
||||||
|
regex:
|
||||||
|
description: Regular expression against which the extracted
|
||||||
|
value is matched. Default is '(.*)'
|
||||||
|
type: string
|
||||||
|
replacement:
|
||||||
|
description: Replacement value against which a regex replace
|
||||||
|
is performed if the regular expression matches. Regex
|
||||||
|
capture groups are available. Default is '$1'
|
||||||
|
type: string
|
||||||
|
separator:
|
||||||
|
description: Separator placed between concatenated source
|
||||||
|
label values. default is ';'.
|
||||||
|
type: string
|
||||||
|
sourceLabels:
|
||||||
|
description: The source labels select values from existing
|
||||||
|
labels. Their content is concatenated using the configured
|
||||||
|
separator and matched against the configured regular expression
|
||||||
|
for the replace, keep, and drop actions.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
targetLabel:
|
||||||
|
description: Label to which the resulting value is written
|
||||||
|
in a replace action. It is mandatory for replace actions.
|
||||||
|
Regex capture groups are available.
|
||||||
|
type: string
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
|
params:
|
||||||
|
additionalProperties:
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
description: Optional HTTP URL parameters
|
||||||
|
type: object
|
||||||
|
path:
|
||||||
|
description: HTTP path to scrape for metrics.
|
||||||
|
type: string
|
||||||
|
port:
|
||||||
|
description: Name of the pod port this endpoint refers to. Mutually
|
||||||
|
exclusive with targetPort.
|
||||||
|
type: string
|
||||||
|
proxyUrl:
|
||||||
|
description: ProxyURL eg http://proxyserver:2195 Directs scrapes
|
||||||
|
to proxy through this endpoint.
|
||||||
|
type: string
|
||||||
|
relabelings:
|
||||||
|
description: 'RelabelConfigs to apply to samples before ingestion.
|
||||||
|
More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config'
|
||||||
|
items:
|
||||||
|
description: 'RelabelConfig allows dynamic rewriting of the
|
||||||
|
label set, being applied to samples before ingestion. It defines
|
||||||
|
`<metric_relabel_configs>`-section of Prometheus configuration.
|
||||||
|
More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs'
|
||||||
|
properties:
|
||||||
|
action:
|
||||||
|
description: Action to perform based on regex matching.
|
||||||
|
Default is 'replace'
|
||||||
|
type: string
|
||||||
|
modulus:
|
||||||
|
description: Modulus to take of the hash of the source label
|
||||||
|
values.
|
||||||
|
format: int64
|
||||||
|
type: integer
|
||||||
|
regex:
|
||||||
|
description: Regular expression against which the extracted
|
||||||
|
value is matched. Default is '(.*)'
|
||||||
|
type: string
|
||||||
|
replacement:
|
||||||
|
description: Replacement value against which a regex replace
|
||||||
|
is performed if the regular expression matches. Regex
|
||||||
|
capture groups are available. Default is '$1'
|
||||||
|
type: string
|
||||||
|
separator:
|
||||||
|
description: Separator placed between concatenated source
|
||||||
|
label values. default is ';'.
|
||||||
|
type: string
|
||||||
|
sourceLabels:
|
||||||
|
description: The source labels select values from existing
|
||||||
|
labels. Their content is concatenated using the configured
|
||||||
|
separator and matched against the configured regular expression
|
||||||
|
for the replace, keep, and drop actions.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
targetLabel:
|
||||||
|
description: Label to which the resulting value is written
|
||||||
|
in a replace action. It is mandatory for replace actions.
|
||||||
|
Regex capture groups are available.
|
||||||
|
type: string
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
|
scheme:
|
||||||
|
description: HTTP scheme to use for scraping.
|
||||||
|
type: string
|
||||||
|
scrapeTimeout:
|
||||||
|
description: Timeout after which the scrape is ended
|
||||||
|
type: string
|
||||||
|
targetPort:
|
||||||
|
anyOf:
|
||||||
|
- type: integer
|
||||||
|
- type: string
|
||||||
|
description: 'Deprecated: Use ''port'' instead.'
|
||||||
|
x-kubernetes-int-or-string: true
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
|
podTargetLabels:
|
||||||
|
description: PodTargetLabels transfers labels on the Kubernetes Pod
|
||||||
|
onto the target.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
sampleLimit:
|
||||||
|
description: SampleLimit defines per-scrape limit on number of scraped
|
||||||
|
samples that will be accepted.
|
||||||
|
format: int64
|
||||||
|
type: integer
|
||||||
|
selector:
|
||||||
|
description: Selector to select Pod objects.
|
||||||
|
properties:
|
||||||
|
matchExpressions:
|
||||||
|
description: matchExpressions is a list of label selector requirements.
|
||||||
|
The requirements are ANDed.
|
||||||
|
items:
|
||||||
|
description: A label selector requirement is a selector that contains
|
||||||
|
values, a key, and an operator that relates the key and values.
|
||||||
|
properties:
|
||||||
|
key:
|
||||||
|
description: key is the label key that the selector applies
|
||||||
|
to.
|
||||||
|
type: string
|
||||||
|
operator:
|
||||||
|
description: operator represents a key's relationship to a
|
||||||
|
set of values. Valid operators are In, NotIn, Exists and
|
||||||
|
DoesNotExist.
|
||||||
|
type: string
|
||||||
|
values:
|
||||||
|
description: values is an array of string values. If the operator
|
||||||
|
is In or NotIn, the values array must be non-empty. If the
|
||||||
|
operator is Exists or DoesNotExist, the values array must
|
||||||
|
be empty. This array is replaced during a strategic merge
|
||||||
|
patch.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
required:
|
||||||
|
- key
|
||||||
|
- operator
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
|
matchLabels:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: matchLabels is a map of {key,value} pairs. A single
|
||||||
|
{key,value} in the matchLabels map is equivalent to an element
|
||||||
|
of matchExpressions, whose key field is "key", the operator is
|
||||||
|
"In", and the values array contains only "value". The requirements
|
||||||
|
are ANDed.
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- podMetricsEndpoints
|
||||||
|
- selector
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- spec
|
||||||
|
type: object
|
||||||
|
version: v1
|
||||||
|
versions:
|
||||||
|
- name: v1
|
||||||
|
served: true
|
||||||
|
storage: true
|
||||||
|
status:
|
||||||
|
acceptedNames:
|
||||||
|
kind: ""
|
||||||
|
plural: ""
|
||||||
|
conditions: []
|
||||||
|
storedVersions: []
|
@ -83,3 +83,23 @@ rules:
|
|||||||
- get
|
- get
|
||||||
- patch
|
- patch
|
||||||
- update
|
- update
|
||||||
|
- apiGroups:
|
||||||
|
- monitoring.coreos.com
|
||||||
|
resources:
|
||||||
|
- podmonitors
|
||||||
|
verbs:
|
||||||
|
- create
|
||||||
|
- delete
|
||||||
|
- get
|
||||||
|
- list
|
||||||
|
- patch
|
||||||
|
- update
|
||||||
|
- watch
|
||||||
|
- apiGroups:
|
||||||
|
- monitoring.coreos.com
|
||||||
|
resources:
|
||||||
|
- podmonitors/status
|
||||||
|
verbs:
|
||||||
|
- get
|
||||||
|
- patch
|
||||||
|
- update
|
||||||
|
265
config/crd/bases/monitoring.coreos.com_podmonitors.yaml
Normal file
265
config/crd/bases/monitoring.coreos.com_podmonitors.yaml
Normal file
@ -0,0 +1,265 @@
|
|||||||
|
|
||||||
|
---
|
||||||
|
apiVersion: apiextensions.k8s.io/v1beta1
|
||||||
|
kind: CustomResourceDefinition
|
||||||
|
metadata:
|
||||||
|
annotations:
|
||||||
|
controller-gen.kubebuilder.io/version: v0.2.5
|
||||||
|
creationTimestamp: null
|
||||||
|
name: podmonitors.monitoring.coreos.com
|
||||||
|
spec:
|
||||||
|
group: monitoring.coreos.com
|
||||||
|
names:
|
||||||
|
kind: PodMonitor
|
||||||
|
listKind: PodMonitorList
|
||||||
|
plural: podmonitors
|
||||||
|
singular: podmonitor
|
||||||
|
scope: Namespaced
|
||||||
|
validation:
|
||||||
|
openAPIV3Schema:
|
||||||
|
properties:
|
||||||
|
apiVersion:
|
||||||
|
description: 'APIVersion defines the versioned schema of this representation
|
||||||
|
of an object. Servers should convert recognized schemas to the latest
|
||||||
|
internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#resources'
|
||||||
|
type: string
|
||||||
|
kind:
|
||||||
|
description: 'Kind is a string value representing the REST resource this
|
||||||
|
object represents. Servers may infer this from the endpoint the client
|
||||||
|
submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/sig-architecture/api-conventions.md#types-kinds'
|
||||||
|
type: string
|
||||||
|
metadata:
|
||||||
|
type: object
|
||||||
|
spec:
|
||||||
|
description: Specification of desired Pod selection for target discovery
|
||||||
|
by Prometheus.
|
||||||
|
properties:
|
||||||
|
jobLabel:
|
||||||
|
description: The label to use to retrieve the job name from.
|
||||||
|
type: string
|
||||||
|
namespaceSelector:
|
||||||
|
description: Selector to select which namespaces the Endpoints objects
|
||||||
|
are discovered from.
|
||||||
|
properties:
|
||||||
|
any:
|
||||||
|
description: Boolean describing whether all namespaces are selected
|
||||||
|
in contrast to a list restricting them.
|
||||||
|
type: boolean
|
||||||
|
matchNames:
|
||||||
|
description: List of namespace names.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
type: object
|
||||||
|
podMetricsEndpoints:
|
||||||
|
description: A list of endpoints allowed as part of this PodMonitor.
|
||||||
|
items:
|
||||||
|
description: PodMetricsEndpoint defines a scrapeable endpoint of a
|
||||||
|
Kubernetes Pod serving Prometheus metrics.
|
||||||
|
properties:
|
||||||
|
honorLabels:
|
||||||
|
description: HonorLabels chooses the metric's labels on collisions
|
||||||
|
with target labels.
|
||||||
|
type: boolean
|
||||||
|
honorTimestamps:
|
||||||
|
description: HonorTimestamps controls whether Prometheus respects
|
||||||
|
the timestamps present in scraped data.
|
||||||
|
type: boolean
|
||||||
|
interval:
|
||||||
|
description: Interval at which metrics should be scraped
|
||||||
|
type: string
|
||||||
|
metricRelabelings:
|
||||||
|
description: MetricRelabelConfigs to apply to samples before ingestion.
|
||||||
|
items:
|
||||||
|
description: 'RelabelConfig allows dynamic rewriting of the
|
||||||
|
label set, being applied to samples before ingestion. It defines
|
||||||
|
`<metric_relabel_configs>`-section of Prometheus configuration.
|
||||||
|
More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs'
|
||||||
|
properties:
|
||||||
|
action:
|
||||||
|
description: Action to perform based on regex matching.
|
||||||
|
Default is 'replace'
|
||||||
|
type: string
|
||||||
|
modulus:
|
||||||
|
description: Modulus to take of the hash of the source label
|
||||||
|
values.
|
||||||
|
format: int64
|
||||||
|
type: integer
|
||||||
|
regex:
|
||||||
|
description: Regular expression against which the extracted
|
||||||
|
value is matched. Default is '(.*)'
|
||||||
|
type: string
|
||||||
|
replacement:
|
||||||
|
description: Replacement value against which a regex replace
|
||||||
|
is performed if the regular expression matches. Regex
|
||||||
|
capture groups are available. Default is '$1'
|
||||||
|
type: string
|
||||||
|
separator:
|
||||||
|
description: Separator placed between concatenated source
|
||||||
|
label values. default is ';'.
|
||||||
|
type: string
|
||||||
|
sourceLabels:
|
||||||
|
description: The source labels select values from existing
|
||||||
|
labels. Their content is concatenated using the configured
|
||||||
|
separator and matched against the configured regular expression
|
||||||
|
for the replace, keep, and drop actions.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
targetLabel:
|
||||||
|
description: Label to which the resulting value is written
|
||||||
|
in a replace action. It is mandatory for replace actions.
|
||||||
|
Regex capture groups are available.
|
||||||
|
type: string
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
|
params:
|
||||||
|
additionalProperties:
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
description: Optional HTTP URL parameters
|
||||||
|
type: object
|
||||||
|
path:
|
||||||
|
description: HTTP path to scrape for metrics.
|
||||||
|
type: string
|
||||||
|
port:
|
||||||
|
description: Name of the pod port this endpoint refers to. Mutually
|
||||||
|
exclusive with targetPort.
|
||||||
|
type: string
|
||||||
|
proxyUrl:
|
||||||
|
description: ProxyURL eg http://proxyserver:2195 Directs scrapes
|
||||||
|
to proxy through this endpoint.
|
||||||
|
type: string
|
||||||
|
relabelings:
|
||||||
|
description: 'RelabelConfigs to apply to samples before ingestion.
|
||||||
|
More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#relabel_config'
|
||||||
|
items:
|
||||||
|
description: 'RelabelConfig allows dynamic rewriting of the
|
||||||
|
label set, being applied to samples before ingestion. It defines
|
||||||
|
`<metric_relabel_configs>`-section of Prometheus configuration.
|
||||||
|
More info: https://prometheus.io/docs/prometheus/latest/configuration/configuration/#metric_relabel_configs'
|
||||||
|
properties:
|
||||||
|
action:
|
||||||
|
description: Action to perform based on regex matching.
|
||||||
|
Default is 'replace'
|
||||||
|
type: string
|
||||||
|
modulus:
|
||||||
|
description: Modulus to take of the hash of the source label
|
||||||
|
values.
|
||||||
|
format: int64
|
||||||
|
type: integer
|
||||||
|
regex:
|
||||||
|
description: Regular expression against which the extracted
|
||||||
|
value is matched. Default is '(.*)'
|
||||||
|
type: string
|
||||||
|
replacement:
|
||||||
|
description: Replacement value against which a regex replace
|
||||||
|
is performed if the regular expression matches. Regex
|
||||||
|
capture groups are available. Default is '$1'
|
||||||
|
type: string
|
||||||
|
separator:
|
||||||
|
description: Separator placed between concatenated source
|
||||||
|
label values. default is ';'.
|
||||||
|
type: string
|
||||||
|
sourceLabels:
|
||||||
|
description: The source labels select values from existing
|
||||||
|
labels. Their content is concatenated using the configured
|
||||||
|
separator and matched against the configured regular expression
|
||||||
|
for the replace, keep, and drop actions.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
targetLabel:
|
||||||
|
description: Label to which the resulting value is written
|
||||||
|
in a replace action. It is mandatory for replace actions.
|
||||||
|
Regex capture groups are available.
|
||||||
|
type: string
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
|
scheme:
|
||||||
|
description: HTTP scheme to use for scraping.
|
||||||
|
type: string
|
||||||
|
scrapeTimeout:
|
||||||
|
description: Timeout after which the scrape is ended
|
||||||
|
type: string
|
||||||
|
targetPort:
|
||||||
|
anyOf:
|
||||||
|
- type: integer
|
||||||
|
- type: string
|
||||||
|
description: 'Deprecated: Use ''port'' instead.'
|
||||||
|
x-kubernetes-int-or-string: true
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
|
podTargetLabels:
|
||||||
|
description: PodTargetLabels transfers labels on the Kubernetes Pod
|
||||||
|
onto the target.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
sampleLimit:
|
||||||
|
description: SampleLimit defines per-scrape limit on number of scraped
|
||||||
|
samples that will be accepted.
|
||||||
|
format: int64
|
||||||
|
type: integer
|
||||||
|
selector:
|
||||||
|
description: Selector to select Pod objects.
|
||||||
|
properties:
|
||||||
|
matchExpressions:
|
||||||
|
description: matchExpressions is a list of label selector requirements.
|
||||||
|
The requirements are ANDed.
|
||||||
|
items:
|
||||||
|
description: A label selector requirement is a selector that contains
|
||||||
|
values, a key, and an operator that relates the key and values.
|
||||||
|
properties:
|
||||||
|
key:
|
||||||
|
description: key is the label key that the selector applies
|
||||||
|
to.
|
||||||
|
type: string
|
||||||
|
operator:
|
||||||
|
description: operator represents a key's relationship to a
|
||||||
|
set of values. Valid operators are In, NotIn, Exists and
|
||||||
|
DoesNotExist.
|
||||||
|
type: string
|
||||||
|
values:
|
||||||
|
description: values is an array of string values. If the operator
|
||||||
|
is In or NotIn, the values array must be non-empty. If the
|
||||||
|
operator is Exists or DoesNotExist, the values array must
|
||||||
|
be empty. This array is replaced during a strategic merge
|
||||||
|
patch.
|
||||||
|
items:
|
||||||
|
type: string
|
||||||
|
type: array
|
||||||
|
required:
|
||||||
|
- key
|
||||||
|
- operator
|
||||||
|
type: object
|
||||||
|
type: array
|
||||||
|
matchLabels:
|
||||||
|
additionalProperties:
|
||||||
|
type: string
|
||||||
|
description: matchLabels is a map of {key,value} pairs. A single
|
||||||
|
{key,value} in the matchLabels map is equivalent to an element
|
||||||
|
of matchExpressions, whose key field is "key", the operator is
|
||||||
|
"In", and the values array contains only "value". The requirements
|
||||||
|
are ANDed.
|
||||||
|
type: object
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- podMetricsEndpoints
|
||||||
|
- selector
|
||||||
|
type: object
|
||||||
|
required:
|
||||||
|
- spec
|
||||||
|
type: object
|
||||||
|
version: v1
|
||||||
|
versions:
|
||||||
|
- name: v1
|
||||||
|
served: true
|
||||||
|
storage: true
|
||||||
|
status:
|
||||||
|
acceptedNames:
|
||||||
|
kind: ""
|
||||||
|
plural: ""
|
||||||
|
conditions: []
|
||||||
|
storedVersions: []
|
@ -4,6 +4,7 @@
|
|||||||
resources:
|
resources:
|
||||||
- bases/infrastructure.vexxhost.cloud_mcrouters.yaml
|
- bases/infrastructure.vexxhost.cloud_mcrouters.yaml
|
||||||
- bases/infrastructure.vexxhost.cloud_memcacheds.yaml
|
- bases/infrastructure.vexxhost.cloud_memcacheds.yaml
|
||||||
|
- bases/monitoring.coreos.com_podmonitors.yaml
|
||||||
# +kubebuilder:scaffold:crdkustomizeresource
|
# +kubebuilder:scaffold:crdkustomizeresource
|
||||||
|
|
||||||
patchesStrategicMerge:
|
patchesStrategicMerge:
|
||||||
|
@ -83,3 +83,23 @@ rules:
|
|||||||
- get
|
- get
|
||||||
- patch
|
- patch
|
||||||
- update
|
- update
|
||||||
|
- apiGroups:
|
||||||
|
- monitoring.coreos.com
|
||||||
|
resources:
|
||||||
|
- podmonitors
|
||||||
|
verbs:
|
||||||
|
- create
|
||||||
|
- delete
|
||||||
|
- get
|
||||||
|
- list
|
||||||
|
- patch
|
||||||
|
- update
|
||||||
|
- watch
|
||||||
|
- apiGroups:
|
||||||
|
- monitoring.coreos.com
|
||||||
|
resources:
|
||||||
|
- podmonitors/status
|
||||||
|
verbs:
|
||||||
|
- get
|
||||||
|
- patch
|
||||||
|
- update
|
||||||
|
@ -13,6 +13,7 @@ import (
|
|||||||
ctrl "sigs.k8s.io/controller-runtime"
|
ctrl "sigs.k8s.io/controller-runtime"
|
||||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
"sigs.k8s.io/controller-runtime/pkg/client"
|
||||||
|
|
||||||
|
monitoringv1 "opendev.org/vexxhost/openstack-operator/api/monitoring/v1"
|
||||||
infrastructurev1alpha1 "opendev.org/vexxhost/openstack-operator/api/v1alpha1"
|
infrastructurev1alpha1 "opendev.org/vexxhost/openstack-operator/api/v1alpha1"
|
||||||
"opendev.org/vexxhost/openstack-operator/builders"
|
"opendev.org/vexxhost/openstack-operator/builders"
|
||||||
"opendev.org/vexxhost/openstack-operator/utils"
|
"opendev.org/vexxhost/openstack-operator/utils"
|
||||||
@ -28,6 +29,7 @@ type McrouterReconciler struct {
|
|||||||
// +kubebuilder:rbac:groups=infrastructure.vexxhost.cloud,resources=mcrouters,verbs=get;list;watch;create;update;patch;delete
|
// +kubebuilder:rbac:groups=infrastructure.vexxhost.cloud,resources=mcrouters,verbs=get;list;watch;create;update;patch;delete
|
||||||
// +kubebuilder:rbac:groups=infrastructure.vexxhost.cloud,resources=mcrouters/status,verbs=get;update;patch
|
// +kubebuilder:rbac:groups=infrastructure.vexxhost.cloud,resources=mcrouters/status,verbs=get;update;patch
|
||||||
|
|
||||||
|
// +kubebuilder:rbac:groups=monitoring.coreos.com,resources=podmonitors,verbs=get;list;watch;create;update;patch;delete
|
||||||
// +kubebuilder:rbac:groups=core,resources=configmaps;services,verbs=get;list;watch;create;update;patch;delete
|
// +kubebuilder:rbac:groups=core,resources=configmaps;services,verbs=get;list;watch;create;update;patch;delete
|
||||||
// +kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete
|
// +kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete
|
||||||
|
|
||||||
@ -118,6 +120,39 @@ func (r *McrouterReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
}
|
}
|
||||||
log.WithValues("resource", "Deployment").WithValues("op", op).Info("Reconciled")
|
log.WithValues("resource", "Deployment").WithValues("op", op).Info("Reconciled")
|
||||||
|
|
||||||
|
// PodMonitor
|
||||||
|
podMonitor := &monitoringv1.PodMonitor{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
APIVersion: "monitoring.coreos.com/v1",
|
||||||
|
Kind: "PodMonitor",
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Namespace: req.Namespace,
|
||||||
|
Name: fmt.Sprintf("mcrouter-podmonitor"),
|
||||||
|
Labels: map[string]string{
|
||||||
|
"app.kubernetes.io/name": "mcrouter",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
op, err = utils.CreateOrUpdate(ctx, r, podMonitor, func() error {
|
||||||
|
return builders.PodMonitor(podMonitor, &mcrouter, r.Scheme).
|
||||||
|
Selector(map[string]string{
|
||||||
|
"app.kubernetes.io/name": "mcrouter",
|
||||||
|
}).
|
||||||
|
PodMetricsEndpoints(
|
||||||
|
builders.PodMetricsEndpoint().
|
||||||
|
Port("metrics").
|
||||||
|
Path("/metrics").
|
||||||
|
Interval("15s"),
|
||||||
|
).Build()
|
||||||
|
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return ctrl.Result{}, err
|
||||||
|
}
|
||||||
|
log.WithValues("resource", "podmonitor").WithValues("op", op).Info("Reconciled")
|
||||||
|
|
||||||
// Service
|
// Service
|
||||||
service := &corev1.Service{
|
service := &corev1.Service{
|
||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
@ -146,5 +181,6 @@ func (r *McrouterReconciler) SetupWithManager(mgr ctrl.Manager) error {
|
|||||||
Owns(&corev1.ConfigMap{}).
|
Owns(&corev1.ConfigMap{}).
|
||||||
Owns(&appsv1.Deployment{}).
|
Owns(&appsv1.Deployment{}).
|
||||||
Owns(&corev1.Service{}).
|
Owns(&corev1.Service{}).
|
||||||
|
Owns(&monitoringv1.PodMonitor{}).
|
||||||
Complete(r)
|
Complete(r)
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,8 @@ import (
|
|||||||
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
|
"sigs.k8s.io/controller-runtime/pkg/controller/controllerutil"
|
||||||
|
|
||||||
infrastructurev1alpha1 "opendev.org/vexxhost/openstack-operator/api/v1alpha1"
|
infrastructurev1alpha1 "opendev.org/vexxhost/openstack-operator/api/v1alpha1"
|
||||||
|
|
||||||
|
monitoringv1 "opendev.org/vexxhost/openstack-operator/api/monitoring/v1"
|
||||||
"opendev.org/vexxhost/openstack-operator/builders"
|
"opendev.org/vexxhost/openstack-operator/builders"
|
||||||
"opendev.org/vexxhost/openstack-operator/utils"
|
"opendev.org/vexxhost/openstack-operator/utils"
|
||||||
)
|
)
|
||||||
@ -46,6 +48,7 @@ type MemcachedReconciler struct {
|
|||||||
// +kubebuilder:rbac:groups=infrastructure.vexxhost.cloud,resources=memcacheds,verbs=get;list;watch;create;update;patch;delete
|
// +kubebuilder:rbac:groups=infrastructure.vexxhost.cloud,resources=memcacheds,verbs=get;list;watch;create;update;patch;delete
|
||||||
// +kubebuilder:rbac:groups=infrastructure.vexxhost.cloud,resources=memcacheds/status,verbs=get;update;patch
|
// +kubebuilder:rbac:groups=infrastructure.vexxhost.cloud,resources=memcacheds/status,verbs=get;update;patch
|
||||||
|
|
||||||
|
// +kubebuilder:rbac:groups=monitoring.coreos.com,resources=podmonitors,verbs=get;list;watch;create;update;patch;delete
|
||||||
// +kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch;create;update;patch;delete
|
// +kubebuilder:rbac:groups=core,resources=pods,verbs=get;list;watch;create;update;patch;delete
|
||||||
// +kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete
|
// +kubebuilder:rbac:groups=apps,resources=deployments,verbs=get;list;watch;create;update;patch;delete
|
||||||
|
|
||||||
@ -76,6 +79,7 @@ func (r *MemcachedReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
Labels: labels,
|
Labels: labels,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
op, err := utils.CreateOrUpdate(ctx, r, deployment, func() error {
|
op, err := utils.CreateOrUpdate(ctx, r, deployment, func() error {
|
||||||
return builders.Deployment(deployment, &memcached, r.Scheme).
|
return builders.Deployment(deployment, &memcached, r.Scheme).
|
||||||
Labels(labels).
|
Labels(labels).
|
||||||
@ -113,6 +117,40 @@ func (r *MemcachedReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
}
|
}
|
||||||
log.WithValues("resource", "Deployment").WithValues("op", op).Info("Reconciled")
|
log.WithValues("resource", "Deployment").WithValues("op", op).Info("Reconciled")
|
||||||
|
|
||||||
|
// PodMonitor
|
||||||
|
|
||||||
|
podMonitor := &monitoringv1.PodMonitor{
|
||||||
|
TypeMeta: metav1.TypeMeta{
|
||||||
|
APIVersion: "monitoring.coreos.com/v1",
|
||||||
|
Kind: "PodMonitor",
|
||||||
|
},
|
||||||
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
|
Namespace: req.Namespace,
|
||||||
|
Name: fmt.Sprintf("memcached-podmonitor"),
|
||||||
|
Labels: map[string]string{
|
||||||
|
"app.kubernetes.io/name": "memcached",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
|
||||||
|
op, err = utils.CreateOrUpdate(ctx, r, podMonitor, func() error {
|
||||||
|
return builders.PodMonitor(podMonitor, &memcached, r.Scheme).
|
||||||
|
Selector(map[string]string{
|
||||||
|
"app.kubernetes.io/name": "memcached",
|
||||||
|
}).
|
||||||
|
PodMetricsEndpoints(
|
||||||
|
builders.PodMetricsEndpoint().
|
||||||
|
Port("metrics").
|
||||||
|
Path("/metrics").
|
||||||
|
Interval("15s"),
|
||||||
|
).Build()
|
||||||
|
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return ctrl.Result{}, err
|
||||||
|
}
|
||||||
|
log.WithValues("resource", "podmonitor").WithValues("op", op).Info("Reconciled")
|
||||||
|
|
||||||
// Pods
|
// Pods
|
||||||
pods := &corev1.PodList{}
|
pods := &corev1.PodList{}
|
||||||
err = r.List(ctx, pods, client.InNamespace(req.Namespace), client.MatchingLabels(labels))
|
err = r.List(ctx, pods, client.InNamespace(req.Namespace), client.MatchingLabels(labels))
|
||||||
@ -175,5 +213,6 @@ func (r *MemcachedReconciler) SetupWithManager(mgr ctrl.Manager) error {
|
|||||||
For(&infrastructurev1alpha1.Memcached{}).
|
For(&infrastructurev1alpha1.Memcached{}).
|
||||||
Owns(&appsv1.Deployment{}).
|
Owns(&appsv1.Deployment{}).
|
||||||
Owns(&infrastructurev1alpha1.Mcrouter{}).
|
Owns(&infrastructurev1alpha1.Mcrouter{}).
|
||||||
|
Owns(&monitoringv1.PodMonitor{}).
|
||||||
Complete(r)
|
Complete(r)
|
||||||
}
|
}
|
||||||
|
2
main.go
Normal file → Executable file
2
main.go
Normal file → Executable file
@ -26,6 +26,7 @@ import (
|
|||||||
ctrl "sigs.k8s.io/controller-runtime"
|
ctrl "sigs.k8s.io/controller-runtime"
|
||||||
"sigs.k8s.io/controller-runtime/pkg/log/zap"
|
"sigs.k8s.io/controller-runtime/pkg/log/zap"
|
||||||
|
|
||||||
|
monitoringv1 "opendev.org/vexxhost/openstack-operator/api/monitoring/v1"
|
||||||
infrastructurev1alpha1 "opendev.org/vexxhost/openstack-operator/api/v1alpha1"
|
infrastructurev1alpha1 "opendev.org/vexxhost/openstack-operator/api/v1alpha1"
|
||||||
"opendev.org/vexxhost/openstack-operator/controllers"
|
"opendev.org/vexxhost/openstack-operator/controllers"
|
||||||
"opendev.org/vexxhost/openstack-operator/version"
|
"opendev.org/vexxhost/openstack-operator/version"
|
||||||
@ -41,6 +42,7 @@ func init() {
|
|||||||
_ = clientgoscheme.AddToScheme(scheme)
|
_ = clientgoscheme.AddToScheme(scheme)
|
||||||
|
|
||||||
_ = infrastructurev1alpha1.AddToScheme(scheme)
|
_ = infrastructurev1alpha1.AddToScheme(scheme)
|
||||||
|
_ = monitoringv1.AddToScheme(scheme)
|
||||||
// +kubebuilder:scaffold:scheme
|
// +kubebuilder:scaffold:scheme
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -13,6 +13,7 @@ import (
|
|||||||
// CreateOrUpdate wraps the function provided by controller-runtime to include
|
// CreateOrUpdate wraps the function provided by controller-runtime to include
|
||||||
// some additional logging and common functionality across all resources.
|
// some additional logging and common functionality across all resources.
|
||||||
func CreateOrUpdate(ctx context.Context, c client.Client, obj runtime.Object, f controllerutil.MutateFn) (controllerutil.OperationResult, error) {
|
func CreateOrUpdate(ctx context.Context, c client.Client, obj runtime.Object, f controllerutil.MutateFn) (controllerutil.OperationResult, error) {
|
||||||
|
|
||||||
return controllerutil.CreateOrUpdate(ctx, c, obj, func() error {
|
return controllerutil.CreateOrUpdate(ctx, c, obj, func() error {
|
||||||
original := obj.DeepCopyObject()
|
original := obj.DeepCopyObject()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user