208 lines
8.8 KiB
Go
Executable File
208 lines
8.8 KiB
Go
Executable File
// Copyright 2020 VEXXHOST, Inc.
|
|
//
|
|
// 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.
|
|
|
|
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"
|
|
|
|
PrometheusRuleKind = "PrometheusRule"
|
|
PrometheusRuleName = "prometheusrules"
|
|
PrometheusRuleKindKey = "prometheusrule"
|
|
)
|
|
|
|
// 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.
|
|
}
|
|
|
|
// PrometheusRuleList is a list of PrometheusRules.
|
|
// +k8s:openapi-gen=true
|
|
// +kubebuilder:object:root=true
|
|
type PrometheusRuleList 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 Rules
|
|
Items []*PrometheusRule `json:"items"`
|
|
}
|
|
|
|
// PrometheusRule defines alerting rules for a Prometheus instance
|
|
// +genclient
|
|
// +k8s:openapi-gen=true
|
|
// +kubebuilder:object:root=true
|
|
type PrometheusRule struct {
|
|
metav1.TypeMeta `json:",inline"`
|
|
metav1.ObjectMeta `json:"metadata,omitempty"`
|
|
// Specification of desired alerting rule definitions for Prometheus.
|
|
Spec PrometheusRuleSpec `json:"spec"`
|
|
}
|
|
|
|
// PrometheusRuleSpec contains specification parameters for a Rule.
|
|
// +k8s:openapi-gen=true
|
|
type PrometheusRuleSpec struct {
|
|
// Content of Prometheus rule file
|
|
Groups []RuleGroup `json:"groups,omitempty"`
|
|
}
|
|
|
|
// RuleGroup and Rule are copied instead of vendored because the
|
|
// upstream Prometheus struct definitions don't have json struct tags.
|
|
|
|
// RuleGroup is a list of sequentially evaluated recording and alerting rules.
|
|
// Note: PartialResponseStrategy is only used by ThanosRuler and will
|
|
// be ignored by Prometheus instances. Valid values for this field are 'warn'
|
|
// or 'abort'. More info: https://github.com/thanos-io/thanos/blob/master/docs/components/rule.md#partial-response
|
|
// +k8s:openapi-gen=true
|
|
type RuleGroup struct {
|
|
Name string `json:"name"`
|
|
Interval string `json:"interval,omitempty"`
|
|
Rules []Rule `json:"rules"`
|
|
PartialResponseStrategy string `json:"partial_response_strategy,omitempty"`
|
|
}
|
|
|
|
// Rule describes an alerting or recording rule.
|
|
// +k8s:openapi-gen=true
|
|
type Rule struct {
|
|
Record string `json:"record,omitempty"`
|
|
Alert string `json:"alert,omitempty"`
|
|
Expr intstr.IntOrString `json:"expr"`
|
|
For string `json:"for,omitempty"`
|
|
Labels map[string]string `json:"labels,omitempty"`
|
|
Annotations map[string]string `json:"annotations,omitempty"`
|
|
}
|
|
|
|
// +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
|
|
// +kubebuilder:rbac:groups=monitoring.coreos.com,resources=prometheusrules,verbs=get;list;watch;create;update;patch;delete
|
|
// +kubebuilder:rbac:groups=monitoring.coreos.com,resources=prometheusrules/status,verbs=get;update;patch
|
|
|
|
func init() {
|
|
SchemeBuilder.Register(&PodMonitor{}, &PodMonitorList{}, &PrometheusRule{}, &PrometheusRuleList{})
|
|
}
|