Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
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
21 changes: 21 additions & 0 deletions .chloggen/feat_ta-prom-cr-fields.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix'
change_type: enhancement

# The name of the component, or a single word describing the area of concern, (e.g. collector, target allocator, auto-instrumentation, opamp, github action)
component: target allocator

# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`).
note: Expose missing Prometheus CR fields in the Operator API

# One or more tracking issues related to the change
# Issue 5517 does not exist...
issues: [5517]

# (Optional) One or more lines of additional information to render under the primary note.
# These lines will be padded with 2 spaces and then inserted directly into the document.
# Use pipe (|) for multiline entries.
subtext: |
Added `podMonitorNamespaceSelector`, `serviceMonitorNamespaceSelector`, `scrapeConfigNamespaceSelector`,
`probeNamespaceSelector`, `evaluationInterval`, and `scrapeProtocols` to the `prometheusCR`
configuration within the `TargetAllocator` and `OpenTelemetryCollector`
APIs to achieve feature parity with the underlying Target Allocator.
64 changes: 50 additions & 14 deletions apis/v1alpha1/convert.go
Original file line number Diff line number Diff line change
Expand Up @@ -185,16 +185,20 @@ func tov1beta1TA(in OpenTelemetryTargetAllocator) v1beta1.TargetAllocatorEmbedde
Enabled: in.Enabled,
Affinity: in.Affinity,
PrometheusCR: v1beta1.TargetAllocatorPrometheusCR{
Enabled: in.PrometheusCR.Enabled,
ScrapeInterval: in.PrometheusCR.ScrapeInterval,
ScrapeClasses: in.PrometheusCR.ScrapeClasses,
Enabled: in.PrometheusCR.Enabled,
ScrapeInterval: in.PrometheusCR.ScrapeInterval,
EvaluationInterval: in.PrometheusCR.EvaluationInterval,
ScrapeProtocols: in.PrometheusCR.ScrapeProtocols,
ScrapeClasses: in.PrometheusCR.ScrapeClasses,
// prometheus_cr.pod_monitor_selector shouldn't be nil when selector is empty
PodMonitorSelector: &metav1.LabelSelector{
MatchLabels: in.PrometheusCR.PodMonitorSelector,
},
ServiceMonitorSelector: &metav1.LabelSelector{
MatchLabels: in.PrometheusCR.ServiceMonitorSelector,
},
PodMonitorSelector: &metav1.LabelSelector{MatchLabels: in.PrometheusCR.PodMonitorSelector},
PodMonitorNamespaceSelector: &metav1.LabelSelector{MatchLabels: in.PrometheusCR.PodMonitorNamespaceSelector},
ServiceMonitorSelector: &metav1.LabelSelector{MatchLabels: in.PrometheusCR.ServiceMonitorSelector},
ServiceMonitorNamespaceSelector: &metav1.LabelSelector{MatchLabels: in.PrometheusCR.ServiceMonitorNamespaceSelector},
ScrapeConfigSelector: &metav1.LabelSelector{MatchLabels: in.PrometheusCR.ScrapeConfigSelector},
ScrapeConfigNamespaceSelector: &metav1.LabelSelector{MatchLabels: in.PrometheusCR.ScrapeConfigNamespaceSelector},
ProbeSelector: &metav1.LabelSelector{MatchLabels: in.PrometheusCR.ProbeSelector},
ProbeNamespaceSelector: &metav1.LabelSelector{MatchLabels: in.PrometheusCR.ProbeNamespaceSelector},
},
SecurityContext: in.SecurityContext,
PodSecurityContext: in.PodSecurityContext,
Expand Down Expand Up @@ -441,10 +445,34 @@ func tov1alpha1TA(in v1beta1.TargetAllocatorEmbedded) OpenTelemetryTargetAllocat
if in.PrometheusCR.PodMonitorSelector != nil {
podMonitorSelector = in.PrometheusCR.PodMonitorSelector.MatchLabels
}
var podMonitorNamespaceSelector map[string]string
if in.PrometheusCR.PodMonitorNamespaceSelector != nil {
podMonitorNamespaceSelector = in.PrometheusCR.PodMonitorNamespaceSelector.MatchLabels
}
var serviceMonitorSelector map[string]string
if in.PrometheusCR.ServiceMonitorSelector != nil {
serviceMonitorSelector = in.PrometheusCR.ServiceMonitorSelector.MatchLabels
}
var serviceMonitorNamespaceSelector map[string]string
if in.PrometheusCR.ServiceMonitorNamespaceSelector != nil {
serviceMonitorNamespaceSelector = in.PrometheusCR.ServiceMonitorNamespaceSelector.MatchLabels
}
var scrapeConfigSelector map[string]string
if in.PrometheusCR.ScrapeConfigSelector != nil {
scrapeConfigSelector = in.PrometheusCR.ScrapeConfigSelector.MatchLabels
}
var scrapeConfigNamespaceSelector map[string]string
if in.PrometheusCR.ScrapeConfigNamespaceSelector != nil {
scrapeConfigNamespaceSelector = in.PrometheusCR.ScrapeConfigNamespaceSelector.MatchLabels
}
var probeSelector map[string]string
if in.PrometheusCR.ProbeSelector != nil {
probeSelector = in.PrometheusCR.ProbeSelector.MatchLabels
}
var probeNamespaceSelector map[string]string
if in.PrometheusCR.ProbeNamespaceSelector != nil {
probeNamespaceSelector = in.PrometheusCR.ProbeNamespaceSelector.MatchLabels
}

