goharbor/harbor · error · Exception

Trace endpoint not set

Error message

Trace endpoint not set

What it means

ScannerAdapterMetadata.Validate checks the payload served by a scanner adapter's /metadata endpoint. 'invalid scanner in metadata' means the Scanner block is absent, or its Name, Version, or Vendor string is empty — all three are mandatory before the adapter can be registered as a scanner.

Source

Thrown at make/photon/prepare/models.py:172

        if self.endpoint and self.agent_host:
            raise Exception('Jaeger Colector Endpoint and Agent host both set, only can set one')


class OtelExporter:
    def __init__(self, config: dict):
        if not config:
            self.enabled = False
            return
        self.enabled = True
        self.endpoint = config.get('endpoint')
        self.url_path = config.get('url_path')
        self.compression = config.get('compression') or False
        self.insecure = config.get('insecure') or False
        self.timeout = config.get('timeout') or '10'

    def validate(self):
        if not self.endpoint:
            raise Exception('Trace endpoint not set')
        if not self.url_path:
            raise Exception('Trace url path not set')


class Trace:
    def __init__(self, config: dict):
        self.enabled = config.get('enabled') or False
        self.sample_rate = config.get('sample_rate', 1)
        self.namespace = config.get('namespace') or ''
        self.jaeger = JaegerExporter(config.get('jaeger'))
        self.otel = OtelExporter(config.get('otel'))
        self.attributes = config.get('attributes') or {}

    def validate(self):
        if not self.enabled:
            return
        if not self.jaeger.enabled and not self.otel.enabled:
            raise Exception('Trace enabled but no trace exporter set')

View on GitHub (pinned to 7b2fd08cc5)

Solutions

  1. Fix the adapter's /metadata payload to include scanner.name, scanner.version and scanner.vendor
  2. Inspect the raw payload (curl the adapter's /metadata endpoint) to see exactly which field is missing
  3. Upgrade the adapter to a spec-compliant release

Example fix

// before (adapter /metadata response)
{"scanner": {"name": "trivy"}}

// after
{"scanner": {"name": "trivy", "version": "0.50.0", "vendor": "Aqua Security"},
 "capabilities": [{"consumes_mime_types": ["application/vnd.docker.distribution.manifest.v2+json"],
                  "produces_mime_types": ["application/vnd.scanner.adapter.vuln.report.harbor+json"]}]}
Defensive patterns

Strategy: validation

Validate before calling

meta, err := c.GetMetadata()
if err != nil {
    return err
}
if meta.Scanner == nil || meta.Scanner.Name == "" || meta.Scanner.Version == "" || meta.Scanner.Vendor == "" {
    return fmt.Errorf("adapter metadata incomplete: %+v", meta.Scanner)
}

Try / catch

if err := meta.Validate(); err != nil {
    if strings.Contains(err.Error(), "invalid scanner in metadata") {
        return fmt.Errorf("adapter /metadata must set scanner.name, scanner.version, scanner.vendor")
    }
    return err
}

Prevention

When it happens

Trigger: client.GetMetadata() followed by meta.Validate() where the adapter's JSON omits scanner, scanner.name, scanner.version, or scanner.vendor.

Common situations: Minimal or third-party adapters that fill only a name; adapters built against an older spec revision; JSON field-name casing mismatches in hand-written metadata payloads.

Related errors


AI-assisted analysis of goharbor/harbor@7b2fd08cc5 (2026-08-16). Data as JSON: /api/errors/d444dd071043df47. Report an issue: GitHub.