cw-datadog 2.23.0.2 → 2.23.0.3
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.
- checksums.yaml +4 -4
- data/ext/datadog_profiling_native_extension/extconf.rb +4 -2
- data/ext/libdatadog_api/library_config.c +12 -11
- data/ext/libdatadog_extconf_helpers.rb +1 -1
- data/lib/datadog/appsec/api_security/route_extractor.rb +20 -5
- data/lib/datadog/appsec/api_security/sampler.rb +3 -1
- data/lib/datadog/appsec/assets/blocked.html +8 -0
- data/lib/datadog/appsec/assets/blocked.json +1 -1
- data/lib/datadog/appsec/assets/blocked.text +3 -1
- data/lib/datadog/appsec/assets.rb +1 -1
- data/lib/datadog/appsec/remote.rb +4 -0
- data/lib/datadog/appsec/response.rb +18 -4
- data/lib/datadog/core/cloudwise/client.rb +364 -25
- data/lib/datadog/core/cloudwise/component.rb +197 -52
- data/lib/datadog/core/cloudwise/docc_heartbeat_worker.rb +105 -0
- data/lib/datadog/core/cloudwise/docc_operation_worker.rb +191 -0
- data/lib/datadog/core/cloudwise/docc_registration_worker.rb +89 -0
- data/lib/datadog/core/cloudwise/license_worker.rb +3 -1
- data/lib/datadog/core/cloudwise/probe_state.rb +134 -12
- data/lib/datadog/core/configuration/components.rb +10 -9
- data/lib/datadog/core/configuration/settings.rb +28 -0
- data/lib/datadog/core/configuration/supported_configurations.rb +5 -2
- data/lib/datadog/core/remote/client/capabilities.rb +7 -0
- data/lib/datadog/core/remote/component.rb +2 -2
- data/lib/datadog/core/remote/transport/config.rb +2 -10
- data/lib/datadog/core/remote/transport/http/config.rb +9 -9
- data/lib/datadog/core/remote/transport/http/negotiation.rb +17 -8
- data/lib/datadog/core/remote/transport/http.rb +2 -0
- data/lib/datadog/core/remote/transport/negotiation.rb +2 -18
- data/lib/datadog/core/remote/worker.rb +23 -35
- data/lib/datadog/core/telemetry/component.rb +26 -13
- data/lib/datadog/core/telemetry/event/app_started.rb +67 -49
- data/lib/datadog/core/telemetry/event/synth_app_client_configuration_change.rb +27 -4
- data/lib/datadog/core/telemetry/transport/http/telemetry.rb +5 -6
- data/lib/datadog/core/telemetry/transport/telemetry.rb +1 -2
- data/lib/datadog/core/telemetry/worker.rb +51 -6
- data/lib/datadog/core/transport/http/adapters/net.rb +2 -0
- data/lib/datadog/core/transport/http/client.rb +69 -0
- data/lib/datadog/core/utils/only_once_successful.rb +6 -2
- data/lib/datadog/data_streams/transport/http/client.rb +4 -32
- data/lib/datadog/data_streams/transport/stats.rb +1 -1
- data/lib/datadog/di/probe_notification_builder.rb +35 -13
- data/lib/datadog/di/transport/diagnostics.rb +2 -2
- data/lib/datadog/di/transport/http/diagnostics.rb +2 -4
- data/lib/datadog/di/transport/http/input.rb +2 -4
- data/lib/datadog/di/transport/input.rb +2 -2
- data/lib/datadog/open_feature/component.rb +60 -0
- data/lib/datadog/open_feature/configuration.rb +27 -0
- data/lib/datadog/open_feature/evaluation_engine.rb +59 -0
- data/lib/datadog/open_feature/exposures/batch_builder.rb +32 -0
- data/lib/datadog/open_feature/exposures/buffer.rb +43 -0
- data/lib/datadog/open_feature/exposures/deduplicator.rb +30 -0
- data/lib/datadog/open_feature/exposures/event.rb +60 -0
- data/lib/datadog/open_feature/exposures/reporter.rb +40 -0
- data/lib/datadog/open_feature/exposures/worker.rb +116 -0
- data/lib/datadog/open_feature/ext.rb +13 -0
- data/lib/datadog/open_feature/noop_evaluator.rb +26 -0
- data/lib/datadog/open_feature/provider.rb +134 -0
- data/lib/datadog/open_feature/remote.rb +74 -0
- data/lib/datadog/open_feature/resolution_details.rb +35 -0
- data/lib/datadog/open_feature/transport.rb +72 -0
- data/lib/datadog/open_feature.rb +19 -0
- data/lib/datadog/profiling/component.rb +6 -0
- data/lib/datadog/profiling/profiler.rb +4 -0
- data/lib/datadog/profiling.rb +1 -2
- data/lib/datadog/single_step_instrument.rb +1 -1
- data/lib/datadog/tracing/contrib/cloudwise/propagation.rb +164 -7
- data/lib/datadog/tracing/contrib/graphql/unified_trace.rb +22 -17
- data/lib/datadog/tracing/contrib/karafka/framework.rb +30 -0
- data/lib/datadog/tracing/contrib/karafka/patcher.rb +14 -0
- data/lib/datadog/tracing/contrib/rack/middlewares.rb +6 -2
- data/lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb +27 -0
- data/lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb +48 -0
- data/lib/datadog/tracing/contrib/waterdrop/ext.rb +17 -0
- data/lib/datadog/tracing/contrib/waterdrop/integration.rb +43 -0
- data/lib/datadog/tracing/contrib/waterdrop/middleware.rb +46 -0
- data/lib/datadog/tracing/contrib/waterdrop/patcher.rb +46 -0
- data/lib/datadog/tracing/contrib/waterdrop/producer.rb +50 -0
- data/lib/datadog/tracing/contrib/waterdrop.rb +37 -0
- data/lib/datadog/tracing/contrib.rb +1 -0
- data/lib/datadog/tracing/transport/http/api.rb +40 -1
- data/lib/datadog/tracing/transport/http/client.rb +12 -26
- data/lib/datadog/tracing/transport/http/traces.rb +4 -2
- data/lib/datadog/tracing/transport/trace_formatter.rb +16 -0
- data/lib/datadog/version.rb +2 -2
- data/lib/datadog.rb +1 -0
- metadata +38 -15
- data/lib/datadog/core/cloudwise/IMPLEMENTATION_V2.md +0 -517
- data/lib/datadog/core/cloudwise/QUICKSTART.md +0 -398
- data/lib/datadog/core/cloudwise/README.md +0 -722
- data/lib/datadog/core/remote/transport/http/client.rb +0 -49
- data/lib/datadog/core/telemetry/transport/http/client.rb +0 -49
- data/lib/datadog/di/transport/http/client.rb +0 -47
metadata
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: cw-datadog
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 2.23.0.
|
|
4
|
+
version: 2.23.0.3
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Datadog, Inc.
|
|
8
8
|
autorequire:
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
|
-
date: 2025-
|
|
11
|
+
date: 2025-12-01 00:00:00.000000000 Z
|
|
12
12
|
dependencies:
|
|
13
13
|
- !ruby/object:Gem::Dependency
|
|
14
14
|
name: msgpack
|
|
@@ -50,28 +50,28 @@ dependencies:
|
|
|
50
50
|
requirements:
|
|
51
51
|
- - "~>"
|
|
52
52
|
- !ruby/object:Gem::Version
|
|
53
|
-
version: 1.
|
|
53
|
+
version: 1.30.0.0.0
|
|
54
54
|
type: :runtime
|
|
55
55
|
prerelease: false
|
|
56
56
|
version_requirements: !ruby/object:Gem::Requirement
|
|
57
57
|
requirements:
|
|
58
58
|
- - "~>"
|
|
59
59
|
- !ruby/object:Gem::Version
|
|
60
|
-
version: 1.
|
|
60
|
+
version: 1.30.0.0.0
|
|
61
61
|
- !ruby/object:Gem::Dependency
|
|
62
62
|
name: libdatadog
|
|
63
63
|
requirement: !ruby/object:Gem::Requirement
|
|
64
64
|
requirements:
|
|
65
65
|
- - "~>"
|
|
66
66
|
- !ruby/object:Gem::Version
|
|
67
|
-
version:
|
|
67
|
+
version: 24.0.1.1.0
|
|
68
68
|
type: :runtime
|
|
69
69
|
prerelease: false
|
|
70
70
|
version_requirements: !ruby/object:Gem::Requirement
|
|
71
71
|
requirements:
|
|
72
72
|
- - "~>"
|
|
73
73
|
- !ruby/object:Gem::Version
|
|
74
|
-
version:
|
|
74
|
+
version: 24.0.1.1.0
|
|
75
75
|
- !ruby/object:Gem::Dependency
|
|
76
76
|
name: logger
|
|
77
77
|
requirement: !ruby/object:Gem::Requirement
|
|
@@ -284,12 +284,12 @@ files:
|
|
|
284
284
|
- lib/datadog/core/buffer/random.rb
|
|
285
285
|
- lib/datadog/core/buffer/thread_safe.rb
|
|
286
286
|
- lib/datadog/core/chunker.rb
|
|
287
|
-
- lib/datadog/core/cloudwise/IMPLEMENTATION_V2.md
|
|
288
|
-
- lib/datadog/core/cloudwise/QUICKSTART.md
|
|
289
|
-
- lib/datadog/core/cloudwise/README.md
|
|
290
287
|
- lib/datadog/core/cloudwise/app_registration_worker.rb
|
|
291
288
|
- lib/datadog/core/cloudwise/client.rb
|
|
292
289
|
- lib/datadog/core/cloudwise/component.rb
|
|
290
|
+
- lib/datadog/core/cloudwise/docc_heartbeat_worker.rb
|
|
291
|
+
- lib/datadog/core/cloudwise/docc_operation_worker.rb
|
|
292
|
+
- lib/datadog/core/cloudwise/docc_registration_worker.rb
|
|
293
293
|
- lib/datadog/core/cloudwise/heartbeat_worker.rb
|
|
294
294
|
- lib/datadog/core/cloudwise/host_id_worker.rb
|
|
295
295
|
- lib/datadog/core/cloudwise/license_worker.rb
|
|
@@ -367,7 +367,6 @@ files:
|
|
|
367
367
|
- lib/datadog/core/remote/transport/config.rb
|
|
368
368
|
- lib/datadog/core/remote/transport/http.rb
|
|
369
369
|
- lib/datadog/core/remote/transport/http/api.rb
|
|
370
|
-
- lib/datadog/core/remote/transport/http/client.rb
|
|
371
370
|
- lib/datadog/core/remote/transport/http/config.rb
|
|
372
371
|
- lib/datadog/core/remote/transport/http/negotiation.rb
|
|
373
372
|
- lib/datadog/core/remote/transport/negotiation.rb
|
|
@@ -402,7 +401,6 @@ files:
|
|
|
402
401
|
- lib/datadog/core/telemetry/request.rb
|
|
403
402
|
- lib/datadog/core/telemetry/transport/http.rb
|
|
404
403
|
- lib/datadog/core/telemetry/transport/http/api.rb
|
|
405
|
-
- lib/datadog/core/telemetry/transport/http/client.rb
|
|
406
404
|
- lib/datadog/core/telemetry/transport/http/telemetry.rb
|
|
407
405
|
- lib/datadog/core/telemetry/transport/telemetry.rb
|
|
408
406
|
- lib/datadog/core/telemetry/worker.rb
|
|
@@ -418,6 +416,7 @@ files:
|
|
|
418
416
|
- lib/datadog/core/transport/http/api/map.rb
|
|
419
417
|
- lib/datadog/core/transport/http/api/spec.rb
|
|
420
418
|
- lib/datadog/core/transport/http/builder.rb
|
|
419
|
+
- lib/datadog/core/transport/http/client.rb
|
|
421
420
|
- lib/datadog/core/transport/http/env.rb
|
|
422
421
|
- lib/datadog/core/transport/http/response.rb
|
|
423
422
|
- lib/datadog/core/transport/parcel.rb
|
|
@@ -498,7 +497,6 @@ files:
|
|
|
498
497
|
- lib/datadog/di/transport/diagnostics.rb
|
|
499
498
|
- lib/datadog/di/transport/http.rb
|
|
500
499
|
- lib/datadog/di/transport/http/api.rb
|
|
501
|
-
- lib/datadog/di/transport/http/client.rb
|
|
502
500
|
- lib/datadog/di/transport/http/diagnostics.rb
|
|
503
501
|
- lib/datadog/di/transport/http/input.rb
|
|
504
502
|
- lib/datadog/di/transport/input.rb
|
|
@@ -516,6 +514,22 @@ files:
|
|
|
516
514
|
- lib/datadog/kit/appsec/events/v2.rb
|
|
517
515
|
- lib/datadog/kit/enable_core_dumps.rb
|
|
518
516
|
- lib/datadog/kit/identity.rb
|
|
517
|
+
- lib/datadog/open_feature.rb
|
|
518
|
+
- lib/datadog/open_feature/component.rb
|
|
519
|
+
- lib/datadog/open_feature/configuration.rb
|
|
520
|
+
- lib/datadog/open_feature/evaluation_engine.rb
|
|
521
|
+
- lib/datadog/open_feature/exposures/batch_builder.rb
|
|
522
|
+
- lib/datadog/open_feature/exposures/buffer.rb
|
|
523
|
+
- lib/datadog/open_feature/exposures/deduplicator.rb
|
|
524
|
+
- lib/datadog/open_feature/exposures/event.rb
|
|
525
|
+
- lib/datadog/open_feature/exposures/reporter.rb
|
|
526
|
+
- lib/datadog/open_feature/exposures/worker.rb
|
|
527
|
+
- lib/datadog/open_feature/ext.rb
|
|
528
|
+
- lib/datadog/open_feature/noop_evaluator.rb
|
|
529
|
+
- lib/datadog/open_feature/provider.rb
|
|
530
|
+
- lib/datadog/open_feature/remote.rb
|
|
531
|
+
- lib/datadog/open_feature/resolution_details.rb
|
|
532
|
+
- lib/datadog/open_feature/transport.rb
|
|
519
533
|
- lib/datadog/opentelemetry.rb
|
|
520
534
|
- lib/datadog/opentelemetry/api/baggage.rb
|
|
521
535
|
- lib/datadog/opentelemetry/api/baggage.rbs
|
|
@@ -795,6 +809,7 @@ files:
|
|
|
795
809
|
- lib/datadog/tracing/contrib/karafka/configuration/settings.rb
|
|
796
810
|
- lib/datadog/tracing/contrib/karafka/distributed/propagation.rb
|
|
797
811
|
- lib/datadog/tracing/contrib/karafka/ext.rb
|
|
812
|
+
- lib/datadog/tracing/contrib/karafka/framework.rb
|
|
798
813
|
- lib/datadog/tracing/contrib/karafka/integration.rb
|
|
799
814
|
- lib/datadog/tracing/contrib/karafka/monitor.rb
|
|
800
815
|
- lib/datadog/tracing/contrib/karafka/patcher.rb
|
|
@@ -970,6 +985,14 @@ files:
|
|
|
970
985
|
- lib/datadog/tracing/contrib/utils/database.rb
|
|
971
986
|
- lib/datadog/tracing/contrib/utils/quantization/hash.rb
|
|
972
987
|
- lib/datadog/tracing/contrib/utils/quantization/http.rb
|
|
988
|
+
- lib/datadog/tracing/contrib/waterdrop.rb
|
|
989
|
+
- lib/datadog/tracing/contrib/waterdrop/configuration/settings.rb
|
|
990
|
+
- lib/datadog/tracing/contrib/waterdrop/distributed/propagation.rb
|
|
991
|
+
- lib/datadog/tracing/contrib/waterdrop/ext.rb
|
|
992
|
+
- lib/datadog/tracing/contrib/waterdrop/integration.rb
|
|
993
|
+
- lib/datadog/tracing/contrib/waterdrop/middleware.rb
|
|
994
|
+
- lib/datadog/tracing/contrib/waterdrop/patcher.rb
|
|
995
|
+
- lib/datadog/tracing/contrib/waterdrop/producer.rb
|
|
973
996
|
- lib/datadog/tracing/correlation.rb
|
|
974
997
|
- lib/datadog/tracing/diagnostics/environment_logger.rb
|
|
975
998
|
- lib/datadog/tracing/diagnostics/ext.rb
|
|
@@ -1047,8 +1070,8 @@ licenses:
|
|
|
1047
1070
|
- Apache-2.0
|
|
1048
1071
|
metadata:
|
|
1049
1072
|
allowed_push_host: https://rubygems.org
|
|
1050
|
-
changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.23.0.
|
|
1051
|
-
source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.23.0.
|
|
1073
|
+
changelog_uri: https://github.com/DataDog/dd-trace-rb/blob/v2.23.0.3/CHANGELOG.md
|
|
1074
|
+
source_code_uri: https://github.com/DataDog/dd-trace-rb/tree/v2.23.0.3
|
|
1052
1075
|
post_install_message:
|
|
1053
1076
|
rdoc_options: []
|
|
1054
1077
|
require_paths:
|
|
@@ -1060,7 +1083,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
1060
1083
|
version: 2.5.0
|
|
1061
1084
|
- - "<"
|
|
1062
1085
|
- !ruby/object:Gem::Version
|
|
1063
|
-
version: '
|
|
1086
|
+
version: '4.0'
|
|
1064
1087
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
1065
1088
|
requirements:
|
|
1066
1089
|
- - ">="
|
|
@@ -1,517 +0,0 @@
|
|
|
1
|
-
# Cloudwise 实现方案 V2
|
|
2
|
-
|
|
3
|
-
## 📋 需求变更总结
|
|
4
|
-
|
|
5
|
-
根据最新需求,重新实现了 Cloudwise 集成的初始化和数据采集控制逻辑。
|
|
6
|
-
|
|
7
|
-
### 核心变更
|
|
8
|
-
|
|
9
|
-
1. **初始化顺序**:Cloudwise 必须**先于** Datadog 其他组件初始化
|
|
10
|
-
2. **数据采集控制**:只有当 **Host ID + Heartbeat + License** 三者都正常时,才可以采集和上报数据
|
|
11
|
-
3. **失败重试间隔**:从 2秒/2分钟 统一调整为 **30秒**
|
|
12
|
-
4. **应用注册周期**:从 10分钟 调整为 **3分钟**
|
|
13
|
-
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
## 🔄 初始化流程
|
|
17
|
-
|
|
18
|
-
```
|
|
19
|
-
应用启动
|
|
20
|
-
↓
|
|
21
|
-
┌──────────────────────────────────────────┐
|
|
22
|
-
│ Cloudwise 组件初始化(优先执行) │
|
|
23
|
-
└──────────────────────────────────────────┘
|
|
24
|
-
↓
|
|
25
|
-
[1] Host ID Worker 启动
|
|
26
|
-
├─ 调用 POST /v2/app/generateHostId
|
|
27
|
-
├─ 成功条件:success=true && code=1000
|
|
28
|
-
├─ 成功:获取 account_id,设置 ENV['CLOUDWISE_ACCOUNT_ID'],标记 host_id_ready=true,停止 Worker
|
|
29
|
-
├─ 失败:30秒后重试
|
|
30
|
-
└─ ⚠️ 失败时:数据不采集,不上报,后续步骤不执行
|
|
31
|
-
↓
|
|
32
|
-
[2] Heartbeat Worker 启动
|
|
33
|
-
├─ 等待 Host ID 就绪
|
|
34
|
-
├─ 调用 POST /api/v1/agent/heartbeat
|
|
35
|
-
├─ 执行周期:60秒
|
|
36
|
-
├─ 成功条件:success=true && code=1000
|
|
37
|
-
├─ 成功:标记 heartbeat_active=true
|
|
38
|
-
├─ 失败:30秒后重试,失败3次标记 heartbeat_active=false
|
|
39
|
-
└─ ⚠️ heartbeat_active=false 时:数据不采集,不上报
|
|
40
|
-
↓
|
|
41
|
-
[3] Application Registration Worker 启动
|
|
42
|
-
├─ 等待 Host ID 就绪
|
|
43
|
-
├─ 调用 POST /api/v1/application/register
|
|
44
|
-
├─ 执行周期:3分钟
|
|
45
|
-
├─ 成功条件:success=true && code=1000
|
|
46
|
-
├─ 成功:标记 app_registered=true
|
|
47
|
-
├─ 失败:继续定时重试(3分钟后)
|
|
48
|
-
└─ ✅ 注册失败不影响数据采集
|
|
49
|
-
↓
|
|
50
|
-
[4] License Worker 启动
|
|
51
|
-
├─ 等待 Host ID 就绪
|
|
52
|
-
├─ 调用 POST /api/v1/license/verify
|
|
53
|
-
├─ 执行周期:5分钟
|
|
54
|
-
├─ 成功条件:success=true && code=1000
|
|
55
|
-
├─ 成功:标记 license_valid=true
|
|
56
|
-
├─ 失败:累计失败3次标记 license_valid=false
|
|
57
|
-
└─ ⚠️ license_valid=false 时:数据不采集,不上报
|
|
58
|
-
↓
|
|
59
|
-
┌──────────────────────────────────────────┐
|
|
60
|
-
│ Datadog 其他组件初始化 │
|
|
61
|
-
└──────────────────────────────────────────┘
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
---
|
|
65
|
-
|
|
66
|
-
## 🎯 核心实现
|
|
67
|
-
|
|
68
|
-
### 1. ProbeState(探针状态管理器)
|
|
69
|
-
|
|
70
|
-
**文件**: `lib/datadog/core/cloudwise/probe_state.rb`
|
|
71
|
-
|
|
72
|
-
**职责**: 追踪所有影响数据采集的条件
|
|
73
|
-
|
|
74
|
-
```ruby
|
|
75
|
-
class ProbeState
|
|
76
|
-
# 三个关键状态
|
|
77
|
-
@host_id_ready # Host ID 是否就绪
|
|
78
|
-
@heartbeat_active # 心跳是否正常
|
|
79
|
-
@license_valid # License 是否有效
|
|
80
|
-
@app_registered # 应用是否已注册(不影响采集)
|
|
81
|
-
|
|
82
|
-
# 数据采集判断
|
|
83
|
-
def can_collect_data?
|
|
84
|
-
@host_id_ready && @heartbeat_active && @license_valid
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
**关键方法**:
|
|
90
|
-
- `mark_host_id_ready!` / `mark_host_id_failed!`
|
|
91
|
-
- `mark_heartbeat_active!` / `mark_heartbeat_inactive!`
|
|
92
|
-
- `mark_license_valid!` / `mark_license_invalid!`
|
|
93
|
-
- `can_collect_data?` - **核心判断**:三者都满足才返回 true
|
|
94
|
-
|
|
95
|
-
---
|
|
96
|
-
|
|
97
|
-
### 2. HostIdWorker(Host ID 生成)
|
|
98
|
-
|
|
99
|
-
**文件**: `lib/datadog/core/cloudwise/host_id_worker.rb`
|
|
100
|
-
|
|
101
|
-
**配置**:
|
|
102
|
-
- 重试间隔:**30秒**
|
|
103
|
-
- 成功条件:`code == 1000`
|
|
104
|
-
|
|
105
|
-
**逻辑**:
|
|
106
|
-
```ruby
|
|
107
|
-
result = client.generate_host_id
|
|
108
|
-
|
|
109
|
-
if result[:success] && result[:code] == 1000 && client.account_id
|
|
110
|
-
# 成功
|
|
111
|
-
probe_state.mark_host_id_ready!
|
|
112
|
-
ENV['CLOUDWISE_ACCOUNT_ID'] = client.account_id
|
|
113
|
-
stop_loop # 只需成功一次
|
|
114
|
-
else
|
|
115
|
-
# 失败,30秒后重试
|
|
116
|
-
probe_state.mark_host_id_failed!
|
|
117
|
-
# 数据不采集
|
|
118
|
-
end
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
---
|
|
122
|
-
|
|
123
|
-
### 3. HeartbeatWorker(心跳)
|
|
124
|
-
|
|
125
|
-
**文件**: `lib/datadog/core/cloudwise/heartbeat_worker.rb`
|
|
126
|
-
|
|
127
|
-
**配置**:
|
|
128
|
-
- 执行周期:**60秒**
|
|
129
|
-
- 失败重试间隔:**30秒**
|
|
130
|
-
- 最大失败次数:**3次**
|
|
131
|
-
- 成功条件:`code == 1000`
|
|
132
|
-
|
|
133
|
-
**逻辑**:
|
|
134
|
-
```ruby
|
|
135
|
-
result = client.heartbeat
|
|
136
|
-
|
|
137
|
-
if !result[:success]
|
|
138
|
-
# 接口请求失败
|
|
139
|
-
@failure_count += 1
|
|
140
|
-
if @failure_count >= 3
|
|
141
|
-
probe_state.mark_heartbeat_inactive!
|
|
142
|
-
# 数据不采集
|
|
143
|
-
end
|
|
144
|
-
elsif result[:code] != 1000
|
|
145
|
-
# 接口成功但 code 不对
|
|
146
|
-
probe_state.mark_heartbeat_inactive!
|
|
147
|
-
# 数据不采集
|
|
148
|
-
else
|
|
149
|
-
# 成功
|
|
150
|
-
probe_state.mark_heartbeat_active!
|
|
151
|
-
@failure_count = 0
|
|
152
|
-
end
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
**关键点**:
|
|
156
|
-
- 接口请求失败:累计失败次数,达到3次后标记为 inactive
|
|
157
|
-
- 接口成功但 code ≠ 1000:立即标记为 inactive
|
|
158
|
-
- 任何一次成功(code == 1000):恢复 active,重置失败计数
|
|
159
|
-
|
|
160
|
-
---
|
|
161
|
-
|
|
162
|
-
### 4. LicenseWorker(License 校验)
|
|
163
|
-
|
|
164
|
-
**文件**: `lib/datadog/core/cloudwise/license_worker.rb`
|
|
165
|
-
|
|
166
|
-
**配置**:
|
|
167
|
-
- 执行周期:**5分钟**
|
|
168
|
-
- 最大失败次数:**3次**
|
|
169
|
-
- 成功条件:`code == 1000`
|
|
170
|
-
|
|
171
|
-
**逻辑**:
|
|
172
|
-
```ruby
|
|
173
|
-
result = client.verify_license
|
|
174
|
-
|
|
175
|
-
if !result[:success]
|
|
176
|
-
# 接口请求失败
|
|
177
|
-
@failure_count += 1
|
|
178
|
-
if @failure_count >= 3
|
|
179
|
-
probe_state.mark_license_invalid!
|
|
180
|
-
# 数据不采集
|
|
181
|
-
end
|
|
182
|
-
elsif result[:code] == 1000
|
|
183
|
-
# License 校验成功
|
|
184
|
-
probe_state.mark_license_valid!
|
|
185
|
-
@failure_count = 0
|
|
186
|
-
else
|
|
187
|
-
# License 校验失败
|
|
188
|
-
probe_state.mark_license_invalid!
|
|
189
|
-
# 数据不采集
|
|
190
|
-
end
|
|
191
|
-
```
|
|
192
|
-
|
|
193
|
-
**关键点**:
|
|
194
|
-
- 接口请求失败:累计失败3次后标记为 invalid
|
|
195
|
-
- code ≠ 1000:立即标记为 invalid
|
|
196
|
-
- 任何一次成功(code == 1000):恢复 valid
|
|
197
|
-
|
|
198
|
-
---
|
|
199
|
-
|
|
200
|
-
### 5. AppRegistrationWorker(应用注册)
|
|
201
|
-
|
|
202
|
-
**文件**: `lib/datadog/core/cloudwise/app_registration_worker.rb`
|
|
203
|
-
|
|
204
|
-
**配置**:
|
|
205
|
-
- 执行周期:**3分钟**
|
|
206
|
-
- 成功条件:`code == 1000`
|
|
207
|
-
|
|
208
|
-
**逻辑**:
|
|
209
|
-
```ruby
|
|
210
|
-
result = client.register_application
|
|
211
|
-
|
|
212
|
-
if result[:success] && result[:code] == 1000
|
|
213
|
-
# 注册成功
|
|
214
|
-
probe_state.mark_app_registered!
|
|
215
|
-
else
|
|
216
|
-
# 注册失败,3分钟后重试
|
|
217
|
-
probe_state.mark_app_unregistered!
|
|
218
|
-
# ⚠️ 注册失败不影响数据采集
|
|
219
|
-
end
|
|
220
|
-
```
|
|
221
|
-
|
|
222
|
-
**关键点**:
|
|
223
|
-
- 注册失败**不影响**数据采集
|
|
224
|
-
- 失败后继续定时重试(3分钟周期)
|
|
225
|
-
|
|
226
|
-
---
|
|
227
|
-
|
|
228
|
-
### 6. Component(组件管理器)
|
|
229
|
-
|
|
230
|
-
**文件**: `lib/datadog/core/cloudwise/component.rb`
|
|
231
|
-
|
|
232
|
-
**初始化顺序**:
|
|
233
|
-
```ruby
|
|
234
|
-
def start
|
|
235
|
-
# 1. Host ID Worker(30秒重试)
|
|
236
|
-
@host_id_worker.start
|
|
237
|
-
|
|
238
|
-
# 2. Heartbeat Worker(60秒周期)
|
|
239
|
-
@heartbeat_worker.start
|
|
240
|
-
|
|
241
|
-
# 3. Application Registration Worker(3分钟周期)
|
|
242
|
-
@app_registration_worker.start
|
|
243
|
-
|
|
244
|
-
# 4. License Worker(5分钟周期)
|
|
245
|
-
@license_worker.start
|
|
246
|
-
end
|
|
247
|
-
```
|
|
248
|
-
|
|
249
|
-
**状态查询**:
|
|
250
|
-
```ruby
|
|
251
|
-
def status
|
|
252
|
-
{
|
|
253
|
-
host_id_ready: probe_state.host_id_ready?,
|
|
254
|
-
heartbeat_active: probe_state.heartbeat_active?,
|
|
255
|
-
license_valid: probe_state.license_valid?,
|
|
256
|
-
app_registered: probe_state.app_registered?,
|
|
257
|
-
can_collect_data: probe_state.can_collect_data? # 核心判断
|
|
258
|
-
}
|
|
259
|
-
end
|
|
260
|
-
```
|
|
261
|
-
|
|
262
|
-
---
|
|
263
|
-
|
|
264
|
-
## 📊 数据采集控制
|
|
265
|
-
|
|
266
|
-
### 在 traces.rb 中的集成
|
|
267
|
-
|
|
268
|
-
**文件**: `lib/datadog/tracing/transport/http/traces.rb`
|
|
269
|
-
|
|
270
|
-
```ruby
|
|
271
|
-
def call(env, &block)
|
|
272
|
-
# 检查探针状态
|
|
273
|
-
if cloudwise_probe_suspended?
|
|
274
|
-
Datadog.logger.debug { 'Cloudwise: Probe suspended, skipping trace submission' }
|
|
275
|
-
return build_mock_response(env)
|
|
276
|
-
end
|
|
277
|
-
|
|
278
|
-
# 正常发送 traces
|
|
279
|
-
# ...
|
|
280
|
-
end
|
|
281
|
-
|
|
282
|
-
def cloudwise_probe_suspended?
|
|
283
|
-
return false unless defined?(Datadog.components)
|
|
284
|
-
return false unless Datadog.components.respond_to?(:cloudwise)
|
|
285
|
-
|
|
286
|
-
cloudwise = Datadog.components.cloudwise
|
|
287
|
-
return false unless cloudwise&.enabled?
|
|
288
|
-
|
|
289
|
-
# 核心判断:can_collect_data?
|
|
290
|
-
cloudwise.probe_state.suspended? # 即 !can_collect_data?
|
|
291
|
-
end
|
|
292
|
-
```
|
|
293
|
-
|
|
294
|
-
---
|
|
295
|
-
|
|
296
|
-
## 🔑 关键配置
|
|
297
|
-
|
|
298
|
-
### 环境变量
|
|
299
|
-
|
|
300
|
-
```bash
|
|
301
|
-
# Cloudwise 配置
|
|
302
|
-
export DD_CLOUDWISE_ENABLED=true
|
|
303
|
-
export DD_CLOUDWISE_BASE_URL=https://api.cloudwise.com
|
|
304
|
-
export DD_CLOUDWISE_SERVER_NAME=my-ruby-app
|
|
305
|
-
export DD_CLOUDWISE_LICENSE_KEY=your-license-key
|
|
306
|
-
|
|
307
|
-
# 可选:自定义周期
|
|
308
|
-
export DD_CLOUDWISE_HEARTBEAT_INTERVAL=60 # 默认 60秒
|
|
309
|
-
export DD_CLOUDWISE_LICENSE_CHECK_INTERVAL=300 # 默认 5分钟
|
|
310
|
-
export DD_CLOUDWISE_APP_REGISTRATION_INTERVAL=180 # 默认 3分钟
|
|
311
|
-
|
|
312
|
-
# 自动设置(由 Host ID Worker 设置)
|
|
313
|
-
# CLOUDWISE_ACCOUNT_ID # 成功后自动设置
|
|
314
|
-
```
|
|
315
|
-
|
|
316
|
-
### 配置文件
|
|
317
|
-
|
|
318
|
-
```ruby
|
|
319
|
-
Datadog.configure do |c|
|
|
320
|
-
c.cloudwise.enabled = true
|
|
321
|
-
c.cloudwise.base_url = 'https://api.cloudwise.com'
|
|
322
|
-
c.cloudwise.server_name = 'my-ruby-app'
|
|
323
|
-
c.cloudwise.license_key = 'your-license-key'
|
|
324
|
-
|
|
325
|
-
# 可选
|
|
326
|
-
c.cloudwise.heartbeat_interval = 60
|
|
327
|
-
c.cloudwise.license_check_interval = 300
|
|
328
|
-
c.cloudwise.app_registration_interval = 180
|
|
329
|
-
end
|
|
330
|
-
```
|
|
331
|
-
|
|
332
|
-
---
|
|
333
|
-
|
|
334
|
-
## ⚠️ 重要注意事项
|
|
335
|
-
|
|
336
|
-
### 1. 初始化顺序
|
|
337
|
-
|
|
338
|
-
❗ **Cloudwise 组件必须在 Datadog 其他组件之前初始化**
|
|
339
|
-
|
|
340
|
-
```ruby
|
|
341
|
-
# 正确的初始化顺序
|
|
342
|
-
Datadog.configure do |c|
|
|
343
|
-
# 1. 先配置 Cloudwise
|
|
344
|
-
c.cloudwise.enabled = true
|
|
345
|
-
c.cloudwise.base_url = 'https://api.cloudwise.com'
|
|
346
|
-
# ...
|
|
347
|
-
|
|
348
|
-
# 2. 再配置其他 Datadog 组件
|
|
349
|
-
c.service = 'my-app'
|
|
350
|
-
c.tracing.enabled = true
|
|
351
|
-
# ...
|
|
352
|
-
end
|
|
353
|
-
```
|
|
354
|
-
|
|
355
|
-
### 2. 数据采集条件
|
|
356
|
-
|
|
357
|
-
数据采集**必须同时满足三个条件**:
|
|
358
|
-
|
|
359
|
-
1. ✅ `host_id_ready == true`
|
|
360
|
-
2. ✅ `heartbeat_active == true`
|
|
361
|
-
3. ✅ `license_valid == true`
|
|
362
|
-
|
|
363
|
-
任何一个条件不满足,数据都不会被采集和上报。
|
|
364
|
-
|
|
365
|
-
### 3. 应用注册
|
|
366
|
-
|
|
367
|
-
❗ 应用注册失败**不影响**数据采集,只会在日志中记录警告并继续重试。
|
|
368
|
-
|
|
369
|
-
### 4. 失败重试
|
|
370
|
-
|
|
371
|
-
- **Host ID**:30秒重试,直到成功
|
|
372
|
-
- **Heartbeat**:接口失败累计3次后标记为 inactive,但Worker继续运行(60秒周期)
|
|
373
|
-
- **License**:接口失败累计3次后标记为 invalid,但Worker继续运行(5分钟周期)
|
|
374
|
-
- **App Registration**:失败后继续定时重试(3分钟周期)
|
|
375
|
-
|
|
376
|
-
### 5. 恢复机制
|
|
377
|
-
|
|
378
|
-
- **Heartbeat**:任何一次成功(code == 1000)即恢复 active
|
|
379
|
-
- **License**:任何一次成功(code == 1000)即恢复 valid
|
|
380
|
-
|
|
381
|
-
---
|
|
382
|
-
|
|
383
|
-
## 📝 日志示例
|
|
384
|
-
|
|
385
|
-
### 启动时
|
|
386
|
-
|
|
387
|
-
```
|
|
388
|
-
============================================================
|
|
389
|
-
🚀 Starting Cloudwise Component
|
|
390
|
-
Initialization Order: Host ID → Heartbeat → App Registration → License
|
|
391
|
-
============================================================
|
|
392
|
-
📍 Step 1: Starting Host ID generation worker (30s retry)...
|
|
393
|
-
💓 Step 2: Starting Heartbeat worker (60s interval, 30s retry)...
|
|
394
|
-
📝 Step 3: Starting Application registration worker (3 min interval)...
|
|
395
|
-
🔑 Step 4: Starting License verification worker (5 min interval)...
|
|
396
|
-
============================================================
|
|
397
|
-
✅ Cloudwise Component started successfully
|
|
398
|
-
Data collection will be enabled when: Host ID + Heartbeat + License are ready
|
|
399
|
-
============================================================
|
|
400
|
-
```
|
|
401
|
-
|
|
402
|
-
### Host ID 成功
|
|
403
|
-
|
|
404
|
-
```
|
|
405
|
-
INFO -- : Cloudwise: Host ID generated successfully, account_id: acc-1234567890-123
|
|
406
|
-
INFO -- : ✅ Cloudwise: Host ID ready
|
|
407
|
-
INFO -- : 🔴 Cloudwise: Probe SUSPENDED - data collection disabled (Heartbeat inactive, License invalid)
|
|
408
|
-
```
|
|
409
|
-
|
|
410
|
-
### Heartbeat 成功
|
|
411
|
-
|
|
412
|
-
```
|
|
413
|
-
DEBUG -- : Cloudwise: Heartbeat successful
|
|
414
|
-
INFO -- : ✅ Cloudwise: Heartbeat active
|
|
415
|
-
INFO -- : 🔴 Cloudwise: Probe SUSPENDED - data collection disabled (License invalid)
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
### License 成功
|
|
419
|
-
|
|
420
|
-
```
|
|
421
|
-
INFO -- : Cloudwise: License valid
|
|
422
|
-
INFO -- : ✅ Cloudwise: License valid
|
|
423
|
-
INFO -- : 🟢 Cloudwise: Probe ACTIVE - data collection enabled
|
|
424
|
-
```
|
|
425
|
-
|
|
426
|
-
### 数据采集被阻止
|
|
427
|
-
|
|
428
|
-
```
|
|
429
|
-
DEBUG -- : Cloudwise: Probe suspended, skipping trace submission
|
|
430
|
-
```
|
|
431
|
-
|
|
432
|
-
---
|
|
433
|
-
|
|
434
|
-
## 🧪 测试
|
|
435
|
-
|
|
436
|
-
### Mock API Server
|
|
437
|
-
|
|
438
|
-
```bash
|
|
439
|
-
cd lib/datadog/core/cloudwise
|
|
440
|
-
ruby mock_api_server.rb
|
|
441
|
-
```
|
|
442
|
-
|
|
443
|
-
### 运行测试
|
|
444
|
-
|
|
445
|
-
```bash
|
|
446
|
-
cd lib/datadog/core/cloudwise
|
|
447
|
-
ruby test_integration.rb
|
|
448
|
-
```
|
|
449
|
-
|
|
450
|
-
### 状态检查
|
|
451
|
-
|
|
452
|
-
```ruby
|
|
453
|
-
status = Datadog.components.cloudwise.status
|
|
454
|
-
|
|
455
|
-
puts "Host ID Ready: #{status[:host_id_ready]}"
|
|
456
|
-
puts "Heartbeat Active: #{status[:heartbeat_active]}"
|
|
457
|
-
puts "License Valid: #{status[:license_valid]}"
|
|
458
|
-
puts "Can Collect Data: #{status[:can_collect_data]}"
|
|
459
|
-
```
|
|
460
|
-
|
|
461
|
-
---
|
|
462
|
-
|
|
463
|
-
## 📁 文件清单
|
|
464
|
-
|
|
465
|
-
### 核心文件
|
|
466
|
-
|
|
467
|
-
1. `lib/datadog/core/cloudwise/probe_state.rb` - 探针状态管理 ⭐
|
|
468
|
-
2. `lib/datadog/core/cloudwise/client.rb` - HTTP 客户端
|
|
469
|
-
3. `lib/datadog/core/cloudwise/host_id_worker.rb` - Host ID 生成 ⭐
|
|
470
|
-
4. `lib/datadog/core/cloudwise/heartbeat_worker.rb` - 心跳 ⭐
|
|
471
|
-
5. `lib/datadog/core/cloudwise/license_worker.rb` - License 校验 ⭐
|
|
472
|
-
6. `lib/datadog/core/cloudwise/app_registration_worker.rb` - 应用注册
|
|
473
|
-
7. `lib/datadog/core/cloudwise/component.rb` - 组件管理器 ⭐
|
|
474
|
-
8. `lib/datadog/tracing/transport/http/traces.rb` - Trace 上报拦截 ⭐
|
|
475
|
-
|
|
476
|
-
### 文档文件
|
|
477
|
-
|
|
478
|
-
- `README.md` - 基础说明
|
|
479
|
-
- `IMPLEMENTATION_V2.md` - 本文档(V2 实现方案)
|
|
480
|
-
- `INTEGRATION_GUIDE.md` - 集成指南
|
|
481
|
-
- `QUICKSTART.md` - 快速开始
|
|
482
|
-
|
|
483
|
-
### 测试文件
|
|
484
|
-
|
|
485
|
-
- `mock_api_server.rb` - Mock API 服务器
|
|
486
|
-
- `test_integration.rb` - 集成测试脚本
|
|
487
|
-
|
|
488
|
-
---
|
|
489
|
-
|
|
490
|
-
## ✅ V2 改进总结
|
|
491
|
-
|
|
492
|
-
相比 V1 版本,V2 做了以下改进:
|
|
493
|
-
|
|
494
|
-
1. ✅ **简化状态管理**:三个核心状态(Host ID、Heartbeat、License),清晰明了
|
|
495
|
-
2. ✅ **统一重试间隔**:从 2秒/2分钟 统一为 30秒,更合理
|
|
496
|
-
3. ✅ **优化失败处理**:累计失败次数而非每次都重试多次
|
|
497
|
-
4. ✅ **明确恢复机制**:任何一次成功即可恢复
|
|
498
|
-
5. ✅ **应用注册独立**:注册失败不影响数据采集
|
|
499
|
-
6. ✅ **初始化顺序明确**:Cloudwise 优先于 Datadog 其他组件
|
|
500
|
-
7. ✅ **日志信息丰富**:清晰显示当前状态和失败原因
|
|
501
|
-
|
|
502
|
-
---
|
|
503
|
-
|
|
504
|
-
## 🔗 相关文档
|
|
505
|
-
|
|
506
|
-
- [README.md](./README.md) - 基础使用说明
|
|
507
|
-
- [INTEGRATION_GUIDE.md](./INTEGRATION_GUIDE.md) - 详细集成指南
|
|
508
|
-
- [QUICKSTART.md](./QUICKSTART.md) - 快速开始教程
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|