@grafana/faro-transport-otlp-http 2.3.1 → 2.4.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/bundle/types/transport.d.ts +2 -2
- package/dist/bundle/types/types.d.ts +2 -1
- package/dist/cjs/payload/OtelPayload.js +13 -15
- package/dist/cjs/payload/OtelPayload.js.map +1 -1
- package/dist/cjs/payload/attribute/attributeUtils.js +2 -5
- package/dist/cjs/payload/attribute/attributeUtils.js.map +1 -1
- package/dist/cjs/payload/transform/transform.js +42 -59
- package/dist/cjs/payload/transform/transform.js.map +1 -1
- package/dist/cjs/transport.js +107 -133
- package/dist/cjs/transport.js.map +1 -1
- package/dist/cjs/types.js.map +1 -1
- package/dist/esm/transport.js +75 -62
- package/dist/esm/transport.js.map +1 -1
- package/dist/esm/types.js.map +1 -1
- package/dist/types/transport.d.ts +2 -2
- package/dist/types/types.d.ts +2 -1
- package/package.json +4 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
var GrafanaFaroTransportOtlpHttp=function(e){"use strict";function t(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]])}return r}var r;function n(e,t){return typeof e===t}"function"==typeof SuppressedError&&SuppressedError,function(e){e.EXCEPTION="exception",e.LOG="log",e.MEASUREMENT="measurement",e.TRACE="trace",e.EVENT="event"}(r||(r={})),r.EXCEPTION,r.LOG,r.MEASUREMENT,r.TRACE,r.EVENT;const o=e=>n(e,"number")&&!isNaN(e)||n(e,"bigint"),s=e=>!(e=>n(e,"null"))(e)&&n(e,"object"),i=e=>function(e,t){return Object.prototype.toString.call(e)===`[object ${t}]`}(e,"Array");var a,l;function u(){}!function(e){e.TRACE="trace",e.DEBUG="debug",e.INFO="info",e.LOG="log",e.WARN="warn",e.ERROR="error"}(a||(a={})),a.LOG,a.TRACE,a.DEBUG,a.INFO,a.LOG,a.WARN,a.ERROR,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 c={debug:u,error:u,info:u,prefix:"Faro",warn:u};l.ERROR;const d=Object.assign({},console);class g{constructor(){this.unpatchedConsole=d,this.internalLogger=c,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 v extends g{isBatched(){return!1}getIgnoreUrls(){return[]}}const p="2.3.1",f="exception.message",m="exception.type";function h(e){return(e=>n(e,"string"))(e)?{stringValue:e}:(e=>o(e)&&Number.isInteger(e))(e)?{intValue:e}:o(e)?{doubleValue:e}:(e=>n(e,"boolean"))(e)?{boolValue:e}:i(e)?{arrayValue:{values:e.map(h)}}:e instanceof Uint8Array?{bytesValue:e}:s(e)?{kvlistValue:{values:Object.entries(e).map(([e,t])=>b(e,t)).filter(y)}}:{}}function b(e,t){if(null!=t&&""!==t)return{key:e,value:h(t)}}function y(e){return Boolean(e)&&"string"==typeof(null==e?void 0:e.key)&&void 0!==(null==e?void 0:e.value)}function O(e,t){function n(e){return{scope:{name:"@grafana/faro-web-sdk",version:p},logRecords:[o(e)]}}function o(n){const{type:o}=n;switch(o){case r.LOG:return function(e){var t,r;const{meta:n,payload:o}=e,l=i(o.timestamp),u=h(o.message);function c(e){switch(e){case a.TRACE:return{severityNumber:1,severityText:"TRACE"};case a.DEBUG:return{severityNumber:5,severityText:"DEBUG"};case a.INFO:return{severityNumber:9,severityText:"INFO"};case a.LOG:return{severityNumber:10,severityText:"INFO2"};case a.WARN:return{severityNumber:13,severityText:"WARN"};case a.ERROR:return{severityNumber:17,severityText:"ERROR"}}}return Object.assign(Object.assign({timeUnixNano:l},c(o.level)),{body:u,attributes:[...s(n),b("faro.log.context",o.context)].filter(y),traceId:null===(t=o.trace)||void 0===t?void 0:t.trace_id,spanId:null===(r=o.trace)||void 0===r?void 0:r.span_id})}(n);case r.EXCEPTION:return function(e){var r,n;const{meta:o,payload:a}=e,l=i(a.timestamp),u=R(e,null==t?void 0:t.createErrorLogBody);return Object.assign(Object.assign({timeUnixNano:l},u?{body:u}:{}),{attributes:[...s(o),b(m,a.type),b(f,a.value),b("faro.error.stacktrace",a.stacktrace),b("faro.error.context",a.context)].filter(y),traceId:null===(r=a.trace)||void 0===r?void 0:r.trace_id,spanId:null===(n=a.trace)||void 0===n?void 0:n.span_id})}(n);case r.EVENT:return function(e){var t,r;const{meta:n,payload:o}=e,a=i(o.timestamp),l=h(o.name);return{timeUnixNano:a,body:l,attributes:[...s(n),b("event.name",o.name),b("event.domain",o.domain),b("event.attributes",o.attributes)].filter(y),traceId:null===(t=o.trace)||void 0===t?void 0:t.trace_id,spanId:null===(r=o.trace)||void 0===r?void 0:r.span_id}}(n);case r.MEASUREMENT:return function(e){var r,n;const{meta:o,payload:a}=e,l=i(a.timestamp),[u,c]=Object.entries(a.values).flat(),d=R(e,null==t?void 0:t.createMeasurementLogBody);return Object.assign(Object.assign({timeUnixNano:l},d?{body:d}:{}),{attributes:[...s(o),b("measurement.type",a.type),b("measurement.name",u),b("measurement.value",c),b("faro.measurement.context",a.context)].filter(y),traceId:null===(r=a.trace)||void 0===r?void 0:r.trace_id,spanId:null===(n=a.trace)||void 0===n?void 0:n.span_id})}(n);default:return null==e||e.error(`Unknown TransportItemType: ${o}`),{}}}function s(e){const{view:t,page:r,session:n,user:o}=e;return[b("view.name",null==t?void 0:t.name),b("url.full",null==r?void 0:r.url),b("page.id",null==r?void 0:r.id),b("page.attributes",null==r?void 0:r.attributes),b("session.id",null==n?void 0:n.id),b("session.attributes",null==n?void 0:n.attributes),b("user.id",null==o?void 0:o.id),b("user.name",null==o?void 0:o.username),b("user.email",null==o?void 0:o.email),b("user.full_name",null==o?void 0:o.fullName),b("user.roles",null==o?void 0:o.roles),b("user.hash",null==o?void 0:o.hash),b("user.attributes",null==o?void 0:o.attributes)].filter(y)}function i(e){return 1e6*Date.parse(e)}return{toResourceLog:function(e){return{resource:E(e),scopeLogs:[n(e)]}},toScopeLog:n,toLogRecord:o}}function E(e){const{browser:t,sdk:r,app:n}=e.meta;return{attributes:[b("browser.mobile",null==t?void 0:t.mobile),b("user_agent.original",null==t?void 0:t.userAgent),b("browser.language",null==t?void 0:t.language),b("browser.brands",null==t?void 0:t.brands),b("browser.platform",null==t?void 0:t.os),b("browser.name",null==t?void 0:t.name),b("browser.version",null==t?void 0:t.version),b("browser.screen_width",null==t?void 0:t.viewportWidth),b("browser.screen_height",null==t?void 0:t.viewportHeight),b("telemetry.sdk.name",null==r?void 0:r.name),b("telemetry.sdk.version",null==r?void 0:r.version),r?b("telemetry.sdk.language","webjs"):void 0,b("service.name",null==n?void 0:n.name),b("service.version",null==n?void 0:n.version),b("service.namespace",null==n?void 0:n.namespace),b("deployment.environment.name",null==n?void 0:n.environment)].filter(y)}}function R(e,t){return"function"==typeof t?h(t(e)):void 0}class L{constructor({internalLogger:e,customOtlpTransform:t,transportItem:r}){this.resourceSpans=[],this.internalLogger=e,this.resourceLogs=[],this.getLogTransforms=O(this.internalLogger,t),this.getTraceTransforms=(this.internalLogger,{toResourceSpan:function(e){var t,r;const n=E(e),o=null===(r=null===(t=e.payload.resourceSpans)||void 0===t?void 0:t[0])||void 0===r?void 0:r.scopeSpans;return{resource:n,scopeSpans:null!=o?o:[]}}}),r&&this.addResourceItem(r)}getPayload(){return{resourceLogs:this.resourceLogs,resourceSpans:this.resourceSpans}}addResourceItem(e){var t,n,o,s;const{type:i}=e;try{switch(i){case r.LOG:case r.EXCEPTION:case r.EVENT:case r.MEASUREMENT:{const{toLogRecord:r,toResourceLog:o}=this.getLogTransforms;0===this.resourceLogs.length?this.resourceLogs=[o(e)]:null===(n=null===(t=this.resourceLogs[0])||void 0===t?void 0:t.scopeLogs[0])||void 0===n||n.logRecords.push(r(e));break}case r.TRACE:{const{toResourceSpan:t}=this.getTraceTransforms;this.resourceSpans.push(t(e));break}default:null===(o=this.internalLogger)||void 0===o||o.error(`Unknown TransportItemType: ${i}`)}}catch(e){null===(s=this.internalLogger)||void 0===s||s.error(e)}}}return e.OtlpHttpTransport=class extends v{constructor(e){var t,r,n;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:r}=e,n=[];let o=0;const s=()=>{if(o<r&&n.length){const{producer:e,resolve:t,reject:r}=n.shift();o++,e().then(e=>{o--,s(),t(e)},e=>{o--,s(),r(e)})}};return{add:e=>{if(n.length+o>=t)throw new Error("Task buffer full");return new Promise((t,r)=>{n.push({producer:e,resolve:t,reject:r}),s()})}}}({size:null!==(r=null==e?void 0:e.bufferSize)&&void 0!==r?r:30,concurrency:null!==(n=null==e?void 0:e.concurrency)&&void 0!==n?n:5})}getIgnoreUrls(){var e;const{tracesURL:t="",logsURL:r=""}=this.options;return[t,r].filter(Boolean).concat(null!==(e=this.config.ignoreUrls)&&void 0!==e?e:[])}isBatched(){return!0}send(e){const t=new L({internalLogger:this.internalLogger,customOtlpTransform:this.options.otlpTransform});e.forEach(e=>t.addResourceItem(e)),this.sendPayload(t.getPayload())}sendPayload(e){try{const{tracesURL:r="",logsURL:n=""}=this.options;for(const[o,s]of Object.entries(e)){if(!(i(s)&&s.length>0))continue;let e,a=e=>{},l="";switch(o){case"resourceSpans":l=r,e=this.sendingTracesDisabledUntil,a=e=>{this.sendingTracesDisabledUntil=e};break;case"resourceLogs":l=n,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 c=JSON.stringify({[o]:s}),{requestOptions:d,apiKey:g}=this.options,v=null!=d?d:{},{headers:p={}}=v,f=t(v,["headers"]);if(!l)continue;const m={};for(const[e,t]of Object.entries(p))m[e]="function"==typeof t?t():t;this.promiseBuffer.add(()=>fetch(l,Object.assign({method:"POST",headers:Object.assign(Object.assign({"Content-Type":"application/json"},m),g?{"x-api-key":g}:{}),body:c,keepalive:c.length<=6e4},null!=f?f:{})).then(t=>(429===t.status&&(a(this.getRetryAfterDate(t)),this.logWarn(`Too many requests, backing off until ${e}`)),t.text().catch(u),t)).catch(e=>{this.logError("Failed sending payload to the receiver\n",JSON.parse(c),e)}))}}catch(e){this.logError(e)}}getRetryAfterDate(e){const t=Date.now(),r=e.headers.get("Retry-After");if(r){const e=Number(r);if(!isNaN(e))return new Date(1e3*e+t);const n=Date.parse(r);if(!isNaN(n))return new Date(n)}return new Date(t+this.rateLimitBackoffMs)}},e}({});
|
|
1
|
+
var GrafanaFaroTransportOtlpHttp=function(e){"use strict";function t(e,t){var r={};for(var n in e)Object.prototype.hasOwnProperty.call(e,n)&&t.indexOf(n)<0&&(r[n]=e[n]);if(null!=e&&"function"==typeof Object.getOwnPropertySymbols){var o=0;for(n=Object.getOwnPropertySymbols(e);o<n.length;o++)t.indexOf(n[o])<0&&Object.prototype.propertyIsEnumerable.call(e,n[o])&&(r[n[o]]=e[n[o]])}return r}function r(e,t,r,n){return new(r||(r=Promise))(function(o,s){function i(e){try{l(n.next(e))}catch(e){s(e)}}function a(e){try{l(n.throw(e))}catch(e){s(e)}}function l(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r(function(e){e(t)})).then(i,a)}l((n=n.apply(e,t||[])).next())})}var n;function o(e,t){return typeof e===t}"function"==typeof SuppressedError&&SuppressedError,function(e){e.EXCEPTION="exception",e.LOG="log",e.MEASUREMENT="measurement",e.TRACE="trace",e.EVENT="event"}(n||(n={})),n.EXCEPTION,n.LOG,n.MEASUREMENT,n.TRACE,n.EVENT;const s=e=>o(e,"number")&&!isNaN(e)||o(e,"bigint"),i=e=>!(e=>o(e,"null"))(e)&&o(e,"object"),a=e=>function(e,t){return Object.prototype.toString.call(e)===`[object ${t}]`}(e,"Array");var l,u;function c(){}!function(e){e.TRACE="trace",e.DEBUG="debug",e.INFO="info",e.LOG="log",e.WARN="warn",e.ERROR="error"}(l||(l={})),l.LOG,l.TRACE,l.DEBUG,l.INFO,l.LOG,l.WARN,l.ERROR,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"}(u||(u={}));const d={debug:c,error:c,info:c,prefix:"Faro",warn:c};u.ERROR;const v=Object.assign({},console);class g{constructor(){this.unpatchedConsole=v,this.internalLogger=d,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 f extends g{isBatched(){return!1}getIgnoreUrls(){return[]}}const p="2.4.0",m="exception.message",h="exception.type";function b(e){return(e=>o(e,"string"))(e)?{stringValue:e}:(e=>s(e)&&Number.isInteger(e))(e)?{intValue:e}:s(e)?{doubleValue:e}:(e=>o(e,"boolean"))(e)?{boolValue:e}:a(e)?{arrayValue:{values:e.map(b)}}:e instanceof Uint8Array?{bytesValue:e}:i(e)?{kvlistValue:{values:Object.entries(e).map(([e,t])=>y(e,t)).filter(O)}}:{}}function y(e,t){if(null!=t&&""!==t)return{key:e,value:b(t)}}function O(e){return Boolean(e)&&"string"==typeof(null==e?void 0:e.key)&&void 0!==(null==e?void 0:e.value)}function E(e,t){function r(e){return{scope:{name:"@grafana/faro-web-sdk",version:p},logRecords:[o(e)]}}function o(r){const{type:o}=r;switch(o){case n.LOG:return function(e){var t,r;const{meta:n,payload:o}=e,a=i(o.timestamp),u=b(o.message);function c(e){switch(e){case l.TRACE:return{severityNumber:1,severityText:"TRACE"};case l.DEBUG:return{severityNumber:5,severityText:"DEBUG"};case l.INFO:return{severityNumber:9,severityText:"INFO"};case l.LOG:return{severityNumber:10,severityText:"INFO2"};case l.WARN:return{severityNumber:13,severityText:"WARN"};case l.ERROR:return{severityNumber:17,severityText:"ERROR"}}}return Object.assign(Object.assign({timeUnixNano:a},c(o.level)),{body:u,attributes:[...s(n),y("faro.log.context",o.context)].filter(O),traceId:null===(t=o.trace)||void 0===t?void 0:t.trace_id,spanId:null===(r=o.trace)||void 0===r?void 0:r.span_id})}(r);case n.EXCEPTION:return function(e){var r,n;const{meta:o,payload:a}=e,l=i(a.timestamp),u=L(e,null==t?void 0:t.createErrorLogBody);return Object.assign(Object.assign({timeUnixNano:l},u?{body:u}:{}),{attributes:[...s(o),y(h,a.type),y(m,a.value),y("faro.error.stacktrace",a.stacktrace),y("faro.error.context",a.context)].filter(O),traceId:null===(r=a.trace)||void 0===r?void 0:r.trace_id,spanId:null===(n=a.trace)||void 0===n?void 0:n.span_id})}(r);case n.EVENT:return function(e){var t,r;const{meta:n,payload:o}=e,a=i(o.timestamp),l=b(o.name);return{timeUnixNano:a,body:l,attributes:[...s(n),y("event.name",o.name),y("event.domain",o.domain),y("event.attributes",o.attributes)].filter(O),traceId:null===(t=o.trace)||void 0===t?void 0:t.trace_id,spanId:null===(r=o.trace)||void 0===r?void 0:r.span_id}}(r);case n.MEASUREMENT:return function(e){var r,n;const{meta:o,payload:a}=e,l=i(a.timestamp),[u,c]=Object.entries(a.values).flat(),d=L(e,null==t?void 0:t.createMeasurementLogBody);return Object.assign(Object.assign({timeUnixNano:l},d?{body:d}:{}),{attributes:[...s(o),y("measurement.type",a.type),y("measurement.name",u),y("measurement.value",c),y("faro.measurement.context",a.context)].filter(O),traceId:null===(r=a.trace)||void 0===r?void 0:r.trace_id,spanId:null===(n=a.trace)||void 0===n?void 0:n.span_id})}(r);default:return null==e||e.error(`Unknown TransportItemType: ${o}`),{}}}function s(e){const{view:t,page:r,session:n,user:o}=e;return[y("view.name",null==t?void 0:t.name),y("url.full",null==r?void 0:r.url),y("page.id",null==r?void 0:r.id),y("page.attributes",null==r?void 0:r.attributes),y("session.id",null==n?void 0:n.id),y("session.attributes",null==n?void 0:n.attributes),y("user.id",null==o?void 0:o.id),y("user.name",null==o?void 0:o.username),y("user.email",null==o?void 0:o.email),y("user.full_name",null==o?void 0:o.fullName),y("user.roles",null==o?void 0:o.roles),y("user.hash",null==o?void 0:o.hash),y("user.attributes",null==o?void 0:o.attributes)].filter(O)}function i(e){return 1e6*Date.parse(e)}return{toResourceLog:function(e){return{resource:R(e),scopeLogs:[r(e)]}},toScopeLog:r,toLogRecord:o}}function R(e){const{browser:t,sdk:r,app:n}=e.meta;return{attributes:[y("browser.mobile",null==t?void 0:t.mobile),y("user_agent.original",null==t?void 0:t.userAgent),y("browser.language",null==t?void 0:t.language),y("browser.brands",null==t?void 0:t.brands),y("browser.platform",null==t?void 0:t.os),y("browser.name",null==t?void 0:t.name),y("browser.version",null==t?void 0:t.version),y("browser.screen_width",null==t?void 0:t.viewportWidth),y("browser.screen_height",null==t?void 0:t.viewportHeight),y("telemetry.sdk.name",null==r?void 0:r.name),y("telemetry.sdk.version",null==r?void 0:r.version),r?y("telemetry.sdk.language","webjs"):void 0,y("service.name",null==n?void 0:n.name),y("service.version",null==n?void 0:n.version),y("service.namespace",null==n?void 0:n.namespace),y("deployment.environment.name",null==n?void 0:n.environment)].filter(O)}}function L(e,t){return"function"==typeof t?b(t(e)):void 0}class T{constructor({internalLogger:e,customOtlpTransform:t,transportItem:r}){this.resourceSpans=[],this.internalLogger=e,this.resourceLogs=[],this.getLogTransforms=E(this.internalLogger,t),this.getTraceTransforms=(this.internalLogger,{toResourceSpan:function(e){var t,r;const n=R(e),o=null===(r=null===(t=e.payload.resourceSpans)||void 0===t?void 0:t[0])||void 0===r?void 0:r.scopeSpans;return{resource:n,scopeSpans:null!=o?o:[]}}}),r&&this.addResourceItem(r)}getPayload(){return{resourceLogs:this.resourceLogs,resourceSpans:this.resourceSpans}}addResourceItem(e){var t,r,o,s;const{type:i}=e;try{switch(i){case n.LOG:case n.EXCEPTION:case n.EVENT:case n.MEASUREMENT:{const{toLogRecord:n,toResourceLog:o}=this.getLogTransforms;0===this.resourceLogs.length?this.resourceLogs=[o(e)]:null===(r=null===(t=this.resourceLogs[0])||void 0===t?void 0:t.scopeLogs[0])||void 0===r||r.logRecords.push(n(e));break}case n.TRACE:{const{toResourceSpan:t}=this.getTraceTransforms;this.resourceSpans.push(t(e));break}default:null===(o=this.internalLogger)||void 0===o||o.error(`Unknown TransportItemType: ${i}`)}}catch(e){null===(s=this.internalLogger)||void 0===s||s.error(e)}}}return e.OtlpHttpTransport=class extends f{constructor(e){var t,r,n;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:r}=e,n=[];let o=0;const s=()=>{if(o<r&&n.length){const{producer:e,resolve:t,reject:r}=n.shift();o++,e().then(e=>{o--,s(),t(e)},e=>{o--,s(),r(e)})}};return{add:e=>{if(n.length+o>=t)throw new Error("Task buffer full");return new Promise((t,r)=>{n.push({producer:e,resolve:t,reject:r}),s()})}}}({size:null!==(r=null==e?void 0:e.bufferSize)&&void 0!==r?r:30,concurrency:null!==(n=null==e?void 0:e.concurrency)&&void 0!==n?n:5})}getIgnoreUrls(){var e;const{tracesURL:t="",logsURL:r=""}=this.options;return[t,r].filter(Boolean).concat(null!==(e=this.config.ignoreUrls)&&void 0!==e?e:[])}isBatched(){return!0}send(e){return r(this,void 0,void 0,function*(){const t=new T({internalLogger:this.internalLogger,customOtlpTransform:this.options.otlpTransform});e.forEach(e=>t.addResourceItem(e)),yield this.sendPayload(t.getPayload())})}sendPayload(e){return r(this,void 0,void 0,function*(){try{const{tracesURL:n="",logsURL:o=""}=this.options;for(const[s,i]of Object.entries(e)){if(!(a(i)&&i.length>0))continue;let e,l=e=>{},u="";switch(s){case"resourceSpans":u=n,e=this.sendingTracesDisabledUntil,l=e=>{this.sendingTracesDisabledUntil=e};break;case"resourceLogs":u=o,e=this.sendingLogsDisabledUntil,l=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 d=JSON.stringify({[s]:i}),{requestOptions:v,apiKey:g}=this.options,f=null!=v?v:{},{headers:p={}}=f,m=t(f,["headers"]);u&&(yield this.promiseBuffer.add(()=>r(this,void 0,void 0,function*(){const t={};for(const[e,r]of Object.entries(p))t[e]="function"==typeof r?yield Promise.resolve(r()):r;return fetch(u,Object.assign({method:"POST",headers:Object.assign(Object.assign({"Content-Type":"application/json"},t),g?{"x-api-key":g}:{}),body:d,keepalive:d.length<=6e4},null!=m?m:{})).then(t=>(429===t.status&&(l(this.getRetryAfterDate(t)),this.logWarn(`Too many requests, backing off until ${e}`)),t.text().catch(c),t)).catch(e=>{this.logError("Failed sending payload to the receiver\n",JSON.parse(d),e)})})))}}catch(e){this.logError(e)}})}getRetryAfterDate(e){const t=Date.now(),r=e.headers.get("Retry-After");if(r){const e=Number(r);if(!isNaN(e))return new Date(1e3*e+t);const n=Date.parse(r);if(!isNaN(n))return new Date(n)}return new Date(t+this.rateLimitBackoffMs)}},e}({});
|
|
@@ -4,7 +4,7 @@ import type { OtlpHttpTransportOptions } from './types';
|
|
|
4
4
|
export declare class OtlpHttpTransport extends BaseTransport {
|
|
5
5
|
private options;
|
|
6
6
|
readonly name = "@grafana/faro-web-sdk:transport-otlp-http";
|
|
7
|
-
readonly version = "2.
|
|
7
|
+
readonly version = "2.4.0";
|
|
8
8
|
private readonly promiseBuffer;
|
|
9
9
|
private readonly rateLimitBackoffMs;
|
|
10
10
|
private sendingTracesDisabledUntil;
|
|
@@ -12,7 +12,7 @@ export declare class OtlpHttpTransport extends BaseTransport {
|
|
|
12
12
|
constructor(options: OtlpHttpTransportOptions);
|
|
13
13
|
getIgnoreUrls(): Patterns;
|
|
14
14
|
isBatched(): boolean;
|
|
15
|
-
send(items: TransportItem[]): void
|
|
15
|
+
send(items: TransportItem[]): Promise<void>;
|
|
16
16
|
private sendPayload;
|
|
17
17
|
private getRetryAfterDate;
|
|
18
18
|
}
|
|
@@ -5,8 +5,9 @@ export interface OtlpTransportRequestOptions extends Omit<RequestInit, 'body' |
|
|
|
5
5
|
* Each value can be:
|
|
6
6
|
* - a string (static value)
|
|
7
7
|
* - a function returning a string (dynamic value)
|
|
8
|
+
* - a function returning a Promise of string (dynamic value, async)
|
|
8
9
|
*/
|
|
9
|
-
headers?: Record<string, string | (() => string)>;
|
|
10
|
+
headers?: Record<string, string | (() => string | Promise<string>)>;
|
|
10
11
|
}
|
|
11
12
|
export interface OtlpHttpTransportOptions {
|
|
12
13
|
apiKey?: string;
|
|
@@ -1,11 +1,10 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.OtelPayload = void 0;
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
var internalLogger = _a.internalLogger, customOtlpTransform = _a.customOtlpTransform, transportItem = _a.transportItem;
|
|
4
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
5
|
+
const transform_1 = require("./transform");
|
|
6
|
+
class OtelPayload {
|
|
7
|
+
constructor({ internalLogger, customOtlpTransform, transportItem }) {
|
|
9
8
|
this.resourceSpans = [];
|
|
10
9
|
this.internalLogger = internalLogger;
|
|
11
10
|
this.resourceLogs = [];
|
|
@@ -15,22 +14,22 @@ var OtelPayload = /** @class */ (function () {
|
|
|
15
14
|
this.addResourceItem(transportItem);
|
|
16
15
|
}
|
|
17
16
|
}
|
|
18
|
-
|
|
17
|
+
getPayload() {
|
|
19
18
|
return {
|
|
20
19
|
resourceLogs: this.resourceLogs,
|
|
21
20
|
resourceSpans: this.resourceSpans,
|
|
22
21
|
};
|
|
23
|
-
}
|
|
24
|
-
|
|
22
|
+
}
|
|
23
|
+
addResourceItem(transportItem) {
|
|
25
24
|
var _a, _b, _c, _d;
|
|
26
|
-
|
|
25
|
+
const { type } = transportItem;
|
|
27
26
|
try {
|
|
28
27
|
switch (type) {
|
|
29
28
|
case faro_core_1.TransportItemType.LOG:
|
|
30
29
|
case faro_core_1.TransportItemType.EXCEPTION:
|
|
31
30
|
case faro_core_1.TransportItemType.EVENT:
|
|
32
31
|
case faro_core_1.TransportItemType.MEASUREMENT: {
|
|
33
|
-
|
|
32
|
+
const { toLogRecord, toResourceLog } = this.getLogTransforms;
|
|
34
33
|
// Currently the scope is fixed to '@grafana/faro-web-sdk'.
|
|
35
34
|
// Once we are able to drive the scope by instrumentation this will change and we need to align this function
|
|
36
35
|
if (this.resourceLogs.length === 0) {
|
|
@@ -44,7 +43,7 @@ var OtelPayload = /** @class */ (function () {
|
|
|
44
43
|
break;
|
|
45
44
|
}
|
|
46
45
|
case faro_core_1.TransportItemType.TRACE: {
|
|
47
|
-
|
|
46
|
+
const { toResourceSpan } = this.getTraceTransforms;
|
|
48
47
|
// We use the Otel Model as it is to avoid unnecessary resource consumption.
|
|
49
48
|
// This is because we don't need the same logic to add items as it is for logs.
|
|
50
49
|
// Also the Otel library already applies the respective protocol transforms so there is no need for additional transforms.
|
|
@@ -53,15 +52,14 @@ var OtelPayload = /** @class */ (function () {
|
|
|
53
52
|
break;
|
|
54
53
|
}
|
|
55
54
|
default:
|
|
56
|
-
(_c = this.internalLogger) === null || _c === void 0 ? void 0 : _c.error(
|
|
55
|
+
(_c = this.internalLogger) === null || _c === void 0 ? void 0 : _c.error(`Unknown TransportItemType: ${type}`);
|
|
57
56
|
break;
|
|
58
57
|
}
|
|
59
58
|
}
|
|
60
59
|
catch (error) {
|
|
61
60
|
(_d = this.internalLogger) === null || _d === void 0 ? void 0 : _d.error(error);
|
|
62
61
|
}
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
}());
|
|
62
|
+
}
|
|
63
|
+
}
|
|
66
64
|
exports.OtelPayload = OtelPayload;
|
|
67
65
|
//# sourceMappingURL=OtelPayload.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"OtelPayload.js","sourceRoot":"","sources":["../../../src/payload/OtelPayload.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"OtelPayload.js","sourceRoot":"","sources":["../../../src/payload/OtelPayload.ts"],"names":[],"mappings":";;;AAAA,kDAAuD;AAKvD,2CAAmE;AAWnE,MAAa,WAAW;IAStB,YAAY,EAAE,cAAc,EAAE,mBAAmB,EAAE,aAAa,EAAqB;QAP7E,kBAAa,GAAG,EAAmB,CAAC;QAQ1C,IAAI,CAAC,cAAc,GAAG,cAAc,CAAC;QACrC,IAAI,CAAC,YAAY,GAAG,EAAE,CAAC;QAEvB,IAAI,CAAC,gBAAgB,GAAG,IAAA,4BAAgB,EAAC,IAAI,CAAC,cAAc,EAAE,mBAAmB,CAAC,CAAC;QACnF,IAAI,CAAC,kBAAkB,GAAG,IAAA,8BAAkB,EAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAElE,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC;QACtC,CAAC;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,CAAC;YACH,QAAQ,IAAI,EAAE,CAAC;gBACb,KAAK,6BAAiB,CAAC,GAAG,CAAC;gBAC3B,KAAK,6BAAiB,CAAC,SAAS,CAAC;gBACjC,KAAK,6BAAiB,CAAC,KAAK,CAAC;gBAC7B,KAAK,6BAAiB,CAAC,WAAW,CAAC,CAAC,CAAC;oBACnC,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,CAAC;wBACnC,IAAI,CAAC,YAAY,GAAG,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC;oBACrD,CAAC;yBAAM,CAAC;wBACN,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;oBAClF,CAAC;oBACD,MAAM;gBACR,CAAC;gBACD,KAAK,6BAAiB,CAAC,KAAK,CAAC,CAAC,CAAC;oBAC7B,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,CAAC;gBACD;oBACE,MAAA,IAAI,CAAC,cAAc,0CAAE,KAAK,CAAC,8BAA8B,IAAI,EAAE,CAAC,CAAC;oBACjE,MAAM;YACV,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAA,IAAI,CAAC,cAAc,0CAAE,KAAK,CAAC,KAAK,CAAC,CAAC;QACpC,CAAC;IACH,CAAC;CACF;AArED,kCAqEC","sourcesContent":["import { TransportItemType } from '@grafana/faro-core';\nimport type { InternalLogger, TraceEvent, TransportItem } from '@grafana/faro-core';\n\nimport type { OtlpHttpTransportOptions } from '../types';\n\nimport { getLogTransforms, getTraceTransforms } from './transform';\nimport type { LogsTransform, TraceTransform } from './transform';\nimport type { ResourceLogs, ResourceSpans } from './transform/types';\nimport type { OtelTransportPayload } from './types';\n\ntype OtelPayloadParams = {\n internalLogger: InternalLogger;\n transportItem?: TransportItem;\n customOtlpTransform?: OtlpHttpTransportOptions['otlpTransform'];\n};\n\nexport class OtelPayload {\n private resourceLogs: ResourceLogs;\n private resourceSpans = [] as ResourceSpans;\n\n private getLogTransforms: LogsTransform;\n private getTraceTransforms: TraceTransform;\n\n private internalLogger: InternalLogger;\n\n constructor({ internalLogger, customOtlpTransform, transportItem }: OtelPayloadParams) {\n this.internalLogger = internalLogger;\n this.resourceLogs = [];\n\n this.getLogTransforms = getLogTransforms(this.internalLogger, customOtlpTransform);\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 }\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 }\n default:\n this.internalLogger?.error(`Unknown TransportItemType: ${type}`);\n break;\n }\n } catch (error) {\n this.internalLogger?.error(error);\n }\n }\n}\n"]}
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.toAttributeValue = toAttributeValue;
|
|
4
4
|
exports.toAttribute = toAttribute;
|
|
5
5
|
exports.isAttribute = isAttribute;
|
|
6
|
-
|
|
6
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
7
7
|
function toAttributeValue(value) {
|
|
8
8
|
if ((0, faro_core_1.isString)(value)) {
|
|
9
9
|
return { stringValue: value };
|
|
@@ -27,10 +27,7 @@ function toAttributeValue(value) {
|
|
|
27
27
|
return {
|
|
28
28
|
kvlistValue: {
|
|
29
29
|
values: Object.entries(value)
|
|
30
|
-
.map(
|
|
31
|
-
var attributeName = _a[0], attributeValue = _a[1];
|
|
32
|
-
return toAttribute(attributeName, attributeValue);
|
|
33
|
-
})
|
|
30
|
+
.map(([attributeName, attributeValue]) => toAttribute(attributeName, attributeValue))
|
|
34
31
|
.filter(isAttribute),
|
|
35
32
|
},
|
|
36
33
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"attributeUtils.js","sourceRoot":"","sources":["../../../../src/payload/attribute/attributeUtils.ts"],"names":[],"mappings":";;AAIA,4CAoCC;AAED,kCASC;AAED,kCAEC;AArDD,
|
|
1
|
+
{"version":3,"file":"attributeUtils.js","sourceRoot":"","sources":["../../../../src/payload/attribute/attributeUtils.ts"],"names":[],"mappings":";;AAIA,4CAoCC;AAED,kCASC;AAED,kCAEC;AArDD,kDAA6F;AAE7F,SAAgB,gBAAgB,CAAC,KAAc;IAC7C,IAAI,IAAA,oBAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC;IAChC,CAAC;IAED,IAAI,IAAA,iBAAK,EAAC,KAAK,CAAC,EAAE,CAAC;QACjB,OAAO,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAC7B,CAAC;IAED,IAAI,IAAA,oBAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO,EAAE,WAAW,EAAE,KAAe,EAAE,CAAC;IAC1C,CAAC;IAED,IAAI,IAAA,qBAAS,EAAC,KAAK,CAAC,EAAE,CAAC;QACrB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI,IAAA,mBAAO,EAAC,KAAK,CAAC,EAAE,CAAC;QACnB,OAAO,EAAE,UAAU,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,EAAE,CAAC;IACjE,CAAC;IAED,IAAI,KAAK,YAAY,UAAU,EAAE,CAAC;QAChC,OAAO,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;IAC/B,CAAC;IAED,IAAI,IAAA,oBAAQ,EAAC,KAAK,CAAC,EAAE,CAAC;QACpB,OAAO;YACL,WAAW,EAAE;gBACX,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;qBAC1B,GAAG,CAAC,CAAC,CAAC,aAAa,EAAE,cAAc,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,aAAa,EAAE,cAAc,CAAC,CAAC;qBACpF,MAAM,CAAC,WAAW,CAAC;aACvB;SACF,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAgB,WAAW,CAAC,aAAqB,EAAE,cAAmB;IACpE,IAAI,cAAc,IAAI,IAAI,IAAI,cAAc,KAAK,EAAE,EAAE,CAAC;QACpD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,OAAO;QACL,GAAG,EAAE,aAAa;QAClB,KAAK,EAAE,gBAAgB,CAAC,cAAc,CAAC;KACxC,CAAC;AACJ,CAAC;AAED,SAAgB,WAAW,CAAC,IAAS;IACnC,OAAO,OAAO,CAAC,IAAI,CAAC,IAAI,OAAO,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,GAAG,CAAA,KAAK,QAAQ,IAAI,OAAO,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAA,KAAK,WAAW,CAAC;AAC9F,CAAC","sourcesContent":["import type { IAnyValue, IKeyValue } from '@opentelemetry/otlp-transformer/build/src/common/internal-types';\n\nimport { isArray, isBoolean, isInt, isNumber, isObject, isString } from '@grafana/faro-core';\n\nexport function toAttributeValue(value: unknown): IAnyValue {\n if (isString(value)) {\n return { stringValue: value };\n }\n\n if (isInt(value)) {\n return { intValue: value };\n }\n\n if (isNumber(value)) {\n return { doubleValue: value as number };\n }\n\n if (isBoolean(value)) {\n return { boolValue: value };\n }\n\n if (isArray(value)) {\n return { arrayValue: { values: value.map(toAttributeValue) } };\n }\n\n if (value instanceof Uint8Array) {\n return { bytesValue: value };\n }\n\n if (isObject(value)) {\n return {\n kvlistValue: {\n values: Object.entries(value)\n .map(([attributeName, attributeValue]) => toAttribute(attributeName, attributeValue))\n .filter(isAttribute),\n },\n };\n }\n\n return {};\n}\n\nexport function toAttribute(attributeName: string, attributeValue: any): IKeyValue | undefined {\n if (attributeValue == null || attributeValue === '') {\n return undefined;\n }\n\n return {\n key: attributeName,\n value: toAttributeValue(attributeValue),\n };\n}\n\nexport function isAttribute(item: any): item is IKeyValue {\n return Boolean(item) && typeof item?.key === 'string' && typeof item?.value !== 'undefined';\n}\n"]}
|
|
@@ -1,36 +1,16 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __assign = (this && this.__assign) || function () {
|
|
3
|
-
__assign = Object.assign || function(t) {
|
|
4
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
-
s = arguments[i];
|
|
6
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
-
t[p] = s[p];
|
|
8
|
-
}
|
|
9
|
-
return t;
|
|
10
|
-
};
|
|
11
|
-
return __assign.apply(this, arguments);
|
|
12
|
-
};
|
|
13
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
14
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
15
|
-
if (ar || !(i in from)) {
|
|
16
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
17
|
-
ar[i] = from[i];
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
21
|
-
};
|
|
22
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
23
3
|
exports.getLogTransforms = getLogTransforms;
|
|
24
4
|
exports.getTraceTransforms = getTraceTransforms;
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
5
|
+
const semantic_conventions_1 = require("@opentelemetry/semantic-conventions");
|
|
6
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
7
|
+
const semconv_1 = require("../../semconv");
|
|
8
|
+
const attribute_1 = require("../attribute");
|
|
29
9
|
function getLogTransforms(internalLogger, customOtlpTransform) {
|
|
30
10
|
function toResourceLog(transportItem) {
|
|
31
|
-
|
|
11
|
+
const resource = toResource(transportItem);
|
|
32
12
|
return {
|
|
33
|
-
resource
|
|
13
|
+
resource,
|
|
34
14
|
scopeLogs: [toScopeLog(transportItem)],
|
|
35
15
|
};
|
|
36
16
|
}
|
|
@@ -44,7 +24,7 @@ function getLogTransforms(internalLogger, customOtlpTransform) {
|
|
|
44
24
|
};
|
|
45
25
|
}
|
|
46
26
|
function toLogRecord(transportItem) {
|
|
47
|
-
|
|
27
|
+
const { type } = transportItem;
|
|
48
28
|
switch (type) {
|
|
49
29
|
case faro_core_1.TransportItemType.LOG:
|
|
50
30
|
return toLogLogRecord(transportItem);
|
|
@@ -55,15 +35,15 @@ function getLogTransforms(internalLogger, customOtlpTransform) {
|
|
|
55
35
|
case faro_core_1.TransportItemType.MEASUREMENT:
|
|
56
36
|
return toMeasurementLogRecord(transportItem);
|
|
57
37
|
default:
|
|
58
|
-
internalLogger === null || internalLogger === void 0 ? void 0 : internalLogger.error(
|
|
38
|
+
internalLogger === null || internalLogger === void 0 ? void 0 : internalLogger.error(`Unknown TransportItemType: ${type}`);
|
|
59
39
|
return {};
|
|
60
40
|
}
|
|
61
41
|
}
|
|
62
42
|
function toLogLogRecord(transportItem) {
|
|
63
43
|
var _a, _b;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
44
|
+
const { meta, payload } = transportItem;
|
|
45
|
+
const timeUnixNano = toTimeUnixNano(payload.timestamp);
|
|
46
|
+
const body = (0, attribute_1.toAttributeValue)(payload.message);
|
|
67
47
|
function getSeverityProperties(logLevel) {
|
|
68
48
|
switch (logLevel) {
|
|
69
49
|
case faro_core_1.LogLevel.TRACE:
|
|
@@ -80,53 +60,56 @@ function getLogTransforms(internalLogger, customOtlpTransform) {
|
|
|
80
60
|
return { severityNumber: 17, severityText: 'ERROR' };
|
|
81
61
|
}
|
|
82
62
|
}
|
|
83
|
-
return
|
|
63
|
+
return Object.assign(Object.assign({ timeUnixNano }, getSeverityProperties(payload.level)), { body, attributes: [...getCommonLogAttributes(meta), (0, attribute_1.toAttribute)('faro.log.context', payload.context)].filter(attribute_1.isAttribute), traceId: (_a = payload.trace) === null || _a === void 0 ? void 0 : _a.trace_id, spanId: (_b = payload.trace) === null || _b === void 0 ? void 0 : _b.span_id });
|
|
84
64
|
}
|
|
85
65
|
function toEventLogRecord(transportItem) {
|
|
86
66
|
var _a, _b;
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
67
|
+
const { meta, payload } = transportItem;
|
|
68
|
+
const timeUnixNano = toTimeUnixNano(payload.timestamp);
|
|
69
|
+
const body = (0, attribute_1.toAttributeValue)(payload.name);
|
|
90
70
|
return {
|
|
91
|
-
timeUnixNano
|
|
92
|
-
body
|
|
93
|
-
attributes:
|
|
71
|
+
timeUnixNano,
|
|
72
|
+
body,
|
|
73
|
+
attributes: [
|
|
74
|
+
...getCommonLogAttributes(meta),
|
|
94
75
|
(0, attribute_1.toAttribute)('event.name', payload.name), // This is a semantic attribute. But event.name constant is currently missing in sematic-conventions npm package
|
|
95
76
|
(0, attribute_1.toAttribute)('event.domain', payload.domain), // This is a semantic attribute. But event.domain constant is currently missing in sematic-conventions npm package
|
|
96
77
|
(0, attribute_1.toAttribute)('event.attributes', payload.attributes),
|
|
97
|
-
]
|
|
78
|
+
].filter(attribute_1.isAttribute),
|
|
98
79
|
traceId: (_a = payload.trace) === null || _a === void 0 ? void 0 : _a.trace_id,
|
|
99
80
|
spanId: (_b = payload.trace) === null || _b === void 0 ? void 0 : _b.span_id,
|
|
100
81
|
};
|
|
101
82
|
}
|
|
102
83
|
function toErrorLogRecord(transportItem) {
|
|
103
84
|
var _a, _b;
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
return
|
|
85
|
+
const { meta, payload } = transportItem;
|
|
86
|
+
const timeUnixNano = toTimeUnixNano(payload.timestamp);
|
|
87
|
+
const body = getCustomLogBody(transportItem, customOtlpTransform === null || customOtlpTransform === void 0 ? void 0 : customOtlpTransform.createErrorLogBody);
|
|
88
|
+
return Object.assign(Object.assign({ timeUnixNano }, (body ? { body } : {})), { attributes: [
|
|
89
|
+
...getCommonLogAttributes(meta),
|
|
108
90
|
(0, attribute_1.toAttribute)(semantic_conventions_1.ATTR_EXCEPTION_TYPE, payload.type),
|
|
109
91
|
(0, attribute_1.toAttribute)(semantic_conventions_1.ATTR_EXCEPTION_MESSAGE, payload.value),
|
|
110
92
|
// toAttribute(SemanticAttributes.EXCEPTION_STACKTRACE, undefined),
|
|
111
93
|
(0, attribute_1.toAttribute)('faro.error.stacktrace', payload.stacktrace),
|
|
112
94
|
(0, attribute_1.toAttribute)('faro.error.context', payload.context),
|
|
113
|
-
]
|
|
95
|
+
].filter(attribute_1.isAttribute), traceId: (_a = payload.trace) === null || _a === void 0 ? void 0 : _a.trace_id, spanId: (_b = payload.trace) === null || _b === void 0 ? void 0 : _b.span_id });
|
|
114
96
|
}
|
|
115
97
|
function toMeasurementLogRecord(transportItem) {
|
|
116
98
|
var _a, _b;
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
return
|
|
99
|
+
const { meta, payload } = transportItem;
|
|
100
|
+
const timeUnixNano = toTimeUnixNano(payload.timestamp);
|
|
101
|
+
const [measurementName, measurementValue] = Object.entries(payload.values).flat();
|
|
102
|
+
const body = getCustomLogBody(transportItem, customOtlpTransform === null || customOtlpTransform === void 0 ? void 0 : customOtlpTransform.createMeasurementLogBody);
|
|
103
|
+
return Object.assign(Object.assign({ timeUnixNano }, (body ? { body } : {})), { attributes: [
|
|
104
|
+
...getCommonLogAttributes(meta),
|
|
122
105
|
(0, attribute_1.toAttribute)('measurement.type', payload.type),
|
|
123
106
|
(0, attribute_1.toAttribute)('measurement.name', measurementName),
|
|
124
107
|
(0, attribute_1.toAttribute)('measurement.value', measurementValue),
|
|
125
108
|
(0, attribute_1.toAttribute)('faro.measurement.context', payload.context),
|
|
126
|
-
]
|
|
109
|
+
].filter(attribute_1.isAttribute), traceId: (_a = payload.trace) === null || _a === void 0 ? void 0 : _a.trace_id, spanId: (_b = payload.trace) === null || _b === void 0 ? void 0 : _b.span_id });
|
|
127
110
|
}
|
|
128
111
|
function getCommonLogAttributes(meta) {
|
|
129
|
-
|
|
112
|
+
const { view, page, session, user } = meta;
|
|
130
113
|
return [
|
|
131
114
|
(0, attribute_1.toAttribute)('view.name', view === null || view === void 0 ? void 0 : view.name),
|
|
132
115
|
(0, attribute_1.toAttribute)(semantic_conventions_1.ATTR_URL_FULL, page === null || page === void 0 ? void 0 : page.url),
|
|
@@ -147,27 +130,27 @@ function getLogTransforms(internalLogger, customOtlpTransform) {
|
|
|
147
130
|
return Date.parse(timestamp) * 1e6;
|
|
148
131
|
}
|
|
149
132
|
return {
|
|
150
|
-
toResourceLog
|
|
151
|
-
toScopeLog
|
|
152
|
-
toLogRecord
|
|
133
|
+
toResourceLog,
|
|
134
|
+
toScopeLog,
|
|
135
|
+
toLogRecord,
|
|
153
136
|
};
|
|
154
137
|
}
|
|
155
138
|
function getTraceTransforms(_internalLogger) {
|
|
156
139
|
function toResourceSpan(transportItem) {
|
|
157
140
|
var _a, _b;
|
|
158
|
-
|
|
159
|
-
|
|
141
|
+
const resource = toResource(transportItem);
|
|
142
|
+
const scopeSpans = (_b = (_a = transportItem.payload.resourceSpans) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.scopeSpans;
|
|
160
143
|
return {
|
|
161
|
-
resource
|
|
144
|
+
resource,
|
|
162
145
|
scopeSpans: scopeSpans !== null && scopeSpans !== void 0 ? scopeSpans : [],
|
|
163
146
|
};
|
|
164
147
|
}
|
|
165
148
|
return {
|
|
166
|
-
toResourceSpan
|
|
149
|
+
toResourceSpan,
|
|
167
150
|
};
|
|
168
151
|
}
|
|
169
152
|
function toResource(transportItem) {
|
|
170
|
-
|
|
153
|
+
const { browser, sdk, app } = transportItem.meta;
|
|
171
154
|
return {
|
|
172
155
|
attributes: [
|
|
173
156
|
(0, attribute_1.toAttribute)(semconv_1.ATTR_BROWSER_MOBILE, browser === null || browser === void 0 ? void 0 : browser.mobile),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../../src/payload/transform/transform.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA0DA,4CAsKC;AAED,gDAcC;AA/OD,4EAW6C;AAE7C,gDAA0E;AAY1E,yCAeuB;AAEvB,0CAA0E;AAe1E,SAAgB,gBAAgB,CAC9B,cAA8B,EAC9B,mBAA+D;IAE/D,SAAS,aAAa,CAAC,aAA+B;QACpD,IAAM,QAAQ,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;QAE3C,OAAO;YACL,QAAQ,UAAA;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,mBAAO;aACjB;YACD,UAAU,EAAE,CAAC,WAAW,CAAC,aAAa,CAAC,CAAC;SACzC,CAAC;IACJ,CAAC;IAED,SAAS,WAAW,CAAC,aAA+B;QAC1C,IAAA,IAAI,GAAK,aAAa,KAAlB,CAAmB;QAE/B,QAAQ,IAAI,EAAE,CAAC;YACb,KAAK,6BAAiB,CAAC,GAAG;gBACxB,OAAO,cAAc,CAAC,aAAwC,CAAC,CAAC;YAClE,KAAK,6BAAiB,CAAC,SAAS;gBAC9B,OAAO,gBAAgB,CAAC,aAA8C,CAAC,CAAC;YAC1E,KAAK,6BAAiB,CAAC,KAAK;gBAC1B,OAAO,gBAAgB,CAAC,aAA0C,CAAC,CAAC;YACtE,KAAK,6BAAiB,CAAC,WAAW;gBAChC,OAAO,sBAAsB,CAAC,aAAgD,CAAC,CAAC;YAClF;gBACE,cAAc,aAAd,cAAc,uBAAd,cAAc,CAAE,KAAK,CAAC,qCAA8B,IAAI,CAAE,CAAC,CAAC;gBAC5D,OAAO,EAAE,CAAC;QACd,CAAC;IACH,CAAC;IAED,SAAS,cAAc,CAAC,aAAsC;;QACpD,IAAA,IAAI,GAAc,aAAa,KAA3B,EAAE,OAAO,GAAK,aAAa,QAAlB,CAAmB;QACxC,IAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvD,IAAM,IAAI,GAAG,IAAA,4BAAgB,EAAC,OAAO,CAAC,OAAO,CAA2B,CAAC;QAEzE,SAAS,qBAAqB,CAAC,QAAkB;YAC/C,QAAQ,QAAQ,EAAE,CAAC;gBACjB,KAAK,oBAAQ,CAAC,KAAK;oBACjB,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;gBACtD,KAAK,oBAAQ,CAAC,KAAK;oBACjB,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;gBACtD,KAAK,oBAAQ,CAAC,IAAI;oBAChB,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;gBACrD,KAAK,oBAAQ,CAAC,GAAG;oBACf,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;gBACvD,KAAK,oBAAQ,CAAC,IAAI;oBAChB,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;gBACtD,KAAK,oBAAQ,CAAC,KAAK;oBACjB,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;YACzD,CAAC;QACH,CAAC;QAED,OAAO,oBACL,YAAY,cAAA,IACT,qBAAqB,CAAC,OAAO,CAAC,KAAK,CAAC,KACvC,IAAI,MAAA,EACJ,UAAU,EAAE,gCAAI,sBAAsB,CAAC,IAAI,CAAC,UAAE,IAAA,uBAAW,EAAC,kBAAkB,EAAE,OAAO,CAAC,OAAO,CAAC,UAAE,MAAM,CACpG,uBAAW,CACZ,EACD,OAAO,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,QAAQ,EAChC,MAAM,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,OAAO,GACtB,CAAC;IACb,CAAC;IAED,SAAS,gBAAgB,CAAC,aAAwC;;QACxD,IAAA,IAAI,GAAc,aAAa,KAA3B,EAAE,OAAO,GAAK,aAAa,QAAlB,CAAmB;QACxC,IAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvD,IAAM,IAAI,GAAG,IAAA,4BAAgB,EAAC,OAAO,CAAC,IAAI,CAA2B,CAAC;QAEtE,OAAO;YACL,YAAY,cAAA;YACZ,IAAI,MAAA;YACJ,UAAU,EAAE,gCACP,sBAAsB,CAAC,IAAI,CAAC;gBAC/B,IAAA,uBAAW,EAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,gHAAgH;gBACzJ,IAAA,uBAAW,EAAC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,kHAAkH;gBAC/J,IAAA,uBAAW,EAAC,kBAAkB,EAAE,OAAO,CAAC,UAAU,CAAC;sBACnD,MAAM,CAAC,uBAAW,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;;QAC5D,IAAA,IAAI,GAAc,aAAa,KAA3B,EAAE,OAAO,GAAK,aAAa,QAAlB,CAAmB;QACxC,IAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACvD,IAAM,IAAI,GAAG,gBAAgB,CAAC,aAAa,EAAE,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,kBAAkB,CAAC,CAAC;QAEtF,OAAO,oBACL,YAAY,cAAA,IACT,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,MAAA,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KACzB,UAAU,EAAE,gCACP,sBAAsB,CAAC,IAAI,CAAC;gBAC/B,IAAA,uBAAW,EAAC,0CAAmB,EAAE,OAAO,CAAC,IAAI,CAAC;gBAC9C,IAAA,uBAAW,EAAC,6CAAsB,EAAE,OAAO,CAAC,KAAK,CAAC;gBAClD,mEAAmE;gBACnE,IAAA,uBAAW,EAAC,uBAAuB,EAAE,OAAO,CAAC,UAAU,CAAC;gBACxD,IAAA,uBAAW,EAAC,oBAAoB,EAAE,OAAO,CAAC,OAAO,CAAC;sBAClD,MAAM,CAAC,uBAAW,CAAC,EACrB,OAAO,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,QAAQ,EAChC,MAAM,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,OAAO,GACtB,CAAC;IACb,CAAC;IAED,SAAS,sBAAsB,CAAC,aAA8C;;QACpE,IAAA,IAAI,GAAc,aAAa,KAA3B,EAAE,OAAO,GAAK,aAAa,QAAlB,CAAmB;QACxC,IAAM,YAAY,GAAG,cAAc,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QACjD,IAAA,KAAsC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAA1E,eAAe,QAAA,EAAE,gBAAgB,QAAyC,CAAC;QAElF,IAAM,IAAI,GAAG,gBAAgB,CAAC,aAAa,EAAE,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,wBAAwB,CAAC,CAAC;QAE5F,OAAO,oBACL,YAAY,cAAA,IACT,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,MAAA,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KACzB,UAAU,EAAE,gCACP,sBAAsB,CAAC,IAAI,CAAC;gBAC/B,IAAA,uBAAW,EAAC,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC;gBAC7C,IAAA,uBAAW,EAAC,kBAAkB,EAAE,eAAe,CAAC;gBAChD,IAAA,uBAAW,EAAC,mBAAmB,EAAE,gBAAgB,CAAC;gBAClD,IAAA,uBAAW,EAAC,0BAA0B,EAAE,OAAO,CAAC,OAAO,CAAC;sBACxD,MAAM,CAAC,uBAAW,CAAC,EACrB,OAAO,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,QAAQ,EAChC,MAAM,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,OAAO,GACtB,CAAC;IACb,CAAC;IAED,SAAS,sBAAsB,CAAC,IAAU;QAChC,IAAA,IAAI,GAA0B,IAAI,KAA9B,EAAE,IAAI,GAAoB,IAAI,KAAxB,EAAE,OAAO,GAAW,IAAI,QAAf,EAAE,IAAI,GAAK,IAAI,KAAT,CAAU;QAE3C,OAAO;YACL,IAAA,uBAAW,EAAC,WAAW,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAC;YACpC,IAAA,uBAAW,EAAC,oCAAa,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,GAAG,CAAC;YACrC,IAAA,uBAAW,EAAC,SAAS,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,EAAE,CAAC;YAChC,IAAA,uBAAW,EAAC,iBAAiB,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,CAAC;YAChD,IAAA,uBAAW,EAAC,yBAAe,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,EAAE,CAAC;YACzC,IAAA,uBAAW,EAAC,oBAAoB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,CAAC;YACtD,IAAA,uBAAW,EAAC,sBAAY,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,EAAE,CAAC;YACnC,IAAA,uBAAW,EAAC,wBAAc,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,CAAC;YAC3C,IAAA,uBAAW,EAAC,yBAAe,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAC;YACzC,IAAA,uBAAW,EAAC,6BAAmB,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,CAAC;YAChD,IAAA,uBAAW,EAAC,yBAAe,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAC;YACzC,IAAA,uBAAW,EAAC,wBAAc,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAC;YACvC,IAAA,uBAAW,EAAC,8BAAoB,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,CAAC;SACpD,CAAC,MAAM,CAAC,uBAAW,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,eAAA;QACb,UAAU,YAAA;QACV,WAAW,aAAA;KACZ,CAAC;AACJ,CAAC;AAED,SAAgB,kBAAkB,CAAC,eAAgC;IACjE,SAAS,cAAc,CAAC,aAAwC;;QAC9D,IAAM,QAAQ,GAAG,UAAU,CAAC,aAAa,CAAC,CAAC;QAC3C,IAAM,UAAU,GAAG,MAAA,MAAA,aAAa,CAAC,OAAO,CAAC,aAAa,0CAAG,CAAC,CAAC,0CAAE,UAAU,CAAC;QAExE,OAAO;YACL,QAAQ,UAAA;YACR,UAAU,EAAE,UAAU,aAAV,UAAU,cAAV,UAAU,GAAI,EAAE;SAC7B,CAAC;IACJ,CAAC;IAED,OAAO;QACL,cAAc,gBAAA;KACf,CAAC;AACJ,CAAC;AAED,SAAS,UAAU,CAAC,aAA4B;IACxC,IAAA,KAAsC,aAAa,CAAC,IAAI,EAAtD,OAAO,aAAA,EAAE,GAAG,SAAA,EAAE,GAAG,SAAqC,CAAC;IAE/D,OAAO;QACL,UAAU,EAAE;YACV,IAAA,uBAAW,EAAC,6BAAmB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAC;YACjD,IAAA,uBAAW,EAAC,+CAAwB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,CAAC;YACzD,IAAA,uBAAW,EAAC,+BAAqB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,CAAC;YACrD,IAAA,uBAAW,EAAC,6BAAmB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAC;YACjD,IAAA,uBAAW,EAAC,+BAAqB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,EAAE,CAAC;YAC/C,IAAA,uBAAW,EAAC,cAAc,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,CAAC;YAC1C,IAAA,uBAAW,EAAC,iBAAiB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC;YAChD,IAAA,uBAAW,EAAC,sBAAsB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,CAAC;YAC3D,IAAA,uBAAW,EAAC,uBAAuB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,CAAC;YAE7D,IAAA,uBAAW,EAAC,8CAAuB,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,CAAC;YAC/C,IAAA,uBAAW,EAAC,iDAA0B,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,CAAC;YACrD,GAAG,CAAC,CAAC,CAAC,IAAA,uBAAW,EAAC,kDAA2B,EAAE,yDAAkC,CAAC,CAAC,CAAC,CAAC,SAAS;YAE9F,IAAA,uBAAW,EAAC,wCAAiB,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,CAAC;YACzC,IAAA,uBAAW,EAAC,2CAAoB,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,CAAC;YAC/C,IAAA,uBAAW,EAAC,gCAAsB,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,SAAS,CAAC;YACnD,IAAA,uBAAW,EAAC,0CAAgC,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,WAAW,CAAC;SAChE,CAAC,MAAM,CAAC,uBAAW,CAAC;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,aAAgB,EAChB,mBAAyC;IAEzC,OAAO,OAAO,mBAAmB,KAAK,UAAU;QAC9C,CAAC,CAAE,IAAA,4BAAgB,EAAC,mBAAmB,CAAC,aAAa,CAAC,CAA4B;QAClF,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC","sourcesContent":["import type { IKeyValue } from '@opentelemetry/otlp-transformer/build/src/common/internal-types';\nimport {\n ATTR_EXCEPTION_MESSAGE,\n ATTR_EXCEPTION_TYPE,\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n ATTR_TELEMETRY_SDK_LANGUAGE,\n ATTR_TELEMETRY_SDK_NAME,\n ATTR_TELEMETRY_SDK_VERSION,\n ATTR_URL_FULL,\n ATTR_USER_AGENT_ORIGINAL,\n TELEMETRY_SDK_LANGUAGE_VALUE_WEBJS,\n} from '@opentelemetry/semantic-conventions';\n\nimport { LogLevel, TransportItemType, VERSION } from '@grafana/faro-core';\nimport type {\n EventEvent,\n ExceptionEvent,\n InternalLogger,\n LogEvent,\n MeasurementEvent,\n Meta,\n TraceEvent,\n TransportItem,\n} from '@grafana/faro-core';\n\nimport {\n ATTR_BROWSER_BRANDS,\n ATTR_BROWSER_LANGUAGE,\n ATTR_BROWSER_MOBILE,\n ATTR_BROWSER_PLATFORM,\n ATTR_DEPLOYMENT_ENVIRONMENT_NAME,\n ATTR_SERVICE_NAMESPACE,\n ATTR_SESSION_ID,\n ATTR_USER_ATTRIBUTES,\n ATTR_USER_EMAIL,\n ATTR_USER_FULL_NAME,\n ATTR_USER_HASH,\n ATTR_USER_ID,\n ATTR_USER_NAME,\n ATTR_USER_ROLES,\n} from '../../semconv';\nimport type { OtlpHttpTransportOptions } from '../../types';\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 StringValueNonNullable,\n TraceTransform,\n} from './types';\n\nexport function getLogTransforms(\n internalLogger: InternalLogger,\n customOtlpTransform?: OtlpHttpTransportOptions['otlpTransform']\n): 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 StringValueNonNullable;\n\n function getSeverityProperties(logLevel: LogLevel) {\n switch (logLevel) {\n case LogLevel.TRACE:\n return { severityNumber: 1, severityText: 'TRACE' };\n case LogLevel.DEBUG:\n return { severityNumber: 5, severityText: 'DEBUG' };\n case LogLevel.INFO:\n return { severityNumber: 9, severityText: 'INFO' };\n case LogLevel.LOG:\n return { severityNumber: 10, severityText: 'INFO2' };\n case LogLevel.WARN:\n return { severityNumber: 13, severityText: 'WARN' };\n case LogLevel.ERROR:\n return { severityNumber: 17, severityText: 'ERROR' };\n }\n }\n\n return {\n timeUnixNano,\n ...getSeverityProperties(payload.level),\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 StringValueNonNullable;\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 const body = getCustomLogBody(transportItem, customOtlpTransform?.createErrorLogBody);\n\n return {\n timeUnixNano,\n ...(body ? { body } : {}),\n attributes: [\n ...getCommonLogAttributes(meta),\n toAttribute(ATTR_EXCEPTION_TYPE, payload.type),\n toAttribute(ATTR_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 const body = getCustomLogBody(transportItem, customOtlpTransform?.createMeasurementLogBody);\n\n return {\n timeUnixNano,\n ...(body ? { body } : {}),\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(ATTR_URL_FULL, page?.url),\n toAttribute('page.id', page?.id),\n toAttribute('page.attributes', page?.attributes),\n toAttribute(ATTR_SESSION_ID, session?.id),\n toAttribute('session.attributes', session?.attributes),\n toAttribute(ATTR_USER_ID, user?.id),\n toAttribute(ATTR_USER_NAME, user?.username),\n toAttribute(ATTR_USER_EMAIL, user?.email),\n toAttribute(ATTR_USER_FULL_NAME, user?.fullName),\n toAttribute(ATTR_USER_ROLES, user?.roles),\n toAttribute(ATTR_USER_HASH, user?.hash),\n toAttribute(ATTR_USER_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(ATTR_BROWSER_MOBILE, browser?.mobile),\n toAttribute(ATTR_USER_AGENT_ORIGINAL, browser?.userAgent),\n toAttribute(ATTR_BROWSER_LANGUAGE, browser?.language),\n toAttribute(ATTR_BROWSER_BRANDS, browser?.brands),\n toAttribute(ATTR_BROWSER_PLATFORM, browser?.os),\n toAttribute('browser.name', browser?.name),\n toAttribute('browser.version', browser?.version),\n toAttribute('browser.screen_width', browser?.viewportWidth),\n toAttribute('browser.screen_height', browser?.viewportHeight),\n\n toAttribute(ATTR_TELEMETRY_SDK_NAME, sdk?.name),\n toAttribute(ATTR_TELEMETRY_SDK_VERSION, sdk?.version),\n sdk ? toAttribute(ATTR_TELEMETRY_SDK_LANGUAGE, TELEMETRY_SDK_LANGUAGE_VALUE_WEBJS) : undefined,\n\n toAttribute(ATTR_SERVICE_NAME, app?.name),\n toAttribute(ATTR_SERVICE_VERSION, app?.version),\n toAttribute(ATTR_SERVICE_NAMESPACE, app?.namespace),\n toAttribute(ATTR_DEPLOYMENT_ENVIRONMENT_NAME, app?.environment),\n ].filter(isAttribute),\n };\n}\n\nfunction getCustomLogBody<T>(\n transportItem: T,\n createCustomLogBody?: (item: T) => string\n): StringValueNonNullable | undefined {\n return typeof createCustomLogBody === 'function'\n ? (toAttributeValue(createCustomLogBody(transportItem)) as StringValueNonNullable)\n : undefined;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"transform.js","sourceRoot":"","sources":["../../../../src/payload/transform/transform.ts"],"names":[],"mappings":";;AA0DA,4CAsKC;AAED,gDAcC;AA/OD,8EAW6C;AAE7C,kDAA0E;AAY1E,2CAeuB;AAEvB,4CAA0E;AAe1E,SAAgB,gBAAgB,CAC9B,cAA8B,EAC9B,mBAA+D;IAE/D,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,mBAAO;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,CAAC;YACb,KAAK,6BAAiB,CAAC,GAAG;gBACxB,OAAO,cAAc,CAAC,aAAwC,CAAC,CAAC;YAClE,KAAK,6BAAiB,CAAC,SAAS;gBAC9B,OAAO,gBAAgB,CAAC,aAA8C,CAAC,CAAC;YAC1E,KAAK,6BAAiB,CAAC,KAAK;gBAC1B,OAAO,gBAAgB,CAAC,aAA0C,CAAC,CAAC;YACtE,KAAK,6BAAiB,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;QACd,CAAC;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,IAAA,4BAAgB,EAAC,OAAO,CAAC,OAAO,CAA2B,CAAC;QAEzE,SAAS,qBAAqB,CAAC,QAAkB;YAC/C,QAAQ,QAAQ,EAAE,CAAC;gBACjB,KAAK,oBAAQ,CAAC,KAAK;oBACjB,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;gBACtD,KAAK,oBAAQ,CAAC,KAAK;oBACjB,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;gBACtD,KAAK,oBAAQ,CAAC,IAAI;oBAChB,OAAO,EAAE,cAAc,EAAE,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;gBACrD,KAAK,oBAAQ,CAAC,GAAG;oBACf,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;gBACvD,KAAK,oBAAQ,CAAC,IAAI;oBAChB,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,YAAY,EAAE,MAAM,EAAE,CAAC;gBACtD,KAAK,oBAAQ,CAAC,KAAK;oBACjB,OAAO,EAAE,cAAc,EAAE,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,CAAC;YACzD,CAAC;QACH,CAAC;QAED,OAAO,8BACL,YAAY,IACT,qBAAqB,CAAC,OAAO,CAAC,KAAK,CAAC,KACvC,IAAI,EACJ,UAAU,EAAE,CAAC,GAAG,sBAAsB,CAAC,IAAI,CAAC,EAAE,IAAA,uBAAW,EAAC,kBAAkB,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CACpG,uBAAW,CACZ,EACD,OAAO,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,QAAQ,EAChC,MAAM,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,OAAO,GACtB,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,IAAA,4BAAgB,EAAC,OAAO,CAAC,IAAI,CAA2B,CAAC;QAEtE,OAAO;YACL,YAAY;YACZ,IAAI;YACJ,UAAU,EAAE;gBACV,GAAG,sBAAsB,CAAC,IAAI,CAAC;gBAC/B,IAAA,uBAAW,EAAC,YAAY,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,gHAAgH;gBACzJ,IAAA,uBAAW,EAAC,cAAc,EAAE,OAAO,CAAC,MAAM,CAAC,EAAE,kHAAkH;gBAC/J,IAAA,uBAAW,EAAC,kBAAkB,EAAE,OAAO,CAAC,UAAU,CAAC;aACpD,CAAC,MAAM,CAAC,uBAAW,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;QACvD,MAAM,IAAI,GAAG,gBAAgB,CAAC,aAAa,EAAE,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,kBAAkB,CAAC,CAAC;QAEtF,OAAO,8BACL,YAAY,IACT,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KACzB,UAAU,EAAE;gBACV,GAAG,sBAAsB,CAAC,IAAI,CAAC;gBAC/B,IAAA,uBAAW,EAAC,0CAAmB,EAAE,OAAO,CAAC,IAAI,CAAC;gBAC9C,IAAA,uBAAW,EAAC,6CAAsB,EAAE,OAAO,CAAC,KAAK,CAAC;gBAClD,mEAAmE;gBACnE,IAAA,uBAAW,EAAC,uBAAuB,EAAE,OAAO,CAAC,UAAU,CAAC;gBACxD,IAAA,uBAAW,EAAC,oBAAoB,EAAE,OAAO,CAAC,OAAO,CAAC;aACnD,CAAC,MAAM,CAAC,uBAAW,CAAC,EACrB,OAAO,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,QAAQ,EAChC,MAAM,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,OAAO,GACtB,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,MAAM,IAAI,GAAG,gBAAgB,CAAC,aAAa,EAAE,mBAAmB,aAAnB,mBAAmB,uBAAnB,mBAAmB,CAAE,wBAAwB,CAAC,CAAC;QAE5F,OAAO,8BACL,YAAY,IACT,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KACzB,UAAU,EAAE;gBACV,GAAG,sBAAsB,CAAC,IAAI,CAAC;gBAC/B,IAAA,uBAAW,EAAC,kBAAkB,EAAE,OAAO,CAAC,IAAI,CAAC;gBAC7C,IAAA,uBAAW,EAAC,kBAAkB,EAAE,eAAe,CAAC;gBAChD,IAAA,uBAAW,EAAC,mBAAmB,EAAE,gBAAgB,CAAC;gBAClD,IAAA,uBAAW,EAAC,0BAA0B,EAAE,OAAO,CAAC,OAAO,CAAC;aACzD,CAAC,MAAM,CAAC,uBAAW,CAAC,EACrB,OAAO,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,QAAQ,EAChC,MAAM,EAAE,MAAA,OAAO,CAAC,KAAK,0CAAE,OAAO,GACtB,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,IAAA,uBAAW,EAAC,WAAW,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAC;YACpC,IAAA,uBAAW,EAAC,oCAAa,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,GAAG,CAAC;YACrC,IAAA,uBAAW,EAAC,SAAS,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,EAAE,CAAC;YAChC,IAAA,uBAAW,EAAC,iBAAiB,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,CAAC;YAChD,IAAA,uBAAW,EAAC,yBAAe,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,EAAE,CAAC;YACzC,IAAA,uBAAW,EAAC,oBAAoB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,UAAU,CAAC;YACtD,IAAA,uBAAW,EAAC,sBAAY,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,EAAE,CAAC;YACnC,IAAA,uBAAW,EAAC,wBAAc,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,CAAC;YAC3C,IAAA,uBAAW,EAAC,yBAAe,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAC;YACzC,IAAA,uBAAW,EAAC,6BAAmB,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,QAAQ,CAAC;YAChD,IAAA,uBAAW,EAAC,yBAAe,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,KAAK,CAAC;YACzC,IAAA,uBAAW,EAAC,wBAAc,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,CAAC;YACvC,IAAA,uBAAW,EAAC,8BAAoB,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,UAAU,CAAC;SACpD,CAAC,MAAM,CAAC,uBAAW,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,SAAgB,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,IAAA,uBAAW,EAAC,6BAAmB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAC;YACjD,IAAA,uBAAW,EAAC,+CAAwB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,SAAS,CAAC;YACzD,IAAA,uBAAW,EAAC,+BAAqB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,QAAQ,CAAC;YACrD,IAAA,uBAAW,EAAC,6BAAmB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,CAAC;YACjD,IAAA,uBAAW,EAAC,+BAAqB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,EAAE,CAAC;YAC/C,IAAA,uBAAW,EAAC,cAAc,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,IAAI,CAAC;YAC1C,IAAA,uBAAW,EAAC,iBAAiB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,CAAC;YAChD,IAAA,uBAAW,EAAC,sBAAsB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,aAAa,CAAC;YAC3D,IAAA,uBAAW,EAAC,uBAAuB,EAAE,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,cAAc,CAAC;YAE7D,IAAA,uBAAW,EAAC,8CAAuB,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,CAAC;YAC/C,IAAA,uBAAW,EAAC,iDAA0B,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,CAAC;YACrD,GAAG,CAAC,CAAC,CAAC,IAAA,uBAAW,EAAC,kDAA2B,EAAE,yDAAkC,CAAC,CAAC,CAAC,CAAC,SAAS;YAE9F,IAAA,uBAAW,EAAC,wCAAiB,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,IAAI,CAAC;YACzC,IAAA,uBAAW,EAAC,2CAAoB,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,OAAO,CAAC;YAC/C,IAAA,uBAAW,EAAC,gCAAsB,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,SAAS,CAAC;YACnD,IAAA,uBAAW,EAAC,0CAAgC,EAAE,GAAG,aAAH,GAAG,uBAAH,GAAG,CAAE,WAAW,CAAC;SAChE,CAAC,MAAM,CAAC,uBAAW,CAAC;KACtB,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,aAAgB,EAChB,mBAAyC;IAEzC,OAAO,OAAO,mBAAmB,KAAK,UAAU;QAC9C,CAAC,CAAE,IAAA,4BAAgB,EAAC,mBAAmB,CAAC,aAAa,CAAC,CAA4B;QAClF,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC","sourcesContent":["import type { IKeyValue } from '@opentelemetry/otlp-transformer/build/src/common/internal-types';\nimport {\n ATTR_EXCEPTION_MESSAGE,\n ATTR_EXCEPTION_TYPE,\n ATTR_SERVICE_NAME,\n ATTR_SERVICE_VERSION,\n ATTR_TELEMETRY_SDK_LANGUAGE,\n ATTR_TELEMETRY_SDK_NAME,\n ATTR_TELEMETRY_SDK_VERSION,\n ATTR_URL_FULL,\n ATTR_USER_AGENT_ORIGINAL,\n TELEMETRY_SDK_LANGUAGE_VALUE_WEBJS,\n} from '@opentelemetry/semantic-conventions';\n\nimport { LogLevel, TransportItemType, VERSION } from '@grafana/faro-core';\nimport type {\n EventEvent,\n ExceptionEvent,\n InternalLogger,\n LogEvent,\n MeasurementEvent,\n Meta,\n TraceEvent,\n TransportItem,\n} from '@grafana/faro-core';\n\nimport {\n ATTR_BROWSER_BRANDS,\n ATTR_BROWSER_LANGUAGE,\n ATTR_BROWSER_MOBILE,\n ATTR_BROWSER_PLATFORM,\n ATTR_DEPLOYMENT_ENVIRONMENT_NAME,\n ATTR_SERVICE_NAMESPACE,\n ATTR_SESSION_ID,\n ATTR_USER_ATTRIBUTES,\n ATTR_USER_EMAIL,\n ATTR_USER_FULL_NAME,\n ATTR_USER_HASH,\n ATTR_USER_ID,\n ATTR_USER_NAME,\n ATTR_USER_ROLES,\n} from '../../semconv';\nimport type { OtlpHttpTransportOptions } from '../../types';\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 StringValueNonNullable,\n TraceTransform,\n} from './types';\n\nexport function getLogTransforms(\n internalLogger: InternalLogger,\n customOtlpTransform?: OtlpHttpTransportOptions['otlpTransform']\n): 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 StringValueNonNullable;\n\n function getSeverityProperties(logLevel: LogLevel) {\n switch (logLevel) {\n case LogLevel.TRACE:\n return { severityNumber: 1, severityText: 'TRACE' };\n case LogLevel.DEBUG:\n return { severityNumber: 5, severityText: 'DEBUG' };\n case LogLevel.INFO:\n return { severityNumber: 9, severityText: 'INFO' };\n case LogLevel.LOG:\n return { severityNumber: 10, severityText: 'INFO2' };\n case LogLevel.WARN:\n return { severityNumber: 13, severityText: 'WARN' };\n case LogLevel.ERROR:\n return { severityNumber: 17, severityText: 'ERROR' };\n }\n }\n\n return {\n timeUnixNano,\n ...getSeverityProperties(payload.level),\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 StringValueNonNullable;\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 const body = getCustomLogBody(transportItem, customOtlpTransform?.createErrorLogBody);\n\n return {\n timeUnixNano,\n ...(body ? { body } : {}),\n attributes: [\n ...getCommonLogAttributes(meta),\n toAttribute(ATTR_EXCEPTION_TYPE, payload.type),\n toAttribute(ATTR_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 const body = getCustomLogBody(transportItem, customOtlpTransform?.createMeasurementLogBody);\n\n return {\n timeUnixNano,\n ...(body ? { body } : {}),\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(ATTR_URL_FULL, page?.url),\n toAttribute('page.id', page?.id),\n toAttribute('page.attributes', page?.attributes),\n toAttribute(ATTR_SESSION_ID, session?.id),\n toAttribute('session.attributes', session?.attributes),\n toAttribute(ATTR_USER_ID, user?.id),\n toAttribute(ATTR_USER_NAME, user?.username),\n toAttribute(ATTR_USER_EMAIL, user?.email),\n toAttribute(ATTR_USER_FULL_NAME, user?.fullName),\n toAttribute(ATTR_USER_ROLES, user?.roles),\n toAttribute(ATTR_USER_HASH, user?.hash),\n toAttribute(ATTR_USER_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(ATTR_BROWSER_MOBILE, browser?.mobile),\n toAttribute(ATTR_USER_AGENT_ORIGINAL, browser?.userAgent),\n toAttribute(ATTR_BROWSER_LANGUAGE, browser?.language),\n toAttribute(ATTR_BROWSER_BRANDS, browser?.brands),\n toAttribute(ATTR_BROWSER_PLATFORM, browser?.os),\n toAttribute('browser.name', browser?.name),\n toAttribute('browser.version', browser?.version),\n toAttribute('browser.screen_width', browser?.viewportWidth),\n toAttribute('browser.screen_height', browser?.viewportHeight),\n\n toAttribute(ATTR_TELEMETRY_SDK_NAME, sdk?.name),\n toAttribute(ATTR_TELEMETRY_SDK_VERSION, sdk?.version),\n sdk ? toAttribute(ATTR_TELEMETRY_SDK_LANGUAGE, TELEMETRY_SDK_LANGUAGE_VALUE_WEBJS) : undefined,\n\n toAttribute(ATTR_SERVICE_NAME, app?.name),\n toAttribute(ATTR_SERVICE_VERSION, app?.version),\n toAttribute(ATTR_SERVICE_NAMESPACE, app?.namespace),\n toAttribute(ATTR_DEPLOYMENT_ENVIRONMENT_NAME, app?.environment),\n ].filter(isAttribute),\n };\n}\n\nfunction getCustomLogBody<T>(\n transportItem: T,\n createCustomLogBody?: (item: T) => string\n): StringValueNonNullable | undefined {\n return typeof createCustomLogBody === 'function'\n ? (toAttributeValue(createCustomLogBody(transportItem)) as StringValueNonNullable)\n : undefined;\n}\n"]}
|
package/dist/cjs/transport.js
CHANGED
|
@@ -1,29 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
if (typeof b !== "function" && b !== null)
|
|
11
|
-
throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
|
|
12
|
-
extendStatics(d, b);
|
|
13
|
-
function __() { this.constructor = d; }
|
|
14
|
-
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
15
|
-
};
|
|
16
|
-
})();
|
|
17
|
-
var __assign = (this && this.__assign) || function () {
|
|
18
|
-
__assign = Object.assign || function(t) {
|
|
19
|
-
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
20
|
-
s = arguments[i];
|
|
21
|
-
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
22
|
-
t[p] = s[p];
|
|
23
|
-
}
|
|
24
|
-
return t;
|
|
25
|
-
};
|
|
26
|
-
return __assign.apply(this, arguments);
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
27
10
|
};
|
|
28
11
|
var __rest = (this && this.__rest) || function (s, e) {
|
|
29
12
|
var t = {};
|
|
@@ -38,133 +21,124 @@ var __rest = (this && this.__rest) || function (s, e) {
|
|
|
38
21
|
};
|
|
39
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
23
|
exports.OtlpHttpTransport = void 0;
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
function OtlpHttpTransport(options) {
|
|
24
|
+
const faro_core_1 = require("@grafana/faro-core");
|
|
25
|
+
const payload_1 = require("./payload");
|
|
26
|
+
const DEFAULT_BUFFER_SIZE = 30;
|
|
27
|
+
const DEFAULT_CONCURRENCY = 5; // chrome supports 10 total, firefox 17
|
|
28
|
+
const DEFAULT_RATE_LIMIT_BACKOFF_MS = 5000;
|
|
29
|
+
const BEACON_BODY_SIZE_LIMIT = 60000;
|
|
30
|
+
const TOO_MANY_REQUESTS = 429;
|
|
31
|
+
class OtlpHttpTransport extends faro_core_1.BaseTransport {
|
|
32
|
+
constructor(options) {
|
|
51
33
|
var _a, _b, _c;
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
34
|
+
super();
|
|
35
|
+
this.options = options;
|
|
36
|
+
this.name = '@grafana/faro-web-sdk:transport-otlp-http';
|
|
37
|
+
this.version = faro_core_1.VERSION;
|
|
38
|
+
this.sendingTracesDisabledUntil = new Date();
|
|
39
|
+
this.sendingLogsDisabledUntil = new Date();
|
|
40
|
+
this.rateLimitBackoffMs = (_a = options.defaultRateLimitBackoffMs) !== null && _a !== void 0 ? _a : DEFAULT_RATE_LIMIT_BACKOFF_MS;
|
|
41
|
+
this.promiseBuffer = (0, faro_core_1.createPromiseBuffer)({
|
|
60
42
|
size: (_b = options === null || options === void 0 ? void 0 : options.bufferSize) !== null && _b !== void 0 ? _b : DEFAULT_BUFFER_SIZE,
|
|
61
43
|
concurrency: (_c = options === null || options === void 0 ? void 0 : options.concurrency) !== null && _c !== void 0 ? _c : DEFAULT_CONCURRENCY,
|
|
62
44
|
});
|
|
63
|
-
return _this;
|
|
64
45
|
}
|
|
65
|
-
|
|
46
|
+
getIgnoreUrls() {
|
|
66
47
|
var _a;
|
|
67
|
-
|
|
48
|
+
const { tracesURL = '', logsURL = '' } = this.options;
|
|
68
49
|
return [tracesURL, logsURL].filter(Boolean).concat((_a = this.config.ignoreUrls) !== null && _a !== void 0 ? _a : []);
|
|
69
|
-
}
|
|
70
|
-
|
|
50
|
+
}
|
|
51
|
+
isBatched() {
|
|
71
52
|
return true;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
53
|
+
}
|
|
54
|
+
send(items) {
|
|
55
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
56
|
+
const otelPayload = new payload_1.OtelPayload({
|
|
57
|
+
internalLogger: this.internalLogger,
|
|
58
|
+
customOtlpTransform: this.options.otlpTransform,
|
|
59
|
+
});
|
|
60
|
+
items.forEach((item) => otelPayload.addResourceItem(item));
|
|
61
|
+
yield this.sendPayload(otelPayload.getPayload());
|
|
77
62
|
});
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
for (var _k = 0, _l = Object.entries(headers); _k < _l.length; _k++) {
|
|
121
|
-
var _m = _l[_k], key_1 = _m[0], value_1 = _m[1];
|
|
122
|
-
resolvedHeaders[key_1] = typeof value_1 === 'function' ? value_1() : value_1;
|
|
123
|
-
}
|
|
124
|
-
this_1.promiseBuffer.add(function () {
|
|
125
|
-
return fetch(url, __assign({ method: 'POST', headers: __assign(__assign({ 'Content-Type': 'application/json' }, resolvedHeaders), (apiKey ? { 'x-api-key': apiKey } : {})), body: body, keepalive: body.length <= BEACON_BODY_SIZE_LIMIT }, (restOfRequestOptions !== null && restOfRequestOptions !== void 0 ? restOfRequestOptions : {})))
|
|
126
|
-
.then(function (response) {
|
|
127
|
-
if (response.status === TOO_MANY_REQUESTS) {
|
|
128
|
-
updateDisabledUntil(_this.getRetryAfterDate(response));
|
|
129
|
-
_this.logWarn("Too many requests, backing off until ".concat(disabledUntil));
|
|
63
|
+
}
|
|
64
|
+
sendPayload(payload) {
|
|
65
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
66
|
+
try {
|
|
67
|
+
const { tracesURL = '', logsURL = '' } = this.options;
|
|
68
|
+
for (const [key, value] of Object.entries(payload)) {
|
|
69
|
+
if (!((0, faro_core_1.isArray)(value) && value.length > 0)) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
let disabledUntil;
|
|
73
|
+
let updateDisabledUntil = (_) => { };
|
|
74
|
+
let url = '';
|
|
75
|
+
switch (key) {
|
|
76
|
+
case 'resourceSpans':
|
|
77
|
+
url = tracesURL;
|
|
78
|
+
disabledUntil = this.sendingTracesDisabledUntil;
|
|
79
|
+
updateDisabledUntil = (retryAfterDate) => {
|
|
80
|
+
this.sendingTracesDisabledUntil = retryAfterDate;
|
|
81
|
+
};
|
|
82
|
+
break;
|
|
83
|
+
case 'resourceLogs':
|
|
84
|
+
url = logsURL;
|
|
85
|
+
disabledUntil = this.sendingLogsDisabledUntil;
|
|
86
|
+
updateDisabledUntil = (retryAfterDate) => {
|
|
87
|
+
this.sendingLogsDisabledUntil = retryAfterDate;
|
|
88
|
+
};
|
|
89
|
+
break;
|
|
90
|
+
}
|
|
91
|
+
if (disabledUntil && disabledUntil > new Date(Date.now())) {
|
|
92
|
+
this.logWarn(`Dropping transport item due to too many requests. Backoff until ${disabledUntil}`);
|
|
93
|
+
return undefined;
|
|
94
|
+
}
|
|
95
|
+
const body = JSON.stringify({ [key]: value });
|
|
96
|
+
const { requestOptions, apiKey } = this.options;
|
|
97
|
+
const _a = requestOptions !== null && requestOptions !== void 0 ? requestOptions : {}, { headers = {} } = _a, restOfRequestOptions = __rest(_a, ["headers"]);
|
|
98
|
+
if (!url) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
yield this.promiseBuffer.add(() => __awaiter(this, void 0, void 0, function* () {
|
|
102
|
+
const resolvedHeaders = {};
|
|
103
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
104
|
+
resolvedHeaders[key] = typeof value === 'function' ? yield Promise.resolve(value()) : value;
|
|
130
105
|
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
106
|
+
return fetch(url, Object.assign({ method: 'POST', headers: Object.assign(Object.assign({ 'Content-Type': 'application/json' }, resolvedHeaders), (apiKey ? { 'x-api-key': apiKey } : {})), body, keepalive: body.length <= BEACON_BODY_SIZE_LIMIT }, (restOfRequestOptions !== null && restOfRequestOptions !== void 0 ? restOfRequestOptions : {})))
|
|
107
|
+
.then((response) => {
|
|
108
|
+
if (response.status === TOO_MANY_REQUESTS) {
|
|
109
|
+
updateDisabledUntil(this.getRetryAfterDate(response));
|
|
110
|
+
this.logWarn(`Too many requests, backing off until ${disabledUntil}`);
|
|
111
|
+
}
|
|
112
|
+
// read the body so the connection can be closed
|
|
113
|
+
response.text().catch(faro_core_1.noop);
|
|
114
|
+
return response;
|
|
115
|
+
})
|
|
116
|
+
.catch((error) => {
|
|
117
|
+
this.logError('Failed sending payload to the receiver\n', JSON.parse(body), error);
|
|
118
|
+
});
|
|
119
|
+
}));
|
|
120
|
+
}
|
|
146
121
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
122
|
+
catch (error) {
|
|
123
|
+
this.logError(error);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
getRetryAfterDate(response) {
|
|
128
|
+
const now = Date.now();
|
|
129
|
+
const retryAfterHeader = response.headers.get('Retry-After');
|
|
155
130
|
if (retryAfterHeader) {
|
|
156
|
-
|
|
131
|
+
const delay = Number(retryAfterHeader);
|
|
157
132
|
if (!isNaN(delay)) {
|
|
158
133
|
return new Date(delay * 1000 + now);
|
|
159
134
|
}
|
|
160
|
-
|
|
135
|
+
const date = Date.parse(retryAfterHeader);
|
|
161
136
|
if (!isNaN(date)) {
|
|
162
137
|
return new Date(date);
|
|
163
138
|
}
|
|
164
139
|
}
|
|
165
140
|
return new Date(now + this.rateLimitBackoffMs);
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
}(faro_core_1.BaseTransport));
|
|
141
|
+
}
|
|
142
|
+
}
|
|
169
143
|
exports.OtlpHttpTransport = OtlpHttpTransport;
|
|
170
144
|
//# sourceMappingURL=transport.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseTransport, createPromiseBuffer, isArray, noop, VERSION } from '@grafana/faro-core';\nimport type { Patterns, PromiseBuffer, TransportItem } from '@grafana/faro-core';\n\nimport { OtelPayload } from './payload';\nimport type { 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\nconst BEACON_BODY_SIZE_LIMIT = 60000;\nconst TOO_MANY_REQUESTS = 429;\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(): Patterns {\n const { tracesURL = '', logsURL = '' } = this.options;\n return ([tracesURL, logsURL].filter(Boolean) as Patterns).concat(this.config.ignoreUrls ?? []);\n }\n\n override isBatched(): boolean {\n return true;\n }\n\n async send(items: TransportItem[]): Promise<void> {\n const otelPayload = new OtelPayload({\n internalLogger: this.internalLogger,\n customOtlpTransform: this.options.otlpTransform,\n });\n\n items.forEach((item) => otelPayload.addResourceItem(item));\n await this.sendPayload(otelPayload.getPayload());\n }\n\n private async sendPayload(payload: OtelTransportPayload): Promise<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 if (!url) {\n continue;\n }\n\n await this.promiseBuffer.add(async () => {\n const resolvedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n resolvedHeaders[key] = typeof value === 'function' ? await Promise.resolve(value()) : value;\n }\n\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...resolvedHeaders,\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body,\n keepalive: body.length <= BEACON_BODY_SIZE_LIMIT,\n ...(restOfRequestOptions ?? {}),\n })\n .then((response) => {\n if (response.status === TOO_MANY_REQUESTS) {\n updateDisabledUntil(this.getRetryAfterDate(response));\n this.logWarn(`Too many requests, backing off until ${disabledUntil}`);\n }\n\n // read the body so the connection can be closed\n response.text().catch(noop);\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"]}
|
package/dist/cjs/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ExceptionEvent, MeasurementEvent, TransportItem } from '@grafana/faro-core';\n\nexport interface OtlpTransportRequestOptions extends Omit<RequestInit, 'body' | 'headers'> {\n /**\n * Headers to include in every request.\n * Each value can be:\n * - a string (static value)\n * - a function returning a string (dynamic value)\n */\n headers?: Record<string, string | (() => string)>;\n}\n\nexport interface OtlpHttpTransportOptions {\n // will be added as `x-api-key` header\n apiKey?: string;\n\n // how many requests to buffer in total\n bufferSize?: number;\n\n // how many requests to execute concurrently\n concurrency?: number;\n\n // if rate limit response does not include a Retry-After header,\n // how many milliseconds to back off before attempting a request.\n // intermediate events will be dropped, not buffered\n defaultRateLimitBackoffMs?: number;\n\n // addition options for global.Fetch\n requestOptions?: OtlpTransportRequestOptions;\n\n // The Otel spec defines separate endpoints per signal\n readonly tracesURL?: string;\n readonly logsURL?: string;\n\n // customize aspects about logs transformation\n otlpTransform?: {\n // Body field is optional in Otel Log spec, but can cause issues with Otel Collector components.\n // By default Faro does not send a body for logs of type error and measurement.\n // Users can define a body string by using the following functions.\n createErrorLogBody?: (item: TransportItem<ExceptionEvent>) => string;\n createMeasurementLogBody?: (item: TransportItem<MeasurementEvent>) => string;\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ExceptionEvent, MeasurementEvent, TransportItem } from '@grafana/faro-core';\n\nexport interface OtlpTransportRequestOptions extends Omit<RequestInit, 'body' | 'headers'> {\n /**\n * Headers to include in every request.\n * Each value can be:\n * - a string (static value)\n * - a function returning a string (dynamic value)\n * - a function returning a Promise of string (dynamic value, async)\n */\n headers?: Record<string, string | (() => string | Promise<string>)>;\n}\n\nexport interface OtlpHttpTransportOptions {\n // will be added as `x-api-key` header\n apiKey?: string;\n\n // how many requests to buffer in total\n bufferSize?: number;\n\n // how many requests to execute concurrently\n concurrency?: number;\n\n // if rate limit response does not include a Retry-After header,\n // how many milliseconds to back off before attempting a request.\n // intermediate events will be dropped, not buffered\n defaultRateLimitBackoffMs?: number;\n\n // addition options for global.Fetch\n requestOptions?: OtlpTransportRequestOptions;\n\n // The Otel spec defines separate endpoints per signal\n readonly tracesURL?: string;\n readonly logsURL?: string;\n\n // customize aspects about logs transformation\n otlpTransform?: {\n // Body field is optional in Otel Log spec, but can cause issues with Otel Collector components.\n // By default Faro does not send a body for logs of type error and measurement.\n // Users can define a body string by using the following functions.\n createErrorLogBody?: (item: TransportItem<ExceptionEvent>) => string;\n createMeasurementLogBody?: (item: TransportItem<MeasurementEvent>) => string;\n };\n}\n"]}
|
package/dist/esm/transport.js
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
1
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
+
});
|
|
9
|
+
};
|
|
1
10
|
var __rest = (this && this.__rest) || function (s, e) {
|
|
2
11
|
var t = {};
|
|
3
12
|
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
@@ -40,73 +49,77 @@ export class OtlpHttpTransport extends BaseTransport {
|
|
|
40
49
|
return true;
|
|
41
50
|
}
|
|
42
51
|
send(items) {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
52
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
53
|
+
const otelPayload = new OtelPayload({
|
|
54
|
+
internalLogger: this.internalLogger,
|
|
55
|
+
customOtlpTransform: this.options.otlpTransform,
|
|
56
|
+
});
|
|
57
|
+
items.forEach((item) => otelPayload.addResourceItem(item));
|
|
58
|
+
yield this.sendPayload(otelPayload.getPayload());
|
|
46
59
|
});
|
|
47
|
-
items.forEach((item) => otelPayload.addResourceItem(item));
|
|
48
|
-
this.sendPayload(otelPayload.getPayload());
|
|
49
60
|
}
|
|
50
61
|
sendPayload(payload) {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
return fetch(url, Object.assign({ method: 'POST', headers: Object.assign(Object.assign({ 'Content-Type': 'application/json' }, resolvedHeaders), (apiKey ? { 'x-api-key': apiKey } : {})), body, keepalive: body.length <= BEACON_BODY_SIZE_LIMIT }, (restOfRequestOptions !== null && restOfRequestOptions !== void 0 ? restOfRequestOptions : {})))
|
|
92
|
-
.then((response) => {
|
|
93
|
-
if (response.status === TOO_MANY_REQUESTS) {
|
|
94
|
-
updateDisabledUntil(this.getRetryAfterDate(response));
|
|
95
|
-
this.logWarn(`Too many requests, backing off until ${disabledUntil}`);
|
|
62
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
63
|
+
try {
|
|
64
|
+
const { tracesURL = '', logsURL = '' } = this.options;
|
|
65
|
+
for (const [key, value] of Object.entries(payload)) {
|
|
66
|
+
if (!(isArray(value) && value.length > 0)) {
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
let disabledUntil;
|
|
70
|
+
let updateDisabledUntil = (_) => { };
|
|
71
|
+
let url = '';
|
|
72
|
+
switch (key) {
|
|
73
|
+
case 'resourceSpans':
|
|
74
|
+
url = tracesURL;
|
|
75
|
+
disabledUntil = this.sendingTracesDisabledUntil;
|
|
76
|
+
updateDisabledUntil = (retryAfterDate) => {
|
|
77
|
+
this.sendingTracesDisabledUntil = retryAfterDate;
|
|
78
|
+
};
|
|
79
|
+
break;
|
|
80
|
+
case 'resourceLogs':
|
|
81
|
+
url = logsURL;
|
|
82
|
+
disabledUntil = this.sendingLogsDisabledUntil;
|
|
83
|
+
updateDisabledUntil = (retryAfterDate) => {
|
|
84
|
+
this.sendingLogsDisabledUntil = retryAfterDate;
|
|
85
|
+
};
|
|
86
|
+
break;
|
|
87
|
+
}
|
|
88
|
+
if (disabledUntil && disabledUntil > new Date(Date.now())) {
|
|
89
|
+
this.logWarn(`Dropping transport item due to too many requests. Backoff until ${disabledUntil}`);
|
|
90
|
+
return undefined;
|
|
91
|
+
}
|
|
92
|
+
const body = JSON.stringify({ [key]: value });
|
|
93
|
+
const { requestOptions, apiKey } = this.options;
|
|
94
|
+
const _a = requestOptions !== null && requestOptions !== void 0 ? requestOptions : {}, { headers = {} } = _a, restOfRequestOptions = __rest(_a, ["headers"]);
|
|
95
|
+
if (!url) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
yield this.promiseBuffer.add(() => __awaiter(this, void 0, void 0, function* () {
|
|
99
|
+
const resolvedHeaders = {};
|
|
100
|
+
for (const [key, value] of Object.entries(headers)) {
|
|
101
|
+
resolvedHeaders[key] = typeof value === 'function' ? yield Promise.resolve(value()) : value;
|
|
96
102
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
103
|
+
return fetch(url, Object.assign({ method: 'POST', headers: Object.assign(Object.assign({ 'Content-Type': 'application/json' }, resolvedHeaders), (apiKey ? { 'x-api-key': apiKey } : {})), body, keepalive: body.length <= BEACON_BODY_SIZE_LIMIT }, (restOfRequestOptions !== null && restOfRequestOptions !== void 0 ? restOfRequestOptions : {})))
|
|
104
|
+
.then((response) => {
|
|
105
|
+
if (response.status === TOO_MANY_REQUESTS) {
|
|
106
|
+
updateDisabledUntil(this.getRetryAfterDate(response));
|
|
107
|
+
this.logWarn(`Too many requests, backing off until ${disabledUntil}`);
|
|
108
|
+
}
|
|
109
|
+
// read the body so the connection can be closed
|
|
110
|
+
response.text().catch(noop);
|
|
111
|
+
return response;
|
|
112
|
+
})
|
|
113
|
+
.catch((error) => {
|
|
114
|
+
this.logError('Failed sending payload to the receiver\n', JSON.parse(body), error);
|
|
115
|
+
});
|
|
116
|
+
}));
|
|
117
|
+
}
|
|
105
118
|
}
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
this.logError(error);
|
|
121
|
+
}
|
|
122
|
+
});
|
|
110
123
|
}
|
|
111
124
|
getRetryAfterDate(response) {
|
|
112
125
|
const now = Date.now();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/transport.ts"],"names":[],"mappings":"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","sourcesContent":["import { BaseTransport, createPromiseBuffer, isArray, noop, VERSION } from '@grafana/faro-core';\nimport type { Patterns, PromiseBuffer, TransportItem } from '@grafana/faro-core';\n\nimport { OtelPayload } from './payload';\nimport type { 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\nconst BEACON_BODY_SIZE_LIMIT = 60000;\nconst TOO_MANY_REQUESTS = 429;\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(): Patterns {\n const { tracesURL = '', logsURL = '' } = this.options;\n return ([tracesURL, logsURL].filter(Boolean) as Patterns).concat(this.config.ignoreUrls ?? []);\n }\n\n override isBatched(): boolean {\n return true;\n }\n\n async send(items: TransportItem[]): Promise<void> {\n const otelPayload = new OtelPayload({\n internalLogger: this.internalLogger,\n customOtlpTransform: this.options.otlpTransform,\n });\n\n items.forEach((item) => otelPayload.addResourceItem(item));\n await this.sendPayload(otelPayload.getPayload());\n }\n\n private async sendPayload(payload: OtelTransportPayload): Promise<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 if (!url) {\n continue;\n }\n\n await this.promiseBuffer.add(async () => {\n const resolvedHeaders: Record<string, string> = {};\n for (const [key, value] of Object.entries(headers)) {\n resolvedHeaders[key] = typeof value === 'function' ? await Promise.resolve(value()) : value;\n }\n\n return fetch(url, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n ...resolvedHeaders,\n ...(apiKey ? { 'x-api-key': apiKey } : {}),\n },\n body,\n keepalive: body.length <= BEACON_BODY_SIZE_LIMIT,\n ...(restOfRequestOptions ?? {}),\n })\n .then((response) => {\n if (response.status === TOO_MANY_REQUESTS) {\n updateDisabledUntil(this.getRetryAfterDate(response));\n this.logWarn(`Too many requests, backing off until ${disabledUntil}`);\n }\n\n // read the body so the connection can be closed\n response.text().catch(noop);\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"]}
|
package/dist/esm/types.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ExceptionEvent, MeasurementEvent, TransportItem } from '@grafana/faro-core';\n\nexport interface OtlpTransportRequestOptions extends Omit<RequestInit, 'body' | 'headers'> {\n /**\n * Headers to include in every request.\n * Each value can be:\n * - a string (static value)\n * - a function returning a string (dynamic value)\n */\n headers?: Record<string, string | (() => string)>;\n}\n\nexport interface OtlpHttpTransportOptions {\n // will be added as `x-api-key` header\n apiKey?: string;\n\n // how many requests to buffer in total\n bufferSize?: number;\n\n // how many requests to execute concurrently\n concurrency?: number;\n\n // if rate limit response does not include a Retry-After header,\n // how many milliseconds to back off before attempting a request.\n // intermediate events will be dropped, not buffered\n defaultRateLimitBackoffMs?: number;\n\n // addition options for global.Fetch\n requestOptions?: OtlpTransportRequestOptions;\n\n // The Otel spec defines separate endpoints per signal\n readonly tracesURL?: string;\n readonly logsURL?: string;\n\n // customize aspects about logs transformation\n otlpTransform?: {\n // Body field is optional in Otel Log spec, but can cause issues with Otel Collector components.\n // By default Faro does not send a body for logs of type error and measurement.\n // Users can define a body string by using the following functions.\n createErrorLogBody?: (item: TransportItem<ExceptionEvent>) => string;\n createMeasurementLogBody?: (item: TransportItem<MeasurementEvent>) => string;\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { ExceptionEvent, MeasurementEvent, TransportItem } from '@grafana/faro-core';\n\nexport interface OtlpTransportRequestOptions extends Omit<RequestInit, 'body' | 'headers'> {\n /**\n * Headers to include in every request.\n * Each value can be:\n * - a string (static value)\n * - a function returning a string (dynamic value)\n * - a function returning a Promise of string (dynamic value, async)\n */\n headers?: Record<string, string | (() => string | Promise<string>)>;\n}\n\nexport interface OtlpHttpTransportOptions {\n // will be added as `x-api-key` header\n apiKey?: string;\n\n // how many requests to buffer in total\n bufferSize?: number;\n\n // how many requests to execute concurrently\n concurrency?: number;\n\n // if rate limit response does not include a Retry-After header,\n // how many milliseconds to back off before attempting a request.\n // intermediate events will be dropped, not buffered\n defaultRateLimitBackoffMs?: number;\n\n // addition options for global.Fetch\n requestOptions?: OtlpTransportRequestOptions;\n\n // The Otel spec defines separate endpoints per signal\n readonly tracesURL?: string;\n readonly logsURL?: string;\n\n // customize aspects about logs transformation\n otlpTransform?: {\n // Body field is optional in Otel Log spec, but can cause issues with Otel Collector components.\n // By default Faro does not send a body for logs of type error and measurement.\n // Users can define a body string by using the following functions.\n createErrorLogBody?: (item: TransportItem<ExceptionEvent>) => string;\n createMeasurementLogBody?: (item: TransportItem<MeasurementEvent>) => string;\n };\n}\n"]}
|
|
@@ -4,7 +4,7 @@ import type { OtlpHttpTransportOptions } from './types';
|
|
|
4
4
|
export declare class OtlpHttpTransport extends BaseTransport {
|
|
5
5
|
private options;
|
|
6
6
|
readonly name = "@grafana/faro-web-sdk:transport-otlp-http";
|
|
7
|
-
readonly version = "2.
|
|
7
|
+
readonly version = "2.4.0";
|
|
8
8
|
private readonly promiseBuffer;
|
|
9
9
|
private readonly rateLimitBackoffMs;
|
|
10
10
|
private sendingTracesDisabledUntil;
|
|
@@ -12,7 +12,7 @@ export declare class OtlpHttpTransport extends BaseTransport {
|
|
|
12
12
|
constructor(options: OtlpHttpTransportOptions);
|
|
13
13
|
getIgnoreUrls(): Patterns;
|
|
14
14
|
isBatched(): boolean;
|
|
15
|
-
send(items: TransportItem[]): void
|
|
15
|
+
send(items: TransportItem[]): Promise<void>;
|
|
16
16
|
private sendPayload;
|
|
17
17
|
private getRetryAfterDate;
|
|
18
18
|
}
|
package/dist/types/types.d.ts
CHANGED
|
@@ -5,8 +5,9 @@ export interface OtlpTransportRequestOptions extends Omit<RequestInit, 'body' |
|
|
|
5
5
|
* Each value can be:
|
|
6
6
|
* - a string (static value)
|
|
7
7
|
* - a function returning a string (dynamic value)
|
|
8
|
+
* - a function returning a Promise of string (dynamic value, async)
|
|
8
9
|
*/
|
|
9
|
-
headers?: Record<string, string | (() => string)>;
|
|
10
|
+
headers?: Record<string, string | (() => string | Promise<string>)>;
|
|
10
11
|
}
|
|
11
12
|
export interface OtlpHttpTransportOptions {
|
|
12
13
|
apiKey?: string;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@grafana/faro-transport-otlp-http",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "Faro transport which converts the Faro data model to the Otlp data model.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"observability",
|
|
@@ -53,14 +53,14 @@
|
|
|
53
53
|
"quality:circular-deps": "madge --circular ."
|
|
54
54
|
},
|
|
55
55
|
"devDependencies": {
|
|
56
|
-
"@grafana/faro-core": "^2.
|
|
56
|
+
"@grafana/faro-core": "^2.4.0"
|
|
57
57
|
},
|
|
58
58
|
"publishConfig": {
|
|
59
59
|
"access": "public"
|
|
60
60
|
},
|
|
61
61
|
"dependencies": {
|
|
62
|
-
"@opentelemetry/otlp-transformer": "^0.
|
|
62
|
+
"@opentelemetry/otlp-transformer": "^0.215.0",
|
|
63
63
|
"@opentelemetry/semantic-conventions": "^1.28.0"
|
|
64
64
|
},
|
|
65
|
-
"gitHead": "
|
|
65
|
+
"gitHead": "0dcca81629cfc20cb18c6a7306209dceccdc75c8"
|
|
66
66
|
}
|