Observability is a key feature for operating a service in production and using this data you can identify abnormal statuses and make informed decisions to fix issues when an error occurs. The distributed tracing is key element of observability in modern application. Harbor can provide distributed tracing data for operators and administrator to know the current running status and to help troubleshooting. Harbor expose tracing data using the OpenTelemetry sdk, you can eazily export traces via Otel protocol which can comsumed by OpenTelemetry Collector then expose to almost the on-prem or cloud trace backend. Because of the popularity Jaeger, Harbor also can expose tracing data to Jaeger backend directly.

In harbor v2.4 and later you are able to enable distributed tracing in you Harbor configuration file. But we only support one exporter at a time( you can not set bosh or none of them if you enabled tracing). You can set otel as exporter and leveraging OpenTelemetry Collector to retransmit to multiple backend if you want to send data to multiple exporter. And similarly, Jaeger exporter support agent mode and endpoint mode, but only one mode can enabled at a time.

Exposed data

Tracing data are exposed by serveral Harbor components: core, jobservice, registry. The following sections list the available Harbor trace data.

DataComponentExample
Received HTTP RequestCoreEvery HTTP request (like operation on harbor UI, push image, etc. )
Client Sent HTTP RequestCorecore access other services via HTTP(like health check, proxy to chartmuseum, call job service API, etc.)
Request IDCoreEvery http tracing will added a X-Request-ID , which will help to find the log
Database TransactionCoreEvery Operation that triggered DB transaction(like create project, push image to harbor, etc)
Received HTTP RequestJobserviceEvery HTTP request(like health check, call from core, etc.)
Client Sent HTTP RequestJobservicejobservice access other services via HTTP(like replication job calling core API to push image, GC job calling registryctl API, etc.)
backend jobsJobserviceAny job ran by jobservice
Received HTTP RequestRegistryctlEvery HTTP request(like health check from core, call from jobservice, etc.)