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
- Fix the adapter's /metadata payload to include scanner.name, scanner.version and scanner.vendor
- Inspect the raw payload (curl the adapter's /metadata endpoint) to see exactly which field is missing
- 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
- curl the adapter's /metadata endpoint during onboarding and eyeball the scanner block
- Pin spec-compliant adapter versions
- Validate metadata before persisting a scanner registration
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
- Trace url path not set
- File {} not exist
- Internal dir for tls {} not exist
- Port number in metrics is not valid
- Jaeger Colector Endpoint or Agent host not set, must set one
AI-assisted analysis of goharbor/harbor@7b2fd08cc5 (2026-08-16).
Data as JSON: /api/errors/d444dd071043df47.
Report an issue: GitHub.