Skip to content

Commit

Permalink
fix test
Browse files Browse the repository at this point in the history
  • Loading branch information
Damian Mussi authored and Damian Mussi committed Aug 13, 2024
2 parents a32062a + 521b29e commit ff505e5
Show file tree
Hide file tree
Showing 17 changed files with 826 additions and 1,392 deletions.
1 change: 1 addition & 0 deletions examples/react-native-test-suite/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ ios/Pods
node_modules/
npm-debug.log
yarn-error.log
.yarn/*

# BUCK
buck-out/
Expand Down
9 changes: 8 additions & 1 deletion integration-tests/basic-test-app/app/_layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,14 @@ SplashScreen.preventAutoHideAsync();
export default function RootLayout() {
useEffect(() => {
const init = async () => {
const hasStarted = await initEmbrace();
await initEmbrace({
sdkConfig: {
ios: {
appId: "abcdf",
endpointBaseUrl: "http://localhost:8877",
},
},
});
};

init();
Expand Down
20 changes: 0 additions & 20 deletions integration-tests/basic-test-app/ios/Embrace-Info.plist

This file was deleted.

2 changes: 1 addition & 1 deletion packages/core/RNEmbrace.podspec
Original file line number Diff line number Diff line change
Expand Up @@ -17,5 +17,5 @@ Pod::Spec.new do |s|
s.source = {:path => "ios/RNEmbrace/"}

s.dependency 'React-Core'
s.dependency 'EmbraceIO-DEV'
s.dependency 'EmbraceIO', '6.3.0'
end
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,8 @@ public void isStarted(Promise promise) {
}

@ReactMethod
public void startNativeEmbraceSDK(Promise promise) {
public void startNativeEmbraceSDK(ReadableMap config, Promise promise) {
// config for now is only used to setup the iOS SDK, the Android SDK reads its config from a file
try{
Embrace.getInstance().start(this.context.getApplicationContext(), false, Embrace.AppFramework.REACT_NATIVE);
promise.resolve(true);
Expand Down Expand Up @@ -433,11 +434,11 @@ public void logNetworkClientError(String url,
}

@ReactMethod()
public void startSpan(String name, String parentSpanId, Double startTimeNanos, Promise promise) {
public void startSpan(String name, String parentSpanId, Double startTimeMs, Promise promise) {
try{
Long startTime = null;
if(startTimeNanos != null){
startTime = startTimeNanos.longValue();
if(startTimeMs != null && startTimeMs > 0){
startTime = startTimeMs.longValue();
}
promise.resolve(Embrace.getInstance().getReactNativeInternalInterface().startSpan(name, parentSpanId, startTime));
}catch(Exception e){
Expand Down Expand Up @@ -485,9 +486,9 @@ private List<Map<String, Object>> transformListReadableMapToListMap(ReadableArra
if (readableMap != null) {
Map<String, Object> map = readableMap.toHashMap();
// TODO Change when Android/iOS replace time in nano for ms
if (map.containsKey("timestampNanos") && map.get("timestampNanos") instanceof Double) {
double timestampNanos = (Double) map.get("timestampNanos");
map.put("timestampNanos", (long) timestampNanos);
if (map.containsKey("timestampMs") && map.get("timestampMs") instanceof Double) {
double timestampMs = (Double) map.get("timestampMs");
map.put("timestampMs", (long) timestampMs);
}
objectMapList.add(map);
}
Expand All @@ -500,12 +501,13 @@ private List<Map<String, Object>> transformListReadableMapToListMap(ReadableArra
}

@ReactMethod()
public void stopSpan(String spanId, String errorCodeString, Double endTimeNanos, Promise promise) {
public void stopSpan(String spanId, String errorCodeString, Double endTimeMs, Promise promise) {
try{
Long endTime = null;
if(endTimeNanos != null){
endTime = endTimeNanos.longValue();
if(endTimeMs != null && endTimeMs > 0){
endTime = endTimeMs.longValue();
}

ErrorCode errorCodeInstance = this.getSpanErrorCodebyString(errorCodeString);
promise.resolve(Embrace.getInstance().getReactNativeInternalInterface().stopSpan(spanId, errorCodeInstance, endTime));
}catch(Exception e){
Expand Down Expand Up @@ -533,11 +535,21 @@ public void addSpanEventToSpan(String spanId, String name, Double time, Readable
}

@ReactMethod()
public void recordCompletedSpan(String name, Double startTimeNanos, Double endTimeNanos, String errorCodeString, String parentSpanId, ReadableMap attributes, ReadableArray events, Promise promise) {
public void recordCompletedSpan(String name, Double startTimeMs, Double endTimeMs, String errorCodeString, String parentSpanId, ReadableMap attributes, ReadableArray events, Promise promise) {
try{
ErrorCode errorCodeInstance = this.getSpanErrorCodebyString(errorCodeString);

promise.resolve(Embrace.getInstance().getReactNativeInternalInterface().recordCompletedSpan(name, startTimeNanos.longValue(), endTimeNanos.longValue(), errorCodeInstance, parentSpanId, this.convertToReadableMap(attributes), this.transformListReadableMapToListMap(events)));
Long startTime = null;
if(startTimeMs != null && startTimeMs > 0){
startTime = startTimeMs.longValue();
}

Long endTime = null;
if(endTimeMs != null && endTimeMs > 0){
endTime = endTimeMs.longValue();
}

promise.resolve(Embrace.getInstance().getReactNativeInternalInterface().recordCompletedSpan(name, startTime, endTime, errorCodeInstance, parentSpanId, this.convertToReadableMap(attributes), this.transformListReadableMapToListMap(events)));
}catch(Exception e){
promise.resolve(false);
}
Expand Down
2 changes: 1 addition & 1 deletion packages/core/ios/RNEmbrace/EmbraceManager.m
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ @interface RCT_EXTERN_MODULE(EmbraceManager, NSObject)
RCT_EXTERN_METHOD(isStarted:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)

RCT_EXTERN_METHOD(startNativeEmbraceSDK:(NSString *)appId
RCT_EXTERN_METHOD(startNativeEmbraceSDK:(NSDictionary)config
resolver:(RCTPromiseResolveBlock)resolve
rejecter:(RCTPromiseRejectBlock)reject)

Expand Down
83 changes: 63 additions & 20 deletions packages/core/ios/RNEmbrace/EmbraceManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,39 @@ import React
import OSLog
import EmbraceIO
import EmbraceCrash
import EmbraceCommonInternal // TODO should not be needed
import EmbraceOTelInternal // TODO should not be needed
import EmbraceCommonInternal
import EmbraceOTelInternal

#if canImport(CodePush)
import CodePush
#endif

enum EmbraceKeys: String {
case reactNativeVersion = "io.embrace.reactnative.version"
case embraceReactNativeSdkVersion = "io.embrace.reactnative.sdk.version"
case javaScriptPatchNumber = "io.embrace.javascript.patch"
case javaScriptBundleURL = "io.embrace.jsbundle.url"
}
private let JAVASCRIPT_PATCH_NUMBER_RESOURCE_KEY = "javascript_patch_number"
private let HOSTED_PLATFORM_VERSION_RESOURCE_KEY = "hosted_platform_version"
private let HOSTED_SDK_VERSION_RESOURCE_KEY = "hosted_sdk_version"

// Keys defined in packages/spans/interfaces/ISpans.ts
private let EVENT_NAME_KEY = "name"
private let EVENT_TIMESTAMP_KEY = "timeStampMs"
private let EVENT_ATTRIBUTES_KEY = "attributes"

class SDKConfig: NSObject {
public let appId: String;
public let appGroupId: String?;
public let disableCrashReporter: Bool;
public let disableAutomaticViewCapture: Bool;
public let endpointBaseUrl: String?;

public init(from: NSDictionary) {
self.appId = from["appId"] as? String ?? ""
self.appGroupId = from["appGroupId"] as? String
self.disableCrashReporter = from["disableCrashReporter"] as? Bool ?? false
self.disableAutomaticViewCapture = from["disableAutomaticViewCapture"] as? Bool ?? false
self.endpointBaseUrl = from["endpointBaseUrl"] as? String
}
}


@objc(EmbraceManager)
class EmbraceManager: NSObject {
private var log = OSLog(subsystem: "Embrace", category: "ReactNativeEmbraceManager")
Expand All @@ -30,7 +44,9 @@ class EmbraceManager: NSObject {
@objc(setJavaScriptBundlePath:resolver:rejecter:)
func setJavaScriptBundlePath(_ path: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
do {
try Embrace.client?.metadata.addResource(key: EmbraceKeys.javaScriptBundleURL.rawValue, value: path, lifespan: .process)

// TODO, use path to compute a hash of the assets and add as a 'react_native_bundle_id' key to the resource
// try Embrace.client?.metadata.addResource(key: EmbraceKeys.javaScriptBundleURL.rawValue, value: path, lifespan: .process)
resolve(true)
} catch let error {
reject("SET_JS_BUNDLE_PATH_ERROR", "Error setting JavaScript bundle path", error)
Expand All @@ -47,17 +63,37 @@ class EmbraceManager: NSObject {
}

@objc(startNativeEmbraceSDK:resolver:rejecter:)
func startNativeEmbraceSDK(_ appId: String, resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
func startNativeEmbraceSDK(configDict: NSDictionary, resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
let config = SDKConfig(from: configDict)
DispatchQueue.main.async {
do {

var embraceOptions: Embrace.Options {
var crashReporter: CrashReporter?
if config.disableCrashReporter {
crashReporter = nil
} else {
crashReporter = EmbraceCrashReporter()
}

let servicesBuilder = CaptureServiceBuilder().addDefaults()
if config.disableAutomaticViewCapture {
servicesBuilder.remove(ofType: ViewCaptureService.self)
}

var endpoints: Embrace.Endpoints? = nil
if config.endpointBaseUrl != nil {
endpoints = Embrace.Endpoints(baseURL: config.endpointBaseUrl!,
developmentBaseURL: config.endpointBaseUrl!,
configBaseURL: config.endpointBaseUrl!)
}

return .init(
appId: appId,
appGroupId: nil,
appId: config.appId,
appGroupId: config.appGroupId,
platform: .reactNative,
captureServices: .automatic,
crashReporter: EmbraceCrashReporter()
endpoints: endpoints,
captureServices: servicesBuilder.build(),
crashReporter: crashReporter
)
}

Expand Down Expand Up @@ -118,7 +154,7 @@ class EmbraceManager: NSObject {
@objc(setReactNativeSDKVersion:resolver:rejecter:)
func setReactNativeSDKVersion(_ version: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
do {
try Embrace.client?.metadata.addResource(key: EmbraceKeys.embraceReactNativeSdkVersion.rawValue, value: version, lifespan: .process)
try Embrace.client?.metadata.addResource(key: HOSTED_SDK_VERSION_RESOURCE_KEY, value: version, lifespan: .process)
resolve(true)
} catch let error {
reject("SET_RN_SDK_VERSION", "Error setting ReactNative SDK version", error)
Expand All @@ -141,7 +177,7 @@ class EmbraceManager: NSObject {
@objc(setJavaScriptPatchNumber:resolver:rejecter:)
func setJavaScriptPatchNumber(_ patch: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
do {
try Embrace.client?.metadata.addResource(key: EmbraceKeys.javaScriptPatchNumber.rawValue, value: patch, lifespan: .process)
try Embrace.client?.metadata.addResource(key: JAVASCRIPT_PATCH_NUMBER_RESOURCE_KEY, value: patch, lifespan: .process)
resolve(true)
} catch let error {
reject("SET_JAVASCRIPT_PATCH_NUMBER", "Error setting JavasScript Patch Number", error)
Expand Down Expand Up @@ -179,6 +215,7 @@ class EmbraceManager: NSObject {
return
}

// TODO, use path to compute a hash of the assets and add as a 'react_native_bundle_id' key to the resource
try Embrace.client?.metadata.addResource(key: EmbraceKeys.javaScriptBundleURL.rawValue, value: url.path, .process)
resolve(true)

Expand Down Expand Up @@ -223,7 +260,7 @@ class EmbraceManager: NSObject {
@objc(setReactNativeVersion:resolver:rejecter:)
func setReactNativeVersion(_ version: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
do {
try Embrace.client?.metadata.addResource(key: EmbraceKeys.reactNativeVersion.rawValue, value: version, lifespan: .process)
try Embrace.client?.metadata.addResource(key: HOSTED_PLATFORM_VERSION_RESOURCE_KEY, value: version, lifespan: .process)
resolve(true)
} catch let error {
reject("SET_RECT_NATIVE_VERSION", "Error setting React Native Number", error)
Expand All @@ -233,8 +270,11 @@ class EmbraceManager: NSObject {
@objc(removeSessionProperty:resolver:rejecter:)
func removeSessionProperty(_ key: String, resolver resolve: @escaping RCTPromiseResolveBlock, rejecter reject: @escaping RCTPromiseRejectBlock) {
do {
// TODO REfactor to include lifespan
try Embrace.client?.metadata.removeProperty(key: key)
// Depending on on how `addSessionProperty` was called we may have added this key as either
// .session or .permanent so remove both here, multiple calls to remove are safe
try Embrace.client?.metadata.removeProperty(key: key, lifespan: .permanent)
try Embrace.client?.metadata.removeProperty(key: key, lifespan: .session)

resolve(true)
} catch let error {
reject("REMOVE_SESSION_PROPERTY", "Error removing Session Property", error)
Expand Down Expand Up @@ -501,6 +541,8 @@ class EmbraceManager: NSObject {
} else {
span?.addEvent(name: name, attributes: attributeValuesFrom(dict: attributes), timestamp: dateFrom(ms: time))
}

Embrace.client?.flush(span!)

resolve(true)
}
Expand All @@ -521,6 +563,7 @@ class EmbraceManager: NSObject {
}

span?.setAttribute(key: key, value: value)
Embrace.client?.flush(span!)

resolve(true)
}
Expand Down
Loading

0 comments on commit ff505e5

Please sign in to comment.