Skip to content

Commit f817d11

Browse files
author
Ignacio Bonafonte
authored
Datadog Exporter: Minor improvements and new example (#74)
* Datadog Exporter: * Use a non default source for logs * Improve error encoding, now we use Opentelemetry status instead of a boolean attribute * Add a simple datadog example where configuration of exporter is shown * Fix Datadog exporter tests
1 parent 2c997b6 commit f817d11

File tree

6 files changed

+98
-35
lines changed

6 files changed

+98
-35
lines changed

Examples/Datadog Sample/README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
### Datadog sample
2+
3+
This example shows the Datadog exporter used with a Simple Exporter, showing how to configure for sending.
4+
5+
User must write the clientKey for Datadog at the begining of code.
6+
7+

Examples/Datadog Sample/main.swift

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
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+
import DatadogExporter
17+
import Foundation
18+
import OpenTelemetrySdk
19+
import OpenTelemetryApi
20+
21+
22+
let clientKey = ""
23+
24+
let sampleKey = "sampleKey"
25+
let sampleValue = "sampleValue"
26+
27+
let instrumentationLibraryName = "DatadogExporter"
28+
let instrumentationLibraryVersion = "semver:0.1.0"
29+
var instrumentationLibraryInfo = InstrumentationLibraryInfo(name: instrumentationLibraryName, version: instrumentationLibraryVersion)
30+
31+
var tracer: TracerSdk
32+
tracer = OpenTelemetrySDK.instance.tracerProvider.get(instrumentationName: instrumentationLibraryName, instrumentationVersion: instrumentationLibraryVersion) as! TracerSdk
33+
34+
func simpleSpan() {
35+
let span = tracer.spanBuilder(spanName: "SimpleSpan").setSpanKind(spanKind: .client).startSpan()
36+
span.setAttribute(key: sampleKey, value: sampleValue)
37+
span.addEvent(name: "My event", attributes: ["message": AttributeValue.string("test message")])
38+
span.end()
39+
}
40+
41+
func childSpan() {
42+
let span = tracer.spanBuilder(spanName: "parentSpan").setSpanKind(spanKind: .client).startSpan()
43+
span.setAttribute(key: sampleKey, value: sampleValue)
44+
do {
45+
var scope = tracer.withSpan(span)
46+
let childSpan = tracer.spanBuilder(spanName: "childSpan").setSpanKind(spanKind: .client).startSpan()
47+
do {
48+
var childScope = tracer.withSpan(childSpan)
49+
childSpan.setAttribute(key: sampleKey, value: sampleValue)
50+
childScope.close()
51+
}
52+
childSpan.end()
53+
scope.close()
54+
}
55+
span.end()
56+
}
57+
58+
let exporterConfiguration = ExporterConfiguration(
59+
serviceName: "Otel exporter Example",
60+
resource: "OTel exporter",
61+
applicationName: "SimpleExample",
62+
applicationVersion: "0.0.1",
63+
environment: "test",
64+
clientToken: clientKey,
65+
endpoint: Endpoint.us,
66+
uploadCondition: { true },
67+
performancePreset: .instantDataDelivery
68+
)
69+
70+
let datadogExporter = try! DatadogExporter(config: exporterConfiguration)
71+
72+
var spanProcessor = SimpleSpanProcessor(spanExporter: datadogExporter)
73+
OpenTelemetrySDK.instance.tracerProvider.addSpanProcessor(spanProcessor)
74+
75+
simpleSpan()
76+
childSpan()
77+
spanProcessor.shutdown()
78+
79+
sleep(10)

Package.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,5 +63,6 @@ let package = Package(
6363
.target( name: "LoggingTracer", dependencies: ["OpenTelemetryApi"], path: "Examples/Logging Tracer"),
6464
.target( name: "SimpleExporter", dependencies: ["OpenTelemetrySdk", "JaegerExporter", "StdoutExporter", "ZipkinExporter"], path: "Examples/Simple Exporter"),
6565
.target( name: "PrometheusSample", dependencies: ["OpenTelemetrySdk", "PrometheusExporter"], path: "Examples/Prometheus Sample"),
66+
.target( name: "DatadogSample", dependencies: ["DatadogExporter"], path: "Examples/Datadog Sample"),
6667
]
6768
)

