@temporalio/core-bridge 1.14.2-canary-release-testing.0 → 1.16.0
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 +794 -650
- package/bridge-macros/src/derive_tryintojs.rs +40 -0
- package/lib/native.d.ts +24 -3
- package/package.json +4 -4
- 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 +42 -31
- package/sdk-core/Cargo.toml +4 -1
- package/sdk-core/README.md +19 -13
- 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} +370 -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} +104 -29
- package/sdk-core/crates/client/src/workflow_handle.rs +826 -0
- package/sdk-core/crates/common/Cargo.toml +62 -3
- 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/.github/workflows/create-release.yml +0 -5
- package/sdk-core/crates/common/protos/api_upstream/Makefile +2 -1
- package/sdk-core/crates/common/protos/api_upstream/README.md +8 -0
- 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 +3329 -2647
- package/sdk-core/crates/common/protos/api_upstream/openapi/openapiv3.yaml +2734 -708
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/activity/v1/message.proto +155 -3
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/command/v1/message.proto +26 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/common/v1/message.proto +8 -1
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/deployment/v1/message.proto +27 -1
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/activity.proto +81 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/event_type.proto +4 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/failed_cause.proto +4 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/task_queue.proto +15 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/enums/v1/workflow.proto +63 -15
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/errordetails/v1/message.proto +8 -0
- 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 +111 -17
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/namespace/v1/message.proto +21 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/nexus/v1/message.proto +20 -1
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/operatorservice/v1/request_response.proto +4 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/schedule/v1/message.proto +2 -2
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/taskqueue/v1/message.proto +2 -0
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/worker/v1/message.proto +4 -7
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflow/v1/message.proto +80 -22
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/request_response.proto +347 -23
- package/sdk-core/crates/common/protos/api_upstream/temporal/api/workflowservice/v1/service.proto +242 -43
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/core_interface.proto +15 -0
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/nexus/nexus.proto +9 -2
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_activation/workflow_activation.proto +8 -0
- package/sdk-core/crates/common/protos/local/temporal/sdk/core/workflow_commands/workflow_commands.proto +22 -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 +19 -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 +134 -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 +11 -16
- package/sdk-core/crates/common/src/telemetry/metrics/core.rs +125 -0
- package/sdk-core/crates/common/src/telemetry/metrics.rs +272 -225
- 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 +278 -19
- package/sdk-core/crates/common/src/worker.rs +68 -636
- 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 +759 -442
- package/sdk-core/crates/sdk/src/workflow_context/options.rs +64 -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 +59 -65
- package/sdk-core/crates/sdk-core/benches/workflow_replay_bench.rs +45 -54
- 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 +22 -21
- 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 +647 -27
- package/sdk-core/crates/sdk-core/src/core_tests/workflow_tasks.rs +46 -41
- package/sdk-core/crates/sdk-core/src/ephemeral_server/mod.rs +13 -16
- package/sdk-core/crates/sdk-core/src/histfetch.rs +20 -10
- package/sdk-core/crates/sdk-core/src/lib.rs +60 -123
- package/sdk-core/crates/sdk-core/src/pollers/mod.rs +4 -9
- package/sdk-core/crates/sdk-core/src/pollers/poll_buffer.rs +411 -32
- 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 +183 -198
- package/sdk-core/crates/sdk-core/src/telemetry/mod.rs +3 -281
- package/sdk-core/crates/sdk-core/src/test_help/integ_helpers.rs +35 -16
- package/sdk-core/crates/sdk-core/src/test_help/unit_helpers.rs +3 -6
- package/sdk-core/crates/sdk-core/src/worker/activities/activity_heartbeat_manager.rs +1 -0
- 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 +11 -5
- package/sdk-core/crates/sdk-core/src/worker/client.rs +104 -86
- package/sdk-core/crates/sdk-core/src/worker/heartbeat.rs +10 -14
- package/sdk-core/crates/sdk-core/src/worker/mod.rs +1175 -241
- package/sdk-core/crates/sdk-core/src/worker/nexus.rs +150 -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 +25 -27
- package/sdk-core/crates/sdk-core/src/worker/tuner.rs +64 -44
- package/sdk-core/crates/sdk-core/src/worker/workflow/driven_workflow.rs +9 -3
- package/sdk-core/crates/sdk-core/src/worker/workflow/machines/patch_state_machine.rs +5 -8
- 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 +28 -4
- package/sdk-core/crates/sdk-core/src/worker/workflow/managed_run.rs +20 -41
- package/sdk-core/crates/sdk-core/src/worker/workflow/mod.rs +50 -9
- 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 +281 -236
- package/sdk-core/crates/sdk-core/tests/common/workflows.rs +41 -28
- package/sdk-core/crates/sdk-core/tests/global_metric_tests.rs +9 -14
- package/sdk-core/crates/sdk-core/tests/heavy_tests/fuzzy_workflow.rs +73 -66
- package/sdk-core/crates/sdk-core/tests/heavy_tests.rs +306 -268
- 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 +37 -38
- package/sdk-core/crates/sdk-core/tests/integ_tests/heartbeat_tests.rs +49 -40
- package/sdk-core/crates/sdk-core/tests/integ_tests/metrics_tests.rs +447 -300
- 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 +157 -157
- 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 -463
- 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 +389 -265
- package/sdk-core/crates/sdk-core/tests/integ_tests/worker_tests.rs +250 -185
- package/sdk-core/crates/sdk-core/tests/integ_tests/worker_versioning_tests.rs +52 -49
- 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 +437 -327
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_external.rs +82 -58
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/cancel_wf.rs +56 -30
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/child_workflows.rs +364 -251
- 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 +110 -46
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/determinism.rs +243 -149
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/eager.rs +98 -32
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/local_activities.rs +1475 -1040
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/modify_wf_properties.rs +73 -43
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/nexus.rs +402 -245
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/patches.rs +343 -207
- 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 +155 -140
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/signals.rs +183 -113
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/stickyness.rs +85 -44
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/timers.rs +142 -48
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests/upsert_search_attrs.rs +73 -56
- package/sdk-core/crates/sdk-core/tests/integ_tests/workflow_tests.rs +365 -242
- package/sdk-core/crates/sdk-core/tests/main.rs +22 -16
- package/sdk-core/crates/sdk-core/tests/manual_tests.rs +233 -187
- package/sdk-core/crates/sdk-core/tests/runner.rs +4 -6
- package/sdk-core/crates/sdk-core/tests/shared_tests/mod.rs +73 -27
- 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 +8 -1
- package/sdk-core/crates/sdk-core-c-bridge/include/temporal-sdk-core-c-bridge.h +37 -26
- package/sdk-core/crates/sdk-core-c-bridge/src/client.rs +180 -87
- package/sdk-core/crates/sdk-core-c-bridge/src/lib.rs +89 -5
- package/sdk-core/crates/sdk-core-c-bridge/src/metric.rs +10 -16
- package/sdk-core/crates/sdk-core-c-bridge/src/runtime.rs +59 -67
- package/sdk-core/crates/sdk-core-c-bridge/src/testing.rs +10 -10
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/context.rs +57 -22
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/mod.rs +108 -12
- package/sdk-core/crates/sdk-core-c-bridge/src/tests/utils.rs +9 -52
- package/sdk-core/crates/sdk-core-c-bridge/src/worker.rs +74 -91
- package/sdk-core/rustfmt.toml +2 -1
- package/src/client.rs +206 -289
- package/src/helpers/try_into_js.rs +88 -2
- package/src/metrics.rs +277 -35
- package/src/runtime.rs +94 -45
- package/src/testing.rs +9 -16
- package/src/worker.rs +86 -68
- package/ts/native.ts +39 -3
- 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/macros/LICENSE.txt +0 -21
- 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 {
|
|
@@ -28,31 +59,30 @@ pub trait CoreTelemetry {
|
|
|
28
59
|
fn fetch_buffered_logs(&self) -> Vec<CoreLog>;
|
|
29
60
|
}
|
|
30
61
|
|
|
31
|
-
/// Telemetry configuration options. Construct with [
|
|
32
|
-
#[derive(Clone,
|
|
62
|
+
/// Telemetry configuration options. Construct with [TelemetryOptions::builder]
|
|
63
|
+
#[derive(Clone, bon::Builder)]
|
|
33
64
|
#[non_exhaustive]
|
|
34
65
|
pub struct TelemetryOptions {
|
|
35
66
|
/// Optional logger - set as None to disable.
|
|
36
|
-
#[builder(
|
|
67
|
+
#[builder(into)]
|
|
37
68
|
pub logging: Option<Logger>,
|
|
38
69
|
/// Optional metrics exporter - set as None to disable.
|
|
39
|
-
#[builder(
|
|
70
|
+
#[builder(into)]
|
|
40
71
|
pub metrics: Option<Arc<dyn CoreMeter>>,
|
|
41
72
|
/// If set true (the default) explicitly attach a `service_name` label to all metrics. Turn this
|
|
42
73
|
/// off if your collection system supports the `target_info` metric from the OpenMetrics spec.
|
|
43
74
|
/// For more, see
|
|
44
75
|
/// [here](https://github.com/OpenObservability/OpenMetrics/blob/main/specification/OpenMetrics.md#supporting-target-metadata-in-both-push-based-and-pull-based-systems)
|
|
45
|
-
#[builder(default =
|
|
76
|
+
#[builder(default = true)]
|
|
46
77
|
pub attach_service_name: bool,
|
|
47
78
|
/// A prefix to be applied to all core-created metrics. Defaults to "temporal_".
|
|
48
|
-
#[builder(default =
|
|
79
|
+
#[builder(default = METRIC_PREFIX.to_string())]
|
|
49
80
|
pub metric_prefix: String,
|
|
50
81
|
/// If provided, logging config will be ignored and this explicit subscriber will be used for
|
|
51
82
|
/// all logging and traces.
|
|
52
|
-
#[builder(setter(strip_option), default)]
|
|
53
83
|
pub subscriber_override: Option<Arc<dyn Subscriber + Send + Sync>>,
|
|
54
84
|
/// See [TaskQueueLabelStrategy].
|
|
55
|
-
#[builder(default =
|
|
85
|
+
#[builder(default = TaskQueueLabelStrategy::UseNormal)]
|
|
56
86
|
pub task_queue_label_strategy: TaskQueueLabelStrategy,
|
|
57
87
|
}
|
|
58
88
|
impl Debug for TelemetryOptions {
|
|
@@ -96,19 +126,19 @@ pub enum TaskQueueLabelStrategy {
|
|
|
96
126
|
}
|
|
97
127
|
|
|
98
128
|
/// Options for exporting to an OpenTelemetry Collector
|
|
99
|
-
#[derive(Debug, Clone,
|
|
129
|
+
#[derive(Debug, Clone, bon::Builder)]
|
|
100
130
|
pub struct OtelCollectorOptions {
|
|
101
131
|
/// The url of the OTel collector to export telemetry and metrics to. Lang SDK should also
|
|
102
132
|
/// export to this same collector.
|
|
103
133
|
pub url: Url,
|
|
104
134
|
/// Optional set of HTTP headers to send to the Collector, e.g for authentication.
|
|
105
|
-
#[builder(default =
|
|
135
|
+
#[builder(default = HashMap::new())]
|
|
106
136
|
pub headers: HashMap<String, String>,
|
|
107
137
|
/// Optionally specify how frequently metrics should be exported. Defaults to 1 second.
|
|
108
|
-
#[builder(default =
|
|
138
|
+
#[builder(default = Duration::from_secs(1))]
|
|
109
139
|
pub metric_periodicity: Duration,
|
|
110
140
|
/// Specifies the aggregation temporality for metric export. Defaults to cumulative.
|
|
111
|
-
#[builder(default =
|
|
141
|
+
#[builder(default = MetricTemporality::Cumulative)]
|
|
112
142
|
pub metric_temporality: MetricTemporality,
|
|
113
143
|
/// A map of tags to be applied to all metrics
|
|
114
144
|
#[builder(default)]
|
|
@@ -120,15 +150,16 @@ pub struct OtelCollectorOptions {
|
|
|
120
150
|
#[builder(default)]
|
|
121
151
|
pub histogram_bucket_overrides: HistogramBucketOverrides,
|
|
122
152
|
/// Protocol to use for communication with the collector
|
|
123
|
-
#[builder(default =
|
|
153
|
+
#[builder(default = OtlpProtocol::Grpc)]
|
|
124
154
|
pub protocol: OtlpProtocol,
|
|
125
155
|
}
|
|
126
156
|
|
|
127
157
|
/// Options for exporting metrics to Prometheus
|
|
128
|
-
#[derive(Debug, Clone,
|
|
158
|
+
#[derive(Debug, Clone, bon::Builder)]
|
|
129
159
|
pub struct PrometheusExporterOptions {
|
|
160
|
+
/// The address the Prometheus exporter HTTP server will bind to.
|
|
130
161
|
pub socket_addr: SocketAddr,
|
|
131
|
-
|
|
162
|
+
/// A map of tags to be applied to all metrics
|
|
132
163
|
#[builder(default)]
|
|
133
164
|
pub global_tags: HashMap<String, String>,
|
|
134
165
|
/// If set true, all counters will include a "_total" suffix
|
|
@@ -169,11 +200,13 @@ pub enum Logger {
|
|
|
169
200
|
/// An [EnvFilter](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/struct.EnvFilter.html) filter string.
|
|
170
201
|
filter: String,
|
|
171
202
|
},
|
|
203
|
+
#[cfg(feature = "core-based-sdk")]
|
|
172
204
|
/// Forward logs to Lang - collectable with `fetch_global_buffered_logs`.
|
|
173
205
|
Forward {
|
|
174
206
|
/// An [EnvFilter](https://docs.rs/tracing-subscriber/latest/tracing_subscriber/struct.EnvFilter.html) filter string.
|
|
175
207
|
filter: String,
|
|
176
208
|
},
|
|
209
|
+
#[cfg(feature = "core-based-sdk")]
|
|
177
210
|
/// Push logs to Lang. Can be used with
|
|
178
211
|
/// temporalio_sdk_core::telemetry::log_export::CoreLogBufferedConsumer to buffer.
|
|
179
212
|
Push {
|
|
@@ -205,7 +238,7 @@ pub enum OtlpProtocol {
|
|
|
205
238
|
|
|
206
239
|
impl Default for TelemetryOptions {
|
|
207
240
|
fn default() -> Self {
|
|
208
|
-
|
|
241
|
+
TelemetryOptions::builder().build()
|
|
209
242
|
}
|
|
210
243
|
}
|
|
211
244
|
|
|
@@ -243,3 +276,229 @@ pub trait CoreLogConsumer: Send + Sync + Debug {
|
|
|
243
276
|
/// Invoked synchronously for every single log.
|
|
244
277
|
fn on_log(&self, log: CoreLog);
|
|
245
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
|
+
}
|