Skip to content

Commit cbf6d05

Browse files
author
Nacho Bonafonte
committed
Merge branch 'main' into metric-refresh-2
# Conflicts: # Sources/Exporters/OpenTelemetryProtocolCommon/metric/MetricsAdapter.swift
2 parents 16b3fd3 + f0bdf86 commit cbf6d05

File tree

113 files changed

+3795
-1279
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

113 files changed

+3795
-1279
lines changed

.github/workflows/BuildAndTest.yml

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,8 @@ name: Build and Test
33
on: [push, pull_request, workflow_dispatch]
44

55
jobs:
6-
build:
7-
6+
macOS:
87
runs-on: macOS-latest
9-
108
steps:
119
- uses: actions/checkout@v2
1210
- name: Build and Test for macOS
@@ -17,9 +15,23 @@ jobs:
1715
chmod +x codecov
1816
xcrun llvm-cov export -ignore-filename-regex="pb\.swift|grpc\.swift" -format="lcov" .build/debug/opentelemetry-swiftPackageTests.xctest/Contents/MacOS/opentelemetry-swiftPackageTests -instr-profile .build/debug/codecov/default.profdata > .build/debug/codecov/coverage_report.lcov
1917
./codecov -f .build/debug/codecov/coverage_report.lcov
18+
iOS:
19+
runs-on: macOS-latest
20+
steps:
21+
- uses: actions/checkout@v2
2022
- name: Install Homebrew kegs
2123
run: make setup_brew
2224
- name: Build for iOS
2325
run: make build_for_testing_ios
2426
- name: Test for iOS
2527
run: make test_without_building_ios
28+
watchOS:
29+
runs-on: macOS-latest
30+
steps:
31+
- uses: actions/checkout@v2
32+
- name: Install Homebrew kegs
33+
run: make setup_brew
34+
- name: Build for watchOS
35+
run: make build_for_testing_watchos
36+
- name: Test for watchOS
37+
run: make test_without_building_watchos

CODEOWNERS

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@
1717
# Approvers: @bryce-b @vvydier
1818

1919

20-
* @SergeyKanzhelev @nachoBonafonte @bryce-b @vvydier
20+
* @nachoBonafonte @bryce-b @vvydier
2121

22-
CODEOWNERS @SergeyKanzhelev @nachoBonafonte
22+
CODEOWNERS @nachoBonafonte

Examples/Datadog Sample/main.swift

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,12 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6+
#if os(macOS)
7+
68
import DatadogExporter
79
import Foundation
810
import OpenTelemetryApi
911
import OpenTelemetrySdk
10-
#if !os(macOS)
11-
import UIKit
12-
#endif
1312

1413
let apikeyOrClientToken = ""
1514

@@ -25,11 +24,7 @@ let instrumentationScopeVersion = "semver:0.1.0"
2524
var tracer: Tracer
2625
tracer = OpenTelemetry.instance.tracerProvider.get(instrumentationName: instrumentationScopeName, instrumentationVersion: instrumentationScopeVersion)
2726

28-
#if os(macOS)
2927
let hostName = Host.current().localizedName
30-
#else
31-
let hostName = UIDevice.current.name
32-
#endif
3328

3429
let exporterConfiguration = ExporterConfiguration(
3530
serviceName: "Opentelemetry exporter Example",
@@ -120,3 +115,5 @@ func testMetrics() {
120115
sleep(1)
121116
}
122117
}
118+
119+
#endif

Examples/OTLP Exporter/main.swift

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,14 @@
33
* SPDX-License-Identifier: Apache-2.0
44
*/
55

6+
#if os(macOS)
7+
68
import Foundation
79
import GRPC
810
import NIO
911
import NIOSSL
1012
import OpenTelemetryApi
11-
import OpenTelemetryProtocolExporter
13+
import OpenTelemetryProtocolExporterGrpc
1214
import OpenTelemetrySdk
1315
import ResourceExtension
1416
import SignPostIntegration
@@ -87,6 +89,8 @@ let meterProvider = MeterProviderSdk(metricProcessor: processor, metricExporter:
8789
OpenTelemetry.registerMeterProvider(meterProvider: meterProvider)
8890

8991

92+
let labels1 = ["dim1": "value1"]
93+
9094
var meter = meterProvider.get(instrumentationName: "otlp_example_meter'")
9195
var exampleCounter = meter.createIntCounter(name: "otlp_example_counter")
9296
var exampleMeasure = meter.createIntMeasure(name: "otlp_example_measure")
@@ -98,11 +102,9 @@ var exampleObserver = meter.createIntObserver(name: "otlp_example_observation")
98102
task_info(mach_task_self_, task_flavor_t(MACH_TASK_BASIC_INFO), $0, &count)
99103
}
100104
}
101-
labels1 = ["dim1": "value1"]
102105
observer.observe(value: Int(taskInfo.resident_size), labels: labels1)
103106
}
104107

