Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add debug ability to the telemetry operator #16567

Merged
merged 17 commits into from Jan 19, 2023
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -19,6 +19,7 @@ package logparser
import (
"context"
"fmt"
"github.com/kyma-project/kyma/components/telemetry-operator/internal/overrides"

telemetryv1alpha1 "github.com/kyma-project/kyma/components/telemetry-operator/apis/telemetry/v1alpha1"
"github.com/kyma-project/kyma/components/telemetry-operator/internal/configchecksum"
Expand All @@ -32,8 +33,10 @@ import (
const checksumAnnotationKey = "checksum/logparser-config"

type Config struct {
ParsersConfigMap types.NamespacedName
DaemonSet types.NamespacedName
ParsersConfigMap types.NamespacedName
DaemonSet types.NamespacedName
OverrideConfigMap types.NamespacedName
Overrides overrides.Config
}

//go:generate mockery --name DaemonSetProber --filename daemon_set_prober.go
Expand All @@ -48,20 +51,22 @@ type DaemonSetAnnotator interface {

type Reconciler struct {
client.Client
config Config
prober DaemonSetProber
annotator DaemonSetAnnotator
syncer syncer
config Config
prober DaemonSetProber
annotator DaemonSetAnnotator
syncer syncer
globalConfig *overrides.Handler
}

func NewReconciler(client client.Client, config Config, prober DaemonSetProber, annotator DaemonSetAnnotator) *Reconciler {
func NewReconciler(client client.Client, config Config, prober DaemonSetProber, annotator DaemonSetAnnotator, handler *overrides.Handler) *Reconciler {
var r Reconciler

r.Client = client
r.config = config
r.prober = prober
r.annotator = annotator
r.syncer = syncer{client, config}
r.globalConfig = handler

return &r
}
Expand All @@ -70,6 +75,20 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
log := logf.FromContext(ctx)
log.V(1).Info("Reconciliation triggered")

overrideConfig, err := r.globalConfig.UpdateOverrideConfig(ctx, r.config.OverrideConfigMap)
if err != nil {
return ctrl.Result{}, err
}

if err := r.globalConfig.CheckGlobalConfig(overrideConfig.Global); err != nil {
return ctrl.Result{}, err
}

if overrideConfig.Logging.Paused {
log.V(1).Info("Skipping reconciliation of logparser as reconciliation is paused.")
return ctrl.Result{}, nil
}

var parser telemetryv1alpha1.LogParser
if err := r.Get(ctx, req.NamespacedName, &parser); err != nil {
return ctrl.Result{}, client.IgnoreNotFound(err)
Expand Down
Expand Up @@ -23,6 +23,7 @@ import (
"github.com/kyma-project/kyma/components/telemetry-operator/internal/configchecksum"
configbuilder "github.com/kyma-project/kyma/components/telemetry-operator/internal/fluentbit/config/builder"
utils "github.com/kyma-project/kyma/components/telemetry-operator/internal/kubernetes"
"github.com/kyma-project/kyma/components/telemetry-operator/internal/overrides"
resources "github.com/kyma-project/kyma/components/telemetry-operator/internal/resources/logpipeline"
"github.com/prometheus/client_golang/prometheus"
corev1 "k8s.io/api/core/v1"
Expand All @@ -40,8 +41,10 @@ type Config struct {
SectionsConfigMap types.NamespacedName
FilesConfigMap types.NamespacedName
EnvSecret types.NamespacedName
OverrideConfigMap types.NamespacedName
PipelineDefaults configbuilder.PipelineDefaults
ManageFluentBit bool
Overrides overrides.Config
}

//go:generate mockery --name DaemonSetProber --filename daemon_set_prober.go
Expand All @@ -62,9 +65,10 @@ type Reconciler struct {
allLogPipelines prometheus.Gauge
unsupportedLogPipelines prometheus.Gauge
syncer syncer
globalConfig overrides.GlobalConfigHandler
}

func NewReconciler(client client.Client, config Config, prober DaemonSetProber, annotator DaemonSetAnnotator) *Reconciler {
func NewReconciler(client client.Client, config Config, prober DaemonSetProber, annotator DaemonSetAnnotator, handler *overrides.Handler) *Reconciler {
var r Reconciler
r.Client = client
r.config = config
Expand All @@ -74,6 +78,7 @@ func NewReconciler(client client.Client, config Config, prober DaemonSetProber,
r.unsupportedLogPipelines = prometheus.NewGauge(prometheus.GaugeOpts{Name: "telemetry_unsupported_logpipelines", Help: "Number of log pipelines with custom filters or outputs."})
metrics.Registry.MustRegister(r.allLogPipelines, r.unsupportedLogPipelines)
r.syncer = syncer{client, config}
r.globalConfig = handler

return &r
}
Expand All @@ -82,6 +87,20 @@ func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (ctrl.Resu
log := logf.FromContext(ctx)
log.V(1).Info("Reconciliation triggered")

overrideConfig, err := r.globalConfig.UpdateOverrideConfig(ctx, r.config.OverrideConfigMap)
if err != nil {
return ctrl.Result{}, err
}

if err := r.globalConfig.CheckGlobalConfig(overrideConfig.Global); err != nil {
return ctrl.Result{}, err
}

if overrideConfig.Logging.Paused {
log.V(1).Info("Skipping reconciliation of logpipeline as reconciliation is paused.")
return ctrl.Result{}, nil
}

if err := r.updateMetrics(ctx); err != nil {
log.Error(err, "Failed to get all LogPipelines while updating metrics")
}
Expand Down
Expand Up @@ -18,6 +18,8 @@ package logpipeline

import (
"context"
"github.com/kyma-project/kyma/components/telemetry-operator/internal/logger"
"github.com/kyma-project/kyma/components/telemetry-operator/internal/overrides"
"path/filepath"
"testing"

Expand All @@ -28,6 +30,7 @@ import (

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
zapLog "go.uber.org/zap"
"k8s.io/client-go/kubernetes/scheme"
"sigs.k8s.io/controller-runtime/pkg/client"
"sigs.k8s.io/controller-runtime/pkg/envtest"
Expand Down Expand Up @@ -55,6 +58,7 @@ var (
SectionsConfigMap: types.NamespacedName{Name: "test-telemetry-fluent-bit-sections", Namespace: "default"},
FilesConfigMap: types.NamespacedName{Name: "test-telemetry-fluent-bit-files", Namespace: "default"},
EnvSecret: types.NamespacedName{Name: "test-telemetry-fluent-bit-env", Namespace: "default"},
OverrideConfigMap: types.NamespacedName{Name: "override-config", Namespace: "default"},
PipelineDefaults: builder.PipelineDefaults{
InputTag: "kube",
MemoryBufferLimit: "10M",
Expand All @@ -72,6 +76,8 @@ func TestAPIs(t *testing.T) {

var _ = BeforeSuite(func() {
logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true)))
dynamicLoglevel := zapLog.NewAtomicLevel()
configureLogLevelOnFly := logger.NewLogReconfigurer(dynamicLoglevel)

ctx, cancel = context.WithCancel(context.TODO())

Expand Down Expand Up @@ -105,7 +111,9 @@ var _ = BeforeSuite(func() {
Expect(err).ToNot(HaveOccurred())

client := mgr.GetClient()
reconciler := NewReconciler(client, testConfig, &kubernetes.DaemonSetProber{Client: client}, &kubernetes.DaemonSetAnnotator{Client: client})
overrides := overrides.New(configureLogLevelOnFly, &kubernetes.ConfigmapProber{Client: client})

reconciler := NewReconciler(client, testConfig, &kubernetes.DaemonSetProber{Client: client}, &kubernetes.DaemonSetAnnotator{Client: client}, overrides)
err = reconciler.SetupWithManager(mgr)
Expect(err).ToNot(HaveOccurred())

Expand Down
Expand Up @@ -20,16 +20,16 @@ import (
"context"
"errors"
"fmt"
telemetryv1alpha1 "github.com/kyma-project/kyma/components/telemetry-operator/apis/telemetry/v1alpha1"
"github.com/kyma-project/kyma/components/telemetry-operator/internal/configchecksum"
utils "github.com/kyma-project/kyma/components/telemetry-operator/internal/kubernetes"
"github.com/kyma-project/kyma/components/telemetry-operator/internal/overrides"
corev1 "k8s.io/api/core/v1"
"strings"

apierrors "k8s.io/apimachinery/pkg/api/errors"
"k8s.io/apimachinery/pkg/api/resource"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"

telemetryv1alpha1 "github.com/kyma-project/kyma/components/telemetry-operator/apis/telemetry/v1alpha1"
"github.com/kyma-project/kyma/components/telemetry-operator/internal/configchecksum"
utils "github.com/kyma-project/kyma/components/telemetry-operator/internal/kubernetes"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/types"
ctrl "sigs.k8s.io/controller-runtime"
Expand All @@ -42,9 +42,11 @@ type Config struct {
CreateServiceMonitor bool
BaseName string
Namespace string
OverrideConfigMap types.NamespacedName

Deployment DeploymentConfig
Service ServiceConfig
Overrides overrides.Config
}

type DeploymentConfig struct {
Expand All @@ -67,24 +69,39 @@ type DeploymentProber interface {

type Reconciler struct {
client.Client
config Config
Scheme *runtime.Scheme
prober DeploymentProber
config Config
Scheme *runtime.Scheme
prober DeploymentProber
overridesHandler overrides.GlobalConfigHandler
}

func NewReconciler(client client.Client, config Config, prober DeploymentProber, scheme *runtime.Scheme) *Reconciler {
func NewReconciler(client client.Client, config Config, prober DeploymentProber, scheme *runtime.Scheme, handler *overrides.Handler) *Reconciler {
var r Reconciler
r.Client = client
r.config = config
r.Scheme = scheme
r.prober = prober
r.overridesHandler = handler
return &r
}

func (r *Reconciler) Reconcile(ctx context.Context, req ctrl.Request) (reconcileResult ctrl.Result, reconcileErr error) {
logger := logf.FromContext(ctx)
log := logf.FromContext(ctx)

logger.V(1).Info("Reconciliation triggered")
log.V(1).Info("Reconciliation triggered")

overrideConfig, err := r.overridesHandler.UpdateOverrideConfig(ctx, r.config.OverrideConfigMap)
if err != nil {
return ctrl.Result{}, err
}

if err := r.overridesHandler.CheckGlobalConfig(overrideConfig.Global); err != nil {
return ctrl.Result{}, err
}
if overrideConfig.Tracing.Paused {
log.V(1).Info("Skipping reconciliation of tracepipeline as reconciliation is paused")
return ctrl.Result{}, nil
}

var tracePipeline telemetryv1alpha1.TracePipeline
if err := r.Get(ctx, req.NamespacedName, &tracePipeline); err != nil {
Expand Down

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

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

Expand Up @@ -7,6 +7,7 @@ import (
telemetryv1alpha1 "github.com/kyma-project/kyma/components/telemetry-operator/apis/telemetry/v1alpha1"
"github.com/kyma-project/kyma/components/telemetry-operator/internal/setup"
monitoringv1 "github.com/prometheus-operator/prometheus-operator/pkg/apis/monitoring/v1"

appsv1 "k8s.io/api/apps/v1"
corev1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/types"
Expand Down
Expand Up @@ -16,14 +16,18 @@ package tracepipeline
import (
"context"
"github.com/kyma-project/kyma/components/telemetry-operator/internal/kubernetes"
"github.com/kyma-project/kyma/components/telemetry-operator/internal/logger"
"github.com/kyma-project/kyma/components/telemetry-operator/internal/overrides"
"k8s.io/apimachinery/pkg/api/resource"
"k8s.io/apimachinery/pkg/types"
"path/filepath"
"testing"

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
ctrl "sigs.k8s.io/controller-runtime"

zapLog "go.uber.org/zap"
"k8s.io/client-go/kubernetes/scheme"
"k8s.io/client-go/rest"
"sigs.k8s.io/controller-runtime/pkg/client"
Expand All @@ -48,6 +52,7 @@ var testConfig = Config{
CreateServiceMonitor: false,
BaseName: "telemetry-trace-collector",
Namespace: "kyma-system",
OverrideConfigMap: types.NamespacedName{Name: "override-config", Namespace: "kyma-system"},
Deployment: DeploymentConfig{
Image: "otel/opentelemetry-collector-contrib:0.60.0",
CPULimit: resource.MustParse("1"),
Expand All @@ -68,6 +73,8 @@ func TestAPIs(t *testing.T) {

var _ = BeforeSuite(func() {
logf.SetLogger(zap.New(zap.WriteTo(GinkgoWriter), zap.UseDevMode(true)))
dynamicLoglevel := zapLog.NewAtomicLevel()
configureLogLevelOnFly := logger.NewLogReconfigurer(dynamicLoglevel)

ctx, cancel = context.WithCancel(context.TODO())

Expand Down Expand Up @@ -101,8 +108,9 @@ var _ = BeforeSuite(func() {
LeaderElectionID: "ddd7ef0b.kyma-project.io",
})
Expect(err).ToNot(HaveOccurred())
overrides := overrides.New(configureLogLevelOnFly, &kubernetes.ConfigmapProber{Client: k8sClient})

reconciler := NewReconciler(mgr.GetClient(), testConfig, &kubernetes.DeploymentProber{Client: k8sClient}, scheme.Scheme)
reconciler := NewReconciler(mgr.GetClient(), testConfig, &kubernetes.DeploymentProber{Client: k8sClient}, scheme.Scheme, overrides)
err = reconciler.SetupWithManager(mgr)
Expect(err).ToNot(HaveOccurred())

Expand Down