aboutsummaryrefslogtreecommitdiff
path: root/src/logger.rs
blob: 964477f16a561fc98e36bed6ad24595309602920 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
//! This module provides functionality to initialize and configure a logger that exports logs
//! using OpenTelemetry. The logger can be configured with different levels and exporter endpoints.
//!
//! # Functions
//!
//! - `init`: Initializes a new logger exported with OpenTelemetry. It sets up the logger provider,
//!   configures the log appender, and sets the global logger.
//! - `http_exporter`: Creates a new HTTP exporter builder for OpenTelemetry.
use std::sync::Arc;

use opentelemetry_appender_log::OpenTelemetryLogBridge;
use opentelemetry_otlp::LogExporter;
use opentelemetry_otlp::Protocol;
use opentelemetry_otlp::WithExportConfig;
use opentelemetry_sdk::logs::Logger;
use opentelemetry_sdk::logs::LoggerProvider;

use crate::Opentelemetry;

/// Initialize a new logger exported with open telemetry.
pub fn init(
    manager: &mut Opentelemetry,
) -> anyhow::Result<OpenTelemetryLogBridge<LoggerProvider, Logger>, ()> {
    let exporter = LogExporter::builder()
        .with_http()
        .with_endpoint("http://localhost:4318/v1/logs")
        .with_protocol(Protocol::HttpBinary)
        .build()
        .unwrap();
    let provider = LoggerProvider::builder()
        .with_batch_exporter(exporter, opentelemetry_sdk::runtime::Tokio)
        .build();

    // let logger_provider = opentelemetry_otlp::new_pipeline()
    //     .logging()
    //     .with_resource(Resource::new(vec![KeyValue::new(
    //         opentelemetry_semantic_conventions::resource::SERVICE_NAME,
    //         tag,
    //     )]))
    //     .with_batch_config(batch_config)
    //     .with_exporter(
    //         http_exporter()
    //             .with_protocol(Protocol::HttpBinary) //can be changed to `Protocol::HttpJson` to export in JSON format
    //             .with_endpoint(format!("{exporter_endpoint}/v1/logs")),
    //     )
    //     .install_batch(opentelemetry_sdk::runtime::Tokio)?;
    manager.logger = Some(Arc::new(provider.clone()));

    // Setup Log Appender for the log crate.
    let logger = OpenTelemetryLogBridge::new(&provider);
    Ok(logger)
}