Skip to content

Commit 97d445c

Browse files
authored
Merge pull request #503 from cbgbt/log-format-option
Enable configuration of log formatting
2 parents f1eb149 + c621dcc commit 97d445c

File tree

17 files changed

+235
-100
lines changed

17 files changed

+235
-100
lines changed

Cargo.lock

Lines changed: 11 additions & 15 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,17 @@ scheduler_cron_expression: "* * * * * * *"
146146
apiserver_internal_port: "8443"
147147
# API server internal address where the CRD version conversion webhook is served
148148
apiserver_service_port: "443"
149+
150+
# Formatter for the logs emitted by brupop.
151+
# Options are:
152+
# * full - Human-readable, single-line logs
153+
# * compact - A variant of full optimized for shorter line lengths
154+
# * pretty - "Excessively pretty" logs optimized for human-readable terminal output.
155+
# * json - Newline-delimited JSON-formatted logs.
156+
logging_formatter: "pretty"
157+
# Whether or not to enable ANSI colors on log messages.
158+
# Makes the output "pretty" in terminals, but may add noise to web-based log utilities.
159+
logging_ansi_enabled: "true"
149160
```
150161
151162
#### Configure API server ports

agent/Cargo.toml

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,7 @@ apiserver = { path = "../apiserver", version = "0.1.0", default-features = false
1111

1212
dotenv = "0.15"
1313
futures = "0.3"
14-
opentelemetry = { version = "0.18", features = ["rt-tokio-current-thread"] }
1514
tracing = "0.1"
16-
tracing-subscriber = { version = "0.3", features = ["registry", "env-filter"] }
17-
tracing-opentelemetry = "0.18"
1815

1916
# k8s-openapi must match the version required by kube and enable a k8s version feature
2017
k8s-openapi = { version = "0.18", default-features = false, features = ["v1_24"] }

agent/src/main.rs

Lines changed: 8 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,10 @@ use kube::{
1212
};
1313
use models::constants::{AGENT_TOKEN_PATH, AGENT_TOKEN_PROJECTION_MOUNT_PATH};
1414
use models::node::{brs_name_from_node_name, BottlerocketShadow};
15+
use models::telemetry;
1516

16-
use opentelemetry::sdk::propagation::TraceContextPropagator;
1717
use snafu::{OptionExt, ResultExt};
1818
use tracing::{event, Level};
19-
use tracing_subscriber::{fmt, layer::SubscriberExt, EnvFilter, Registry};
2019

2120
use std::convert::TryFrom;
2221
use std::env;
@@ -40,7 +39,7 @@ async fn main() {
4039
}
4140

4241
async fn run_agent() -> Result<()> {
43-
init_telemetry()?;
42+
telemetry::init_telemetry_from_env().context(agent_error::TelemetryInitSnafu)?;
4443

4544
let incluster_config = kube::Config::incluster_dns().context(agent_error::ConfigCreateSnafu)?;
4645
let namespace = incluster_config.default_namespace.to_string();
@@ -119,23 +118,9 @@ async fn run_agent() -> Result<()> {
119118
Ok(())
120119
}
121120

122-
/// Initializes global tracing and telemetry state for the agent.
123-
pub fn init_telemetry() -> Result<()> {
124-
opentelemetry::global::set_text_map_propagator(TraceContextPropagator::new());
125-
126-
let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
127-
let stdio_formatting_layer = fmt::layer().pretty();
128-
let subscriber = Registry::default()
129-
.with(env_filter)
130-
.with(stdio_formatting_layer);
131-
tracing::subscriber::set_global_default(subscriber)
132-
.context(agent_error::TracingConfigurationSnafu)?;
133-
134-
Ok(())
135-
}
136-
137121
pub mod agent_error {
138122
use agent::agentclient::agentclient_error;
123+
use models::telemetry;
139124
use snafu::Snafu;
140125

141126
#[derive(Debug, Snafu)]
@@ -168,6 +153,11 @@ pub mod agent_error {
168153
#[snafu(display("The Kubernetes WATCH on {} objects has failed.", object))]
169154
KubernetesWatcherFailed { object: String },
170155

156+
#[snafu(display("Error configuring telemetry: '{}'", source))]
157+
TelemetryInit {
158+
source: telemetry::TelemetryConfigError,
159+
},
160+
171161
#[snafu(display("Error configuring tracing: '{}'", source))]
172162
TracingConfiguration {
173163
source: tracing::subscriber::SetGlobalDefaultError,

apiserver/Cargo.toml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,6 @@ opentelemetry = { version = "0.18", features = ["rt-tokio-current-thread"]}
2525
opentelemetry-prometheus = "0.11"
2626
tracing = "0.1"
2727
tracing-actix-web = "0.7"
28-
tracing-subscriber = { version = "0.3", features = ["registry", "env-filter"] }
29-
tracing-opentelemetry = "0.18"
3028

3129
# k8s-openapi must match the version required by kube and enable a k8s version feature
3230
k8s-openapi = { version = "0.18", default-features = false, features = ["v1_24"] }

apiserver/src/main.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use apiserver::api::{self, APIServerSettings};
2-
use apiserver::telemetry::init_telemetry;
32
use apiserver_error::{StartServerSnafu, StartTelemetrySnafu};
43
use models::node::K8SBottlerocketShadowClient;
4+
use models::telemetry;
55
use tracing::{event, Level};
66

77
use opentelemetry::sdk::export::metrics::aggregation;
@@ -33,7 +33,7 @@ async fn main() {
3333
}
3434

3535
async fn run_server() -> Result<(), apiserver_error::Error> {
36-
init_telemetry().context(StartTelemetrySnafu)?;
36+
telemetry::init_telemetry_from_env().context(StartTelemetrySnafu)?;
3737
let controller = controllers::basic(
3838
processors::factory(
3939
selectors::simple::histogram([1.0, 2.0, 5.0, 10.0, 20.0, 50.0]),
@@ -102,7 +102,7 @@ pub mod apiserver_error {
102102

103103
#[snafu(display("Unable to start API server telemetry: '{}'", source))]
104104
StartTelemetry {
105-
source: apiserver::telemetry::telemetry_error::Error,
105+
source: models::telemetry::TelemetryConfigError,
106106
},
107107

108108
#[snafu(display("Unable to start API server: '{}'", source))]

apiserver/src/telemetry.rs

Lines changed: 0 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,8 @@ use crate::constants::HEADER_BRUPOP_NODE_NAME;
44
use actix_web::body::MessageBody;
55
use actix_web::dev::{ServiceRequest, ServiceResponse};
66
use lazy_static::lazy_static;
7-
use opentelemetry::sdk::propagation::TraceContextPropagator;
8-
use snafu::ResultExt;
97
use tracing::Span;
108
use tracing_actix_web::{DefaultRootSpanBuilder, RootSpanBuilder};
11-
use tracing_subscriber::{fmt, layer::SubscriberExt, EnvFilter, Registry};
129

1310
use std::collections::HashSet;
1411

@@ -51,31 +48,3 @@ impl RootSpanBuilder for BrupopApiserverRootSpanBuilder {
5148
DefaultRootSpanBuilder::on_request_end(span, response);
5249
}
5350
}
54-
55-
/// Initializes global tracing and telemetry state for the apiserver.
56-
pub fn init_telemetry() -> Result<(), telemetry_error::Error> {
57-
opentelemetry::global::set_text_map_propagator(TraceContextPropagator::new());
58-
59-
let env_filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("info"));
60-
let stdio_formatting_layer = fmt::layer().pretty();
61-
let subscriber = Registry::default()
62-
.with(env_filter)
63-
.with(stdio_formatting_layer);
64-
tracing::subscriber::set_global_default(subscriber)
65-
.context(telemetry_error::TracingConfigurationSnafu)?;
66-
67-
Ok(())
68-
}
69-
70-
pub mod telemetry_error {
71-
use snafu::Snafu;
72-
73-
#[derive(Debug, Snafu)]
74-
#[snafu(visibility(pub))]
75-
pub enum Error {
76-
#[snafu(display("Error configuring tracing: '{}'", source))]
77-
TracingConfiguration {
78-
source: tracing::subscriber::SetGlobalDefaultError,
79-
},
80-
}
81-
}

controller/Cargo.toml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,18 +15,17 @@ lazy_static = "1.2"
1515
maplit = "1.0"
1616
regex = "1.1"
1717
semver = "1.0"
18+
serde = "1"
19+
serde_plain = "1"
1820
# k8s-openapi must match the version required by kube and enable a k8s version feature
1921
k8s-openapi = { version = "0.18", default-features = false, features = ["v1_24"] }
2022
kube = { version = "0.84", default-features = false, features = [ "derive", "runtime", "rustls-tls" ] }
2123
models = { path = "../models", version = "0.1.0" }
2224
opentelemetry = { version = "0.18", features = ["rt-tokio-current-thread"] }
2325
opentelemetry-prometheus = "0.11"
2426
prometheus = "0.13.0"
25-
serde_plain = "1.0.1"
2627

2728
snafu = "0.7"
2829
tokio = { version = "1", features = ["macros", "rt-multi-thread", "time"] }
2930
tracing = "0.1"
30-
tracing-opentelemetry = "0.18"
31-
tracing-subscriber = { version = "0.3", features = ["registry", "env-filter"] }
3231
validator = { version = "0.16", features = ["derive"] }

controller/src/main.rs

Lines changed: 8 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ use controller::{telemetry::vending_metrics, BrupopController};
44
use models::{
55
constants::CONTROLLER_INTERNAL_PORT,
66
node::{BottlerocketShadow, K8SBottlerocketShadowClient},
7+
telemetry,
78
};
89

910
use actix_web::{web::Data, App, HttpServer};
@@ -22,19 +23,15 @@ use kube::{
2223

2324
use opentelemetry::sdk::export::metrics::aggregation;
2425
use opentelemetry::sdk::metrics::{controllers, processors, selectors};
25-
use opentelemetry::sdk::propagation::TraceContextPropagator;
2626
use snafu::ResultExt;
2727
use tracing::{event, Level};
28-
use tracing_subscriber::{fmt, layer::SubscriberExt, EnvFilter, Registry};
29-
30-
const DEFAULT_TRACE_LEVEL: &str = "info";
3128

3229
/// The module-wide result type.
3330
type Result<T> = std::result::Result<T, controller_error::Error>;
3431

3532
#[actix_web::main]
3633
async fn main() -> Result<()> {
37-
init_telemetry()?;
34+
telemetry::init_telemetry_from_env().context(controller_error::TelemetryInitSnafu)?;
3835

3936
let incluster_config =
4037
kube::Config::incluster_dns().context(controller_error::ConfigCreateSnafu)?;
@@ -135,23 +132,9 @@ async fn main() -> Result<()> {
135132
Ok(())
136133
}
137134

138-
fn init_telemetry() -> Result<()> {
139-
opentelemetry::global::set_text_map_propagator(TraceContextPropagator::new());
140-
141-
let env_filter =
142-
EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new(DEFAULT_TRACE_LEVEL));
143-
let stdio_formatting_layer = fmt::layer().pretty();
144-
let subscriber = Registry::default()
145-
.with(env_filter)
146-
.with(stdio_formatting_layer);
147-
tracing::subscriber::set_global_default(subscriber)
148-
.context(controller_error::TracingConfigurationSnafu)?;
149-
150-
Ok(())
151-
}
152-
153135
pub mod controller_error {
154136
use controller::controllerclient_error;
137+
use models::telemetry;
155138
use snafu::Snafu;
156139

157140
#[derive(Debug, Snafu)]
@@ -176,11 +159,6 @@ pub mod controller_error {
176159
#[snafu(display("The Kubernetes WATCH on {} objects has failed.", object))]
177160
KubernetesWatcherFailed { object: String },
178161

179-
#[snafu(display("Error configuring tracing: '{}'", source))]
180-
TracingConfiguration {
181-
source: tracing::subscriber::SetGlobalDefaultError,
182-
},
183-
184162
#[snafu(display("Error determining the cluster server address: '{}'", source))]
185163
MissingClusterIPFamily { source: std::env::VarError },
186164

@@ -189,5 +167,10 @@ pub mod controller_error {
189167

190168
#[snafu(display("Failed to run prometheus on controller"))]
191169
PrometheusError,
170+
171+
#[snafu(display("Error configuring telemetry: '{}'", source))]
172+
TelemetryInit {
173+
source: telemetry::TelemetryConfigError,
174+
},
192175
}
193176
}

deploy/charts/bottlerocket-update-operator/README.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,4 +135,15 @@ scheduler_cron_expression: "* * * * * * *"
135135
apiserver_internal_port: "8443"
136136
# API server internal address where the CRD version conversion webhook is served
137137
apiserver_service_port: "443"
138+
139+
# Formatter for the logs emitted by brupop.
140+
# Options are:
141+
# * full - Human-readable, single-line logs
142+
# * compact - A variant of full optimized for shorter line lengths
143+
# * pretty - "Excessively pretty" logs optimized for human-readable terminal output.
144+
# * json - Newline-delimited JSON-formatted logs.
145+
logging_formatter: "pretty"
146+
# Whether or not to enable ANSI colors on log messages.
147+
# Makes the output "pretty" in terminals, but may add noise to web-based log utilities.
148+
logging_ansi_enabled: "true"
138149
```

deploy/charts/bottlerocket-update-operator/templates/agent-daemonset.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,10 @@ spec:
4949
value: "{{ .Values.exclude_from_lb_wait_time_in_sec }}"
5050
- name: APISERVER_SERVICE_PORT
5151
value: "{{ .Values.apiserver_service_port }}"
52+
- name: LOGGING_FORMATTER
53+
value: "{{ .Values.logging_formatter }}"
54+
- name: LOGGING_ANSI_ENABLED
55+
value: "{{ .Values.logging_ansi_enabled }}"
5256
image: {{ .Values.image }}
5357
name: brupop
5458
resources:

0 commit comments

Comments
 (0)