@sophonz/react-native-otlp
v0.1.0
Published
Sends Sophonz React Native telemetry to additional OTLP endpoints
Maintainers
Readme
@sophonz/react-native-otlp
Adds OTLP/HTTP trace and log exporters to the native Sophonz SDKs, so telemetry also goes to a second backend. Delivery
to the Sophonz collector is unaffected. Requires @sophonz/react-native.
Install
yarn add @sophonz/react-native-otlp
cd ios && pod installConfigure from JavaScript
Pass exporters to initialize or useSophonz. When they are present the core package starts the native SDK through
this package instead of its own.
import {initialize} from "@sophonz/react-native";
await initialize({
sdkConfig: {
ios: {
collectorUrl: "https://in.sophonz.ai",
appKey: "sk_...",
// keep the exporter's own requests out of network capture, see below
disabledUrlPatterns: ["otlp.example.com"],
},
exporters: {
traceExporter: {
endpoint: "https://otlp.example.com/v1/traces",
headers: [{key: "Authorization", token: "Bearer ..."}],
timeout: 30,
},
logExporter: {
endpoint: "https://otlp.example.com/v1/logs",
headers: [{key: "Authorization", token: "Bearer ..."}],
},
},
},
});On iOS, exporters with no collectorUrl/appKey and no Sophonz-Info.plist start the SDK in exporter-only mode.
Metro needs transformer.unstable_allowRequireContext enabled for the core package to find this one (Expo enables it by
default).
Configure natively
If the native SDK is started before JavaScript runs, register the exporters there, before start.
Android, in MainApplication.onCreate:
import io.opentelemetry.exporter.otlp.http.logs.OtlpHttpLogRecordExporter
import io.opentelemetry.exporter.otlp.http.trace.OtlpHttpSpanExporter
import io.sophonz.android.sophonzsdk.Sophonz
import io.sophonz.android.sophonzsdk.otel.java.addJavaLogRecordExporter
import io.sophonz.android.sophonzsdk.otel.java.addJavaSpanExporter
Sophonz.addJavaSpanExporter(
OtlpHttpSpanExporter.builder().setEndpoint("https://otlp.example.com/v1/traces").build()
)
Sophonz.addJavaLogRecordExporter(
OtlpHttpLogRecordExporter.builder().setEndpoint("https://otlp.example.com/v1/logs").build()
)
Sophonz.start(this)iOS, in SophonzInitializer.swift:
import SophonzIO
import OpenTelemetryProtocolExporterHttp
let otel = Sophonz.OTelOptions(
spanExporters: [OtlpHttpTraceExporter(endpoint: URL(string: "https://otlp.example.com/v1/traces")!)],
logExporters: [OtlpHttpLogExporter(endpoint: URL(string: "https://otlp.example.com/v1/logs")!)]
)
try Sophonz.start(
options: .withCollector(url: "https://in.sophonz.ai", appKey: "sk_...", platform: .reactNative, otel: otel)
)Keep exports out of network capture
Both SDKs capture HTTP requests, including the exporter's own. Left alone, each export produces a span that is exported in turn. The SDKs exclude their own collector automatically, but not a second backend.
- Android: add the host to
sdk_config.networking.disabled_url_patternsinsophonz-config.json. - iOS: add it to
sdkConfig.ios.disabledUrlPatterns, or toURLSessionCaptureService.Options(ignoredURLs:)when starting natively.
