14 releases (8 breaking)
0.9.0 | Mar 5, 2024 |
---|---|
0.8.0 | Dec 31, 2023 |
0.7.0 | Oct 1, 2023 |
0.5.0 | Apr 13, 2023 |
0.2.0 | Jul 31, 2022 |
#1693 in Web programming
1,263 downloads per month
26KB
386 lines
OpenTelemetry support for Google Cloud Trace
Quick start
Cargo.toml:
[dependencies]
opentelemetry-gcloud-trace = "0.8"
Compatibility matrix
opentelemetry-gcloud-trace version | opentelemetry version | tracing-opentelemetry | gcloud-sdk |
---|---|---|---|
0.9 | 0.22 | 0.23 | 0.24 |
0.8 | 0.21 | 0.22 | 0.23 |
0.7 | 0.20 | 0.21 | 0.21 |
0.6 | 0.20 | 0.20 | 0.20 |
0.5 | 0.19 | 0.19 | 0.20 |
0.4 | 0.18 | 0.18 | 0.19 |
Example:
use opentelemetry::trace::*;
use opentelemetry_gcloud_trace::*;
let tracer = GcpCloudTraceExporterBuilder::for_default_project_id().await? // or GcpCloudTraceExporterBuilder::new(config_env_var("PROJECT_ID")?)
.install()
.await?;
tracer.in_span("doing_work_parent", |cx| {
// ...
});
All examples are available at examples directory.
To run an example use with environment variables:
# PROJECT_ID=<your-google-project-id> cargo run --example enable-exporter
[dependencies]
opentelemetry = { version = "*", features = [] }
opentelemetry_sdk = { version = "*", features = ["rt-tokio"] }
opentelemetry-gcloud-trace = "*"
Configuration
You can specify trace configuration using with_trace_config
:
GcpCloudTraceExporterBuilder::new(google_project_id).with_trace_config(
trace::config()
.with_sampler(Sampler::AlwaysOn)
.with_id_generator(RandomIdGenerator::default())
)
Limitations
- This exporter doesn't support any other runtimes except Tokio.
Integration with logs
This crate intentionally doesn't export logs using API to avoid duplicate logs on GKE/GCE environments.
You can use this crate in combination with tracing-stackdriver
crate to produce
JSON formatted logs and logs and traces will be correlated by trace_id
and span_id
fields automatically.
This is an example of this kind of configuration:
fn init_console_log(
tracer: opentelemetry_sdk::trace::Tracer,
) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
let telemetry = tracing_opentelemetry::layer().with_tracer(tracer);
let subscriber = tracing_subscriber::registry::Registry::default()
.with(tracing_subscriber::fmt::layer())
.with(tracing_subscriber::EnvFilter::from_str(
"gcloud_sdk=debug",
)?)
.with(telemetry);
tracing::subscriber::set_global_default(subscriber)?;
Ok(())
}
fn init_stackdriver_log(
gcp_project_id: &str,
tracer: opentelemetry_sdk::trace::Tracer,
) -> Result<(), BoxedError> {
let telemetry_layer = tracing_opentelemetry::layer().with_tracer(tracer);
let stackdriver_layer = tracing_stackdriver::layer().with_cloud_trace(
tracing_stackdriver::CloudTraceConfiguration {
project_id: gcp_project_id.to_string(),
},
);
let subscriber = tracing_subscriber::Registry::default()
.with(telemetry_layer)
.with(stackdriver_layer)
.with(tracing_subscriber::EnvFilter::from_str(
"gcloud_sdk=debug",
)?);
tracing::subscriber::set_global_default(subscriber)
.expect("Could not set up global logger");
Ok(())
}
async fn init_tracing(app_mode: &GlobalAppMode,
gcp_project_id: &str) -> Result<(), BoxedError> {
let tracer = GcpCloudTraceExporterBuilder::new(gcp_project_id.into())
.install()
.await?;
match app_mode {
GlobalAppMode::Production => init_stackdriver_log(gcp_project_id, tracer),
GlobalAppMode::Development => init_console_log(tracer),
}
}
Licence
Apache Software License (ASL)
Author
Abdulla Abdurakhmanov
Dependencies
~107MB
~1.5M SLoC