Crates.io | opentelemetry-gcloud-trace |
lib.rs | opentelemetry-gcloud-trace |
version | 0.15.0 |
source | src |
created_at | 2022-07-23 13:36:02.116759 |
updated_at | 2024-09-10 15:59:01.824826 |
description | OpenTelemetry support for Google Cloud Trace |
homepage | https://github.com/abdolence/opentelemetry-gcloud-trace-rs |
repository | https://github.com/abdolence/opentelemetry-gcloud-trace-rs |
max_upload_size | |
id | 631409 |
size | 97,182 |
Cargo.toml:
[dependencies]
opentelemetry-gcloud-trace = "0.15"
opentelemetry-gcloud-trace version | opentelemetry version | tracing-opentelemetry | gcloud-sdk |
---|---|---|---|
0.15 | 0.25 | 0.26 | 0.25 |
0.12 | 0.24 | 0.25 | 0.25 |
0.11 | 0.23 | 0.24 | 0.25 |
0.10 | 0.23 | 0.24 | 0.24 |
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 = "*"
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())
)
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),
}
}
Cargo provides support for different TLS features for dependencies:
tls-roots
: default feature to support native TLS rootstls-webpki-roots
: feature to switch to webpki crate rootsApache Software License (ASL)
Abdulla Abdurakhmanov