Sources/Exporters/DatadogExporter/Logs/LogsExporter.swift

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ internal class LogsExporter {
4141

4242
let filesOrchestrator = FilesOrchestrator(
4343
directory: try Directory(withSubdirectoryPath: logsDirectory),
44-
performance: configuration.performancePreset,
44+
performance: configuration.performancePreset,
4545
dateProvider: SystemDateProvider()
4646
)
4747

@@ -64,6 +64,7 @@ internal class LogsExporter {
6464
let urlProvider = UploadURLProvider(
6565
urlWithClientToken: try configuration.endpoint.logsUrlWithClientToken(clientToken: configuration.clientToken),
6666
queryItemProviders: [
67+
.ddsource(),
6768
.batchTime(using: SystemDateProvider())
6869
]
6970
)

Sources/Exporters/DatadogExporter/Spans/SpanEncoder.swift

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,7 @@ import OpenTelemetryApi
1818
import OpenTelemetrySdk
1919

2020
internal struct Constants {
21-
#if os(iOS)
2221
static let ddsource = "ios"
23-
#elseif os(tvOS)
24-
static let ddsource = "tvos"
25-
#elseif os(watchOS)
26-
static let ddsource = "watchos"
27-
#else
28-
static let ddsource = "macos"
29-
#endif
3022
}
3123

3224
/// `SpanEnvelope` allows encoding multiple spans sharing the same `traceID` to a single payload.
@@ -103,21 +95,16 @@ internal struct DDSpan: Encodable {
10395
self.startTime = spanData.startEpochNanos
10496
self.duration = spanData.endEpochNanos - spanData.startEpochNanos
10597

106-
if spanData.attributes["error"] != nil {
107-
self.error = true
108-
self.errorMessage = spanData.attributes["error.message"]?.description
109-
self.errorType = spanData.attributes["error.type"]?.description
110-
self.errorStack = spanData.attributes["error.stack"]?.description
111-
} else if !(spanData.status?.isOk ?? false) {
112-
self.error = true
113-
self.errorMessage = spanData.status?.description ?? "error"
114-
self.errorType = spanData.status?.description ?? "error"
115-
self.errorStack = nil
116-
} else {
98+
if spanData.status?.isOk ?? true {
11799
self.error = false
118100
self.errorMessage = nil
119101
self.errorType = nil
120102
self.errorStack = nil
103+
} else {
104+
self.error = true
105+
self.errorType = spanData.attributes["error.type"]?.description ?? spanData.status?.description
106+
self.errorMessage = spanData.attributes["error.message"]?.description
107+
self.errorStack = spanData.attributes["error.stack"]?.description
121108
}
122109

123110
let spanType = spanData.attributes["type"] ?? spanData.attributes["db.type"]

Tests/ExportersTests/DatadogExporter/Upload/DataUploaderTests.swift

Lines changed: 3 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,23 +17,11 @@
1717
import XCTest
1818

1919
class DataUploadURLProviderTests: XCTestCase {
20-
let platform: String = {
21-
#if os(iOS)
22-
return "ios"
23-
#elseif os(tvOS)
24-
return "tvos"
25-
#elseif os(watchOS)
26-
return "watchos"
27-
#else
28-
return "macos"
29-
#endif
30-
}()
31-
3220
func testDDSourceQueryItem() {
3321
let item: UploadURLProvider.QueryItemProvider = .ddsource()
3422

3523
XCTAssertEqual(item.value().name, "ddsource")
36-
XCTAssertEqual(item.value().value, platform)
24+
XCTAssertEqual(item.value().value, "ios")
3725
}
3826

3927
func testBatchTimeQueryItem() {
@@ -63,9 +51,9 @@ class DataUploadURLProviderTests: XCTestCase {
6351
queryItemProviders: [.ddsource(), .batchTime(using: dateProvider)]
6452
)
6553

66-
XCTAssertEqual(urlProvider.url, URL(string: "https://api.example.com/v1/endpoint/abc?ddsource=\(platform)&batch_time=1576404000000"))
54+
XCTAssertEqual(urlProvider.url, URL(string: "https://api.example.com/v1/endpoint/abc?ddsource=ios&batch_time=1576404000000"))
6755
dateProvider.advance(bySeconds: 9.999)
68-
XCTAssertEqual(urlProvider.url, URL(string: "https://api.example.com/v1/endpoint/abc?ddsource=\(platform)&batch_time=1576404009999"))
56+
XCTAssertEqual(urlProvider.url, URL(string: "https://api.example.com/v1/endpoint/abc?ddsource=ios&batch_time=1576404009999"))
6957
}
7058
}
7159

0 commit comments

Comments
 (0)