모바일 앱 모니터링 FAQ
모바일 앱 모니터링 FAQ에는 모바일 애플리케이션을 효과적으로 모니터링하기 위한 설정, 문제 해결 및 모범 사례가 포함되어 있습니다.
데이터 수집 및 보고
어느 앱 데이터가 수집됩니까?
Instana 모니터링과 함께 모바일 에이전트는 다음 앱 특정 정보를 자동으로 수집합니다.
- 번들 또는 앱 식별자
- 앱 및 빌드 버전
- 현재 앱 언어
- iOS/Android 버전, 기기 모델, 하드웨어, 기기 및 제조사
- 기기가 탈옥되었는지, 루팅되었는지
- 화면 크기와 해상도
- 캐리어 이름과 연결 유형(
2G,3G,4G...)
비콘 보고가 어떻게 처리됩니까?
기본 스레드(UI)의 블로킹을 방지하려면, 보고와 큐 처리가 백그라운드 스레드에서 수행됩니다.
에이전트는 수신되는 모든 비콘을 기기 내의 영구 큐에 수집하므로, 시스템 충돌이나 강제 종료와 같은 예기치 못한 상황이 발생하더라도 비콘이 손실되지 않습니다. 각 비콘에는 약 600바이트의 스토리지 공간이 필요합니다.
앱의 네트워크 성능에 영향을 미치지 않도록, 비콘 생성이 중단된 지 1초 후(배터리 잔량이 부족할 경우 10초 후)에 비콘이 삭제됩니다.
플러시하기 전에, 비콘들이 100개씩 묶음 단위로 합류했습니다. 그런 다음 각 배치는 단일 ` HTTP ` 요청으로 전송됩니다(기기가 지원하는 경우 압축되며, 기기가 지원하는 경우 동일한 ` HTTP ` 연결을 사용합니다).
에이전트가 비콘을 전송하려고 할 때 기기가 오프라인 상태라면, 에이전트는 기기가 다시 온라인 상태가 될 때까지 기다렸다가 비콘을 전송합니다.
큐의 기본 최대 한계는 1000개의 비콘입니다. 대기열이 가득 찬 상태에서 더 많은 비콘이 생성되면, 새로운 비콘은 버려집니다.
비콘 전송 시 서버로부터 오류 응답을 수신하면, 에이전트는 지수적 백오프( 10s ) 메커니즘을 사용하여 최대 3회까지 자동으로 재전송을 시도합니다. 이 자동 재시도가 실패하더라도 비콘은 삭제되지 않으며, 새로운 비콘이 생성될 때 대기열에 남아 나머지 비콘들과 함께 재시도됩니다.
인터넷이나 네트워크 연결 상태가 좋지 않은 사용자들은 어떻게 되나요?
모바일 앱 사용자에서 우리 서버까지의 데이터 전송 요청이 작동하지 않을 수 있습니다. 이 경우 다음 모니터링 데이터 전송의 일부로 비콘을 전달하려고 시도합니다 (예: 다음 모바일 앱 시작).
보고가 실패하면 어떻게 되나요?
네트워크 문제로 인해 비콘 보고에 실패할 수 있습니다. 비콘은 다음 전송 시도를 위해 큐에 보유됩니다.
오프라인 상태에서 데이터가 수집됩니까?
네, 여기에서 설명된 100개의 비콘을 상한선으로 가정해 보십시오. 대기열이 가득 차서 (네트워크 문제로 인해) 비울 수 없는 경우, 이후로 들어오는 모든 비콘은 폐기됩니다.
(SaaS의 경우) HTTP 엔드포인트를 프록시할 수 있습니까?
Instana HTTP 엔드포인트에 대한 프록시 설정을 시도하지 않는 것이 좋습니다. Instana 프로xy 설정이나 프로xy 사용으로 인해 발생할 수 있는 문제에 대해서는 어떠한 지원도 제공 하지 않습니다. 여전히 이 작업을 수행하려는 경우 (또는 수행해야 하는 경우) 다음 포인터가 도움이 됩니다.
- 적절한
HostHTTP 헤더를 설정합니다. eum.instana.io및eum-{region}.instana.io서버 간의 차이를 확인합니다.- 서버가 사용자 IP를 인식하는지 확인하십시오. 사용자의 IP 주소를 포함한 헤더를
X-FORWARDED-FOR서버로 전송합니다. 또는 Instana 서버에 사용자의 IP 주소가 포함된X-REALER-IPHTTP 헤더를 전송할 수도 있습니다(네, 의도적으로 그렇지 않은 헤더를X-REAL-IP보냅니다). - Instana 서버가 응답 본문에 포함하는 모든 HTTP 헤더를 패스 스루합니다.
- 프록시에서 캐싱을 수행하지 않습니다.
테스트 단계에서 Android 앱 디버그 빌드에서 Instana 모니터링을 활성화할 수 있나요?
현재 Gradle 를 사용하여 플러그인 사용 여부에 대한 조건부 정보를 확인할 수 있습니다:
Instana 저장소의 instana-example 디렉터리에 있는 다음 예제를 참조하세요:
instana-example/app/build.gradle
instana-example/app/src/main/java/com/instana/mobileeum/DemoApp.kt
앱에서 ` Instana ` 코드가 실행되지 않도록 하려면 다음 단계를 따르세요:
Gradle 에서 최신 버전의 BuildType 를 다운로드하세요.
에서
app/build.gradle다음 코드 스니펫을 사용하여 현재 빌드 유형을 조회하고, 빌드 유형에 따라 를enableInstana정의하세요.def buildType = gradle.startParameter.taskRequests.stream() .flatMap { it.args.stream() } .map { it.contains("Release") ? "Release" : it.contains("Debug") ? "Debug" : null} .filter(Objects::nonNull) .findFirst() buildType.ifPresent { println "buildType is ${it}" } def enableInstana = buildType.orElse("").matches("Debug")Instana plugin를 조건부로 적용하십시오.if (enableInstana) { println "instana> apply instana plugin" apply plugin: 'com.instana.android-agent-plugin' }Gradle 에서 ' Instana ' 키를 조건부로 추가합니다.
Instana 가 비활성화되어 있으면 해당
INSTANA_REPORTING_URL필드에는 빈 문자열이 표시됩니다.android { defaultConfig { def instanaProperties = new Properties() instanaProperties.load(new FileInputStream("$project.projectDir/instana.properties")) buildConfigField 'String', 'INSTANA_KEY', enableInstana ? "${instanaProperties["instana.key"]}" : '""' buildConfigField 'String', 'INSTANA_REPORTING_URL', enableInstana ? "${instanaProperties["instana.reportingURL"]}" : '""' } }Instana 런타임을 조건부로 초기화합니다.
이제 Instana 런타임은 원치 않는 빌드 유형으로 초기화되지 않습니다.
if (BuildConfig.INSTANA_REPORTING_URL.isNotBlank()) { Instana.setup(this, InstanaConfig( reportingURL = BuildConfig.INSTANA_REPORTING_URL, key = BuildConfig.INSTANA_KEY )) }
세션
모바일 Instana 에이전트가 수집한 정보는 세션 단위로 정리됩니다.
각 세션은 앱의 인스턴스에 맵핑됩니다. 앱이 인스턴스화되면 시작되고 앱이 중지되면 종료됩니다.
세션 라이프사이클
- 에이전트가 설정될 때 앱이 시작될 때마다 세션이 자동으로 시작됩니다.
sessionID는 세션에 대해 자동으로 생성됩니다.sessionID는 앱이 활성 상태인 동안 변경되지 않습니다(배경의 전경에 있음).- Instana 안드로이드 에이전트 또는 iOS 에이전트가 전송하는 모든 비콘에는 동일한 내용이 포함되어 있습니다.
sessionID - 앱이 중지되면
sessionID가 버려집니다. 프로세스 자체가 중지되면 버려집니다. - 다음에 앱이 시작되면 새
sessionID가 자동으로 생성됩니다.
HTTP 모니터링
어떤 HTTP 정보가 모니터링됩니까?
- 요청의 처리 시간
- HTTP 메서드 (
POST,GET……) - URL 의 전체 경로
- 상태 코드 (예:
200) - 응답 크기 (헤더, 본문, 디코딩된 본문)
- 근본적인 오류
- 백엔드 상관 관계를 위한 백엔드 추적 ID
자동과 수동 HTTP 모니터링 간의 차이점은 무엇입니까?
iOS
iOS 에이전트는 HTTP 세션의 자동과 수동 모니터링을 제공합니다.
자동 모니터링
URLSession 을 통해 전송되는 HTTP 요청 및 응답을 모니터링하기 위해, 자동 HTTP 모니터링 기능은 Foundation의 URLProtocol 을 사용합니다. 캡처된 모든 요청과 응답이 Instana에 보고됩니다. 기본 URLSession은 URLProtocol에서 내재적으로 인터셉트될 수 있지만 모든 사용자 정의 세션에는 모니터링을 위해 명시적인 URLProtocol 등록이 필요합니다. 많은 애플리케이션에 사용자 정의 URLSession이 있기 때문에, 해당 세션에 대한 등록 프로세스가 Instana iOS 에이전트에 대한 이상적인 솔루션이 아닙니다. 등록 프로세스를 단순화하기 위해 모든 세션은 모든 URLSessions의 초기자를 돌려서 내재적으로 등록됩니다. 스위즐링 접근 방식으로, URLProtocol의 등록이 필요하지 않으며 자동 HTTP 모니터링을 단순화합니다. 신뢰할 수 없으므로 WKWebView의 자동 모니터링을 사용할 수 없습니다. 앱과 WebView의 WebKit은 다른 프로세스에서 실행됩니다. 앱과 WebKit 프로세스 간에 IPC가 이루어지고 있지만, 일부 데이터(예: POST 본문)가 앱 프로세스로 전송되지 않습니다. 이로 인해 예기치 않은 동작이 발생할 수 있습니다.
수동 모니터링
HTTP 요청 및 응답을 수동으로 캡처하여 클라이언트는 자동 모니터링 및 스와이프 링에서 옵트 아웃할 수 있습니다. URLProtocol이 URLSessions에 설치되지 않습니다. 수동 모니터링은 HTTP 요청 및 응답을 캡처할 때 클라이언트의 모니터링을 사용하는 데 더 많은 노력이 필요함을 의미합니다.
Android
Android 에이전트는 HTTP 세션의 자동 및 수동 모니터링을 제공합니다.
자동 모니터링
이 Android 플러그인은 컴파일 시점에 앱에 몇 가지 추가 추적 코드를 삽입합니다.
Instana 현재 다음 네트워크 클라이언트의 자동 추적을 지원합니다:
- OkHttp3
- HttpURLConnection
- Retrofit
Android 에이전트의 문제 트래커에서 더 많은 네트워크 클라이언트의 지원에 대한 관심을 등록하십시오.
수동 모니터링
HTTP 요청 및 응답을 수동으로 캡처하여 클라이언트는 자동 모니터링에서 옵트 아웃하고 추적되는 네트워크 요청과 추적되지 않는 네트워크 요청을 완전히 제어할 수 있습니다.
자세한 내용은 Android API 을 참조하세요.
React Native
React Native 에이전트는 현재 HTTP 세션을 자동으로 제공합니다.
자동 모니터링
HTTP 세션의 자동 모니터링에 대한 자세한 정보는 각 플랫폼에 특정한 문서를 참조하십시오.
iOS: 자동 모니터링을 사용하여 내 URLProtocol을 사용할 수 있습니까?
예, 사용자 고유 URLProtocol을 작성하여 사용자 정의 URLSession을 통해 요청과 응답을 프록시할 수 있습니다. Instana HTTP 모니터링 기능은 를 URLProtocol 델리게이트로 지정된 모든 URLSession 항목을 자동으로 무시합니다. 그러나 사용자 정의 URLSession 가 Instana.ignore(yourURLSession)를 통해 모니터되지 않도록 명시적으로 무시할 수도 있습니다. 델리게이트 없이 URLProtocol 자체 내부에서 URLSession 를 사용하는 경우, Instana iOS 에이전트에서 이 세션을 무시해야 합니다. 그렇지 않으면 요청과 응답이 이중으로 모니터링됩니다.
iOS: 스위즐링이 위험하지 않나요?
항상 그렇지는 않습니다. 런타임에서 쓸어넘기기는 대부분 메소드를 추가하여 수행됩니다.
func swizzled_touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
// looks weird, but it calls the original implementation
swizzled_touchesBegan(touches, with: event)
print("do some custom magic here")
}
그런 다음 다음을 통해 새 메소드와 이전 메소드가 교환됩니다.
if let originalMethod = class_getInstanceMethod(UIResponder.self, #selector(touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?))),
let swizzledMethod = class_getInstanceMethod(UIResponder.self, #selector(swizzled_touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?))) {
method_exchangeImplementations(originalMethod, swizzledMethod)
}
그러나 런타임이 UIResponder에서와 같이 전달 호출을 작성할 때 예기치 않은 동작이 발생할 수 있습니다. 때로는 런타임이 메시지 전달을 수행합니다. 이 스위즐링 기법은 메시지(예: `new swizzled_touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?)`)가 `new` 메서드가 정의되어 있지 않은 다른 수신자에게 전달될 경우, 프로그램이 중단될 수 있습니다. InstanaiOS 에이전트에서는 클래스에 두 번째 메서드를 추가할 수 없습니다. 따라서, 원래 선택자에 (블록을 통해) 새로운 구현을 직접 설정하여 원래 구현을 재정의합니다. 임시로 저장된 원래 구현은 새 함수 내에서 호출되므로, 스와이프 (swizzling) 는 추적을 남기지 않습니다.
iOS: 백그라운드 세션을 모니터링할 수 있습니까?
아니오, 사용자 정의 URLProtocol 서브클래스가 백그라운드 세션에 사용 가능하지 않기 때문입니다. (URLSession 문서 참조)
백엔드 상관 관계가 HTTP 요청과 어떻게 작동합니까?
모든 HTTP 요청에는 Instana의 호스트 에이전트가 모니터하는 백엔드에 자동 백엔드 상관이 포함됩니다. 클라이언트 측에서 별도로 추적하거나 설정할 필요가 없을 수도 있습니다.
어떤 HTTP 헤더가 사용되고 있습니까?
백엔드 상관 관계를 설정하기 위해 에이전트는 다음의 HTTP 헤더를 사용합니다:
- 응답 헤더:
Server-Timing
iOS 요구 사항
어떤 iOS 버전이 지원됩니까?
iOS : Instana iOS 에이전트는 iOS 12부터 호환됩니다.
어떤 스위프트 버전이 지원됩니까?
Swift 5(Xcode 10.2 부터) 이상.
어떻게 iOS 에이전트를 설치합니까?
Xcode 내의 ‘ Swift ’ 패키지 관리자를 사용하세요. 또는 CocoaPods를 사용할 수 있습니다. Instana iOS 에이전트를 설정하려면. application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions:내의 메서드 하나를 호출하십시오.
Android 시스템 요구 사항
어떤 Android 버전이 지원됩니까?
지원되는 최소 API 레벨: Android API 16(Android 4.1 "Jelly Bean").
AndroidX : ` AndroidX `가 지원되며 필수입니다.
지원되는 언어는 무엇입니까?
언어: Java 및 Kotlin 모두가 지원됩니다.
Java 호환 대상 : Java 1.8 이상.
이 Duplicate class com.google.common.util.concurrent.ListenableFuture 컴파일 오류는 무엇을 의미하나요?
앱이 guava에 의존하고 있는 경우, Instana Android 에이전트를 추가한 후 다음과 같은 컴파일 오류가 발생할 수 있습니다.
Duplicate class com.google.common.util.concurrent.ListenableFuture found in modules guava-25.0-android.jar (com.google.guava:guava:25.0-android) and listenablefuture-1.0.jar (com.google.guava:listenablefuture:1.0)
이 문제를 해결하려면 앱에 다음 종속성을 추가하세요:
implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'
이 NoSuchMethodError: No virtual method log(Ljava/lang/String;)V in class Lokhttp3/internal/Platform; 런타임 오류는 무엇을 의미하나요?
이는 애플리케이션의 해결 OkHttp 방식과 OkHttp-logging-interceptor 버전이 서로 다를 때 발생할 수 있는 잘 알려진 문제와 관련이 있습니다. 이 상황에 대한 자세한 내용은 다음 링크에서 확인할 수 있습니다: https://github.com/square/okhttp/issues/2839.
Instana Android 에이전트는 를 사용하며 OkHttp v4, 이는 보다 최신 OkHttp 버전일 수 있습니다.
이 문제를 해결하려면 애플리케이션을 최신 OkHttpOkHttp-logging-interceptor 버전으로 업데이트하십시오.
StrictMmode 오류는 android.os.StrictMode$StrictModeDiskReadViolation 무엇을 의미하나요?
Instana Android 에이전트는 Java 의 UUID를 사용합니다.
Android API 18 및 그 이전 버전에서 StrictMode 에 의해 발생하는 잘 알려진 오탐지 사례가 있습니다: https://issuetracker.google.com/issues/36969031.
해결 방법: API 18 및 이전 버전의 경우 detectDiskReads 또는 기능을 penaltyDeath 비활성화하십시오.
이 java.lang.NoSuchMethodError: No virtual method setInitialDelay 컴파일 오류는 무엇을 의미하나요?
오류: java.lang.NoSuchMethodError: No virtual method setInitialDelay(JLjava/util/concurrent/TimeUnit;)Landroidx/work/OneTimeWorkRequest$Builder; in class Landroidx/work/OneTimeWorkRequest$Builder; or its super classes (declaration of 'androidx.work.OneTimeWorkRequest$Builder'
WorkManager 2.1.0이 setInitialDelay의 메소드 서명을 변경했습니다. WorkManager 이전 2.1.0:
abstract class WorkRequest {
abstract static class Builder<B extends Builder, W extends WorkRequest> {
}
}
class OneTimeWorkRequest extends WorkRequest {
static class Builder extends WorkRequest.Builder<Builder, OneTimeWorkRequest> {
public @NonNull Builder setInitialDelay(long duration, @NonNull TimeUnit timeUnit) {
....
}
}
}
WorkManager 이후 2.1.0:
abstract class WorkRequest {
abstract static class Builder<B extends Builder, W extends WorkRequest> {
public @NonNull B setInitialDelay(long duration, @NonNull TimeUnit timeUnit) {
...
}
}
}
class OneTimeWorkRequest extends WorkRequest {
static class Builder extends WorkRequest.Builder<Builder, OneTimeWorkRequest> {
}
}
실질적으로, 프로젝트 내의 모든 종속성은 반드시 WorkManager 2.1.0 + 또는 그 이전 버전을 사용해야 합니다.
Instana Android Agent는 WorkManager 2.4.0+를 사용합니다.
이 오류가 발생한다면, 가장 유력한 원인은 다른 종속성에서 더 오래된 버전의 WorkManager 를 사용하고 있기 때문일 가능성이 높습니다. 이를 업데이트해야 합니다.
이 Required: PROJECT. Found: EXTERNAL_LIBRARIES, PROJECT, SUB_PROJECTS 컴파일 오류는 무엇을 의미하나요?
이 오류는 3.6.1 보다 이전 버전의 Android Gradle 플러그인이 필요한 Gradle 플러그인을 Android Gradle 플러그인 3.6.1 이상 버전으로 컴파일할 때 발생하는 것으로 알려져 있습니다.
예를 들어, Realm Database 플러그인( 7.0.1 )을 Android용 Gradle 플러그인( 4.0.1 ) 및 Instana Android 에이전트( 3.4.0 )와 함께 사용할 경우, 다음과 같은 컴파일 오류가 발생할 수 있습니다. 결과 오류 로그에는 먼저 영역의 변환기 태스크 실패에 대한 참조가 포함되어 있습니다. 그런 다음 일부 다른 플러그인 (관련되지 않음) 에 대한 참조가 포함되어 있을 수 있습니다.
[...]
Task :app:transformClassesWithRealmTransformerForDevevelopDebug FAILED
[...]
이 문제를 해결하려면 문제가 되는 플러그인을 업그레이드하십시오.
또는 다음 중 하나를 수행하십시오.
문제가 되는 플러그인보다 나중에 ‘ Instana ’ 안드로이드 에이전트 플러그인이 시작되도록 하십시오. 예를 들면 다음과 같습니다.
apply plugin: 'com.android.application' apply plugin: 'realm-android' apply plugin: 'com.instana.android-agent-plugin'앱의 Android Gradle 플러그인을 문제가 되는 플러그인이 요구하는 버전으로 다운그레이드하십시오
ajc-transform에서 Problem processing attributes... 컴파일 오류는 무엇을 의미합니까?
현재로서는 Firebase Performance 플러그인이 적용하는 바이트코드 변환 중 하나가 Instana 안드로이드 에이전트의 정상적인 작동을 방해하는 부작용이 있는 것으로 보입니다.
이 문제를 방지하려면 Firebase Performance 플러그인보다 먼저 Instana 의 Android 에이전트가 실행되도록 하십시오.
프로젝트에 각 플러그인을 추가하는 순서를 변경하면 이 작업을 수행할 수 있습니다:
apply plugin: 'com.instana.android-agent-plugin' // Instana agent will be applied before Firebase Performance
apply plugin: 'com.google.firebase.firebase-perf'
Unable to find method... 컴파일 오류는 무엇을 의미합니까?
Instana 의 각 주요 Android 에이전트 버전은 특정 Android Gradle 플러그인 브랜치와 호환됩니다.
이 오류는 사용 중인 Android Gradle 플러그인이 Instana Android 에이전트에서 지원되지 않을 때 가장 흔히 발생합니다.
문서의 Android Gradle 플러그인 및 Gradle 버전 섹션을 참조하여 호환성 매트릭스를 확인하고 앱의 현재 Android Gradle 플러그인 버전을 찾을 수 있는 위치를 학습하십시오.
이 Failed resolution of: Landroidx/work/impl/utils/futures/AbstractFuture 런타임 오류는 무엇을 의미하나요?
전체 오류는 다음과 같습니다. Fatal Exception: java.lang.NoClassDefFoundError: Failed resolution of: Landroidx/work/impl/utils/futures/AbstractFuture;
일부 지점에서 앱 종속 항목에 9999.0-empty-to-avoid-conflict-with-guava 에 대한 종속 항목이 필요하지만 더 이상 필요하지 않은 경우에 발생할 수 있습니다.
앱에 다음과 같은 종속 항목이 포함되어 있는 경우 이를 제거해 보십시오.
implementation 'com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava'
이 Execution failed for task ':app:transformClassesWithDexBuilderFor...' 컴파일 오류는 무엇을 의미하나요?
전체 오류는 다음과 같습니다(예를 들어 DevDebug 특징의 경우).
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:transformClassesWithDexBuilderForDevDebug'.
> There were multiple failures while executing work items
> A failure occurred while executing com.android.build.gradle.internal.transforms.DexArchiveBuilderTransform$DexConversionWorkAction
> Failed to process /Users/developer/Projects/mobile-app/android/app/build/intermediates/javac/devDebug/classes
[...]
이 오류는 ‘ Instana ’ 에이전트 버전과 ‘Android Gradle ’ 플러그인 버전 간의 불일치를 나타냅니다. 지원되는 조합에 대해 알아보려면 플랫폼별 설치 지시사항을 참조하십시오.
React Native
InstanaReact Native 에이전트는 iOS 플랫폼에서는 iOS 에이전트를 호출하고, Android 플랫폼에서는 Android 에이전트를 호출합니다. iOS 에이전트 또는 Android 에이전트는 React Native 의 에이전트 업그레이드 기능을 통해 업그레이드할 수 있습니다. 자세한 정보는 각 플랫폼에 특정한 문서를 참조하십시오.
iOS 에이전트와 Android 에이전트의 캐시를 지우는 방법은 무엇인가요?
모바일 앱에서 React Native 에이전트를 새 버전으로 업그레이드한 후, 터미널에서 다음 명령어를 실행하여 iOS 에이전트와 Android 에이전트의 캐시된 이전 버전을 완전히 정리하십시오:
cd android && ./gradlew clean
cd ..
cd ios && pod cache clean --all && rm -rf build
cd ..
rm -rf node_modules
yarn cache clean --force
yarn install
cd ios && pod install
민감한 데이터
사용자를 고유하게 식별할 수 있는 데이터를 수집하고 계신가요?
기본적으로 Instana 에이전트는 개별 사용자를 식별할 수 있는 데이터를 포함 하지 않습니다. 또한 에이전트는 디바이스 지문 인식과 같은 기술을 적용하지 않습니다 .
사용자별 데이터는 iOS 사용자( API ) 또는 Android 사용자( API )를 통해 Instana 에 제공될 수 있습니다.
Instana에 전송된 사용자 데이터로 무엇을 수행하고 있습니까?
Instana Agent는 고객이 사용자 식별 정보를 Instana로 전송하도록 구성할 수 있습니다. 이 정보는 Instana 내에서 사용자에게 표시되는 기능을 제공하는 데에만 사용됩니다. Instana는 다른 방법으로 이 데이터를 해석하지 않으며 고객 전체에 상관되지도 않습니다.
사용자 데이터를 Instana로 전송한 후 삭제할 수 있습니까?
빈번하지 않은 삭제 요청 (예: GDPR 준수) 이 지원됩니다. 자주 또는 주기적으로 삭제 요청이 들어올 것으로 예상된다면, 대신 익명화된 데이터(예: 해시 처리된 사용자 ID)를 Instana 로 전송해 주십시오.
IP를 익명으로 처리하고 있습니까?
네, IP는 익명화되어 있습니다. 기본적으로 IPv4 주소의 마지막 옥텟 및 IPv6 주소의 마지막 80비트는 0으로 설정됩니다. Instana 사용자 인터페이스 내 모바일 앱 대시보드의 ‘설정’ 탭을 통해 더 엄격한 익명화 규칙을 구성할 수 있습니다.
각 프레임워크에는 어떤 기능이 있나요?
다음 표는 각 프레임워크에서 사용할 수 있는 기능을 요약한 것입니다:
기능 |
기본 Android |
iOS 네이티브 |
Flutter |
React Native |
참고 |
|---|---|---|---|---|---|
성능 모니터링 (메모리 부족, 앱 실행 시간, 페이지 렌더링 소요 시간 및 앱 종료) |
지원됨 |
지원됨 |
지원되지 않음 |
지원되지 않음 |
해당 플랫폼에서만 사용 가능 |
ANR (응용 프로그램 응답 없음) |
지원됨 (스택 트레이스 포함) |
지원됨 |
지원되지 않음 |
지원되지 않음 |
Android에서 지원되는 스택 트레이스 |
과도한 네트워크 사용량 |
지원됨 |
지원되지 않음 |
지원되지 않음 |
지원되지 않음 |
Android에서만 지원됩니다 |
삭제된 비컨 |
지원됨 |
지원됨 |
지원됨 |
지원됨 |
모든 플랫폼에서 이용 가능 |
자동 HTTP 모니터링 |
지원됨 |
지원됨 |
지원됨 |
지원됨 |
네트워크 요청을 자동으로 추적합니다 |
수동 HTTP 모니터링 |
지원됨 |
지원됨 |
지원됨 |
지원되지 않음 |
네이티브 플랫폼 및 Flutter 에서만 이용 가능합니다 |
autoCaptureScreenNames |
지원됨 |
지원됨 |
지원됨 |
지원되지 않음 |
React Native 에서는 제공되지 않습니다 |
enableW3CHeaders |
지원됨 |
지원됨 |
지원됨 |
지원됨 |
W3C 컨텍스트 헤더 추적 지원 |
속도 한계 |
지원됨 |
지원됨 |
지원됨 |
지원됨 |
모든 플랫폼에서 이용 가능 |
Instana 는 React Native 와 함께 Expo를 지원하나요?
현재 Instana 의 Android 에이전트는 모든 React Native 애플리케이션에서 프로젝트 수준 및 앱 수준의 ` Gradle ` 파일을 모두 수정해야 합니다. 자세한 내용은 React Native 의 Android 설정 안내를 참조하세요.
그러나 Expo에서 관리하는 워크플로에서는 파일이 build.gradle 빌드 단계에서 생성되므로 직접 수정할 수 없습니다. 이 제한 사항은 수동 종속성 관리를 허용하는 Bare 또는 Ejected 워크플로를 사용할 때에만 적용됩니다.
임시 해결책으로, Instana 안드로이드 에이전트를 Expo와 연동하기 위해 사용자 정의 Expo 구성 플러그인을 생성할 수 있습니다. 이 방법은 실험적인 것이므로 모든 Expo 환경에서 작동하지 않을 수 있습니다. Instana 이 방법이나 Expo에서 관리하는 워크플로에 대해서는 공식적인 지원을 제공하지 않습니다.
프로젝트 루트 디렉터리에 app.plugin.js 라는 이름의 새 파일을 만들고 다음 내용을 추가하세요:
const {
withProjectBuildGradle,
withAppBuildGradle,
createRunOncePlugin,
} = require('@expo/config-plugins');
const INSTANA_ANDROID_PLUGIN_VERSION = '6.2.5';
const PLUGIN_NAME = 'withInstanaAndroidPlugin';
// Modify android/build.gradle
const withInstanaProjectGradle = (config) => {
return withProjectBuildGradle(config, (config) => {
if (config.modResults.language === 'groovy') {
let buildGradle = config.modResults.contents;
// Add INSTANA version to ext block if not present
if (!buildGradle.includes('INSTANA_ANDROID_PLUGIN_VERSION')) {
buildGradle = buildGradle.replace(
/ext\s*{([\s\S]*?)}/,
(match, contents) => {
return `ext {
${contents.trim()}
INSTANA_ANDROID_PLUGIN_VERSION = "${INSTANA_ANDROID_PLUGIN_VERSION}"
}`;
}
);
}
// Add classpath dependency
if (!buildGradle.includes('com.instana:android-agent-plugin')) {
buildGradle = buildGradle.replace(
/dependencies\s*{([\s\S]*?)}/,
(match, contents) => {
return `dependencies {
${contents.trim()}
classpath "com.instana:android-agent-plugin:$INSTANA_ANDROID_PLUGIN_VERSION"
}`;
}
);
}
config.modResults.contents = buildGradle;
}
return config;
});
};
// Modify android/app/build.gradle
const withInstanaAppGradle = (config) => {
return withAppBuildGradle(config, (config) => {
if (config.modResults.language === 'groovy') {
let appGradle = config.modResults.contents;
// Ensure plugin is applied only once
if (!appGradle.includes("apply plugin: 'com.instana.android-agent-plugin'")) {
appGradle = `apply plugin: 'com.instana.android-agent-plugin'\n` + appGradle;
}
config.modResults.contents = appGradle;
}
return config;
});
};
// Combine both modifications
const withInstanaPlugin = (config) => {
config = withInstanaProjectGradle(config);
config = withInstanaAppGradle(config);
return config;
};
module.exports = createRunOncePlugin(withInstanaPlugin, PLUGIN_NAME, '1.0.0');
의 app.json 또는 app.config.js파일에 다음 구성을 추가하여 플러그인을 등록하십시오:
module.exports = {
expo: {
name: 'my-app',
slug: 'my-app',
plugins: ['./app.plugin.js'],
},
};
Instana 은 native_dio_adapterFlutter 을 지원하나요?
현재 Instana 은 Flutter 을 native_dio_adapter 지원하지 않습니다. 안드로이드에서 이 native_dio_adapter 패키지는 HTTP 요청을 Google 의 기본 네트워킹 라이브러리인 Cronet을 통해 전달합니다. 이 접근 방식은 Dart HttpClient ( Flutter 의 Instana 에이전트가 이를 통해 HttpOverrides모니터링함)와 `net.android.net.IPv4.IPv4NetworkClass` OkHttpClient 및 `net.android.net. HttpURLConnection IPv4.IPv4NetworkClass`와 같은 표준 Android 네트워킹 클래스(네이티브 Android 에이전트가 바이트코드 계측을 통해 모니터링함)를 모두 우회합니다. 이러한 레이어가 건너뛰어지기 때문에, Instana 안드로이드 에이전트는 현재. native_dio_adapter을 사용하여 전송된 네트워크 요청을 캡처할 수 없습니다.
Instana Instana 를 통해 모니터링할 수 있는 지원되는 안드로이드 네트워킹 클라이언트 목록을 제공합니다. 는 이러한 지원되는 클래스에 의존하지 native_dio_adapter 않으므로, 이를 사용할 때 Android 앱에서 관련 로그나 네트워크 추적 정보를 확인할 수 없습니다. iOS, 에서는 여전히 일부 네트워크 활동이 보고될 수 있지만, 네이티브 레이어와 Dart 레이어 양쪽에서 데이터 수집이 중복되어 결과가 일관되지 않거나 중복될 수 있습니다.
에 대한 공식 native_dio_adapter 지원이 도입될 때까지는, 수동으로 HTTP 모니터링을 수행하는 것이 권장되는 해결 방법입니다. 수동 모니터링을 사용하면 Flutter Instana 에이전트를 통해 지연 시간, 응답 상태, 오류 등 네트워크 요청 세부 정보를 명시적으로 기록할 수 있습니다. 설정 방법 및 예시는 ‘ HTTP 모니터링’ 설명서를 참조하십시오.