return OpenTelemetryTargetAllocator{
Replicas: in.Replicas,
Expand All @@ -457,11 +485,19 @@ func tov1alpha1TA(in v1beta1.TargetAllocatorEmbedded) OpenTelemetryTargetAllocat
Enabled: in.Enabled,
Affinity: in.Affinity,
PrometheusCR: OpenTelemetryTargetAllocatorPrometheusCR{
Enabled: in.PrometheusCR.Enabled,
ScrapeInterval: in.PrometheusCR.ScrapeInterval,
ScrapeClasses: in.PrometheusCR.ScrapeClasses,
PodMonitorSelector: podMonitorSelector,
ServiceMonitorSelector: serviceMonitorSelector,
Enabled: in.PrometheusCR.Enabled,
ScrapeInterval: in.PrometheusCR.ScrapeInterval,
EvaluationInterval: in.PrometheusCR.EvaluationInterval,
ScrapeProtocols: in.PrometheusCR.ScrapeProtocols,
ScrapeClasses: in.PrometheusCR.ScrapeClasses,
PodMonitorSelector: podMonitorSelector,
PodMonitorNamespaceSelector: podMonitorNamespaceSelector,
ServiceMonitorSelector: serviceMonitorSelector,
ServiceMonitorNamespaceSelector: serviceMonitorNamespaceSelector,
ScrapeConfigSelector: scrapeConfigSelector,
ScrapeConfigNamespaceSelector: scrapeConfigNamespaceSelector,
ProbeSelector: probeSelector,
ProbeNamespaceSelector: probeNamespaceSelector,
},
SecurityContext: in.SecurityContext,
PodSecurityContext: in.PodSecurityContext,
Expand Down
61 changes: 55 additions & 6 deletions apis/v1alpha1/convert_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -358,8 +358,14 @@ func Test_tov1beta1AndBack_prometheus_selectors(t *testing.T) {
TargetAllocator: OpenTelemetryTargetAllocator{
PrometheusCR: OpenTelemetryTargetAllocatorPrometheusCR{
// nil or empty map means select everything
PodMonitorSelector: nil,
ServiceMonitorSelector: nil,
PodMonitorSelector: nil,
ServiceMonitorSelector: nil,
PodMonitorNamespaceSelector: nil,
ServiceMonitorNamespaceSelector: nil,
ScrapeConfigSelector: nil,
ScrapeConfigNamespaceSelector: nil,
ProbeSelector: nil,
ProbeNamespaceSelector: nil,
},
},
},
Expand All @@ -373,22 +379,47 @@ func Test_tov1beta1AndBack_prometheus_selectors(t *testing.T) {
// empty LabelSelector mean select everything
assert.NotNil(t, colbeta1.Spec.TargetAllocator.PrometheusCR.PodMonitorSelector)
assert.NotNil(t, colbeta1.Spec.TargetAllocator.PrometheusCR.ServiceMonitorSelector)
assert.NotNil(t, colbeta1.Spec.TargetAllocator.PrometheusCR.PodMonitorNamespaceSelector)
assert.NotNil(t, colbeta1.Spec.TargetAllocator.PrometheusCR.ServiceMonitorNamespaceSelector)
assert.NotNil(t, colbeta1.Spec.TargetAllocator.PrometheusCR.ScrapeConfigSelector)
assert.NotNil(t, colbeta1.Spec.TargetAllocator.PrometheusCR.ScrapeConfigNamespaceSelector)
assert.NotNil(t, colbeta1.Spec.TargetAllocator.PrometheusCR.ProbeSelector)
assert.NotNil(t, colbeta1.Spec.TargetAllocator.PrometheusCR.ProbeNamespaceSelector)

assert.Equal(t, 0, len(colalpha1.Spec.TargetAllocator.PrometheusCR.PodMonitorSelector))
assert.Equal(t, 0, len(colalpha1.Spec.TargetAllocator.PrometheusCR.ServiceMonitorSelector))
assert.Equal(t, 0, len(colalpha1.Spec.TargetAllocator.PrometheusCR.PodMonitorNamespaceSelector))
assert.Equal(t, 0, len(colalpha1.Spec.TargetAllocator.PrometheusCR.ServiceMonitorNamespaceSelector))
assert.Equal(t, 0, len(colalpha1.Spec.TargetAllocator.PrometheusCR.ScrapeConfigSelector))
assert.Equal(t, 0, len(colalpha1.Spec.TargetAllocator.PrometheusCR.ScrapeConfigNamespaceSelector))
assert.Equal(t, 0, len(colalpha1.Spec.TargetAllocator.PrometheusCR.ProbeSelector))
assert.Equal(t, 0, len(colalpha1.Spec.TargetAllocator.PrometheusCR.ProbeNamespaceSelector))

err = colalpha1.ConvertFrom(&colbeta1)
require.NoError(t, err)
assert.Nil(t, colalpha1.Spec.TargetAllocator.PrometheusCR.PodMonitorSelector)
assert.Nil(t, colalpha1.Spec.TargetAllocator.PrometheusCR.ServiceMonitorSelector)
assert.Nil(t, colalpha1.Spec.TargetAllocator.PrometheusCR.PodMonitorNamespaceSelector)
assert.Nil(t, colalpha1.Spec.TargetAllocator.PrometheusCR.ServiceMonitorNamespaceSelector)
assert.Nil(t, colalpha1.Spec.TargetAllocator.PrometheusCR.ScrapeConfigSelector)
assert.Nil(t, colalpha1.Spec.TargetAllocator.PrometheusCR.ScrapeConfigNamespaceSelector)
assert.Nil(t, colalpha1.Spec.TargetAllocator.PrometheusCR.ProbeSelector)
assert.Nil(t, colalpha1.Spec.TargetAllocator.PrometheusCR.ProbeNamespaceSelector)
})
t.Run("empty-selectors", func(t *testing.T) {
colalpha1 := OpenTelemetryCollector{
Spec: OpenTelemetryCollectorSpec{
TargetAllocator: OpenTelemetryTargetAllocator{
PrometheusCR: OpenTelemetryTargetAllocatorPrometheusCR{
// nil or empty map means select everything
PodMonitorSelector: map[string]string{},
ServiceMonitorSelector: map[string]string{},
PodMonitorSelector: map[string]string{},
ServiceMonitorSelector: map[string]string{},
PodMonitorNamespaceSelector: map[string]string{},
ServiceMonitorNamespaceSelector: map[string]string{},
ScrapeConfigSelector: map[string]string{},
ScrapeConfigNamespaceSelector: map[string]string{},
ProbeSelector: map[string]string{},
ProbeNamespaceSelector: map[string]string{},
},
},
},
Expand All @@ -402,11 +433,23 @@ func Test_tov1beta1AndBack_prometheus_selectors(t *testing.T) {
// empty LabelSelector mean select everything
assert.NotNil(t, colbeta1.Spec.TargetAllocator.PrometheusCR.PodMonitorSelector)
assert.NotNil(t, colbeta1.Spec.TargetAllocator.PrometheusCR.ServiceMonitorSelector)
assert.NotNil(t, colbeta1.Spec.TargetAllocator.PrometheusCR.PodMonitorNamespaceSelector)
assert.NotNil(t, colbeta1.Spec.TargetAllocator.PrometheusCR.ServiceMonitorNamespaceSelector)
assert.NotNil(t, colbeta1.Spec.TargetAllocator.PrometheusCR.ScrapeConfigSelector)
assert.NotNil(t, colbeta1.Spec.TargetAllocator.PrometheusCR.ScrapeConfigNamespaceSelector)
assert.NotNil(t, colbeta1.Spec.TargetAllocator.PrometheusCR.ProbeSelector)
assert.NotNil(t, colbeta1.Spec.TargetAllocator.PrometheusCR.ProbeNamespaceSelector)

err = colalpha1.ConvertFrom(&colbeta1)
require.NoError(t, err)
assert.Equal(t, map[string]string{}, colalpha1.Spec.TargetAllocator.PrometheusCR.PodMonitorSelector)
assert.Equal(t, map[string]string{}, colalpha1.Spec.TargetAllocator.PrometheusCR.ServiceMonitorSelector)
assert.Equal(t, map[string]string{}, colalpha1.Spec.TargetAllocator.PrometheusCR.PodMonitorNamespaceSelector)
assert.Equal(t, map[string]string{}, colalpha1.Spec.TargetAllocator.PrometheusCR.ServiceMonitorNamespaceSelector)
assert.Equal(t, map[string]string{}, colalpha1.Spec.TargetAllocator.PrometheusCR.ScrapeConfigSelector)
assert.Equal(t, map[string]string{}, colalpha1.Spec.TargetAllocator.PrometheusCR.ScrapeConfigNamespaceSelector)
assert.Equal(t, map[string]string{}, colalpha1.Spec.TargetAllocator.PrometheusCR.ProbeSelector)
assert.Equal(t, map[string]string{}, colalpha1.Spec.TargetAllocator.PrometheusCR.ProbeNamespaceSelector)
})
}

Expand Down Expand Up @@ -559,8 +602,14 @@ func TestConvertTo(t *testing.T) {
},
TargetAllocator: v1beta1.TargetAllocatorEmbedded{
PrometheusCR: v1beta1.TargetAllocatorPrometheusCR{
PodMonitorSelector: &metav1.LabelSelector{},
ServiceMonitorSelector: &metav1.LabelSelector{},
PodMonitorSelector: &metav1.LabelSelector{},
ServiceMonitorSelector: &metav1.LabelSelector{},
PodMonitorNamespaceSelector: &metav1.LabelSelector{},
ServiceMonitorNamespaceSelector: &metav1.LabelSelector{},
ScrapeConfigSelector: &metav1.LabelSelector{},
ScrapeConfigNamespaceSelector: &metav1.LabelSelector{},
ProbeSelector: &metav1.LabelSelector{},
ProbeNamespaceSelector: &metav1.LabelSelector{},
},
},
Config: v1beta1.Config{
Expand Down
53 changes: 53 additions & 0 deletions apis/v1alpha1/opentelemetrycollector_types.go
Original file line number Diff line number Diff line change
Expand Up @@ -385,12 +385,29 @@ type OpenTelemetryTargetAllocatorPrometheusCR struct {
// Enabled indicates whether to use a PrometheusOperator custom resources as targets or not.
// +optional
Enabled bool `json:"enabled,omitempty"`
// AllowNamespaces Namespaces to scope the interaction of the Target Allocator and the apiserver (allow list). This is mutually exclusive with DenyNamespaces.
// +optional
AllowNamespaces []string `json:"allowNamespaces,omitempty"`
// DenyNamespaces Namespaces to scope the interaction of the Target Allocator and the apiserver (deny list). This is mutually exclusive with AllowNamespaces.
// +optional
DenyNamespaces []string `json:"denyNamespaces,omitempty"`
// Interval between consecutive scrapes. Equivalent to the same setting on the Prometheus CRD.
//
// Default: "30s"
// +kubebuilder:default:="30s"
// +kubebuilder:validation:Format:=duration
ScrapeInterval *metav1.Duration `json:"scrapeInterval,omitempty"`
// Default interval between rule evaluations.
//
// Default: "30s"
// +kubebuilder:default:="30s"
// +kubebuilder:validation:Format:=duration
// +optional
EvaluationInterval *metav1.Duration `json:"evaluationInterval,omitempty"`
// ScrapeProtocols define the protocols to negotiate during a scrape. It tells clients the
// protocols supported by Prometheus in order of preference (from most to least preferred).
// +optional
ScrapeProtocols []string `json:"scrapeProtocols,omitempty"`
// ScrapeClasses to be referenced by PodMonitors and ServiceMonitors to include common configuration.
// If specified, expects an array of ScrapeClass objects as specified by https://prometheus-operator.dev/docs/api-reference/api/#monitoring.coreos.com/v1.ScrapeClass.
// +optional
Expand All @@ -403,12 +420,48 @@ type OpenTelemetryTargetAllocatorPrometheusCR struct {
// Empty or nil map matches all pod monitors.
// +optional
PodMonitorSelector map[string]string `json:"podMonitorSelector,omitempty"`
// Namespaces to be selected for PodMonitor discovery.
// This is a map of {key,value} pairs. Each {key,value} in the map is going to exactly match a label in a
// namespace's meta labels. The requirements are ANDed.
// Empty or nil map matches all namespaces.
// +optional
PodMonitorNamespaceSelector map[string]string `json:"podMonitorNamespaceSelector,omitempty"`
// ServiceMonitors to be selected for target discovery.
// This is a map of {key,value} pairs. Each {key,value} in the map is going to exactly match a label in a
// ServiceMonitor's meta labels. The requirements are ANDed.
// Empty or nil map matches all service monitors.
// +optional
ServiceMonitorSelector map[string]string `json:"serviceMonitorSelector,omitempty"`
// Namespaces to be selected for ServiceMonitor discovery.
// This is a map of {key,value} pairs. Each {key,value} in the map is going to exactly match a label in a
// namespace's meta labels. The requirements are ANDed.
// Empty or nil map matches all namespaces.
// +optional
ServiceMonitorNamespaceSelector map[string]string `json:"serviceMonitorNamespaceSelector,omitempty"`
// ScrapeConfigs to be selected for target discovery.
// This is a map of {key,value} pairs. Each {key,value} in the map is going to exactly match a label in a
// ScrapeConfig's meta labels. The requirements are ANDed.
// Empty or nil map matches all scrape configs.
// +optional
ScrapeConfigSelector map[string]string `json:"scrapeConfigSelector,omitempty"`
// Namespaces to be selected for ScrapeConfig discovery.
// This is a map of {key,value} pairs. Each {key,value} in the map is going to exactly match a label in a
// namespace's meta labels. The requirements are ANDed.
// Empty or nil map matches all namespaces.
// +optional
ScrapeConfigNamespaceSelector map[string]string `json:"scrapeConfigNamespaceSelector,omitempty"`
// Probes to be selected for target discovery.
// This is a map of {key,value} pairs. Each {key,value} in the map is going to exactly match a label in a
// Probe's meta labels. The requirements are ANDed.
// Empty or nil map matches all probes.
// +optional
ProbeSelector map[string]string `json:"probeSelector,omitempty"`
// Namespaces to be selected for Probe discovery.
// This is a map of {key,value} pairs. Each {key,value} in the map is going to exactly match a label in a
// namespace's meta labels. The requirements are ANDed.
// Empty or nil map matches all namespaces.
// +optional
ProbeNamespaceSelector map[string]string `json:"probeNamespaceSelector,omitempty"`
}

// ScaleSubresourceStatus defines the observed state of the OpenTelemetryCollector's
Expand Down
Loading