SigNoz/signoz · error

invalid_input

invalid_input

Error message

PipelineOperator.ID is required

What it means

isValidOperator (used by Pipeline.IsValid) requires every operator in a pipeline config to have a non-empty ID before its type-specific validation runs. Operator IDs identify operators in references and error messages.

Source

Thrown at pkg/types/pipelinetypes/pipeline.go:271

		if op.ID == op.Output {
			return errors.NewInvalidInputf(errors.CodeInvalidInput, "id and output cannot be same")
		}

		err := isValidOperator(op)
		if err != nil {
			return err
		}

		idUnique[op.ID] = struct{}{}
		outputUnique[op.Output] = struct{}{}
	}
	return nil
}

func isValidOperator(op PipelineOperator) error {
	if op.ID == "" {
		return errors.New(errors.TypeInvalidInput, errors.CodeInvalidInput, "PipelineOperator.ID is required")
	}

	switch op.Type {
	case "json_parser":
		if op.ParseFrom == "" && op.ParseTo == "" {
			return errors.NewInvalidInputf(errors.CodeInvalidInput, "parse from and parse to of %s json operator cannot be empty", op.ID)
		}

		for k := range op.Mapping {
			if !slices.Contains(validMappingVariableTypes, strings.ToLower(k)) {
				return errors.NewInvalidInputf(errors.CodeInvalidInput, "%s is not a valid mapping type in processor %s", k, op.ID)
			}
		}
	case "grok_parser":
		if op.Pattern == "" {
			return errors.NewInvalidInputf(errors.CodeInvalidInput, "pattern of %s grok operator cannot be empty", op.ID)
		}
	case "regex_parser":

View on GitHub (pinned to 5069bf80b0)

Solutions

  1. Add a unique non-empty id to each operator (e.g. json_parser_input)
  2. Check the pipeline schema — id is required for all operator types
  3. Use the SigNoz pipeline UI which auto-generates ids
  4. Validate with IsValid client-side before submitting

Example fix

// before
{"type":"json_parser","parseFrom":"body"}
// after
{"id":"parse_body","type":"json_parser","parseFrom":"body"}
Defensive patterns

Strategy: validation

Validate before calling

pipeline.operators.every(op => typeof op.id === 'string' && op.id.length > 0)

Type guard

function operatorsHaveIDs(ops: Array<{id?:string}>): boolean { return ops.every(o => typeof o.id === 'string' && o.id !== ''); }

Prevention

When it happens

Trigger: Creating/updating a logging pipeline where an operator entry in spec.pipeline operators[] has no id field or an empty string id.

Common situations: Pipeline YAML/JSON authored by hand omitting id; conversion from other formats (Fluent Bit) that drop operator names; UI regressions not generating unique ids.

Related errors


AI-assisted analysis of SigNoz/signoz@5069bf80b0 (2026-08-28). Data as JSON: /api/errors/fd1581bdaa1a8acb. Report an issue: GitHub.