| Crates.io | tracing-honeycomb |
| lib.rs | tracing-honeycomb |
| version | 0.4.3 |
| created_at | 2020-03-10 22:35:33.136595+00 |
| updated_at | 2021-12-27 19:47:55.188016+00 |
| description | Honeycomb.io tracing layer for multiprocess telemetry |
| homepage | |
| repository | https://github.com/eaze/tracing-honeycomb |
| max_upload_size | |
| id | 217401 |
| size | 85,995 |
This crate provides:
TelemetryLayer, that can be used to publish trace data to honeycomb.ioAs a tracing layer, TelemetryLayer can be composed with other layers to provide stdout logging, filtering, etc.
Add the following to your Cargo.toml to get started.
tracing-honeycomb = "0.4.1"
This crate provides two functions for out of band interaction with the TelemetryLayer
register_dist_tracing_root registers the current span as the local root of a distributed trace.current_dist_trace_ctx fetches the TraceId and SpanId associated with the current span.Here's an example of how they might be used together:
TraceId.current_dist_trace_ctx to fetch the current TraceId and SpanId. It passes these values along with an RPC request, as metadata.TraceId and remote parent SpanId provided in the request's metadata to register the handler function's span as a local root of the distributed trace initiated in step 1.The following example shows how to create and register a subscriber created by composing TelemetryLayer with other layers and the Registry subscriber provided by the tracing_subscriber crate.
let honeycomb_config = libhoney::Config {
options: libhoney::client::Options {
api_key: honeycomb_key,
dataset: "my-dataset-name".to_string(),
..libhoney::client::Options::default()
},
transmission_options: libhoney::transmission::Options::default(),
};
let telemetry_layer = mk_honeycomb_tracing_layer("my-service-name", honeycomb_config);
// NOTE: the underlying subscriber MUST be the Registry subscriber
let subscriber = registry::Registry::default() // provide underlying span data store
.with(LevelFilter::INFO) // filter out low-level debug tracing (eg tokio executor)
.with(tracing_subscriber::fmt::Layer::default()) // log to stdout
.with(telemetry_layer); // publish to honeycomb backend
tracing::subscriber::set_global_default(subscriber).expect("setting global default failed");
Since TraceCtx::current_trace_ctx and TraceCtx::record_on_current_span can be expected to return Ok as long as some TelemetryLayer has been registered as part of the layer/subscriber stack and the current span is active, it's valid to .expect them to always succeed & to panic if they do not. As a result, you may find yourself writing code that fails if no distributed tracing context is present. This means that unit and integration tests covering such code must provide a TelemetryLayer. However, you probably don't want to publish telemetry while running unit or integration tests. You can fix this problem by registering a TelemetryLayer constructed using BlackholeTelemetry. BlackholeTelemetry discards spans and events without publishing them to any backend.
let telemetry_layer = mk_honeycomb_blackhole_tracing_layer();
// NOTE: the underlying subscriber MUST be the Registry subscriber
let subscriber = registry::Registry::default() // provide underlying span data store
.with(LevelFilter::INFO) // filter out low-level debug tracing (eg tokio executor)
.with(tracing_subscriber::fmt::Layer::default()) // log to stdout
.with(telemetry_layer); // publish to blackhole backend
tracing::subscriber::set_global_default(subscriber).expect("setting global default failed");
MIT