#open-telemetry #api-bindings #grpc #grpc-server #api #protobuf


OpenTelemetry v1 API binding based on tonic/prost

9 releases

0.3.0 Dec 19, 2022
0.2.5 Jul 5, 2022
0.2.4 Apr 21, 2022
0.2.3 Mar 17, 2022
0.1.1 Mar 12, 2021

#1495 in Network programming

Download history 4/week @ 2023-12-03 55/week @ 2023-12-10 3/week @ 2024-01-14 1/week @ 2024-02-11 9/week @ 2024-02-18 32/week @ 2024-02-25 31/week @ 2024-03-03 58/week @ 2024-03-10 6/week @ 2024-03-17

128 downloads per month


618 lines

CNCF Early Stage Sandbox Project

CNCF Streaming & Messaging

Quality Checks License Checks Security Checks CII Best Practices GitHub

OpenTelemetry support for Tremor


This library exists to support OpenTelemetry based connectivity within tremor.

Tremor can expose client and server OpenTelemetry endpoints based on the gRPC protocol specification for OpenTelemetry.


A tonic-build based data-binding and utility code for OpenTelemetry v1 primarily for use in the tremor project for OpenTelemetry v1 interoperability, integration and interworking.

The code in the gen folder was seeded by tonic-build.

The code in the src folder extends the generated source with utility code to allow for convenient usage and definition of tonic-based gRPC servers. Specifically, this library is designed for use by the Tremor Project but has no dependencies on tremor and can be used standalone.

This library does not provide an API or SDK designed for use as a tracing facility. The official OpenTelemetry Rust project is a complete OpenTelemetry SDK designed for that purpose. It uses the same underlying protocol buffer definitions and will be a better target for projects that require OpenTelemetry based observability instrumentation and iteroperability with the wider observability ecosystem through third party crates.

This library is designed for system integration and interoperability and is not recommended for use as a tracing SDK or for instrumentation as that is well covered already by the OpenTelemetry Rust crate. For instrumentation, use the official crate.

For those projects that need basic interworking, interoperability or integration with OpenTelemetry based systems at a wire level, this project may be useful.

Minimal dependencies for Cargo.toml

tremor-otelapis = { version = "0.1", features = ["otel-all"] }
tonic = { version = "0.4", features = ["tls"] }
prost = "0.7"
prost-types = "0.7"
tokio = { version = "1.1", features = ["rt-multi-thread", "time", "fs", "macros"] }

Example OpenTelemetry Log client.

Note that clients simply use the generated client stub code from tonic-build. This library adds no extra utility or convenience.

async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let channel = Endpoint::from_static("")

    let mut client = LogsServiceClient::new(channel);

    let resource_logs = ResourceLogs {

        .export(ExportLogsServiceRequest {
            resource_logs: vec![resource_logs],


Example OpenTelemetry Log Server.

Note that we use utility code to expose the server side functionality. We pass through the generated Protocol Buffer message data binding generated code unadorned. The data bindings for protocol buffer messages are generated by tonic-build.

The tonic-build in turns builds on prost-build.

fn on_logs(
    request: tonic::Request<ExportLogsServiceRequest>,
) -> Result<tonic::Response<ExportLogsServiceResponse>, tonic::Status> {
    println!("Got a request from {:?}", request.remote_addr());
    let reply = ExportLogsServiceResponse::default();

async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let addr = "".parse()?;
    let svc = otelapis::logs::make_service(Box::new(on_logs));


Example async-channel based OpenTelemetry server

For ease of integration with async runtimes such as tremor:

async fn main() -> Result<(), Box<dyn std::error::Error>> {
    let addr = "".parse()?;
    let (tx, rx) = bounded(128);
    tremor_otelapis::all::make(addr, tx).await?;

    // ...

    loop {
        match rx.try_recv() {
            Ok(OpenTelemetryEvents::Metrics(metrics)) => {
                // Do something with metrics request
            Ok(OpenTelemetryEvents::Logs(log)) => {
                // Do something with log request
            Ok(OpenTelemetryEvents::Trace(trace)) => {
                // Do something with trace request
            _ => error!("Unsupported"),

   // ...


~430K SLoC