How signals work in Honeycomb
In Honeycomb, traces and logs are stored as structured events: labeled JSON objects sent over HTTP, indexed automatically on every field at ingest, and queryable without a predefined schema. Metrics are different; they arrive as time-series data points in dedicated metrics datasets rather than as events. Understanding this distinction helps explain why each signal is queried differently in Honeycomb. To learn how Honeycomb organizes events into datasets, environments, and teams, visit Honeycomb Resource Structure.Traces
A trace is a record of a request as it travels through your system. It is made up of spans, each representing one unit of work, such as a database query or a service call. Spans share a trace ID that identifies which trace they belong to. In Honeycomb, each span is stored as a structured event: a labeled JSON object you can filter, group, and aggregate on any field. Honeycomb uses the parent-child relationships between spans, expressed viatrace.parent_id and trace.span_id, to render a waterfall view of execution flow across your services.
Traces are the right signal when you want to:
- Follow a specific request across multiple services
- Understand execution flow and latency at the span level
- Correlate errors or slowdowns with the exact code path that produced them
With OpenTelemetry, Honeycomb calculates
duration_ms from each span’s start and end time during ingest.service.name, filter by http.response.status_code, compute a P95 on duration_ms, or use BubbleUp to identify which dimensions differ most across a selected region of your data.
To learn how to send traces to Honeycomb, visit Send Data.
Metrics
A metric is a numeric measurement of something in your system, captured at regular intervals over time. Metrics describe the state or behavior of a resource (a host, a service, a database connection pool) rather than a specific unit of work. Honeycomb supports metrics as a native signal built on the OpenTelemetry Metrics Data Model, including gauges, counters, sums, and histograms. Metrics are ingested as time-series data points in dedicated metrics datasets and are queried with metric-specific functions likeRATE(), INCREASE(), and LAST() that account for the time-based nature of metric data.
Metrics are the right signal when you want to:
- Monitor infrastructure health consistently: CPU utilization, memory usage, request rates
- Alert on threshold conditions over time using rates and trends
- Track known quantities you always care about, regardless of what any individual request is doing
How Honeycomb metrics differ from pre-aggregated metrics
Some systems emit pre-aggregated metrics: rollups computed before write time, such as totals, averages, and percentiles calculated before sending to Honeycomb. Pre-aggregated metrics are efficient to produce, but they have a fundamental limitation: you can only ask questions that were anticipated at instrumentation time. For example, if you want to know how your system performs when the storage engine has a cache hit, that dimension needs to have been included in the pre-aggregated rollup:avg_duration_cache_hit_true, avg_duration_cache_hit_false, p95_duration_cache_hit_true, and so on.
Each new dimension multiplies the number of pre-aggregated rows required; this is the “curse of dimensionality.”
In contrast, Honeycomb’s native metrics preserve the full resolution of your data and let you ask questions at query time rather than instrumentation time.
To see this difference in practice, refer to the Events vs. Pre-aggregated Metrics section.
Logs
A log is a record of a discrete event in your system: an error, a state change, a user action, or any output your application emits at a specific point in time. Honeycomb receives logs as structured events, which means you can query them the same way you query trace data.Structured logs
A structured log has consistent, labeled fields, like JSON output from an application logger or similar to what you might expect to see in a spreadsheet or a comma-separated-value file. Because of this structure, a structured log maps naturally to a structured event: its fields become event fields, immediately queryable in the Query Builder. Here is an example of a structured log line:Unstructured logs
An unstructured log is a sequence of free-form messages, convenient for a person to read but harder to query. When Honeycomb starts itsretriever service, the console prints something like this:
Using signals together
Honeycomb supports all three signals in the same platform, so you can move between them without switching tools. A common investigation pattern:- A metrics alert surfaces a problem: error rate is elevated.
- A log query narrows the scope: these specific error messages are occurring most frequently.
- A trace investigation explains the cause: this is where in the request execution the error originates.
Correlations
When you run an events-based query, Honeycomb surfaces related metrics in the Correlations view when metrics data exists for your environment. For example, if a latency spike coincides with a host running out of memory, you can see both signals side by side without leaving the Query Builder. To learn more, visit Correlations.Metrics-based Triggers
You can alert on metrics data using the same Trigger system you use for events. A metrics alert can tell you that something is wrong; a trace investigation tells you why. To learn more, visit Metrics-based Triggers.Logs as events
Because Honeycomb receives logs as events, you can query log data the same way you query any other dataset: filter, group, and aggregate across any field. To learn more, visit Logs in Honeycomb.Managing data volume
If event volume is a concern, you can sample your data to reduce volume while keeping aggregates statistically accurate. For example, you could send one in a hundredstatus:200s but send every status:500.
When your instrumentation includes a sample_rate on each event, Honeycomb uses it to scale counts so query results reflect your true traffic volume.
To learn more, visit Sampling Guidelines.
For metrics, factors like your collection interval and the number of active time series affect how many data points you send.
To learn more, visit Manage Metrics Data Volume and How Honeycomb Calculates Usage.
Code examples
The following examples show how the same piece of code can be instrumented in different ways and how the outputs differ. Understanding these differences helps you choose the right signal for each job.Events vs. pre-aggregated metrics

Events output
In this example, Honeycomb was used for events. Although a graph was rendered, the raw data gives a more equal comparison.
Pre-aggregated metrics output
In this example, pre-aggregated metrics were used.
Comparison
Both examples capture the duration in milliseconds and how many times the example app was run. At first glance, the metrics output appears to have more data, but all of those values can be calculated from the event data at query time. Pre-aggregated metrics tools need to do this calculation before write time, which limits what you can ask later. Events let you add richer context, like input, output, and timestamps, and compute any aggregation at query time.Events vs. unstructured logs

duration_ms on the stored span.
With logs, you write it as part of a log statement.
In this example, the timestamp for each log statement is included inline and can be parsed out with regex.
Each log line includes a description of the data followed by the value itself, in this case, the duration in milliseconds.
Events output
In this example, Honeycomb was used for events. Although a graph was rendered, the raw data gives a more equal comparison.
Logs output
The logged output: