Skip to main content

packc/
telemetry.rs

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
11/// Install the default Greentic telemetry stack for the given service.
12pub fn install(service_name: &str) -> Result<()> {
13    init_telemetry_auto(ServiceTelemetryConfig {
14        service_name: service_name.to_string(),
15    })
16}
17
18/// Install telemetry honoring greentic-config telemetry settings.
19pub 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
50/// Map the provided tenant context into the task-local telemetry slot.
51pub 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}