Skip to main content

Log events reference

Every structured event the plugin can emit, exactly as named in hermes_otel.log_events.EVENTS. An event is an OTel log record with event_name set, emitted through Logger.emit on the plugin's own instrumentation scope (hermes_otel, version = the plugin version), never through the stdlib logging bridge. Events are off by default; logs.events.enabled: true turns them on, and they reach every log-capable backend and the dashboard's live store as long as one exists, with or without logs.capture. See Logs and events for the switches and the content rules.

What every event carries. The trace and span ids of the turn it belongs to (the enrichment processor records the tier as hermes.log.attribution: context), hermes.session_id and gen_ai.conversation.id, hermes.platform from the session root, the resource shared with spans and metrics, and the attributes listed below using the same names as the span the event mirrors (span attributes). Bodies are one display line. Secrets are redacted before any sink sees the record, like every other log record.

Content. Attributes marked content-gated carry prompt, response or tool content and are the only ones logs.events.content governs: full keeps what the span has, preview clips to preview_max_chars, off drops them, inherit (the default) follows content_capture. A backend's own logs: {events: {content: …}} may narrow them further for that backend only. Metadata attributes always travel.

Severity. Severity numbers follow the OTel bands (INFO 9, WARN 13, ERROR 17); the rule per event is stated in its section. hermes.tool.duration_s and hermes.turn.duration_s exist only on events (the spans carry the *_ms form); everything else is shared with the spans.

This page is generated from the code by scripts/gen_config_docs.py; tests/unit/test_config_surface.py fails when it drifts, and tests/unit/test_log_events_docs.py fails when a hook emits an event the catalogue does not list.

Events​

hermes.turn.start​

Emitted from pre_llm_call. Severity: INFO. Body: turn <n> started.

AttributeContent-gated
hermes.session_id
gen_ai.conversation.id
hermes.platform
gen_ai.request.model
gen_ai.provider.name
hermes.turn.number

hermes.turn.end​

Emitted from on_session_end. Severity: INFO; WARN when interrupted; ERROR when failed. Body: turn <n> <final_status>.

AttributeContent-gated
hermes.turn.number
hermes.turn.final_status
hermes.turn.exit_reason
hermes.turn.api_call_count
hermes.turn.tool_count
hermes.turn.tools
gen_ai.usage.input_tokens
gen_ai.usage.output_tokens
gen_ai.usage.cache_read.input_tokens
gen_ai.usage.reasoning.output_tokens
hermes.cost.usage
hermes.turn.duration_s
error.type

hermes.tool.call​

Emitted from post_tool_call. Severity: INFO; WARN when blocked or timed out; ERROR on error. Body: tool <name> <outcome>.

AttributeContent-gated
gen_ai.tool.name
gen_ai.tool.call.id
gen_ai.tool.type
hermes.tool.outcome
hermes.tool.decided_by
hermes.tool.duration_s
gen_ai.tool.call.argumentsyes
gen_ai.tool.call.resultyes

hermes.approval.decision​

Emitted from post_approval_response. Severity: INFO; WARN when denied or timed out. Body: approval <choice> for <tool>.

AttributeContent-gated
hermes.approval.choice
hermes.approval.granted
hermes.approval.decided_by
hermes.approval.surface
hermes.approval.timed_out
hermes.approval.duration_ms
gen_ai.tool.name

hermes.api.error​

Emitted from api_request_error. Severity: ERROR; WARN when retryable. Body: api error <error.type> from <provider>.

AttributeContent-gated
error.type
http.response.status_code
hermes.retryable
hermes.retry.count
gen_ai.request.model
gen_ai.provider.name
exception.type
exception.message

hermes.subagent.start​

Emitted from subagent_start. Severity: INFO. Body: sub-agent <role> started.

AttributeContent-gated
hermes.subagent.role
hermes.subagent.child_session_id
hermes.subagent.parent_session_id
hermes.subagent.goalyes

hermes.subagent.stop​

Emitted from subagent_stop. Severity: INFO; ERROR when the sub-agent reports failure. Body: sub-agent <role> <status>.

AttributeContent-gated
hermes.subagent.role
hermes.subagent.status
hermes.subagent.duration_ms
hermes.subagent.child_session_id
hermes.subagent.parent_session_id
hermes.subagent.summaryyes

hermes.session.finalize​

Emitted from on_session_finalize / on_session_reset. Severity: INFO. Body: session <id> <finalized|reset> (<reason>): <n> turn(s).

AttributeContent-gated
hermes.session.turn_count
hermes.session.duration_s
hermes.session.finalize_reason / hermes.session.reset_reason

gen_ai.client.inference.operation.details​

Emitted from post_api_request. Severity: INFO. Body: <operation> <model> (<input>/<output> tokens).

AttributeContent-gated
gen_ai.operation.name
gen_ai.provider.name
gen_ai.request.model
gen_ai.response.model
gen_ai.response.id
gen_ai.response.finish_reasons
gen_ai.usage.input_tokens
gen_ai.usage.output_tokens
gen_ai.conversation.id
gen_ai.input.messagesyes
gen_ai.output.messagesyes
gen_ai.system_instructionsyes

See also​

  • Logs and events — the pipeline, the logs: block, attribution and redaction.
  • Span attributes — the names the events reuse.
  • Metrics — the aggregates; an event is the per-occurrence record.