Skip to content

Commit b43a137

Browse files
author
Ignacio Bonafonte
authored
Merge pull request #147 from nachoBonafonte/Null-or-empty-name-passed-to-TracerProvider.getTracer()-should-log-the-error
TracerProviderSdk must log if the name is empty and use a default name. Fixes #139 Added tests for TracerProviderSdk Also added default resources to EnvVarResources
2 parents b8603e2 + 3926aff commit b43a137

File tree

9 files changed

+104
-22
lines changed

9 files changed

+104
-22
lines changed

Sources/OpenTelemetrySdk/Resources/EnvVarResource.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public struct EnvVarResource {
2424

2525
/// This resource information is loaded from the OC_RESOURCE_LABELS
2626
/// environment variable.
27-
public static let resource = Resource(attributes: parseResourceAttributes(rawEnvAttributes: ProcessInfo.processInfo.environment[otelResourceAttributesEnv]))
27+
public static let resource = Resource(attributes: parseResourceAttributes(rawEnvAttributes: ProcessInfo.processInfo.environment[otelResourceAttributesEnv])).merging(other: Resource())
2828

2929
private init() {}
3030

Sources/OpenTelemetrySdk/Trace/NoopSpanProcessor.swift

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,17 @@
1616
import Foundation
1717
import OpenTelemetryApi
1818

19-
public struct NoopSpanProcessor: SpanProcessor {
20-
public init() {}
19+
struct NoopSpanProcessor: SpanProcessor {
20+
init() {}
2121

22-
public let isStartRequired = false
23-
public let isEndRequired = false
22+
let isStartRequired = false
23+
let isEndRequired = false
2424

25-
public func onStart(parentContext: SpanContext?, span: ReadableSpan) {}
25+
func onStart(parentContext: SpanContext?, span: ReadableSpan) {}
2626

27-
public func onEnd(span: ReadableSpan) {}
27+
func onEnd(span: ReadableSpan) {}
2828

29-
public func shutdown() {}
29+
func shutdown() {}
3030

31-
public func forceFlush() {}
31+
func forceFlush() {}
3232
}

Sources/OpenTelemetrySdk/Trace/TracerProviderSdk.swift

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,19 +20,35 @@ import OpenTelemetryApi
2020
public class TracerProviderSdk: TracerProvider {
2121
private var tracerProvider = [InstrumentationLibraryInfo: TracerSdk]()
2222
internal var sharedState: TracerSharedState
23+
internal static let emptyName = "unknown"
2324

2425
/// Returns a new TracerProviderSdk with default Clock, IdGenerator and Resource.
2526
public init(clock: Clock = MillisClock(),
2627
idGenerator: IdGenerator = RandomIdGenerator(),
27-
resource: Resource = EnvVarResource.resource)
28+
resource: Resource = EnvVarResource.resource,
29+
spanLimits: SpanLimits = SpanLimits(),
30+
sampler: Sampler = Samplers.parentBased(root: Samplers.alwaysOn),
31+
spanProcessors: [SpanProcessor] = [])
2832
{
29-
sharedState = TracerSharedState(clock: clock, idGenerator: idGenerator, resource: resource)
33+
sharedState = TracerSharedState(clock: clock,
34+
idGenerator: idGenerator,
35+
resource: resource,
36+
spanLimits: spanLimits,
37+
sampler: sampler,
38+
spanProcessors: spanProcessors)
3039
}
3140

3241
public func get(instrumentationName: String, instrumentationVersion: String? = nil) -> Tracer {
3342
if sharedState.hasBeenShutdown {
3443
return DefaultTracer.instance
3544
}
45+
46+
var instrumentationName = instrumentationName
47+
if instrumentationName.isEmpty {
48+
// Per the spec, empty is "invalid"
49+
print("Tracer requested without instrumentation name.")
50+
instrumentationName = TracerProviderSdk.emptyName
51+
}
3652
let instrumentationLibraryInfo = InstrumentationLibraryInfo(name: instrumentationName, version: instrumentationVersion ?? "")
3753
if let tracer = tracerProvider[instrumentationLibraryInfo] {
3854
return tracer

Sources/OpenTelemetrySdk/Trace/TracerSharedState.swift

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -21,24 +21,45 @@ class TracerSharedState {
2121
var idGenerator: IdGenerator
2222
var resource: Resource
2323

24-
var sampler: Sampler = ParentBasedSampler(root: Samplers.alwaysOn)
25-
var activeSpanLimits = SpanLimits()
26-
var activeSpanProcessor: SpanProcessor = NoopSpanProcessor()
24+
var activeSpanLimits: SpanLimits
25+
var sampler: Sampler
26+
var activeSpanProcessor: SpanProcessor
2727
var hasBeenShutdown = false
2828

2929
var registeredSpanProcessors = [SpanProcessor]()
3030

31-
init(clock: Clock, idGenerator: IdGenerator, resource: Resource) {
31+
init(clock: Clock,
32+
idGenerator: IdGenerator,
33+
resource: Resource,
34+
spanLimits: SpanLimits,
35+
sampler: Sampler,
36+
spanProcessors: [SpanProcessor])
37+
{
3238
self.clock = clock
3339
self.idGenerator = idGenerator
3440
self.resource = resource
41+
self.activeSpanLimits = spanLimits
42+
self.sampler = sampler
43+
if spanProcessors.count > 1 {
44+
self.activeSpanProcessor = MultiSpanProcessor(spanProcessors: spanProcessors)
45+
registeredSpanProcessors = spanProcessors
46+
} else if spanProcessors.count == 1 {
47+
self.activeSpanProcessor = spanProcessors[0]
48+
registeredSpanProcessors = spanProcessors
49+
} else {
50+
activeSpanProcessor = NoopSpanProcessor()
51+
}
3552
}
3653

3754
/// Adds a new SpanProcessor
3855
/// - Parameter spanProcessor: the new SpanProcessor to be added.
3956
func addSpanProcessor(_ spanProcessor: SpanProcessor) {
4057
registeredSpanProcessors.append(spanProcessor)
41-
activeSpanProcessor = MultiSpanProcessor(spanProcessors: registeredSpanProcessors)
58+
if registeredSpanProcessors.count > 1 {
59+
activeSpanProcessor = MultiSpanProcessor(spanProcessors: registeredSpanProcessors)
60+
} else {
61+
activeSpanProcessor = registeredSpanProcessors[0]
62+
}
4263
}
4364

4465
/// Stops tracing, including shutting down processors and set to true isStopped.

Tests/OpenTelemetrySdkTests/Trace/Export/BatchSpansProcessorTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
//
1515

1616
import OpenTelemetryApi
17-
import OpenTelemetrySdk
17+
@testable import OpenTelemetrySdk
1818
import XCTest
1919

2020
class BatchSpansProcessorTests: XCTestCase {

Tests/OpenTelemetrySdkTests/Trace/Export/SimpleSpansProcessorTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
//
1515

1616
import OpenTelemetryApi
17-
import OpenTelemetrySdk
17+
@testable import OpenTelemetrySdk
1818
import XCTest
1919

2020
class SimpleSpansProcessorTests: XCTestCase {

Tests/OpenTelemetrySdkTests/Trace/NoopSpanProcessorTests.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
// limitations under the License.
1414
//
1515

16-
import OpenTelemetrySdk
16+
@testable import OpenTelemetrySdk
1717
import XCTest
1818

1919
class NoopSpanProcessorTest: XCTestCase {
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
// Copyright 2020, OpenTelemetry Authors
2+
//
3+
// Licensed under the Apache License, Version 2.0 (the "License");
4+
// you may not use this file except in compliance with the License.
5+
// You may obtain a copy of the License at
6+
//
7+
// http://www.apache.org/licenses/LICENSE-2.0
8+
//
9+
// Unless required by applicable law or agreed to in writing, software
10+
// distributed under the License is distributed on an "AS IS" BASIS,
11+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12+
// See the License for the specific language governing permissions and
13+
// limitations under the License.
14+
//
15+
16+
@testable import OpenTelemetrySdk
17+
import XCTest
18+
19+
class TracerProviderSdkTests: XCTestCase {
20+
var tracerProviderSdk = TracerProviderSdk()
21+
22+
func testDefaultGet() {
23+
XCTAssert(tracerProviderSdk.get(instrumentationName: "test") is TracerSdk)
24+
}
25+
26+
func testgGtSameInstanceForSameName_WithoutVersion() {
27+
XCTAssert(tracerProviderSdk.get(instrumentationName: "test") === tracerProviderSdk.get(instrumentationName: "test"))
28+
XCTAssert(tracerProviderSdk.get(instrumentationName: "test") === tracerProviderSdk.get(instrumentationName: "test", instrumentationVersion: nil))
29+
}
30+
31+
func testPropagatesInstrumentationLibraryInfoToTracer() {
32+
let expected = InstrumentationLibraryInfo(name: "theName", version: "theVersion")
33+
let tracer = tracerProviderSdk.get(instrumentationName: expected.name, instrumentationVersion: expected.version) as! TracerSdk
34+
XCTAssertEqual(tracer.instrumentationLibraryInfo, expected)
35+
}
36+
37+
func testGetSameInstanceForSameName_WithVersion() {
38+
XCTAssert(tracerProviderSdk.get(instrumentationName: "test", instrumentationVersion: "version") === tracerProviderSdk.get(instrumentationName: "test", instrumentationVersion: "version"))
39+
}
40+
41+
func testGetWithoutName() {
42+
let tracer = tracerProviderSdk.get(instrumentationName: "") as! TracerSdk
43+
XCTAssertEqual(tracer.instrumentationLibraryInfo.name, TracerProviderSdk.emptyName)
44+
}
45+
}

Tests/OpenTracingShim/SpanShimTests.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@
1414
//
1515

1616
import OpenTelemetryApi
17-
import OpenTelemetrySdk
17+
@testable import OpenTelemetrySdk
1818
@testable import OpenTracingShim
1919
import XCTest
2020

2121
class SpanShimTests: XCTestCase {
22-
let tracerSdkProvider = TracerProviderSdk()
22+
let tracerProviderSdk = TracerProviderSdk()
2323
var tracer: Tracer!
2424
var telemetryInfo: TelemetryInfo!
2525
var span: Span!
@@ -28,7 +28,7 @@ class SpanShimTests: XCTestCase {
2828
let spanName = "Span"
2929

3030
override func setUp() {
31-
tracer = tracerSdkProvider.get(instrumentationName: "SpanShimTest")
31+
tracer = tracerProviderSdk.get(instrumentationName: "SpanShimTest")
3232
telemetryInfo = TelemetryInfo(tracer: tracer, baggageManager: OpenTelemetrySDK.instance.baggageManager, propagators: OpenTelemetrySDK.instance.propagators)
3333
span = tracer.spanBuilder(spanName: spanName).startSpan()
3434
tracerShim = TracerShim(telemetryInfo: telemetryInfo)

0 commit comments

Comments
 (0)