@temporalio/core-bridge 1.15.0 → 1.16.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Cargo.lock +172 -70
- package/lib/native.d.ts +1 -1
- package/package.json +2 -2
- package/releases/aarch64-apple-darwin/index.node +0 -0
- package/releases/aarch64-unknown-linux-gnu/index.node +0 -0
- package/releases/x86_64-apple-darwin/index.node +0 -0
- package/releases/x86_64-pc-windows-msvc/index.node +0 -0
- package/releases/x86_64-unknown-linux-gnu/index.node +0 -0
- package/sdk-core/.github/workflows/per-pr.yml +6 -6
- package/sdk-core/AGENTS.md +41 -30
- package/sdk-core/Cargo.toml +3 -0
- package/sdk-core/README.md +15 -9
- package/sdk-core/crates/client/Cargo.toml +4 -0
- package/sdk-core/crates/client/README.md +139 -0
- package/sdk-core/crates/client/src/async_activity_handle.rs +297 -0
- package/sdk-core/crates/client/src/callback_based.rs +7 -0
- package/sdk-core/crates/client/src/errors.rs +294 -0
- package/sdk-core/crates/client/src/{raw.rs → grpc.rs} +280 -159
- package/sdk-core/crates/client/src/lib.rs +920 -1326
- package/sdk-core/crates/client/src/metrics.rs +24 -33
- package/sdk-core/crates/client/src/options_structs.rs +457 -0
- package/sdk-core/crates/client/src/replaceable.rs +5 -4
- package/sdk-core/crates/client/src/request_extensions.rs +8 -9
- package/sdk-core/crates/client/src/retry.rs +99 -54
- package/sdk-core/crates/client/src/{worker/mod.rs → worker.rs} +1 -1
- package/sdk-core/crates/client/src/workflow_handle.rs +826 -0
- package/sdk-core/crates/common/Cargo.toml +61 -2
- package/sdk-core/crates/common/build.rs +742 -12
- package/sdk-core/crates/common/protos/api_upstream/.github/workflows/ci.yml +2 -0
- package/sdk-core/crates/common/protos/api_upstream/Makefile +2 -1
- package/sdk-core/crates/common/protos/api_upstream/buf.yaml +0 -3
- package/sdk-core/crates/common/protos/api_upstream/cmd/check-path-conflicts/main.go +137 -0
- package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv2.json +1166 -770
- package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv3.yaml +1243 -750
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/deployment/v1/message.proto +2 -2
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/workflow.proto +4 -3
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/failure/v1/message.proto +1 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/history/v1/message.proto +4 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/namespace/v1/message.proto +6 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/nexus/v1/message.proto +16 -1
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +64 -6
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +88 -33
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/nexus/nexus.proto +4 -2
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +4 -0
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +5 -5
- package/sdk-core/crates/common/src/activity_definition.rs +20 -0
- package/sdk-core/crates/common/src/data_converters.rs +770 -0
- package/sdk-core/crates/common/src/envconfig.rs +5 -0
- package/sdk-core/crates/common/src/lib.rs +15 -211
- package/sdk-core/crates/common/src/payload_visitor.rs +648 -0
- package/sdk-core/crates/common/src/priority.rs +110 -0
- package/sdk-core/crates/common/src/protos/canned_histories.rs +3 -0
- package/sdk-core/crates/common/src/protos/history_builder.rs +45 -0
- package/sdk-core/crates/common/src/protos/history_info.rs +2 -0
- package/sdk-core/crates/common/src/protos/mod.rs +122 -27
- package/sdk-core/crates/common/src/protos/task_token.rs +3 -3
- package/sdk-core/crates/common/src/protos/utilities.rs +11 -0
- package/sdk-core/crates/{sdk-core → common}/src/telemetry/log_export.rs +5 -7
- package/sdk-core/crates/common/src/telemetry/metrics/core.rs +125 -0
- package/sdk-core/crates/common/src/telemetry/metrics.rs +268 -223
- package/sdk-core/crates/{sdk-core → common}/src/telemetry/otel.rs +8 -13
- package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_meter.rs +49 -50
- package/sdk-core/crates/{sdk-core → common}/src/telemetry/prometheus_server.rs +2 -3
- package/sdk-core/crates/common/src/telemetry.rs +264 -4
- package/sdk-core/crates/common/src/worker.rs +68 -603
- package/sdk-core/crates/common/src/workflow_definition.rs +60 -0
- package/sdk-core/crates/macros/Cargo.toml +5 -1
- package/sdk-core/crates/macros/src/activities_definitions.rs +585 -0
- package/sdk-core/crates/macros/src/fsm_impl.rs +507 -0
- package/sdk-core/crates/macros/src/lib.rs +138 -512
- package/sdk-core/crates/macros/src/macro_utils.rs +106 -0
- package/sdk-core/crates/macros/src/workflow_definitions.rs +1224 -0
- package/sdk-core/crates/sdk/Cargo.toml +19 -6
- package/sdk-core/crates/sdk/README.md +415 -0
- package/sdk-core/crates/sdk/src/activities.rs +417 -0
- package/sdk-core/crates/sdk/src/interceptors.rs +1 -1
- package/sdk-core/crates/sdk/src/lib.rs +757 -442
- package/sdk-core/crates/sdk/src/workflow_context/options.rs +45 -35
- package/sdk-core/crates/sdk/src/workflow_context.rs +1033 -289
- package/sdk-core/crates/sdk/src/workflow_future.rs +277 -213
- package/sdk-core/crates/sdk/src/workflows.rs +711 -0
- package/sdk-core/crates/sdk-core/Cargo.toml +57 -64
- package/sdk-core/crates/sdk-core/benches/workflow_replay_bench.rs +41 -35
- package/sdk-core/crates/sdk-core/machine_coverage/ActivityMachine_Coverage.puml +1 -1
- package/sdk-core/crates/sdk-core/src/abstractions.rs +6 -10
- package/sdk-core/crates/sdk-core/src/core_tests/activity_tasks.rs +6 -5
- package/sdk-core/crates/sdk-core/src/core_tests/mod.rs +13 -15
- package/sdk-core/crates/sdk-core/src/core_tests/queries.rs +21 -25
- package/sdk-core/crates/sdk-core/src/core_tests/replay_flag.rs +7 -10
- package/sdk-core/crates/sdk-core/src/core_tests/updates.rs +14 -17
- package/sdk-core/crates/sdk-core/src/core_tests/workers.rs +493 -26
- package/sdk-core/crates/sdk-core/src/core_tests/workflow_tasks.rs +4 -8
- package/sdk-core/crates/sdk-core/src/ephemeral_server/mod.rs +7 -7
- package/sdk-core/crates/sdk-core/src/histfetch.rs +20 -10
- package/sdk-core/crates/sdk-core/src/lib.rs +41 -111
- package/sdk-core/crates/sdk-core/src/pollers/mod.rs +4 -9
- package/sdk-core/crates/sdk-core/src/pollers/poll_buffer.rs +118 -19
- package/sdk-core/crates/sdk-core/src/protosext/mod.rs +2 -2
- package/sdk-core/crates/sdk-core/src/replay/mod.rs +14 -5
- package/sdk-core/crates/sdk-core/src/telemetry/metrics.rs +179 -196
- package/sdk-core/crates/sdk-core/src/telemetry/mod.rs +3 -280
- package/sdk-core/crates/sdk-core/src/test_help/integ_helpers.rs +6 -9
- package/sdk-core/crates/sdk-core/src/test_help/unit_helpers.rs +3 -6
- package/sdk-core/crates/sdk-core/src/worker/activities/local_activities.rs +11 -14
- package/sdk-core/crates/sdk-core/src/worker/activities.rs +16 -19
- package/sdk-core/crates/sdk-core/src/worker/client/mocks.rs +9 -5
- package/sdk-core/crates/sdk-core/src/worker/client.rs +103 -81
- package/sdk-core/crates/sdk-core/src/worker/heartbeat.rs +7 -11
- package/sdk-core/crates/sdk-core/src/worker/mod.rs +1124 -229
- package/sdk-core/crates/sdk-core/src/worker/nexus.rs +145 -23
- package/sdk-core/crates/sdk-core/src/worker/slot_provider.rs +2 -2
- package/sdk-core/crates/sdk-core/src/worker/tuner/fixed_size.rs +2 -2
- package/sdk-core/crates/sdk-core/src/worker/tuner/resource_based.rs +13 -13
- package/sdk-core/crates/sdk-core/src/worker/tuner.rs +28 -8
- package/sdk-core/crates/sdk-core/src/worker/workflow/driven_workflow.rs +9 -3
- package/sdk-core/crates/sdk-core/src/worker/workflow/machines/upsert_search_attributes_state_machine.rs +21 -22
- package/sdk-core/crates/sdk-core/src/worker/workflow/machines/workflow_machines.rs +19 -4
- package/sdk-core/crates/sdk-core/src/worker/workflow/managed_run.rs +14 -18
- package/sdk-core/crates/sdk-core/src/worker/workflow/mod.rs +4 -6
- package/sdk-core/crates/sdk-core/src/worker/workflow/run_cache.rs +4 -7
- package/sdk-core/crates/sdk-core/src/worker/workflow/wft_extraction.rs +2 -4
- package/sdk-core/crates/sdk-core/src/worker/workflow/wft_poller.rs +8 -9
- package/sdk-core/crates/sdk-core/src/worker/workflow/workflow_stream.rs +1 -3
- package/sdk-core/crates/sdk-core/tests/activities_procmacro.rs +6 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/basic_pass.rs +54 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.rs +18 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/invalid_self_type_fail.stderr +5 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.rs +14 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/missing_context_fail.stderr +5 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/multi_arg_pass.rs +48 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_input_pass.rs +14 -0
- package/sdk-core/crates/sdk-core/tests/activities_trybuild/no_return_type_pass.rs +19 -0
- package/sdk-core/crates/sdk-core/tests/cloud_tests.rs +14 -5
- package/sdk-core/crates/sdk-core/tests/common/activity_functions.rs +55 -0
- package/sdk-core/crates/sdk-core/tests/common/mod.rs +241 -196
- package/sdk-core/crates/sdk-core/tests/common/workflows.rs +41 -28
- package/sdk-core/crates/sdk-core/tests/global_metric_tests.rs +3 -5
- package/sdk-core/crates/sdk-core/tests/heavy_tests/fuzzy_workflow.rs +73 -64
- package/sdk-core/crates/sdk-core/tests/heavy_tests.rs +298 -252
- package/sdk-core/crates/sdk-core/tests/integ_tests/async_activity_client_tests.rs +230 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/client_tests.rs +94 -57
- package/sdk-core/crates/sdk-core/tests/integ_tests/data_converter_tests.rs +381 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/ephemeral_server_tests.rs +16 -12
- package/sdk-core/crates/sdk-core/tests/integ_tests/heartbeat_tests.rs +48 -40
- package/sdk-core/crates/sdk-core/tests/integ_tests/metrics_tests.rs +327 -255
- package/sdk-core/crates/sdk-core/tests/integ_tests/pagination_tests.rs +50 -45
- package/sdk-core/crates/sdk-core/tests/integ_tests/polling_tests.rs +147 -126
- package/sdk-core/crates/sdk-core/tests/integ_tests/queries_tests.rs +103 -89
- package/sdk-core/crates/sdk-core/tests/integ_tests/update_tests.rs +609 -453
- package/sdk-core/crates/sdk-core/tests/integ_tests/visibility_tests.rs +80 -62
- package/sdk-core/crates/sdk-core/tests/integ_tests/worker_heartbeat_tests.rs +360 -231
- package/sdk-core/crates/sdk-core/tests/integ_tests/worker_tests.rs +248 -185
- package/sdk-core/crates/sdk-core/tests/integ_tests/worker_versioning_tests.rs +52 -43
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_client_tests.rs +180 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/activities.rs +428 -315
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +82 -56
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +56 -28
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +364 -243
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/client_interactions.rs +552 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/continue_as_new.rs +101 -42
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +243 -147
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/eager.rs +98 -28
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +1475 -1036
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +73 -41
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +397 -238
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/patches.rs +414 -189
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/queries.rs +415 -0
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/replay.rs +96 -36
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/resets.rs +154 -137
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/signals.rs +183 -105
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +85 -38
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/timers.rs +142 -40
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +73 -54
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests.rs +363 -226
- package/sdk-core/crates/sdk-core/tests/main.rs +17 -15
- package/sdk-core/crates/sdk-core/tests/manual_tests.rs +207 -152
- package/sdk-core/crates/sdk-core/tests/shared_tests/mod.rs +65 -34
- package/sdk-core/crates/sdk-core/tests/shared_tests/priority.rs +107 -84
- package/sdk-core/crates/sdk-core/tests/workflows_procmacro.rs +6 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.rs +26 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/async_query_fail.stderr +5 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/basic_pass.rs +49 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/minimal_pass.rs +21 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.rs +26 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/mut_query_fail.stderr +5 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.rs +21 -0
- package/sdk-core/crates/sdk-core/tests/workflows_trybuild/sync_run_fail.stderr +5 -0
- package/sdk-core/crates/sdk-core-c-bridge/Cargo.toml +7 -1
- package/sdk-core/crates/sdk-core-c-bridge/include/temporal-sdk-core-c-bridge.h +14 -14
- package/sdk-core/crates/sdk-core-c-bridge/src/client.rs +83 -74
- package/sdk-core/crates/sdk-core-c-bridge/src/metric.rs +9 -14
- package/sdk-core/crates/sdk-core-c-bridge/src/runtime.rs +1 -2
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/context.rs +13 -13
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/mod.rs +6 -6
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/utils.rs +3 -4
- package/sdk-core/crates/sdk-core-c-bridge/src/worker.rs +62 -75
- package/sdk-core/rustfmt.toml +2 -1
- package/src/client.rs +205 -318
- package/src/metrics.rs +22 -30
- package/src/runtime.rs +4 -5
- package/src/worker.rs +16 -19
- package/ts/native.ts +1 -1
- package/sdk-core/crates/client/src/workflow_handle/mod.rs +0 -212
- package/sdk-core/crates/common/src/errors.rs +0 -85
- package/sdk-core/crates/common/tests/worker_task_types_test.rs +0 -129
- package/sdk-core/crates/sdk/src/activity_context.rs +0 -238
- package/sdk-core/crates/sdk/src/app_data.rs +0 -37
- package/sdk-core/crates/sdk-core/tests/integ_tests/activity_functions.rs +0 -5
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/appdata_propagation.rs +0 -61
|
@@ -1,14 +1,17 @@
|
|
|
1
1
|
use super::{
|
|
2
|
-
|
|
2
|
+
HistogramBucketOverrides, MetricTemporality, OtelCollectorOptions, OtlpProtocol,
|
|
3
|
+
TELEM_SERVICE_NAME,
|
|
3
4
|
metrics::{
|
|
4
5
|
ACTIVITY_EXEC_LATENCY_HISTOGRAM_NAME, ACTIVITY_SCHED_TO_START_LATENCY_HISTOGRAM_NAME,
|
|
5
|
-
DEFAULT_MS_BUCKETS,
|
|
6
|
-
|
|
6
|
+
CoreMeter, Counter, DEFAULT_MS_BUCKETS, DEFAULT_S_BUCKETS, Gauge, GaugeF64, Histogram,
|
|
7
|
+
HistogramBase, HistogramDuration, HistogramDurationBase, HistogramF64, HistogramF64Base,
|
|
8
|
+
MetricAttributable, MetricAttributes, MetricParameters, NewAttributes,
|
|
9
|
+
WORKFLOW_E2E_LATENCY_HISTOGRAM_NAME, WORKFLOW_TASK_EXECUTION_LATENCY_HISTOGRAM_NAME,
|
|
7
10
|
WORKFLOW_TASK_REPLAY_LATENCY_HISTOGRAM_NAME,
|
|
8
|
-
WORKFLOW_TASK_SCHED_TO_START_LATENCY_HISTOGRAM_NAME,
|
|
11
|
+
WORKFLOW_TASK_SCHED_TO_START_LATENCY_HISTOGRAM_NAME, default_buckets_for,
|
|
9
12
|
},
|
|
10
13
|
};
|
|
11
|
-
use crate::
|
|
14
|
+
use crate::dbg_panic;
|
|
12
15
|
use opentelemetry::{
|
|
13
16
|
self, Key, KeyValue, Value,
|
|
14
17
|
metrics::{Meter, MeterProvider as MeterProviderT},
|
|
@@ -22,14 +25,6 @@ use opentelemetry_sdk::{
|
|
|
22
25
|
},
|
|
23
26
|
};
|
|
24
27
|
use std::{collections::HashMap, sync::Arc, time::Duration};
|
|
25
|
-
use temporalio_common::telemetry::{
|
|
26
|
-
HistogramBucketOverrides, MetricTemporality, OtelCollectorOptions, OtlpProtocol,
|
|
27
|
-
metrics::{
|
|
28
|
-
CoreMeter, Counter, Gauge, GaugeF64, Histogram, HistogramBase, HistogramDuration,
|
|
29
|
-
HistogramDurationBase, HistogramF64, HistogramF64Base, MetricAttributable,
|
|
30
|
-
MetricAttributes, MetricParameters, NewAttributes,
|
|
31
|
-
},
|
|
32
|
-
};
|
|
33
28
|
use tonic::{metadata::MetadataMap, transport::ClientTlsConfig};
|
|
34
29
|
|
|
35
30
|
fn histo_view(
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
use crate::{
|
|
1
|
+
use crate::{
|
|
2
|
+
dbg_panic,
|
|
3
|
+
telemetry::metrics::{
|
|
4
|
+
CoreMeter, Counter, CounterBase, Gauge, GaugeBase, GaugeF64, GaugeF64Base, Histogram,
|
|
5
|
+
HistogramBase, HistogramDuration, HistogramDurationBase, HistogramF64, HistogramF64Base,
|
|
6
|
+
MetricAttributable, MetricAttributes, MetricParameters, NewAttributes, OrderedPromLabelSet,
|
|
7
|
+
default_buckets_for,
|
|
8
|
+
},
|
|
9
|
+
};
|
|
2
10
|
use anyhow::anyhow;
|
|
3
11
|
use parking_lot::RwLock;
|
|
4
12
|
use prometheus::{
|
|
@@ -12,11 +20,6 @@ use std::{
|
|
|
12
20
|
sync::Arc,
|
|
13
21
|
time::Duration,
|
|
14
22
|
};
|
|
15
|
-
use temporalio_common::telemetry::metrics::{
|
|
16
|
-
CoreMeter, Counter, CounterBase, Gauge, GaugeBase, GaugeF64, GaugeF64Base, Histogram,
|
|
17
|
-
HistogramBase, HistogramDuration, HistogramDurationBase, HistogramF64, HistogramF64Base,
|
|
18
|
-
MetricAttributable, MetricAttributes, MetricParameters, NewAttributes, OrderedPromLabelSet,
|
|
19
|
-
};
|
|
20
23
|
|
|
21
24
|
#[derive(derive_more::From, derive_more::TryInto, Debug, Clone)]
|
|
22
25
|
enum PromCollector {
|
|
@@ -459,7 +462,7 @@ pub struct CorePrometheusMeter {
|
|
|
459
462
|
registry: Registry,
|
|
460
463
|
use_seconds_for_durations: bool,
|
|
461
464
|
unit_suffix: bool,
|
|
462
|
-
bucket_overrides:
|
|
465
|
+
bucket_overrides: crate::telemetry::HistogramBucketOverrides,
|
|
463
466
|
}
|
|
464
467
|
|
|
465
468
|
impl CorePrometheusMeter {
|
|
@@ -467,7 +470,7 @@ impl CorePrometheusMeter {
|
|
|
467
470
|
registry: Registry,
|
|
468
471
|
use_seconds_for_durations: bool,
|
|
469
472
|
unit_suffix: bool,
|
|
470
|
-
bucket_overrides:
|
|
473
|
+
bucket_overrides: crate::telemetry::HistogramBucketOverrides,
|
|
471
474
|
) -> Self {
|
|
472
475
|
Self {
|
|
473
476
|
registry,
|
|
@@ -636,12 +639,11 @@ impl MetricAttributable<Box<dyn HistogramDurationBase>> for DurationHistogram {
|
|
|
636
639
|
#[cfg(test)]
|
|
637
640
|
mod tests {
|
|
638
641
|
use super::*;
|
|
639
|
-
use crate::telemetry::{
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
METRIC_PREFIX,
|
|
643
|
-
metrics::{MetricKeyValue, NewAttributes},
|
|
642
|
+
use crate::telemetry::{
|
|
643
|
+
HistogramBucketOverrides, TELEM_SERVICE_NAME,
|
|
644
|
+
metrics::{MetricKeyValue, NewAttributes, WORKFLOW_E2E_LATENCY_HISTOGRAM_NAME},
|
|
644
645
|
};
|
|
646
|
+
use prometheus::{Encoder, TextEncoder};
|
|
645
647
|
|
|
646
648
|
#[test]
|
|
647
649
|
fn test_prometheus_meter_dynamic_labels() {
|
|
@@ -650,7 +652,7 @@ mod tests {
|
|
|
650
652
|
registry.clone(),
|
|
651
653
|
false,
|
|
652
654
|
false,
|
|
653
|
-
|
|
655
|
+
HistogramBucketOverrides::default(),
|
|
654
656
|
);
|
|
655
657
|
|
|
656
658
|
let counter = meter.counter(MetricParameters {
|
|
@@ -690,7 +692,7 @@ mod tests {
|
|
|
690
692
|
registry.clone(),
|
|
691
693
|
false,
|
|
692
694
|
false,
|
|
693
|
-
|
|
695
|
+
HistogramBucketOverrides::default(),
|
|
694
696
|
);
|
|
695
697
|
|
|
696
698
|
let base_attrs = meter.new_attributes(NewAttributes::new(vec![
|
|
@@ -729,15 +731,11 @@ mod tests {
|
|
|
729
731
|
registry.clone(),
|
|
730
732
|
false,
|
|
731
733
|
false,
|
|
732
|
-
|
|
734
|
+
HistogramBucketOverrides::default(),
|
|
733
735
|
);
|
|
734
736
|
|
|
735
737
|
let histogram_ms = meter_ms.histogram_duration(MetricParameters {
|
|
736
|
-
name: format!(
|
|
737
|
-
"temporal_{}",
|
|
738
|
-
crate::telemetry::WORKFLOW_E2E_LATENCY_HISTOGRAM_NAME
|
|
739
|
-
)
|
|
740
|
-
.into(),
|
|
738
|
+
name: format!("temporal_{}", WORKFLOW_E2E_LATENCY_HISTOGRAM_NAME).into(),
|
|
741
739
|
description: "Test workflow e2e latency".into(),
|
|
742
740
|
unit: "duration".into(),
|
|
743
741
|
});
|
|
@@ -759,15 +757,11 @@ mod tests {
|
|
|
759
757
|
registry_s.clone(),
|
|
760
758
|
true,
|
|
761
759
|
false,
|
|
762
|
-
|
|
760
|
+
HistogramBucketOverrides::default(),
|
|
763
761
|
);
|
|
764
762
|
|
|
765
763
|
let histogram_s = meter_s.histogram_duration(MetricParameters {
|
|
766
|
-
name: format!(
|
|
767
|
-
"temporal_{}",
|
|
768
|
-
crate::telemetry::WORKFLOW_E2E_LATENCY_HISTOGRAM_NAME
|
|
769
|
-
)
|
|
770
|
-
.into(),
|
|
764
|
+
name: format!("temporal_{}", WORKFLOW_E2E_LATENCY_HISTOGRAM_NAME).into(),
|
|
771
765
|
description: "Test workflow e2e latency".into(),
|
|
772
766
|
unit: "duration".into(),
|
|
773
767
|
});
|
|
@@ -791,7 +785,7 @@ mod tests {
|
|
|
791
785
|
registry.clone(),
|
|
792
786
|
false,
|
|
793
787
|
false,
|
|
794
|
-
|
|
788
|
+
HistogramBucketOverrides::default(),
|
|
795
789
|
);
|
|
796
790
|
let counter = meter.counter(MetricParameters {
|
|
797
791
|
name: "no_labels".into(),
|
|
@@ -806,35 +800,40 @@ mod tests {
|
|
|
806
800
|
}
|
|
807
801
|
|
|
808
802
|
#[test]
|
|
809
|
-
fn
|
|
810
|
-
let registry = Registry::new(HashMap::
|
|
803
|
+
fn test_overlapping_fields() {
|
|
804
|
+
let registry = Registry::new(HashMap::from([(
|
|
805
|
+
"service_name".to_string(),
|
|
806
|
+
TELEM_SERVICE_NAME.to_string(),
|
|
807
|
+
)]));
|
|
811
808
|
let meter = CorePrometheusMeter::new(
|
|
812
809
|
registry.clone(),
|
|
813
810
|
false,
|
|
814
811
|
false,
|
|
815
|
-
|
|
816
|
-
);
|
|
817
|
-
let telem_instance = TelemetryInstance::new(
|
|
818
|
-
None,
|
|
819
|
-
None,
|
|
820
|
-
METRIC_PREFIX.to_string(),
|
|
821
|
-
Some(Arc::new(meter)),
|
|
822
|
-
true,
|
|
823
|
-
temporalio_common::telemetry::TaskQueueLabelStrategy::UseNormal,
|
|
812
|
+
HistogramBucketOverrides::default(),
|
|
824
813
|
);
|
|
825
|
-
let mc = MetricsContext::top_level("foo".to_string(), "q".to_string(), &telem_instance);
|
|
826
|
-
mc.worker_registered();
|
|
827
|
-
drop(mc);
|
|
828
814
|
|
|
829
|
-
let
|
|
830
|
-
|
|
815
|
+
let counter = meter.counter(MetricParameters {
|
|
816
|
+
name: "temporal_worker_start".into(),
|
|
817
|
+
description: "".into(),
|
|
818
|
+
unit: "".into(),
|
|
819
|
+
});
|
|
820
|
+
|
|
821
|
+
let attrs1 = meter.new_attributes(NewAttributes::new(vec![
|
|
822
|
+
MetricKeyValue::new("namespace", "foo"),
|
|
823
|
+
MetricKeyValue::new("task_queue", "q"),
|
|
824
|
+
]));
|
|
825
|
+
counter.add(2, &attrs1);
|
|
831
826
|
|
|
832
|
-
let
|
|
833
|
-
|
|
827
|
+
let attrs2 = meter.new_attributes(NewAttributes::new(vec![
|
|
828
|
+
MetricKeyValue::new("namespace", "foo"),
|
|
829
|
+
MetricKeyValue::new("task_queue", "q2"),
|
|
830
|
+
]));
|
|
831
|
+
counter.add(1, &attrs2);
|
|
834
832
|
|
|
835
833
|
let output = output_string(®istry);
|
|
836
|
-
|
|
837
|
-
assert!(output.contains("temporal_worker_start{namespace=\"foo\",service_name=\"temporal-core-sdk\"
|
|
834
|
+
|
|
835
|
+
assert!(output.contains("temporal_worker_start{namespace=\"foo\",task_queue=\"q\",service_name=\"temporal-core-sdk\"} 2"));
|
|
836
|
+
assert!(output.contains("temporal_worker_start{namespace=\"foo\",task_queue=\"q2\",service_name=\"temporal-core-sdk\"} 1"));
|
|
838
837
|
}
|
|
839
838
|
|
|
840
839
|
#[test]
|
|
@@ -844,7 +843,7 @@ mod tests {
|
|
|
844
843
|
registry.clone(),
|
|
845
844
|
false,
|
|
846
845
|
false,
|
|
847
|
-
|
|
846
|
+
HistogramBucketOverrides::default(),
|
|
848
847
|
);
|
|
849
848
|
let dashes = meter.counter(MetricParameters {
|
|
850
849
|
name: "dash-in-name".into(),
|
|
@@ -865,7 +864,7 @@ mod tests {
|
|
|
865
864
|
registry.clone(),
|
|
866
865
|
false,
|
|
867
866
|
false,
|
|
868
|
-
|
|
867
|
+
HistogramBucketOverrides::default(),
|
|
869
868
|
);
|
|
870
869
|
let dashes = meter.counter(MetricParameters {
|
|
871
870
|
name: "not@permitted:symbols".into(),
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
use crate::telemetry::prometheus_meter::Registry;
|
|
1
|
+
use crate::telemetry::{PrometheusExporterOptions, prometheus_meter::Registry};
|
|
2
2
|
use http_body_util::Full;
|
|
3
3
|
use hyper::{Method, Request, Response, body::Bytes, header::CONTENT_TYPE, service::service_fn};
|
|
4
4
|
use hyper_util::{
|
|
@@ -10,7 +10,6 @@ use std::{
|
|
|
10
10
|
net::{SocketAddr, TcpListener},
|
|
11
11
|
sync::Arc,
|
|
12
12
|
};
|
|
13
|
-
use temporalio_common::telemetry::PrometheusExporterOptions;
|
|
14
13
|
use tokio::{io, task::AbortHandle};
|
|
15
14
|
|
|
16
15
|
pub struct StartedPromServer {
|
|
@@ -20,7 +19,7 @@ pub struct StartedPromServer {
|
|
|
20
19
|
}
|
|
21
20
|
|
|
22
21
|
/// Builds and runs a prometheus endpoint which can be scraped by prom instances for metrics export.
|
|
23
|
-
/// Returns the meter that can be used as a [`CoreMeter`](
|
|
22
|
+
/// Returns the meter that can be used as a [`CoreMeter`](crate::telemetry::metrics::CoreMeter).
|
|
24
23
|
///
|
|
25
24
|
/// Requires a Tokio runtime to exist, and will block briefly while binding the server endpoint.
|
|
26
25
|
pub fn start_prometheus_metric_exporter(
|
|
@@ -1,20 +1,51 @@
|
|
|
1
1
|
//! Contains tracing/logging and metrics related functionality
|
|
2
2
|
|
|
3
|
+
/// Metric instrument types and the [`CoreMeter`] trait.
|
|
3
4
|
pub mod metrics;
|
|
4
5
|
|
|
5
|
-
|
|
6
|
+
#[cfg(feature = "core-based-sdk")]
|
|
7
|
+
mod log_export;
|
|
8
|
+
#[cfg(feature = "otel")]
|
|
9
|
+
mod otel;
|
|
10
|
+
#[cfg(feature = "prometheus")]
|
|
11
|
+
mod prometheus_meter;
|
|
12
|
+
#[cfg(feature = "prometheus")]
|
|
13
|
+
mod prometheus_server;
|
|
14
|
+
|
|
15
|
+
use crate::telemetry::metrics::{
|
|
16
|
+
CoreMeter, MetricKeyValue, NewAttributes, PrefixedMetricsMeter, TemporalMeter,
|
|
17
|
+
};
|
|
6
18
|
use std::{
|
|
19
|
+
cell::RefCell,
|
|
7
20
|
collections::HashMap,
|
|
21
|
+
env,
|
|
8
22
|
fmt::{Debug, Formatter},
|
|
9
23
|
net::SocketAddr,
|
|
10
|
-
sync::
|
|
24
|
+
sync::{
|
|
25
|
+
Arc,
|
|
26
|
+
atomic::{AtomicBool, Ordering},
|
|
27
|
+
},
|
|
11
28
|
time::{Duration, SystemTime, UNIX_EPOCH},
|
|
12
29
|
};
|
|
13
|
-
use
|
|
30
|
+
use tracing::{Level, Subscriber};
|
|
31
|
+
use tracing_subscriber::{EnvFilter, Layer, layer::SubscriberExt};
|
|
14
32
|
use url::Url;
|
|
15
33
|
|
|
34
|
+
#[cfg(feature = "core-based-sdk")]
|
|
35
|
+
use crate::telemetry::log_export::CoreLogConsumerLayer;
|
|
36
|
+
|
|
37
|
+
#[cfg(feature = "core-based-sdk")]
|
|
38
|
+
pub use log_export::{CoreLogBuffer, CoreLogBufferedConsumer, CoreLogStreamConsumer};
|
|
39
|
+
#[cfg(feature = "otel")]
|
|
40
|
+
pub use otel::build_otlp_metric_exporter;
|
|
41
|
+
#[cfg(feature = "prometheus")]
|
|
42
|
+
pub use prometheus_server::start_prometheus_metric_exporter;
|
|
43
|
+
|
|
44
|
+
/// The default prefix applied to all Temporal metric names.
|
|
16
45
|
pub static METRIC_PREFIX: &str = "temporal_";
|
|
17
46
|
|
|
47
|
+
const TELEM_SERVICE_NAME: &str = "temporal-core-sdk";
|
|
48
|
+
|
|
18
49
|
/// Each core runtime instance has a telemetry subsystem associated with it, this trait defines the
|
|
19
50
|
/// operations that lang might want to perform on that telemetry after it's initialized.
|
|
20
51
|
pub trait CoreTelemetry {
|
|
@@ -126,8 +157,9 @@ pub struct OtelCollectorOptions {
|
|
|
126
157
|
/// Options for exporting metrics to Prometheus
|
|
127
158
|
#[derive(Debug, Clone, bon::Builder)]
|
|
128
159
|
pub struct PrometheusExporterOptions {
|
|
160
|
+
/// The address the Prometheus exporter HTTP server will bind to.
|
|
129
161
|
pub socket_addr: SocketAddr,
|
|
130
|
-
|
|
162
|
+
/// A map of tags to be applied to all metrics
|
|
131
163
|
#[builder(default)]
|
|
132
164
|
pub global_tags: HashMap<String, String>,
|
|
133
165
|
/// If set true, all counters will include a "_total" suffix
|
|
@@ -168,11 +200,13 @@ pub enum Logger {
|
|
|
168
200
|
/// An [EnvFilter](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/struct.EnvFilter.html) filter string.
|
|
169
201
|
filter: String,
|
|
170
202
|
},
|
|
203
|
+
#[cfg(feature = "core-based-sdk")]
|
|
171
204
|
/// Forward logs to Lang - collectable with `fetch_global_buffered_logs`.
|
|
172
205
|
Forward {
|
|
173
206
|
/// An [EnvFilter](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/struct.EnvFilter.html) filter string.
|
|
174
207
|
filter: String,
|
|
175
208
|
},
|
|
209
|
+
#[cfg(feature = "core-based-sdk")]
|
|
176
210
|
/// Push logs to Lang. Can be used with
|
|
177
211
|
/// temporalio_sdk_core::telemetry::log_export::CoreLogBufferedConsumer to buffer.
|
|
178
212
|
Push {
|
|
@@ -242,3 +276,229 @@ pub trait CoreLogConsumer: Send + Sync + Debug {
|
|
|
242
276
|
/// Invoked synchronously for every single log.
|
|
243
277
|
fn on_log(&self, log: CoreLog);
|
|
244
278
|
}
|
|
279
|
+
|
|
280
|
+
#[cfg(feature = "core-based-sdk")]
|
|
281
|
+
const FORWARD_LOG_BUFFER_SIZE: usize = 2048;
|
|
282
|
+
|
|
283
|
+
/// Help you construct an [EnvFilter] compatible filter string which will forward all core module
|
|
284
|
+
/// traces at `core_level` and all others (from 3rd party modules, etc) at `other_level`.
|
|
285
|
+
pub fn construct_filter_string(core_level: Level, other_level: Level) -> String {
|
|
286
|
+
format!(
|
|
287
|
+
"{other_level},temporalio_common={core_level},temporalio_sdk_core={core_level},temporalio_client={core_level},temporalio_sdk={core_level}"
|
|
288
|
+
)
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/// Holds initialized tracing/metrics exporters, etc
|
|
292
|
+
pub struct TelemetryInstance {
|
|
293
|
+
metric_prefix: String,
|
|
294
|
+
#[cfg(feature = "core-based-sdk")]
|
|
295
|
+
logs_out: Option<parking_lot::Mutex<CoreLogBuffer>>,
|
|
296
|
+
metrics: Option<Arc<dyn CoreMeter + 'static>>,
|
|
297
|
+
/// The tracing subscriber which is associated with this telemetry instance. May be `None` if
|
|
298
|
+
/// the user has not opted into any tracing configuration.
|
|
299
|
+
trace_subscriber: Option<Arc<dyn Subscriber + Send + Sync>>,
|
|
300
|
+
attach_service_name: bool,
|
|
301
|
+
task_queue_label_strategy: TaskQueueLabelStrategy,
|
|
302
|
+
}
|
|
303
|
+
|
|
304
|
+
impl TelemetryInstance {
|
|
305
|
+
/// Return the trace subscriber associated with the telemetry options/instance. Can be used
|
|
306
|
+
/// to manually set the default for a thread or globally using the `tracing` crate, or with
|
|
307
|
+
/// [set_trace_subscriber_for_current_thread].
|
|
308
|
+
pub fn trace_subscriber(&self) -> Option<Arc<dyn Subscriber + Send + Sync>> {
|
|
309
|
+
self.trace_subscriber.clone()
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/// Some metric meters cannot be initialized until after a tokio runtime has started and after
|
|
313
|
+
/// other telemetry has initted (ex: prometheus). They can be attached here.
|
|
314
|
+
pub fn attach_late_init_metrics(&mut self, meter: Arc<dyn CoreMeter + 'static>) {
|
|
315
|
+
self.metrics = Some(meter);
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
/// Returns our wrapper for metric meters, including the `metric_prefix` from
|
|
319
|
+
/// [TelemetryOptions]. This should be used to initialize clients or for any other
|
|
320
|
+
/// temporal-owned metrics. User defined metrics should use [Self::get_metric_meter].
|
|
321
|
+
pub fn get_temporal_metric_meter(&self) -> Option<TemporalMeter> {
|
|
322
|
+
self.metrics.clone().map(|m| {
|
|
323
|
+
let kvs = self.default_kvs();
|
|
324
|
+
let attribs = NewAttributes::new(kvs);
|
|
325
|
+
TemporalMeter::new(
|
|
326
|
+
Arc::new(PrefixedMetricsMeter::new(self.metric_prefix.clone(), m))
|
|
327
|
+
as Arc<dyn CoreMeter>,
|
|
328
|
+
attribs,
|
|
329
|
+
self.task_queue_label_strategy,
|
|
330
|
+
)
|
|
331
|
+
})
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/// Returns our wrapper for metric meters, including attaching the service name if enabled.
|
|
335
|
+
pub fn get_metric_meter(&self) -> Option<TemporalMeter> {
|
|
336
|
+
self.metrics.clone().map(|m| {
|
|
337
|
+
let kvs = self.default_kvs();
|
|
338
|
+
let attribs = NewAttributes::new(kvs);
|
|
339
|
+
TemporalMeter::new(m, attribs, self.task_queue_label_strategy)
|
|
340
|
+
})
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
fn default_kvs(&self) -> Vec<MetricKeyValue> {
|
|
344
|
+
if self.attach_service_name {
|
|
345
|
+
vec![MetricKeyValue::new("service_name", TELEM_SERVICE_NAME)]
|
|
346
|
+
} else {
|
|
347
|
+
vec![]
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
thread_local! {
|
|
353
|
+
static SUB_GUARD: RefCell<Option<tracing::subscriber::DefaultGuard>> =
|
|
354
|
+
const { RefCell::new(None) };
|
|
355
|
+
}
|
|
356
|
+
/// Set the trace subscriber for the current thread. This must be done in every thread which uses
|
|
357
|
+
/// core stuff, otherwise traces/logs will not be collected on that thread. For example, if using
|
|
358
|
+
/// a multithreaded Tokio runtime, you should ensure that said runtime uses
|
|
359
|
+
/// [on_thread_start](https://docs.rs/tokio/latest/tokio/runtime/struct.Builder.html#method.on_thread_start)
|
|
360
|
+
/// or a similar mechanism to call this for each thread within the runtime.
|
|
361
|
+
pub fn set_trace_subscriber_for_current_thread(sub: impl Subscriber + Send + Sync + 'static) {
|
|
362
|
+
SUB_GUARD.with(|sg| {
|
|
363
|
+
if sg.borrow().is_none() {
|
|
364
|
+
let g = tracing::subscriber::set_default(sub);
|
|
365
|
+
*sg.borrow_mut() = Some(g);
|
|
366
|
+
}
|
|
367
|
+
})
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
/// Undoes [set_trace_subscriber_for_current_thread]
|
|
371
|
+
pub fn remove_trace_subscriber_for_current_thread() {
|
|
372
|
+
SUB_GUARD.take();
|
|
373
|
+
}
|
|
374
|
+
|
|
375
|
+
#[cfg(feature = "core-based-sdk")]
|
|
376
|
+
impl CoreTelemetry for TelemetryInstance {
|
|
377
|
+
fn fetch_buffered_logs(&self) -> Vec<CoreLog> {
|
|
378
|
+
if let Some(logs_out) = self.logs_out.as_ref() {
|
|
379
|
+
logs_out.lock().drain()
|
|
380
|
+
} else {
|
|
381
|
+
vec![]
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/// Initialize tracing subscribers/output and logging export, returning a [TelemetryInstance]
|
|
387
|
+
/// which can be used to register default / global tracing subscribers.
|
|
388
|
+
///
|
|
389
|
+
/// You should only call this once per unique [TelemetryOptions]
|
|
390
|
+
///
|
|
391
|
+
/// See [TelemetryOptions] docs for more on configuration.
|
|
392
|
+
pub fn telemetry_init(opts: TelemetryOptions) -> Result<TelemetryInstance, anyhow::Error> {
|
|
393
|
+
#[cfg(feature = "core-based-sdk")]
|
|
394
|
+
let mut logs_out = None;
|
|
395
|
+
|
|
396
|
+
// Tracing subscriber layers =========
|
|
397
|
+
let mut console_pretty_layer = None;
|
|
398
|
+
let mut console_compact_layer = None;
|
|
399
|
+
#[cfg(feature = "core-based-sdk")]
|
|
400
|
+
let mut forward_layer = None;
|
|
401
|
+
// ===================================
|
|
402
|
+
|
|
403
|
+
let tracing_sub = if let Some(ts) = opts.subscriber_override {
|
|
404
|
+
Some(ts)
|
|
405
|
+
} else {
|
|
406
|
+
opts.logging.map(|logger| {
|
|
407
|
+
match logger {
|
|
408
|
+
Logger::Console { filter } => {
|
|
409
|
+
// This is silly dupe but can't be avoided without boxing.
|
|
410
|
+
if env::var("TEMPORAL_CORE_PRETTY_LOGS").is_ok() {
|
|
411
|
+
console_pretty_layer = Some(
|
|
412
|
+
tracing_subscriber::fmt::layer()
|
|
413
|
+
.with_target(false)
|
|
414
|
+
.event_format(
|
|
415
|
+
tracing_subscriber::fmt::format()
|
|
416
|
+
.pretty()
|
|
417
|
+
.with_source_location(false),
|
|
418
|
+
)
|
|
419
|
+
.with_filter(EnvFilter::new(filter)),
|
|
420
|
+
)
|
|
421
|
+
} else {
|
|
422
|
+
console_compact_layer = Some(
|
|
423
|
+
tracing_subscriber::fmt::layer()
|
|
424
|
+
.with_target(false)
|
|
425
|
+
.event_format(
|
|
426
|
+
tracing_subscriber::fmt::format()
|
|
427
|
+
.compact()
|
|
428
|
+
.with_source_location(false),
|
|
429
|
+
)
|
|
430
|
+
.with_filter(EnvFilter::new(filter)),
|
|
431
|
+
)
|
|
432
|
+
}
|
|
433
|
+
}
|
|
434
|
+
#[cfg(feature = "core-based-sdk")]
|
|
435
|
+
Logger::Forward { filter } => {
|
|
436
|
+
let (export_layer, lo) =
|
|
437
|
+
CoreLogConsumerLayer::new_buffered(FORWARD_LOG_BUFFER_SIZE);
|
|
438
|
+
logs_out = Some(parking_lot::Mutex::new(lo));
|
|
439
|
+
forward_layer = Some(export_layer.with_filter(EnvFilter::new(filter)));
|
|
440
|
+
}
|
|
441
|
+
#[cfg(feature = "core-based-sdk")]
|
|
442
|
+
Logger::Push { filter, consumer } => {
|
|
443
|
+
forward_layer = Some(
|
|
444
|
+
CoreLogConsumerLayer::new(consumer).with_filter(EnvFilter::new(filter)),
|
|
445
|
+
);
|
|
446
|
+
}
|
|
447
|
+
};
|
|
448
|
+
let reg = tracing_subscriber::registry()
|
|
449
|
+
.with(console_pretty_layer)
|
|
450
|
+
.with(console_compact_layer);
|
|
451
|
+
#[cfg(feature = "core-based-sdk")]
|
|
452
|
+
let reg = reg.with(forward_layer);
|
|
453
|
+
|
|
454
|
+
Arc::new(reg) as Arc<dyn Subscriber + Send + Sync>
|
|
455
|
+
})
|
|
456
|
+
};
|
|
457
|
+
|
|
458
|
+
Ok(TelemetryInstance {
|
|
459
|
+
metric_prefix: opts.metric_prefix,
|
|
460
|
+
#[cfg(feature = "core-based-sdk")]
|
|
461
|
+
logs_out,
|
|
462
|
+
metrics: opts.metrics,
|
|
463
|
+
trace_subscriber: tracing_sub,
|
|
464
|
+
attach_service_name: opts.attach_service_name,
|
|
465
|
+
task_queue_label_strategy: opts.task_queue_label_strategy,
|
|
466
|
+
})
|
|
467
|
+
}
|
|
468
|
+
|
|
469
|
+
/// WARNING: Calling can cause panics because of <https://github.com/tokio-rs/tracing/issues/1656>
|
|
470
|
+
/// Lang must not start using until resolved
|
|
471
|
+
///
|
|
472
|
+
/// Initialize telemetry/tracing globally. Useful for testing. Only takes affect when called
|
|
473
|
+
/// the first time. Subsequent calls are ignored.
|
|
474
|
+
pub fn telemetry_init_global(opts: TelemetryOptions) -> Result<(), anyhow::Error> {
|
|
475
|
+
static INITTED: AtomicBool = AtomicBool::new(false);
|
|
476
|
+
if INITTED
|
|
477
|
+
.compare_exchange(false, true, Ordering::Acquire, Ordering::Relaxed)
|
|
478
|
+
.is_ok()
|
|
479
|
+
{
|
|
480
|
+
let ti = telemetry_init(opts)?;
|
|
481
|
+
if let Some(ts) = ti.trace_subscriber() {
|
|
482
|
+
tracing::subscriber::set_global_default(ts)?;
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
Ok(())
|
|
486
|
+
}
|
|
487
|
+
|
|
488
|
+
/// WARNING: Calling can cause panics because of <https://github.com/tokio-rs/tracing/issues/1656>
|
|
489
|
+
/// Lang must not start using until resolved
|
|
490
|
+
///
|
|
491
|
+
/// Initialize the fallback global handler. All lang SDKs should call this somewhere, once, at
|
|
492
|
+
/// startup, as it initializes a fallback handler for any dependencies (looking at you, otel) that
|
|
493
|
+
/// don't provide good ways to customize their tracing usage. It sets a WARN-level global filter
|
|
494
|
+
/// that uses the default console logger.
|
|
495
|
+
pub fn telemetry_init_fallback() -> Result<(), anyhow::Error> {
|
|
496
|
+
telemetry_init_global(
|
|
497
|
+
TelemetryOptions::builder()
|
|
498
|
+
.logging(Logger::Console {
|
|
499
|
+
filter: construct_filter_string(Level::DEBUG, Level::WARN),
|
|
500
|
+
})
|
|
501
|
+
.build(),
|
|
502
|
+
)?;
|
|
503
|
+
Ok(())
|
|
504
|
+
}
|