@grafana/faro-transport-otlp-http 1.1.3 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bundle/faro-transport-otlp-http.iife.js +1 -1
- package/dist/cjs/payload/OtelPayload.js.map +1 -1
- package/dist/cjs/payload/index.js.map +1 -1
- package/dist/cjs/payload/transform/index.js.map +1 -1
- package/dist/cjs/payload/transform/transform.js +1 -0
- package/dist/cjs/payload/transform/transform.js.map +1 -1
- package/dist/cjs/payload/transform/types.js.map +1 -1
- package/dist/cjs/payload/types.js.map +1 -1
- package/dist/cjs/transport.js +4 -3
- package/dist/cjs/transport.js.map +1 -1
- package/dist/esm/payload/OtelPayload.js.map +1 -1
- package/dist/esm/payload/index.js.map +1 -1
- package/dist/esm/payload/transform/index.js.map +1 -1
- package/dist/esm/payload/transform/transform.js +1 -0
- package/dist/esm/payload/transform/transform.js.map +1 -1
- package/dist/esm/payload/transform/types.js.map +1 -1
- package/dist/esm/payload/types.js.map +1 -1
- package/dist/esm/transport.js +1 -1
- package/dist/esm/transport.js.map +1 -1
- package/dist/types/payload/index.d.ts +2 -2
- package/dist/types/payload/transform/index.d.ts +1 -1
- package/dist/types/payload/transform/types.d.ts +6 -4
- package/dist/types/payload/types.d.ts +5 -3
- package/dist/types/transport.d.ts +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
var GrafanaFaroTransportOtlpHttp=function(e){"use strict";function t(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}function n(e,t){return typeof e===t}const r=e=>n(e,"number")&&!isNaN(e)||n(e,"bigint"),o=e=>!(e=>n(e,"null"))(e)&&n(e,"object"),s=e=>function(e,t){return Object.prototype.toString.call(e)===`[object ${t}]`}(e,"Array");function i(){}var a,l;!function(e){e.EXCEPTION="exception",e.LOG="log",e.MEASUREMENT="measurement",e.TRACE="trace",e.EVENT="event"}(a||(a={})),a.EXCEPTION,a.LOG,a.MEASUREMENT,a.TRACE,a.EVENT,function(e){e[e.OFF=0]="OFF",e[e.ERROR=1]="ERROR",e[e.WARN=2]="WARN",e[e.INFO=3]="INFO",e[e.VERBOSE=4]="VERBOSE"}(l||(l={}));const u={debug:i,error:i,info:i,prefix:"Faro",warn:i};l.ERROR;const c=Object.assign({},console);class d{constructor(){this.unpatchedConsole=c,this.internalLogger=u,this.config={},this.metas={}}logDebug(...e){this.internalLogger.debug(`${this.name}\n`,...e)}logInfo(...e){this.internalLogger.info(`${this.name}\n`,...e)}logWarn(...e){this.internalLogger.warn(`${this.name}\n`,...e)}logError(...e){this.internalLogger.error(`${this.name}\n`,...e)}}class g extends d{isBatched(){return!1}getIgnoreUrls(){return[]}}const p="1.
|
|
1
|
+
var GrafanaFaroTransportOtlpHttp=function(e){"use strict";function t(e,t){var n={};for(var r in e)Object.prototype.hasOwnProperty.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(r=Object.getOwnPropertySymbols(e);o<r.length;o++)t.indexOf(r[o])<0&&Object.prototype.propertyIsEnumerable.call(e,r[o])&&(n[r[o]]=e[r[o]])}return n}function n(e,t){return typeof e===t}const r=e=>n(e,"number")&&!isNaN(e)||n(e,"bigint"),o=e=>!(e=>n(e,"null"))(e)&&n(e,"object"),s=e=>function(e,t){return Object.prototype.toString.call(e)===`[object ${t}]`}(e,"Array");function i(){}var a,l;!function(e){e.EXCEPTION="exception",e.LOG="log",e.MEASUREMENT="measurement",e.TRACE="trace",e.EVENT="event"}(a||(a={})),a.EXCEPTION,a.LOG,a.MEASUREMENT,a.TRACE,a.EVENT,function(e){e[e.OFF=0]="OFF",e[e.ERROR=1]="ERROR",e[e.WARN=2]="WARN",e[e.INFO=3]="INFO",e[e.VERBOSE=4]="VERBOSE"}(l||(l={}));const u={debug:i,error:i,info:i,prefix:"Faro",warn:i};l.ERROR;const c=Object.assign({},console);class d{constructor(){this.unpatchedConsole=c,this.internalLogger=u,this.config={},this.metas={}}logDebug(...e){this.internalLogger.debug(`${this.name}\n`,...e)}logInfo(...e){this.internalLogger.info(`${this.name}\n`,...e)}logWarn(...e){this.internalLogger.warn(`${this.name}\n`,...e)}logError(...e){this.internalLogger.error(`${this.name}\n`,...e)}}class g extends d{isBatched(){return!1}getIgnoreUrls(){return[]}}const p="1.2.0";var v="exception.type",f="exception.message",m="enduser.id",h="http.url",b="deployment.environment",y="service.name",E="service.version",L="telemetry.sdk.name",O="telemetry.sdk.language",R="telemetry.sdk.version",w="webjs";function T(e){return(e=>n(e,"string"))(e)?{stringValue:e}:(e=>r(e)&&Number.isInteger(e))(e)?{intValue:e}:r(e)?{doubleValue:e}:(e=>n(e,"boolean"))(e)?{boolValue:e}:s(e)?{arrayValue:{values:e.map(T)}}:e instanceof Uint8Array?{bytesValue:e}:o(e)?{kvlistValue:{values:Object.entries(e).map((([e,t])=>N(e,t))).filter(I)}}:{}}function N(e,t){if(null!=t&&""!==t)return{key:e,value:T(t)}}function I(e){return Boolean(e)&&"string"==typeof(null==e?void 0:e.key)&&void 0!==(null==e?void 0:e.value)}const k="browser.brands",S="browser.mobile",U="browser.user_agent",x="browser.language";function D(e){function t(e){return{scope:{name:"@grafana/faro-web-sdk",version:p},logRecords:[n(e)]}}function n(t){const{type:n}=t;switch(n){case a.LOG:return function(e){var t,n;const{meta:s,payload:i}=e,a=o(i.timestamp),l=T(i.message);return{timeUnixNano:a,severityNumber:10,severityText:"INFO2",body:l,attributes:[...r(s),N("faro.log.context",i.context)].filter(I),traceId:null===(t=i.trace)||void 0===t?void 0:t.trace_id,spanId:null===(n=i.trace)||void 0===n?void 0:n.span_id}}(t);case a.EXCEPTION:return function(e){var t,n;const{meta:s,payload:i}=e;return{timeUnixNano:o(i.timestamp),attributes:[...r(s),N(v,i.type),N(f,i.value),N("faro.error.stacktrace",i.stacktrace),N("faro.error.context",i.context)].filter(I),traceId:null===(t=i.trace)||void 0===t?void 0:t.trace_id,spanId:null===(n=i.trace)||void 0===n?void 0:n.span_id}}(t);case a.EVENT:return function(e){var t,n;const{meta:s,payload:i}=e,a=o(i.timestamp),l=T(i.name);return{timeUnixNano:a,body:l,attributes:[...r(s),N("event.name",i.name),N("event.domain",i.domain),N("event.attributes",i.attributes)].filter(I),traceId:null===(t=i.trace)||void 0===t?void 0:t.trace_id,spanId:null===(n=i.trace)||void 0===n?void 0:n.span_id}}(t);case a.MEASUREMENT:return function(e){var t,n;const{meta:s,payload:i}=e,a=o(i.timestamp),[l,u]=Object.entries(i.values).flat();return{timeUnixNano:a,attributes:[...r(s),N("measurement.type",i.type),N("measurement.name",l),N("measurement.value",u),N("faro.measurement.context",i.context)].filter(I),traceId:null===(t=i.trace)||void 0===t?void 0:t.trace_id,spanId:null===(n=i.trace)||void 0===n?void 0:n.span_id}}(t);default:return null==e||e.error(`Unknown TransportItemType: ${n}`),{}}}function r(e){const{view:t,page:n,session:r,user:o}=e;return[N("view.name",null==t?void 0:t.name),N(h,null==n?void 0:n.url),N("page.id",null==n?void 0:n.id),N("page.attributes",null==n?void 0:n.attributes),N("session.id",null==r?void 0:r.id),N("session.attributes",null==r?void 0:r.attributes),N(m,null==o?void 0:o.id),N("enduser.name",null==o?void 0:o.username),N("enduser.email",null==o?void 0:o.email),N("enduser.attributes",null==o?void 0:o.attributes)].filter(I)}function o(e){return 1e6*Date.parse(e)}return{toResourceLog:function(e){return{resource:j(e),scopeLogs:[t(e)]}},toScopeLog:t,toLogRecord:n}}function j(e){const{browser:t,sdk:n,app:r}=e.meta;return{attributes:[N(S,null==t?void 0:t.mobile),N(U,null==t?void 0:t.userAgent),N(x,null==t?void 0:t.language),N(k,null==t?void 0:t.brands),N("browser.os",null==t?void 0:t.os),N("browser.name",null==t?void 0:t.name),N("browser.version",null==t?void 0:t.version),N(L,null==n?void 0:n.name),N(R,null==n?void 0:n.version),Boolean(n)?N(O,w):void 0,N(y,null==r?void 0:r.name),N(E,null==r?void 0:r.version),N(b,null==r?void 0:r.environment)].filter(I)}}class A{constructor(e,t){this.internalLogger=e,this.resourceSpans=[],this.internalLogger=e,this.resourceLogs=[],this.getLogTransforms=D(this.internalLogger),this.getTraceTransforms=(this.internalLogger,{toResourceSpan:function(e){var t,n;const r=j(e),o=null===(n=null===(t=e.payload.resourceSpans)||void 0===t?void 0:t[0])||void 0===n?void 0:n.scopeSpans;return{resource:r,scopeSpans:null!=o?o:[]}}}),t&&this.addResourceItem(t)}getPayload(){return{resourceLogs:this.resourceLogs,resourceSpans:this.resourceSpans}}addResourceItem(e){var t,n,r,o;const{type:s}=e;try{switch(s){case a.LOG:case a.EXCEPTION:case a.EVENT:case a.MEASUREMENT:const{toLogRecord:o,toResourceLog:i}=this.getLogTransforms;0===this.resourceLogs.length?this.resourceLogs=[i(e)]:null===(n=null===(t=this.resourceLogs[0])||void 0===t?void 0:t.scopeLogs[0])||void 0===n||n.logRecords.push(o(e));break;case a.TRACE:const{toResourceSpan:l}=this.getTraceTransforms;this.resourceSpans.push(l(e));break;default:null===(r=this.internalLogger)||void 0===r||r.error(`Unknown TransportItemType: ${s}`)}}catch(e){null===(o=this.internalLogger)||void 0===o||o.error(e)}}}return e.OtlpHttpTransport=class extends g{constructor(e){var t,n,r;super(),this.options=e,this.name="@grafana/faro-web-sdk:transport-otlp-http",this.version=p,this.sendingTracesDisabledUntil=new Date,this.sendingLogsDisabledUntil=new Date,this.rateLimitBackoffMs=null!==(t=e.defaultRateLimitBackoffMs)&&void 0!==t?t:5e3,this.promiseBuffer=function(e){const{size:t,concurrency:n}=e,r=[];let o=0;const s=()=>{if(o<n&&r.length){const{producer:e,resolve:t,reject:n}=r.shift();o++,e().then((e=>{o--,s(),t(e)}),(e=>{o--,s(),n(e)}))}};return{add:e=>{if(r.length+o>=t)throw new Error("Task buffer full");return new Promise(((t,n)=>{r.push({producer:e,resolve:t,reject:n}),s()}))}}}({size:null!==(n=null==e?void 0:e.bufferSize)&&void 0!==n?n:30,concurrency:null!==(r=null==e?void 0:e.concurrency)&&void 0!==r?r:5})}getIgnoreUrls(){const{tracesURL:e="",logsURL:t=""}=this.options;return[e,t].filter(Boolean)}isBatched(){return!0}send(e){const t=new A(this.internalLogger);e.forEach((e=>t.addResourceItem(e))),this.sendPayload(t.getPayload())}sendPayload(e){try{const{tracesURL:n="",logsURL:r=""}=this.options;for(const[o,i]of Object.entries(e)){if(!(s(i)&&i.length>0))continue;let e,a=e=>{},l="";switch(o){case"resourceSpans":l=n,e=this.sendingTracesDisabledUntil,a=e=>{this.sendingTracesDisabledUntil=e};break;case"resourceLogs":l=r,e=this.sendingLogsDisabledUntil,a=e=>{this.sendingLogsDisabledUntil=e}}if(e&&e>new Date(Date.now()))return void this.logWarn(`Dropping transport item due to too many requests. Backoff until ${e}`);const u=JSON.stringify({[o]:i}),{requestOptions:c,apiKey:d}=this.options,g=null!=c?c:{},{headers:p}=g,v=t(g,["headers"]);this.promiseBuffer.add((()=>fetch(l,Object.assign({method:"POST",headers:Object.assign(Object.assign({"Content-Type":"application/json"},null!=p?p:{}),d?{"x-api-key":d}:{}),body:u,keepalive:!0},null!=v?v:{})).then((t=>(429===t.status&&(a(this.getRetryAfterDate(t)),this.logWarn(`Too many requests, backing off until ${e}`)),t))).catch((e=>{this.logError("Failed sending payload to the receiver\n",JSON.parse(u),e)}))))}}catch(e){this.logError(e)}}getRetryAfterDate(e){const t=Date.now(),n=e.headers.get("Retry-After");if(n){const e=Number(n);if(!isNaN(e))return new Date(1e3*e+t);const r=Date.parse(n);if(!isNaN(r))return new Date(r)}return new Date(t+this.rateLimitBackoffMs)}},e}({});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OtelPayload.js","sourceRoot":"","sources":["../../../src/payload/OtelPayload.ts"],"names":[],"mappings":";;;AAAA,gDAAkG;AAElG,yCAAkG;
|
|
1
|
+
{"version":3,"file":"OtelPayload.js","sourceRoot":"","sources":["../../../src/payload/OtelPayload.ts"],"names":[],"mappings":";;;AAAA,gDAAkG;AAElG,yCAAkG;AAIlG;IAOE,qBAAoB,cAA8B,EAAE,aAA6B;QAA7D,mBAAc,GAAd,cAAc,CAAgB;QAL1C,kBAAa,GAAG,EAAmB,CAAC;QAM1C,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAEvB,IAAI,CAAC,gBAAgB,GAAG,IAAA,4BAAgB,EAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9D,IAAI,CAAC,kBAAkB,GAAG,IAAA,8BAAkB,EAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAElE,IAAI,aAAa,EAAE;YACjB,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;SACrC;IACH,CAAC;IAED,gCAAU,GAAV;QACE,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;SACzB,CAAC;IACb,CAAC;IAED,qCAAe,GAAf,UAAgB,aAA4B;;QAClC,IAAA,IAAI,GAAK,aAAa,KAAlB,CAAmB;QAE/B,IAAI;YACF,QAAQ,IAAI,EAAE;gBACZ,KAAK,6BAAiB,CAAC,GAAG,CAAC;gBAC3B,KAAK,6BAAiB,CAAC,SAAS,CAAC;gBACjC,KAAK,6BAAiB,CAAC,KAAK,CAAC;gBAC7B,KAAK,6BAAiB,CAAC,WAAW;oBAC1B,IAAA,KAAiC,IAAI,CAAC,gBAAgB,EAApD,WAAW,iBAAA,EAAE,aAAa,mBAA0B,CAAC;oBAE7D,2DAA2D;oBAC3D,6GAA6G;oBAC7G,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;wBAClC,IAAI,CAAC,YAAY,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC;qBACpD;yBAAM;wBACL,iGAAiG;wBACjG,kDAAkD;wBAClD,MAAA,MAAA,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,0CAAE,SAAS,CAAC,CAAC,CAAC,0CAAE,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;qBACjF;oBACD,MAAM;gBACR,KAAK,6BAAiB,CAAC,KAAK;oBAClB,IAAA,cAAc,GAAK,IAAI,CAAC,kBAAkB,eAA5B,CAA6B;oBAEnD,4EAA4E;oBAC5E,+EAA+E;oBAC/E,0HAA0H;oBAC1H,0JAA0J;oBAC1J,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,aAA0C,CAAC,CAAC,CAAC;oBAEpF,MAAM;gBACR;oBACE,MAAA,IAAI,CAAC,cAAc,0CAAE,KAAK,CAAC,qCAA8B,IAAI,CAAE,CAAC,CAAC;oBACjE,MAAM;aACT;SACF;QAAC,OAAO,KAAK,EAAE;YACd,MAAA,IAAI,CAAC,cAAc,0CAAE,KAAK,CAAC,KAAK,CAAC,CAAC;SACnC;IACH,CAAC;IACH,kBAAC;AAAD,CAAC,AAjED,IAiEC;AAjEY,kCAAW","sourcesContent":["import { InternalLogger, TraceEvent, TransportItem, TransportItemType } from '@grafana/faro-core';\n\nimport { getLogTransforms, getTraceTransforms, LogsTransform, TraceTransform } from './transform';\nimport type { ResourceLogs, ResourceSpans } from './transform/types';\nimport type { OtelTransportPayload } from './types';\n\nexport class OtelPayload {\n private resourceLogs: ResourceLogs;\n private resourceSpans = [] as ResourceSpans;\n\n private getLogTransforms: LogsTransform;\n private getTraceTransforms: TraceTransform;\n\n constructor(private internalLogger: InternalLogger, transportItem?: TransportItem) {\n this.internalLogger = internalLogger;\n this.resourceLogs = [];\n\n this.getLogTransforms = getLogTransforms(this.internalLogger);\n this.getTraceTransforms = getTraceTransforms(this.internalLogger);\n\n if (transportItem) {\n this.addResourceItem(transportItem);\n }\n }\n\n getPayload(): OtelTransportPayload {\n return {\n resourceLogs: this.resourceLogs,\n resourceSpans: this.resourceSpans,\n } as const;\n }\n\n addResourceItem(transportItem: TransportItem): void {\n const { type } = transportItem;\n\n try {\n switch (type) {\n case TransportItemType.LOG:\n case TransportItemType.EXCEPTION:\n case TransportItemType.EVENT:\n case TransportItemType.MEASUREMENT:\n const { toLogRecord, toResourceLog } = this.getLogTransforms;\n\n // Currently the scope is fixed to '@grafana/faro-web-sdk'.\n // Once we are able to drive the scope by instrumentation this will change and we need to align this function\n if (this.resourceLogs.length === 0) {\n this.resourceLogs = [toResourceLog(transportItem)];\n } else {\n // Faro takes care of the grouping with different metadata (or OTel attributes), so we can safely\n // use the just the first element of the resource.\n this.resourceLogs[0]?.scopeLogs[0]?.logRecords.push(toLogRecord(transportItem));\n }\n break;\n case TransportItemType.TRACE:\n const { toResourceSpan } = this.getTraceTransforms;\n\n // We use the Otel Model as it is to avoid unnecessary resource consumption.\n // This is because we don't need the same logic to add items as it is for logs.\n // Also the Otel library already applies the respective protocol transforms so there is no need for additional transforms.\n // We only transform the resource object to ensure that we are compliant with the respective Faro Metas which add a few more items to the resource object.\n this.resourceSpans.push(toResourceSpan(transportItem as TransportItem<TraceEvent>));\n\n break;\n default:\n this.internalLogger?.error(`Unknown TransportItemType: ${type}`);\n break;\n }\n } catch (error) {\n this.internalLogger?.error(error);\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/payload/index.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/payload/index.ts"],"names":[],"mappings":";;;AAAA,6CAA4C;AAAnC,0GAAA,WAAW,OAAA","sourcesContent":["export { OtelPayload } from './OtelPayload';\nexport type {\n LogRecord,\n LogTransportItem,\n Resource,\n ResourceLog,\n ResourceLogs,\n Scope,\n ScopeLog,\n} from './transform/index';\nexport type { Logs, OtelTransportPayload, Traces } from './types';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/payload/transform/index.ts"],"names":[],"mappings":";;;AAAA,yCAAmE;AAA1D,6GAAA,gBAAgB,OAAA;AAAE,+GAAA,kBAAkB,OAAA","sourcesContent":["export { getLogTransforms, getTraceTransforms } from './transform';\nexport type {\n LogRecord,\n
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/payload/transform/index.ts"],"names":[],"mappings":";;;AAAA,yCAAmE;AAA1D,6GAAA,gBAAgB,OAAA;AAAE,+GAAA,kBAAkB,OAAA","sourcesContent":["export { getLogTransforms, getTraceTransforms } from './transform';\nexport type {\n LogRecord,\n LogTransportItem,\n ResourceLogs,\n LogsTransform,\n Resource,\n ResourceLog,\n ResourceSpan,\n ResourceSpans,\n Scope,\n ScopeLog,\n TraceTransform,\n} from './types';\n"]}
|
|
@@ -119,6 +119,7 @@ function getLogTransforms(internalLogger) {
|
|
|
119
119
|
(0, attribute_1.toAttribute)('measurement.type', payload.type),
|
|
120
120
|
(0, attribute_1.toAttribute)('measurement.name', measurementName),
|
|
121
121
|
(0, attribute_1.toAttribute)('measurement.value', measurementValue),
|
|
122
|
+
(0, attribute_1.toAttribute)('faro.measurement.context', payload.context),
|
|
122
123
|
], false).filter(attribute_1.isAttribute),
|
|
123
124
|
traceId: (_a = payload.trace) === null || _a === void 0 ? void 0 : _a.trace_id,
|
|
124
125
|
spanId: (_b = payload.trace) === null || _b === void 0 ? void 0 : _b.span_id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../../src/payload/transform/transform.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IKeyValue } from '@opentelemetry/otlp-transformer';\nimport {\n SemanticAttributes,\n SemanticResourceAttributes,\n TelemetrySdkLanguageValues,\n} from '@opentelemetry/semantic-conventions';\n\nimport {\n EventEvent,\n ExceptionEvent,\n LogEvent,\n MeasurementEvent,\n Meta,\n TransportItem,\n TransportItemType,\n VERSION,\n} from '@grafana/faro-core';\nimport type { InternalLogger, TraceEvent } from '@grafana/faro-core';\n\nimport { isAttribute, toAttribute, toAttributeValue } from '../attribute';\n\nimport type {\n LogRecord,\n LogsTransform,\n LogTransportItem,\n Resource,\n ResourceLogs,\n ResourceMeta,\n ResourceSpans,\n ScopeLog,\n TraceTransform,\n} from './types';\n\n/**\n * Seems currently to be missing in the semantic-conventions npm package.\n * See: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#todos\n *\n * Attributes are as defined by the Otel docs\n */\nconst SemanticBrowserAttributes = {\n BROWSER_BRANDS: 'browser.brands',\n BROWSER_PLATFORM: 'browser.platform',\n BROWSER_MOBILE: 'browser.mobile',\n BROWSER_USER_AGENT: 'browser.user_agent',\n BROWSER_LANGUAGE: 'browser.language',\n} as const;\n\nexport function getLogTransforms(internalLogger: InternalLogger): LogsTransform {\n function toResourceLog(transportItem: LogTransportItem): ResourceLogs {\n const resource = toResource(transportItem);\n\n return {\n resource,\n scopeLogs: [toScopeLog(transportItem)],\n };\n }\n\n function toScopeLog(transportItem: LogTransportItem): ScopeLog {\n return {\n scope: {\n name: '@grafana/faro-web-sdk',\n version: VERSION,\n },\n logRecords: [toLogRecord(transportItem)],\n };\n }\n\n function toLogRecord(transportItem: LogTransportItem): LogRecord {\n const { type } = transportItem;\n\n switch (type) {\n case TransportItemType.LOG:\n return toLogLogRecord(transportItem as TransportItem<LogEvent>);\n case TransportItemType.EXCEPTION:\n return toErrorLogRecord(transportItem as TransportItem<ExceptionEvent>);\n case TransportItemType.EVENT:\n return toEventLogRecord(transportItem as TransportItem<EventEvent>);\n case TransportItemType.MEASUREMENT:\n return toMeasurementLogRecord(transportItem as TransportItem<MeasurementEvent>);\n default:\n internalLogger?.error(`Unknown TransportItemType: ${type}`);\n return {};\n }\n }\n\n function toLogLogRecord(transportItem: TransportItem<LogEvent>): LogRecord {\n const { meta, payload } = transportItem;\n const timeUnixNano = toTimeUnixNano(payload.timestamp);\n const body = toAttributeValue(payload.message) as { stringValue: string; key: string };\n\n return {\n timeUnixNano,\n severityNumber: 10,\n severityText: 'INFO2',\n body,\n attributes: [...getCommonLogAttributes(meta), toAttribute('faro.log.context', payload.context)].filter(\n isAttribute\n ),\n traceId: payload.trace?.trace_id,\n spanId: payload.trace?.span_id,\n } as const;\n }\n\n function toEventLogRecord(transportItem: TransportItem<EventEvent>): LogRecord {\n const { meta, payload } = transportItem;\n const timeUnixNano = toTimeUnixNano(payload.timestamp);\n const body = toAttributeValue(payload.name) as { stringValue: string; key: string };\n\n return {\n timeUnixNano,\n body,\n attributes: [\n ...getCommonLogAttributes(meta),\n toAttribute('event.name', payload.name), // This is a semantic attribute. But event.name constant is currently missing in sematic-conventions npm package\n toAttribute('event.domain', payload.domain), // This is a semantic attribute. But event.domain constant is currently missing in sematic-conventions npm package\n toAttribute('event.attributes', payload.attributes),\n ].filter(isAttribute),\n traceId: payload.trace?.trace_id,\n spanId: payload.trace?.span_id,\n } as const;\n }\n\n function toErrorLogRecord(transportItem: TransportItem<ExceptionEvent>): LogRecord {\n const { meta, payload } = transportItem;\n const timeUnixNano = toTimeUnixNano(payload.timestamp);\n\n return {\n timeUnixNano,\n attributes: [\n ...getCommonLogAttributes(meta),\n toAttribute(SemanticAttributes.EXCEPTION_TYPE, payload.type),\n toAttribute(SemanticAttributes.EXCEPTION_MESSAGE, payload.value),\n // toAttribute(SemanticAttributes.EXCEPTION_STACKTRACE, undefined),\n toAttribute('faro.error.stacktrace', payload.stacktrace),\n toAttribute('faro.error.context', payload.context),\n ].filter(isAttribute),\n traceId: payload.trace?.trace_id,\n spanId: payload.trace?.span_id,\n } as const;\n }\n\n function toMeasurementLogRecord(transportItem: TransportItem<MeasurementEvent>): LogRecord {\n const { meta, payload } = transportItem;\n const timeUnixNano = toTimeUnixNano(payload.timestamp);\n const [measurementName, measurementValue] = Object.entries(payload.values).flat();\n\n return {\n timeUnixNano,\n attributes: [\n ...getCommonLogAttributes(meta),\n toAttribute('measurement.type', payload.type),\n toAttribute('measurement.name', measurementName),\n toAttribute('measurement.value', measurementValue),\n ].filter(isAttribute),\n traceId: payload.trace?.trace_id,\n spanId: payload.trace?.span_id,\n } as const;\n }\n\n function getCommonLogAttributes(meta: Meta): IKeyValue[] {\n const { view, page, session, user } = meta;\n\n return [\n toAttribute('view.name', view?.name),\n toAttribute(SemanticAttributes.HTTP_URL, page?.url),\n toAttribute('page.id', page?.id),\n toAttribute('page.attributes', page?.attributes),\n toAttribute('session.id', session?.id),\n toAttribute('session.attributes', session?.attributes),\n toAttribute(SemanticAttributes.ENDUSER_ID, user?.id),\n toAttribute('enduser.name', user?.username),\n toAttribute('enduser.email', user?.email),\n toAttribute('enduser.attributes', user?.attributes),\n ].filter(isAttribute);\n }\n\n function toTimeUnixNano(timestamp: string): number {\n return Date.parse(timestamp) * 1e6;\n }\n\n return {\n toResourceLog,\n toScopeLog,\n toLogRecord,\n };\n}\n\nexport function getTraceTransforms(_internalLogger?: InternalLogger): TraceTransform {\n function toResourceSpan(transportItem: TransportItem<TraceEvent>): ResourceSpans {\n const resource = toResource(transportItem);\n const scopeSpans = transportItem.payload.resourceSpans?.[0]?.scopeSpans;\n\n return {\n resource,\n scopeSpans: scopeSpans ?? [],\n };\n }\n\n return {\n toResourceSpan,\n };\n}\n\nfunction toResource(transportItem: TransportItem): Readonly<Resource> {\n const { browser, sdk, app }: ResourceMeta = transportItem.meta;\n\n return {\n attributes: [\n toAttribute(SemanticBrowserAttributes.BROWSER_MOBILE, browser?.mobile),\n toAttribute(SemanticBrowserAttributes.BROWSER_USER_AGENT, browser?.userAgent),\n toAttribute(SemanticBrowserAttributes.BROWSER_LANGUAGE, browser?.language),\n toAttribute(SemanticBrowserAttributes.BROWSER_BRANDS, browser?.brands),\n toAttribute('browser.os', browser?.os),\n toAttribute('browser.name', browser?.name),\n toAttribute('browser.version', browser?.version),\n\n toAttribute(SemanticResourceAttributes.TELEMETRY_SDK_NAME, sdk?.name),\n toAttribute(SemanticResourceAttributes.TELEMETRY_SDK_VERSION, sdk?.version),\n Boolean(sdk)\n ? toAttribute(SemanticResourceAttributes.TELEMETRY_SDK_LANGUAGE, TelemetrySdkLanguageValues.WEBJS)\n : undefined,\n\n toAttribute(SemanticResourceAttributes.SERVICE_NAME, app?.name),\n toAttribute(SemanticResourceAttributes.SERVICE_VERSION, app?.version),\n toAttribute(SemanticResourceAttributes.DEPLOYMENT_ENVIRONMENT, app?.environment),\n ].filter(isAttribute),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../../src/payload/transform/transform.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IKeyValue } from '@opentelemetry/otlp-transformer';\nimport {\n SemanticAttributes,\n SemanticResourceAttributes,\n TelemetrySdkLanguageValues,\n} from '@opentelemetry/semantic-conventions';\n\nimport {\n EventEvent,\n ExceptionEvent,\n LogEvent,\n MeasurementEvent,\n Meta,\n TransportItem,\n TransportItemType,\n VERSION,\n} from '@grafana/faro-core';\nimport type { InternalLogger, TraceEvent } from '@grafana/faro-core';\n\nimport { isAttribute, toAttribute, toAttributeValue } from '../attribute';\n\nimport type {\n LogRecord,\n LogsTransform,\n LogTransportItem,\n Resource,\n ResourceLog,\n ResourceMeta,\n ResourceSpan,\n ScopeLog,\n TraceTransform,\n} from './types';\n\n/**\n * Seems currently to be missing in the semantic-conventions npm package.\n * See: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#todos\n *\n * Attributes are as defined by the Otel docs\n */\nconst SemanticBrowserAttributes = {\n BROWSER_BRANDS: 'browser.brands',\n BROWSER_PLATFORM: 'browser.platform',\n BROWSER_MOBILE: 'browser.mobile',\n BROWSER_USER_AGENT: 'browser.user_agent',\n BROWSER_LANGUAGE: 'browser.language',\n} as const;\n\nexport function getLogTransforms(internalLogger: InternalLogger): LogsTransform {\n function toResourceLog(transportItem: LogTransportItem): ResourceLog {\n const resource = toResource(transportItem);\n\n return {\n resource,\n scopeLogs: [toScopeLog(transportItem)],\n };\n }\n\n function toScopeLog(transportItem: LogTransportItem): ScopeLog {\n return {\n scope: {\n name: '@grafana/faro-web-sdk',\n version: VERSION,\n },\n logRecords: [toLogRecord(transportItem)],\n };\n }\n\n function toLogRecord(transportItem: LogTransportItem): LogRecord {\n const { type } = transportItem;\n\n switch (type) {\n case TransportItemType.LOG:\n return toLogLogRecord(transportItem as TransportItem<LogEvent>);\n case TransportItemType.EXCEPTION:\n return toErrorLogRecord(transportItem as TransportItem<ExceptionEvent>);\n case TransportItemType.EVENT:\n return toEventLogRecord(transportItem as TransportItem<EventEvent>);\n case TransportItemType.MEASUREMENT:\n return toMeasurementLogRecord(transportItem as TransportItem<MeasurementEvent>);\n default:\n internalLogger?.error(`Unknown TransportItemType: ${type}`);\n return {};\n }\n }\n\n function toLogLogRecord(transportItem: TransportItem<LogEvent>): LogRecord {\n const { meta, payload } = transportItem;\n const timeUnixNano = toTimeUnixNano(payload.timestamp);\n const body = toAttributeValue(payload.message) as { stringValue: string; key: string };\n\n return {\n timeUnixNano,\n severityNumber: 10,\n severityText: 'INFO2',\n body,\n attributes: [...getCommonLogAttributes(meta), toAttribute('faro.log.context', payload.context)].filter(\n isAttribute\n ),\n traceId: payload.trace?.trace_id,\n spanId: payload.trace?.span_id,\n } as const;\n }\n\n function toEventLogRecord(transportItem: TransportItem<EventEvent>): LogRecord {\n const { meta, payload } = transportItem;\n const timeUnixNano = toTimeUnixNano(payload.timestamp);\n const body = toAttributeValue(payload.name) as { stringValue: string; key: string };\n\n return {\n timeUnixNano,\n body,\n attributes: [\n ...getCommonLogAttributes(meta),\n toAttribute('event.name', payload.name), // This is a semantic attribute. But event.name constant is currently missing in sematic-conventions npm package\n toAttribute('event.domain', payload.domain), // This is a semantic attribute. But event.domain constant is currently missing in sematic-conventions npm package\n toAttribute('event.attributes', payload.attributes),\n ].filter(isAttribute),\n traceId: payload.trace?.trace_id,\n spanId: payload.trace?.span_id,\n } as const;\n }\n\n function toErrorLogRecord(transportItem: TransportItem<ExceptionEvent>): LogRecord {\n const { meta, payload } = transportItem;\n const timeUnixNano = toTimeUnixNano(payload.timestamp);\n\n return {\n timeUnixNano,\n attributes: [\n ...getCommonLogAttributes(meta),\n toAttribute(SemanticAttributes.EXCEPTION_TYPE, payload.type),\n toAttribute(SemanticAttributes.EXCEPTION_MESSAGE, payload.value),\n // toAttribute(SemanticAttributes.EXCEPTION_STACKTRACE, undefined),\n toAttribute('faro.error.stacktrace', payload.stacktrace),\n toAttribute('faro.error.context', payload.context),\n ].filter(isAttribute),\n traceId: payload.trace?.trace_id,\n spanId: payload.trace?.span_id,\n } as const;\n }\n\n function toMeasurementLogRecord(transportItem: TransportItem<MeasurementEvent>): LogRecord {\n const { meta, payload } = transportItem;\n const timeUnixNano = toTimeUnixNano(payload.timestamp);\n const [measurementName, measurementValue] = Object.entries(payload.values).flat();\n\n return {\n timeUnixNano,\n attributes: [\n ...getCommonLogAttributes(meta),\n toAttribute('measurement.type', payload.type),\n toAttribute('measurement.name', measurementName),\n toAttribute('measurement.value', measurementValue),\n toAttribute('faro.measurement.context', payload.context),\n ].filter(isAttribute),\n traceId: payload.trace?.trace_id,\n spanId: payload.trace?.span_id,\n } as const;\n }\n\n function getCommonLogAttributes(meta: Meta): IKeyValue[] {\n const { view, page, session, user } = meta;\n\n return [\n toAttribute('view.name', view?.name),\n toAttribute(SemanticAttributes.HTTP_URL, page?.url),\n toAttribute('page.id', page?.id),\n toAttribute('page.attributes', page?.attributes),\n toAttribute('session.id', session?.id),\n toAttribute('session.attributes', session?.attributes),\n toAttribute(SemanticAttributes.ENDUSER_ID, user?.id),\n toAttribute('enduser.name', user?.username),\n toAttribute('enduser.email', user?.email),\n toAttribute('enduser.attributes', user?.attributes),\n ].filter(isAttribute);\n }\n\n function toTimeUnixNano(timestamp: string): number {\n return Date.parse(timestamp) * 1e6;\n }\n\n return {\n toResourceLog,\n toScopeLog,\n toLogRecord,\n };\n}\n\nexport function getTraceTransforms(_internalLogger?: InternalLogger): TraceTransform {\n function toResourceSpan(transportItem: TransportItem<TraceEvent>): ResourceSpan {\n const resource = toResource(transportItem);\n const scopeSpans = transportItem.payload.resourceSpans?.[0]?.scopeSpans;\n\n return {\n resource,\n scopeSpans: scopeSpans ?? [],\n };\n }\n\n return {\n toResourceSpan,\n };\n}\n\nfunction toResource(transportItem: TransportItem): Readonly<Resource> {\n const { browser, sdk, app }: ResourceMeta = transportItem.meta;\n\n return {\n attributes: [\n toAttribute(SemanticBrowserAttributes.BROWSER_MOBILE, browser?.mobile),\n toAttribute(SemanticBrowserAttributes.BROWSER_USER_AGENT, browser?.userAgent),\n toAttribute(SemanticBrowserAttributes.BROWSER_LANGUAGE, browser?.language),\n toAttribute(SemanticBrowserAttributes.BROWSER_BRANDS, browser?.brands),\n toAttribute('browser.os', browser?.os),\n toAttribute('browser.name', browser?.name),\n toAttribute('browser.version', browser?.version),\n\n toAttribute(SemanticResourceAttributes.TELEMETRY_SDK_NAME, sdk?.name),\n toAttribute(SemanticResourceAttributes.TELEMETRY_SDK_VERSION, sdk?.version),\n Boolean(sdk)\n ? toAttribute(SemanticResourceAttributes.TELEMETRY_SDK_LANGUAGE, TelemetrySdkLanguageValues.WEBJS)\n : undefined,\n\n toAttribute(SemanticResourceAttributes.SERVICE_NAME, app?.name),\n toAttribute(SemanticResourceAttributes.SERVICE_VERSION, app?.version),\n toAttribute(SemanticResourceAttributes.DEPLOYMENT_ENVIRONMENT, app?.environment),\n ].filter(isAttribute),\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/payload/transform/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { IKeyValue, IResource, IResourceSpans } from '@opentelemetry/otlp-transformer';\n\nimport type { APIEvent, Meta, TraceEvent, TransportItem } from '@grafana/faro-core';\n\nexport interface Resource extends Partial<Pick<IResource, 'droppedAttributesCount'>> {\n attributes: IKeyValue[];\n}\n\nexport interface LogRecord {\n timeUnixNano?: number;\n severityNumber?: number;\n severityText?: string;\n body?: { stringValue: string };\n attributes?: IKeyValue[];\n traceId?: string;\n spanId?: string;\n}\n\nexport type Scope = {\n name: string;\n version: string;\n};\n\nexport interface ScopeLog {\n scope: Scope;\n logRecords: LogRecord[];\n}\n\nexport interface ScopeSpan {\n scope: Scope;\n logRecords: LogRecord[];\n}\n\nexport interface
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/payload/transform/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { IKeyValue, IResource, IResourceSpans } from '@opentelemetry/otlp-transformer';\n\nimport type { APIEvent, Meta, TraceEvent, TransportItem } from '@grafana/faro-core';\n\nexport interface Resource extends Partial<Pick<IResource, 'droppedAttributesCount'>> {\n attributes: IKeyValue[];\n}\n\nexport interface LogRecord {\n timeUnixNano?: number;\n severityNumber?: number;\n severityText?: string;\n body?: { stringValue: string };\n attributes?: IKeyValue[];\n traceId?: string;\n spanId?: string;\n}\n\nexport type Scope = {\n name: string;\n version: string;\n};\n\nexport interface ScopeLog {\n scope: Scope;\n logRecords: LogRecord[];\n}\n\nexport interface ScopeSpan {\n scope: Scope;\n logRecords: LogRecord[];\n}\n\nexport interface ResourceLog {\n resource: Resource;\n scopeLogs: ScopeLog[];\n}\n\nexport type ResourceLogs = ResourceLog[];\n\nexport interface ResourceSpan extends Omit<IResourceSpans, 'resource'> {\n resource: Resource;\n}\n\nexport type ResourceSpans = ResourceSpan[];\n\nexport type LogTransportItem = TransportItem<Exclude<APIEvent, 'TraceEvent'>>;\nexport type TraceTransportItem = TransportItem<TraceEvent>;\n\nexport type LogsTransform = {\n toResourceLog: (transportItem: LogTransportItem) => ResourceLog;\n toScopeLog: (transportItem: LogTransportItem) => ScopeLog;\n toLogRecord: (transportItem: LogTransportItem) => LogRecord;\n};\n\nexport type TraceTransform = {\n toResourceSpan: (transportItem: TransportItem<TraceEvent>) => ResourceSpan;\n};\n\nexport type ResourceMeta = Pick<Meta, 'app' | 'browser' | 'sdk'>;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/payload/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ResourceLogs } from './transform';\n\nexport interface OtelTransportPayload {\n readonly resourceLogs: Readonly<ResourceLogs
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/payload/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ResourceLogs, ResourceSpans } from './transform';\n\nexport interface OtelTransportPayload {\n readonly resourceLogs: Readonly<ResourceLogs>;\n readonly resourceSpans: Readonly<ResourceSpans>;\n}\n\nexport type Logs = Pick<OtelTransportPayload, 'resourceLogs'>;\nexport type Traces = Pick<OtelTransportPayload, 'resourceSpans'>;\n"]}
|
package/dist/cjs/transport.js
CHANGED
|
@@ -78,6 +78,7 @@ var OtlpHttpTransport = /** @class */ (function (_super) {
|
|
|
78
78
|
try {
|
|
79
79
|
var _a = this.options, _b = _a.tracesURL, tracesURL = _b === void 0 ? '' : _b, _c = _a.logsURL, logsURL = _c === void 0 ? '' : _c;
|
|
80
80
|
var _loop_1 = function (key, value) {
|
|
81
|
+
var _f;
|
|
81
82
|
if (!((0, faro_core_1.isArray)(value) && value.length > 0)) {
|
|
82
83
|
return "continue";
|
|
83
84
|
}
|
|
@@ -104,9 +105,9 @@ var OtlpHttpTransport = /** @class */ (function (_super) {
|
|
|
104
105
|
this_1.logWarn("Dropping transport item due to too many requests. Backoff until ".concat(disabledUntil));
|
|
105
106
|
return { value: undefined };
|
|
106
107
|
}
|
|
107
|
-
var body = JSON.stringify(value);
|
|
108
|
-
var
|
|
109
|
-
var
|
|
108
|
+
var body = JSON.stringify((_f = {}, _f[key] = value, _f));
|
|
109
|
+
var _g = this_1.options, requestOptions = _g.requestOptions, apiKey = _g.apiKey;
|
|
110
|
+
var _h = requestOptions !== null && requestOptions !== void 0 ? requestOptions : {}, headers = _h.headers, restOfRequestOptions = __rest(_h, ["headers"]);
|
|
110
111
|
this_1.promiseBuffer.add(function () {
|
|
111
112
|
return fetch(url, __assign({ method: 'POST', headers: __assign(__assign({ 'Content-Type': 'application/json' }, (headers !== null && headers !== void 0 ? headers : {})), (apiKey ? { 'x-api-key': apiKey } : {})), body: body, keepalive: true }, (restOfRequestOptions !== null && restOfRequestOptions !== void 0 ? restOfRequestOptions : {})))
|
|
112
113
|
.then(function (response) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,gDAAwH;AAExH,qCAA8D;AAG9D,IAAM,mBAAmB,GAAG,EAAE,CAAC;AAC/B,IAAM,mBAAmB,GAAG,CAAC,CAAC,CAAC,uCAAuC;AACtE,IAAM,6BAA6B,GAAG,IAAI,CAAC;AAE3C;IAAuC,qCAAa;IAUlD,2BAAoB,OAAiC;QAArD,iBAQC;;gBAPC,iBAAO;QADW,aAAO,GAAP,OAAO,CAA0B;QAT5C,UAAI,GAAG,2CAA2C,CAAC;QACnD,aAAO,GAAG,mBAAO,CAAC;QAKnB,gCAA0B,GAAS,IAAI,IAAI,EAAE,CAAC;QAC9C,8BAAwB,GAAS,IAAI,IAAI,EAAE,CAAC;QAIlD,KAAI,CAAC,kBAAkB,GAAG,MAAA,OAAO,CAAC,yBAAyB,mCAAI,6BAA6B,CAAC;QAE7F,KAAI,CAAC,aAAa,GAAG,IAAA,+BAAmB,EAAC;YACvC,IAAI,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,mCAAI,mBAAmB;YAChD,WAAW,EAAE,MAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,mCAAI,mBAAmB;SACzD,CAAC,CAAC;;IACL,CAAC;IAEQ,yCAAa,GAAtB;QACQ,IAAA,KAAmC,IAAI,CAAC,OAAO,EAA7C,iBAAc,EAAd,SAAS,mBAAG,EAAE,KAAA,EAAE,eAAY,EAAZ,OAAO,mBAAG,EAAE,KAAiB,CAAC;QACtD,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC;IAEQ,qCAAS,GAAlB;QACE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,gCAAI,GAAJ,UAAK,KAAsB;QACzB,IAAM,WAAW,GAAG,IAAI,qBAAW,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAEzD,KAAK,CAAC,OAAO,CAAC,UAAC,IAAI,IAAK,OAAA,WAAW,CAAC,eAAe,CAAC,IAAI,CAAC,EAAjC,CAAiC,CAAC,CAAC;QAC3D,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC,UAAU,EAAE,CAAC,CAAC;IAC7C,CAAC;IAEO,uCAAW,GAAnB,UAAoB,OAA6B;QAAjD,iBAoEC;QAnEC,IAAI;YACI,IAAA,KAAmC,IAAI,CAAC,OAAO,EAA7C,iBAAc,EAAd,SAAS,mBAAG,EAAE,KAAA,EAAE,eAAY,EAAZ,OAAO,mBAAG,EAAE,KAAiB,CAAC;oCAE1C,GAAG,EAAE,KAAK
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseTransport, createPromiseBuffer, isArray, PromiseBuffer, TransportItem, VERSION } from '@grafana/faro-core';\n\nimport { OtelPayload, OtelTransportPayload } from './payload';\nimport type { OtlpHttpTransportOptions } from './types';\n\nconst DEFAULT_BUFFER_SIZE = 30;\nconst DEFAULT_CONCURRENCY = 5; // chrome supports 10 total, firefox 17\nconst DEFAULT_RATE_LIMIT_BACKOFF_MS = 5000;\n\nexport class OtlpHttpTransport extends BaseTransport {\n readonly name = '@grafana/faro-web-sdk:transport-otlp-http';\n readonly version = VERSION;\n\n private readonly promiseBuffer: PromiseBuffer<Response | void>;\n private readonly rateLimitBackoffMs: number;\n\n private sendingTracesDisabledUntil: Date = new Date();\n private sendingLogsDisabledUntil: Date = new Date();\n\n constructor(private options: OtlpHttpTransportOptions) {\n super();\n this.rateLimitBackoffMs = options.defaultRateLimitBackoffMs ?? DEFAULT_RATE_LIMIT_BACKOFF_MS;\n\n this.promiseBuffer = createPromiseBuffer({\n size: options?.bufferSize ?? DEFAULT_BUFFER_SIZE,\n concurrency: options?.concurrency ?? DEFAULT_CONCURRENCY,\n });\n }\n\n override getIgnoreUrls(): Array<string | RegExp> {\n const { tracesURL = '', logsURL = '' } = this.options;\n return [tracesURL, logsURL].filter(Boolean);\n }\n\n override isBatched(): boolean {\n return true;\n }\n\n send(items: TransportItem[]): void {\n const otelPayload = new OtelPayload(this.internalLogger);\n\n items.forEach((item) => otelPayload.addResourceItem(item));\n this.sendPayload(otelPayload.getPayload());\n }\n\n private sendPayload(payload: OtelTransportPayload): void {\n try {\n const { tracesURL = '', logsURL = '' } = this.options;\n\n for (const [key, value] of Object.entries(payload)) {\n if (!(isArray(value) && value.length > 0)) {\n continue;\n }\n\n let disabledUntil: Date | undefined;\n let updateDisabledUntil = (_: Date) => {};\n let url = '';\n\n switch (key) {\n case 'resourceSpans':\n url = tracesURL;\n disabledUntil = this.sendingTracesDisabledUntil;\n updateDisabledUntil = (retryAfterDate: Date) => {\n this.sendingTracesDisabledUntil = retryAfterDate;\n };\n break;\n case 'resourceLogs':\n url = logsURL;\n disabledUntil = this.sendingLogsDisabledUntil;\n updateDisabledUntil = (retryAfterDate: Date) => {\n this.sendingLogsDisabledUntil = retryAfterDate;\n };\n break;\n }\n\n if (disabledUntil && disabledUntil > new Date(Date.now())) {\n this.logWarn(`Dropping transport item due to too many requests. Backoff until ${disabledUntil}`);\n return undefined;\n }\n\n const body = JSON.stringify({ [key]: value });\n\n const { requestOptions, apiKey } = this.options;\n const { headers, ...restOfRequestOptions } = requestOptions ?? {};\n\n this.promiseBuffer.add(() => {\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(headers ?? {}),\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body,\n keepalive: true,\n ...(restOfRequestOptions ?? {}),\n })\n .then((response) => {\n if (response.status === 429) {\n updateDisabledUntil(this.getRetryAfterDate(response));\n this.logWarn(`Too many requests, backing off until ${disabledUntil}`);\n }\n\n return response;\n })\n .catch((error) => {\n this.logError('Failed sending payload to the receiver\\n', JSON.parse(body), error);\n });\n });\n }\n } catch (error) {\n this.logError(error);\n }\n }\n\n private getRetryAfterDate(response: Response): Date {\n const now = Date.now();\n const retryAfterHeader = response.headers.get('Retry-After');\n\n if (retryAfterHeader) {\n const delay = Number(retryAfterHeader);\n\n if (!isNaN(delay)) {\n return new Date(delay * 1000 + now);\n }\n\n const date = Date.parse(retryAfterHeader);\n\n if (!isNaN(date)) {\n return new Date(date);\n }\n }\n\n return new Date(now + this.rateLimitBackoffMs);\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OtelPayload.js","sourceRoot":"","sources":["../../../src/payload/OtelPayload.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAElG,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAiC,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"OtelPayload.js","sourceRoot":"","sources":["../../../src/payload/OtelPayload.ts"],"names":[],"mappings":"AAAA,OAAO,EAA6C,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAElG,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAiC,MAAM,aAAa,CAAC;AAIlG,MAAM,OAAO,WAAW;IAOtB,YAAoB,cAA8B,EAAE,aAA6B;QAA7D,mBAAc,GAAd,cAAc,CAAgB;QAL1C,kBAAa,GAAG,EAAmB,CAAC;QAM1C,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAEvB,IAAI,CAAC,gBAAgB,GAAG,gBAAgB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAC9D,IAAI,CAAC,kBAAkB,GAAG,kBAAkB,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAElE,IAAI,aAAa,EAAE;YACjB,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;SACrC;IACH,CAAC;IAED,UAAU;QACR,OAAO;YACL,YAAY,EAAE,IAAI,CAAC,YAAY;YAC/B,aAAa,EAAE,IAAI,CAAC,aAAa;SACzB,CAAC;IACb,CAAC;IAED,eAAe,CAAC,aAA4B;;QAC1C,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC;QAE/B,IAAI;YACF,QAAQ,IAAI,EAAE;gBACZ,KAAK,iBAAiB,CAAC,GAAG,CAAC;gBAC3B,KAAK,iBAAiB,CAAC,SAAS,CAAC;gBACjC,KAAK,iBAAiB,CAAC,KAAK,CAAC;gBAC7B,KAAK,iBAAiB,CAAC,WAAW;oBAChC,MAAM,EAAE,WAAW,EAAE,aAAa,EAAE,GAAG,IAAI,CAAC,gBAAgB,CAAC;oBAE7D,2DAA2D;oBAC3D,6GAA6G;oBAC7G,IAAI,IAAI,CAAC,YAAY,CAAC,MAAM,KAAK,CAAC,EAAE;wBAClC,IAAI,CAAC,YAAY,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC;qBACpD;yBAAM;wBACL,iGAAiG;wBACjG,kDAAkD;wBAClD,MAAA,MAAA,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,0CAAE,SAAS,CAAC,CAAC,CAAC,0CAAE,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC,CAAC;qBACjF;oBACD,MAAM;gBACR,KAAK,iBAAiB,CAAC,KAAK;oBAC1B,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,CAAC,kBAAkB,CAAC;oBAEnD,4EAA4E;oBAC5E,+EAA+E;oBAC/E,0HAA0H;oBAC1H,0JAA0J;oBAC1J,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC,aAA0C,CAAC,CAAC,CAAC;oBAEpF,MAAM;gBACR;oBACE,MAAA,IAAI,CAAC,cAAc,0CAAE,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;oBACjE,MAAM;aACT;SACF;QAAC,OAAO,KAAK,EAAE;YACd,MAAA,IAAI,CAAC,cAAc,0CAAE,KAAK,CAAC,KAAK,CAAC,CAAC;SACnC;IACH,CAAC;CACF","sourcesContent":["import { InternalLogger, TraceEvent, TransportItem, TransportItemType } from '@grafana/faro-core';\n\nimport { getLogTransforms, getTraceTransforms, LogsTransform, TraceTransform } from './transform';\nimport type { ResourceLogs, ResourceSpans } from './transform/types';\nimport type { OtelTransportPayload } from './types';\n\nexport class OtelPayload {\n private resourceLogs: ResourceLogs;\n private resourceSpans = [] as ResourceSpans;\n\n private getLogTransforms: LogsTransform;\n private getTraceTransforms: TraceTransform;\n\n constructor(private internalLogger: InternalLogger, transportItem?: TransportItem) {\n this.internalLogger = internalLogger;\n this.resourceLogs = [];\n\n this.getLogTransforms = getLogTransforms(this.internalLogger);\n this.getTraceTransforms = getTraceTransforms(this.internalLogger);\n\n if (transportItem) {\n this.addResourceItem(transportItem);\n }\n }\n\n getPayload(): OtelTransportPayload {\n return {\n resourceLogs: this.resourceLogs,\n resourceSpans: this.resourceSpans,\n } as const;\n }\n\n addResourceItem(transportItem: TransportItem): void {\n const { type } = transportItem;\n\n try {\n switch (type) {\n case TransportItemType.LOG:\n case TransportItemType.EXCEPTION:\n case TransportItemType.EVENT:\n case TransportItemType.MEASUREMENT:\n const { toLogRecord, toResourceLog } = this.getLogTransforms;\n\n // Currently the scope is fixed to '@grafana/faro-web-sdk'.\n // Once we are able to drive the scope by instrumentation this will change and we need to align this function\n if (this.resourceLogs.length === 0) {\n this.resourceLogs = [toResourceLog(transportItem)];\n } else {\n // Faro takes care of the grouping with different metadata (or OTel attributes), so we can safely\n // use the just the first element of the resource.\n this.resourceLogs[0]?.scopeLogs[0]?.logRecords.push(toLogRecord(transportItem));\n }\n break;\n case TransportItemType.TRACE:\n const { toResourceSpan } = this.getTraceTransforms;\n\n // We use the Otel Model as it is to avoid unnecessary resource consumption.\n // This is because we don't need the same logic to add items as it is for logs.\n // Also the Otel library already applies the respective protocol transforms so there is no need for additional transforms.\n // We only transform the resource object to ensure that we are compliant with the respective Faro Metas which add a few more items to the resource object.\n this.resourceSpans.push(toResourceSpan(transportItem as TransportItem<TraceEvent>));\n\n break;\n default:\n this.internalLogger?.error(`Unknown TransportItemType: ${type}`);\n break;\n }\n } catch (error) {\n this.internalLogger?.error(error);\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/payload/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/payload/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC","sourcesContent":["export { OtelPayload } from './OtelPayload';\nexport type {\n LogRecord,\n LogTransportItem,\n Resource,\n ResourceLog,\n ResourceLogs,\n Scope,\n ScopeLog,\n} from './transform/index';\nexport type { Logs, OtelTransportPayload, Traces } from './types';\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/payload/transform/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC","sourcesContent":["export { getLogTransforms, getTraceTransforms } from './transform';\nexport type {\n LogRecord,\n
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/payload/transform/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC","sourcesContent":["export { getLogTransforms, getTraceTransforms } from './transform';\nexport type {\n LogRecord,\n LogTransportItem,\n ResourceLogs,\n LogsTransform,\n Resource,\n ResourceLog,\n ResourceSpan,\n ResourceSpans,\n Scope,\n ScopeLog,\n TraceTransform,\n} from './types';\n"]}
|
|
@@ -110,6 +110,7 @@ export function getLogTransforms(internalLogger) {
|
|
|
110
110
|
toAttribute('measurement.type', payload.type),
|
|
111
111
|
toAttribute('measurement.name', measurementName),
|
|
112
112
|
toAttribute('measurement.value', measurementValue),
|
|
113
|
+
toAttribute('faro.measurement.context', payload.context),
|
|
113
114
|
].filter(isAttribute),
|
|
114
115
|
traceId: (_a = payload.trace) === null || _a === void 0 ? void 0 : _a.trace_id,
|
|
115
116
|
spanId: (_b = payload.trace) === null || _b === void 0 ? void 0 : _b.span_id,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../../src/payload/transform/transform.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAClB,0BAA0B,EAC1B,0BAA0B,GAC3B,MAAM,qCAAqC,CAAC;AAE7C,OAAO,EAOL,iBAAiB,EACjB,OAAO,GACR,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AAc1E;;;;;GAKG;AACH,MAAM,yBAAyB,GAAG;IAChC,cAAc,EAAE,gBAAgB;IAChC,gBAAgB,EAAE,kBAAkB;IACpC,cAAc,EAAE,gBAAgB;IAChC,kBAAkB,EAAE,oBAAoB;IACxC,gBAAgB,EAAE,kBAAkB;CAC5B,CAAC;AAEX,MAAM,UAAU,gBAAgB,CAAC,cAA8B;IAC7D,SAAS,aAAa,CAAC,aAA+B;QACpD,MAAM,QAAQ,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;QAE3C,OAAO;YACL,QAAQ;YACR,SAAS,EAAE,CAAC,UAAU,CAAC,aAAa,CAAC,CAAC;SACvC,CAAC;IACJ,CAAC;IAED,SAAS,UAAU,CAAC,aAA+B;QACjD,OAAO;YACL,KAAK,EAAE;gBACL,IAAI,EAAE,uBAAuB;gBAC7B,OAAO,EAAE,OAAO;aACjB;YACD,UAAU,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;SACzC,CAAC;IACJ,CAAC;IAED,SAAS,WAAW,CAAC,aAA+B;QAClD,MAAM,EAAE,IAAI,EAAE,GAAG,aAAa,CAAC;QAE/B,QAAQ,IAAI,EAAE;YACZ,KAAK,iBAAiB,CAAC,GAAG;gBACxB,OAAO,cAAc,CAAC,aAAwC,CAAC,CAAC;YAClE,KAAK,iBAAiB,CAAC,SAAS;gBAC9B,OAAO,gBAAgB,CAAC,aAA8C,CAAC,CAAC;YAC1E,KAAK,iBAAiB,CAAC,KAAK;gBAC1B,OAAO,gBAAgB,CAAC,aAA0C,CAAC,CAAC;YACtE,KAAK,iBAAiB,CAAC,WAAW;gBAChC,OAAO,sBAAsB,CAAC,aAAgD,CAAC,CAAC;YAClF;gBACE,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;gBAC5D,OAAO,EAAE,CAAC;SACb;IACH,CAAC;IAED,SAAS,cAAc,CAAC,aAAsC;;QAC5D,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC;QACxC,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,OAAO,CAAyC,CAAC;QAEvF,OAAO;YACL,YAAY;YACZ,cAAc,EAAE,EAAE;YAClB,YAAY,EAAE,OAAO;YACrB,IAAI;YACJ,UAAU,EAAE,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,EAAE,WAAW,CAAC,kBAAkB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CACpG,WAAW,CACZ;YACD,OAAO,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,QAAQ;YAChC,MAAM,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,OAAO;SACtB,CAAC;IACb,CAAC;IAED,SAAS,gBAAgB,CAAC,aAAwC;;QAChE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC;QACxC,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,IAAI,GAAG,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAyC,CAAC;QAEpF,OAAO;YACL,YAAY;YACZ,IAAI;YACJ,UAAU,EAAE;gBACV,GAAG,sBAAsB,CAAC,IAAI,CAAC;gBAC/B,WAAW,CAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC;gBACvC,WAAW,CAAC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC;gBAC3C,WAAW,CAAC,kBAAkB,EAAE,OAAO,CAAC,UAAU,CAAC;aACpD,CAAC,MAAM,CAAC,WAAW,CAAC;YACrB,OAAO,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,QAAQ;YAChC,MAAM,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,OAAO;SACtB,CAAC;IACb,CAAC;IAED,SAAS,gBAAgB,CAAC,aAA4C;;QACpE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC;QACxC,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAEvD,OAAO;YACL,YAAY;YACZ,UAAU,EAAE;gBACV,GAAG,sBAAsB,CAAC,IAAI,CAAC;gBAC/B,WAAW,CAAC,kBAAkB,CAAC,cAAc,EAAE,OAAO,CAAC,IAAI,CAAC;gBAC5D,WAAW,CAAC,kBAAkB,CAAC,iBAAiB,EAAE,OAAO,CAAC,KAAK,CAAC;gBAChE,mEAAmE;gBACnE,WAAW,CAAC,uBAAuB,EAAE,OAAO,CAAC,UAAU,CAAC;gBACxD,WAAW,CAAC,oBAAoB,EAAE,OAAO,CAAC,OAAO,CAAC;aACnD,CAAC,MAAM,CAAC,WAAW,CAAC;YACrB,OAAO,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,QAAQ;YAChC,MAAM,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,OAAO;SACtB,CAAC;IACb,CAAC;IAED,SAAS,sBAAsB,CAAC,aAA8C;;QAC5E,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,aAAa,CAAC;QACxC,MAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvD,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAElF,OAAO;YACL,YAAY;YACZ,UAAU,EAAE;gBACV,GAAG,sBAAsB,CAAC,IAAI,CAAC;gBAC/B,WAAW,CAAC,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC;gBAC7C,WAAW,CAAC,kBAAkB,EAAE,eAAe,CAAC;gBAChD,WAAW,CAAC,mBAAmB,EAAE,gBAAgB,CAAC;aACnD,CAAC,MAAM,CAAC,WAAW,CAAC;YACrB,OAAO,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,QAAQ;YAChC,MAAM,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,OAAO;SACtB,CAAC;IACb,CAAC;IAED,SAAS,sBAAsB,CAAC,IAAU;QACxC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;QAE3C,OAAO;YACL,WAAW,CAAC,WAAW,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAC;YACpC,WAAW,CAAC,kBAAkB,CAAC,QAAQ,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,GAAG,CAAC;YACnD,WAAW,CAAC,SAAS,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,EAAE,CAAC;YAChC,WAAW,CAAC,iBAAiB,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,CAAC;YAChD,WAAW,CAAC,YAAY,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,EAAE,CAAC;YACtC,WAAW,CAAC,oBAAoB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,CAAC;YACtD,WAAW,CAAC,kBAAkB,CAAC,UAAU,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,EAAE,CAAC;YACpD,WAAW,CAAC,cAAc,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,CAAC;YAC3C,WAAW,CAAC,eAAe,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAC;YACzC,WAAW,CAAC,oBAAoB,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,CAAC;SACpD,CAAC,MAAM,CAAC,WAAW,CAAC,CAAC;IACxB,CAAC;IAED,SAAS,cAAc,CAAC,SAAiB;QACvC,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,GAAG,GAAG,CAAC;IACrC,CAAC;IAED,OAAO;QACL,aAAa;QACb,UAAU;QACV,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,kBAAkB,CAAC,eAAgC;IACjE,SAAS,cAAc,CAAC,aAAwC;;QAC9D,MAAM,QAAQ,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;QAC3C,MAAM,UAAU,GAAG,MAAA,MAAA,aAAa,CAAC,OAAO,CAAC,aAAa,0CAAG,CAAC,CAAC,0CAAE,UAAU,CAAC;QAExE,OAAO;YACL,QAAQ;YACR,UAAU,EAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,EAAE;SAC7B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,cAAc;KACf,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,aAA4B;IAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,EAAE,GAAiB,aAAa,CAAC,IAAI,CAAC;IAE/D,OAAO;QACL,UAAU,EAAE;YACV,WAAW,CAAC,yBAAyB,CAAC,cAAc,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAC;YACtE,WAAW,CAAC,yBAAyB,CAAC,kBAAkB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,CAAC;YAC7E,WAAW,CAAC,yBAAyB,CAAC,gBAAgB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,CAAC;YAC1E,WAAW,CAAC,yBAAyB,CAAC,cAAc,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAC;YACtE,WAAW,CAAC,YAAY,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,EAAE,CAAC;YACtC,WAAW,CAAC,cAAc,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,CAAC;YAC1C,WAAW,CAAC,iBAAiB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC;YAEhD,WAAW,CAAC,0BAA0B,CAAC,kBAAkB,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,CAAC;YACrE,WAAW,CAAC,0BAA0B,CAAC,qBAAqB,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,CAAC;YAC3E,OAAO,CAAC,GAAG,CAAC;gBACV,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,sBAAsB,EAAE,0BAA0B,CAAC,KAAK,CAAC;gBAClG,CAAC,CAAC,SAAS;YAEb,WAAW,CAAC,0BAA0B,CAAC,YAAY,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,CAAC;YAC/D,WAAW,CAAC,0BAA0B,CAAC,eAAe,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,CAAC;YACrE,WAAW,CAAC,0BAA0B,CAAC,sBAAsB,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,WAAW,CAAC;SACjF,CAAC,MAAM,CAAC,WAAW,CAAC;KACtB,CAAC;AACJ,CAAC","sourcesContent":["import type { IKeyValue } from '@opentelemetry/otlp-transformer';\nimport {\n SemanticAttributes,\n SemanticResourceAttributes,\n TelemetrySdkLanguageValues,\n} from '@opentelemetry/semantic-conventions';\n\nimport {\n EventEvent,\n ExceptionEvent,\n LogEvent,\n MeasurementEvent,\n Meta,\n TransportItem,\n TransportItemType,\n VERSION,\n} from '@grafana/faro-core';\nimport type { InternalLogger, TraceEvent } from '@grafana/faro-core';\n\nimport { isAttribute, toAttribute, toAttributeValue } from '../attribute';\n\nimport type {\n LogRecord,\n LogsTransform,\n LogTransportItem,\n Resource,\n ResourceLogs,\n ResourceMeta,\n ResourceSpans,\n ScopeLog,\n TraceTransform,\n} from './types';\n\n/**\n * Seems currently to be missing in the semantic-conventions npm package.\n * See: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#todos\n *\n * Attributes are as defined by the Otel docs\n */\nconst SemanticBrowserAttributes = {\n BROWSER_BRANDS: 'browser.brands',\n BROWSER_PLATFORM: 'browser.platform',\n BROWSER_MOBILE: 'browser.mobile',\n BROWSER_USER_AGENT: 'browser.user_agent',\n BROWSER_LANGUAGE: 'browser.language',\n} as const;\n\nexport function getLogTransforms(internalLogger: InternalLogger): LogsTransform {\n function toResourceLog(transportItem: LogTransportItem): ResourceLogs {\n const resource = toResource(transportItem);\n\n return {\n resource,\n scopeLogs: [toScopeLog(transportItem)],\n };\n }\n\n function toScopeLog(transportItem: LogTransportItem): ScopeLog {\n return {\n scope: {\n name: '@grafana/faro-web-sdk',\n version: VERSION,\n },\n logRecords: [toLogRecord(transportItem)],\n };\n }\n\n function toLogRecord(transportItem: LogTransportItem): LogRecord {\n const { type } = transportItem;\n\n switch (type) {\n case TransportItemType.LOG:\n return toLogLogRecord(transportItem as TransportItem<LogEvent>);\n case TransportItemType.EXCEPTION:\n return toErrorLogRecord(transportItem as TransportItem<ExceptionEvent>);\n case TransportItemType.EVENT:\n return toEventLogRecord(transportItem as TransportItem<EventEvent>);\n case TransportItemType.MEASUREMENT:\n return toMeasurementLogRecord(transportItem as TransportItem<MeasurementEvent>);\n default:\n internalLogger?.error(`Unknown TransportItemType: ${type}`);\n return {};\n }\n }\n\n function toLogLogRecord(transportItem: TransportItem<LogEvent>): LogRecord {\n const { meta, payload } = transportItem;\n const timeUnixNano = toTimeUnixNano(payload.timestamp);\n const body = toAttributeValue(payload.message) as { stringValue: string; key: string };\n\n return {\n timeUnixNano,\n severityNumber: 10,\n severityText: 'INFO2',\n body,\n attributes: [...getCommonLogAttributes(meta), toAttribute('faro.log.context', payload.context)].filter(\n isAttribute\n ),\n traceId: payload.trace?.trace_id,\n spanId: payload.trace?.span_id,\n } as const;\n }\n\n function toEventLogRecord(transportItem: TransportItem<EventEvent>): LogRecord {\n const { meta, payload } = transportItem;\n const timeUnixNano = toTimeUnixNano(payload.timestamp);\n const body = toAttributeValue(payload.name) as { stringValue: string; key: string };\n\n return {\n timeUnixNano,\n body,\n attributes: [\n ...getCommonLogAttributes(meta),\n toAttribute('event.name', payload.name), // This is a semantic attribute. But event.name constant is currently missing in sematic-conventions npm package\n toAttribute('event.domain', payload.domain), // This is a semantic attribute. But event.domain constant is currently missing in sematic-conventions npm package\n toAttribute('event.attributes', payload.attributes),\n ].filter(isAttribute),\n traceId: payload.trace?.trace_id,\n spanId: payload.trace?.span_id,\n } as const;\n }\n\n function toErrorLogRecord(transportItem: TransportItem<ExceptionEvent>): LogRecord {\n const { meta, payload } = transportItem;\n const timeUnixNano = toTimeUnixNano(payload.timestamp);\n\n return {\n timeUnixNano,\n attributes: [\n ...getCommonLogAttributes(meta),\n toAttribute(SemanticAttributes.EXCEPTION_TYPE, payload.type),\n toAttribute(SemanticAttributes.EXCEPTION_MESSAGE, payload.value),\n // toAttribute(SemanticAttributes.EXCEPTION_STACKTRACE, undefined),\n toAttribute('faro.error.stacktrace', payload.stacktrace),\n toAttribute('faro.error.context', payload.context),\n ].filter(isAttribute),\n traceId: payload.trace?.trace_id,\n spanId: payload.trace?.span_id,\n } as const;\n }\n\n function toMeasurementLogRecord(transportItem: TransportItem<MeasurementEvent>): LogRecord {\n const { meta, payload } = transportItem;\n const timeUnixNano = toTimeUnixNano(payload.timestamp);\n const [measurementName, measurementValue] = Object.entries(payload.values).flat();\n\n return {\n timeUnixNano,\n attributes: [\n ...getCommonLogAttributes(meta),\n toAttribute('measurement.type', payload.type),\n toAttribute('measurement.name', measurementName),\n toAttribute('measurement.value', measurementValue),\n ].filter(isAttribute),\n traceId: payload.trace?.trace_id,\n spanId: payload.trace?.span_id,\n } as const;\n }\n\n function getCommonLogAttributes(meta: Meta): IKeyValue[] {\n const { view, page, session, user } = meta;\n\n return [\n toAttribute('view.name', view?.name),\n toAttribute(SemanticAttributes.HTTP_URL, page?.url),\n toAttribute('page.id', page?.id),\n toAttribute('page.attributes', page?.attributes),\n toAttribute('session.id', session?.id),\n toAttribute('session.attributes', session?.attributes),\n toAttribute(SemanticAttributes.ENDUSER_ID, user?.id),\n toAttribute('enduser.name', user?.username),\n toAttribute('enduser.email', user?.email),\n toAttribute('enduser.attributes', user?.attributes),\n ].filter(isAttribute);\n }\n\n function toTimeUnixNano(timestamp: string): number {\n return Date.parse(timestamp) * 1e6;\n }\n\n return {\n toResourceLog,\n toScopeLog,\n toLogRecord,\n };\n}\n\nexport function getTraceTransforms(_internalLogger?: InternalLogger): TraceTransform {\n function toResourceSpan(transportItem: TransportItem<TraceEvent>): ResourceSpans {\n const resource = toResource(transportItem);\n const scopeSpans = transportItem.payload.resourceSpans?.[0]?.scopeSpans;\n\n return {\n resource,\n scopeSpans: scopeSpans ?? [],\n };\n }\n\n return {\n toResourceSpan,\n };\n}\n\nfunction toResource(transportItem: TransportItem): Readonly<Resource> {\n const { browser, sdk, app }: ResourceMeta = transportItem.meta;\n\n return {\n attributes: [\n toAttribute(SemanticBrowserAttributes.BROWSER_MOBILE, browser?.mobile),\n toAttribute(SemanticBrowserAttributes.BROWSER_USER_AGENT, browser?.userAgent),\n toAttribute(SemanticBrowserAttributes.BROWSER_LANGUAGE, browser?.language),\n toAttribute(SemanticBrowserAttributes.BROWSER_BRANDS, browser?.brands),\n toAttribute('browser.os', browser?.os),\n toAttribute('browser.name', browser?.name),\n toAttribute('browser.version', browser?.version),\n\n toAttribute(SemanticResourceAttributes.TELEMETRY_SDK_NAME, sdk?.name),\n toAttribute(SemanticResourceAttributes.TELEMETRY_SDK_VERSION, sdk?.version),\n Boolean(sdk)\n ? toAttribute(SemanticResourceAttributes.TELEMETRY_SDK_LANGUAGE, TelemetrySdkLanguageValues.WEBJS)\n : undefined,\n\n toAttribute(SemanticResourceAttributes.SERVICE_NAME, app?.name),\n toAttribute(SemanticResourceAttributes.SERVICE_VERSION, app?.version),\n toAttribute(SemanticResourceAttributes.DEPLOYMENT_ENVIRONMENT, app?.environment),\n ].filter(isAttribute),\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../../src/payload/transform/transform.ts"],"names":[],"mappings":"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","sourcesContent":["import type { IKeyValue } from '@opentelemetry/otlp-transformer';\nimport {\n SemanticAttributes,\n SemanticResourceAttributes,\n TelemetrySdkLanguageValues,\n} from '@opentelemetry/semantic-conventions';\n\nimport {\n EventEvent,\n ExceptionEvent,\n LogEvent,\n MeasurementEvent,\n Meta,\n TransportItem,\n TransportItemType,\n VERSION,\n} from '@grafana/faro-core';\nimport type { InternalLogger, TraceEvent } from '@grafana/faro-core';\n\nimport { isAttribute, toAttribute, toAttributeValue } from '../attribute';\n\nimport type {\n LogRecord,\n LogsTransform,\n LogTransportItem,\n Resource,\n ResourceLog,\n ResourceMeta,\n ResourceSpan,\n ScopeLog,\n TraceTransform,\n} from './types';\n\n/**\n * Seems currently to be missing in the semantic-conventions npm package.\n * See: https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/resource/semantic_conventions/README.md#todos\n *\n * Attributes are as defined by the Otel docs\n */\nconst SemanticBrowserAttributes = {\n BROWSER_BRANDS: 'browser.brands',\n BROWSER_PLATFORM: 'browser.platform',\n BROWSER_MOBILE: 'browser.mobile',\n BROWSER_USER_AGENT: 'browser.user_agent',\n BROWSER_LANGUAGE: 'browser.language',\n} as const;\n\nexport function getLogTransforms(internalLogger: InternalLogger): LogsTransform {\n function toResourceLog(transportItem: LogTransportItem): ResourceLog {\n const resource = toResource(transportItem);\n\n return {\n resource,\n scopeLogs: [toScopeLog(transportItem)],\n };\n }\n\n function toScopeLog(transportItem: LogTransportItem): ScopeLog {\n return {\n scope: {\n name: '@grafana/faro-web-sdk',\n version: VERSION,\n },\n logRecords: [toLogRecord(transportItem)],\n };\n }\n\n function toLogRecord(transportItem: LogTransportItem): LogRecord {\n const { type } = transportItem;\n\n switch (type) {\n case TransportItemType.LOG:\n return toLogLogRecord(transportItem as TransportItem<LogEvent>);\n case TransportItemType.EXCEPTION:\n return toErrorLogRecord(transportItem as TransportItem<ExceptionEvent>);\n case TransportItemType.EVENT:\n return toEventLogRecord(transportItem as TransportItem<EventEvent>);\n case TransportItemType.MEASUREMENT:\n return toMeasurementLogRecord(transportItem as TransportItem<MeasurementEvent>);\n default:\n internalLogger?.error(`Unknown TransportItemType: ${type}`);\n return {};\n }\n }\n\n function toLogLogRecord(transportItem: TransportItem<LogEvent>): LogRecord {\n const { meta, payload } = transportItem;\n const timeUnixNano = toTimeUnixNano(payload.timestamp);\n const body = toAttributeValue(payload.message) as { stringValue: string; key: string };\n\n return {\n timeUnixNano,\n severityNumber: 10,\n severityText: 'INFO2',\n body,\n attributes: [...getCommonLogAttributes(meta), toAttribute('faro.log.context', payload.context)].filter(\n isAttribute\n ),\n traceId: payload.trace?.trace_id,\n spanId: payload.trace?.span_id,\n } as const;\n }\n\n function toEventLogRecord(transportItem: TransportItem<EventEvent>): LogRecord {\n const { meta, payload } = transportItem;\n const timeUnixNano = toTimeUnixNano(payload.timestamp);\n const body = toAttributeValue(payload.name) as { stringValue: string; key: string };\n\n return {\n timeUnixNano,\n body,\n attributes: [\n ...getCommonLogAttributes(meta),\n toAttribute('event.name', payload.name), // This is a semantic attribute. But event.name constant is currently missing in sematic-conventions npm package\n toAttribute('event.domain', payload.domain), // This is a semantic attribute. But event.domain constant is currently missing in sematic-conventions npm package\n toAttribute('event.attributes', payload.attributes),\n ].filter(isAttribute),\n traceId: payload.trace?.trace_id,\n spanId: payload.trace?.span_id,\n } as const;\n }\n\n function toErrorLogRecord(transportItem: TransportItem<ExceptionEvent>): LogRecord {\n const { meta, payload } = transportItem;\n const timeUnixNano = toTimeUnixNano(payload.timestamp);\n\n return {\n timeUnixNano,\n attributes: [\n ...getCommonLogAttributes(meta),\n toAttribute(SemanticAttributes.EXCEPTION_TYPE, payload.type),\n toAttribute(SemanticAttributes.EXCEPTION_MESSAGE, payload.value),\n // toAttribute(SemanticAttributes.EXCEPTION_STACKTRACE, undefined),\n toAttribute('faro.error.stacktrace', payload.stacktrace),\n toAttribute('faro.error.context', payload.context),\n ].filter(isAttribute),\n traceId: payload.trace?.trace_id,\n spanId: payload.trace?.span_id,\n } as const;\n }\n\n function toMeasurementLogRecord(transportItem: TransportItem<MeasurementEvent>): LogRecord {\n const { meta, payload } = transportItem;\n const timeUnixNano = toTimeUnixNano(payload.timestamp);\n const [measurementName, measurementValue] = Object.entries(payload.values).flat();\n\n return {\n timeUnixNano,\n attributes: [\n ...getCommonLogAttributes(meta),\n toAttribute('measurement.type', payload.type),\n toAttribute('measurement.name', measurementName),\n toAttribute('measurement.value', measurementValue),\n toAttribute('faro.measurement.context', payload.context),\n ].filter(isAttribute),\n traceId: payload.trace?.trace_id,\n spanId: payload.trace?.span_id,\n } as const;\n }\n\n function getCommonLogAttributes(meta: Meta): IKeyValue[] {\n const { view, page, session, user } = meta;\n\n return [\n toAttribute('view.name', view?.name),\n toAttribute(SemanticAttributes.HTTP_URL, page?.url),\n toAttribute('page.id', page?.id),\n toAttribute('page.attributes', page?.attributes),\n toAttribute('session.id', session?.id),\n toAttribute('session.attributes', session?.attributes),\n toAttribute(SemanticAttributes.ENDUSER_ID, user?.id),\n toAttribute('enduser.name', user?.username),\n toAttribute('enduser.email', user?.email),\n toAttribute('enduser.attributes', user?.attributes),\n ].filter(isAttribute);\n }\n\n function toTimeUnixNano(timestamp: string): number {\n return Date.parse(timestamp) * 1e6;\n }\n\n return {\n toResourceLog,\n toScopeLog,\n toLogRecord,\n };\n}\n\nexport function getTraceTransforms(_internalLogger?: InternalLogger): TraceTransform {\n function toResourceSpan(transportItem: TransportItem<TraceEvent>): ResourceSpan {\n const resource = toResource(transportItem);\n const scopeSpans = transportItem.payload.resourceSpans?.[0]?.scopeSpans;\n\n return {\n resource,\n scopeSpans: scopeSpans ?? [],\n };\n }\n\n return {\n toResourceSpan,\n };\n}\n\nfunction toResource(transportItem: TransportItem): Readonly<Resource> {\n const { browser, sdk, app }: ResourceMeta = transportItem.meta;\n\n return {\n attributes: [\n toAttribute(SemanticBrowserAttributes.BROWSER_MOBILE, browser?.mobile),\n toAttribute(SemanticBrowserAttributes.BROWSER_USER_AGENT, browser?.userAgent),\n toAttribute(SemanticBrowserAttributes.BROWSER_LANGUAGE, browser?.language),\n toAttribute(SemanticBrowserAttributes.BROWSER_BRANDS, browser?.brands),\n toAttribute('browser.os', browser?.os),\n toAttribute('browser.name', browser?.name),\n toAttribute('browser.version', browser?.version),\n\n toAttribute(SemanticResourceAttributes.TELEMETRY_SDK_NAME, sdk?.name),\n toAttribute(SemanticResourceAttributes.TELEMETRY_SDK_VERSION, sdk?.version),\n Boolean(sdk)\n ? toAttribute(SemanticResourceAttributes.TELEMETRY_SDK_LANGUAGE, TelemetrySdkLanguageValues.WEBJS)\n : undefined,\n\n toAttribute(SemanticResourceAttributes.SERVICE_NAME, app?.name),\n toAttribute(SemanticResourceAttributes.SERVICE_VERSION, app?.version),\n toAttribute(SemanticResourceAttributes.DEPLOYMENT_ENVIRONMENT, app?.environment),\n ].filter(isAttribute),\n };\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/payload/transform/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { IKeyValue, IResource, IResourceSpans } from '@opentelemetry/otlp-transformer';\n\nimport type { APIEvent, Meta, TraceEvent, TransportItem } from '@grafana/faro-core';\n\nexport interface Resource extends Partial<Pick<IResource, 'droppedAttributesCount'>> {\n attributes: IKeyValue[];\n}\n\nexport interface LogRecord {\n timeUnixNano?: number;\n severityNumber?: number;\n severityText?: string;\n body?: { stringValue: string };\n attributes?: IKeyValue[];\n traceId?: string;\n spanId?: string;\n}\n\nexport type Scope = {\n name: string;\n version: string;\n};\n\nexport interface ScopeLog {\n scope: Scope;\n logRecords: LogRecord[];\n}\n\nexport interface ScopeSpan {\n scope: Scope;\n logRecords: LogRecord[];\n}\n\nexport interface
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/payload/transform/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { IKeyValue, IResource, IResourceSpans } from '@opentelemetry/otlp-transformer';\n\nimport type { APIEvent, Meta, TraceEvent, TransportItem } from '@grafana/faro-core';\n\nexport interface Resource extends Partial<Pick<IResource, 'droppedAttributesCount'>> {\n attributes: IKeyValue[];\n}\n\nexport interface LogRecord {\n timeUnixNano?: number;\n severityNumber?: number;\n severityText?: string;\n body?: { stringValue: string };\n attributes?: IKeyValue[];\n traceId?: string;\n spanId?: string;\n}\n\nexport type Scope = {\n name: string;\n version: string;\n};\n\nexport interface ScopeLog {\n scope: Scope;\n logRecords: LogRecord[];\n}\n\nexport interface ScopeSpan {\n scope: Scope;\n logRecords: LogRecord[];\n}\n\nexport interface ResourceLog {\n resource: Resource;\n scopeLogs: ScopeLog[];\n}\n\nexport type ResourceLogs = ResourceLog[];\n\nexport interface ResourceSpan extends Omit<IResourceSpans, 'resource'> {\n resource: Resource;\n}\n\nexport type ResourceSpans = ResourceSpan[];\n\nexport type LogTransportItem = TransportItem<Exclude<APIEvent, 'TraceEvent'>>;\nexport type TraceTransportItem = TransportItem<TraceEvent>;\n\nexport type LogsTransform = {\n toResourceLog: (transportItem: LogTransportItem) => ResourceLog;\n toScopeLog: (transportItem: LogTransportItem) => ScopeLog;\n toLogRecord: (transportItem: LogTransportItem) => LogRecord;\n};\n\nexport type TraceTransform = {\n toResourceSpan: (transportItem: TransportItem<TraceEvent>) => ResourceSpan;\n};\n\nexport type ResourceMeta = Pick<Meta, 'app' | 'browser' | 'sdk'>;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/payload/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ResourceLogs } from './transform';\n\nexport interface OtelTransportPayload {\n readonly resourceLogs: Readonly<ResourceLogs
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/payload/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ResourceLogs, ResourceSpans } from './transform';\n\nexport interface OtelTransportPayload {\n readonly resourceLogs: Readonly<ResourceLogs>;\n readonly resourceSpans: Readonly<ResourceSpans>;\n}\n\nexport type Logs = Pick<OtelTransportPayload, 'resourceLogs'>;\nexport type Traces = Pick<OtelTransportPayload, 'resourceSpans'>;\n"]}
|
package/dist/esm/transport.js
CHANGED
|
@@ -71,7 +71,7 @@ export class OtlpHttpTransport extends BaseTransport {
|
|
|
71
71
|
this.logWarn(`Dropping transport item due to too many requests. Backoff until ${disabledUntil}`);
|
|
72
72
|
return undefined;
|
|
73
73
|
}
|
|
74
|
-
const body = JSON.stringify(value);
|
|
74
|
+
const body = JSON.stringify({ [key]: value });
|
|
75
75
|
const { requestOptions, apiKey } = this.options;
|
|
76
76
|
const _a = requestOptions !== null && requestOptions !== void 0 ? requestOptions : {}, { headers } = _a, restOfRequestOptions = __rest(_a, ["headers"]);
|
|
77
77
|
this.promiseBuffer.add(() => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseTransport, createPromiseBuffer, isArray, PromiseBuffer, TransportItem, VERSION } from '@grafana/faro-core';\n\nimport { OtelPayload, OtelTransportPayload } from './payload';\nimport type { OtlpHttpTransportOptions } from './types';\n\nconst DEFAULT_BUFFER_SIZE = 30;\nconst DEFAULT_CONCURRENCY = 5; // chrome supports 10 total, firefox 17\nconst DEFAULT_RATE_LIMIT_BACKOFF_MS = 5000;\n\nexport class OtlpHttpTransport extends BaseTransport {\n readonly name = '@grafana/faro-web-sdk:transport-otlp-http';\n readonly version = VERSION;\n\n private readonly promiseBuffer: PromiseBuffer<Response | void>;\n private readonly rateLimitBackoffMs: number;\n\n private sendingTracesDisabledUntil: Date = new Date();\n private sendingLogsDisabledUntil: Date = new Date();\n\n constructor(private options: OtlpHttpTransportOptions) {\n super();\n this.rateLimitBackoffMs = options.defaultRateLimitBackoffMs ?? DEFAULT_RATE_LIMIT_BACKOFF_MS;\n\n this.promiseBuffer = createPromiseBuffer({\n size: options?.bufferSize ?? DEFAULT_BUFFER_SIZE,\n concurrency: options?.concurrency ?? DEFAULT_CONCURRENCY,\n });\n }\n\n override getIgnoreUrls(): Array<string | RegExp> {\n const { tracesURL = '', logsURL = '' } = this.options;\n return [tracesURL, logsURL].filter(Boolean);\n }\n\n override isBatched(): boolean {\n return true;\n }\n\n send(items: TransportItem[]): void {\n const otelPayload = new OtelPayload(this.internalLogger);\n\n items.forEach((item) => otelPayload.addResourceItem(item));\n this.sendPayload(otelPayload.getPayload());\n }\n\n private sendPayload(payload: OtelTransportPayload): void {\n try {\n const { tracesURL = '', logsURL = '' } = this.options;\n\n for (const [key, value] of Object.entries(payload)) {\n if (!(isArray(value) && value.length > 0)) {\n continue;\n }\n\n let disabledUntil: Date | undefined;\n let updateDisabledUntil = (_: Date) => {};\n let url = '';\n\n switch (key) {\n case 'resourceSpans':\n url = tracesURL;\n disabledUntil = this.sendingTracesDisabledUntil;\n updateDisabledUntil = (retryAfterDate: Date) => {\n this.sendingTracesDisabledUntil = retryAfterDate;\n };\n break;\n case 'resourceLogs':\n url = logsURL;\n disabledUntil = this.sendingLogsDisabledUntil;\n updateDisabledUntil = (retryAfterDate: Date) => {\n this.sendingLogsDisabledUntil = retryAfterDate;\n };\n break;\n }\n\n if (disabledUntil && disabledUntil > new Date(Date.now())) {\n this.logWarn(`Dropping transport item due to too many requests. Backoff until ${disabledUntil}`);\n return undefined;\n }\n\n const body = JSON.stringify({ [key]: value });\n\n const { requestOptions, apiKey } = this.options;\n const { headers, ...restOfRequestOptions } = requestOptions ?? {};\n\n this.promiseBuffer.add(() => {\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...(headers ?? {}),\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body,\n keepalive: true,\n ...(restOfRequestOptions ?? {}),\n })\n .then((response) => {\n if (response.status === 429) {\n updateDisabledUntil(this.getRetryAfterDate(response));\n this.logWarn(`Too many requests, backing off until ${disabledUntil}`);\n }\n\n return response;\n })\n .catch((error) => {\n this.logError('Failed sending payload to the receiver\\n', JSON.parse(body), error);\n });\n });\n }\n } catch (error) {\n this.logError(error);\n }\n }\n\n private getRetryAfterDate(response: Response): Date {\n const now = Date.now();\n const retryAfterHeader = response.headers.get('Retry-After');\n\n if (retryAfterHeader) {\n const delay = Number(retryAfterHeader);\n\n if (!isNaN(delay)) {\n return new Date(delay * 1000 + now);\n }\n\n const date = Date.parse(retryAfterHeader);\n\n if (!isNaN(date)) {\n return new Date(date);\n }\n }\n\n return new Date(now + this.rateLimitBackoffMs);\n }\n}\n"]}
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export type { OtelTransportPayload } from './types';
|
|
2
|
-
export type { LogRecord, LogTransportItem, Resource, ResourceLogs, Scope, ScopeLog } from './transform/index';
|
|
3
1
|
export { OtelPayload } from './OtelPayload';
|
|
2
|
+
export type { LogRecord, LogTransportItem, Resource, ResourceLog, ResourceLogs, Scope, ScopeLog, } from './transform/index';
|
|
3
|
+
export type { Logs, OtelTransportPayload, Traces } from './types';
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
export { getLogTransforms, getTraceTransforms } from './transform';
|
|
2
|
-
export type { LogRecord,
|
|
2
|
+
export type { LogRecord, LogTransportItem, ResourceLogs, LogsTransform, Resource, ResourceLog, ResourceSpan, ResourceSpans, Scope, ScopeLog, TraceTransform, } from './types';
|
|
@@ -26,21 +26,23 @@ export interface ScopeSpan {
|
|
|
26
26
|
scope: Scope;
|
|
27
27
|
logRecords: LogRecord[];
|
|
28
28
|
}
|
|
29
|
-
export interface
|
|
29
|
+
export interface ResourceLog {
|
|
30
30
|
resource: Resource;
|
|
31
31
|
scopeLogs: ScopeLog[];
|
|
32
32
|
}
|
|
33
|
-
export
|
|
33
|
+
export type ResourceLogs = ResourceLog[];
|
|
34
|
+
export interface ResourceSpan extends Omit<IResourceSpans, 'resource'> {
|
|
34
35
|
resource: Resource;
|
|
35
36
|
}
|
|
37
|
+
export type ResourceSpans = ResourceSpan[];
|
|
36
38
|
export type LogTransportItem = TransportItem<Exclude<APIEvent, 'TraceEvent'>>;
|
|
37
39
|
export type TraceTransportItem = TransportItem<TraceEvent>;
|
|
38
40
|
export type LogsTransform = {
|
|
39
|
-
toResourceLog: (transportItem: LogTransportItem) =>
|
|
41
|
+
toResourceLog: (transportItem: LogTransportItem) => ResourceLog;
|
|
40
42
|
toScopeLog: (transportItem: LogTransportItem) => ScopeLog;
|
|
41
43
|
toLogRecord: (transportItem: LogTransportItem) => LogRecord;
|
|
42
44
|
};
|
|
43
45
|
export type TraceTransform = {
|
|
44
|
-
toResourceSpan: (transportItem: TransportItem<TraceEvent>) =>
|
|
46
|
+
toResourceSpan: (transportItem: TransportItem<TraceEvent>) => ResourceSpan;
|
|
45
47
|
};
|
|
46
48
|
export type ResourceMeta = Pick<Meta, 'app' | 'browser' | 'sdk'>;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import type { ResourceLogs } from './transform';
|
|
1
|
+
import type { ResourceLogs, ResourceSpans } from './transform';
|
|
2
2
|
export interface OtelTransportPayload {
|
|
3
|
-
readonly resourceLogs: Readonly<ResourceLogs
|
|
4
|
-
readonly resourceSpans: Readonly<
|
|
3
|
+
readonly resourceLogs: Readonly<ResourceLogs>;
|
|
4
|
+
readonly resourceSpans: Readonly<ResourceSpans>;
|
|
5
5
|
}
|
|
6
|
+
export type Logs = Pick<OtelTransportPayload, 'resourceLogs'>;
|
|
7
|
+
export type Traces = Pick<OtelTransportPayload, 'resourceSpans'>;
|
|
@@ -3,7 +3,7 @@ import type { OtlpHttpTransportOptions } from './types';
|
|
|
3
3
|
export declare class OtlpHttpTransport extends BaseTransport {
|
|
4
4
|
private options;
|
|
5
5
|
readonly name = "@grafana/faro-web-sdk:transport-otlp-http";
|
|
6
|
-
readonly version = "1.
|
|
6
|
+
readonly version = "1.2.0";
|
|
7
7
|
private readonly promiseBuffer;
|
|
8
8
|
private readonly rateLimitBackoffMs;
|
|
9
9
|
private sendingTracesDisabledUntil;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@grafana/faro-transport-otlp-http",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.2.0",
|
|
4
4
|
"description": "Faro transport which converts the Faro data model to the Otlp data model.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"observability",
|
|
@@ -50,10 +50,10 @@
|
|
|
50
50
|
"quality:circular-deps": "madge --circular ."
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@grafana/faro-core": "^1.
|
|
53
|
+
"@grafana/faro-core": "^1.2.0"
|
|
54
54
|
},
|
|
55
55
|
"publishConfig": {
|
|
56
56
|
"access": "public"
|
|
57
57
|
},
|
|
58
|
-
"gitHead": "
|
|
58
|
+
"gitHead": "438d721ff86f5140d999994efbbfa9d6e51ee1be"
|
|
59
59
|
}
|