haproxy-otel 0.2.0

HAProxy OpenTelemetry tracing support
Documentation
use haproxy_api::{Action, Core};
use mlua::prelude::{Lua, LuaExternalResult as _, LuaResult, LuaTable};

pub(crate) use cache::{get_context, remove_context, store_context};

pub fn register(lua: &Lua, options: LuaTable) -> LuaResult<()> {
    let core = Core::new(lua)?;

    let service_name = (options.get::<String>("name")).unwrap_or_else(|_| "haproxy".to_string());
    let sampler = (options.get::<Option<String>>("sampler")).unwrap_or_default();
    let propagator = (options.get::<Option<String>>("propagator")).unwrap_or_default();
    let otlp = (options.get::<LuaTable>("otlp")).unwrap_or_else(|_| lua.create_table().unwrap());
    let endpoint = (otlp.get::<Option<String>>("endpoint")).unwrap_or_default();
    let protocol = (otlp.get::<Option<String>>("protocol")).unwrap_or_default();

    let options = exporter::Options {
        service_name: service_name.clone(),
        sampler: sampler.clone(),
        propagator: propagator.clone(),
        endpoint: endpoint.clone(),
        protocol: protocol.clone(),
    };
    lua.set_app_data(options.clone());

    if core.thread()? <= 1 {
        core.register_task(move |_lua| exporter::init(options.clone()).into_lua_err())?;
    }

    #[rustfmt::skip]
    core.register_action("start_server_span", &[Action::HttpReq], 0, span::start_server_span)?;
    core.register_action(
        "set_span_attribute_var",
        &[Action::HttpReq, Action::HttpRes, Action::HttpAfterRes],
        2,
        span::set_span_attribute,
    )?;
    core.register_filter::<filter::TraceFilter>("opentelemetry-trace")?;

    Ok(())
}

mod cache;
mod exporter;
mod filter;
mod runtime;
mod span;