-
Notifications
You must be signed in to change notification settings - Fork 165
/
Copy pathTracerSharedState.swift
97 lines (85 loc) · 3.2 KB
/
TracerSharedState.swift
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
/*
* Copyright The OpenTelemetry Authors
* SPDX-License-Identifier: Apache-2.0
*/
import Foundation
import OpenTelemetryApi
/// Represents the shared state/config between all Tracers created by the same TracerProvider.
class TracerSharedState {
var clock: Clock
var idGenerator: IdGenerator
var resource: Resource
var activeSpanLimits: SpanLimits
var sampler: Sampler
var activeSpanProcessor: SpanProcessor
var hasBeenShutdown = false
var launchEnvironmentContext: SpanContext?
var registeredSpanProcessors = [SpanProcessor]()
init(clock: Clock,
idGenerator: IdGenerator,
resource: Resource,
spanLimits: SpanLimits,
sampler: Sampler,
spanProcessors: [SpanProcessor]) {
self.clock = clock
self.idGenerator = idGenerator
self.resource = resource
self.activeSpanLimits = spanLimits
self.sampler = sampler
if spanProcessors.count > 1 {
self.activeSpanProcessor = MultiSpanProcessor(spanProcessors: spanProcessors)
registeredSpanProcessors = spanProcessors
} else if spanProcessors.count == 1 {
self.activeSpanProcessor = spanProcessors[0]
registeredSpanProcessors = spanProcessors
} else {
activeSpanProcessor = NoopSpanProcessor()
}
/// Recovers explicit parent context from process environment variables, it allows to automatic
/// trace context propagation to child processes
let environmentPropagator = EnvironmentContextPropagator()
self.launchEnvironmentContext = environmentPropagator.extract(carrier: ProcessInfo.processInfo.environment, getter: EnvironmentGetter())
}
/// Adds a new SpanProcessor
/// - Parameter spanProcessor: the new SpanProcessor to be added.
func addSpanProcessor(_ spanProcessor: SpanProcessor) {
registeredSpanProcessors.append(spanProcessor)
if registeredSpanProcessors.count > 1 {
activeSpanProcessor = MultiSpanProcessor(spanProcessors: registeredSpanProcessors)
} else {
activeSpanProcessor = registeredSpanProcessors[0]
}
}
/// Stops tracing, including shutting down processors and set to true isStopped.
func stop() {
if hasBeenShutdown {
return
}
activeSpanProcessor.shutdown()
hasBeenShutdown = true
}
func setActiveSpanLimits(_ activeSpanLimits: SpanLimits) {
self.activeSpanLimits = activeSpanLimits
}
func setSampler(_ sampler: Sampler) {
self.sampler = sampler
}
// Sets the global sampler probability
func setSamplerProbability(samplerProbability: Double) {
if samplerProbability >= 1 {
return setSampler(Samplers.alwaysOn)
} else if samplerProbability <= 0 {
return setSampler(Samplers.alwaysOff)
} else {
return setSampler(Samplers.traceIdRatio(ratio: samplerProbability))
}
}
private struct EnvironmentGetter: Getter {
func get(carrier: [String: String], key: String) -> [String]? {
if let value = carrier[key] {
return [value]
}
return nil
}
}
}