Skip to content

When a configuration error occurs, the change should be rejected and an error message should be provided, rather than generating an empty configuration. #204

@ahfuzhang

Description

@ahfuzhang

I use CRD ClusterVectorPipeline to use jsonline sinks. Yaml is like this:

apiVersion: observability.kaasops.io/v1alpha1
kind: ClusterVectorPipeline
metadata:
  name: vlogs
  namespace: {{ .Release.Namespace }}
spec:
  sinks:
    vlogs:
      # see: https://vector.dev/docs/reference/configuration/sinks/http/
      # jsonline mode
      type: http
      inputs:
        - container-logs-transform
      uri: {{ .Values.vector.endpoint }}
      batch:
        timeout_secs: 5
        max_bytes: 20971520
      buffer:
        type: memory
        max_events: 15000
        when_full: drop_newest
      method: POST
      encoding:
        codec: json
      request:
        retry_attempts: 3
        compression: {{ .Values.vector.compression | default "none" }}
      framing:
        method: newline_delimited

But it not works.
I check the secret:

KUBECONFIG=~/my-test-k8s.yaml kubectl get secret vector-agent -n logging -o json | jq -r '.data."agent.json"' | base64 -d

The config content is:

{
  "api": {
    "address": "0.0.0.0:8686"
  },
  "data_dir": "/vector-data-dir",
  "sinks": {
    "internalMetricsSink": {
      "inputs": [
        "internalMetricsSource"
      ],
      "type": "prometheus_exporter"
    }
  },
  "sources": {
    "internalMetricsSource": {
      "type": "internal_metrics"
    }
  },
  "transforms": {}
}

Maybe, I wrote wrong yaml, but why I didn't got any feedback.

I check the code from github.com/kaasops/vector-operator/internal/pipeline/pipeline.go:
see:

	if filter.Scope == AllPipelines || filter.Scope == NamespacedPipeline {
 
		if filter.Scope == NamespacedPipeline && filter.Namespace == "" {
			return nil, fmt.Errorf("namespace not specified")
		}
		vps, err := GetVectorPipelines(ctx, client)
		if err != nil {
			return nil, err
		}
		if len(vps) != 0 {
			for _, vp := range vps {
				if !vp.IsDeleted() &&
					vp.IsValid() &&  // when vp.IsValid() is false, this line should return error
					vp.GetRole() == filter.Role &&
					(filter.Scope == AllPipelines || vp.Namespace == filter.Namespace) &&
					MatchLabels(matchLabels, vp.Labels) {
					validPipelines = append(validPipelines, vp.DeepCopy())
				}
			}
		}
	}
       // when len(validPipelines)!=len(vps), should return error detail, never use default config

And this line:
see

Sinks *runtime.RawExtension `json:"sinks,omitempty"`

// VectorPipelineSpec defines the desired state of VectorPipeline
type VectorPipelineSpec struct {
	// +kubebuilder:pruning:PreserveUnknownFields
	Sources *runtime.RawExtension `json:"sources,omitempty"`
	// +kubebuilder:pruning:PreserveUnknownFields
	Transforms *runtime.RawExtension `json:"transforms,omitempty"`
	// +kubebuilder:pruning:PreserveUnknownFields
	Sinks *runtime.RawExtension `json:"sinks,omitempty"`
}

Why not use a struct to replace *runtime.RawExtension ?
There needs to be a mechanism to detect configuration errors early and provide feedback.

Thanks.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions