Skip to main content

API Reference

All public methods on Pulse.shared.


Initialization​

initialize(...)​

Initializes the SDK. Call once, as early as possible. Subsequent calls in the same process are ignored.

Pulse.shared.initialize(

apiKey: "your-api-key",
dataCollectionState: .allowed
)

See Configuration for the full parameter list.

setDataCollectionState(_ newState: PulseDataCollectionConsent)​

Updates consent state at runtime. See Data Collection Consent for valid transitions.

Pulse.shared.setDataCollectionState(.allowed)
Pulse.shared.setDataCollectionState(.denied)

shutdown()​

Permanently shuts down the SDK — flushes pending telemetry, uninstalls instrumentations, clears persisted state. Cannot be reversed in the same process.

Pulse.shared.shutdown()

User Identity​

See User Identification for the full pattern.

setUserId(_ id: String?)​

Pulse.shared.setUserId("usr_12345")
Pulse.shared.setUserId(nil) // clear on logout

setUserProperty(name:value:)​

Pulse.shared.setUserProperty(name: "user.plan", value: AttributeValue.string("premium"))
Pulse.shared.setUserProperty(name: "user.plan", value: nil) // clear

setUserProperties(_:)​

Two overloads — dictionary or builder closure:

// Dictionary
Pulse.shared.setUserProperties([
"user.plan": AttributeValue.string("premium"),
"user.region": AttributeValue.string("us-east"),
])

// Builder closure
Pulse.shared.setUserProperties { props in
props["user.plan"] = AttributeValue.string("premium")
}

Custom Telemetry​

trackEvent(name:observedTimeStampInMs:params:)​

Emits a named custom event.

ParameterTypeDescription
nameStringEvent name
observedTimeStampInMsDoubleEpoch milliseconds
params[String: AttributeValue]Optional attributes
Pulse.shared.trackEvent(
name: "purchase_completed",
observedTimeStampInMs: Date().timeIntervalSince1970 * 1000,
params: [
"item.id": AttributeValue.string("sku_123"),
"item.price": AttributeValue.double(49.99),
"quantity": AttributeValue.int(2),
]
)

trackNonFatal(name:observedTimeStampInMs:params:)​

Reports a named non-fatal error.

Pulse.shared.trackNonFatal(
name: "api_timeout",
observedTimeStampInMs: Int64(Date().timeIntervalSince1970 * 1000),
params: [
"endpoint": AttributeValue.string("/api/feed"),
"timeout_ms": AttributeValue.int(5000),
]
)

trackNonFatal(error:observedTimeStampInMs:params:)​

Reports a Swift Error. Extracts type, message, and stacktrace automatically.

do {
try riskyOperation()
} catch {
Pulse.shared.trackNonFatal(
error: error,
observedTimeStampInMs: Int64(Date().timeIntervalSince1970 * 1000),
params: ["context": AttributeValue.string("data_sync")]
)
}

trackSpan(name:params:action:)​

Wraps a closure in a span. Ends automatically when the closure returns or throws.

let result = Pulse.shared.trackSpan(name: "parse_response") {
try JSONDecoder().decode(Response.self, from: data)
}

startSpan(name:params:) / span.end()​

For spans with a lifetime that spans call boundaries.

let span = Pulse.shared.startSpan(
name: "file_upload",
params: ["file.size_bytes": AttributeValue.int(fileData.count)]
)
defer { span.end() }

try await performUpload(fileData)
warning

Always call span.end(). Leaked spans are flushed on the next export cycle but will have incorrect duration.


OpenTelemetry Access​

getOpenTelemetry() -> OpenTelemetry?​

Returns the underlying OpenTelemetry instance. Returns nil if the SDK is shut down.

if let otel = Pulse.shared.getOpenTelemetry() {
let tracer = otel.tracerProvider.get(
instrumentationName: "my-library",
instrumentationVersion: "1.0.0"
)
}

getOtelOrThrow() -> OpenTelemetry​

Same as above but crashes with a fatal error if the SDK is shut down or not initialized. Use when you are certain the SDK is active.


Status​

isSDKInitialized() -> Bool​

Returns true if the SDK is initialized and actively collecting.

guard Pulse.shared.isSDKInitialized() else { return }

isShutdown: Bool​

Returns true if shutdown() has been called.