1use anyhow::Result;
2use greentic_config_types::{TelemetryConfig, TelemetryExporterKind};
3pub use greentic_telemetry::with_task_local;
4use greentic_telemetry::{
5 TelemetryConfig as ServiceTelemetryConfig, TelemetryCtx,
6 export::{ExportConfig, ExportMode, Sampling},
7 init_telemetry_auto, init_telemetry_from_config, set_current_telemetry_ctx,
8};
9use greentic_types::TenantCtx;
10
11pub fn install(service_name: &str) -> Result<()> {
13 init_telemetry_auto(ServiceTelemetryConfig {
14 service_name: service_name.to_string(),
15 })
16}
17
18pub fn install_with_config(service_name: &str, cfg: &TelemetryConfig) -> Result<()> {
20 if !cfg.enabled || matches!(cfg.exporter, TelemetryExporterKind::None) {
21 return Ok(());
22 }
23
24 let export = match cfg.exporter {
25 TelemetryExporterKind::Otlp => ExportConfig {
26 mode: ExportMode::OtlpGrpc,
27 endpoint: cfg.endpoint.clone(),
28 headers: Default::default(),
29 sampling: Sampling::TraceIdRatio(cfg.sampling as f64),
30 compression: None,
31 },
32 TelemetryExporterKind::Stdout => ExportConfig {
33 mode: ExportMode::JsonStdout,
34 endpoint: None,
35 headers: Default::default(),
36 sampling: Sampling::TraceIdRatio(cfg.sampling as f64),
37 compression: None,
38 },
39 TelemetryExporterKind::None => unreachable!("handled above"),
40 };
41
42 init_telemetry_from_config(
43 ServiceTelemetryConfig {
44 service_name: service_name.to_string(),
45 },
46 export,
47 )
48}
49
50pub fn set_current_tenant_ctx(ctx: &TenantCtx) {
52 let mut telemetry = TelemetryCtx::new(ctx.tenant_id.as_ref());
53
54 if let Some(session) = ctx.session_id() {
55 telemetry = telemetry.with_session(session);
56 }
57 if let Some(flow) = ctx.flow_id() {
58 telemetry = telemetry.with_flow(flow);
59 }
60 if let Some(node) = ctx.node_id() {
61 telemetry = telemetry.with_node(node);
62 }
63 if let Some(provider) = ctx.provider_id() {
64 telemetry = telemetry.with_provider(provider);
65 }
66
67 set_current_telemetry_ctx(telemetry);
68}