Skip to content

Commit ee78be6

Browse files
committed
ui error handling
1 parent 6a140f9 commit ee78be6

File tree

4 files changed

+48
-11
lines changed

4 files changed

+48
-11
lines changed

ide-common/src/main/kotlin/org/digma/intellij/plugin/common/FrequencyDetector.kt

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,12 @@ class FrequencyDetector(cacheExpirationTime: java.time.Duration) {
1818
val occurrences = counter.incrementAndGet()
1919
return occurrences > 1
2020
}
21-
22-
23-
24-
21+
fun isTooFrequentStackTrace(message: String, stacktrace: String): Boolean {
22+
val hash = stacktrace.hashCode()
23+
val counter = myCache.getOrCreate(message, hash.toString())
24+
val occurrences = counter.incrementAndGet()
25+
return occurrences > 1
26+
}
2527
fun isTooFrequentError(message: String, action: String): Boolean {
2628
val counter = myCache.getOrCreate(message, action)
2729
val occurrences = counter.incrementAndGet()

ide-common/src/main/kotlin/org/digma/intellij/plugin/errorreporting/ErrorReporter.kt

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,32 @@ open class ErrorReporter {
116116
)
117117
}
118118

119-
//this method is used to report an error that is not an exception. it should contain some details to say what the error is
119+
private fun isTooFrequent(message: String, stackTrace: String ?): Boolean{
120+
if(!stackTrace.isNullOrEmpty()){
121+
return frequencyDetector.isTooFrequentStackTrace(message, stackTrace);
122+
}
123+
return frequencyDetector.isTooFrequentError(message,"");
124+
}
125+
open fun reportError(message: String, stackTrace: String ?, details: Map<String, Any>, project: Project?) {
126+
if(message.isNullOrEmpty() && stackTrace.isNullOrEmpty())
127+
{
128+
reportError(project, "At least one of the following properties must be set: [message] or [stackTrace].","reportError",
129+
mapOf(
130+
SEVERITY_PROP_NAME to SEVERITY_HIGH_TRY_FIX
131+
))
132+
return
133+
}
134+
if(isTooFrequent(message, stackTrace)) {
135+
return
136+
}
137+
val projectToUse = project ?: findActiveProject()
138+
139+
projectToUse?.let {
140+
if (it.isDisposed) return
141+
ActivityMonitor.getInstance(it).registerError(null, message, details)
142+
}
143+
}
144+
//this method is used to report an error that is not an exception. it should contain some details to say what the error is
120145
open fun reportError(project: Project?, message: String, action: String, details: Map<String, String>) {
121146

122147

ide-common/src/main/kotlin/org/digma/intellij/plugin/posthog/ActivityMonitor.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -315,7 +315,7 @@ class ActivityMonitor(private val project: Project) : Disposable {
315315
}
316316

317317

318-
fun registerError(exception: Throwable?, message: String, extraDetails: Map<String, String> = mapOf()) {
318+
fun registerError(exception: Throwable?, message: String, extraDetails: Map<String, Any> = mapOf()) {
319319

320320
try {
321321
val osType = System.getProperty("os.name")
@@ -327,7 +327,7 @@ class ActivityMonitor(private val project: Project) : Disposable {
327327

328328
//Don't call directly, use ErrorReporter.reportError
329329

330-
val details = mutableMapOf(
330+
val details = mutableMapOf<String,Any>(
331331
"error.source" to "plugin",
332332
"action" to "unknown",
333333
"message" to message,

src/main/kotlin/org/digma/intellij/plugin/ui/jcef/BaseMessageRouterHandler.kt

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -146,11 +146,21 @@ abstract class BaseMessageRouterHandler(protected val project: Project) : Common
146146
val trackingRequest = jsonToObject(request, SendTrackingEventRequest::class.java)
147147
trackingRequest.let {
148148
it.payload?.let { pl ->
149-
if (pl.data == null) {
150-
ActivityMonitor.getInstance(project).registerCustomEvent(pl.eventName)
151-
} else {
152-
ActivityMonitor.getInstance(project).registerCustomEvent(pl.eventName, pl.data)
149+
if(pl.eventName == "error"){
150+
pl.data?.let {
151+
val stackTrace = pl.data["exception.stack-trace"] as String
152+
val message = pl.data["message"]as String
153+
ErrorReporter.getInstance().reportError(message,stackTrace,pl.data, project)
154+
}
153155
}
156+
else{
157+
if (pl.data == null) {
158+
ActivityMonitor.getInstance(project).registerCustomEvent(pl.eventName)
159+
} else {
160+
ActivityMonitor.getInstance(project).registerCustomEvent(pl.eventName, pl.data)
161+
}
162+
}
163+
154164
}
155165
}
156166
}

0 commit comments

Comments
 (0)