diff --git a/.chloggen/fix-exporter-conf-panic.yaml b/.chloggen/fix-exporter-conf-panic.yaml new file mode 100644 index 0000000000..55dd24ee3e --- /dev/null +++ b/.chloggen/fix-exporter-conf-panic.yaml @@ -0,0 +1,16 @@ +# One of 'breaking', 'deprecation', 'new_component', 'enhancement', 'bug_fix' +change_type: "bug_fix" + +# The name of the component, or a single word describing the area of concern, (e.g. operator, target allocator, github action) +component: operator + +# A brief description of the change. Surround your text with quotes ("") if it needs to start with a backtick (`). +note: "Fixes a panic on exporter prometheus endpoint not valid" + +# One or more tracking issues related to the change +issues: [2628] + +# (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: diff --git a/internal/manifests/collector/parser/exporter/exporter_prometheus.go b/internal/manifests/collector/parser/exporter/exporter_prometheus.go index 61d58588da..30047de70e 100644 --- a/internal/manifests/collector/parser/exporter/exporter_prometheus.go +++ b/internal/manifests/collector/parser/exporter/exporter_prometheus.go @@ -59,9 +59,9 @@ func (o *PrometheusExporterParser) Ports() ([]corev1.ServicePort, error) { }, ) } else { - ports = append( - ports, *singlePortFromConfigEndpoint(o.logger, o.name, o.config), - ) + if port := singlePortFromConfigEndpoint(o.logger, o.name, o.config); port != nil { + ports = append(ports, *port) + } } return ports, nil diff --git a/internal/manifests/collector/parser/exporter/exporter_test.go b/internal/manifests/collector/parser/exporter/exporter_test.go new file mode 100644 index 0000000000..e022160784 --- /dev/null +++ b/internal/manifests/collector/parser/exporter/exporter_test.go @@ -0,0 +1,80 @@ +// Copyright The OpenTelemetry Authors +// +// 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 exporter + +import ( + "testing" + + "github.com/stretchr/testify/assert" + + v1 "k8s.io/api/core/v1" + "k8s.io/apimachinery/pkg/util/intstr" +) + +func TestPorts(t *testing.T) { + tests := []struct { + testName string + parser *PrometheusExporterParser + want []v1.ServicePort + }{ + { + testName: "Valid Configuration", + parser: &PrometheusExporterParser{ + name: "test-exporter", + config: map[interface{}]interface{}{ + "endpoint": "http://myprometheus.io:9090", + }, + }, + want: []v1.ServicePort{ + { + Name: "test-exporter", + Port: 9090, + }, + }, + }, + { + testName: "Empty Configuration", + parser: &PrometheusExporterParser{ + name: "test-exporter", + config: nil, // Simulate no configuration provided + }, + want: []v1.ServicePort{ + { + Name: "test-exporter", + Port: defaultPrometheusPort, + TargetPort: intstr.FromInt(int(defaultPrometheusPort)), + Protocol: v1.ProtocolTCP, + }, + }, + }, + { + testName: "Invalid Endpoint No Port", + parser: &PrometheusExporterParser{ + name: "test-exporter", + config: map[interface{}]interface{}{ + "endpoint": "invalidendpoint", + }, + }, + want: []v1.ServicePort{}, + }, + } + + for _, tt := range tests { + t.Run(tt.testName, func(t *testing.T) { + ports, _ := tt.parser.Ports() + assert.Equal(t, tt.want, ports) + }) + } +}