Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Global error handler cleanup - Metrics SDK #2185

Closed
Changes from 1 commit
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
704b848
initial commit
lalitb Oct 8, 2024
b8cb6af
change name for exponential histogram
lalitb Oct 8, 2024
a0b6eee
Merge branch 'main' into global-error-handler-cleanup-metrics-sdk
lalitb Oct 9, 2024
acf97fa
rever changes
lalitb Oct 9, 2024
7b48f14
Update opentelemetry-sdk/src/metrics/internal/mod.rs
lalitb Oct 9, 2024
ac61b79
convert otel_error to otel_warn for cardinality limit
lalitb Oct 9, 2024
a42d516
log both existing and new instrument values
lalitb Oct 9, 2024
dbaa7f5
Merge branch 'main' into global-error-handler-cleanup-metrics-sdk
lalitb Oct 9, 2024
73fca4d
build error
lalitb Oct 9, 2024
ee5c5f5
Merge branch 'global-error-handler-cleanup-metrics-sdk' of github.com…
lalitb Oct 9, 2024
3aa97cf
remove formatting in wrapper macros
lalitb Oct 10, 2024
de54afe
Merge branch 'main' into global-error-handler-cleanup-metrics-sdk
lalitb Oct 23, 2024
e62de04
Merge branch 'main' into global-error-handler-cleanup-metrics-sdk
lalitb Oct 23, 2024
bda9faa
review comments
lalitb Oct 23, 2024
4a34922
resolve conflict
lalitb Oct 23, 2024
0087c24
lint error
lalitb Oct 23, 2024
115e73f
add comment for exponential histogram
lalitb Oct 23, 2024
56682a4
fix
lalitb Oct 23, 2024
7e48cbf
Update opentelemetry-sdk/src/metrics/internal/mod.rs
lalitb Oct 23, 2024
d81b374
use message for otel_warn
lalitb Oct 23, 2024
4b09c92
merge conflict
lalitb Oct 23, 2024
949930e
Update opentelemetry-sdk/src/metrics/meter.rs
lalitb Oct 23, 2024
6dcc9eb
Update opentelemetry-sdk/src/metrics/internal/mod.rs
lalitb Oct 23, 2024
4b42fe8
Update opentelemetry-sdk/src/metrics/meter.rs
lalitb Oct 23, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
remove formatting in wrapper macros
  • Loading branch information
