diff --git a/.github/workflows/macos-dSYM.yml b/.github/workflows/macos-dSYM.yml index cb490792..adf1194e 100644 --- a/.github/workflows/macos-dSYM.yml +++ b/.github/workflows/macos-dSYM.yml @@ -1,5 +1,10 @@ name: Upload dSYM Files +on: + push: + branches: [ main ] + workflow_dispatch: + jobs: build: runs-on: macos-latest @@ -8,14 +13,70 @@ jobs: - name: Checkout uses: actions/checkout@v4 - - name: Generate/Download dSYM Files - uses: ./release.sh + - name: Select Xcode Version + run: sudo xcode-select -s /Applications/Xcode.app/Contents/Developer + + - name: Show Xcode Version + run: xcodebuild -version + + - name: Setup Environment Variables + env: + DATADOG_CLIENT_TOKEN: ${{ secrets.DATADOG_CLIENT_TOKEN }} + run: | + echo "DATADOG_CLIENT_TOKEN=${DATADOG_CLIENT_TOKEN}" >> $GITHUB_ENV + + - name: Build iOS App and Generate dSYMs + env: + DATADOG_CLIENT_TOKEN: ${{ secrets.DATADOG_CLIENT_TOKEN }} + run: | + # Create build directory + mkdir -p ./build/dSYMs + + # Build iOS App Archive with dSYMs + xcodebuild \ + -workspace Meshtastic.xcworkspace \ + -scheme Meshtastic \ + -configuration Release \ + -destination 'generic/platform=iOS' \ + -archivePath ./build/Meshtastic.xcarchive \ + DATADOG_CLIENT_TOKEN="${DATADOG_CLIENT_TOKEN}" \ + DEBUG_INFORMATION_FORMAT=dwarf-with-dsym \ + DWARF_DSYM_FOLDER_PATH=./build/dSYMs \ + archive + + - name: Extract dSYMs from Archive + run: | + # Find and copy all dSYM files from the archive + find ./build/Meshtastic.xcarchive -name "*.dSYM" -exec cp -R {} ./build/dSYMs/ \; + + # List what we found + echo "Found dSYM files:" + find ./build/dSYMs -name "*.dSYM" -type d + - name: Install Datadog CI + run: | + npm install -g @datadog/datadog-ci + - name: Upload dSYMs to Datadog - uses: DataDog/upload-dsyms-github-action@v1 + env: + DATADOG_API_KEY: ${{ secrets.DATADOG_API_KEY }} + DATADOG_SITE: datadoghq.com + run: | + # Upload all dSYM files to Datadog + if [ -d "./build/dSYMs" ] && [ "$(find ./build/dSYMs -name "*.dSYM" -type d | wc -l)" -gt 0 ]; then + echo "Uploading dSYM files to Datadog..." + datadog-ci dsyms upload ./build/dSYMs --dry-run=false + else + echo "No dSYM files found to upload" + exit 1 + fi + + - name: Upload Build Artifacts + uses: actions/upload-artifact@v4 + if: always() with: - api_key: ${{ secrets.DATADOG_API_KEY }} - site: datadoghq.com - dsym_paths: | - path/to/dsyms/folder - path/to/zip/dsyms.zip \ No newline at end of file + name: dsym-files + path: | + ./build/dSYMs + ./build/Meshtastic.xcarchive + retention-days: 30 \ No newline at end of file diff --git a/Meshtastic.xcodeproj/project.pbxproj b/Meshtastic.xcodeproj/project.pbxproj index ca8a3c89..828dcafb 100644 --- a/Meshtastic.xcodeproj/project.pbxproj +++ b/Meshtastic.xcodeproj/project.pbxproj @@ -13,6 +13,8 @@ 102B5EB12E172F41003D191E /* DatadogRUM in Frameworks */ = {isa = PBXBuildFile; productRef = 102B5EB02E172F41003D191E /* DatadogRUM */; }; 108FFECB2DD3F43C00BFAA81 /* ShareContactQRDialog.swift in Sources */ = {isa = PBXBuildFile; fileRef = 108FFECA2DD3F43C00BFAA81 /* ShareContactQRDialog.swift */; }; 108FFECD2DD4005600BFAA81 /* NodeInfoEntityToNodeInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 108FFECC2DD4005600BFAA81 /* NodeInfoEntityToNodeInfo.swift */; }; + 10D109F22E2047D600536CE6 /* DatadogSessionReplay in Frameworks */ = {isa = PBXBuildFile; productRef = 10D109F12E2047D600536CE6 /* DatadogSessionReplay */; }; + 10D109F42E2047D600536CE6 /* DatadogTrace in Frameworks */ = {isa = PBXBuildFile; productRef = 10D109F32E2047D600536CE6 /* DatadogTrace */; }; 231B3F212D087A4C0069A07D /* MetricTableColumn.swift in Sources */ = {isa = PBXBuildFile; fileRef = 231B3F202D087A4C0069A07D /* MetricTableColumn.swift */; }; 231B3F222D087A4C0069A07D /* MetricsColumnList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 231B3F1F2D087A4C0069A07D /* MetricsColumnList.swift */; }; 231B3F252D087C3C0069A07D /* EnvironmentDefaultColumns.swift in Sources */ = {isa = PBXBuildFile; fileRef = 231B3F242D087C3C0069A07D /* EnvironmentDefaultColumns.swift */; }; @@ -599,9 +601,11 @@ 102B5EAD2E172F41003D191E /* DatadogCrashReporting in Frameworks */, 25A978BA2C13F8ED0003AAE7 /* MeshtasticProtobufs in Frameworks */, 102B5EAB2E172F41003D191E /* DatadogCore in Frameworks */, + 10D109F22E2047D600536CE6 /* DatadogSessionReplay in Frameworks */, 102B5EAF2E172F41003D191E /* DatadogLogs in Frameworks */, 102B5EB12E172F41003D191E /* DatadogRUM in Frameworks */, DD0D3D222A55CEB10066DB71 /* CocoaMQTT in Frameworks */, + 10D109F42E2047D600536CE6 /* DatadogTrace in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1256,6 +1260,8 @@ 102B5EAC2E172F41003D191E /* DatadogCrashReporting */, 102B5EAE2E172F41003D191E /* DatadogLogs */, 102B5EB02E172F41003D191E /* DatadogRUM */, + 10D109F12E2047D600536CE6 /* DatadogSessionReplay */, + 10D109F32E2047D600536CE6 /* DatadogTrace */, ); productName = MeshtasticClient; productReference = DDC2E15426CE248E0042C5E4 /* Meshtastic.app */; @@ -2054,6 +2060,16 @@ package = 102B5EA92E172F41003D191E /* XCRemoteSwiftPackageReference "dd-sdk-ios" */; productName = DatadogRUM; }; + 10D109F12E2047D600536CE6 /* DatadogSessionReplay */ = { + isa = XCSwiftPackageProductDependency; + package = 102B5EA92E172F41003D191E /* XCRemoteSwiftPackageReference "dd-sdk-ios" */; + productName = DatadogSessionReplay; + }; + 10D109F32E2047D600536CE6 /* DatadogTrace */ = { + isa = XCSwiftPackageProductDependency; + package = 102B5EA92E172F41003D191E /* XCRemoteSwiftPackageReference "dd-sdk-ios" */; + productName = DatadogTrace; + }; 25A978B92C13F8ED0003AAE7 /* MeshtasticProtobufs */ = { isa = XCSwiftPackageProductDependency; productName = MeshtasticProtobufs; diff --git a/Meshtastic/MeshtasticApp.swift b/Meshtastic/MeshtasticApp.swift index 1f9465f5..d4de2bf7 100644 --- a/Meshtastic/MeshtasticApp.swift +++ b/Meshtastic/MeshtasticApp.swift @@ -8,6 +8,8 @@ import MeshtasticProtobufs import DatadogCore import DatadogCrashReporting import DatadogRUM +import DatadogTrace +import DatadogLogs @main struct MeshtasticAppleApp: App { @@ -44,6 +46,14 @@ struct MeshtasticAppleApp: App { trackingConsent: UserDefaults.usageDataAndCrashReporting ? .granted : .notGranted, ) DatadogCrashReporting.CrashReporting.enable() + + Logs.enable() + + Trace.enable( + with: Trace.Configuration( + sampleRate: 100, networkInfoEnabled: true // 100% sampling for development/testing, reduce for production + ) + ) RUM.enable( with: RUM.Configuration(