Skip to content

Commit d47f1c6

Browse files
feat: add otlp endpoint flag
Signed-off-by: Fabrizio Sestito <fabrizio.sestito@suse.com>
1 parent 8bb10f8 commit d47f1c6

File tree

5 files changed

+47
-19
lines changed

5 files changed

+47
-19
lines changed

src/cli.rs

+6-1
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,12 @@ pub(crate) fn build_cli() -> Command {
169169
.long("continue-on-errors")
170170
.env("KUBEWARDEN_CONTINUE_ON_ERRORS")
171171
.action(ArgAction::SetTrue)
172-
.hide(true)
172+
.hide(true),
173+
Arg::new("otlp-endpoint")
174+
.long("otlp-endpoint")
175+
.env("OTEL_EXPORTER_OTLP_ENDPOINT")
176+
.default_value("http://localhost:4317")
177+
.help("The OTLP gRPC endpoint for exporting traces and metrics.")
173178
];
174179
args.sort_by(|a, b| a.get_id().cmp(b.get_id()));
175180

src/config.rs

+5
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@ pub struct Config {
4141
pub log_level: String,
4242
pub log_fmt: String,
4343
pub log_no_color: bool,
44+
pub otlp_endpoint: Option<String>,
4445
pub daemon: bool,
4546
pub enable_pprof: bool,
4647
pub daemon_pid_file: String,
@@ -125,6 +126,9 @@ impl Config {
125126
.get_one::<bool>("log-no-color")
126127
.expect("clap should have assigned a default value")
127128
.to_owned();
129+
130+
let otlp_endpoint = matches.get_one::<String>("otlp-endpoint").cloned();
131+
128132
let (cert_file, key_file) = tls_files(matches)?;
129133
let tls_config = if cert_file.is_empty() {
130134
None
@@ -160,6 +164,7 @@ impl Config {
160164
log_level,
161165
log_fmt,
162166
log_no_color,
167+
otlp_endpoint,
163168
daemon,
164169
daemon_pid_file,
165170
daemon_stdout_file,

src/main.rs

+7-2
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,15 @@ async fn main() -> Result<()> {
2121
let matches = cli::build_cli().get_matches();
2222
let config = policy_server::config::Config::from_args(&matches)?;
2323

24-
setup_tracing(&config.log_level, &config.log_fmt, config.log_no_color)?;
24+
setup_tracing(
25+
&config.log_level,
26+
&config.log_fmt,
27+
config.log_no_color,
28+
config.otlp_endpoint.as_deref(),
29+
)?;
2530

2631
if config.metrics_enabled {
27-
setup_metrics()?;
32+
setup_metrics(config.otlp_endpoint.as_deref())?;
2833
};
2934

3035
if config.daemon {

src/metrics.rs

+12-10
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,20 @@ pub use policy_evaluations_latency::record_policy_latency;
1010

1111
const METER_NAME: &str = "kubewarden";
1212

13-
pub fn setup_metrics() -> Result<()> {
14-
let meter_reader = opentelemetry_sdk::metrics::PeriodicReader::builder(
15-
opentelemetry_otlp::MetricExporter::builder()
16-
.with_tonic()
17-
.with_export_config(ExportConfig::default())
18-
.build()?,
19-
runtime::Tokio,
20-
)
21-
.build();
13+
pub fn setup_metrics(otlp_endpoint: Option<&str>) -> Result<()> {
14+
let mut metric_exporter_builder = opentelemetry_otlp::MetricExporter::builder()
15+
.with_tonic()
16+
.with_export_config(ExportConfig::default());
17+
if let Some(endpoint) = otlp_endpoint {
18+
metric_exporter_builder = metric_exporter_builder.with_endpoint(endpoint);
19+
}
20+
let meter_reader = metric_exporter_builder.build()?;
21+
let periodic_reader =
22+
opentelemetry_sdk::metrics::PeriodicReader::builder(meter_reader, runtime::Tokio).build();
2223
let meter_provider = opentelemetry_sdk::metrics::SdkMeterProvider::builder()
23-
.with_reader(meter_reader)
24+
.with_reader(periodic_reader)
2425
.build();
26+
2527
global::set_meter_provider(meter_provider);
2628
Ok(())
2729
}

src/tracing.rs

+17-6
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,19 @@
11
use anyhow::{anyhow, Result};
22
use opentelemetry::trace::TracerProvider;
3+
use opentelemetry_otlp::WithExportConfig;
34
use tracing_subscriber::prelude::*;
45
use tracing_subscriber::{fmt, EnvFilter};
56

67
use crate::config;
78

89
// Setup the tracing system. This MUST be done inside of a tokio Runtime
910
// because some collectors rely on it and would panic otherwise.
10-
pub fn setup_tracing(log_level: &str, log_fmt: &str, log_no_color: bool) -> Result<()> {
11+
pub fn setup_tracing(
12+
log_level: &str,
13+
log_fmt: &str,
14+
log_no_color: bool,
15+
otlp_endpoint: Option<&str>,
16+
) -> Result<()> {
1117
// setup logging
1218
let filter_layer = EnvFilter::new(log_level)
1319
// some of our dependencies generate trace events too, but we don't care about them ->
@@ -37,11 +43,16 @@ pub fn setup_tracing(log_level: &str, log_fmt: &str, log_no_color: bool) -> Resu
3743
"otlp" => {
3844
// Create a new OpenTelemetry pipeline sending events to a
3945
// OpenTelemetry collector using the OTLP format.
40-
// The collector must run on localhost (eg: use a sidecar inside of k8s)
41-
// using GRPC
42-
let otlp_exporter = opentelemetry_otlp::SpanExporter::builder()
43-
.with_tonic()
44-
.build()?;
46+
// If no endpoint is provided, the default one is used.
47+
// The default endpoint is "http://localhost:4317".
48+
let mut otlp_exporter_builder =
49+
opentelemetry_otlp::SpanExporter::builder().with_tonic();
50+
51+
if let Some(endpoint) = otlp_endpoint {
52+
otlp_exporter_builder = otlp_exporter_builder.with_endpoint(endpoint);
53+
}
54+
55+
let otlp_exporter = otlp_exporter_builder.build()?;
4556

4657
let tracer_provider = opentelemetry_sdk::trace::TracerProvider::builder()
4758
.with_resource(opentelemetry_sdk::Resource::new(vec![

0 commit comments

Comments
 (0)