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")
}
}