diff --git a/json/resources/intellij.json.xml b/json/resources/intellij.json.xml index 09c64debed11..82c061ab0262 100644 --- a/json/resources/intellij.json.xml +++ b/json/resources/intellij.json.xml @@ -120,6 +120,7 @@ + diff --git a/json/src/com/jetbrains/jsonSchema/fus/JsonHttpFileResolveFus.kt b/json/src/com/jetbrains/jsonSchema/fus/JsonHttpFileResolveFus.kt new file mode 100644 index 000000000000..1c79247f170d --- /dev/null +++ b/json/src/com/jetbrains/jsonSchema/fus/JsonHttpFileResolveFus.kt @@ -0,0 +1,56 @@ +// Copyright 2000-2025 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. +package com.jetbrains.jsonSchema.fus + +import com.intellij.internal.statistic.eventLog.EventLogGroup +import com.intellij.internal.statistic.eventLog.events.EventFields +import com.intellij.internal.statistic.service.fus.collectors.CounterUsagesCollector +import com.intellij.openapi.vfs.impl.http.RemoteFileState + +internal object JsonHttpFileLoadingUsageCollector : CounterUsagesCollector() { + private val jsonHttpFileResolveGroup = EventLogGroup( + id = "json.http.file.resolve", + version = 1, + ) + + internal val jsonSchemaHighlightingSessionData = + jsonHttpFileResolveGroup.registerVarargEvent( + "json.schema.highlighting.session.finished", + JsonHttpFileNioFile, + JsonHttpFileNioFileCanBeRead, + JsonHttpFileNioFileLength, + JsonHttpFileVfsFile, + JsonHttpFileSyncRefreshVfsFile, + JsonHttpFileVfsFileValidity, + JsonHttpFileDownloadState + ) + + override fun getGroup(): EventLogGroup = jsonHttpFileResolveGroup +} + +internal val JsonHttpFileNioFile = EventFields.Boolean("nio_file_resolve_status", "Remote schema found via nio.file api") +internal val JsonHttpFileNioFileCanBeRead = EventFields.Boolean("nio_file_can_read_status", "Remote schema found via nio.file api can be read") +internal val JsonHttpFileNioFileLength = EventFields.RoundedLong("nio_file_length_status", "Remote schema found via nio.file api length") +internal val JsonHttpFileVfsFile = EventFields.Boolean("vfs_file_resolve_status", "Remote schema found via VFS api") +internal val JsonHttpFileSyncRefreshVfsFile = EventFields.Boolean("vfs_refresh_file_resolve_status", "Remote schema found via VFS api after explicit synchronous refresh") +internal val JsonHttpFileVfsFileValidity = EventFields.Boolean("vfs_file_validity_status", "Remote schema VFS file validity") +internal val JsonHttpFileDownloadState = EventFields.Enum("http_file_download_status", "Remote file download state") + +internal enum class JsonRemoteSchemaDownloadState { + DOWNLOADING_NOT_STARTED, + DOWNLOADING_IN_PROGRESS, + DOWNLOADED, + ERROR_OCCURRED, + NO_STATE; + + companion object { + fun fromRemoteFileState(state: RemoteFileState?): JsonRemoteSchemaDownloadState { + return when (state) { + null -> NO_STATE + RemoteFileState.DOWNLOADING_NOT_STARTED -> DOWNLOADING_NOT_STARTED + RemoteFileState.DOWNLOADING_IN_PROGRESS -> DOWNLOADING_IN_PROGRESS + RemoteFileState.DOWNLOADED -> DOWNLOADED + RemoteFileState.ERROR_OCCURRED -> ERROR_OCCURRED + } + } + } +} diff --git a/json/src/com/jetbrains/jsonSchema/widget/failedSchemaLoadingDiagnostics.kt b/json/src/com/jetbrains/jsonSchema/widget/failedSchemaLoadingDiagnostics.kt index 68341fe66b9c..46c6ee24d08c 100644 --- a/json/src/com/jetbrains/jsonSchema/widget/failedSchemaLoadingDiagnostics.kt +++ b/json/src/com/jetbrains/jsonSchema/widget/failedSchemaLoadingDiagnostics.kt @@ -6,6 +6,7 @@ import com.intellij.openapi.diagnostic.Logger import com.intellij.openapi.project.Project import com.intellij.openapi.vfs.VfsUtil import com.intellij.openapi.vfs.impl.http.HttpVirtualFile +import com.jetbrains.jsonSchema.fus.* import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.launch @@ -27,6 +28,15 @@ internal fun logSchemaDownloadFailureDiagnostics(schemaFile: HttpVirtualFile, pr val anotherFileLookupAttempt = VfsUtil.findFile(schemaFile.toNioPath(), true) val isNull = anotherFileLookupAttempt == null val isValid = anotherFileLookupAttempt?.isValid + JsonHttpFileLoadingUsageCollector.jsonSchemaHighlightingSessionData.log( + JsonHttpFileNioFile.with(nioFileExists), + JsonHttpFileNioFileCanBeRead.with(canRead), + JsonHttpFileNioFileLength.with(nioFileLength), + JsonHttpFileVfsFile.with(schemaFile.fileInfo?.localFile != null), + JsonHttpFileSyncRefreshVfsFile.with(anotherFileLookupAttempt != null), + JsonHttpFileVfsFileValidity.with(isValid ?: false), + JsonHttpFileDownloadState.with(JsonRemoteSchemaDownloadState.fromRemoteFileState(stateOrNull)) + ) Logger.getInstance(schemaFile.javaClass).error("$instantData, syncRefreshFileIsNull: $isNull, syncRefreshFileIsValid: $isValid") } }