lalitb committed Oct 10, 2024
commit 3aa97cf2ebf4ca74eb2b00f4c75e804e490d6110
4 changes: 2 additions & 2 deletions opentelemetry-sdk/src/metrics/internal/mod.rs
Original file line number Diff line number Diff line change
@@ -148,8 +148,8 @@
trackers.insert(STREAM_OVERFLOW_ATTRIBUTES.clone(), Arc::new(new_tracker));
//TODO - include name of meter, instrument
otel_warn!( name: "MetricCardinalityLimitReached",
error = MetricsError::Other("Maximum data points for metric stream exceeded. Entry added to overflow. Subsequent overflows to same metric until next collect will not be logged.".into()),
cardinality_limit = cardinality_limit()
error = format!("{}", MetricsError::Other("Maximum data points for metric stream exceeded. Entry added to overflow. Subsequent overflows to same metric until next collect will not be logged.".into())),
cardinality_limit = cardinality_limit() as u64,

Check warning on line 152 in opentelemetry-sdk/src/metrics/internal/mod.rs

Codecov / codecov/patch

opentelemetry-sdk/src/metrics/internal/mod.rs#L151-L152

Added lines #L151 - L152 were not covered by tests
);
}
}
28 changes: 14 additions & 14 deletions opentelemetry-sdk/src/metrics/meter.rs
Original file line number Diff line number Diff line change
@@ -74,7 +74,7 @@
{
let validation_result = validate_instrument_config(builder.name.as_ref(), &builder.unit);
if let Err(err) = validation_result {
otel_error!(name: "SdkMeter.CreateCounter.ValidationError", error = err);
otel_error!(name: "SdkMeter.CreateCounter.ValidationError", error = format!("{}", err));
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agree Error is the right severity for this, but this is still not so user-friendly.
Since this is user facing, the internal log should be clearly actionable, along with the impact of this error.
In this case, the impact is - measurements reported using this instrument will be ignore.
The "why" is also not so obvious.
As an end-user, I'd prefer to see something like

Name: InstrumentCreationFailed
InstrumentName: A_non_asccii_Metric
MeterName: MeterName
Reason: Instrument Name contains non-ascii charactors. Link to spec, optionally.
Message: Measurements from this instruments will be ignored.

return Ok(Counter::new(Arc::new(NoopSyncInstrument::new())));
}

@@ -90,7 +90,7 @@
{
Ok(counter) => Ok(counter),
Err(err) => {
otel_error!(name: "SdkMeter.CreateCounter.Error", error = err);
otel_error!(name: "SdkMeter.CreateCounter.Error", error = format!("{}", err));

Check warning on line 93 in opentelemetry-sdk/src/metrics/meter.rs

Codecov / codecov/patch

opentelemetry-sdk/src/metrics/meter.rs#L93

Added line #L93 was not covered by tests
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Same comment as https://github.com/open-telemetry/opentelemetry-rust/pull/2185/files#r1796240076
I dont think a user would know the difference between ValidationError vs Error.

Ok(Counter::new(Arc::new(NoopSyncInstrument::new())))
}
}
@@ -106,7 +106,7 @@
{
let validation_result = validate_instrument_config(builder.name.as_ref(), &builder.unit);
if let Err(err) = validation_result {
otel_error!(name: "SdkMeter.CreateObservableCounter.ValidationError", error = err);
otel_error!(name: "SdkMeter.CreateObservableCounter.ValidationError", error = format!("{}", err));
return Ok(ObservableCounter::new(Arc::new(NoopAsyncInstrument::new())));
}

@@ -119,7 +119,7 @@
)?;

if ms.is_empty() {
otel_error!(name: "SdkMeter.CreateObservableCounter.Error", error = MetricsError::Other("no measures found".into()));
otel_error!(name: "SdkMeter.CreateObservableCounter.Error", error = format!("{}", MetricsError::Other("no measures found".into())));

Check warning on line 122 in opentelemetry-sdk/src/metrics/meter.rs

Codecov / codecov/patch

opentelemetry-sdk/src/metrics/meter.rs#L122

Added line #L122 was not covered by tests
return Ok(ObservableCounter::new(Arc::new(NoopAsyncInstrument::new())));
}

@@ -144,7 +144,7 @@
{
let validation_result = validate_instrument_config(builder.name.as_ref(), &builder.unit);
if let Err(err) = validation_result {
otel_error!(name: "SdkMeter.CreateObservableUpDownCounter.ValidationError", error = err);
otel_error!(name: "SdkMeter.CreateObservableUpDownCounter.ValidationError", error = format!("{}", err));
return Ok(ObservableUpDownCounter::new(Arc::new(
NoopAsyncInstrument::new(),
)));
@@ -159,7 +159,7 @@
)?;

if ms.is_empty() {
otel_error!(name: "SdkMeter.CreateObservableUpDownCounter.Error", error = MetricsError::Other("no measures found".into()));
otel_error!(name: "SdkMeter.CreateObservableUpDownCounter.Error", error = format!("{}",MetricsError::Other("no measures found".into())));

Check warning on line 162 in opentelemetry-sdk/src/metrics/meter.rs

Codecov / codecov/patch

opentelemetry-sdk/src/metrics/meter.rs#L162

Added line #L162 was not covered by tests
return Ok(ObservableUpDownCounter::new(Arc::new(
NoopAsyncInstrument::new(),
)));
@@ -186,7 +186,7 @@
{
let validation_result = validate_instrument_config(builder.name.as_ref(), &builder.unit);
if let Err(err) = validation_result {
otel_error!(name: "SdkMeter.CreateObservableGauge.ValidationError", error = err);
otel_error!(name: "SdkMeter.CreateObservableGauge.ValidationError", error = format!("{}", err));
return Ok(ObservableGauge::new(Arc::new(NoopAsyncInstrument::new())));
}

@@ -199,7 +199,7 @@
)?;

if ms.is_empty() {
otel_error!(name: "SdkMeter.CreateObservableGauge.Error", error = MetricsError::Other("no measures found".into()));
otel_error!(name: "SdkMeter.CreateObservableGauge.Error",error = format!("{}", MetricsError::Other("no measures found".into())));

Check warning on line 202 in opentelemetry-sdk/src/metrics/meter.rs

Codecov / codecov/patch

opentelemetry-sdk/src/metrics/meter.rs#L202

Added line #L202 was not covered by tests
return Ok(ObservableGauge::new(Arc::new(NoopAsyncInstrument::new())));
}

@@ -224,7 +224,7 @@
{
let validation_result = validate_instrument_config(builder.name.as_ref(), &builder.unit);
if let Err(err) = validation_result {
otel_error!(name: "SdkMeter.CreateUpDownCounter.ValidationError", error = err);
otel_error!(name: "SdkMeter.CreateUpDownCounter.ValidationError", error = format!("{}",err));
return Ok(UpDownCounter::new(Arc::new(NoopSyncInstrument::new())));
}

@@ -240,7 +240,7 @@
{
Ok(updown_counter) => Ok(updown_counter),
Err(err) => {
otel_error!(name: "SdkMeter.CreateUpDownCounter.Error", error = err);
otel_error!(name: "SdkMeter.CreateUpDownCounter.Error", error = format!("{}", err));

Check warning on line 243 in opentelemetry-sdk/src/metrics/meter.rs

Codecov / codecov/patch

opentelemetry-sdk/src/metrics/meter.rs#L243

Added line #L243 was not covered by tests
Ok(UpDownCounter::new(Arc::new(NoopSyncInstrument::new())))
}
}
@@ -256,7 +256,7 @@
{
let validation_result = validate_instrument_config(builder.name.as_ref(), &builder.unit);
if let Err(err) = validation_result {
otel_error!(name: "SdkMeter.CreateGauge.ValidationError", error = err);
otel_error!(name: "SdkMeter.CreateGauge.ValidationError", error = format!("{}", err));
return Ok(Gauge::new(Arc::new(NoopSyncInstrument::new())));
}

@@ -272,7 +272,7 @@
{
Ok(gauge) => Ok(gauge),
Err(err) => {
otel_error!(name: "SdkMeter.CreateGauge.Error", error = err);
otel_error!(name: "SdkMeter.CreateGauge.Error", error = format!("{}",err));

Check warning on line 275 in opentelemetry-sdk/src/metrics/meter.rs

Codecov / codecov/patch

opentelemetry-sdk/src/metrics/meter.rs#L275

Added line #L275 was not covered by tests
Ok(Gauge::new(Arc::new(NoopSyncInstrument::new())))
}
}
@@ -288,7 +288,7 @@
{
let validation_result = validate_instrument_config(builder.name.as_ref(), &builder.unit);
if let Err(err) = validation_result {
otel_error!(name: "SdkMeter.CreateHistogram.ValidationError", error = err);
otel_error!(name: "SdkMeter.CreateHistogram.ValidationError", error = format!("{}", err));
return Ok(Histogram::new(Arc::new(NoopSyncInstrument::new())));
}

@@ -304,7 +304,7 @@
{
Ok(histogram) => Ok(histogram),
Err(err) => {
otel_error!(name: "SdkMeter.CreateHistogram.Error", error = err);
otel_error!(name: "SdkMeter.CreateHistogram.Error", error = format!("{}",err));

Check warning on line 307 in opentelemetry-sdk/src/metrics/meter.rs

Codecov / codecov/patch

opentelemetry-sdk/src/metrics/meter.rs#L307

Added line #L307 was not covered by tests
Ok(Histogram::new(Arc::new(NoopSyncInstrument::new())))
}
}
2 changes: 1 addition & 1 deletion opentelemetry-sdk/src/metrics/meter_provider.rs
Original file line number Diff line number Diff line change
@@ -136,7 +136,7 @@
// shutdown(), then we don't need to call shutdown again.
if !self.is_shutdown.load(Ordering::Relaxed) {
if let Err(err) = self.shutdown() {
otel_error!(name: "SdkMeterProvider.Drop.ShutdownError", error = err);
otel_error!(name: "SdkMeterProvider.Drop.ShutdownError", error = format!("{}",err));

Check warning on line 139 in opentelemetry-sdk/src/metrics/meter_provider.rs

Codecov / codecov/patch

opentelemetry-sdk/src/metrics/meter_provider.rs#L139

Added line #L139 was not covered by tests
}
}
}
20 changes: 10 additions & 10 deletions opentelemetry-sdk/src/metrics/pipeline.rs
Original file line number Diff line number Diff line change
@@ -413,17 +413,17 @@
if existing == id {
return;
}
otel_warn!(name: "Instrument.DuplicateMetricStreamDefinitions",
name = id.name.clone(),
description = id.description.clone(),
kind = id.kind,
unit = id.unit.clone(),
number = id.number.clone(),
existing_name = existing.name.clone(),
existing_desc = existing.description.clone(),
existing_kind = existing.kind,
existing_unit = existing.unit.clone(),
existing_number = existing.number.clone()
name = format!("{}",id.name),
description = format!("{}", id.description),
kind = format!("{:?}", id.kind),
unit = format!("{}",id.unit),
number = format!("{}", id.number),
existing_name = format!("{}", existing.name),
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I think we can skip logging this set of attributes twice. The event name says that we have a duplicate stream so it should already be understood that we have two identical sets of attributes.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I am not very sure of the logic here. Can you check once. As we return at line 414 if they are same.

existing_desc = format!("{}", existing.description),
existing_kind = format!("{:?}", existing.kind),
existing_unit = format!("{}", existing.unit),
existing_number = format!("{}", existing.number),

Check warning on line 426 in opentelemetry-sdk/src/metrics/pipeline.rs

Codecov / codecov/patch

opentelemetry-sdk/src/metrics/pipeline.rs#L416-L426

Added lines #L416 - L426 were not covered by tests
);
}
}
23 changes: 11 additions & 12 deletions opentelemetry-sdk/src/metrics/view.rs
Original file line number Diff line number Diff line change
@@ -102,10 +102,10 @@
/// ```
pub fn new_view(criteria: Instrument, mask: Stream) -> Result<Box<dyn View>> {
if criteria.is_empty() {
otel_error!(name: "CreateView.ValidationError", error = MetricsError::Config(
"no criteria provided, dropping view".to_string()),
criteria = criteria,
mask = mask
otel_error!(name: "CreateView.ValidationError", error = format!("{}",MetricsError::Config(
"no criteria provided, dropping view".to_string())),
criteria = format!("{:?}", criteria),
mask = format!("{:?}", mask)

Check warning on line 108 in opentelemetry-sdk/src/metrics/view.rs

Codecov / codecov/patch

opentelemetry-sdk/src/metrics/view.rs#L105-L108

Added lines #L105 - L108 were not covered by tests
);
return Ok(Box::new(empty_view));
}
@@ -114,10 +114,10 @@

let match_fn: Box<dyn Fn(&Instrument) -> bool + Send + Sync> = if contains_wildcard {
if mask.name != "" {
otel_error!(name: "CreateView.ValidationError", error = MetricsError::Config(
"name replacement for wildcard instrument, dropping view".to_string()),
criteria = criteria,
mask = mask
otel_error!(name: "CreateView.ValidationError", error = format!("{}", MetricsError::Config(
"name replacement for wildcard instrument, dropping view".to_string())),
criteria = format!("{:?}", criteria),
mask = format!("{:?}", mask)

Check warning on line 120 in opentelemetry-sdk/src/metrics/view.rs

Codecov / codecov/patch

opentelemetry-sdk/src/metrics/view.rs#L117-L120

Added lines #L117 - L120 were not covered by tests
);
return Ok(Box::new(empty_view));
}
@@ -143,10 +143,9 @@
Ok(_) => agg = Some(ma.clone()),
Err(err) => {
otel_error!(name: "CreateView.ValidationError",
error = MetricsError::Config("invalid aggregation, dropping view".to_string()),
criteria = err_msg_criteria,
mask = mask,
error = err
error = format!("{}",err),
criteria = format!("{:?}", err_msg_criteria),
mask = format!("{:?}", mask),

Check warning on line 148 in opentelemetry-sdk/src/metrics/view.rs

Codecov / codecov/patch

opentelemetry-sdk/src/metrics/view.rs#L146-L148

Added lines #L146 - L148 were not covered by tests
);
return Ok(Box::new(empty_view));
}
12 changes: 2 additions & 10 deletions opentelemetry/src/global/internal_logging.rs
Original file line number Diff line number Diff line change
@@ -64,7 +64,7 @@ macro_rules! otel_warn {
tracing::warn!(name: $name,
target: env!("CARGO_PKG_NAME"),
$($key = {
$crate::format_value!($value)
$value
}),+,
""
) }
@@ -133,7 +133,7 @@ macro_rules! otel_error {
tracing::error!(name: $name,
target: env!("CARGO_PKG_NAME"),
$($key = {
$crate::format_value!($value)
$value
}),+,
""
) }
@@ -145,11 +145,3 @@ macro_rules! otel_error {
}
};
}

/// Helper macro to format a value
#[macro_export]
macro_rules! format_value {
($value:expr) => {{
format!("{:?}", $value)
}};
}
Loading