mz_tracing/
params.rs

1// Copyright Materialize, Inc. and contributors. All rights reserved.
2//
3// Use of this software is governed by the Business Source License
4// included in the LICENSE file.
5//
6// As of the Change Date specified in that file, in accordance with
7// the Business Source License, use of this software will be governed
8// by the Apache License, Version 2.0.
9
10use mz_ore::tracing::TracingHandle;
11use serde::{Deserialize, Serialize};
12use tracing::warn;
13
14use crate::{CloneableEnvFilter, SerializableDirective};
15
16/// Parameters related to `tracing`.
17#[derive(Clone, Debug, Default, PartialEq, Eq, Serialize, Deserialize)]
18pub struct TracingParameters {
19    /// Filter to apply to stderr logging.
20    pub log_filter: Option<CloneableEnvFilter>,
21    /// Filter to apply to OpenTelemetry/distributed tracing.
22    pub opentelemetry_filter: Option<CloneableEnvFilter>,
23    /// Additional directives for `log_filter`.
24    pub log_filter_defaults: Vec<SerializableDirective>,
25    /// Additional directives for `opentelemetry_filter`.
26    pub opentelemetry_filter_defaults: Vec<SerializableDirective>,
27    /// Additional directives on top of the `info` filter for `sentry`.
28    pub sentry_filters: Vec<SerializableDirective>,
29}
30
31impl TracingParameters {
32    pub fn apply(&self, tracing_handle: &TracingHandle) {
33        if let Some(filter) = &self.log_filter {
34            if let Err(e) = tracing_handle.reload_stderr_log_filter(
35                filter.clone().into(),
36                self.log_filter_defaults
37                    .iter()
38                    .map(|d| d.clone().into())
39                    .collect(),
40            ) {
41                warn!(
42                    "unable to apply stderr log filter: {:?}. filter={}, defaults={:?}",
43                    e, filter, self.log_filter_defaults
44                );
45            }
46        }
47        if let Some(filter) = &self.opentelemetry_filter {
48            if let Err(e) = tracing_handle.reload_opentelemetry_filter(
49                filter.clone().into(),
50                self.opentelemetry_filter_defaults
51                    .iter()
52                    .map(|d| d.clone().into())
53                    .collect(),
54            ) {
55                warn!(
56                    "unable to apply OpenTelemetry filter: {:?}. filter={}, defaults={:?}",
57                    e, filter, self.opentelemetry_filter_defaults
58                );
59            }
60        }
61        if let Err(e) = tracing_handle.reload_sentry_directives(
62            self.sentry_filters
63                .iter()
64                .map(|d| d.clone().into())
65                .collect(),
66        ) {
67            warn!(
68                "unable to apply sentry directives: {:?}. directives={:?}",
69                e, self.sentry_filters
70            );
71        }
72    }
73
74    pub fn update(&mut self, other: Self) {
75        let Self {
76            log_filter,
77            opentelemetry_filter,
78            log_filter_defaults,
79            opentelemetry_filter_defaults,
80            sentry_filters,
81        } = self;
82
83        let Self {
84            log_filter: other_log_filter,
85            opentelemetry_filter: other_opentelemetry_filter,
86            log_filter_defaults: other_log_filter_defaults,
87            opentelemetry_filter_defaults: other_opentelemetry_filter_defaults,
88            sentry_filters: other_sentry_filters,
89        } = other;
90
91        if let Some(v) = other_log_filter {
92            *log_filter = Some(v);
93        }
94        if let Some(v) = other_opentelemetry_filter {
95            *opentelemetry_filter = Some(v);
96        }
97
98        *log_filter_defaults = other_log_filter_defaults;
99        *opentelemetry_filter_defaults = other_opentelemetry_filter_defaults;
100        *sentry_filters = other_sentry_filters;
101    }
102}