SigNoz
SigNoz is an open-source observability platform that speaks OTLP natively across all three signals. It's one of the few OSS options that unifies traces, metrics, and logs in a single UI.
Signals: traces + metrics + logs. Deployment: local (docker compose) or cloud. Cost: OSS (self-host) / free tier + paid (cloud).
Self-hosted
A ready-to-use compose file ships with the plugin. Upstream SigNoz listens for OTLP/HTTP on the standard port 4318, which collides with any other collector on the host (the LGTM stack, for one). The bundled compose file moves it to 4328, and the UI from 8080 to 3301:
cd ~/.hermes/plugins/hermes_otel
docker compose -f docker-compose/signoz/docker-compose.yaml up -d
Then:
export OTEL_SIGNOZ_ENDPOINT="http://localhost:4328/v1/traces"
UI at http://localhost:3301. Before SigNoz accepts any data you must register the first admin user; see Troubleshooting.
SigNoz Cloud
export OTEL_SIGNOZ_ENDPOINT="https://ingest.us.signoz.cloud:443/v1/traces"
export OTEL_SIGNOZ_INGESTION_KEY="sz-..."
When OTEL_SIGNOZ_INGESTION_KEY is set, the plugin sends it as the signoz-ingestion-key header on the traces, metrics and logs exporters. Metrics go out as delta, the signoz type's preset.
Regional endpoints:
- US:
https://ingest.us.signoz.cloud:443/v1/traces - EU:
https://ingest.eu.signoz.cloud:443/v1/traces - India:
https://ingest.in.signoz.cloud:443/v1/traces
Multi-backend config
backends:
- type: signoz
endpoint: http://localhost:4328/v1/traces
# SigNoz Cloud only — ignored by self-hosted
ingestion_key_env: OTEL_SIGNOZ_INGESTION_KEY
What you'll see
SigNoz treats the plugin's spans as standard OTel traces. The service-map view lights up with the session → llm → api → tool edges, and the trace detail panel shows the nested span tree with the full attribute payload.
Metrics flow to the SigNoz metrics UI automatically:
hermes.token.usage(counter, bytoken_type)hermes.model.usage(counter: completed messages per model and provider)gen_ai.execute_tool.duration(histogram, seconds; the deprecatedhermes.tool.durationin milliseconds is still sent)gen_ai.client.operation.duration(histogram, seconds)
Full list: Metrics reference.
See Span attributes reference for the full list.
Dashboard
The bundled dashboard's SigNoz adapter (and the observability skill with
--source signoz) reads traces, metrics and logs back through SigNoz's
query API. It needs two extra keys on the backend entry, because the query API
sits on the UI port and requires authentication even when ingestion does not:
- type: signoz
endpoint: http://localhost:4328/v1/traces
query_port: 3301 # the SigNoz UI/API port (443 behind an HTTPS ingress)
api_key_env: SIGNOZ_API_KEY # a PAT or a session JWT; sent as both SIGNOZ-API-KEY and Bearer
Metrics are read with the query builder (/api/v4/query_range): counters such
as hermes.token.usage are shown as the increase per bucket (delta and
cumulative alike), gauges as the per-bucket reduction; the instrument list comes
from the metrics autocomplete API, without histogram .bucket/.min/.max
internals. Logs filter on trace_id, hermes.session_id, the logger (SigNoz's
scope_name), severity and body text; the logger list is a count grouped by
scope_name.
Attribute convention
SigNoz reads gen_ai.* attributes for LLM-specific views, which the plugin emits alongside the OpenInference llm.* convention. Both sets land on the same spans — SigNoz uses whichever it recognises.
Troubleshooting
"Connection refused on 4318 right after a fresh self-hosted install"
- The SigNoz collector opens its receivers only after it has registered with
the SigNoz server over OpAMP, and that registration fails until the first
admin user (and with it the organisation) exists —
signozlogsfailed to find or create agenton every heartbeat. Register the admin in the UI (orPOST /api/v1/register), and ingestion starts within a minute. Until then every export is a silently dropped batch.
"Port 4318 is already in use"
- 4318 is the standard OTLP/HTTP port, so any other collector on the host (the LGTM stack, a Collector) may already hold it. The bundled compose file moves SigNoz to 4328 (
SIGNOZ_OTLP_HTTP_PORT). If you've customised it, double-check the port.
"Cloud ingestion: 401 / missing key"
- The ingestion key is required for SigNoz Cloud. The header is
signoz-ingestion-key, notAuthorization. The plugin sets it automatically whenOTEL_SIGNOZ_INGESTION_KEYis defined.
"Metrics show up, traces don't"
OTEL_SIGNOZ_ENDPOINT(orendpoint:) is the traces URL and must end in/v1/traces; the plugin derives the/v1/metricsand/v1/logsURLs from it. If you set a custom endpoint inhermes_otel.yaml, double-check the path.