feat: Support reporting multiple logs (#49)
* fix: update message
* feat: reports multiple errors
* docs: add comment
* fix: ajax errors
* fix: report errors log
diff --git a/src/errors/ajax.ts b/src/errors/ajax.ts
index 1a4879a..d2174b5 100644
--- a/src/errors/ajax.ts
+++ b/src/errors/ajax.ts
@@ -17,7 +17,7 @@
import uuid from '../services/uuid';
import Base from '../services/base';
-import { GradeTypeEnum, ErrorsCategory } from '../services/constant';
+import { GradeTypeEnum, ErrorsCategory, ReportTypes } from '../services/constant';
class AjaxErrors extends Base {
// get http error info
@@ -29,6 +29,11 @@
const xhrEvent = (event: any) => {
try {
if (event && event.currentTarget && (event.currentTarget.status >= 400 || event.currentTarget.status === 0)) {
+ const response = 'net::ERR_EMPTY_RESPONSE';
+
+ if (event.target && event.target.getRequestConfig[1] === options.collector + ReportTypes.ERRORS) {
+ return;
+ }
this.logInfo = {
uniqueId: uuid(),
service: options.service,
@@ -36,10 +41,10 @@
pagePath: options.pagePath,
category: ErrorsCategory.AJAX_ERROR,
grade: GradeTypeEnum.ERROR,
- errorUrl: event.target.responseURL,
- message: event.target.response,
+ errorUrl: event.target.getRequestConfig[1],
+ message: event.target.response || response,
collector: options.collector,
- stack: event.type + ':' + event.target.response,
+ stack: event.type + ': ' + (event.target.response || response),
};
this.traceInfo();
}
diff --git a/src/services/base.ts b/src/services/base.ts
index bd4a508..9c8ac20 100644
--- a/src/services/base.ts
+++ b/src/services/base.ts
@@ -41,41 +41,13 @@
jsErrorPv = true;
this.logInfo.firstReportedError = true;
}
- this.handleRecordError();
+ const collector = this.logInfo.collector;
+
+ delete this.logInfo.collector;
+ Task.addTask(this.logInfo, collector);
+ // report errors within 1min
setTimeout(() => {
Task.fireTasks();
- }, 100);
- }
-
- private handleRecordError() {
- try {
- if (!this.logInfo.message) {
- return;
- }
- const errorInfo = this.handleErrorInfo();
-
- Task.addTask(errorInfo);
- } catch (error) {
- throw error;
- }
- }
-
- private handleErrorInfo() {
- let message = `error category:${this.logInfo.category}\r\n log info:${this.logInfo.message}\r\n
- error url: ${this.logInfo.errorUrl}\r\n `;
-
- switch (this.logInfo.category) {
- case ErrorsCategory.JS_ERROR:
- message += `error line number: ${this.logInfo.line}\r\n error col number:${this.logInfo.col}\r\n`;
- break;
- default:
- message;
- break;
- }
- const recordInfo = {
- ...this.logInfo,
- message,
- };
- return recordInfo;
+ }, 60000);
}
}
diff --git a/src/services/report.ts b/src/services/report.ts
index 263bf8e..96ddae4 100644
--- a/src/services/report.ts
+++ b/src/services/report.ts
@@ -51,7 +51,6 @@
}
public sendByXhr(data: any) {
- delete data.collector;
if (!this.url) {
return;
}
diff --git a/src/services/task.ts b/src/services/task.ts
index 0fd44df..b777a43 100644
--- a/src/services/task.ts
+++ b/src/services/task.ts
@@ -14,23 +14,24 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+import { ErrorInfoFeilds, ReportFields } from './types';
import Report from './report';
class TaskQueue {
- private queues: any[] = [];
+ private queues: ((ErrorInfoFeilds & ReportFields) | undefined)[] = [];
+ private collector: string = '';
- public addTask(data: any) {
- this.queues.push({ data });
+ public addTask(data: ErrorInfoFeilds & ReportFields, collector: string) {
+ this.queues.push(data);
+ this.collector = collector;
}
public fireTasks() {
- if (!this.queues || !this.queues.length) {
+ if (!(this.queues && this.queues.length)) {
return;
}
- const item = this.queues[0];
- new Report('ERROR', item.data.collector).sendByXhr(item.data);
- this.queues.splice(0, 1);
- this.fireTasks();
+ new Report('ERRORS', this.collector).sendByXhr(this.queues);
+ this.queues = [];
}
}
diff --git a/src/trace/interceptors/fetch.ts b/src/trace/interceptors/fetch.ts
index 5d946ed..5bbb1e2 100644
--- a/src/trace/interceptors/fetch.ts
+++ b/src/trace/interceptors/fetch.ts
@@ -73,6 +73,10 @@
const index = segment.spans.length;
const values = `${1}-${traceIdStr}-${segmentId}-${index}-${service}-${instance}-${endpoint}-${peer}`;
+ if (!args[1]) {
+ args[1] = {};
+ args[1].headers = {};
+ }
args[1].headers['sw8'] = values;
}