GCP Observability for Rust
A lightweight, high-performance Google Cloud Platform observability library for Rust applications. Provides easy-to-use APIs for Cloud Logging, Cloud Monitoring, and Cloud Trace with a background worker for non-blocking operations.
Builder notes
This crate was devoloped by Santiago Amoretti in the context of the devlopment of Genevabm(https://genevabm.com) after facing multiple issue mainly caused by Googles inhability to provide good crates and APIS to interact with its services.
We are used to this idea of using crates to do work that, under the hood, just concist of the most simple way of communication beetween services: A plain HTTP hit. When this happens, i would argue its much better to generate your own structure than to use existing ones. Thats what i did. I figured out the JSON structures, interacted with GCP from the command line and created a single threaded model which is taylor made for microservices.
You can use what i did. You could also modify it to extend its behaviour. Maybe, youll just benefit from the idea of knowing that most of this APIS are high level and intricated for no reason, which makes a good argument for creating your own stuff.
This documentation is AI generated. Not the code, tho. So rest assured.
Features
- π Non-Blocking: Fire-and-forget API with background processing
- π Cloud Logging: Send structured logs to Google Cloud Logging
- π Cloud Monitoring: Create custom metrics in Google Cloud Monitoring
- π Cloud Trace: Create distributed traces in Google Cloud Trace
- π Auto Token Refresh: Automatic handling of gcloud token expiration
- β‘ High Performance: Single-threaded worker with bounded channel
- π‘οΈ Error Resilient: Automatic retry logic for auth failures
- π― Builder Pattern: Fluent API for constructing observability data
- πͺΆ Lightweight: Uses gcloud CLI for auth, REST APIs for data
Installation
Add this to your Cargo.toml:
[]
= "0.1.3"
= { = "1", = ["rt-multi-thread", "macros"] }
Prerequisites
-
Google Cloud Project with APIs enabled:
- Cloud Logging API
- Cloud Monitoring API
- Cloud Trace API
-
Service Account JSON with roles:
roles/logging.logWriterroles/monitoring.metricWriterroles/cloudtrace.agent
-
gcloud CLI (automatically installed if missing)
Architecture
The library uses a channel-based architecture for optimal performance:
βββββββββββββββ βββββββββββ ββββββββββββββββ
β Your App ββββββββββΆβ Channel ββββββββββΆβ Worker Threadβ
β (main) β queue β (1027) β process β (async ops) β
βββββββββββββββ βββββββββββ ββββββββββββββββ
β
βΌ
ββββββββββββββββ
β GCP APIs β
ββββββββββββββββ
Quick Start
Fire-and-Forget (Recommended)
use ;
use HashMap;
use ;
async
Async (Wait for Completion)
When you need confirmation that an operation succeeded:
// Wait for operation to complete
client.send_log_async.await?;
client.send_metric_async.await?;
client.send_trace_async.await?;
Using Convenience Macros
use ;
gcp_info!?;
gcp_warn!?;
gcp_error!?;
API Reference
ObservabilityClient
Initialization
new(project_id, service_account_path)βResult<Self, ObservabilityError>- Creates and authenticates a new client
- Starts background worker thread
Fire-and-Forget Methods
send_log(log_entry: LogEntry)βResult<(), ObservabilityError>send_metric(metric_data: MetricData)βResult<(), ObservabilityError>send_trace(trace_span: TraceSpan)βResult<(), ObservabilityError>
Async Methods (Wait for Completion)
send_log_async(log_entry: LogEntry)βFuture<Result<(), ObservabilityError>>send_metric_async(metric_data: MetricData)βFuture<Result<(), ObservabilityError>>send_trace_async(trace_span: TraceSpan)βFuture<Result<(), ObservabilityError>>
Utility Methods
generate_trace_id()βString- Generate a 32-character hex trace IDgenerate_span_id()βString- Generate a 16-character hex span ID
Data Structures
LogEntry
new
MetricData
new
TraceSpan
new
Convenience Macros
gcp_info!(client, "message")- Send an INFO log (fire-and-forget)gcp_warn!(client, "message")- Send a WARNING log (fire-and-forget)gcp_error!(client, "message")- Send an ERROR log (fire-and-forget)gcp_log!(client, "LEVEL", "message")- Send a log with custom severity
Error Handling
The library provides comprehensive error handling:
Error Types
AuthenticationError- Failed to authenticate with gcloudApiError- Google Cloud API request failedSetupError- Failed to setup/install gcloud CLIShutdown- Special internal error for worker shutdown
Token Expiration
The library automatically handles token expiration:
- Detects expired tokens (401/403 HTTP responses)
- Re-authenticates using your service account
- Retries the failed operation with a fresh token
- All happens transparently in the background
Silent Failures
Background operations fail silently to avoid disrupting your application. If you need error feedback, use the async methods:
match client.send_log_async.await
Performance
Characteristics
- Non-blocking: Fire-and-forget operations return immediately
- Bounded Channel: 1027-item buffer prevents memory overflow
- Single Worker: One background thread prevents API rate limiting
- No Synchronization Overhead: Minimal locking and contention
- Fast Compilation: No heavy protobuf or gRPC dependencies
Benchmarks
On a typical development machine:
- Fire-and-forget operation: < 1Β΅s
- Background processing: ~50-200ms per operation (network dependent)
- Channel capacity: 1027 items before blocking
Features
[]
= { = "0.1.0", = ["logging", "monitoring"] }
Available features:
logging- Cloud Logging functionalitymonitoring- Cloud Monitoring functionalitytracing- Cloud Trace functionalitydefault- Includes all features
Examples
Run the example:
# Set your project ID and service account path
Architecture
This library uses a unique approach that balances simplicity with performance:
- Lightweight: No heavy protobuf or gRPC dependencies
- Simple: Uses standard HTTP/REST APIs via curl
- Reliable: Leverages battle-tested gcloud CLI for authentication
- Fast: Minimal overhead and fast compilation times
- Resilient: Automatic token refresh and retry logic
Background Worker
The single-threaded worker model provides natural rate limiting:
- One thread processes all operations sequentially
- Prevents overwhelming GCP APIs
- No complex rate limiting logic needed
- Predictable memory usage
Troubleshooting
Authentication Issues
# Verify gcloud is installed
# Verify service account works
API Not Enabled
Enable required APIs in your GCP project:
Permission Issues
Ensure your service account has the required roles:
roles/logging.logWriterroles/monitoring.metricWriterroles/cloudtrace.agent
License
Licensed under the Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0).
Contributing
Contributions are welcome! Please feel free to submit a Pull Request.