Skip to content

Commit 8fa5a73

Browse files
authored
[CLN] Use GRPC for chroma-load OTEL (#4427)
## Description of changes Remove sampling. Will leverage refinery for this instead. ## Test plan These changes are untested. However, it is now using (mostly) the same setup code as the other chroma services (which are working). So, we can test in staging after this is merged.
1 parent bdd6869 commit 8fa5a73

File tree

1 file changed

+13
-86
lines changed

1 file changed

+13
-86
lines changed

rust/load/src/opentelemetry_config.rs

Lines changed: 13 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -5,114 +5,41 @@
55

66
use opentelemetry::global;
77
use opentelemetry::trace::TracerProvider;
8-
use opentelemetry_otlp::{WithExportConfig, WithHttpConfig};
8+
use opentelemetry_otlp::WithExportConfig;
99
use opentelemetry_sdk::propagation::TraceContextPropagator;
1010
use tracing_bunyan_formatter::BunyanFormattingLayer;
1111
use tracing_subscriber::{layer::SubscriberExt, EnvFilter, Layer};
1212

13-
#[derive(Clone, Debug, Default)]
14-
struct ChromaShouldSample;
15-
16-
const BUSY_NS: opentelemetry::Key = opentelemetry::Key::from_static_str("busy_ns");
17-
const IDLE_NS: opentelemetry::Key = opentelemetry::Key::from_static_str("idle_ns");
18-
19-
fn is_slow(attributes: &[opentelemetry::KeyValue]) -> bool {
20-
let mut nanos = 0i64;
21-
for attr in attributes {
22-
if attr.key == BUSY_NS || attr.key == IDLE_NS {
23-
if let opentelemetry::Value::I64(ns) = attr.value {
24-
nanos += ns;
25-
}
26-
}
27-
}
28-
nanos > 20_000_000
29-
}
30-
31-
impl opentelemetry_sdk::trace::ShouldSample for ChromaShouldSample {
32-
fn should_sample(
33-
&self,
34-
_: Option<&opentelemetry::Context>,
35-
_: opentelemetry::trace::TraceId,
36-
name: &str,
37-
_: &opentelemetry::trace::SpanKind,
38-
attributes: &[opentelemetry::KeyValue],
39-
_: &[opentelemetry::trace::Link],
40-
) -> opentelemetry::trace::SamplingResult {
41-
// NOTE(rescrv): THIS IS A HACK! If you find yourself seriously extending it, it's time
42-
// to investigate honeycomb's sampling capabilities.
43-
44-
// If the name is not get and not insert, or the request is slow, sample it.
45-
// Otherwise, drop.
46-
// This filters filters foyer calls in-process so they won't be overwhelming the tracing.
47-
if (name != "get" && name != "insert") || is_slow(attributes) {
48-
opentelemetry::trace::SamplingResult {
49-
decision: opentelemetry::trace::SamplingDecision::RecordAndSample,
50-
attributes: vec![],
51-
trace_state: opentelemetry::trace::TraceState::default(),
52-
}
53-
} else {
54-
opentelemetry::trace::SamplingResult {
55-
decision: opentelemetry::trace::SamplingDecision::Drop,
56-
attributes: vec![],
57-
trace_state: opentelemetry::trace::TraceState::default(),
58-
}
59-
}
60-
}
61-
}
62-
6313
pub(crate) fn init_otel_tracing(service_name: &String, otel_endpoint: &String) {
64-
println!(
14+
tracing::info!(
6515
"Registering jaeger subscriber for {} at endpoint {}",
66-
service_name, otel_endpoint
16+
service_name,
17+
otel_endpoint
6718
);
6819
let resource = opentelemetry_sdk::Resource::new(vec![opentelemetry::KeyValue::new(
6920
"service.name",
7021
service_name.clone(),
7122
)]);
7223

7324
// Prepare tracer.
74-
let client = reqwest::Client::new();
75-
let span_exporter = opentelemetry_otlp::SpanExporter::builder()
76-
.with_http()
77-
.with_http_client(client)
25+
let tracing_span_exporter = opentelemetry_otlp::SpanExporter::builder()
26+
.with_tonic()
7827
.with_endpoint(otel_endpoint)
7928
.build()
80-
.expect("could not build span exporter");
81-
let trace_config = opentelemetry_sdk::trace::Config::default()
82-
.with_sampler(ChromaShouldSample)
83-
.with_resource(resource.clone());
29+
.expect("could not build span exporter for tracing");
30+
let trace_config = opentelemetry_sdk::trace::Config::default().with_resource(resource.clone());
8431
let tracer_provider = opentelemetry_sdk::trace::TracerProvider::builder()
85-
.with_batch_exporter(span_exporter, opentelemetry_sdk::runtime::Tokio)
32+
.with_batch_exporter(tracing_span_exporter, opentelemetry_sdk::runtime::Tokio)
8633
.with_config(trace_config)
8734
.build();
8835
let tracer = tracer_provider.tracer(service_name.clone());
89-
// TODO(MrCroxx): Should we the tracer provider as global?
90-
// global::set_tracer_provider(tracer_provider);
9136

9237
// Prepare meter.
93-
let mut headers = reqwest::header::HeaderMap::new();
94-
headers.insert(
95-
"x-honeycomb-dataset",
96-
reqwest::header::HeaderValue::from_static("chroma-load"),
97-
);
98-
if let Ok(api_key) = std::env::var("OTEL_EXPORTER_OTLP_HEADERS") {
99-
if let Some((header, value)) = api_key.split_once("=") {
100-
if header == "x-honeycomb-team" {
101-
headers.insert(
102-
reqwest::header::HeaderName::from_static("x-honeycomb-team"),
103-
reqwest::header::HeaderValue::from_bytes(value.trim().as_bytes()).unwrap(),
104-
);
105-
}
106-
}
107-
}
108-
let client = reqwest::ClientBuilder::new()
109-
.default_headers(headers)
110-
.build()
111-
.unwrap();
11238
let metric_exporter = opentelemetry_otlp::MetricExporter::builder()
113-
.with_http()
114-
.with_http_client(client)
115-
.with_endpoint(otel_endpoint)
39+
.with_tonic()
40+
.with_endpoint(
41+
std::env::var("OTEL_EXPORTER_OTLP_METRICS_ENDPOINT").unwrap_or(otel_endpoint.clone()),
42+
)
11643
.build()
11744
.expect("could not build metric exporter");
11845

0 commit comments

Comments
 (0)