Skip to content

Commit

Permalink
feat: support OpenTelemetry (#151)
Browse files Browse the repository at this point in the history
* feat: support OpenTelemetry

Signed-off-by: Andy Lok <[email protected]>

* fmt

Signed-off-by: Andy Lok <[email protected]>

* fix ci

Signed-off-by: Andy Lok <[email protected]>

* fix ci

Signed-off-by: Andy Lok <[email protected]>

* fix ci

Signed-off-by: Andy Lok <[email protected]>

* fix ci

Signed-off-by: Andy Lok <[email protected]>

* replace guard with defer

* fix ci

Signed-off-by: Andy Lok <[email protected]>

* fix ci

Signed-off-by: Andy Lok <[email protected]>

---------

Signed-off-by: Andy Lok <[email protected]>
  • Loading branch information
andylokandy authored Jul 14, 2023
1 parent 7f7b70f commit 9e0ddb8
Show file tree
Hide file tree
Showing 21 changed files with 496 additions and 69 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
- Rename `SpanRecord.event` to `SpanRecord.name`.
- Add `Event` type to represent single points in time during the span's lifetime.
- Add `Event` support to minitrace-jaeger reporter.
- Add `minitrace-opentelementry` reporter that reports spans to OpenTelemetry collector.

## v0.4.0

Expand Down
1 change: 1 addition & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ members = [
"minitrace-macro",
"minitrace-jaeger",
"minitrace-datadog",
"minitrace-opentelemetry",
]

[profile.bench]
Expand Down
2 changes: 1 addition & 1 deletion minitrace-datadog/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ homepage = "https://github.com/tikv/minitrace-rust"
repository = "https://github.com/tikv/minitrace-rust"
documentation = "https://docs.rs/minitrace-datadog"
readme = "README.md"
keywords = ["tracing", "span", "datadog", "jaeger", "opentracing"]
keywords = ["tracing", "span", "datadog", "jaeger", "opentelemetry"]

[dependencies]
minitrace = { version = "0.4.1", path = "../minitrace" }
Expand Down
2 changes: 1 addition & 1 deletion minitrace-jaeger/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ homepage = "https://github.com/tikv/minitrace-rust"
repository = "https://github.com/tikv/minitrace-rust"
documentation = "https://docs.rs/minitrace-jaeger"
readme = "README.md"
keywords = ["tracing", "span", "datadog", "jaeger", "opentracing"]
keywords = ["tracing", "span", "datadog", "jaeger", "opentelemetry"]

[dependencies]
minitrace = { version = "0.4.1", path = "../minitrace" }
Expand Down
2 changes: 2 additions & 0 deletions minitrace-jaeger/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,8 @@ minitrace-jaeger = "0.4"
docker run --rm -d -p6831:6831/udp -p16686:16686 --name jaeger jaegertracing/all-in-one:latest
```

Web UI is available on http://127.0.0.1:16686/

## Report to Jaeger Agent

```rust
Expand Down
2 changes: 1 addition & 1 deletion minitrace-macro/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ homepage = "https://github.com/tikv/minitrace-rust"
repository = "https://github.com/tikv/minitrace-rust"
documentation = "https://docs.rs/minitrace-macro"
readme = "README.md"
keywords = ["tracing", "span", "datadog", "jaeger", "opentracing"]
keywords = ["tracing", "span", "datadog", "jaeger", "opentelemetry"]

[lib]
proc-macro = true
Expand Down
22 changes: 22 additions & 0 deletions minitrace-opentelemetry/Cargo.toml
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
[package]
name = "minitrace-opentelemetry"
version = "0.4.1"
authors = ["The TiKV Project Authors"]
license = "Apache-2.0"
edition = "2018"
description = "Jaeger reporter for minitrace-rust"
homepage = "https://github.com/tikv/minitrace-rust"
repository = "https://github.com/tikv/minitrace-rust"
documentation = "https://docs.rs/minitrace-jaeger"
readme = "README.md"
keywords = ["tracing", "span", "datadog", "jaeger", "opentelemetry"]

[dependencies]
minitrace = { path = "../minitrace" }
opentelemetry = { version = "0.19", features = ["trace"] }

[dev-dependencies]
futures = "0.3"
opentelemetry-otlp = { version = "0.12", features = ["trace"] }
rand = "0.8"
tokio = { version = "1", features = ["rt-multi-thread"] }
1 change: 1 addition & 0 deletions minitrace-opentelemetry/LICENSE
75 changes: 75 additions & 0 deletions minitrace-opentelemetry/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
# minitrace-opentelemetry

[![Documentation](https://docs.rs/minitrace-opentelemetry/badge.svg)](https://docs.rs/minitrace-opentelemetry/)
[![Crates.io](https://img.shields.io/crates/v/minitrace-opentelemetry.svg)](https://crates.io/crates/minitrace-opentelemetry)
[![LICENSE](https://img.shields.io/github/license/tikv/minitrace-rust.svg)](https://github.com/tikv/minitrace-rust/blob/master/LICENSE)

Builtin [OpenTelemetry OTLP](https://github.com/open-telemetry/opentelemetry-collector) reporter for minitrace.

## Dependencies

```toml
[dependencies]
minitrace = "0.4"
minitrace-opentelemetry = "0.4"
```

## Setup OpenTelemetry Collector

```sh
cd examples
docker compose up -d
```

Jaeger UI is available on http://127.0.0.1:16686/
Zipkin UI is available on http://127.0.0.1:9411/

## Report to OpenTelemetry Collector

```rust
use std::time::Duration;

use minitrace::prelude::*;
use opentelemetry::sdk::export::trace::SpanExporter as _;

// start trace
let (root_span, collector) = Span::root("root");

// finish trace
drop(root_span);

// collect spans
let spans = collector.collect().await;

// report trace
let instrumentation_lib = opentelemetry::InstrumentationLibrary::new(
"example-crate",
Some(env!("CARGO_PKG_VERSION")),
None,
);
let span_data = minitrace_opentelemetry::convert(
rand::random(),
opentelemetry::trace::TraceState::default(),
opentelemetry::trace::Status::Ok,
opentelemetry::trace::SpanKind::Server,
true,
std::borrow::Cow::Owned(opentelemetry::sdk::Resource::new([
opentelemetry::KeyValue::new("service.name", "example"),
])),
instrumentation_lib,
0u64.to_le_bytes(),
0,
&spans,
);
let mut exporter = opentelemetry_otlp::SpanExporter::new_tonic(
opentelemetry_otlp::ExportConfig {
endpoint: "http://127.0.0.1:4317".to_string(),
protocol: opentelemetry_otlp::Protocol::Grpc,
timeout: Duration::from_secs(opentelemetry_otlp::OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT),
},
opentelemetry_otlp::TonicConfig::default(),
)
.unwrap();
exporter.export(span_data).await.unwrap();
exporter.force_flush().await.unwrap();
```
50 changes: 50 additions & 0 deletions minitrace-opentelemetry/examples/demo.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
// Copyright 2023 TiKV Project Authors. Licensed under Apache-2.0.

use std::time::Duration;

use minitrace::prelude::*;
use opentelemetry::sdk::export::trace::SpanExporter as _;

#[tokio::main]
async fn main() {
// start trace
let (root_span, collector) = Span::root("root");

// finish trace
drop(root_span);

// collect spans
let spans = collector.collect().await;

// report trace
let instrumentation_lib = opentelemetry::InstrumentationLibrary::new(
"example-crate",
Some(env!("CARGO_PKG_VERSION")),
None,
);
let span_data = minitrace_opentelemetry::convert(
rand::random(),
opentelemetry::trace::TraceState::default(),
opentelemetry::trace::Status::Ok,
opentelemetry::trace::SpanKind::Server,
true,
std::borrow::Cow::Owned(opentelemetry::sdk::Resource::new([
opentelemetry::KeyValue::new("service.name", "example"),
])),
instrumentation_lib,
0u64.to_le_bytes(),
0,
&spans,
);
let mut exporter = opentelemetry_otlp::SpanExporter::new_tonic(
opentelemetry_otlp::ExportConfig {
endpoint: "http://127.0.0.1:4317".to_string(),
protocol: opentelemetry_otlp::Protocol::Grpc,
timeout: Duration::from_secs(opentelemetry_otlp::OTEL_EXPORTER_OTLP_TIMEOUT_DEFAULT),
},
opentelemetry_otlp::TonicConfig::default(),
)
.unwrap();
exporter.export(span_data).await.ok();
exporter.force_flush().await.ok();
}
36 changes: 36 additions & 0 deletions minitrace-opentelemetry/examples/docker-compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
version: "2"
services:

# Jaeger
jaeger-all-in-one:
image: jaegertracing/all-in-one:latest
restart: always
ports:
- "16686:16686"
- "14268"
- "14250"

# Zipkin
zipkin-all-in-one:
image: openzipkin/zipkin:latest
restart: always
ports:
- "9411:9411"

# Collector
otel-collector:
image: otel/opentelemetry-collector:latest
restart: always
command: ["--config=/etc/otel-collector-config.yaml", "${OTELCOL_ARGS}"]
volumes:
- ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
ports:
- "1888:1888" # pprof extension
- "8888:8888" # Prometheus metrics exposed by the collector
- "8889:8889" # Prometheus exporter metrics
- "13133:13133" # health_check extension
- "4317:4317" # OTLP gRPC receiver
- "55679:55679" # zpages extension
depends_on:
- jaeger-all-in-one
- zipkin-all-in-one
38 changes: 38 additions & 0 deletions minitrace-opentelemetry/examples/otel-collector-config.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
receivers:
otlp:
protocols:
grpc:

exporters:
logging:

zipkin:
endpoint: "http://zipkin-all-in-one:9411/api/v2/spans"
format: proto

jaeger:
endpoint: jaeger-all-in-one:14250
tls:
insecure: true

processors:
batch:

extensions:
health_check:
pprof:
endpoint: :1888
zpages:
endpoint: :55679

service:
extensions: [pprof, zpages, health_check]
pipelines:
traces:
receivers: [otlp]
processors: [batch]
exporters: [logging, zipkin, jaeger]
metrics:
receivers: [otlp]
processors: [batch]
exporters: [logging]
Loading

0 comments on commit 9e0ddb8

Please sign in to comment.