goharbor/harbor · error · Exception
Trace url path not set
Error message
Trace url path not set
What it means
The second check in ScannerAdapterMetadata.Validate: the capabilities array must be present and non-empty. Each declared capability must also consume MimeTypeDockerArtifact and produce at least one supported report mime, but 'invalid capabilities in metadata' specifically means zero capabilities were declared, so the adapter advertises no scan abilities at all.
Source
Thrown at make/photon/prepare/models.py:174
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')
elif self.jaeger.enabled and self.otel.enabled:
raise Exception('Only can have one trace exporter at a time')View on GitHub (pinned to 7b2fd08cc5)
Solutions
- Declare at least one capability that consumes MimeTypeDockerArtifact and produces a supported report mime (native or generic vulnerability report)
- Verify the payload against the adapter's /metadata endpoint and its API spec
- Re-register the scanner once the adapter serves complete metadata
Example fix
// before (adapter /metadata response)
{"scanner": {"name": "trivy", "version": "0.50.0", "vendor": "Aqua Security"}}
// 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
if len(meta.Capabilities) == 0 {
return errors.New("adapter declares no capabilities; cannot register")
} Try / catch
if err := meta.Validate(); err != nil {
if strings.Contains(err.Error(), "invalid capabilities in metadata") {
return errors.New("adapter /metadata needs a non-empty capabilities array")
}
return err
} Prevention
- Require at least one capability consuming MimeTypeDockerArtifact in adapter acceptance tests
- Validate metadata responses during adapter upgrades
- Do not register scanners whose capabilities list is empty
When it happens
Trigger: meta.Validate() on metadata whose JSON has no capabilities key or an empty array — the adapter metadata endpoint returned only the scanner block.
Common situations: Adapters trimmed down for testing that drop the capabilities block; partial metadata after an interrupted adapter upgrade; copy/paste metadata samples missing the capabilities section.
Related errors
- Trace endpoint 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/fbb91ada494be642.
Report an issue: GitHub.