haproxy_otel/
lib.rs

1use haproxy_api::{Action, Core};
2use mlua::prelude::{Lua, LuaExternalResult as _, LuaResult, LuaTable};
3
4pub(crate) use cache::{get_context, remove_context, store_context};
5
6pub fn register(lua: &Lua, options: LuaTable) -> LuaResult<()> {
7    let core = Core::new(lua)?;
8
9    let service_name = (options.get::<_, String>("name")).unwrap_or_else(|_| "haproxy".to_string());
10    let sampler = (options.get::<_, Option<String>>("sampler")).unwrap_or_default();
11    let propagator = (options.get::<_, Option<String>>("propagator")).unwrap_or_default();
12    let otlp = (options.get::<_, LuaTable>("otlp")).unwrap_or_else(|_| lua.create_table().unwrap());
13    let endpoint = (otlp.get::<_, Option<String>>("endpoint")).unwrap_or_default();
14    let protocol = (otlp.get::<_, Option<String>>("protocol")).unwrap_or_default();
15
16    let options = exporter::Options {
17        service_name: service_name.clone(),
18        sampler: sampler.clone(),
19        propagator: propagator.clone(),
20        endpoint: endpoint.clone(),
21        protocol: protocol.clone(),
22    };
23    lua.set_app_data(options.clone());
24
25    if core.thread()? <= 1 {
26        core.register_task(move |_lua| exporter::init(options.clone()).into_lua_err())?;
27    }
28
29    #[rustfmt::skip]
30    core.register_action("start_server_span", &[Action::HttpReq], 0, span::start_server_span)?;
31    core.register_action(
32        "set_span_attribute_var",
33        &[Action::HttpReq, Action::HttpRes, Action::HttpAfterRes],
34        2,
35        span::set_span_attribute,
36    )?;
37    core.register_filter::<filter::TraceFilter>("opentelemetry-trace")?;
38
39    Ok(())
40}
41
42mod cache;
43mod exporter;
44mod filter;
45mod runtime;
46mod span;