[json] IJPL-173495 Report failures to FUS to be able to investigate a missing downloads problem faster

GitOrigin-RevId: 109ad24b92cd2ebd43b24f20279d2725a61d4121
This commit is contained in:
Nikita Katkov
2025-03-07 21:04:16 +00:00
committed by intellij-monorepo-bot
parent 8d61d23a40
commit ea77354891
3 changed files with 67 additions and 0 deletions
+1
View File
@@ -120,6 +120,7 @@
<pluginSuggestionProvider implementation="com.jetbrains.jsonSchema.wiremock.WireMockSuggestionProvider"/>
<statistics.counterUsagesCollector implementationClass="com.jetbrains.jsonSchema.fus.JsonFeatureUsageCollector"/>
<statistics.counterUsagesCollector implementationClass="com.jetbrains.jsonSchema.fus.JsonHttpFileLoadingUsageCollector"/>
<statistics.validation.customValidationRule implementation="com.jetbrains.jsonSchema.fus.JsonSchemaIdValidationRule"/>
</extensions>
@@ -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<JsonRemoteSchemaDownloadState>("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
}
}
}
}
@@ -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")
}
}