Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release 2.1.0 #1424

Merged
merged 40 commits into from
Aug 18, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
6663421
Fix read_sdk_version
maxep Jul 31, 2023
80d99af
Publish DatadogAlamofireExtension
maxep Aug 1, 2023
a09e0bc
Merge pull request #1401 from DataDog/release/2.0.0
ncreated Aug 2, 2023
4a40a88
RUMS-1778 Do not propagate Error and Long Task attributes to the View
fuzzybinary Jul 27, 2023
c16a514
RUMS-1778 Fix changelog and test
fuzzybinary Aug 2, 2023
5d5c1f1
Merge pull request #1397 from DataDog/jward/view-attribute-propigation
fuzzybinary Aug 3, 2023
b26903a
Update PLCrashReporter to 1.11.1
maciejburda Aug 11, 2023
e531d22
Remove ruby version
maciejburda Aug 11, 2023
11a6e49
Merge pull request #1409 from DataDog/update-dependencies
maciejburda Aug 11, 2023
b568a96
RUMM-3450 feat: include session_sample_rate as part of _dd.configurat…
ganeshnj Aug 11, 2023
2708080
Merge pull request #1410 from DataDog/ganeshnj/feat/RUMM-3450-sample-…
ganeshnj Aug 16, 2023
83cb84c
RUMM-3509 Group SDK context-related tests together
ncreated Aug 11, 2023
19f36ba
RUMM-3509 Fix the problem of registering custom SDK instance
ncreated Aug 11, 2023
009b083
RUMM-3509 Enable `HTTPClient` mocking
ncreated Aug 11, 2023
98bf1d7
RUMM-3509 Replace hardcoded strings with constants in `DatadogCoreTests`
ncreated Aug 12, 2023
cf1fcaa
RUMM-3509 Add integration unit test for multiple SDK instances usage
ncreated Aug 12, 2023
95bb964
RUMM-3509 Use less mocks in `DataUploaderWorkerTests`
ncreated Aug 14, 2023
880007f
RUMM-3509 Cleanup
ncreated Aug 14, 2023
f80629c
RUMM-3509 Update CHANGELOG.md
ncreated Aug 14, 2023
ebc1c7a
Bump gitpython from 3.1.29 to 3.1.32 in /tools/distribution
dependabot[bot] Aug 16, 2023
de5d45b
Merge pull request #1414 from DataDog/dependabot/pip/tools/distributi…
ganeshnj Aug 16, 2023
4a62a8c
Merge pull request #1413 from DataDog/ncreated/RUMM-3509/fix-support-…
ncreated Aug 16, 2023
480be64
RUMM-3374 Rename `samplingRate` to `sampleRate` in `HTTPHeadersWriter…
ncreated Aug 14, 2023
d8c9ea0
RUMM-3374 Export `HTTPHeaderWriters` to `DatadogTrace` public API
ncreated Aug 14, 2023
46ab87c
RUMM-3374 Add debug utility for testing manual trace injection
ncreated Aug 16, 2023
1518ece
RUMM-3374 Improve doc comments for trace propagation APIs
ncreated Aug 16, 2023
3afe2ea
RUMM-3374 Update CHANGELOG.md
ncreated Aug 16, 2023
34b6664
REPLAY-1965 Fix AP1 intake url for SR
ncreated Aug 17, 2023
f53c5a3
REPLAY-1965 Update CHANGELOG.md
ncreated Aug 17, 2023
caba33d
REPLAY-1936 add objective-c interface
maxep Aug 17, 2023
2a50817
Update CHANGELOG.md
maxep Aug 17, 2023
1bb2566
REPLAY-1936 fix access levels
maxep Aug 17, 2023
4a3819c
RUMM-3374 Deprecate `OTelHTTPHeaders*` by renaming to `B3HTTPHeaders*`
ncreated Aug 18, 2023
cbb720c
Merge pull request #1419 from DataDog/maxep/REPLAY-1936/sr-objc-2
maxep Aug 18, 2023
3203401
Merge branch 'develop' into ncreated/REPLAY-1965/fix-sr-url-for-ap1-dc
ncreated Aug 18, 2023
599f27a
Merge branch 'develop' into ncreated/RUMM-3374/fix-manual-trace-injec…
ncreated Aug 18, 2023
e21b0f5
Merge pull request #1418 from DataDog/ncreated/REPLAY-1965/fix-sr-url…
ncreated Aug 18, 2023
99dbb48
Merge branch 'develop' into ncreated/RUMM-3374/fix-manual-trace-injec…
ncreated Aug 18, 2023
12a92d3
Merge pull request #1415 from DataDog/ncreated/RUMM-3374/fix-manual-t…
ncreated Aug 18, 2023
181d770
Bumped version to 2.1.0
ncreated Aug 18, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion .ruby-version

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class DataUploaderBenchmarkTests: BenchmarkTests {
/// `DataUploader` leaves no memory footprint (the memory peak after upload is less or equal `0kB`).
func testUploadingDataToServer_leavesNoMemoryFootprint() throws {
let dataUploader = DataUploader(
httpClient: HTTPClient(),
httpClient: URLSessionClient(),
requestBuilder: FeatureRequestBuilderMock()
)

Expand Down
13 changes: 13 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,13 @@
# Unreleased

- [BUGFIX] Manual trace injection APIs are not available in DatadogTrace. See [#1415][].
- [BUGFIX] Fix session replay uploads to AP1 site. See [#1418][].
- [BUGFIX] Allow instantiating custom instance of the SDK after default one. See [#1413][].
- [BUGFIX] Do not propagate attributes from Errors and LongTasks to Views.
- [IMPROVEMENT] Upgrade to PLCrashReporter 1.11.1.
- [FEATURE] Report session sample rate to the backend with RUM events. See [#1410][]
- [IMPROVEMENT] Expose Session Replay to Objective-C. see [#1419][]

# 2.0.0 / 31-07-2023

Release `2.0` introduces breaking changes. Follow the [Migration Guide](MIGRATION.md) to upgrade from `1.x` versions.
Expand Down Expand Up @@ -488,6 +496,11 @@ Release `2.0` introduces breaking changes. Follow the [Migration Guide](MIGRATIO
[#1331]: https://github.com/DataDog/dd-sdk-ios/pull/1331
[#1328]: https://github.com/DataDog/dd-sdk-ios/pull/1328
[#1355]: https://github.com/DataDog/dd-sdk-ios/pull/1355
[#1410]: https://github.com/DataDog/dd-sdk-ios/pull/1410
[#1413]: https://github.com/DataDog/dd-sdk-ios/pull/1413
[#1415]: https://github.com/DataDog/dd-sdk-ios/pull/1415
[#1418]: https://github.com/DataDog/dd-sdk-ios/pull/1418
[#1419]: https://github.com/DataDog/dd-sdk-ios/pull/1419
[@00fa9a]: https://github.com/00FA9A
[@britton-earnin]: https://github.com/Britton-Earnin
[@hengyu]: https://github.com/Hengyu
Expand Down
2 changes: 1 addition & 1 deletion Cartfile
Original file line number Diff line number Diff line change
@@ -1 +1 @@
github "microsoft/plcrashreporter" ~> 1.11.0
github "microsoft/plcrashreporter" ~> 1.11.1
2 changes: 1 addition & 1 deletion Cartfile.resolved
Original file line number Diff line number Diff line change
@@ -1 +1 @@
github "microsoft/plcrashreporter" "1.11.0"
github "microsoft/plcrashreporter" "1.11.1"
295 changes: 159 additions & 136 deletions Datadog/Datadog.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion Datadog/E2ETests/Tracing/TracerE2ETests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
*/

import DatadogCore
import DatadogInternal
import DatadogTrace

class TracerE2ETests: E2ETests {
Expand Down
54 changes: 51 additions & 3 deletions Datadog/Example/Base.lproj/Main iOS.storyboard
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="19455" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="gra-d4-cht">
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="gra-d4-cht">
<device id="retina6_1" orientation="portrait" appearance="light"/>
<dependencies>
<deployment identifier="iOS"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="19454"/>
<plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21679"/>
<capability name="Safe area layout guides" minToolsVersion="9.0"/>
<capability name="System colors in document resources" minToolsVersion="11.0"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
Expand Down Expand Up @@ -65,8 +65,28 @@
<segue destination="FaI-gu-eql" kind="show" id="ePB-Ph-XzE"/>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="M3j-VO-N1P" style="IBUITableViewCellStyleDefault" id="F5A-gJ-7Vm">
<rect key="frame" x="0.0" y="137" width="414" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="F5A-gJ-7Vm" id="Y3A-pt-TCA">
<rect key="frame" x="0.0" y="0.0" width="414" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<label opaque="NO" multipleTouchEnabled="YES" contentMode="left" insetsLayoutMarginsFromSafeArea="NO" text="Trace Injection (manual)" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" id="M3j-VO-N1P">
<rect key="frame" x="20" y="0.0" width="374" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<fontDescription key="fontDescription" style="UICTFontTextStyleSubhead"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
</tableViewCellContentView>
<connections>
<segue destination="1Dj-vX-hFb" kind="show" id="IrQ-UG-cMw"/>
</connections>
</tableViewCell>
<tableViewCell clipsSubviews="YES" contentMode="scaleToFill" preservesSuperviewLayoutMargins="YES" selectionStyle="default" indentationWidth="10" textLabel="yCu-pq-IYL" style="IBUITableViewCellStyleDefault" id="3G8-Wa-fSQ">
<rect key="frame" x="0.0" y="131.5" width="414" height="43.5"/>
<rect key="frame" x="0.0" y="180.5" width="414" height="43.5"/>
<autoresizingMask key="autoresizingMask"/>
<tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" preservesSuperviewLayoutMargins="YES" insetsLayoutMarginsFromSafeArea="NO" tableViewCell="3G8-Wa-fSQ" id="7IJ-XI-RAR">
<rect key="frame" x="0.0" y="0.0" width="414" height="43.5"/>
Expand Down Expand Up @@ -1662,6 +1682,34 @@
</objects>
<point key="canvasLocation" x="1419" y="1175"/>
</scene>
<!--Debug Manual Trace Injection View Controller-->
<scene sceneID="d34-e7-Qn8">
<objects>
<viewController id="1Dj-vX-hFb" customClass="DebugManualTraceInjectionViewController" customModule="Example" customModuleProvider="target" sceneMemberID="viewController">
<view key="view" contentMode="scaleToFill" id="h6o-Ng-hRs">
<rect key="frame" x="0.0" y="0.0" width="414" height="896"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<label opaque="NO" userInteractionEnabled="NO" contentMode="left" horizontalHuggingPriority="251" verticalHuggingPriority="251" text="This screen requires iO14+" textAlignment="natural" lineBreakMode="tailTruncation" baselineAdjustment="alignBaselines" adjustsFontSizeToFit="NO" translatesAutoresizingMaskIntoConstraints="NO" id="pe0-Ro-rxm">
<rect key="frame" x="105" y="437.5" width="204" height="21"/>
<fontDescription key="fontDescription" type="system" pointSize="17"/>
<nil key="textColor"/>
<nil key="highlightedColor"/>
</label>
</subviews>
<viewLayoutGuide key="safeArea" id="LmF-Gg-KKf"/>
<color key="backgroundColor" systemColor="systemBackgroundColor"/>
<constraints>
<constraint firstItem="pe0-Ro-rxm" firstAttribute="centerX" secondItem="h6o-Ng-hRs" secondAttribute="centerX" id="WU4-aG-e4N"/>
<constraint firstItem="pe0-Ro-rxm" firstAttribute="centerY" secondItem="h6o-Ng-hRs" secondAttribute="centerY" id="cB7-WP-Qma"/>
</constraints>
</view>
<navigationItem key="navigationItem" id="yjy-W3-IxO"/>
</viewController>
<placeholder placeholderIdentifier="IBFirstResponder" id="R6e-tl-J7Q" userLabel="First Responder" customClass="UIResponder" sceneMemberID="firstResponder"/>
</objects>
<point key="canvasLocation" x="2201" y="1175"/>
</scene>
</scenes>
<resources>
<systemColor name="secondaryLabelColor">
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,153 @@
/*
* Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
* This product includes software developed at Datadog (https://www.datadoghq.com/).
* Copyright 2019-Present Datadog, Inc.
*/

import SwiftUI
import DatadogTrace

@available(iOS 14, *)
internal class DebugManualTraceInjectionViewController: UIHostingController<DebugManualTraceInjectionView> {
required init?(coder aDecoder: NSCoder) {
super.init(coder: aDecoder, rootView: DebugManualTraceInjectionView())
}
}

private var currentSession: URLSession? = nil

@available(iOS 14.0, *)
internal struct DebugManualTraceInjectionView: View {
enum TraceHeaderType: String, CaseIterable {
case datadog = "Datadog"
case w3c = "W3C"
case b3Single = "B3-Single"
case b3Multiple = "B3-Multiple"
}

@State private var spanName = "network request"
@State private var requestURL = "http://127.0.0.1:8000"
@State private var selectedTraceHeaderType: TraceHeaderType = .datadog
@State private var sampleRate: Float = 100.0
@State private var isRequestPending = false

private let session: URLSession = URLSession(
configuration: .ephemeral,
delegate: DDURLSessionDelegate(),
delegateQueue: nil
)

var body: some View {
let isButtonDisabled = isRequestPending || spanName.isEmpty || requestURL.isEmpty

VStack() {
VStack(spacing: 8) {
Text("Trace injection")
.font(.caption.weight(.bold))
.frame(maxWidth: .infinity, alignment: .leading)

Text("After tapping \"SEND REQUEST\", a POST request will be sent to the given URL. The request will be traced using the chosen tracing header type and sample rate. A span with specified name will be sent to Datadog.")
.font(.caption.weight(.light))
.frame(maxWidth: .infinity, alignment: .leading)
}
.padding()

Form {
Section(header: Text("Traced URL:")) {
TextField("", text: $requestURL)
}
Section(header: Text("Span name:")) {
TextField("", text: $spanName)
}
Picker("Trace header type:", selection: $selectedTraceHeaderType) {
ForEach(TraceHeaderType.allCases, id: \.self) { headerType in
Text(headerType.rawValue)
}
}
.pickerStyle(.inline)
Section(header: Text("Trace sample Rate")) {
Slider(
value: $sampleRate,
in: 0...100, step: 1,
minimumValueLabel: Text("0"),
maximumValueLabel: Text("100")
) {
Text("Sample Rate")
}
}
}

Spacer()

Button(action: { prepareAndSendRequest() }) {
Text("SEND REQUEST")
.fontWeight(.bold)
.foregroundColor(.white)
}
.frame(maxWidth: .infinity)
.padding()
.background(isButtonDisabled ? Color.gray : Color.datadogPurple)
.cornerRadius(10)
.disabled(isButtonDisabled)
.padding(.horizontal, 8)
.padding(.bottom, 30)
}
}

private func prepareAndSendRequest() {
guard let url = URL(string: requestURL) else {
print("🔥 POST Request not sent - invalid url: \(requestURL)")
return
}

var request = URLRequest(url: url)
request.httpMethod = "POST"

let span = Tracer.shared().startRootSpan(operationName: spanName)

switch selectedTraceHeaderType {
case .datadog:
let writer = HTTPHeadersWriter(sampleRate: sampleRate)
Tracer.shared().inject(spanContext: span.context, writer: writer)
writer.traceHeaderFields.forEach { request.setValue($0.value, forHTTPHeaderField: $0.key) }
case .w3c:
let writer = W3CHTTPHeadersWriter(sampleRate: sampleRate)
Tracer.shared().inject(spanContext: span.context, writer: writer)
writer.traceHeaderFields.forEach { request.setValue($0.value, forHTTPHeaderField: $0.key) }
case .b3Single:
let writer = B3HTTPHeadersWriter(sampleRate: sampleRate, injectEncoding: .single)
Tracer.shared().inject(spanContext: span.context, writer: writer)
writer.traceHeaderFields.forEach { request.setValue($0.value, forHTTPHeaderField: $0.key) }
case .b3Multiple:
let writer = B3HTTPHeadersWriter(sampleRate: sampleRate, injectEncoding: .multiple)
Tracer.shared().inject(spanContext: span.context, writer: writer)
writer.traceHeaderFields.forEach { request.setValue($0.value, forHTTPHeaderField: $0.key) }
}

send(request: request) {
span.finish()
print("✅ Request sent to \(requestURL)")
}
}

private func send(request: URLRequest, completion: @escaping () -> Void) {
isRequestPending = true
let task = session.dataTask(with: request) { _, _, _ in
completion()
DispatchQueue.main.async { self.isRequestPending = false }
}
task.resume()
}
}

// MARK - Preview

@available(iOS 14.0, *)

struct DebugTraceInjectionView_Previews: PreviewProvider {
static var previews: some View {
NavigationView {
DebugManualTraceInjectionView()
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

import UIKit
import WebKit
import DatadogInternal
import DatadogRUM
import DatadogWebViewTracking

Expand Down
1 change: 0 additions & 1 deletion Datadog/Example/Utils/ConsoleOutputInterceptor.swift
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,6 @@

#if DEBUG

import DatadogInternal
import UIKit

class ConsoleOutputInterceptor {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,100 @@
/*
* Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
* This product includes software developed at Datadog (https://www.datadoghq.com/).
* Copyright 2019-Present Datadog, Inc.
*/

import XCTest
import TestUtilities
@testable import DatadogCore
import DatadogInternal
import DatadogLogs

class Datadog_MultipleInstancesIntegrationTests: XCTestCase {
/// The configuraiton of default instance of SDK.
private var defaultInstanceConfig = Datadog.Configuration(clientToken: "main-token", env: "default-env")
/// The configuraiton of custom instance of SDK.
private var customInstanceConfig = Datadog.Configuration(clientToken: "custom-token", env: "custom-env")

override func setUp() {
super.setUp()
CreateTemporaryDirectory()

// Root system directory for both instances:
let systemDirectory = Directory(url: temporaryDirectory)
defaultInstanceConfig.systemDirectory = { systemDirectory }
customInstanceConfig.systemDirectory = { systemDirectory }
}

override func tearDown() {
DeleteTemporaryDirectory()
super.tearDown()
}

func testGivenTwoInstancesOfSDK_whenCollectingLogs_thenEachSDKUploadsItsOwnData() throws {
let customInstanceName = "custom"
let numberOfLogs = 10
let defaultHTTPClient = HTTPClientMock(responseCode: 200)
let customHTTPClient = HTTPClientMock(responseCode: 200)
defaultInstanceConfig.httpClientFactory = { _ in defaultHTTPClient }
customInstanceConfig.httpClientFactory = { _ in customHTTPClient }
defaultInstanceConfig.bundle = .mockWith(bundleIdentifier: "com.bundle.default", CFBundleShortVersionString: "1.0-default")
customInstanceConfig.bundle = .mockWith(bundleIdentifier: "com.bundle.custom", CFBundleShortVersionString: "1.0-custom")

// Given
Datadog.initialize(with: defaultInstanceConfig, trackingConsent: .granted)
Datadog.initialize(with: customInstanceConfig, trackingConsent: .granted, instanceName: customInstanceName)

Logs.enable(with: .init())
Logs.enable(with: .init(), in: Datadog.sdkInstance(named: customInstanceName))

let defaultLogger = Logger.create()
let customLogger = Logger.create(in: Datadog.sdkInstance(named: customInstanceName))

// When
for _ in 0..<numberOfLogs {
defaultLogger.info("Default SDK log")
customLogger.info("Custom SDK log")
}

// Then
Datadog.flushAndDeinitialize()
Datadog.flushAndDeinitialize(instanceName: customInstanceName)

let defaultInstanceRequests = defaultHTTPClient.requestsSent()
let customInstanceRequests = customHTTPClient.requestsSent()
XCTAssertGreaterThan(defaultInstanceRequests.count, 0, "Default instance should send some data")
XCTAssertGreaterThan(customInstanceRequests.count, 0, "Custom instance should send some data")

defaultInstanceRequests.forEach { request in
XCTAssertEqual(
request.value(forHTTPHeaderField: URLRequestBuilder.HTTPHeader.ddAPIKeyHeaderField),
defaultInstanceConfig.clientToken,
"Default instance should authenticate data using '\(defaultInstanceConfig.clientToken)' client token"
)
}
customInstanceRequests.forEach { request in
XCTAssertEqual(
request.value(forHTTPHeaderField: URLRequestBuilder.HTTPHeader.ddAPIKeyHeaderField),
customInstanceConfig.clientToken,
"Custom instance should authenticate data using '\(customInstanceConfig.clientToken)' client token"
)
}

let defaultLogs = try defaultInstanceRequests.flatMap { try LogMatcher.fromLogsRequest($0) }
let customLogs = try customInstanceRequests.flatMap { try LogMatcher.fromLogsRequest($0) }

XCTAssertEqual(defaultLogs.count, numberOfLogs, "Default instance should send \(numberOfLogs) logs")
XCTAssertEqual(customLogs.count, numberOfLogs, "Custom instance should send \(numberOfLogs) logs")
defaultLogs.forEach { log in
log.assertService(equals: "com.bundle.default")
log.assertMessage(equals: "Default SDK log")
log.assertTags(equal: ["env:default-env", "version:1.0-default"])
}
customLogs.forEach { log in
log.assertService(equals: "com.bundle.custom")
log.assertMessage(equals: "Custom SDK log")
log.assertTags(equal: ["env:custom-env", "version:1.0-custom"])
}
}
}
Loading