Skip to content

Commit 0fbfec9

Browse files
authored
Merge pull request #994 from fabriziosestito/feat/add-otlp-endpoint-flag
feat: add otlp endpoint config and cli flag
2 parents 8bb10f8 + 5b843fb commit 0fbfec9

File tree

7 files changed

+58
-22
lines changed

7 files changed

+58
-22
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![

tests/common/mod.rs

+1
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ pub(crate) fn default_test_config() -> Config {
120120
log_level: "info".to_owned(),
121121
log_fmt: "json".to_owned(),
122122
log_no_color: false,
123+
otlp_endpoint: None,
123124
daemon: false,
124125
daemon_pid_file: "policy_server.pid".to_owned(),
125126
daemon_stdout_file: None,

tests/integration_test.rs

+10-3
Original file line numberDiff line numberDiff line change
@@ -773,7 +773,7 @@ async fn test_otel() {
773773
traces_output_file_path.to_str().unwrap(),
774774
"/tmp/traces.json",
775775
))
776-
.with_mapped_port(4317, 4317.into())
776+
.with_mapped_port(1337, 4317.into())
777777
.with_cmd(vec!["--config=/etc/otel-collector-config.yaml"])
778778
.with_startup_timeout(Duration::from_secs(30))
779779
.start()
@@ -783,8 +783,15 @@ async fn test_otel() {
783783
let mut config = default_test_config();
784784
config.metrics_enabled = true;
785785
config.log_fmt = "otlp".to_string();
786-
setup_metrics().unwrap();
787-
setup_tracing(&config.log_level, &config.log_fmt, config.log_no_color).unwrap();
786+
config.otlp_endpoint = Some("http://localhost:1337".to_string());
787+
setup_metrics(config.otlp_endpoint.as_deref()).unwrap();
788+
setup_tracing(
789+
&config.log_level,
790+
&config.log_fmt,
791+
config.log_no_color,
792+
config.otlp_endpoint.as_deref(),
793+
)
794+
.unwrap();
788795

789796
let app = app(config).await;
790797

0 commit comments

Comments
 (0)