EUM iOS агент Proto Observability

Proto OBP End User Monitoring iOS агент позволяет собирать данные о производительности мобильного приложения напрямую с клиентов, инструментируя приложения на устройствах конечных пользователей.

На этой странице:

Подключение и инициализация агента и модулей Proto Observability

Для подключения агента используется SDK для автоматической инструментации (POBP iOS SDK).

Добавьте пакет protoobp-ios-sdk как зависимость, используя ваш менеджер пакетов:

Менеджер пакетов Способ подключения
CocoaPods pod 'ProtoobpSDK', :git => 'https://git.proto.group/protoobp/protoobp-ios-sdk.git'
Swift Package Manager .package(url: "https://git.proto.group/protoobp/protoobp-ios-sdk.git", .upToNextMajor(from: "2.0.0"))
Carthage git "https://git.proto.group/protoobp/protoobp-ios-sdk.git"

! Репозиторий с iOS SDK является приватным, учетную запись для скачивания пакетов можно получить у команды Proto.

Инициализируйте SDK и сделайте необходимые import:

import Protoobp //импортируйте пакет ProtoOBP SDK
      // адрес для приема данных от RUM - данные должны проксироваться на https://proto-backend-server/mobile
      let pobpEndpoint = URL(string: "https://your-site.ru/mobile")!
      let pobpAppname = "ios-demo-app" // название приложения для отображения в интерфейсе
      // список доменов для трейсинга - к запросам на эти домены будут добавляться заголовки для трейсинга
      let firstPartyHosts: Set<String> = [
            "https://my-site.ru",
            "http://api.my-site.ru"
        ]
        
      Protoobp.initialize(
          appContext: .init(), 
          trackingConsent: .granted, // обязательно 
          configuration: Protoobp.Configuration
              .builderUsing(
                  rumApplicationID: pobpAppname,
                  clientToken: "1", // обязательно 1
                  environment: "prod" // окружение, поддержка этого тега в интерфейсе появится позднее
              )
              .set(rumSessionsSamplingRate: 100.0) // 100.0 - все пользователи, 10.0 - 10% пользовательских сессиий
              .set(sampleTelemetry: 0.0) // обязательно 0.0
              .set(serviceName: pobpAppname) 
              .set(customTracesEndpoint: pobpEndpoint) 
              .set(customRUMEndpoint: pobpEndpoint) 
              .trackURLSession(firstPartyHosts: firstPartyHosts) //список доменов для трейсинга - к запросам на эти домены будут добавляться заголовки для трейсинга
              .trackUIKitRUMViews()  // обязательно
              .trackUIKitRUMActions()  // обязательно
              .trackURLSession()  // обязательно
              .enableLogging(false) //обязательно
              .build()
      )
        
      Global.sharedTracer = Tracer.initialize(configuration: .init())  // обязательно
      // добавление данных о текущем пользователе - опционально
      Protoobp.setUserInfo(
          id: "1234",   // строка, опционально
          name: "Василий Пупкин",   // строка, опционально
          email: "vass@pupkine.com"   // строка, опционально
      )
      Global.rum = RUMMonitor.initialize() // обязательно
        

Трейсинг запросов URLSession

Для сбора запросов отправленных от URLSession используйте POBPURLSessionDelegate как delegate для этой URLSession

        let session  = URLSession(
            configuration: .default,
            delegate: POBPURLSessionDelegate(),
            delegateQueue: nil
        )

Если уже используется кастомный delegate, есть два способа подключения:

  1. Используя наследование классов:
class YourCustomDelegateURLSessionDelegate: POBPURLSessionDelegate {
    override func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
        super.urlSession(session, task: task, didCompleteWithError: error) // отправка delegate на POBPURLSessionDelegate
        /* код */
    }
}
  1. Используя композицию классов:
private class YourCustomDelegateURLSessionDelegate: NSObject, URLSessionTaskDelegate, URLSessionDataDelegate, __URLSessionDelegateProviding {
    // MARK: - __URLSessionDelegateProviding conformance

    let pobpURLSessionDelegate = POBPURLSessionDelegate()

    // MARK: - __URLSessionDelegateProviding handling

    func urlSession(_ session: URLSession, task: URLSessionTask, didFinishCollecting metrics: URLSessionTaskMetrics) {
        pobpURLSessionDelegate.urlSession(session, task: task, didFinishCollecting: metrics) // отправка delegate на pobpURLSessionDelegate
        /* код */
    }

    func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
        pobpURLSessionDelegate.urlSession(session, task: task, didCompleteWithError: error) // отправка delegate на pobpURLSessionDelegate
        /* код */
    }

    func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
        pobpURLSessionDelegate.urlSession(session, dataTask: dataTask, didReceive: data) // отправка delegate на pobpURLSessionDelegate
        /* код */
    }
}

Сквозная трассировка запросов от iOS приложения

Трейсы транзакции от iOS к инструментированным бэкендам, то есть бэкендам, на которых установлены агенты Proto OBP, будут объединяться в единую цепочку вызовов - трейс распределенной транзакции, начавшейся на iOS устройстве.

../../images/185-ios-trace.png