Skip to content

Commit e5785b9

Browse files
authored
initial version of app-server observability (#972)
* initial version of app-server observability * remove dbg * unify tracer name * add compatibility comment in Cargo.toml * small fixes in main.rs * add num bytes attribute * fix bugbot comment * extract tracing setup to a separate module
1 parent bd326a5 commit e5785b9

28 files changed

+544
-161
lines changed

app-server/Cargo.lock

Lines changed: 346 additions & 133 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

app-server/Cargo.toml

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,24 @@ deadpool = "0.12.2"
2323
dotenv = "0.15"
2424
enum_delegate = "0.2.0"
2525
enum_dispatch = "0.3.13"
26-
env_logger = "0.11"
2726
futures-util = "0.3"
2827
indexmap = {version = "2.11.4", features = ["serde"]}
2928
itertools = "0.14.0"
3029
lapin = "3.0.0"
3130
log = "0.4.28"
3231
moka = {version = "0.12.10", features = ["sync", "future"]}
3332
num_cpus = "1.16.0"
33+
opentelemetry = {version = "0.29.1", features = ["trace"]}
34+
opentelemetry_sdk = {version = "0.29.0", features = ["trace"]}
3435
prost = "0.13"
3536
rand = "0.9.1"
3637
rayon = "1.10.0"
3738
redis = {version = "0.32.4", features = ["tokio-comp"]}
3839
regex = "1.11.1"
3940
reqwest = {version = "0.12.22", features = ["json"]}
4041
rustls = {version = "0.23", features = ["ring"]}
42+
# Sentry SDK must be compatible with the opentelemetry version. For sentry = 0.45.0, opentelemetry = 0.29
43+
sentry = {version = "0.45.0", features = ["opentelemetry"]}
4144
serde = "1.0"
4245
serde_json = {version = "1.0.140", features = ["preserve_order"]}
4346
sha3 = "0.10.8"
@@ -48,6 +51,10 @@ tikv-jemallocator = "0.6"
4851
tokio = {version = "1.46", features = ["macros", "rt-multi-thread"]}
4952
tokio-stream = {version = "0.1", features = ["net"]}
5053
tonic = {version = "0.13", features = ["gzip"]}
54+
tracing = {version = "0.1.41", features = ["attributes"]}
55+
# Tracing opentelemetry must be compatible with the opentelemetry version. For tracing-opentelemetry = 0.30.0, opentelemetry = 0.29
56+
tracing-opentelemetry = "0.30.0"
57+
tracing-subscriber = {version = "0.3", features = ["env-filter", "fmt"]}
5158
url = "2.5.4"
5259
uuid = {version = "1.18.1", features = ["v4", "fast-rng", "macro-diagnostics", "serde"]}
5360

app-server/build.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
2222
.build_client(false)
2323
.build_server(true)
2424
.include_file("mod.rs")
25-
.out_dir("./src/opentelemetry/")
25+
.out_dir("./src/opentelemetry_proto/")
2626
.compile_protos(
2727
&[
2828
"./proto/opentelemetry/common.proto",

app-server/src/api/v1/sql.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,10 @@
11
use std::{collections::HashMap, sync::Arc};
22

33
use actix_web::{HttpResponse, post, web};
4+
use opentelemetry::{
5+
global,
6+
trace::{Tracer, mark_span_as_active},
7+
};
48
use serde::{Deserialize, Serialize};
59

610
use crate::{
@@ -33,6 +37,10 @@ pub async fn execute_sql_query(
3337
let project_id = project_api_key.project_id;
3438
let SqlQueryRequest { query } = req.into_inner();
3539

40+
let tracer = global::tracer("tracer");
41+
let span = tracer.start("api_sql_query");
42+
let _guard = mark_span_as_active(span);
43+
3644
match clickhouse_ro.as_ref() {
3745
Some(ro_client) => {
3846
match sql::execute_sql_query(

app-server/src/api/v1/traces.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::{
88
db::{DB, events::Event, project_api_keys::ProjectApiKey, spans::Span},
99
features::{Feature, is_feature_enabled},
1010
mq::MessageQueue,
11-
opentelemetry::opentelemetry::proto::collector::trace::v1::ExportTraceServiceRequest,
11+
opentelemetry_proto::opentelemetry::proto::collector::trace::v1::ExportTraceServiceRequest,
1212
routes::types::ResponseResult,
1313
traces::{limits::get_workspace_limit_exceeded_by_project_id, producer::push_spans_to_queue},
1414
};

app-server/src/ch/spans.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
use anyhow::Result;
22
use clickhouse::Row;
33
use serde::{Deserialize, Serialize};
4+
use tracing::instrument;
45
use uuid::Uuid;
56

67
use crate::{
@@ -175,6 +176,7 @@ impl CHSpan {
175176
}
176177
}
177178

179+
#[instrument(skip(clickhouse, spans))]
178180
pub async fn insert_spans_batch(clickhouse: clickhouse::Client, spans: &[CHSpan]) -> Result<()> {
179181
if spans.is_empty() {
180182
return Ok(());

app-server/src/ch/traces.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use std::collections::HashSet;
33
use chrono::{DateTime, Utc};
44
use clickhouse::Row;
55
use serde::{Deserialize, Serialize};
6+
use tracing::instrument;
67
use uuid::Uuid;
78

89
use super::utils::chrono_to_nanoseconds;
@@ -218,6 +219,7 @@ impl TraceAggregation {
218219
}
219220

220221
/// Insert or update traces in ClickHouse traces_replacing table
222+
#[instrument(skip(client, traces))]
221223
pub async fn upsert_traces_batch(
222224
client: clickhouse::Client,
223225
traces: &[CHTrace],

app-server/src/db/events.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ use serde_json::Value;
44
use uuid::Uuid;
55

66
use crate::{
7-
opentelemetry::opentelemetry_proto_trace_v1::span::Event as OtelEvent,
7+
opentelemetry_proto::opentelemetry_proto_trace_v1::span::Event as OtelEvent,
88
utils::estimate_json_size,
99
};
1010

app-server/src/db/trace.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ use chrono::{DateTime, Utc};
33
use serde::{Deserialize, Serialize};
44
use serde_json::Value;
55
use sqlx::PgPool;
6+
use tracing::instrument;
67
use uuid::Uuid;
78

89
use crate::ch::traces::TraceAggregation;
@@ -111,6 +112,7 @@ impl Trace {
111112

112113
/// Upsert trace statistics from aggregated span data
113114
/// Returns the updated trace statistics
115+
#[instrument(skip(pool, aggregations))]
114116
pub async fn upsert_trace_statistics_batch(
115117
pool: &PgPool,
116118
aggregations: &[TraceAggregation],

app-server/src/features/mod.rs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ pub enum Feature {
1515
RabbitMQ,
1616
SqlQueryEngine,
1717
ClickhouseReadOnly,
18+
Tracing,
1819
}
1920

2021
pub fn is_feature_enabled(feature: Feature) -> bool {
@@ -40,5 +41,8 @@ pub fn is_feature_enabled(feature: Feature) -> bool {
4041
Feature::ClickhouseReadOnly => {
4142
env::var("CLICKHOUSE_RO_USER").is_ok() && env::var("CLICKHOUSE_RO_PASSWORD").is_ok()
4243
}
44+
Feature::Tracing => {
45+
env::var("SENTRY_DSN").is_ok() && env::var("ENABLE_TRACING").is_ok_and(|s| s == "true")
46+
}
4347
}
4448
}

0 commit comments

Comments
 (0)