105-
var labels1 = ["dim1": "value1"]
106108
for _ in 1...3000 {
107109
exampleCounter.add(value: 1, labelset: meter.getLabelSet(labels: labels1))
108110
exampleMeasure.record(value: 100, labelset: meter.getLabelSet(labels: labels1))
@@ -111,3 +113,5 @@ for _ in 1...3000 {
111113
exampleMeasure.record(value: 750, labelset: meter.getLabelSet(labels: labels1))
112114
sleep(1)
113115
}
116+
117+
#endif
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
### OTLP Exporter Example
2+
3+
This example shows how to use [OTLP HTTP Exporter](https://github.com/open-telemetry/opentelemetry-swift/tree/main/Sources/Exporters/OpenTelemetryProtocol) to instrument a simple Swift application.
4+
5+
This example will export spans data using [OTLP HTTP Exporter ](https://github.com/open-telemetry/opentelemetry-swift/tree/main/Sources/Exporters/OpenTelemetryProtocol). It will use [proto format](https://github.com/open-telemetry/opentelemetry-proto).
6+
7+
8+
## Run the Application
9+
10+
1. Run docker: This will start otel-collector, Zipkin and Prometheus
11+
12+
```shell script
13+
# from this directory
14+
docker-compose up
15+
```
16+
17+
2. Run app
18+
19+
```shell script
20+
# from this directory
21+
swift run OTLPHTTPExporter
22+
```
23+
24+
3. Teardown the docker images
25+
26+
```shell script
27+
# from this directory
28+
docker-compose down
29+
```
30+
31+
4. Open page at <http://localhost:9411/zipkin/> - you should be able to see the spans in zipkin
32+
![Screenshot of the running example](images/zipkin-spans.png)
33+
34+
### Prometheus UI
35+
36+
The prometheus client will be available at <http://localhost:9090>.
37+
38+
Note: It may take some time for the application metrics to appear on the Prometheus dashboard.
39+
![Screenshot of the running example](images/prometheus-metrics.png)
40+
41+
5. If you don't set service.name as per https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/sdk-environment-variables.md the default name of the service and spans generate by the OTLP Exporter is `unknown_service:otlpexporter` You can either set the service.name by editing the schema in Xcode and the set the environment variable for OTEL_RESOURCE_ATTRIBUTES, or set it via command line:
42+
43+
```shell script
44+
# from this directory
45+
OTEL_RESOURCE_ATTRIBUTES="service.name=my-swift-app,service.version=v1.2.3" swift run OTLPExporter
46+
```
47+
This will create a service and spans with the name `my-swift-app`
48+
49+
## Useful links
50+
51+
- For more information on OpenTelemetry, visit: <https://opentelemetry.io/>
52+
- For more information on trace, visit: <https://github.com/open-telemetry/opentelemetry-swift/tree/main/Sources/OpenTelemetrySdk/Trace>
53+
- For more information on metrics, visit: <https://github.com/open-telemetry/opentelemetry-swift/tree/main/Sources/OpenTelemetrySdk/Metrics>
54+
55+
## LICENSE
56+
57+
Apache License 2.0
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
receivers:
2+
otlp:
3+
protocols:
4+
grpc:
5+
http:
6+
cors:
7+
allowed_origins:
8+
- http://*
9+
- https://*
10+
11+
exporters:
12+
zipkin:
13+
endpoint: "http://zipkin-all-in-one:9411/api/v2/spans"
14+
prometheus:
15+
endpoint: "0.0.0.0:9464"
16+
17+
processors:
18+
resource:
19+
attributes:
20+
- key: service.name
21+
value: OTLP Exporter
22+
action: insert
23+
batch:
24+
25+
service:
26+
telemetry:
27+
logs:
28+
level: "debug"
29+
pipelines:
30+
traces:
31+
receivers: [otlp]
32+
exporters: [zipkin]
33+
processors: [resource, batch]
34+
metrics:
35+
receivers: [otlp]
36+
exporters: [prometheus]
37+
processors: [resource, batch]
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
version: "3"
2+
services:
3+
# Collector
4+
collector:
5+
image: otel/opentelemetry-collector:latest
6+
# The latest image of the otel-collector may not work, so specifying the version that works with this release
7+
# image: otel/opentelemetry-collector:latest
8+
command: ["--config=/conf/collector-config.yaml"]
9+
volumes:
10+
- ./collector-config.yaml:/conf/collector-config.yaml
11+
ports:
12+
- "9464:9464"
13+
- "4317:4317"
14+
- "4318:4318"
15+
- "55681:55681"
16+
depends_on:
17+
- zipkin-all-in-one
18+
19+
# Zipkin
20+
zipkin-all-in-one:
21+
image: openzipkin/zipkin:latest
22+
ports:
23+
- "9411:9411"
24+
25+
# Prometheus
26+
prometheus:
27+
container_name: prometheus
28+
image: prom/prometheus:latest
29+
volumes:
30+
- ./prometheus.yaml:/etc/prometheus/prometheus.yml
31+
ports:
32+
- "9090:9090"
33+
# - "9184:9184"
472 KB
Loading
567 KB
Loading
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
#if os(macOS)
7+
8+
import Foundation
9+
import OpenTelemetryApi
10+
import OpenTelemetryProtocolExporterHttp
11+
import OpenTelemetrySdk
12+
import ResourceExtension
13+
import SignPostIntegration
14+
import StdoutExporter
15+
import ZipkinExporter
16+
17+
let sampleKey = "sampleKey"
18+
let sampleValue = "sampleValue"
19+
20+
var resources = DefaultResources().get()
21+
22+
let instrumentationScopeName = "OTLPHTTPExporter"
23+
let instrumentationScopeVersion = "semver:0.1.0"
24+
25+
let otlpHttpTraceExporter = OtlpHttpTraceExporter()
26+
let stdoutExporter = StdoutExporter()
27+
let spanExporter = MultiSpanExporter(spanExporters: [otlpHttpTraceExporter, stdoutExporter])
28+
29+
let spanProcessor = SimpleSpanProcessor(spanExporter: spanExporter)
30+
OpenTelemetry.registerTracerProvider(tracerProvider:
31+
TracerProviderBuilder()
32+
.add(spanProcessor: spanProcessor)
33+
.build()
34+
)
35+
36+
let tracer = OpenTelemetry.instance.tracerProvider.get(instrumentationName: instrumentationScopeName, instrumentationVersion: instrumentationScopeVersion)
37+
38+
if #available(macOS 10.14, *), #available(iOS 12.0, *) {
39+
let tracerProviderSDK = OpenTelemetry.instance.tracerProvider as? TracerProviderSdk
40+
tracerProviderSDK?.addSpanProcessor(SignPostIntegration())
41+
}
42+
43+
func createSpans() {
44+
let parentSpan1 = tracer.spanBuilder(spanName: "Main").setSpanKind(spanKind: .client).startSpan()
45+
parentSpan1.setAttribute(key: sampleKey, value: sampleValue)
46+
OpenTelemetry.instance.contextProvider.setActiveSpan(parentSpan1)
47+
for _ in 1...3 {
48+
doWork()
49+
}
50+
Thread.sleep(forTimeInterval: 0.5)
51+
52+
let parentSpan2 = tracer.spanBuilder(spanName: "Another").setSpanKind(spanKind: .client).setActive(true).startSpan()
53+
parentSpan2.setAttribute(key: sampleKey, value: sampleValue)
54+
// do more Work
55+
for _ in 1...3 {
56+
doWork()
57+
}
58+
Thread.sleep(forTimeInterval: 0.5)
59+
60+
parentSpan2.end()
61+
parentSpan1.end()
62+
}
63+
64+
func doWork() {
65+
let childSpan = tracer.spanBuilder(spanName: "doWork").setSpanKind(spanKind: .client).startSpan()
66+
childSpan.setAttribute(key: sampleKey, value: sampleValue)
67+
Thread.sleep(forTimeInterval: Double.random(in: 0 ..< 10) / 100)
68+
childSpan.end()
69+
}
70+
71+
// Create a Parent span (Main) and do some Work (child Spans). Repeat for another Span.
72+
createSpans()
73+
74+
// Metrics
75+
let otlpHttpMetricExporter = OtlpHttpMetricExporter()
76+
let processor = MetricProcessorSdk()
77+
let meterProvider = MeterProviderSdk(metricProcessor: processor, metricExporter: otlpHttpMetricExporter, metricPushInterval: 0.1)
78+
79+
OpenTelemetry.registerMeterProvider(meterProvider: meterProvider)
80+
81+
82+
var meter = meterProvider.get(instrumentationName: "otlp_example_meter'")
83+
var exampleCounter = meter.createIntCounter(name: "otlp_example_counter")
84+
var exampleMeasure = meter.createIntMeasure(name: "otlp_example_measure")
85+
var exampleObserver = meter.createIntObserver(name: "otlp_example_observation") { observer in
86+
var taskInfo = mach_task_basic_info()
87+
var count = mach_msg_type_number_t(MemoryLayout<mach_task_basic_info>.size) / 4
88+
let _: kern_return_t = withUnsafeMutablePointer(to: &taskInfo) {
89+
$0.withMemoryRebound(to: integer_t.self, capacity: 1) {
90+
task_info(mach_task_self_, task_flavor_t(MACH_TASK_BASIC_INFO), $0, &count)
91+
}
92+
}
93+
labels1 = ["dim1": "value1"]
94+
observer.observe(value: Int(taskInfo.resident_size), labels: labels1)
95+
}
96+
97+
var labels1 = ["dim1": "value1"]
98+
for _ in 1...3000 {
99+
exampleCounter.add(value: 1, labelset: meter.getLabelSet(labels: labels1))
100+
exampleMeasure.record(value: 100, labelset: meter.getLabelSet(labels: labels1))
101+
exampleMeasure.record(value: 500, labelset: meter.getLabelSet(labels: labels1))
102+
exampleMeasure.record(value: 5, labelset: meter.getLabelSet(labels: labels1))
103+
exampleMeasure.record(value: 750, labelset: meter.getLabelSet(labels: labels1))
104+
sleep(1)
105+
}
106+
107+
#endif

0 commit comments

Comments
 (0)